@c15t/backend 0.0.1-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 (521) hide show
  1. package/.turbo/turbo-build.log +11 -0
  2. package/.turbo/turbo-check-types.log +5 -0
  3. package/.turbo/turbo-fmt.log +7 -0
  4. package/.turbo/turbo-lint.log +6 -0
  5. package/.turbo/turbo-test.log +26 -0
  6. package/README-next.md +223 -0
  7. package/README.md +164 -0
  8. package/dist/api/call.d.ts +176 -0
  9. package/dist/api/call.d.ts.map +1 -0
  10. package/dist/api/index.d.ts +935 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/middlewares/index.d.ts +39 -0
  13. package/dist/api/middlewares/index.d.ts.map +1 -0
  14. package/dist/api/middlewares/origin-check.d.ts +82 -0
  15. package/dist/api/middlewares/origin-check.d.ts.map +1 -0
  16. package/dist/api/middlewares/validate-context.d.ts +38 -0
  17. package/dist/api/middlewares/validate-context.d.ts.map +1 -0
  18. package/dist/api/routes/__tests__/consent.test.d.ts +2 -0
  19. package/dist/api/routes/__tests__/consent.test.d.ts.map +1 -0
  20. package/dist/api/routes/__tests__/status.test.d.ts +2 -0
  21. package/dist/api/routes/__tests__/status.test.d.ts.map +1 -0
  22. package/dist/api/routes/error.d.ts +57 -0
  23. package/dist/api/routes/error.d.ts.map +1 -0
  24. package/dist/api/routes/generate-consent-receipt.d.ts +130 -0
  25. package/dist/api/routes/generate-consent-receipt.d.ts.map +1 -0
  26. package/dist/api/routes/get-consent-history.d.ts +133 -0
  27. package/dist/api/routes/get-consent-history.d.ts.map +1 -0
  28. package/dist/api/routes/get-consent-policy.d.ts +164 -0
  29. package/dist/api/routes/get-consent-policy.d.ts.map +1 -0
  30. package/dist/api/routes/get-consent.d.ts +148 -0
  31. package/dist/api/routes/get-consent.d.ts.map +1 -0
  32. package/dist/api/routes/index.d.ts +339 -0
  33. package/dist/api/routes/index.d.ts.map +1 -0
  34. package/dist/api/routes/ok.d.ts +87 -0
  35. package/dist/api/routes/ok.d.ts.map +1 -0
  36. package/dist/api/routes/set-consent.d.ts +245 -0
  37. package/dist/api/routes/set-consent.d.ts.map +1 -0
  38. package/dist/api/routes/show-consent-banner.d.ts +127 -0
  39. package/dist/api/routes/show-consent-banner.d.ts.map +1 -0
  40. package/dist/api/routes/status.d.ts +61 -0
  41. package/dist/api/routes/status.d.ts.map +1 -0
  42. package/dist/api/routes/verify-consent.d.ts +179 -0
  43. package/dist/api/routes/verify-consent.d.ts.map +1 -0
  44. package/dist/api/routes/withdraw-consent.d.ts +194 -0
  45. package/dist/api/routes/withdraw-consent.d.ts.map +1 -0
  46. package/dist/api/to-endpoints.d.ts +35 -0
  47. package/dist/api/to-endpoints.d.ts.map +1 -0
  48. package/dist/client/index.cjs +139 -0
  49. package/dist/client/index.d.ts +203 -0
  50. package/dist/client/index.d.ts.map +1 -0
  51. package/dist/client/index.js +106 -0
  52. package/dist/client/types.d.ts +431 -0
  53. package/dist/client/types.d.ts.map +1 -0
  54. package/dist/core.d.ts +124 -0
  55. package/dist/core.d.ts.map +1 -0
  56. package/dist/core.test.d.ts +2 -0
  57. package/dist/core.test.d.ts.map +1 -0
  58. package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts +122 -0
  59. package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -0
  60. package/dist/db/adapters/drizzle-adapter/index.d.ts +2 -0
  61. package/dist/db/adapters/drizzle-adapter/index.d.ts.map +1 -0
  62. package/dist/db/adapters/drizzle.cjs +1531 -0
  63. package/dist/db/adapters/drizzle.js +1489 -0
  64. package/dist/db/adapters/kysely-adapter/dialect.d.ts +72 -0
  65. package/dist/db/adapters/kysely-adapter/dialect.d.ts.map +1 -0
  66. package/dist/db/adapters/kysely-adapter/index.d.ts +4 -0
  67. package/dist/db/adapters/kysely-adapter/index.d.ts.map +1 -0
  68. package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts +98 -0
  69. package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -0
  70. package/dist/db/adapters/kysely-adapter/types.d.ts +281 -0
  71. package/dist/db/adapters/kysely-adapter/types.d.ts.map +1 -0
  72. package/dist/db/adapters/kysely.cjs +1551 -0
  73. package/dist/db/adapters/kysely.js +1508 -0
  74. package/dist/db/adapters/memory-adapter/index.d.ts +2 -0
  75. package/dist/db/adapters/memory-adapter/index.d.ts.map +1 -0
  76. package/dist/db/adapters/memory-adapter/memory-adapter.d.ts +56 -0
  77. package/dist/db/adapters/memory-adapter/memory-adapter.d.ts.map +1 -0
  78. package/dist/db/adapters/memory.cjs +1391 -0
  79. package/dist/db/adapters/memory.js +1349 -0
  80. package/dist/db/adapters/prisma-adapter/index.d.ts +2 -0
  81. package/dist/db/adapters/prisma-adapter/index.d.ts.map +1 -0
  82. package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts +143 -0
  83. package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -0
  84. package/dist/db/adapters/prisma.cjs +1503 -0
  85. package/dist/db/adapters/prisma.js +1461 -0
  86. package/dist/db/adapters/types.d.ts +154 -0
  87. package/dist/db/adapters/types.d.ts.map +1 -0
  88. package/dist/db/adapters/utils.d.ts +36 -0
  89. package/dist/db/adapters/utils.d.ts.map +1 -0
  90. package/dist/db/core/fields/field-factory.d.ts +383 -0
  91. package/dist/db/core/fields/field-factory.d.ts.map +1 -0
  92. package/dist/db/core/fields/field-inference.d.ts +218 -0
  93. package/dist/db/core/fields/field-inference.d.ts.map +1 -0
  94. package/dist/db/core/fields/field-options-integration.d.ts +90 -0
  95. package/dist/db/core/fields/field-options-integration.d.ts.map +1 -0
  96. package/dist/db/core/fields/field-types.d.ts +182 -0
  97. package/dist/db/core/fields/field-types.d.ts.map +1 -0
  98. package/dist/db/core/fields/id-generator.d.ts +19 -0
  99. package/dist/db/core/fields/id-generator.d.ts.map +1 -0
  100. package/dist/db/core/fields/index.d.ts +8 -0
  101. package/dist/db/core/fields/index.d.ts.map +1 -0
  102. package/dist/db/core/fields/superjson-utils.d.ts +34 -0
  103. package/dist/db/core/fields/superjson-utils.d.ts.map +1 -0
  104. package/dist/db/core/fields/zod-fields.d.ts +1011 -0
  105. package/dist/db/core/fields/zod-fields.d.ts.map +1 -0
  106. package/dist/db/core/get-schema.d.ts +36 -0
  107. package/dist/db/core/get-schema.d.ts.map +1 -0
  108. package/dist/db/core/types.d.ts +41 -0
  109. package/dist/db/core/types.d.ts.map +1 -0
  110. package/dist/db/create-registry.d.ts +760 -0
  111. package/dist/db/create-registry.d.ts.map +1 -0
  112. package/dist/db/hooks/create-hooks.d.ts +32 -0
  113. package/dist/db/hooks/create-hooks.d.ts.map +1 -0
  114. package/dist/db/hooks/index.d.ts +40 -0
  115. package/dist/db/hooks/index.d.ts.map +1 -0
  116. package/dist/db/hooks/types.d.ts +133 -0
  117. package/dist/db/hooks/types.d.ts.map +1 -0
  118. package/dist/db/hooks/update-hooks.d.ts +33 -0
  119. package/dist/db/hooks/update-hooks.d.ts.map +1 -0
  120. package/dist/db/hooks/update-many-hooks.d.ts +55 -0
  121. package/dist/db/hooks/update-many-hooks.d.ts.map +1 -0
  122. package/dist/db/hooks/utils.d.ts +62 -0
  123. package/dist/db/hooks/utils.d.ts.map +1 -0
  124. package/dist/db/hooks/with-hooks-factory.d.ts +33 -0
  125. package/dist/db/hooks/with-hooks-factory.d.ts.map +1 -0
  126. package/dist/db/index.cjs +2458 -0
  127. package/dist/db/index.d.ts +11 -0
  128. package/dist/db/index.d.ts.map +1 -0
  129. package/dist/db/index.js +2404 -0
  130. package/dist/db/migration/get-migration.d.ts +32 -0
  131. package/dist/db/migration/get-migration.d.ts.map +1 -0
  132. package/dist/db/migration/get-schema/get-schema.d.ts +27 -0
  133. package/dist/db/migration/get-schema/get-schema.d.ts.map +1 -0
  134. package/dist/db/migration/get-schema/index.d.ts +21 -0
  135. package/dist/db/migration/get-schema/index.d.ts.map +1 -0
  136. package/dist/db/migration/get-schema/process-fields.d.ts +16 -0
  137. package/dist/db/migration/get-schema/process-fields.d.ts.map +1 -0
  138. package/dist/db/migration/get-schema/process-tables.d.ts +13 -0
  139. package/dist/db/migration/get-schema/process-tables.d.ts.map +1 -0
  140. package/dist/db/migration/get-schema/types.d.ts +17 -0
  141. package/dist/db/migration/get-schema/types.d.ts.map +1 -0
  142. package/dist/db/migration/index.cjs +1613 -0
  143. package/dist/db/migration/index.d.ts +14 -0
  144. package/dist/db/migration/index.d.ts.map +1 -0
  145. package/dist/db/migration/index.js +1571 -0
  146. package/dist/db/migration/migration-builders.d.ts +28 -0
  147. package/dist/db/migration/migration-builders.d.ts.map +1 -0
  148. package/dist/db/migration/migration-execution.d.ts +12 -0
  149. package/dist/db/migration/migration-execution.d.ts.map +1 -0
  150. package/dist/db/migration/schema-comparison.d.ts +54 -0
  151. package/dist/db/migration/schema-comparison.d.ts.map +1 -0
  152. package/dist/db/migration/type-mapping.d.ts +86 -0
  153. package/dist/db/migration/type-mapping.d.ts.map +1 -0
  154. package/dist/db/migration/types.d.ts +37 -0
  155. package/dist/db/migration/types.d.ts.map +1 -0
  156. package/dist/db/schema/audit-log/index.d.ts +4 -0
  157. package/dist/db/schema/audit-log/index.d.ts.map +1 -0
  158. package/dist/db/schema/audit-log/registry.d.ts +128 -0
  159. package/dist/db/schema/audit-log/registry.d.ts.map +1 -0
  160. package/dist/db/schema/audit-log/schema.d.ts +67 -0
  161. package/dist/db/schema/audit-log/schema.d.ts.map +1 -0
  162. package/dist/db/schema/audit-log/table.d.ts +175 -0
  163. package/dist/db/schema/audit-log/table.d.ts.map +1 -0
  164. package/dist/db/schema/audit-log/types.d.ts +29 -0
  165. package/dist/db/schema/audit-log/types.d.ts.map +1 -0
  166. package/dist/db/schema/consent/index.d.ts +4 -0
  167. package/dist/db/schema/consent/index.d.ts.map +1 -0
  168. package/dist/db/schema/consent/registry.d.ts +318 -0
  169. package/dist/db/schema/consent/registry.d.ts.map +1 -0
  170. package/dist/db/schema/consent/schema.d.ts +135 -0
  171. package/dist/db/schema/consent/schema.d.ts.map +1 -0
  172. package/dist/db/schema/consent/table.d.ts +245 -0
  173. package/dist/db/schema/consent/table.d.ts.map +1 -0
  174. package/dist/db/schema/consent/types.d.ts +37 -0
  175. package/dist/db/schema/consent/types.d.ts.map +1 -0
  176. package/dist/db/schema/consent-geo-location/index.d.ts +4 -0
  177. package/dist/db/schema/consent-geo-location/index.d.ts.map +1 -0
  178. package/dist/db/schema/consent-geo-location/registry.d.ts +96 -0
  179. package/dist/db/schema/consent-geo-location/registry.d.ts.map +1 -0
  180. package/dist/db/schema/consent-geo-location/schema.d.ts +71 -0
  181. package/dist/db/schema/consent-geo-location/schema.d.ts.map +1 -0
  182. package/dist/db/schema/consent-geo-location/table.d.ts +167 -0
  183. package/dist/db/schema/consent-geo-location/table.d.ts.map +1 -0
  184. package/dist/db/schema/consent-geo-location/types.d.ts +21 -0
  185. package/dist/db/schema/consent-geo-location/types.d.ts.map +1 -0
  186. package/dist/db/schema/consent-policy/index.d.ts +4 -0
  187. package/dist/db/schema/consent-policy/index.d.ts.map +1 -0
  188. package/dist/db/schema/consent-policy/registry.d.ts +186 -0
  189. package/dist/db/schema/consent-policy/registry.d.ts.map +1 -0
  190. package/dist/db/schema/consent-policy/schema.d.ts +68 -0
  191. package/dist/db/schema/consent-policy/schema.d.ts.map +1 -0
  192. package/dist/db/schema/consent-policy/table.d.ts +147 -0
  193. package/dist/db/schema/consent-policy/table.d.ts.map +1 -0
  194. package/dist/db/schema/consent-policy/types.d.ts +28 -0
  195. package/dist/db/schema/consent-policy/types.d.ts.map +1 -0
  196. package/dist/db/schema/consent-purpose/index.d.ts +4 -0
  197. package/dist/db/schema/consent-purpose/index.d.ts.map +1 -0
  198. package/dist/db/schema/consent-purpose/registry.d.ts +136 -0
  199. package/dist/db/schema/consent-purpose/registry.d.ts.map +1 -0
  200. package/dist/db/schema/consent-purpose/schema.d.ts +79 -0
  201. package/dist/db/schema/consent-purpose/schema.d.ts.map +1 -0
  202. package/dist/db/schema/consent-purpose/table.d.ts +161 -0
  203. package/dist/db/schema/consent-purpose/table.d.ts.map +1 -0
  204. package/dist/db/schema/consent-purpose/types.d.ts +16 -0
  205. package/dist/db/schema/consent-purpose/types.d.ts.map +1 -0
  206. package/dist/db/schema/consent-purpose-junction/index.d.ts +4 -0
  207. package/dist/db/schema/consent-purpose-junction/index.d.ts.map +1 -0
  208. package/dist/db/schema/consent-purpose-junction/registry.d.ts +109 -0
  209. package/dist/db/schema/consent-purpose-junction/registry.d.ts.map +1 -0
  210. package/dist/db/schema/consent-purpose-junction/schema.d.ts +57 -0
  211. package/dist/db/schema/consent-purpose-junction/schema.d.ts.map +1 -0
  212. package/dist/db/schema/consent-purpose-junction/table.d.ts +138 -0
  213. package/dist/db/schema/consent-purpose-junction/table.d.ts.map +1 -0
  214. package/dist/db/schema/consent-purpose-junction/types.d.ts +14 -0
  215. package/dist/db/schema/consent-purpose-junction/types.d.ts.map +1 -0
  216. package/dist/db/schema/consent-record/index.d.ts +4 -0
  217. package/dist/db/schema/consent-record/index.d.ts.map +1 -0
  218. package/dist/db/schema/consent-record/registry.d.ts +119 -0
  219. package/dist/db/schema/consent-record/registry.d.ts.map +1 -0
  220. package/dist/db/schema/consent-record/schema.d.ts +57 -0
  221. package/dist/db/schema/consent-record/schema.d.ts.map +1 -0
  222. package/dist/db/schema/consent-record/table.d.ts +123 -0
  223. package/dist/db/schema/consent-record/table.d.ts.map +1 -0
  224. package/dist/db/schema/consent-record/types.d.ts +21 -0
  225. package/dist/db/schema/consent-record/types.d.ts.map +1 -0
  226. package/dist/db/schema/consent-withdrawal/index.d.ts +4 -0
  227. package/dist/db/schema/consent-withdrawal/index.d.ts.map +1 -0
  228. package/dist/db/schema/consent-withdrawal/registry.d.ts +134 -0
  229. package/dist/db/schema/consent-withdrawal/registry.d.ts.map +1 -0
  230. package/dist/db/schema/consent-withdrawal/schema.d.ts +67 -0
  231. package/dist/db/schema/consent-withdrawal/schema.d.ts.map +1 -0
  232. package/dist/db/schema/consent-withdrawal/table.d.ts +170 -0
  233. package/dist/db/schema/consent-withdrawal/table.d.ts.map +1 -0
  234. package/dist/db/schema/consent-withdrawal/types.d.ts +28 -0
  235. package/dist/db/schema/consent-withdrawal/types.d.ts.map +1 -0
  236. package/dist/db/schema/definition.d.ts +1100 -0
  237. package/dist/db/schema/definition.d.ts.map +1 -0
  238. package/dist/db/schema/domain/index.d.ts +4 -0
  239. package/dist/db/schema/domain/index.d.ts.map +1 -0
  240. package/dist/db/schema/domain/registry.d.ts +169 -0
  241. package/dist/db/schema/domain/registry.d.ts.map +1 -0
  242. package/dist/db/schema/domain/schema.d.ts +60 -0
  243. package/dist/db/schema/domain/schema.d.ts.map +1 -0
  244. package/dist/db/schema/domain/table.d.ts +140 -0
  245. package/dist/db/schema/domain/table.d.ts.map +1 -0
  246. package/dist/db/schema/domain/types.d.ts +27 -0
  247. package/dist/db/schema/domain/types.d.ts.map +1 -0
  248. package/dist/db/schema/geo-location/index.d.ts +4 -0
  249. package/dist/db/schema/geo-location/index.d.ts.map +1 -0
  250. package/dist/db/schema/geo-location/registry.d.ts +114 -0
  251. package/dist/db/schema/geo-location/registry.d.ts.map +1 -0
  252. package/dist/db/schema/geo-location/schema.d.ts +58 -0
  253. package/dist/db/schema/geo-location/schema.d.ts.map +1 -0
  254. package/dist/db/schema/geo-location/table.d.ts +132 -0
  255. package/dist/db/schema/geo-location/table.d.ts.map +1 -0
  256. package/dist/db/schema/geo-location/types.d.ts +17 -0
  257. package/dist/db/schema/geo-location/types.d.ts.map +1 -0
  258. package/dist/db/schema/index.d.ts +85 -0
  259. package/dist/db/schema/index.d.ts.map +1 -0
  260. package/dist/db/schema/parser.d.ts +183 -0
  261. package/dist/db/schema/parser.d.ts.map +1 -0
  262. package/dist/db/schema/schemas.d.ts +383 -0
  263. package/dist/db/schema/schemas.d.ts.map +1 -0
  264. package/dist/db/schema/subject/index.d.ts +4 -0
  265. package/dist/db/schema/subject/index.d.ts.map +1 -0
  266. package/dist/db/schema/subject/registry.d.ts +141 -0
  267. package/dist/db/schema/subject/registry.d.ts.map +1 -0
  268. package/dist/db/schema/subject/schema.d.ts +56 -0
  269. package/dist/db/schema/subject/schema.d.ts.map +1 -0
  270. package/dist/db/schema/subject/table.d.ts +136 -0
  271. package/dist/db/schema/subject/table.d.ts.map +1 -0
  272. package/dist/db/schema/subject/types.d.ts +22 -0
  273. package/dist/db/schema/subject/types.d.ts.map +1 -0
  274. package/dist/db/schema/types.d.ts +136 -0
  275. package/dist/db/schema/types.d.ts.map +1 -0
  276. package/dist/db/utils/adapter-factory.d.ts +21 -0
  277. package/dist/db/utils/adapter-factory.d.ts.map +1 -0
  278. package/dist/db/utils/index.d.ts +10 -0
  279. package/dist/db/utils/index.d.ts.map +1 -0
  280. package/dist/db/utils.d.ts +4 -0
  281. package/dist/db/utils.d.ts.map +1 -0
  282. package/dist/error/codes.cjs +68 -0
  283. package/dist/error/codes.d.ts +175 -0
  284. package/dist/error/codes.d.ts.map +1 -0
  285. package/dist/error/codes.js +35 -0
  286. package/dist/error/error.d.ts +79 -0
  287. package/dist/error/error.d.ts.map +1 -0
  288. package/dist/error/index.cjs +172 -0
  289. package/dist/error/index.d.ts +9 -0
  290. package/dist/error/index.d.ts.map +1 -0
  291. package/dist/error/index.js +129 -0
  292. package/dist/error/logging.d.ts +25 -0
  293. package/dist/error/logging.d.ts.map +1 -0
  294. package/dist/error/pipeline.d.ts +19 -0
  295. package/dist/error/pipeline.d.ts.map +1 -0
  296. package/dist/error/recovery.d.ts +22 -0
  297. package/dist/error/recovery.d.ts.map +1 -0
  298. package/dist/error/results.d.ts +56 -0
  299. package/dist/error/results.d.ts.map +1 -0
  300. package/dist/index.cjs +4777 -0
  301. package/dist/index.d.ts +46 -0
  302. package/dist/index.d.ts.map +1 -0
  303. package/dist/index.js +4708 -0
  304. package/dist/init.d.ts +52 -0
  305. package/dist/init.d.ts.map +1 -0
  306. package/dist/init.test.d.ts +2 -0
  307. package/dist/init.test.d.ts.map +1 -0
  308. package/dist/integrations/index.cjs +281 -0
  309. package/dist/integrations/index.d.ts +7 -0
  310. package/dist/integrations/index.d.ts.map +1 -0
  311. package/dist/integrations/index.js +248 -0
  312. package/dist/integrations/next.cjs +131 -0
  313. package/dist/integrations/next.d.ts +29 -0
  314. package/dist/integrations/next.d.ts.map +1 -0
  315. package/dist/integrations/next.js +99 -0
  316. package/dist/integrations/react.cjs +182 -0
  317. package/dist/integrations/react.d.ts +257 -0
  318. package/dist/integrations/react.d.ts.map +1 -0
  319. package/dist/integrations/react.js +150 -0
  320. package/dist/plugins/geo/index.d.ts +2 -0
  321. package/dist/plugins/geo/index.d.ts.map +1 -0
  322. package/dist/test/utils.d.ts +65 -0
  323. package/dist/test/utils.d.ts.map +1 -0
  324. package/dist/types/api.d.ts +89 -0
  325. package/dist/types/api.d.ts.map +1 -0
  326. package/dist/types/context.d.ts +205 -0
  327. package/dist/types/context.d.ts.map +1 -0
  328. package/dist/types/helper.d.ts +78 -0
  329. package/dist/types/helper.d.ts.map +1 -0
  330. package/dist/types/index.cjs +19 -0
  331. package/dist/types/index.d.ts +6 -0
  332. package/dist/types/index.d.ts.map +1 -0
  333. package/dist/types/index.js +0 -0
  334. package/dist/types/options.d.ts +172 -0
  335. package/dist/types/options.d.ts.map +1 -0
  336. package/dist/types/plugins.d.ts +442 -0
  337. package/dist/types/plugins.d.ts.map +1 -0
  338. package/dist/utils/env.d.ts +77 -0
  339. package/dist/utils/env.d.ts.map +1 -0
  340. package/dist/utils/hide-metadata.d.ts +22 -0
  341. package/dist/utils/hide-metadata.d.ts.map +1 -0
  342. package/dist/utils/index.cjs +268 -0
  343. package/dist/utils/index.d.ts +18 -0
  344. package/dist/utils/index.d.ts.map +1 -0
  345. package/dist/utils/index.js +210 -0
  346. package/dist/utils/ip.d.ts +10 -0
  347. package/dist/utils/ip.d.ts.map +1 -0
  348. package/dist/utils/json.d.ts +14 -0
  349. package/dist/utils/json.d.ts.map +1 -0
  350. package/dist/utils/logger.d.ts +108 -0
  351. package/dist/utils/logger.d.ts.map +1 -0
  352. package/dist/utils/url.d.ts +87 -0
  353. package/dist/utils/url.d.ts.map +1 -0
  354. package/dist/utils/wildcard.d.ts +46 -0
  355. package/dist/utils/wildcard.d.ts.map +1 -0
  356. package/knip.json +37 -0
  357. package/package.json +146 -0
  358. package/rslib.config.ts +104 -0
  359. package/src/api/call.ts +177 -0
  360. package/src/api/index.ts +303 -0
  361. package/src/api/middlewares/index.ts +38 -0
  362. package/src/api/middlewares/origin-check.ts +260 -0
  363. package/src/api/middlewares/validate-context.ts +175 -0
  364. package/src/api/routes/__tests__/consent.test.ts +270 -0
  365. package/src/api/routes/__tests__/status.test.ts +36 -0
  366. package/src/api/routes/error.ts +130 -0
  367. package/src/api/routes/generate-consent-receipt.ts +244 -0
  368. package/src/api/routes/get-consent-history.ts +128 -0
  369. package/src/api/routes/get-consent-policy.ts +327 -0
  370. package/src/api/routes/get-consent.ts +230 -0
  371. package/src/api/routes/index.ts +12 -0
  372. package/src/api/routes/ok.ts +45 -0
  373. package/src/api/routes/set-consent.ts +328 -0
  374. package/src/api/routes/show-consent-banner.ts +149 -0
  375. package/src/api/routes/status.ts +62 -0
  376. package/src/api/routes/verify-consent.ts +272 -0
  377. package/src/api/routes/withdraw-consent.ts +293 -0
  378. package/src/api/to-endpoints.ts +371 -0
  379. package/src/client/index.ts +471 -0
  380. package/src/client/types.ts +458 -0
  381. package/src/core.test.ts +303 -0
  382. package/src/core.ts +267 -0
  383. package/src/db/adapters/drizzle-adapter/drizzle-adapter.ts +711 -0
  384. package/src/db/adapters/drizzle-adapter/index.ts +1 -0
  385. package/src/db/adapters/kysely-adapter/dialect.ts +192 -0
  386. package/src/db/adapters/kysely-adapter/index.ts +3 -0
  387. package/src/db/adapters/kysely-adapter/kysely-adapter.ts +1168 -0
  388. package/src/db/adapters/kysely-adapter/types.ts +307 -0
  389. package/src/db/adapters/memory-adapter/index.ts +1 -0
  390. package/src/db/adapters/memory-adapter/memory-adapter.ts +648 -0
  391. package/src/db/adapters/prisma-adapter/index.ts +1 -0
  392. package/src/db/adapters/prisma-adapter/prisma-adapter.ts +586 -0
  393. package/src/db/adapters/types.ts +203 -0
  394. package/src/db/adapters/utils.ts +51 -0
  395. package/src/db/core/fields/field-factory.ts +804 -0
  396. package/src/db/core/fields/field-inference.ts +298 -0
  397. package/src/db/core/fields/field-options-integration.ts +135 -0
  398. package/src/db/core/fields/field-types.ts +233 -0
  399. package/src/db/core/fields/id-generator.ts +57 -0
  400. package/src/db/core/fields/index.ts +56 -0
  401. package/src/db/core/fields/superjson-utils.ts +155 -0
  402. package/src/db/core/fields/zod-fields.ts +269 -0
  403. package/src/db/core/get-schema.ts +102 -0
  404. package/src/db/core/types.ts +52 -0
  405. package/src/db/create-registry.ts +31 -0
  406. package/src/db/hooks/create-hooks.ts +88 -0
  407. package/src/db/hooks/index.ts +39 -0
  408. package/src/db/hooks/types.ts +164 -0
  409. package/src/db/hooks/update-hooks.ts +91 -0
  410. package/src/db/hooks/update-many-hooks.ts +176 -0
  411. package/src/db/hooks/utils.ts +151 -0
  412. package/src/db/hooks/with-hooks-factory.ts +68 -0
  413. package/src/db/index.ts +32 -0
  414. package/src/db/migration/get-migration.ts +89 -0
  415. package/src/db/migration/get-schema/get-schema.ts +44 -0
  416. package/src/db/migration/get-schema/index.ts +20 -0
  417. package/src/db/migration/get-schema/process-fields.ts +66 -0
  418. package/src/db/migration/get-schema/process-tables.ts +68 -0
  419. package/src/db/migration/get-schema/types.ts +18 -0
  420. package/src/db/migration/index.ts +18 -0
  421. package/src/db/migration/migration-builders.ts +170 -0
  422. package/src/db/migration/migration-execution.ts +79 -0
  423. package/src/db/migration/schema-comparison.ts +216 -0
  424. package/src/db/migration/type-mapping.ts +255 -0
  425. package/src/db/migration/types.ts +46 -0
  426. package/src/db/schema/audit-log/index.ts +3 -0
  427. package/src/db/schema/audit-log/registry.ts +228 -0
  428. package/src/db/schema/audit-log/schema.ts +46 -0
  429. package/src/db/schema/audit-log/table.ts +185 -0
  430. package/src/db/schema/audit-log/types.ts +29 -0
  431. package/src/db/schema/consent/index.ts +3 -0
  432. package/src/db/schema/consent/registry.ts +381 -0
  433. package/src/db/schema/consent/schema.ts +65 -0
  434. package/src/db/schema/consent/table.ts +220 -0
  435. package/src/db/schema/consent/types.ts +39 -0
  436. package/src/db/schema/consent-geo-location/index.ts +3 -0
  437. package/src/db/schema/consent-geo-location/registry.ts +124 -0
  438. package/src/db/schema/consent-geo-location/schema.ts +51 -0
  439. package/src/db/schema/consent-geo-location/table.ts +169 -0
  440. package/src/db/schema/consent-geo-location/types.ts +21 -0
  441. package/src/db/schema/consent-policy/index.ts +3 -0
  442. package/src/db/schema/consent-policy/registry.ts +313 -0
  443. package/src/db/schema/consent-policy/schema.ts +47 -0
  444. package/src/db/schema/consent-policy/table.ts +141 -0
  445. package/src/db/schema/consent-policy/types.ts +28 -0
  446. package/src/db/schema/consent-purpose/index.ts +3 -0
  447. package/src/db/schema/consent-purpose/registry.ts +188 -0
  448. package/src/db/schema/consent-purpose/schema.ts +58 -0
  449. package/src/db/schema/consent-purpose/table.ts +154 -0
  450. package/src/db/schema/consent-purpose/types.ts +16 -0
  451. package/src/db/schema/consent-purpose-junction/index.ts +3 -0
  452. package/src/db/schema/consent-purpose-junction/registry.ts +189 -0
  453. package/src/db/schema/consent-purpose-junction/schema.ts +49 -0
  454. package/src/db/schema/consent-purpose-junction/table.ts +142 -0
  455. package/src/db/schema/consent-purpose-junction/types.ts +14 -0
  456. package/src/db/schema/consent-record/index.ts +3 -0
  457. package/src/db/schema/consent-record/registry.ts +209 -0
  458. package/src/db/schema/consent-record/schema.ts +42 -0
  459. package/src/db/schema/consent-record/table.ts +124 -0
  460. package/src/db/schema/consent-record/types.ts +21 -0
  461. package/src/db/schema/consent-withdrawal/index.ts +3 -0
  462. package/src/db/schema/consent-withdrawal/registry.ts +219 -0
  463. package/src/db/schema/consent-withdrawal/schema.ts +48 -0
  464. package/src/db/schema/consent-withdrawal/table.ts +181 -0
  465. package/src/db/schema/consent-withdrawal/types.ts +29 -0
  466. package/src/db/schema/definition.ts +196 -0
  467. package/src/db/schema/domain/index.ts +3 -0
  468. package/src/db/schema/domain/registry.ts +272 -0
  469. package/src/db/schema/domain/schema.ts +43 -0
  470. package/src/db/schema/domain/table.ts +137 -0
  471. package/src/db/schema/domain/types.ts +27 -0
  472. package/src/db/schema/geo-location/index.ts +3 -0
  473. package/src/db/schema/geo-location/registry.ts +159 -0
  474. package/src/db/schema/geo-location/schema.ts +45 -0
  475. package/src/db/schema/geo-location/table.ts +148 -0
  476. package/src/db/schema/geo-location/types.ts +18 -0
  477. package/src/db/schema/index.ts +96 -0
  478. package/src/db/schema/parser.ts +417 -0
  479. package/src/db/schema/schemas.ts +35 -0
  480. package/src/db/schema/subject/index.ts +3 -0
  481. package/src/db/schema/subject/registry.ts +371 -0
  482. package/src/db/schema/subject/schema.ts +41 -0
  483. package/src/db/schema/subject/table.ts +139 -0
  484. package/src/db/schema/subject/types.ts +22 -0
  485. package/src/db/schema/types.ts +154 -0
  486. package/src/db/utils/adapter-factory.ts +64 -0
  487. package/src/db/utils/index.ts +10 -0
  488. package/src/db/utils.ts +42 -0
  489. package/src/docs/ADVANCED_JSON_HANDLING.md +99 -0
  490. package/src/docs/neverthrow.md +171 -0
  491. package/src/error/codes.ts +201 -0
  492. package/src/error/error.ts +145 -0
  493. package/src/error/index.ts +23 -0
  494. package/src/error/logging.ts +52 -0
  495. package/src/error/pipeline.ts +57 -0
  496. package/src/error/recovery.ts +45 -0
  497. package/src/error/results.ts +100 -0
  498. package/src/index.ts +79 -0
  499. package/src/init.test.ts +235 -0
  500. package/src/init.ts +261 -0
  501. package/src/integrations/index.ts +10 -0
  502. package/src/integrations/next.ts +136 -0
  503. package/src/integrations/react.ts +567 -0
  504. package/src/plugins/geo/index.ts +563 -0
  505. package/src/test/utils.ts +244 -0
  506. package/src/types/api.ts +101 -0
  507. package/src/types/context.ts +235 -0
  508. package/src/types/helper.ts +87 -0
  509. package/src/types/index.ts +5 -0
  510. package/src/types/options.ts +189 -0
  511. package/src/types/plugins.ts +538 -0
  512. package/src/utils/env.ts +103 -0
  513. package/src/utils/hide-metadata.ts +21 -0
  514. package/src/utils/index.ts +17 -0
  515. package/src/utils/ip.ts +45 -0
  516. package/src/utils/json.ts +19 -0
  517. package/src/utils/logger.ts +252 -0
  518. package/src/utils/url.ts +194 -0
  519. package/src/utils/wildcard.ts +253 -0
  520. package/tsconfig.json +12 -0
  521. package/vitest.config.ts +14 -0
@@ -0,0 +1,303 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { c15tInstance } from './core';
3
+ import { memoryAdapter } from './db/adapters/memory-adapter';
4
+ import type { C15TPlugin } from './types';
5
+
6
+ describe('c15tInstance', () => {
7
+ beforeEach(() => {
8
+ vi.unstubAllEnvs();
9
+ });
10
+
11
+ it('should create an instance with basic configuration', async () => {
12
+ const instance = c15tInstance({
13
+ baseURL: 'http://localhost:3000',
14
+ database: memoryAdapter({}),
15
+ secret: 'test-secret',
16
+ });
17
+
18
+ expect(instance.options.baseURL).toBe('http://localhost:3000');
19
+ const context = await instance.$context;
20
+ expect(context.isOk()).toBe(true);
21
+ if (context.isOk()) {
22
+ expect(context.value.appName).toBe('c15t Consent Manager');
23
+ }
24
+ });
25
+
26
+ it('should handle requests with proper routing', async () => {
27
+ const instance = c15tInstance({
28
+ baseURL: 'http://localhost:8080',
29
+ database: memoryAdapter({}),
30
+ // secret: 'test-secret',
31
+ });
32
+
33
+ const request = new Request('http://localhost:8080/api/c15t/status', {
34
+ method: 'GET',
35
+ headers: {
36
+ Accept: 'application/json',
37
+ Origin: 'http://localhost:8080',
38
+ },
39
+ });
40
+ const response = await instance.handler(request);
41
+ expect(response.isOk()).toBe(true);
42
+ if (response.isOk()) {
43
+ expect(response.value.status).toBe(200);
44
+ }
45
+ });
46
+
47
+ it('should return correct health response structure', async () => {
48
+ const instance = c15tInstance({
49
+ baseURL: 'http://localhost:8080',
50
+ database: memoryAdapter({}),
51
+ secret: 'test-secret',
52
+ });
53
+
54
+ const request = new Request('http://localhost:8080/api/c15t/status', {
55
+ method: 'GET',
56
+ headers: {
57
+ Accept: 'application/json',
58
+ Origin: 'http://localhost:8080',
59
+ },
60
+ });
61
+
62
+ const response = await instance.handler(request);
63
+ expect(response.isOk()).toBe(true);
64
+ if (response.isOk()) {
65
+ const responseData = await response.value.json();
66
+
67
+ expect(responseData).toHaveProperty('status', 'ok');
68
+ expect(responseData).toHaveProperty('version');
69
+ expect(responseData).toHaveProperty('timestamp');
70
+ expect(responseData).toHaveProperty('storage');
71
+
72
+ expect(responseData.storage).toHaveProperty('type', 'memory');
73
+ expect(responseData.storage).toHaveProperty('available', true);
74
+
75
+ expect(new Date(responseData.timestamp).toISOString()).toBe(
76
+ responseData.timestamp
77
+ );
78
+
79
+ // biome-ignore lint/performance/useTopLevelRegex: <explanation>
80
+ expect(responseData.version).toMatch(/^\d+\.\d+\.\d+$/);
81
+ }
82
+ });
83
+
84
+ it('should handle requests with custom base path', async () => {
85
+ const instance = c15tInstance({
86
+ baseURL: 'http://localhost:3000',
87
+ basePath: '/custom-path',
88
+ database: memoryAdapter({}),
89
+ secret: 'test-secret',
90
+ });
91
+
92
+ const request = new Request('http://localhost:3000/custom-path/status');
93
+ const response = await instance.handler(request);
94
+
95
+ expect(response.isOk()).toBe(true);
96
+ if (response.isOk()) {
97
+ expect(response.value.status).toBe(200);
98
+ }
99
+ });
100
+
101
+ it('should handle requests with plugins', async () => {
102
+ const testPlugin: C15TPlugin = {
103
+ id: 'test-plugin',
104
+ name: 'Test Plugin',
105
+ type: 'test',
106
+ init: () => ({
107
+ context: {
108
+ appName: 'Modified App Name',
109
+ },
110
+ }),
111
+ };
112
+
113
+ const instance = c15tInstance({
114
+ baseURL: 'http://localhost:3000',
115
+ database: memoryAdapter({}),
116
+ plugins: [testPlugin],
117
+ secret: 'test-secret',
118
+ });
119
+
120
+ const context = await instance.$context;
121
+ expect(context.isOk()).toBe(true);
122
+ if (context.isOk()) {
123
+ expect(context.value.appName).toBe('Modified App Name');
124
+ }
125
+ });
126
+
127
+ it('should handle API endpoint retrieval', async () => {
128
+ const instance = c15tInstance({
129
+ baseURL: 'http://localhost:3000',
130
+ database: memoryAdapter({}),
131
+ secret: 'test-secret',
132
+ });
133
+
134
+ const api = await instance.getApi();
135
+ expect(api.isOk()).toBe(true);
136
+ if (api.isOk()) {
137
+ expect(api.value).toBeDefined();
138
+ expect(typeof api.value).toBe('object');
139
+ }
140
+ });
141
+
142
+ it('should handle invalid requests gracefully', async () => {
143
+ const instance = c15tInstance({
144
+ baseURL: 'http://localhost:3000',
145
+ database: memoryAdapter({}),
146
+ secret: 'test-secret',
147
+ });
148
+
149
+ const request = new Request(
150
+ 'http://localhost:3000/api/c15t/invalid-endpoint'
151
+ );
152
+ const response = await instance.handler(request);
153
+
154
+ expect(response.isOk()).toBe(true);
155
+ if (response.isOk()) {
156
+ expect(response.value.status).toBe(404);
157
+ }
158
+ });
159
+
160
+ it('should handle trusted origins configuration', async () => {
161
+ const instance = c15tInstance({
162
+ baseURL: 'http://localhost:3000',
163
+ database: memoryAdapter({}),
164
+ trustedOrigins: ['http://trusted.test'],
165
+ secret: 'test-secret',
166
+ });
167
+
168
+ const context = await instance.$context;
169
+ expect(context.isOk()).toBe(true);
170
+ if (context.isOk()) {
171
+ expect(context.value.trustedOrigins).toContain('http://localhost:3000');
172
+ expect(context.value.trustedOrigins).toContain('http://trusted.test');
173
+ }
174
+ });
175
+
176
+ it('should handle dynamic trusted origins', async () => {
177
+ const instance = c15tInstance({
178
+ baseURL: 'http://localhost:3000',
179
+ database: memoryAdapter({}),
180
+ trustedOrigins: (request) => [request.headers.get('origin') || ''],
181
+ secret: 'test-secret',
182
+ });
183
+
184
+ const request = new Request('http://localhost:3000/api/c15t/status', {
185
+ headers: { origin: 'http://dynamic.test' },
186
+ });
187
+
188
+ const response = await instance.handler(request);
189
+ expect(response.isOk()).toBe(true);
190
+
191
+ const context = await instance.$context;
192
+ expect(context.isOk()).toBe(true);
193
+ if (context.isOk()) {
194
+ expect(context.value.trustedOrigins).toContain('http://dynamic.test');
195
+ }
196
+ });
197
+
198
+ it('should handle plugin initialization errors gracefully', async () => {
199
+ const errorPlugin: C15TPlugin = {
200
+ id: 'error-plugin',
201
+ name: 'Error Plugin',
202
+ type: 'test',
203
+ init: () => {
204
+ throw new Error('Plugin initialization failed');
205
+ },
206
+ };
207
+
208
+ const instance = c15tInstance({
209
+ baseURL: 'http://localhost:3000',
210
+ database: memoryAdapter({}),
211
+ plugins: [errorPlugin],
212
+ secret: 'test-secret',
213
+ });
214
+
215
+ const context = await instance.$context;
216
+ expect(context.isErr()).toBe(true);
217
+ if (context.isErr()) {
218
+ expect(context.error.message).toContain('Plugin initialization failed');
219
+ }
220
+ });
221
+
222
+ it('should handle base URL with trailing slash', async () => {
223
+ const instance = c15tInstance({
224
+ baseURL: 'http://localhost:3000/',
225
+ database: memoryAdapter({}),
226
+ secret: 'test-secret',
227
+ });
228
+
229
+ const request = new Request('http://localhost:3000/api/c15t/status', {
230
+ method: 'GET',
231
+ headers: {
232
+ Accept: 'application/json',
233
+ Origin: 'http://localhost:3000',
234
+ },
235
+ });
236
+ const response = await instance.handler(request);
237
+ expect(response.isOk()).toBe(true);
238
+ if (response.isOk()) {
239
+ expect(response.value.status).toBe(200);
240
+ }
241
+ });
242
+
243
+ it('should handle plugin response modification', async () => {
244
+ const responsePlugin: C15TPlugin = {
245
+ id: 'response-plugin',
246
+ name: 'Response Plugin',
247
+ type: 'test',
248
+ onResponse: async (response, ctx) => {
249
+ const contentType = response.headers.get('content-type');
250
+ let data = {};
251
+
252
+ if (contentType?.includes('application/json')) {
253
+ try {
254
+ data = await response.clone().json();
255
+ } catch (error) {
256
+ // biome-ignore lint/suspicious/noConsoleLog: its okay as we are testing
257
+ // biome-ignore lint/suspicious/noConsole: its okay as we are testing
258
+ console.log('Failed to parse JSON response:', error);
259
+ }
260
+ }
261
+
262
+ return {
263
+ response: new Response(JSON.stringify({ ...data, modified: true }), {
264
+ status: response.status,
265
+ headers: new Headers({
266
+ 'Content-Type': 'application/json',
267
+ ...Object.fromEntries(response.headers.entries()),
268
+ }),
269
+ }),
270
+ context: ctx,
271
+ };
272
+ },
273
+ };
274
+
275
+ const instance = c15tInstance({
276
+ baseURL: 'http://localhost:3000',
277
+ database: memoryAdapter({}),
278
+ plugins: [responsePlugin],
279
+ secret: 'test-secret',
280
+ });
281
+
282
+ const request = new Request('http://localhost:3000/api/c15t/status', {
283
+ method: 'GET',
284
+ headers: {
285
+ Accept: 'application/json',
286
+ Origin: 'http://localhost:3000',
287
+ },
288
+ });
289
+
290
+ const response = await instance.handler(request);
291
+
292
+ expect(response.isOk()).toBe(true);
293
+
294
+ if (response.isOk()) {
295
+ const data = await response.value.json();
296
+ expect(data.modified).toBe(true);
297
+ } else {
298
+ // biome-ignore lint/suspicious/noConsole: its okay as we are testing
299
+ console.error('Response error:', response.error);
300
+ expect.fail(`Response was not OK: ${JSON.stringify(response.error)}`);
301
+ }
302
+ });
303
+ });
package/src/core.ts ADDED
@@ -0,0 +1,267 @@
1
+ import { router } from './api/index';
2
+ import { BASE_ERROR_CODES, failAsync, okAsync, safeResultAsync } from './error';
3
+ import type { C15TResult, C15TResultAsync } from './error/results';
4
+ import { init } from './init';
5
+ import type {
6
+ C15TContext,
7
+ C15TOptions,
8
+ C15TPlugin,
9
+ FilterActions,
10
+ } from './types';
11
+ import { getBaseURL } from './utils';
12
+
13
+ /**
14
+ * Interface representing a configured c15t consent management instance.
15
+ *
16
+ * @typeParam PluginTypes - Array of plugin types used in this instance
17
+ *
18
+ * @remarks
19
+ * The C15TInstance provides the main interface for interacting with the consent
20
+ * management system. It includes methods for handling requests, accessing API
21
+ * endpoints, and managing the system's configuration.
22
+ *
23
+ * All asynchronous operations return {@link C15TResultAsync} types for
24
+ * consistent error handling across the system.
25
+ *
26
+ * @example
27
+ * ```typescript
28
+ * const instance: C15TInstance = c15tInstance({
29
+ * secret: 'your-secret',
30
+ * storage: memoryAdapter()
31
+ * });
32
+ *
33
+ * // Handle an incoming request
34
+ * const response = await instance.handler(request);
35
+ * ```
36
+ */
37
+ export interface C15TInstance<PluginTypes extends C15TPlugin[] = C15TPlugin[]> {
38
+ /**
39
+ * Processes incoming HTTP requests and routes them to appropriate handlers.
40
+ *
41
+ * @param request - The incoming web request
42
+ * @returns A Promise resolving to a Result containing the HTTP response
43
+ *
44
+ * @throws Never - All errors are captured in the Result type
45
+ *
46
+ * @example
47
+ * ```typescript
48
+ * const result = await instance.handler(request);
49
+ * result.match(
50
+ * response => sendResponse(response),
51
+ * error => handleError(error)
52
+ * );
53
+ * ```
54
+ */
55
+ handler: (request: Request) => Promise<C15TResultAsync<Response>>;
56
+
57
+ /**
58
+ * Retrieves available API endpoints and their configurations.
59
+ *
60
+ * @returns A Promise resolving to a Result containing the available API endpoints
61
+ *
62
+ * @throws Never - All errors are captured in the Result type
63
+ *
64
+ * @example
65
+ * ```typescript
66
+ * const endpoints = await instance.getApi();
67
+ * endpoints.map(
68
+ * apis => console.log('Available endpoints:', apis),
69
+ * error => console.error('Failed to get endpoints:', error)
70
+ * );
71
+ * ```
72
+ */
73
+ getApi: () => Promise<
74
+ C15TResultAsync<FilterActions<ReturnType<typeof router>['endpoints']>>
75
+ >;
76
+
77
+ /**
78
+ * The configuration options used for this instance.
79
+ */
80
+ options: C15TOptions<PluginTypes>;
81
+
82
+ /**
83
+ * Access to the underlying context as a Result type.
84
+ *
85
+ * @remarks
86
+ * The context is wrapped in a Result type to ensure error handling
87
+ * consistency. Access should be handled using Result pattern methods.
88
+ */
89
+ $context: Promise<C15TResult<C15TContext>>;
90
+ }
91
+
92
+ /**
93
+ * Creates a new c15t consent management instance.
94
+ *
95
+ * @typeParam PluginTypes - Array of plugin types to be used in this instance
96
+ * @typeParam ConfigOptions - Configuration options extending the base C15TOptions
97
+ *
98
+ * @param options - Configuration options for the consent management system
99
+ * @returns A configured C15TInstance ready for use
100
+ *
101
+ * @remarks
102
+ * This is the main factory function for creating c15t instances. It initializes
103
+ * the consent management system with the provided configuration and sets up all
104
+ * necessary components including:
105
+ *
106
+ * - Database adapters
107
+ * - Plugin system
108
+ * - Request handlers
109
+ * - API endpoints
110
+ * - CORS configuration
111
+ *
112
+ * All async operations use the Result pattern for error handling, ensuring
113
+ * that errors are handled consistently throughout the system.
114
+ *
115
+ * @example
116
+ * Basic initialization:
117
+ * ```typescript
118
+ * import { c15tInstance } from '@c15t/backend';
119
+ *
120
+ * const manager = c15tInstance({
121
+ * secret: process.env.SECRET_KEY,
122
+ * storage: memoryAdapter()
123
+ * });
124
+ * ```
125
+ *
126
+ * @example
127
+ * Advanced initialization with type parameters:
128
+ * ```typescript
129
+ * type MyPlugins = [typeof geoPlugin, typeof analyticsPlugin];
130
+ *
131
+ * const c15t = c15tInstance<MyPlugins>({
132
+ * secret: process.env.SECRET_KEY,
133
+ * storage: kyselyAdapter(db),
134
+ * plugins: [geoPlugin(), analyticsPlugin()]
135
+ * });
136
+ * ```
137
+ */
138
+ export const c15tInstance = <
139
+ PluginTypes extends C15TPlugin[] = C15TPlugin[],
140
+ ConfigOptions extends C15TOptions<PluginTypes> = C15TOptions<PluginTypes>,
141
+ >(
142
+ options: ConfigOptions
143
+ ): C15TInstance<PluginTypes> => {
144
+ const contextPromise = init(options);
145
+
146
+ /**
147
+ * Processes incoming requests and routes them to the appropriate handler
148
+ * using the Result pattern for error handling
149
+ *
150
+ * @param request - The incoming web request
151
+ * @returns A Promise resolving to a Result containing a web response
152
+ */
153
+ const handler = async (
154
+ request: Request
155
+ ): Promise<C15TResultAsync<Response>> => {
156
+ const contextResult = await contextPromise;
157
+
158
+ // Map the Result to a ResultAsync for proper chaining
159
+ return contextResult.asyncAndThen((ctx: C15TContext) => {
160
+ const basePath = ctx.options.basePath || '/api/c15t';
161
+ const url = new URL(request.url);
162
+ if (ctx.options.baseURL) {
163
+ // If baseURL is provided but doesn't include the basePath, add it
164
+ const baseURL = new URL(ctx.options.baseURL);
165
+ if (!baseURL.pathname || baseURL.pathname === '/') {
166
+ ctx.options.baseURL = `${baseURL.origin}${basePath}`;
167
+ ctx.baseURL = ctx.options.baseURL;
168
+ }
169
+ } else {
170
+ const baseURL =
171
+ getBaseURL(undefined, basePath) || `${url.origin}${basePath}`;
172
+ ctx.options.baseURL = baseURL;
173
+ ctx.baseURL = baseURL;
174
+ }
175
+
176
+ // Extract trusted origins logic to avoid nested ternaries
177
+ let originsFromOptions: string[] = [];
178
+ if (options.trustedOrigins) {
179
+ originsFromOptions = Array.isArray(options.trustedOrigins)
180
+ ? options.trustedOrigins
181
+ : options.trustedOrigins(request);
182
+ }
183
+
184
+ ctx.trustedOrigins = [
185
+ ...originsFromOptions,
186
+ ctx.options.baseURL || '',
187
+ url.origin,
188
+ ];
189
+
190
+ try {
191
+ const { handler } = router(ctx, options);
192
+
193
+ // Use safeResultAsync instead of fromPromise
194
+ return safeResultAsync(
195
+ handler(request),
196
+ BASE_ERROR_CODES.REQUEST_HANDLER_ERROR
197
+ );
198
+ } catch (error) {
199
+ const safeErrorMessage =
200
+ error instanceof Error
201
+ ? error.message.split('\n')[0]
202
+ : 'An unknown error occurred';
203
+ return failAsync(`Error processing request: ${safeErrorMessage}`, {
204
+ code: BASE_ERROR_CODES.REQUEST_HANDLER_ERROR,
205
+ status: 500,
206
+ data: { url: request.url },
207
+ });
208
+ }
209
+ });
210
+ };
211
+
212
+ /**
213
+ * Method to get API endpoints using the Result pattern
214
+ *
215
+ * @returns A Promise resolving to a Result containing the available API endpoints
216
+ */
217
+ const getApi = async (): Promise<
218
+ C15TResultAsync<FilterActions<ReturnType<typeof router>['endpoints']>>
219
+ > => {
220
+ const contextResult = await contextPromise;
221
+
222
+ return contextResult.asyncAndThen((context: C15TContext) => {
223
+ // Make sure context has a valid baseURL before calling router
224
+ if (!context.baseURL) {
225
+ try {
226
+ const basePath = context.options.basePath || '/api/c15t';
227
+ const baseURL = getBaseURL(context.options.baseURL, basePath);
228
+ if (baseURL) {
229
+ context.baseURL = baseURL;
230
+ }
231
+ } catch (error) {
232
+ return failAsync(
233
+ `Failed to determine base URL: ${error instanceof Error ? error.message : String(error)}`,
234
+ {
235
+ code: BASE_ERROR_CODES.API_RETRIEVAL_ERROR,
236
+ }
237
+ );
238
+ }
239
+ }
240
+
241
+ try {
242
+ const { endpoints } = router(context, options);
243
+ // Convert endpoints to the expected FilterActions type and wrap in okAsync
244
+ const typedEndpoints = endpoints as unknown as FilterActions<
245
+ ReturnType<typeof router>['endpoints']
246
+ >;
247
+ return okAsync(typedEndpoints);
248
+ } catch (error) {
249
+ return failAsync(
250
+ `Failed to get API endpoints: ${error instanceof Error ? error.message : String(error)}`,
251
+ {
252
+ code: BASE_ERROR_CODES.API_RETRIEVAL_ERROR,
253
+ data: { error },
254
+ }
255
+ );
256
+ }
257
+ });
258
+ };
259
+
260
+ // Create and return the simplified instance with access to the context
261
+ return {
262
+ handler,
263
+ getApi,
264
+ options,
265
+ $context: contextPromise,
266
+ };
267
+ };