@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,3 @@
1
+ export * from './registry';
2
+ export * from './schema';
3
+ export * from './table';
@@ -0,0 +1,371 @@
1
+ import type { Adapter } from '~/db/adapters/types';
2
+ import { getWithHooks } from '~/db/hooks';
3
+ import { BASE_ERROR_CODES, C15TError } from '~/error';
4
+ import type { GenericEndpointContext, RegistryContext } from '~/types';
5
+ import { validateEntityOutput } from '../definition';
6
+ import type { Subject } from './schema';
7
+ /**
8
+ * Creates and returns a set of subject-related adapter methods to interact with the database.
9
+ *
10
+ * These methods provide a consistent interface for creating, finding, updating, and deleting
11
+ * subject records while applying hooks and enforcing data validation rules.
12
+ *
13
+ * @param adapter - The database adapter used for direct database operations
14
+ * @param ctx - The context object containing the database adapter, hooks, and options
15
+ * @returns An object containing type-safe subject operations
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const subjectAdapter = createSubjectAdapter(
20
+ * databaseAdapter,
21
+ * createWithHooks,
22
+ * updateWithHooks,
23
+ * c15tOptions
24
+ * );
25
+ *
26
+ * // Create a new subject
27
+ * const subject = await subjectAdapter.createSubject({
28
+ * externalId: 'external-123',
29
+ * identityProvider: 'auth0'
30
+ * });
31
+ * ```
32
+ */
33
+ export function subjectRegistry({ adapter, ...ctx }: RegistryContext) {
34
+ const { createWithHooks, updateWithHooks } = getWithHooks(adapter, ctx);
35
+
36
+ return {
37
+ /**
38
+ * Creates a new subject record in the database.
39
+ *
40
+ * Automatically sets creation and update timestamps and applies any
41
+ * configured hooks during the creation process.
42
+ *
43
+ * @param subject - Subject data to create (without id and timestamps)
44
+ * @param context - Optional endpoint context for hooks
45
+ * @returns The created subject with all fields populated
46
+ *
47
+ * @throws May throw an error if hooks prevent creation or if database operations fail
48
+ */
49
+ createSubject: async (
50
+ subject: Omit<Subject, 'id' | 'createdAt' | 'updatedAt'> &
51
+ Partial<Subject>,
52
+ context?: GenericEndpointContext
53
+ ) => {
54
+ const createdSubject = await createWithHooks({
55
+ data: {
56
+ createdAt: new Date(),
57
+ updatedAt: new Date(),
58
+ ...subject,
59
+ },
60
+ model: 'subject',
61
+ customFn: undefined,
62
+ context,
63
+ });
64
+ return createdSubject
65
+ ? validateEntityOutput('subject', createdSubject, ctx.options)
66
+ : null;
67
+ },
68
+
69
+ /**
70
+ * Finds an existing subject or creates a new one if needed.
71
+ * If both subjectId and externalSubjectId are provided, validates they match the same subject.
72
+ * Creates a new anonymous subject only if no identifiers are provided.
73
+ *
74
+ * @param params - Parameters for finding or creating the subject
75
+ * @returns The existing or newly created subject
76
+ * @throws APIError if subject validation fails or creation fails
77
+ */
78
+ findOrCreateSubject: async function ({
79
+ subjectId,
80
+ externalSubjectId,
81
+ ipAddress = 'unknown',
82
+ context,
83
+ }: {
84
+ subjectId?: string;
85
+ externalSubjectId?: string;
86
+ ipAddress?: string;
87
+ context?: GenericEndpointContext;
88
+ }) {
89
+ // If both subjectId and externalSubjectId are provided, validate they match
90
+ if (subjectId && externalSubjectId) {
91
+ const [subjectById, subjectByExternalId] = await Promise.all([
92
+ this.findSubjectById(subjectId),
93
+ this.findSubjectByExternalId(externalSubjectId),
94
+ ]);
95
+
96
+ if (!subjectById || !subjectByExternalId) {
97
+ ctx.logger?.info(
98
+ 'Subject validation failed: One or both subjects not found',
99
+ {
100
+ providedSubjectId: subjectId,
101
+ providedExternalId: externalSubjectId,
102
+ subjectByIdFound: !!subjectById,
103
+ subjectByExternalIdFound: !!subjectByExternalId,
104
+ }
105
+ );
106
+ throw new C15TError(
107
+ 'The specified subject could not be found. Please verify the subject identifiers and try again.',
108
+ {
109
+ code: BASE_ERROR_CODES.NOT_FOUND,
110
+ status: 404,
111
+ data: {
112
+ providedSubjectId: subjectId,
113
+ providedExternalId: externalSubjectId,
114
+ },
115
+ }
116
+ );
117
+ }
118
+
119
+ if (subjectById.id !== subjectByExternalId.id) {
120
+ ctx.logger?.warn(
121
+ 'Subject validation failed: IDs do not match the same subject',
122
+ {
123
+ providedSubjectId: subjectId,
124
+ providedExternalId: externalSubjectId,
125
+ subjectByIdId: subjectById.id,
126
+ subjectByExternalIdId: subjectByExternalId.id,
127
+ }
128
+ );
129
+ throw new C15TError(
130
+ 'The provided subjectId and externalSubjectId do not match the same subject. Please ensure both identifiers refer to the same subject.',
131
+ {
132
+ code: BASE_ERROR_CODES.CONFLICT,
133
+ status: 409,
134
+ data: {
135
+ providedSubjectId: subjectId,
136
+ providedExternalId: externalSubjectId,
137
+ subjectByIdId: subjectById.id,
138
+ subjectByExternalIdId: subjectByExternalId.id,
139
+ },
140
+ }
141
+ );
142
+ }
143
+
144
+ return subjectById;
145
+ }
146
+
147
+ // Try to find subject by subjectId if provided
148
+ if (subjectId) {
149
+ const subject = await this.findSubjectById(subjectId);
150
+ if (subject) {
151
+ return subject;
152
+ }
153
+ throw new C15TError('Subject not found', {
154
+ code: BASE_ERROR_CODES.NOT_FOUND,
155
+ status: 404,
156
+ });
157
+ }
158
+
159
+ // If externalSubjectId provided, try to find or create with upsert
160
+ if (externalSubjectId) {
161
+ try {
162
+ const subject = await this.findSubjectByExternalId(externalSubjectId);
163
+ if (subject) {
164
+ ctx.logger?.debug('Found existing subject by external ID', {
165
+ externalSubjectId,
166
+ });
167
+ return subject;
168
+ }
169
+
170
+ ctx.logger?.info('Creating new subject with external ID', {
171
+ externalSubjectId,
172
+ });
173
+ // Attempt to create with unique constraint on externalId
174
+ return await this.createSubject(
175
+ {
176
+ externalId: externalSubjectId,
177
+ identityProvider: 'external',
178
+ lastIpAddress: ipAddress,
179
+ isIdentified: true,
180
+ },
181
+ context
182
+ );
183
+ } catch (error) {
184
+ // If creation failed due to duplicate, try to find again
185
+ if (
186
+ error instanceof Error &&
187
+ error.message.includes('unique constraint')
188
+ ) {
189
+ ctx.logger?.info(
190
+ 'Handling duplicate key violation for external ID',
191
+ { externalSubjectId }
192
+ );
193
+ const subject =
194
+ await this.findSubjectByExternalId(externalSubjectId);
195
+ if (subject) {
196
+ return subject;
197
+ }
198
+ }
199
+ ctx.logger?.error(
200
+ 'Failed to create or find subject with external ID',
201
+ {
202
+ externalSubjectId,
203
+ error: error instanceof Error ? error.message : 'Unknown error',
204
+ }
205
+ );
206
+ throw new C15TError(
207
+ 'Failed to create or find subject with external ID',
208
+ {
209
+ code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
210
+ status: 500,
211
+ data: {
212
+ error: error instanceof Error ? error.message : 'Unknown error',
213
+ },
214
+ }
215
+ );
216
+ }
217
+ }
218
+
219
+ // For anonymous subjects, use a transaction to prevent duplicates
220
+ try {
221
+ ctx.logger?.info('Creating new anonymous subject');
222
+ return await this.createSubject(
223
+ {
224
+ externalId: null,
225
+ identityProvider: 'anonymous',
226
+ lastIpAddress: ipAddress,
227
+ isIdentified: false,
228
+ },
229
+ context
230
+ );
231
+ } catch (error) {
232
+ ctx.logger?.error('Failed to create anonymous subject', {
233
+ ipAddress,
234
+ error: error instanceof Error ? error.message : 'Unknown error',
235
+ });
236
+ throw new C15TError('Failed to create anonymous subject', {
237
+ code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
238
+ status: 500,
239
+ data: {
240
+ error: error instanceof Error ? error.message : 'Unknown error',
241
+ },
242
+ });
243
+ }
244
+ },
245
+
246
+ /**
247
+ * Finds a subject by their unique ID.
248
+ *
249
+ * Returns the subject with processed output fields according to the schema configuration.
250
+ *
251
+ * @param subjectId - The unique identifier of the subject
252
+ * @returns The subject object if found, null otherwise
253
+ */
254
+ findSubjectById: async (subjectId: string) => {
255
+ const subject = await adapter.findOne({
256
+ model: 'subject',
257
+ where: [
258
+ {
259
+ field: 'id',
260
+ value: subjectId,
261
+ },
262
+ ],
263
+ });
264
+ return subject
265
+ ? validateEntityOutput('subject', subject, ctx.options)
266
+ : null;
267
+ },
268
+
269
+ /**
270
+ * Finds a subject by their external ID.
271
+ *
272
+ * This is useful when integrating with external authentication systems
273
+ * where subjects are identified by a provider-specific ID.
274
+ *
275
+ * @param externalId - The external identifier of the subject
276
+ * @returns The subject object if found, null otherwise
277
+ */
278
+ findSubjectByExternalId: async (externalId: string) => {
279
+ const subject = await adapter.findOne({
280
+ model: 'subject',
281
+ where: [
282
+ {
283
+ field: 'externalId',
284
+ value: externalId,
285
+ },
286
+ ],
287
+ });
288
+ return subject
289
+ ? validateEntityOutput('subject', subject, ctx.options)
290
+ : null;
291
+ },
292
+
293
+ /**
294
+ * Updates an existing subject record by ID.
295
+ *
296
+ * Applies any configured hooks during the update process and
297
+ * processes the output according to schema configuration.
298
+ *
299
+ * @param subjectId - The unique identifier of the subject to update
300
+ * @param data - The fields to update on the subject record
301
+ * @param context - Optional endpoint context for hooks
302
+ * @returns The updated subject if successful, null if subject not found or hooks prevented update
303
+ */
304
+ updateSubject: async (
305
+ subjectId: string,
306
+ data: Partial<Subject> & Record<string, unknown>,
307
+ context?: GenericEndpointContext
308
+ ) => {
309
+ const subject = await updateWithHooks({
310
+ data: {
311
+ ...data,
312
+ updatedAt: new Date(),
313
+ },
314
+ where: [
315
+ {
316
+ field: 'id',
317
+ value: subjectId,
318
+ },
319
+ ],
320
+ model: 'subject',
321
+ customFn: undefined,
322
+ context,
323
+ });
324
+ return subject
325
+ ? validateEntityOutput('subject', subject, ctx.options)
326
+ : null;
327
+ },
328
+
329
+ /**
330
+ * Soft deletes a subject and all associated consents from the database.
331
+ *
332
+ * This is a cascading operation that marks the subject as deleted by setting
333
+ * its status to 'deleted' and removes all associated consent records.
334
+ * The subject record itself remains in the database but is inactive.
335
+ *
336
+ * @param subjectId - The unique identifier of the subject to soft delete
337
+ * @returns A promise that resolves when the soft deletion is complete
338
+ */
339
+ deleteSubject: async (subjectId: string) => {
340
+ await adapter.transaction({
341
+ callback: async (tx: Adapter) => {
342
+ // Update the subject record
343
+ await tx.update({
344
+ model: 'subject',
345
+ where: [
346
+ {
347
+ field: 'id',
348
+ value: subjectId,
349
+ },
350
+ ],
351
+ update: {
352
+ status: 'deleted',
353
+ updatedAt: new Date(),
354
+ },
355
+ });
356
+
357
+ // Delete all related records
358
+ await tx.deleteMany({
359
+ model: 'consent',
360
+ where: [
361
+ {
362
+ field: 'subjectId',
363
+ value: subjectId,
364
+ },
365
+ ],
366
+ });
367
+ },
368
+ });
369
+ },
370
+ };
371
+ }
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod';
2
+
3
+ /**
4
+ * Zod schema for validating subject entities.
5
+ *
6
+ * This defines the structure and validation rules for subject records:
7
+ * - Requires a valid UUID for the ID field
8
+ * - Default value of false for isIdentified
9
+ * - Optional fields for externalId, identityProvider, and lastIpAddress
10
+ * - Default current date/time for creation and update timestamps
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * const subjectData = {
15
+ * id: 'sub_x1pftyoufsm7xgo1kv',
16
+ * externalId: 'ext-123',
17
+ * isIdentified: true
18
+ * };
19
+ *
20
+ * // Validate and parse the subject data
21
+ * const validSubject = subjectSchema.parse(subjectData);
22
+ * ```
23
+ */
24
+ export const subjectSchema = z.object({
25
+ id: z.string(),
26
+ isIdentified: z.boolean().default(false),
27
+ externalId: z.string().nullable().optional(),
28
+ identityProvider: z.string().optional(),
29
+ lastIpAddress: z.string().optional(),
30
+ createdAt: z.date().default(() => new Date()),
31
+ updatedAt: z.date().default(() => new Date()),
32
+ });
33
+
34
+ /**
35
+ * Type definition for Subject
36
+ *
37
+ * This type represents the structure of a subject record
38
+ * as defined by the subjectSchema. It includes all fields
39
+ * that are part of the subject entity.
40
+ */
41
+ export type Subject = z.infer<typeof subjectSchema>;
@@ -0,0 +1,139 @@
1
+ import type { Field } from '~/db/core/fields';
2
+ import { COMMON_TIMEZONES } from '~/db/core/fields';
3
+ import type { C15TOptions } from '~/types';
4
+ import { subjectSchema } from './schema';
5
+
6
+ /**
7
+ * Generates the database table configuration for the subject entity.
8
+ *
9
+ * This function creates a schema definition that includes all standard subject fields
10
+ * and any additional fields from plugins or configuration. The resulting schema is used
11
+ * for database migrations, schema validation, and query building.
12
+ *
13
+ * @param options - C15T configuration options that may contain subject table customizations
14
+ * @param subjectFields - Additional fields from plugins to include in the subject table
15
+ * @returns A complete table schema definition with fields, model name, and metadata
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * const subjectTableSchema = getSubjectTable(c15tOptions);
20
+ * // Use the schema for migrations or data access
21
+ * const migrationPlans = generateMigrations(subjectTableSchema);
22
+ * ```
23
+ */
24
+ export function getSubjectTable(
25
+ options: C15TOptions,
26
+ subjectFields?: Record<string, Field>
27
+ ) {
28
+ // Get subject config, supporting both the new tables.subject and legacy subject format
29
+ const subjectConfig = options.tables?.subject;
30
+
31
+ return {
32
+ /**
33
+ * The name of the subject table in the database, configurable through options
34
+ */
35
+ entityName: subjectConfig?.entityName || 'subject',
36
+
37
+ /**
38
+ * The ID prefix for the subject table
39
+ * Used to generate unique prefixed IDs for subjects
40
+ */
41
+ entityPrefix: subjectConfig?.entityPrefix || 'sub',
42
+
43
+ /**
44
+ * The Zod schema for the subject table
45
+ */
46
+ schema: subjectSchema,
47
+
48
+ /**
49
+ * Field definitions for the subject table
50
+ */
51
+ fields: {
52
+ /**
53
+ * Whether the subject has been identified/verified
54
+ * Default: false
55
+ */
56
+ isIdentified: {
57
+ type: 'boolean',
58
+ defaultValue: () => false,
59
+ required: true,
60
+ fieldName: subjectConfig?.fields?.isIdentified || 'isIdentified',
61
+ },
62
+
63
+ /**
64
+ * External identifier for the subject (from auth providers)
65
+ * Optional field
66
+ */
67
+ externalId: {
68
+ type: 'string',
69
+ required: false,
70
+ fieldName: subjectConfig?.fields?.externalId || 'externalId',
71
+ },
72
+
73
+ /**
74
+ * The provider that identified this subject (e.g., 'auth0', 'okta')
75
+ * Optional field
76
+ */
77
+ identityProvider: {
78
+ type: 'string',
79
+ required: false,
80
+ fieldName:
81
+ subjectConfig?.fields?.identityProvider || 'identityProvider',
82
+ },
83
+
84
+ /**
85
+ * Last known IP address of the subject
86
+ * Optional field, useful for security and audit purposes
87
+ */
88
+ lastIpAddress: {
89
+ type: 'string',
90
+ required: false,
91
+ fieldName: subjectConfig?.fields?.lastIpAddress || 'lastIpAddress',
92
+ },
93
+
94
+ /**
95
+ * When the subject was created
96
+ * Automatically set to current time by default
97
+ */
98
+ createdAt: {
99
+ type: 'date',
100
+ defaultValue: () => new Date(),
101
+ required: true,
102
+ fieldName: subjectConfig?.fields?.createdAt || 'createdAt',
103
+ },
104
+
105
+ /**
106
+ * When the subject was last updated
107
+ * Automatically set to current time on update
108
+ */
109
+ updatedAt: {
110
+ type: 'date',
111
+ defaultValue: () => new Date(),
112
+ required: true,
113
+ fieldName: subjectConfig?.fields?.updatedAt || 'updatedAt',
114
+ },
115
+
116
+ /**
117
+ * Subject's local timezone, stored as IANA timezone identifier
118
+ */
119
+ subjectTimezone: {
120
+ type: 'timezone',
121
+ required: false,
122
+ defaultValue: COMMON_TIMEZONES.UTC,
123
+ fieldName: subjectConfig?.fields?.subjectTimezone || 'subjectTimezone',
124
+ },
125
+
126
+ // Include additional fields from plugins
127
+ ...(subjectFields || {}),
128
+
129
+ // Include additional fields from configuration
130
+ ...(subjectConfig?.additionalFields || {}),
131
+ },
132
+
133
+ /**
134
+ * Execution order during migrations (lower numbers run first)
135
+ * Subject table needs to be created early as other tables reference it
136
+ */
137
+ order: 1,
138
+ };
139
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Subject Entity Type Definitions
3
+ *
4
+ * This module contains type definitions specific to the subject entity.
5
+ */
6
+ import type { TimestampedEntityConfig } from '../types';
7
+
8
+ /**
9
+ * Subject entity configuration
10
+ * @default entityName: "subject", entityPrefix: "sub"
11
+ */
12
+ export interface SubjectEntityConfig extends TimestampedEntityConfig {
13
+ fields?: Record<string, string> & {
14
+ id?: string;
15
+ isIdentified?: string;
16
+ externalId?: string;
17
+ identityProvider?: string;
18
+ lastIpAddress?: string;
19
+ createdAt?: string;
20
+ updatedAt?: string;
21
+ };
22
+ }