@c15t/backend 1.0.0 → 1.1.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/.turbo/turbo-build.log +33 -39
  2. package/.turbo/turbo-fmt.log +7 -0
  3. package/.turbo/turbo-test.log +531 -0
  4. package/README.md +19 -7
  5. package/coverage/coverage-final.json +84 -0
  6. package/coverage/coverage-summary.json +85 -0
  7. package/coverage/html/backend/index.html +116 -0
  8. package/coverage/html/backend/rslib.config.ts.html +415 -0
  9. package/coverage/html/backend/src/contracts/consent/index.html +161 -0
  10. package/coverage/html/backend/src/contracts/consent/index.ts.html +112 -0
  11. package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +559 -0
  12. package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +220 -0
  13. package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +463 -0
  14. package/coverage/html/backend/src/contracts/index.html +116 -0
  15. package/coverage/html/backend/src/contracts/index.ts.html +139 -0
  16. package/coverage/html/backend/src/contracts/meta/index.html +131 -0
  17. package/coverage/html/backend/src/contracts/meta/index.ts.html +100 -0
  18. package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +196 -0
  19. package/coverage/html/backend/src/contracts/shared/index.html +116 -0
  20. package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +175 -0
  21. package/coverage/html/backend/src/core.ts.html +1624 -0
  22. package/coverage/html/backend/src/handlers/consent/index.html +161 -0
  23. package/coverage/html/backend/src/handlers/consent/index.ts.html +112 -0
  24. package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +889 -0
  25. package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +535 -0
  26. package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +1000 -0
  27. package/coverage/html/backend/src/handlers/meta/index.html +131 -0
  28. package/coverage/html/backend/src/handlers/meta/index.ts.html +100 -0
  29. package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +226 -0
  30. package/coverage/html/backend/src/index.html +161 -0
  31. package/coverage/html/backend/src/init.ts.html +1018 -0
  32. package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +116 -0
  33. package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +544 -0
  34. package/coverage/html/backend/src/pkgs/api-router/index.html +116 -0
  35. package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +334 -0
  36. package/coverage/html/backend/src/pkgs/api-router/utils/cors.ts.html +304 -0
  37. package/coverage/html/backend/src/pkgs/api-router/utils/index.html +131 -0
  38. package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +361 -0
  39. package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +709 -0
  40. package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +256 -0
  41. package/coverage/html/backend/src/pkgs/data-model/fields/index.html +161 -0
  42. package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +136 -0
  43. package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +496 -0
  44. package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +349 -0
  45. package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +176 -0
  46. package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +358 -0
  47. package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +613 -0
  48. package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +538 -0
  49. package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +289 -0
  50. package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +289 -0
  51. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +2203 -0
  52. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +116 -0
  53. package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +116 -0
  54. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +670 -0
  55. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +131 -0
  56. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +3634 -0
  57. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +116 -0
  58. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +1417 -0
  59. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +116 -0
  60. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +2071 -0
  61. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +116 -0
  62. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +1834 -0
  63. package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +316 -0
  64. package/coverage/html/backend/src/pkgs/db-adapters/index.html +131 -0
  65. package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +238 -0
  66. package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +343 -0
  67. package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +217 -0
  68. package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +146 -0
  69. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +280 -0
  70. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +289 -0
  71. package/coverage/html/backend/src/pkgs/migrations/index.html +176 -0
  72. package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +595 -0
  73. package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +301 -0
  74. package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +694 -0
  75. package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +817 -0
  76. package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +976 -0
  77. package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +703 -0
  78. package/coverage/html/backend/src/pkgs/results/core/index.html +146 -0
  79. package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +280 -0
  80. package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +271 -0
  81. package/coverage/html/backend/src/pkgs/results/index.html +131 -0
  82. package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +496 -0
  83. package/coverage/html/backend/src/pkgs/results/results/index.html +131 -0
  84. package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +628 -0
  85. package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +1234 -0
  86. package/coverage/html/backend/src/pkgs/utils/env.ts.html +337 -0
  87. package/coverage/html/backend/src/pkgs/utils/index.html +146 -0
  88. package/coverage/html/backend/src/pkgs/utils/logger.ts.html +199 -0
  89. package/coverage/html/backend/src/pkgs/utils/url.ts.html +400 -0
  90. package/coverage/html/backend/src/router.ts.html +109 -0
  91. package/coverage/html/backend/src/schema/audit-log/index.html +146 -0
  92. package/coverage/html/backend/src/schema/audit-log/registry.ts.html +436 -0
  93. package/coverage/html/backend/src/schema/audit-log/schema.ts.html +223 -0
  94. package/coverage/html/backend/src/schema/audit-log/table.ts.html +640 -0
  95. package/coverage/html/backend/src/schema/consent/index.html +146 -0
  96. package/coverage/html/backend/src/schema/consent/registry.ts.html +616 -0
  97. package/coverage/html/backend/src/schema/consent/schema.ts.html +238 -0
  98. package/coverage/html/backend/src/schema/consent/table.ts.html +748 -0
  99. package/coverage/html/backend/src/schema/consent-policy/index.html +146 -0
  100. package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +1063 -0
  101. package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +265 -0
  102. package/coverage/html/backend/src/schema/consent-policy/table.ts.html +535 -0
  103. package/coverage/html/backend/src/schema/consent-purpose/index.html +146 -0
  104. package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +589 -0
  105. package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +259 -0
  106. package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +547 -0
  107. package/coverage/html/backend/src/schema/consent-record/index.html +131 -0
  108. package/coverage/html/backend/src/schema/consent-record/schema.ts.html +211 -0
  109. package/coverage/html/backend/src/schema/consent-record/table.ts.html +457 -0
  110. package/coverage/html/backend/src/schema/create-registry.ts.html +148 -0
  111. package/coverage/html/backend/src/schema/definition.ts.html +685 -0
  112. package/coverage/html/backend/src/schema/domain/index.html +146 -0
  113. package/coverage/html/backend/src/schema/domain/registry.ts.html +973 -0
  114. package/coverage/html/backend/src/schema/domain/schema.ts.html +214 -0
  115. package/coverage/html/backend/src/schema/domain/table.ts.html +496 -0
  116. package/coverage/html/backend/src/schema/index.html +146 -0
  117. package/coverage/html/backend/src/schema/schemas.ts.html +166 -0
  118. package/coverage/html/backend/src/schema/subject/index.html +146 -0
  119. package/coverage/html/backend/src/schema/subject/registry.ts.html +973 -0
  120. package/coverage/html/backend/src/schema/subject/schema.ts.html +208 -0
  121. package/coverage/html/backend/src/schema/subject/table.ts.html +499 -0
  122. package/coverage/html/backend/src/server.ts.html +475 -0
  123. package/coverage/html/backend/src/testing/contract-testing.ts.html +1348 -0
  124. package/coverage/html/backend/src/testing/index.html +116 -0
  125. package/coverage/html/base.css +224 -0
  126. package/coverage/html/block-navigation.js +87 -0
  127. package/coverage/html/favicon.png +0 -0
  128. package/coverage/html/index.html +626 -0
  129. package/coverage/html/prettify.css +1 -0
  130. package/coverage/html/prettify.js +2 -0
  131. package/coverage/html/sort-arrow-sprite.png +0 -0
  132. package/coverage/html/sorter.js +196 -0
  133. package/dist/contracts/consent/index.d.ts +401 -0
  134. package/dist/contracts/consent/index.d.ts.map +1 -0
  135. package/dist/contracts/consent/index.test.d.ts +2 -0
  136. package/dist/contracts/consent/index.test.d.ts.map +1 -0
  137. package/dist/contracts/consent/post.contract.d.ts +212 -0
  138. package/dist/contracts/consent/post.contract.d.ts.map +1 -0
  139. package/dist/contracts/consent/post.contract.test.d.ts +2 -0
  140. package/dist/contracts/consent/post.contract.test.d.ts.map +1 -0
  141. package/dist/contracts/consent/show-banner.contract.d.ts +45 -0
  142. package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -0
  143. package/dist/contracts/consent/show-banner.contract.test.d.ts +2 -0
  144. package/dist/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
  145. package/dist/contracts/consent/verify.contract.d.ts +147 -0
  146. package/dist/contracts/consent/verify.contract.d.ts.map +1 -0
  147. package/dist/contracts/consent/verify.contract.test.d.ts +2 -0
  148. package/dist/contracts/consent/verify.contract.test.d.ts.map +1 -0
  149. package/dist/contracts/index.d.ts +963 -0
  150. package/dist/contracts/index.d.ts.map +1 -0
  151. package/dist/contracts/meta/index.d.ts +78 -0
  152. package/dist/contracts/meta/index.d.ts.map +1 -0
  153. package/dist/contracts/meta/index.test.d.ts +2 -0
  154. package/dist/contracts/meta/index.test.d.ts.map +1 -0
  155. package/dist/contracts/meta/status.contract.d.ts +77 -0
  156. package/dist/contracts/meta/status.contract.d.ts.map +1 -0
  157. package/dist/contracts/meta/status.contract.test.d.ts +2 -0
  158. package/dist/contracts/meta/status.contract.test.d.ts.map +1 -0
  159. package/dist/contracts/shared/jurisdiction.schema.d.ts +24 -0
  160. package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
  161. package/dist/core.cjs +3584 -0
  162. package/dist/core.d.ts +533 -78
  163. package/dist/core.d.ts.map +1 -1
  164. package/dist/{index.js → core.js} +1164 -1292
  165. package/dist/handlers/consent/index.d.ts +401 -0
  166. package/dist/handlers/consent/index.d.ts.map +1 -0
  167. package/dist/handlers/consent/post.handler.d.ts +234 -0
  168. package/dist/handlers/consent/post.handler.d.ts.map +1 -0
  169. package/dist/handlers/consent/show-banner.handler.d.ts +57 -0
  170. package/dist/handlers/consent/show-banner.handler.d.ts.map +1 -0
  171. package/dist/handlers/consent/show-banner.handler.test.d.ts +2 -0
  172. package/dist/handlers/consent/show-banner.handler.test.d.ts.map +1 -0
  173. package/dist/handlers/consent/verify.handler.d.ts +169 -0
  174. package/dist/handlers/consent/verify.handler.d.ts.map +1 -0
  175. package/dist/handlers/meta/index.d.ts +78 -0
  176. package/dist/handlers/meta/index.d.ts.map +1 -0
  177. package/dist/handlers/meta/status.handler.d.ts +76 -0
  178. package/dist/handlers/meta/status.handler.d.ts.map +1 -0
  179. package/dist/init.d.ts +0 -1
  180. package/dist/init.d.ts.map +1 -1
  181. package/dist/pkgs/api-router/hooks/processor.d.ts.map +1 -1
  182. package/dist/pkgs/api-router/types/router-props.d.ts +1 -1
  183. package/dist/pkgs/api-router/types/router-props.d.ts.map +1 -1
  184. package/dist/pkgs/api-router/utils/cors.d.ts +1 -1
  185. package/dist/pkgs/api-router/utils/cors.d.ts.map +1 -1
  186. package/dist/pkgs/data-model/fields/field-types.d.ts +1 -1
  187. package/dist/pkgs/data-model/fields/zod-fields.d.ts +32 -32
  188. package/dist/pkgs/data-model/index.cjs +1433 -1799
  189. package/dist/pkgs/data-model/index.js +20 -385
  190. package/dist/pkgs/data-model/schema/index.cjs +1402 -1768
  191. package/dist/pkgs/data-model/schema/index.js +20 -385
  192. package/dist/pkgs/db-adapters/adapter-factory.d.ts +2 -2
  193. package/dist/pkgs/db-adapters/adapter-factory.d.ts.map +1 -1
  194. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +4 -7
  195. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -1
  196. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +19 -151
  197. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +19 -151
  198. package/dist/pkgs/db-adapters/adapters/kysely-adapter/dialect.d.ts +1 -3
  199. package/dist/pkgs/db-adapters/adapters/kysely-adapter/dialect.d.ts.map +1 -1
  200. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +17 -149
  201. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +17 -149
  202. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts +0 -1
  203. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -1
  204. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +2 -2
  205. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
  206. package/dist/pkgs/db-adapters/adapters/kysely-adapter/types.d.ts +0 -2
  207. package/dist/pkgs/db-adapters/adapters/kysely-adapter/types.d.ts.map +1 -1
  208. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +17 -149
  209. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +17 -149
  210. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts +0 -1
  211. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts.map +1 -1
  212. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +19 -151
  213. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +19 -151
  214. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts +0 -1
  215. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -1
  216. package/dist/pkgs/db-adapters/index.cjs +31 -153
  217. package/dist/pkgs/db-adapters/index.js +31 -153
  218. package/dist/pkgs/migrations/get-schema/get-schema.d.ts +2 -2
  219. package/dist/pkgs/migrations/get-schema/index.d.ts +1 -1
  220. package/dist/pkgs/migrations/index.cjs +30 -153
  221. package/dist/pkgs/migrations/index.js +30 -153
  222. package/dist/pkgs/migrations/schema-comparison.d.ts.map +1 -1
  223. package/dist/pkgs/results/core/error-class.d.ts +23 -21
  224. package/dist/pkgs/results/core/error-class.d.ts.map +1 -1
  225. package/dist/pkgs/results/index.cjs +17 -150
  226. package/dist/pkgs/results/index.d.ts +0 -3
  227. package/dist/pkgs/results/index.d.ts.map +1 -1
  228. package/dist/pkgs/results/index.js +17 -138
  229. package/dist/pkgs/results/orpc-error-handler.d.ts +65 -0
  230. package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -0
  231. package/dist/pkgs/results/types.d.ts +7 -7
  232. package/dist/pkgs/results/types.d.ts.map +1 -1
  233. package/dist/pkgs/types/context.d.ts +15 -8
  234. package/dist/pkgs/types/context.d.ts.map +1 -1
  235. package/dist/pkgs/types/endpoints.d.ts +3 -4
  236. package/dist/pkgs/types/endpoints.d.ts.map +1 -1
  237. package/dist/pkgs/types/options.d.ts +2 -4
  238. package/dist/pkgs/types/options.d.ts.map +1 -1
  239. package/dist/pkgs/types/plugins.d.ts +2 -3
  240. package/dist/pkgs/types/plugins.d.ts.map +1 -1
  241. package/dist/pkgs/utils/index.d.ts +1 -0
  242. package/dist/pkgs/utils/index.d.ts.map +1 -1
  243. package/dist/pkgs/utils/logger.d.ts +16 -0
  244. package/dist/pkgs/utils/logger.d.ts.map +1 -0
  245. package/dist/router.cjs +1213 -0
  246. package/dist/router.d.ts +480 -0
  247. package/dist/router.d.ts.map +1 -0
  248. package/dist/router.js +1169 -0
  249. package/dist/schema/audit-log/table.d.ts +1 -1
  250. package/dist/schema/consent/table.d.ts +1 -1
  251. package/dist/schema/consent-policy/registry.d.ts +12 -12
  252. package/dist/schema/consent-policy/schema.d.ts +6 -6
  253. package/dist/schema/consent-policy/table.d.ts +7 -7
  254. package/dist/schema/consent-purpose/registry.d.ts +6 -6
  255. package/dist/schema/consent-purpose/schema.d.ts +6 -6
  256. package/dist/schema/consent-purpose/table.d.ts +7 -7
  257. package/dist/schema/consent-record/table.d.ts +1 -1
  258. package/dist/schema/create-registry.d.ts +32 -32
  259. package/dist/schema/definition.d.ts +19 -19
  260. package/dist/schema/domain/registry.d.ts +10 -10
  261. package/dist/schema/domain/schema.d.ts +5 -5
  262. package/dist/schema/domain/table.d.ts +6 -6
  263. package/dist/schema/index.cjs +1409 -1775
  264. package/dist/schema/index.js +20 -385
  265. package/dist/schema/schemas.d.ts +19 -19
  266. package/dist/schema/subject/registry.d.ts +4 -4
  267. package/dist/schema/subject/schema.d.ts +2 -2
  268. package/dist/schema/subject/table.d.ts +3 -3
  269. package/dist/server.d.ts +2 -0
  270. package/dist/server.d.ts.map +1 -0
  271. package/dist/testing/contract-testing.d.ts +37 -0
  272. package/dist/testing/contract-testing.d.ts.map +1 -0
  273. package/dist/types/context.d.ts +1 -1
  274. package/dist/types/index.d.ts +2 -2
  275. package/dist/types/options.d.ts +33 -3
  276. package/dist/types/options.d.ts.map +1 -1
  277. package/dist/types/plugins.d.ts +3 -4
  278. package/dist/types/plugins.d.ts.map +1 -1
  279. package/package.json +20 -28
  280. package/rslib.config.ts +2 -5
  281. package/src/contracts/consent/index.test.ts +5 -0
  282. package/src/contracts/consent/index.ts +9 -0
  283. package/src/contracts/consent/post.contract.test.ts +526 -0
  284. package/src/contracts/consent/post.contract.ts +160 -0
  285. package/src/contracts/consent/show-banner.contract.test.ts +214 -0
  286. package/src/contracts/consent/show-banner.contract.ts +45 -0
  287. package/src/contracts/consent/verify.contract.test.ts +185 -0
  288. package/src/contracts/consent/verify.contract.ts +126 -0
  289. package/src/contracts/index.ts +18 -0
  290. package/src/contracts/meta/index.test.ts +5 -0
  291. package/src/contracts/meta/index.ts +5 -0
  292. package/src/contracts/meta/status.contract.test.ts +338 -0
  293. package/src/contracts/meta/status.contract.ts +37 -0
  294. package/src/contracts/shared/jurisdiction.schema.ts +30 -0
  295. package/src/core.ts +451 -161
  296. package/src/handlers/consent/index.ts +9 -0
  297. package/src/handlers/consent/post.handler.ts +273 -0
  298. package/src/handlers/consent/show-banner.handler.test.ts +148 -0
  299. package/src/handlers/consent/show-banner.handler.ts +150 -0
  300. package/src/handlers/consent/verify.handler.ts +305 -0
  301. package/src/handlers/meta/index.ts +5 -0
  302. package/src/handlers/meta/status.handler.ts +47 -0
  303. package/src/init.ts +8 -26
  304. package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +6 -0
  305. package/src/pkgs/api-router/hooks/processor.ts +2 -0
  306. package/src/pkgs/api-router/types/router-props.ts +1 -1
  307. package/src/pkgs/api-router/utils/cors.ts +1 -1
  308. package/src/pkgs/data-model/fields/field-types.ts +1 -1
  309. package/src/pkgs/data-model/fields/id-generator.ts +1 -1
  310. package/src/pkgs/db-adapters/README.md +3 -3
  311. package/src/pkgs/db-adapters/adapter-factory.ts +8 -4
  312. package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +13 -16
  313. package/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts +1 -3
  314. package/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts +0 -1
  315. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +1 -1
  316. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +1 -1
  317. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +2 -2
  318. package/src/pkgs/db-adapters/adapters/kysely-adapter/types.ts +0 -2
  319. package/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts +0 -1
  320. package/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts +0 -1
  321. package/src/pkgs/migrations/get-migration.ts +3 -3
  322. package/src/pkgs/migrations/get-schema/get-schema.ts +2 -2
  323. package/src/pkgs/migrations/get-schema/index.ts +1 -1
  324. package/src/pkgs/migrations/migration-builders.ts +2 -2
  325. package/src/pkgs/migrations/migration-execution.ts +2 -2
  326. package/src/pkgs/migrations/schema-comparison.ts +5 -4
  327. package/src/pkgs/results/__tests__/error-class.test.ts +8 -7
  328. package/src/pkgs/results/core/error-class.ts +31 -43
  329. package/src/pkgs/results/index.ts +0 -10
  330. package/src/pkgs/results/orpc-error-handler.ts +137 -0
  331. package/src/pkgs/results/types.ts +8 -7
  332. package/src/pkgs/types/context.ts +18 -9
  333. package/src/pkgs/types/endpoints.ts +3 -5
  334. package/src/pkgs/types/options.ts +2 -4
  335. package/src/pkgs/types/plugins.ts +2 -3
  336. package/src/pkgs/utils/index.ts +1 -0
  337. package/src/pkgs/utils/logger.ts +38 -0
  338. package/src/router.ts +8 -0
  339. package/src/schema/audit-log/table.ts +1 -1
  340. package/src/schema/consent/table.ts +1 -1
  341. package/src/schema/consent-policy/table.ts +1 -1
  342. package/src/schema/consent-purpose/table.ts +1 -1
  343. package/src/schema/consent-record/table.ts +1 -1
  344. package/src/schema/definition.ts +2 -2
  345. package/src/schema/domain/table.ts +1 -1
  346. package/src/schema/subject/table.ts +1 -1
  347. package/src/server.ts +130 -0
  348. package/src/testing/contract-testing.ts +437 -0
  349. package/src/types/context.ts +1 -1
  350. package/src/types/index.ts +2 -2
  351. package/src/types/options.ts +38 -3
  352. package/src/types/plugins.ts +3 -4
  353. package/dist/index.cjs +0 -3706
  354. package/dist/index.d.ts +0 -11
  355. package/dist/index.d.ts.map +0 -1
  356. package/dist/init.test.d.ts +0 -2
  357. package/dist/init.test.d.ts.map +0 -1
  358. package/dist/integrations/cloudflare.cjs +0 -312
  359. package/dist/integrations/cloudflare.d.ts +0 -32
  360. package/dist/integrations/cloudflare.d.ts.map +0 -1
  361. package/dist/integrations/cloudflare.js +0 -278
  362. package/dist/integrations/next.cjs +0 -276
  363. package/dist/integrations/next.d.ts +0 -68
  364. package/dist/integrations/next.d.ts.map +0 -1
  365. package/dist/integrations/next.js +0 -239
  366. package/dist/integrations/node.cjs +0 -257
  367. package/dist/integrations/node.d.ts +0 -29
  368. package/dist/integrations/node.d.ts.map +0 -1
  369. package/dist/integrations/node.js +0 -223
  370. package/dist/pkgs/api-router/index.d.ts +0 -9
  371. package/dist/pkgs/api-router/index.d.ts.map +0 -1
  372. package/dist/pkgs/api-router/utils/define-route.d.ts +0 -87
  373. package/dist/pkgs/api-router/utils/define-route.d.ts.map +0 -1
  374. package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts +0 -2
  375. package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts.map +0 -1
  376. package/dist/pkgs/logger/__tests__/integration.test.d.ts +0 -2
  377. package/dist/pkgs/logger/__tests__/integration.test.d.ts.map +0 -1
  378. package/dist/pkgs/logger/__tests__/log-levels.test.d.ts +0 -2
  379. package/dist/pkgs/logger/__tests__/log-levels.test.d.ts.map +0 -1
  380. package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts +0 -2
  381. package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts.map +0 -1
  382. package/dist/pkgs/logger/__tests__/result-logging.test.d.ts +0 -2
  383. package/dist/pkgs/logger/__tests__/result-logging.test.d.ts.map +0 -1
  384. package/dist/pkgs/logger/__tests__/types.test.d.ts +0 -2
  385. package/dist/pkgs/logger/__tests__/types.test.d.ts.map +0 -1
  386. package/dist/pkgs/logger/console-formatter.d.ts +0 -56
  387. package/dist/pkgs/logger/console-formatter.d.ts.map +0 -1
  388. package/dist/pkgs/logger/index.cjs +0 -240
  389. package/dist/pkgs/logger/index.d.ts +0 -35
  390. package/dist/pkgs/logger/index.d.ts.map +0 -1
  391. package/dist/pkgs/logger/index.js +0 -185
  392. package/dist/pkgs/logger/log-levels.d.ts +0 -29
  393. package/dist/pkgs/logger/log-levels.d.ts.map +0 -1
  394. package/dist/pkgs/logger/logger-factory.d.ts +0 -42
  395. package/dist/pkgs/logger/logger-factory.d.ts.map +0 -1
  396. package/dist/pkgs/logger/result-logging.d.ts +0 -71
  397. package/dist/pkgs/logger/result-logging.d.ts.map +0 -1
  398. package/dist/pkgs/logger/telemetry.d.ts +0 -14
  399. package/dist/pkgs/logger/telemetry.d.ts.map +0 -1
  400. package/dist/pkgs/logger/types.d.ts +0 -121
  401. package/dist/pkgs/logger/types.d.ts.map +0 -1
  402. package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts +0 -2
  403. package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts.map +0 -1
  404. package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts +0 -2
  405. package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts.map +0 -1
  406. package/dist/pkgs/results/h3-integration.d.ts +0 -52
  407. package/dist/pkgs/results/h3-integration.d.ts.map +0 -1
  408. package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts +0 -101
  409. package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts.map +0 -1
  410. package/dist/pkgs/results/pipeline/validation-pipeline.d.ts +0 -89
  411. package/dist/pkgs/results/pipeline/validation-pipeline.d.ts.map +0 -1
  412. package/dist/response-types.d.ts +0 -19
  413. package/dist/response-types.d.ts.map +0 -1
  414. package/dist/routes/__test__/index.test.d.ts +0 -17
  415. package/dist/routes/__test__/index.test.d.ts.map +0 -1
  416. package/dist/routes/__test__/set-consent.test.d.ts +0 -2
  417. package/dist/routes/__test__/set-consent.test.d.ts.map +0 -1
  418. package/dist/routes/__test__/show-consent-banner.test.d.ts +0 -2
  419. package/dist/routes/__test__/show-consent-banner.test.d.ts.map +0 -1
  420. package/dist/routes/__test__/status.test.d.ts +0 -2
  421. package/dist/routes/__test__/status.test.d.ts.map +0 -1
  422. package/dist/routes/__test__/verify-consent.test.d.ts +0 -2
  423. package/dist/routes/__test__/verify-consent.test.d.ts.map +0 -1
  424. package/dist/routes/index.d.ts +0 -3
  425. package/dist/routes/index.d.ts.map +0 -1
  426. package/dist/routes/set-consent.d.ts +0 -89
  427. package/dist/routes/set-consent.d.ts.map +0 -1
  428. package/dist/routes/show-consent-banner.d.ts +0 -15
  429. package/dist/routes/show-consent-banner.d.ts.map +0 -1
  430. package/dist/routes/status.d.ts +0 -44
  431. package/dist/routes/status.d.ts.map +0 -1
  432. package/dist/routes/types.d.ts +0 -7
  433. package/dist/routes/types.d.ts.map +0 -1
  434. package/dist/routes/verify-consent.d.ts +0 -38
  435. package/dist/routes/verify-consent.d.ts.map +0 -1
  436. package/src/docs/ADVANCED_JSON_HANDLING.md +0 -99
  437. package/src/docs/neverthrow.md +0 -171
  438. package/src/index.ts +0 -34
  439. package/src/init.test.ts +0 -236
  440. package/src/integrations/cloudflare.ts +0 -269
  441. package/src/integrations/next.ts +0 -204
  442. package/src/integrations/node.ts +0 -141
  443. package/src/pkgs/api-router/index.ts +0 -148
  444. package/src/pkgs/api-router/types/h3.d.ts +0 -42
  445. package/src/pkgs/api-router/utils/define-route.ts +0 -410
  446. package/src/pkgs/logger/README.md +0 -213
  447. package/src/pkgs/logger/__tests__/console-formatter.test.ts +0 -67
  448. package/src/pkgs/logger/__tests__/integration.test.ts +0 -184
  449. package/src/pkgs/logger/__tests__/log-levels.test.ts +0 -77
  450. package/src/pkgs/logger/__tests__/logger-factory.test.ts +0 -156
  451. package/src/pkgs/logger/__tests__/result-logging.test.ts +0 -209
  452. package/src/pkgs/logger/__tests__/types.test.ts +0 -94
  453. package/src/pkgs/logger/console-formatter.ts +0 -75
  454. package/src/pkgs/logger/doc.md +0 -569
  455. package/src/pkgs/logger/index.ts +0 -59
  456. package/src/pkgs/logger/log-levels.ts +0 -46
  457. package/src/pkgs/logger/logger-factory.ts +0 -121
  458. package/src/pkgs/logger/result-logging.ts +0 -134
  459. package/src/pkgs/logger/telemetry.ts +0 -96
  460. package/src/pkgs/logger/types.ts +0 -138
  461. package/src/pkgs/results/__tests__/retrieval-pipeline.test.ts +0 -157
  462. package/src/pkgs/results/__tests__/validation-pipeline.test.ts +0 -151
  463. package/src/pkgs/results/h3-integration.ts +0 -142
  464. package/src/pkgs/results/pipeline/retrieval-pipeline.ts +0 -188
  465. package/src/pkgs/results/pipeline/validation-pipeline.ts +0 -164
  466. package/src/plugins/.keep +0 -0
  467. package/src/response-types.ts +0 -29
  468. package/src/routes/__test__/index.test.ts +0 -112
  469. package/src/routes/__test__/set-consent.test.ts +0 -242
  470. package/src/routes/__test__/show-consent-banner.test.ts +0 -98
  471. package/src/routes/__test__/status.test.ts +0 -64
  472. package/src/routes/__test__/verify-consent.test.ts +0 -266
  473. package/src/routes/index.ts +0 -12
  474. package/src/routes/set-consent.ts +0 -249
  475. package/src/routes/show-consent-banner.ts +0 -131
  476. package/src/routes/status.ts +0 -61
  477. package/src/routes/types.ts +0 -7
  478. package/src/routes/verify-consent.ts +0 -206
@@ -1,148 +0,0 @@
1
- import {
2
- createApp,
3
- createRouter,
4
- eventHandler,
5
- handleCors,
6
- sendStream,
7
- toWebHandler,
8
- } from 'h3';
9
- import { routes } from '~/routes';
10
- import { withRequestSpan } from './telemetry';
11
- import type { RouterProps } from './types/router-props';
12
- import { isOriginTrusted } from './utils/cors';
13
-
14
- import type { Readable } from 'node:stream';
15
- import { getIp } from './utils/ip';
16
-
17
- import { createH3ErrorHandler, withH3ErrorHandling } from '../results';
18
- export { defineRoute } from './utils/define-route';
19
-
20
- /**
21
- * Creates an API handler with proper context and CORS handling
22
- */
23
- export function createApiHandler({ options, context }: RouterProps) {
24
- // Use the logger from context instead of creating a new one
25
- const { logger } = context;
26
- logger.info('Creating API Handler');
27
-
28
- // Create an app instance
29
- const app = createApp({
30
- onRequest(event) {
31
- // Set up event context with required properties
32
- event.context.ipAddress = getIp(event.headers, options);
33
- event.context.userAgent = event.node.req.headers['user-agent'] || null;
34
- event.context.registry = context.registry;
35
- event.context.adapter = context.adapter;
36
- event.context.trustedOrigins = context.trustedOrigins;
37
- event.context.logger = logger; // Make the logger available in the event context
38
- logger.debug(`Request received: ${event.method} ${event.path}`);
39
- },
40
- onError(error, event) {
41
- // Use our custom error handler if available
42
- if (
43
- event.context._onError &&
44
- typeof event.context._onError === 'function'
45
- ) {
46
- return event.context._onError(error);
47
- }
48
-
49
- // Default error handling as fallback
50
- logger.error(`Unhandled API error in ${event.method} ${event.path}`, {
51
- error: error instanceof Error ? error.message : String(error),
52
- errorType:
53
- error instanceof Error ? error.constructor.name : typeof error,
54
- });
55
- },
56
- });
57
-
58
- // Add error handler middleware first
59
- app.use(createH3ErrorHandler());
60
- logger.debug('Added error handler middleware');
61
-
62
- // Create CORS handler using h3's built-in handleCors
63
- app.use(
64
- eventHandler((event) => {
65
- if (
66
- handleCors(event, {
67
- origin: (originStr: string) => {
68
- return isOriginTrusted(
69
- originStr,
70
- event.context.trustedOrigins,
71
- logger
72
- );
73
- },
74
- methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
75
- allowHeaders: ['Content-Type', 'Authorization'],
76
- credentials: true,
77
- maxAge: '600',
78
- })
79
- ) {
80
- logger.debug('CORS preflight response sent');
81
- return;
82
- }
83
- })
84
- );
85
-
86
- // Create a new router and register it with the app
87
- const router = createRouter();
88
- app.use(router);
89
- logger.debug('Router initialized and registered with app');
90
-
91
- // Initialize routes with tracing
92
- for (const route of routes) {
93
- logger.debug(`Registering route: ${route.method} ${route.path}`);
94
- router[route.method](
95
- route.path,
96
- // Wrap with our error handling middleware
97
- withH3ErrorHandling(
98
- eventHandler(async (event) => {
99
- logger.debug(`Handling request: ${route.method} ${route.path}`);
100
- try {
101
- // Execute the handler with tracing
102
- logger.debug(`Executing handler for ${route.path}`);
103
- const result = await withRequestSpan(
104
- event.method.toUpperCase(),
105
- route.path,
106
- () => route.handler(event),
107
- options
108
- );
109
-
110
- logger.debug(`Handler completed for ${route.path}`);
111
-
112
- // Set proper content type header based on response type
113
- if (
114
- typeof result === 'object' &&
115
- result !== null &&
116
- 'pipe' in result &&
117
- typeof result.pipe === 'function'
118
- ) {
119
- // For streams, use appropriate stream handling
120
- logger.debug(`Sending stream response for ${route.path}`);
121
- return sendStream(event, result as Readable);
122
- }
123
-
124
- // For all other responses, use JSON
125
- event.node.res.setHeader('Content-Type', 'application/json');
126
-
127
- // Let H3 handle the serialization natively
128
- // The defineRoute handler already ensures proper object wrapping
129
- return result;
130
- } catch (error) {
131
- logger.error(`Error in route handler for ${route.path}`, {
132
- error: error instanceof Error ? error.message : String(error),
133
- errorType:
134
- error instanceof Error ? error.constructor.name : typeof error,
135
- });
136
- throw error; // Let error handler middleware handle it
137
- }
138
- })
139
- )
140
- );
141
- }
142
-
143
- // Convert to web handler
144
- const handler = toWebHandler(app);
145
- logger.info('API handler created successfully');
146
-
147
- return { handler };
148
- }
@@ -1,42 +0,0 @@
1
- /**
2
- * Type declarations for H3 framework extensions
3
- */
4
-
5
- import type { Adapter } from '~/pkgs/db-adapters/types';
6
- import type { Logger } from '~/pkgs/logger';
7
- import type { createRegistry } from '~/schema/create-registry';
8
-
9
- declare module 'h3' {
10
- interface H3EventContext {
11
- /**
12
- * The IP address of the client making the request
13
- * Can be null if IP tracking is disabled or IP cannot be determined
14
- */
15
- ipAddress: string | null;
16
-
17
- /**
18
- * The user agent string from the client's browser
19
- */
20
- userAgent: string | null;
21
-
22
- /**
23
- * The registry of database operations
24
- */
25
- registry: ReturnType<typeof createRegistry>;
26
-
27
- /**
28
- * The database adapter
29
- */
30
- adapter: Adapter;
31
-
32
- /**
33
- * The trusted origins for CORS
34
- */
35
- trustedOrigins: string[];
36
-
37
- /**
38
- * The logger
39
- */
40
- logger: Logger;
41
- }
42
- }
@@ -1,410 +0,0 @@
1
- import type { H3Event, H3EventContext, RouterMethod } from 'h3';
2
- import {
3
- defineEventHandler,
4
- getQuery as h3GetQuery,
5
- getRouterParams as h3GetRouterParams,
6
- readBody,
7
- readFormData,
8
- } from 'h3';
9
- import type { ZodType, z } from 'zod';
10
- import { createLogger } from '~/pkgs/logger';
11
- import {
12
- DoubleTieError,
13
- ERROR_CODES,
14
- validationPipeline,
15
- } from '~/pkgs/results';
16
- import type { Route } from '~/routes/types';
17
- import type {
18
- Endpoint,
19
- EndpointHandler,
20
- EndpointOptions,
21
- } from '../../types/endpoints';
22
-
23
- // Define more precise types for validation data
24
- type ValidatedData<
25
- TBody extends ZodType | undefined,
26
- TQuery extends ZodType | undefined,
27
- TParams extends ZodType | undefined,
28
- > = {
29
- body: TBody extends ZodType ? z.infer<TBody> : undefined;
30
- query: TQuery extends ZodType ? z.infer<TQuery> : undefined;
31
- params: TParams extends ZodType ? z.infer<TParams> : undefined;
32
- };
33
-
34
- type ValidatedContext<
35
- TBody extends ZodType | undefined,
36
- TQuery extends ZodType | undefined,
37
- TParams extends ZodType | undefined,
38
- > = H3EventContext & {
39
- validated: ValidatedData<TBody, TQuery, TParams>;
40
- };
41
-
42
- type ValidatedEvent<
43
- TBody extends ZodType | undefined,
44
- TQuery extends ZodType | undefined,
45
- TParams extends ZodType | undefined,
46
- > = Omit<H3Event, 'context'> & {
47
- context: ValidatedContext<TBody, TQuery, TParams>;
48
- };
49
-
50
- /**
51
- * Defines a type-safe API route with validation and proper error handling
52
- *
53
- * This utility function creates a complete API route definition with:
54
- * - Path and method definition
55
- * - Request validation (body, query params, path params)
56
- * - Consistent error handling
57
- * - Type-safe response handling
58
- *
59
- * @param config - Configuration for the route including path, method, validations and handler
60
- * @returns A Route object that can be used in the router
61
- *
62
- * @example
63
- * ```ts
64
- * // Define a route with validation and type-safe response
65
- * export const createUser = defineRoute<UserResponse, UserSchema>({
66
- * path: '/users',
67
- * method: 'post',
68
- * validations: {
69
- * body: UserSchema,
70
- * },
71
- * handler: async (event) => {
72
- * const { body } = event.context.validated;
73
- * // Implementation...
74
- * return { id: newUser.id, name: body.name, email: body.email };
75
- * }
76
- * });
77
- * ```
78
- */
79
- export function defineRoute<
80
- TResponse,
81
- TBodySchema extends ZodType = never,
82
- TQuerySchema extends ZodType = never,
83
- TParamsSchema extends ZodType = never,
84
- >(config: {
85
- path: string;
86
- method: RouterMethod;
87
- validations?: {
88
- body?: TBodySchema;
89
- query?: TQuerySchema;
90
- params?: TParamsSchema;
91
- };
92
- handler: (
93
- event: ValidatedEvent<
94
- TBodySchema extends never ? undefined : TBodySchema,
95
- TQuerySchema extends never ? undefined : TQuerySchema,
96
- TParamsSchema extends never ? undefined : TParamsSchema
97
- >
98
- ) => Promise<TResponse>;
99
- }): Route & { responseType: TResponse };
100
-
101
- /**
102
- * Creates a simple endpoint with optional middleware
103
- *
104
- * @param path - The path for this endpoint
105
- * @param handler - Handler function for the endpoint
106
- * @param options - Optional configuration options
107
- * @returns An Endpoint object
108
- */
109
- export function defineRoute(
110
- path: string,
111
- handler: EndpointHandler,
112
- options?: EndpointOptions
113
- ): Endpoint;
114
-
115
- // Implementation
116
- export function defineRoute<
117
- TResponse = unknown,
118
- TBodySchema extends ZodType = never,
119
- TQuerySchema extends ZodType = never,
120
- TParamsSchema extends ZodType = never,
121
- >(
122
- pathOrConfig:
123
- | string
124
- | {
125
- path: string;
126
- method: RouterMethod;
127
- validations?: {
128
- body?: TBodySchema;
129
- query?: TQuerySchema;
130
- params?: TParamsSchema;
131
- };
132
- handler: (
133
- event: ValidatedEvent<
134
- TBodySchema extends never ? undefined : TBodySchema,
135
- TQuerySchema extends never ? undefined : TQuerySchema,
136
- TParamsSchema extends never ? undefined : TParamsSchema
137
- >
138
- ) => Promise<TResponse>;
139
- },
140
- handlerOrUndefined?: EndpointHandler,
141
- options?: EndpointOptions
142
- ): (Route & { responseType: TResponse }) | Endpoint {
143
- // Simple endpoint case
144
- if (typeof pathOrConfig === 'string' && handlerOrUndefined) {
145
- // Create an endpoint directly with H3 patterns - log will happen in the handler
146
- return {
147
- path: pathOrConfig,
148
- handler: handlerOrUndefined,
149
- options,
150
- };
151
- }
152
-
153
- // Full route definition case
154
- const config = pathOrConfig as {
155
- path: string;
156
- method: RouterMethod;
157
- validations?: {
158
- body?: TBodySchema;
159
- query?: TQuerySchema;
160
- params?: TParamsSchema;
161
- };
162
- handler: (
163
- event: ValidatedEvent<
164
- TBodySchema extends never ? undefined : TBodySchema,
165
- TQuerySchema extends never ? undefined : TQuerySchema,
166
- TParamsSchema extends never ? undefined : TParamsSchema
167
- >
168
- ) => Promise<TResponse>;
169
- };
170
-
171
- // We'll log the route definition when the handler is first used
172
- const handler = defineEventHandler(async (event) => {
173
- // Get the logger from the event context or create one if needed
174
- const logger = event.context.logger || createLogger();
175
- logger.debug(`Handling request for ${config.method} ${config.path}`);
176
-
177
- // Ensure the logger is always in the context for handlers to use
178
- if (!event.context.logger) {
179
- event.context.logger = logger;
180
- }
181
-
182
- const validated = {
183
- body: undefined,
184
- query: undefined,
185
- params: undefined,
186
- } as ValidatedData<
187
- TBodySchema extends never ? undefined : TBodySchema,
188
- TQuerySchema extends never ? undefined : TQuerySchema,
189
- TParamsSchema extends never ? undefined : TParamsSchema
190
- >;
191
-
192
- try {
193
- // Validate body if schema provided
194
- if (config.validations?.body) {
195
- const contentType = event.headers.get('content-type');
196
- const body = contentType?.includes('multipart/form-data')
197
- ? Object.fromEntries(await readFormData(event))
198
- : await readBody(event);
199
-
200
- logger.debug('Validating request body', { body });
201
- const validateBody = validationPipeline(
202
- config.validations.body,
203
- (data) => data
204
- );
205
- const result = await validateBody(body);
206
- result.match(
207
- (data) => {
208
- validated.body = data;
209
- },
210
- (error) => {
211
- logger.error('Validation error (body)', { error });
212
- throw new DoubleTieError('Body validation failed', {
213
- code: ERROR_CODES.BAD_REQUEST,
214
- status: 422,
215
- cause: error instanceof Error ? error : undefined,
216
- meta: {
217
- validationErrors: error,
218
- requestPath: config.path,
219
- requestMethod: config.method,
220
- },
221
- });
222
- }
223
- );
224
- }
225
-
226
- // Validate query if schema provided
227
- if (config.validations?.query) {
228
- const query = getQuery(event);
229
- logger.debug('Validating query parameters', { query });
230
- const validateQuery = validationPipeline(
231
- config.validations.query,
232
- (data) => data
233
- );
234
- const result = await validateQuery(query);
235
- result.match(
236
- (data) => {
237
- validated.query = data;
238
- },
239
- (error) => {
240
- logger.error('Query validation failed', { error });
241
- throw new DoubleTieError('Query validation failed', {
242
- code: ERROR_CODES.BAD_REQUEST,
243
- status: 422,
244
- cause: error instanceof Error ? error : undefined,
245
- meta: {
246
- validationErrors: error,
247
- requestPath: config.path,
248
- requestMethod: config.method,
249
- },
250
- });
251
- }
252
- );
253
- }
254
-
255
- // Validate params if schema provided
256
- if (config.validations?.params) {
257
- const params = getRouterParams(event);
258
- logger.debug('Validating route parameters', { params });
259
- const validateParams = validationPipeline(
260
- config.validations.params,
261
- (data) => data
262
- );
263
- const result = await validateParams(params);
264
- result.match(
265
- (data) => {
266
- validated.params = data;
267
- },
268
- (error) => {
269
- logger.error('Path parameters validation failed', { error });
270
- throw new DoubleTieError('Path parameters validation failed', {
271
- code: ERROR_CODES.BAD_REQUEST,
272
- status: 422,
273
- cause: error instanceof Error ? error : undefined,
274
- meta: {
275
- validationErrors: error,
276
- requestPath: config.path,
277
- requestMethod: config.method,
278
- },
279
- });
280
- }
281
- );
282
- }
283
-
284
- // Create event with validated context
285
- const eventWithContext = event as ValidatedEvent<
286
- TBodySchema extends never ? undefined : TBodySchema,
287
- TQuerySchema extends never ? undefined : TQuerySchema,
288
- TParamsSchema extends never ? undefined : TParamsSchema
289
- >;
290
-
291
- eventWithContext.context = {
292
- ...event.context,
293
- validated,
294
- };
295
-
296
- // Call the handler and get its response
297
- logger.debug(`Executing handler for ${config.method} ${config.path}`);
298
- const response = await config.handler(eventWithContext);
299
- logger.debug(
300
- `Handler execution complete for ${config.method} ${config.path}, response type: ${typeof response}`
301
- );
302
-
303
- // Handle different response types
304
- if (response === undefined || response === null) {
305
- logger.warn(
306
- `Handler for ${config.method} ${config.path} returned ${response === null ? 'null' : 'undefined'}`
307
- );
308
- return {}; // Return empty object instead of null/undefined
309
- }
310
-
311
- // For primitive values (which H3 might handle incorrectly)
312
- if (
313
- typeof response === 'boolean' ||
314
- typeof response === 'number' ||
315
- typeof response === 'string'
316
- ) {
317
- logger.warn(
318
- `Handler for ${config.method} ${config.path} returned primitive ${typeof response}, wrapping in object`
319
- );
320
- return { value: response }; // Wrap primitives in an object
321
- }
322
-
323
- // Return objects as-is (H3 will handle serialization)
324
- return response;
325
- } catch (error) {
326
- // If it's already a DoubleTieError, rethrow it
327
- if (error instanceof DoubleTieError) {
328
- throw error;
329
- }
330
-
331
- // Otherwise, wrap it in a DoubleTieError
332
- logger.error('Validation failed', { error });
333
-
334
- // Extract validation details for better error messages
335
- let validationErrors: unknown = 'Unknown validation error';
336
- let statusCode = 422; // Default to validation error status
337
-
338
- if (error instanceof Error) {
339
- validationErrors = error.message;
340
-
341
- // Handle Zod validation errors more comprehensively
342
- if (
343
- error.name === 'ZodError' &&
344
- 'format' in error &&
345
- typeof error.format === 'function'
346
- ) {
347
- try {
348
- validationErrors = error.format();
349
- statusCode = 422; // Zod errors are definitely validation errors
350
- } catch {
351
- // If formatting fails, fall back to the error message
352
- validationErrors = `Validation error: ${error.message}`;
353
- }
354
- }
355
- }
356
-
357
- // Log the validation error details
358
- logger.error('Validation failed', {
359
- error,
360
- validationErrors,
361
- });
362
-
363
- throw new DoubleTieError('Validation failed', {
364
- code: ERROR_CODES.BAD_REQUEST,
365
- status: statusCode,
366
- cause: error instanceof Error ? error : undefined,
367
- meta: {
368
- validationErrors,
369
- requestPath: config.path,
370
- requestMethod: config.method,
371
- },
372
- });
373
- }
374
- });
375
-
376
- // Return the route definition
377
- return {
378
- path: config.path,
379
- method: config.method,
380
- handler,
381
- responseType: {} as TResponse, // This is just for type information, not used at runtime
382
- };
383
- }
384
-
385
- /**
386
- * Extracts the response type from a route definition
387
- *
388
- * This utility type allows extracting the response type from a route defined
389
- * with defineRoute for use in client-side code.
390
- *
391
- * @example
392
- * ```ts
393
- * // Server-side route definition
394
- * export const getUser = defineRoute<UserResponse>({...});
395
- *
396
- * // Client-side type usage
397
- * type UserResponse = RouteResponseType<typeof getUser>;
398
- * ```
399
- */
400
- export type RouteResponseType<T extends Route & { responseType: unknown }> =
401
- T extends Route & { responseType: infer R } ? R : never;
402
-
403
- // Helper functions for getting parameters in a type-safe way
404
- function getQuery(event: H3Event): Record<string, unknown> {
405
- return h3GetQuery(event);
406
- }
407
-
408
- function getRouterParams(event: H3Event): Record<string, unknown> {
409
- return h3GetRouterParams(event) || {};
410
- }