@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,804 @@
1
+ import superjson from 'superjson';
2
+ import type { InferValueType } from './field-inference';
3
+ import type {
4
+ Field,
5
+ FieldConfig,
6
+ FieldType,
7
+ JsonValue,
8
+ Primitive,
9
+ } from './field-types';
10
+ import {
11
+ getDatabaseType,
12
+ parseFromDb,
13
+ transformForDb,
14
+ } from './superjson-utils';
15
+ import { validateField } from './zod-fields';
16
+
17
+ /**
18
+ * Defines transform functions for field input and output operations.
19
+ * Provides properly typed transform functions based on the field type.
20
+ *
21
+ * @template TFieldType - The field type that determines the transform function signatures
22
+ *
23
+ * @example
24
+ * ```typescript
25
+ * // Define transform functions for a string field
26
+ * const nameTransformers: FieldTransformers<'string'> = {
27
+ * input: (value) => value.trim(),
28
+ * output: (value) => value.toUpperCase()
29
+ * };
30
+ * ```
31
+ */
32
+ export type FieldTransformers<TFieldType extends FieldType> = {
33
+ /**
34
+ * Transform function for field input.
35
+ * Applied when data is being saved to the database.
36
+ */
37
+ input?: (value: InferValueType<TFieldType>) => Primitive | Promise<Primitive>;
38
+ /**
39
+ * Transform function for field output.
40
+ * Applied when data is being retrieved from the database.
41
+ */
42
+ output?: (
43
+ value: InferValueType<TFieldType>
44
+ ) => Primitive | Promise<Primitive>;
45
+ };
46
+
47
+ /**
48
+ * Configuration options specific to number fields.
49
+ * Provides additional validation options for number fields.
50
+ *
51
+ * @example
52
+ * ```typescript
53
+ * // Define a number field with min/max constraints
54
+ * const ageField = numberField({
55
+ * required: true,
56
+ * min: 0,
57
+ * max: 120
58
+ * });
59
+ * ```
60
+ */
61
+ export type NumberFieldOptions = {
62
+ /**
63
+ * Minimum allowed value for the number field.
64
+ */
65
+ min?: number;
66
+ /**
67
+ * Maximum allowed value for the number field.
68
+ */
69
+ max?: number;
70
+ };
71
+
72
+ /**
73
+ * Configuration options specific to string fields.
74
+ * Provides additional validation options for string fields.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * // Define a string field with length constraints
79
+ * const usernameField = stringField({
80
+ * required: true,
81
+ * minLength: 3,
82
+ * maxLength: 20
83
+ * });
84
+ * ```
85
+ */
86
+ export type StringFieldOptions = {
87
+ /**
88
+ * Minimum allowed length for the string field.
89
+ */
90
+ minLength?: number;
91
+ /**
92
+ * Maximum allowed length for the string field.
93
+ */
94
+ maxLength?: number;
95
+ /**
96
+ * Regular expression pattern that the string must match.
97
+ */
98
+ pattern?: string;
99
+ };
100
+
101
+ /**
102
+ * Configuration options specific to date fields.
103
+ * Provides additional validation and formatting options for date fields.
104
+ *
105
+ * @example
106
+ * ```typescript
107
+ * // Define a date field with min/max date constraints
108
+ * const birthdateField = dateField({
109
+ * required: true,
110
+ * minDate: new Date('1900-01-01'),
111
+ * maxDate: new Date() // Current date
112
+ * });
113
+ * ```
114
+ */
115
+ export type DateFieldOptions = {
116
+ /**
117
+ * Minimum allowed date value.
118
+ * Dates earlier than this will fail validation.
119
+ */
120
+ minDate?: Date;
121
+
122
+ /**
123
+ * Maximum allowed date value.
124
+ * Dates later than this will fail validation.
125
+ */
126
+ maxDate?: Date;
127
+
128
+ /**
129
+ * Whether to store just the date part without time information.
130
+ * When true, time components will be zeroed out.
131
+ * @default false
132
+ */
133
+ dateOnly?: boolean;
134
+
135
+ /**
136
+ * Format string for date output transformation.
137
+ * If provided, dates will be transformed to strings in this format.
138
+ * Only applies if no custom output transform is provided.
139
+ * Uses Intl.DateTimeFormat for consistent cross-platform formatting.
140
+ */
141
+ format?: Intl.DateTimeFormatOptions;
142
+ };
143
+
144
+ /**
145
+ * Configuration options specific to JSON fields.
146
+ * Provides additional validation and schema options for JSON data.
147
+ *
148
+ * @example
149
+ * ```typescript
150
+ * // Define a JSON field with schema validation
151
+ * const metadataField = jsonField({
152
+ * required: true,
153
+ * validator: (value) => {
154
+ * if (!value.hasOwnProperty('version')) return 'Missing version property';
155
+ * return null;
156
+ * }
157
+ * });
158
+ * ```
159
+ */
160
+ export type JsonFieldOptions = {
161
+ /**
162
+ * Whether to validate that the value is a valid JSON object.
163
+ * When true, the field will ensure the value can be properly stringified/parsed.
164
+ * @default true
165
+ */
166
+ validateJson?: boolean;
167
+ };
168
+
169
+ /**
170
+ * Common IANA timezone identifiers.
171
+ * A subset of commonly used timezones from the IANA timezone database.
172
+ * Used for validation and autocompletion in IDE.
173
+ */
174
+ export const COMMON_TIMEZONES = {
175
+ UTC: 'UTC',
176
+ GMT: 'GMT',
177
+ // North America
178
+ EASTERN: 'America/New_York',
179
+ CENTRAL: 'America/Chicago',
180
+ MOUNTAIN: 'America/Denver',
181
+ PACIFIC: 'America/Los_Angeles',
182
+ // Europe
183
+ LONDON: 'Europe/London',
184
+ PARIS: 'Europe/Paris',
185
+ BERLIN: 'Europe/Berlin',
186
+ // Asia
187
+ TOKYO: 'Asia/Tokyo',
188
+ SHANGHAI: 'Asia/Shanghai',
189
+ SINGAPORE: 'Asia/Singapore',
190
+ // Australia
191
+ SYDNEY: 'Australia/Sydney',
192
+ // South America
193
+ SAO_PAULO: 'America/Sao_Paulo',
194
+ } as const;
195
+
196
+ /**
197
+ * Configuration options specific to timezone fields.
198
+ * Provides additional validation options for timezone fields.
199
+ *
200
+ * @example
201
+ * ```typescript
202
+ * // Define a timezone field with validation
203
+ * const tzField = timezoneField({
204
+ * required: true,
205
+ * defaultValue: COMMON_TIMEZONES.UTC
206
+ * });
207
+ *
208
+ * // Define a timezone field with suggested values
209
+ * const subjectTimezone = timezoneField({
210
+ * required: true,
211
+ * suggestedValues: [
212
+ * COMMON_TIMEZONES.EASTERN,
213
+ * COMMON_TIMEZONES.CENTRAL,
214
+ * COMMON_TIMEZONES.PACIFIC
215
+ * ]
216
+ * });
217
+ * ```
218
+ *
219
+ * @remarks
220
+ * The timezone field stores timezone identifiers according to the IANA timezone database.
221
+ * It validates timezone strings to ensure they are valid IANA timezone identifiers.
222
+ */
223
+ export type TimezoneFieldOptions = {
224
+ /**
225
+ * Whether to validate the timezone format against IANA timezone database.
226
+ * When true, ensures the value is a valid IANA timezone name.
227
+ * @default true
228
+ */
229
+ validateTimezone?: boolean;
230
+
231
+ /**
232
+ * Suggested values for the timezone field.
233
+ * Can be used by client UIs to provide dropdown options.
234
+ */
235
+ suggestedValues?: string[] | readonly string[];
236
+
237
+ /**
238
+ * Whether to restrict values to only the provided suggestedValues.
239
+ * If true, values not in suggestedValues will fail validation.
240
+ * @default false
241
+ */
242
+ restrictToSuggestedValues?: boolean;
243
+ };
244
+
245
+ /**
246
+ * Creates a field attribute with the specified configuration.
247
+ * This is the core function for defining schema fields with type safety.
248
+ *
249
+ * @template TFieldType - The field type to create
250
+ * @template TConfig - The configuration type for the field
251
+ *
252
+ * @param type - The field type to create
253
+ * @param config - Configuration options for the field
254
+ * @returns A fully configured field definition
255
+ *
256
+ * @example
257
+ * ```typescript
258
+ * // Create a basic string field
259
+ * const nameField = createField('string', {
260
+ * required: true
261
+ * });
262
+ *
263
+ * // Create a number field with transforms
264
+ * const ageField = createField('number', {
265
+ * required: false,
266
+ * transform: {
267
+ * input: (value) => Math.floor(value)
268
+ * }
269
+ * });
270
+ * ```
271
+ */
272
+ export function createField<TFieldType extends FieldType>(
273
+ type: TFieldType,
274
+ config?: Omit<FieldConfig<TFieldType>, 'type'>
275
+ ): Field<TFieldType> {
276
+ const fieldConfig: FieldConfig<TFieldType> = {
277
+ type,
278
+ required: true,
279
+ returned: true,
280
+ input: true,
281
+ sortable: true,
282
+ bigint: false,
283
+ ...config,
284
+ };
285
+
286
+ return validateField(fieldConfig);
287
+ }
288
+
289
+ /**
290
+ * Creates a string field with the specified configuration.
291
+ */
292
+ export function stringField<
293
+ TConfig extends Omit<FieldConfig<'string'>, 'type' | 'transform'> & {
294
+ transform?: {
295
+ input?: (value: string) => Primitive | Promise<Primitive>;
296
+ output?: (value: unknown) => string | Promise<string>;
297
+ };
298
+ } & StringFieldOptions,
299
+ >(config: TConfig = {} as TConfig): Field<'string'> {
300
+ return createField('string', config);
301
+ }
302
+
303
+ /**
304
+ * Creates a number field with the specified configuration.
305
+ */
306
+ export function numberField<
307
+ TConfig extends Omit<FieldConfig<'number'>, 'type' | 'transform'> & {
308
+ transform?: {
309
+ input?: (value: number) => Primitive | Promise<Primitive>;
310
+ output?: (value: unknown) => number | Promise<number>;
311
+ };
312
+ } & NumberFieldOptions,
313
+ >(config: TConfig = {} as TConfig): Field<'number'> {
314
+ return createField('number', config);
315
+ }
316
+
317
+ /**
318
+ * Creates a boolean field with the specified configuration.
319
+ */
320
+ export function booleanField<
321
+ TConfig extends Omit<FieldConfig<'boolean'>, 'type' | 'transform'> & {
322
+ transform?: {
323
+ input?: (value: boolean) => Primitive | Promise<Primitive>;
324
+ output?: (value: unknown) => boolean | Promise<boolean>;
325
+ };
326
+ },
327
+ >(config: TConfig = {} as TConfig): Field<'boolean'> {
328
+ return createField('boolean', config);
329
+ }
330
+
331
+ /**
332
+ * Creates a date field with the specified configuration.
333
+ */
334
+ export function dateField<
335
+ TConfig extends Omit<
336
+ FieldConfig<'date'>,
337
+ 'type' | 'transform' | 'minDate' | 'maxDate' | 'dateOnly' | 'format'
338
+ > & {
339
+ transform?: {
340
+ input?: (value: Date) => Primitive | Promise<Primitive>;
341
+ output?: (value: unknown) => Date | Promise<Date>;
342
+ };
343
+ } & DateFieldOptions,
344
+ >(config: TConfig = {} as TConfig): Field<'date'> {
345
+ const {
346
+ transform = {},
347
+ minDate,
348
+ maxDate,
349
+ dateOnly = false,
350
+ format,
351
+ validator,
352
+ ...restConfig
353
+ } = config;
354
+
355
+ // Store the original transform functions
356
+ const originalInputTransform = transform.input;
357
+ const originalOutputTransform = transform.output;
358
+
359
+ // Get the current database type
360
+ const dbType = getDatabaseType();
361
+
362
+ // Create database-aware transform functions for SQLite and MySQL
363
+ const inputTransform = async (value: Date) => {
364
+ // First apply the subject's transform if provided
365
+ let transformedValue = value;
366
+ if (originalInputTransform) {
367
+ transformedValue = (await originalInputTransform(value)) as Date;
368
+ }
369
+
370
+ // Strip time components if dateOnly is true
371
+ if (dateOnly && transformedValue instanceof Date) {
372
+ const dateOnlyValue = new Date(transformedValue);
373
+ dateOnlyValue.setHours(0, 0, 0, 0);
374
+ transformedValue = dateOnlyValue;
375
+ }
376
+
377
+ // Apply special handling for SQLite (and optionally MySQL) to preserve timezone info
378
+ if (dbType === 'sqlite') {
379
+ return superjson.stringify({ date: transformedValue });
380
+ }
381
+
382
+ return transformedValue;
383
+ };
384
+
385
+ const outputTransform = async (value: unknown): Promise<Date> => {
386
+ let parsedValue = value;
387
+
388
+ // Handle SQLite date format (SuperJSON string)
389
+ if (
390
+ dbType === 'sqlite' &&
391
+ typeof value === 'string' &&
392
+ value.includes('"date"')
393
+ ) {
394
+ try {
395
+ const parsed = superjson.parse(value);
396
+ parsedValue = (parsed as { date: Date }).date;
397
+ } catch {
398
+ // If parsing fails, keep the original value
399
+ }
400
+ }
401
+
402
+ // Apply the subject's transform if provided
403
+ if (originalOutputTransform && parsedValue instanceof Date) {
404
+ return await originalOutputTransform(parsedValue);
405
+ }
406
+ // Apply formatting if no custom transform was provided and format is specified
407
+ if (!originalOutputTransform && format && parsedValue instanceof Date) {
408
+ return new Date(
409
+ new Intl.DateTimeFormat(undefined, format).format(parsedValue)
410
+ );
411
+ }
412
+
413
+ return parsedValue as Date;
414
+ };
415
+
416
+ // Create a validator for min/max date constraints
417
+ let dateValidator = validator;
418
+ if ((minDate || maxDate) && !dateValidator) {
419
+ dateValidator = (value: Date) => {
420
+ if (!(value instanceof Date)) {
421
+ return 'Value must be a Date object';
422
+ }
423
+
424
+ if (minDate && value < minDate) {
425
+ return `Date must not be earlier than ${minDate.toISOString()}`;
426
+ }
427
+
428
+ if (maxDate && value > maxDate) {
429
+ return `Date must not be later than ${maxDate.toISOString()}`;
430
+ }
431
+
432
+ return null;
433
+ };
434
+ }
435
+ // If there's already a validator and min/max constraints, chain them
436
+ else if (
437
+ (minDate || maxDate) &&
438
+ dateValidator &&
439
+ typeof dateValidator === 'function'
440
+ ) {
441
+ const originalValidator = dateValidator;
442
+ dateValidator = (value: Date) => {
443
+ if (!(value instanceof Date)) {
444
+ return 'Value must be a Date object';
445
+ }
446
+
447
+ // Check min/max constraints
448
+ if (minDate && value < minDate) {
449
+ return `Date must not be earlier than ${minDate.toISOString()}`;
450
+ }
451
+
452
+ if (maxDate && value > maxDate) {
453
+ return `Date must not be later than ${maxDate.toISOString()}`;
454
+ }
455
+
456
+ // Run the original validator
457
+ return originalValidator(value);
458
+ };
459
+ }
460
+
461
+ return createField('date', {
462
+ ...restConfig,
463
+ transform: {
464
+ input: inputTransform,
465
+ output: outputTransform,
466
+ },
467
+ validator: dateValidator,
468
+ });
469
+ }
470
+
471
+ /**
472
+ * Creates a timezone field with the specified configuration.
473
+ * Convenience wrapper around createField with timezone type.
474
+ *
475
+ * @template TConfig - The configuration type for the field
476
+ *
477
+ * @param config - Configuration options for the field
478
+ * @returns A fully configured timezone field definition
479
+ *
480
+ * @example
481
+ * ```typescript
482
+ * // Create a required timezone field with a default value
483
+ * const timezoneField = {
484
+ * timezone: timezoneField({
485
+ * required: true,
486
+ * defaultValue: COMMON_TIMEZONES.UTC
487
+ * })
488
+ * };
489
+ *
490
+ * // Create a timezone field with restricted values
491
+ * const regionTimezone = timezoneField({
492
+ * required: true,
493
+ * suggestedValues: [
494
+ * COMMON_TIMEZONES.EASTERN,
495
+ * COMMON_TIMEZONES.CENTRAL,
496
+ * COMMON_TIMEZONES.MOUNTAIN,
497
+ * COMMON_TIMEZONES.PACIFIC
498
+ * ],
499
+ * restrictToSuggestedValues: true
500
+ * });
501
+ * ```
502
+ *
503
+ * @remarks
504
+ * The timezone field stores timezone identifiers according to the IANA timezone database.
505
+ * It validates timezone strings to ensure they are valid IANA timezone identifiers.
506
+ */
507
+ export function timezoneField<
508
+ TConfig extends Omit<FieldConfig<'timezone'>, 'type' | 'transform'> & {
509
+ transform?: {
510
+ input?: (value: string) => string | Promise<string>;
511
+ output?: (value: unknown) => string | Promise<string>;
512
+ };
513
+ } & TimezoneFieldOptions,
514
+ >(config: TConfig = {} as TConfig): Field<'timezone'> {
515
+ const {
516
+ validateTimezone = true,
517
+ suggestedValues,
518
+ restrictToSuggestedValues = false,
519
+ transform = {},
520
+ ...restConfig
521
+ } = config;
522
+
523
+ // Store the original transform functions
524
+ const originalInputTransform = transform.input;
525
+ const originalOutputTransform = transform.output;
526
+
527
+ // Create a validator for timezone format if validation is enabled
528
+ const validateIANATimezone = (timezone: string): string | null => {
529
+ // If we're restricting to suggested values, check that first
530
+ if (restrictToSuggestedValues && suggestedValues) {
531
+ if (!suggestedValues.includes(timezone)) {
532
+ return `Timezone must be one of the suggested values: ${suggestedValues.join(', ')}`;
533
+ }
534
+ // If it's in the suggested values, we can skip the Intl validation
535
+ return null;
536
+ }
537
+
538
+ try {
539
+ // Use Intl.DateTimeFormat to validate the timezone
540
+ Intl.DateTimeFormat(undefined, { timeZone: timezone });
541
+ return null;
542
+ } catch {
543
+ return 'Invalid timezone identifier. Must be a valid IANA timezone.';
544
+ }
545
+ };
546
+
547
+ // Custom input transform that applies validation if enabled
548
+ const inputTransform = async (value: string): Promise<string> => {
549
+ // First apply the subject's transform if provided
550
+ let transformedValue = value;
551
+ if (originalInputTransform) {
552
+ transformedValue = await originalInputTransform(value);
553
+ }
554
+
555
+ return transformedValue;
556
+ };
557
+
558
+ // Output transform
559
+ const outputTransform = async (value: unknown): Promise<string> => {
560
+ let parsedValue = value;
561
+
562
+ // Then apply the subject's transform if provided
563
+ if (originalOutputTransform && typeof parsedValue === 'string') {
564
+ parsedValue = await originalOutputTransform(parsedValue);
565
+ }
566
+
567
+ return parsedValue as string;
568
+ };
569
+
570
+ // Create the validator function
571
+ const validator = validateTimezone
572
+ ? (value: string) => {
573
+ if (value === null || value === undefined) {
574
+ return null;
575
+ }
576
+ return validateIANATimezone(value);
577
+ }
578
+ : config.validator;
579
+
580
+ return createField('timezone', {
581
+ ...restConfig,
582
+ transform: {
583
+ input: inputTransform,
584
+ output: outputTransform,
585
+ },
586
+ validator,
587
+ });
588
+ }
589
+
590
+ /**
591
+ * Creates a string array field with the specified configuration.
592
+ */
593
+ export function stringArrayField<
594
+ TConfig extends Omit<FieldConfig<'string[]'>, 'type' | 'transform'> & {
595
+ transform?: {
596
+ input?: (value: string[]) => Primitive | Promise<Primitive>;
597
+ output?: (value: unknown) => string[] | Promise<string[]>;
598
+ };
599
+ },
600
+ >(config: TConfig = {} as TConfig): Field<'string[]'> {
601
+ return createField('string[]', config);
602
+ }
603
+
604
+ /**
605
+ * Creates a number array field with the specified configuration.
606
+ */
607
+ export function numberArrayField<
608
+ TConfig extends Omit<FieldConfig<'number[]'>, 'type' | 'transform'> & {
609
+ transform?: {
610
+ input?: (value: number[]) => Primitive | Promise<Primitive>;
611
+ output?: (value: unknown) => number[] | Promise<number[]>;
612
+ };
613
+ },
614
+ >(config: TConfig = {} as TConfig): Field<'number[]'> {
615
+ return createField('number[]', config);
616
+ }
617
+
618
+ /**
619
+ * Creates a JSON field with the specified configuration.
620
+ */
621
+ export function jsonField<
622
+ TConfig extends Omit<FieldConfig<'json'>, 'type' | 'transform'> & {
623
+ transform?: {
624
+ input?: (value: JsonValue) => Primitive | Promise<Primitive>;
625
+ output?: (value: unknown) => JsonValue | Promise<JsonValue>;
626
+ };
627
+ } & JsonFieldOptions,
628
+ >(config: TConfig = {} as TConfig): Field<'json'> {
629
+ const { validateJson = true, transform = {}, ...restConfig } = config;
630
+
631
+ // Store the original transform functions
632
+ const originalInputTransform = transform.input;
633
+ const originalOutputTransform = transform.output;
634
+
635
+ // Create database-aware transform functions
636
+ const inputTransform = async (value: JsonValue): Promise<Primitive> => {
637
+ // First apply the subject's transform if provided
638
+ let transformedValue = value;
639
+ if (originalInputTransform) {
640
+ const result = await originalInputTransform(value);
641
+ if (result === undefined || result === null) {
642
+ throw new Error('Transform returned invalid value');
643
+ }
644
+ transformedValue = result instanceof Date ? result.toISOString() : result;
645
+ }
646
+
647
+ // Then apply database-specific serialization
648
+ if (
649
+ typeof transformedValue !== 'string' &&
650
+ typeof transformedValue !== 'number' &&
651
+ typeof transformedValue !== 'boolean'
652
+ ) {
653
+ throw new Error('Invalid primitive value');
654
+ }
655
+ const isPrimitive = (value: unknown): value is Primitive =>
656
+ typeof value === 'string' ||
657
+ typeof value === 'number' ||
658
+ typeof value === 'boolean';
659
+
660
+ if (!isPrimitive(transformedValue)) {
661
+ throw new Error('Invalid primitive value');
662
+ }
663
+ return transformForDb(transformedValue);
664
+ };
665
+
666
+ const outputTransform = async (value: unknown): Promise<JsonValue> => {
667
+ // First parse from database format
668
+ let parsedValue = parseFromDb(value);
669
+
670
+ // Then apply the subject's transform if provided
671
+ if (
672
+ originalOutputTransform &&
673
+ typeof parsedValue === 'object' &&
674
+ parsedValue !== null
675
+ ) {
676
+ parsedValue = await originalOutputTransform(parsedValue);
677
+ }
678
+
679
+ return parsedValue as JsonValue;
680
+ };
681
+
682
+ let jsonValidator = config.validator;
683
+
684
+ // If validateJson is true and no validator is specified, add JSON validation
685
+ if (validateJson && !jsonValidator) {
686
+ jsonValidator = (value: JsonValue) => {
687
+ try {
688
+ superjson.stringify(value);
689
+ return null;
690
+ } catch (error) {
691
+ return `Invalid JSON structure: ${(error as Error).message}`;
692
+ }
693
+ };
694
+ }
695
+ // If validateJson is true and there's an existing validator, chain them
696
+ else if (validateJson && jsonValidator) {
697
+ const originalValidator = jsonValidator;
698
+ jsonValidator = (value: JsonValue) => {
699
+ try {
700
+ superjson.stringify(value);
701
+ if (typeof originalValidator === 'function') {
702
+ return originalValidator(value);
703
+ }
704
+ return null;
705
+ } catch (error) {
706
+ return `Invalid JSON structure: ${(error as Error).message}`;
707
+ }
708
+ };
709
+ }
710
+
711
+ return createField('json', {
712
+ ...restConfig,
713
+ validator: jsonValidator,
714
+ transform: {
715
+ input: inputTransform,
716
+ output: outputTransform,
717
+ },
718
+ });
719
+ }
720
+
721
+ /**
722
+ * Utility functions for working with dates and timezones.
723
+ * Provides helper methods for common date and timezone operations.
724
+ */
725
+ export const DateTimeUtils = {
726
+ /**
727
+ * Creates a Date object in a specific timezone.
728
+ *
729
+ * @param dateInput - Date object or ISO string to convert
730
+ * @param timezone - Target timezone (IANA timezone identifier)
731
+ * @returns Date object adjusted for the specified timezone
732
+ */
733
+ createDateInTimezone: (dateInput: Date | string, timezone: string): Date => {
734
+ const date =
735
+ typeof dateInput === 'string' ? new Date(dateInput) : new Date(dateInput);
736
+
737
+ // Get the target timezone's current offset from UTC
738
+ const formatter = new Intl.DateTimeFormat('en-US', {
739
+ timeZone: timezone,
740
+ timeZoneName: 'short',
741
+ });
742
+
743
+ // Format the date in the target timezone to get correct representation
744
+ const formattedDate = formatter.format(date);
745
+ return new Date(formattedDate);
746
+ },
747
+
748
+ /**
749
+ * Formats a date according to the specified timezone.
750
+ *
751
+ * @param date - The date to format
752
+ * @param timezone - Target timezone (IANA timezone identifier)
753
+ * @param options - Formatting options for Intl.DateTimeFormat
754
+ * @returns Formatted date string in the specified timezone
755
+ */
756
+ formatInTimezone: (
757
+ date: Date,
758
+ timezone: string,
759
+ options: Intl.DateTimeFormatOptions = {
760
+ year: 'numeric',
761
+ month: 'numeric',
762
+ day: 'numeric',
763
+ hour: 'numeric',
764
+ minute: 'numeric',
765
+ second: 'numeric',
766
+ timeZoneName: 'short',
767
+ }
768
+ ): string => {
769
+ return new Intl.DateTimeFormat('en-US', {
770
+ ...options,
771
+ timeZone: timezone,
772
+ }).format(date);
773
+ },
774
+
775
+ /**
776
+ * Gets the current date in a specific timezone.
777
+ *
778
+ * @param timezone - Target timezone (IANA timezone identifier)
779
+ * @returns Current date adjusted for the specified timezone
780
+ */
781
+ getNowInTimezone: (timezone: string): Date => {
782
+ return DateTimeUtils.createDateInTimezone(new Date(), timezone);
783
+ },
784
+
785
+ /**
786
+ * Calculates the offset in minutes between the local timezone and the specified timezone.
787
+ *
788
+ * @param timezone - Target timezone (IANA timezone identifier)
789
+ * @param date - Optional date to calculate the offset for (defaults to current date)
790
+ * @returns Offset in minutes between local and specified timezone
791
+ */
792
+ getTimezoneOffset: (timezone: string, date: Date = new Date()): number => {
793
+ // Calculate the client's timezone offset in minutes
794
+ const localOffset = date.getTimezoneOffset();
795
+
796
+ // Get the target timezone offset
797
+ const targetDate = new Date(
798
+ date.toLocaleString('en-US', { timeZone: timezone })
799
+ );
800
+ const targetOffset = (date.getTime() - targetDate.getTime()) / 60000;
801
+
802
+ return localOffset - targetOffset;
803
+ },
804
+ };