@c15t/backend 1.0.5 → 1.2.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 (462) hide show
  1. package/.turbo/turbo-build.log +33 -39
  2. package/.turbo/turbo-fmt.log +3 -3
  3. package/.turbo/turbo-test.log +531 -0
  4. package/coverage/coverage-final.json +84 -0
  5. package/coverage/coverage-summary.json +85 -0
  6. package/coverage/html/backend/index.html +116 -0
  7. package/coverage/html/backend/rslib.config.ts.html +415 -0
  8. package/coverage/html/backend/src/contracts/consent/index.html +161 -0
  9. package/coverage/html/backend/src/contracts/consent/index.ts.html +112 -0
  10. package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +559 -0
  11. package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +220 -0
  12. package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +463 -0
  13. package/coverage/html/backend/src/contracts/index.html +116 -0
  14. package/coverage/html/backend/src/contracts/index.ts.html +139 -0
  15. package/coverage/html/backend/src/contracts/meta/index.html +131 -0
  16. package/coverage/html/backend/src/contracts/meta/index.ts.html +100 -0
  17. package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +196 -0
  18. package/coverage/html/backend/src/contracts/shared/index.html +116 -0
  19. package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +175 -0
  20. package/coverage/html/backend/src/core.ts.html +1624 -0
  21. package/coverage/html/backend/src/handlers/consent/index.html +161 -0
  22. package/coverage/html/backend/src/handlers/consent/index.ts.html +112 -0
  23. package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +889 -0
  24. package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +535 -0
  25. package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +1000 -0
  26. package/coverage/html/backend/src/handlers/meta/index.html +131 -0
  27. package/coverage/html/backend/src/handlers/meta/index.ts.html +100 -0
  28. package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +226 -0
  29. package/coverage/html/backend/src/index.html +161 -0
  30. package/coverage/html/backend/src/init.ts.html +1018 -0
  31. package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +116 -0
  32. package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +544 -0
  33. package/coverage/html/backend/src/pkgs/api-router/index.html +116 -0
  34. package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +334 -0
  35. package/coverage/html/backend/src/pkgs/api-router/utils/cors.ts.html +304 -0
  36. package/coverage/html/backend/src/pkgs/api-router/utils/index.html +131 -0
  37. package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +361 -0
  38. package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +709 -0
  39. package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +256 -0
  40. package/coverage/html/backend/src/pkgs/data-model/fields/index.html +161 -0
  41. package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +136 -0
  42. package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +496 -0
  43. package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +349 -0
  44. package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +176 -0
  45. package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +358 -0
  46. package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +613 -0
  47. package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +538 -0
  48. package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +289 -0
  49. package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +289 -0
  50. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +2203 -0
  51. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +116 -0
  52. package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +116 -0
  53. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +670 -0
  54. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +131 -0
  55. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +3634 -0
  56. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +116 -0
  57. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +1417 -0
  58. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +116 -0
  59. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +2071 -0
  60. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +116 -0
  61. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +1834 -0
  62. package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +316 -0
  63. package/coverage/html/backend/src/pkgs/db-adapters/index.html +131 -0
  64. package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +238 -0
  65. package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +343 -0
  66. package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +217 -0
  67. package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +146 -0
  68. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +280 -0
  69. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +289 -0
  70. package/coverage/html/backend/src/pkgs/migrations/index.html +176 -0
  71. package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +595 -0
  72. package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +301 -0
  73. package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +694 -0
  74. package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +817 -0
  75. package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +976 -0
  76. package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +703 -0
  77. package/coverage/html/backend/src/pkgs/results/core/index.html +146 -0
  78. package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +280 -0
  79. package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +271 -0
  80. package/coverage/html/backend/src/pkgs/results/index.html +131 -0
  81. package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +496 -0
  82. package/coverage/html/backend/src/pkgs/results/results/index.html +131 -0
  83. package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +628 -0
  84. package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +1234 -0
  85. package/coverage/html/backend/src/pkgs/utils/env.ts.html +337 -0
  86. package/coverage/html/backend/src/pkgs/utils/index.html +146 -0
  87. package/coverage/html/backend/src/pkgs/utils/logger.ts.html +199 -0
  88. package/coverage/html/backend/src/pkgs/utils/url.ts.html +400 -0
  89. package/coverage/html/backend/src/router.ts.html +109 -0
  90. package/coverage/html/backend/src/schema/audit-log/index.html +146 -0
  91. package/coverage/html/backend/src/schema/audit-log/registry.ts.html +436 -0
  92. package/coverage/html/backend/src/schema/audit-log/schema.ts.html +223 -0
  93. package/coverage/html/backend/src/schema/audit-log/table.ts.html +640 -0
  94. package/coverage/html/backend/src/schema/consent/index.html +146 -0
  95. package/coverage/html/backend/src/schema/consent/registry.ts.html +616 -0
  96. package/coverage/html/backend/src/schema/consent/schema.ts.html +238 -0
  97. package/coverage/html/backend/src/schema/consent/table.ts.html +748 -0
  98. package/coverage/html/backend/src/schema/consent-policy/index.html +146 -0
  99. package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +1063 -0
  100. package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +265 -0
  101. package/coverage/html/backend/src/schema/consent-policy/table.ts.html +535 -0
  102. package/coverage/html/backend/src/schema/consent-purpose/index.html +146 -0
  103. package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +589 -0
  104. package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +259 -0
  105. package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +547 -0
  106. package/coverage/html/backend/src/schema/consent-record/index.html +131 -0
  107. package/coverage/html/backend/src/schema/consent-record/schema.ts.html +211 -0
  108. package/coverage/html/backend/src/schema/consent-record/table.ts.html +457 -0
  109. package/coverage/html/backend/src/schema/create-registry.ts.html +148 -0
  110. package/coverage/html/backend/src/schema/definition.ts.html +685 -0
  111. package/coverage/html/backend/src/schema/domain/index.html +146 -0
  112. package/coverage/html/backend/src/schema/domain/registry.ts.html +973 -0
  113. package/coverage/html/backend/src/schema/domain/schema.ts.html +214 -0
  114. package/coverage/html/backend/src/schema/domain/table.ts.html +496 -0
  115. package/coverage/html/backend/src/schema/index.html +146 -0
  116. package/coverage/html/backend/src/schema/schemas.ts.html +166 -0
  117. package/coverage/html/backend/src/schema/subject/index.html +146 -0
  118. package/coverage/html/backend/src/schema/subject/registry.ts.html +973 -0
  119. package/coverage/html/backend/src/schema/subject/schema.ts.html +208 -0
  120. package/coverage/html/backend/src/schema/subject/table.ts.html +499 -0
  121. package/coverage/html/backend/src/server.ts.html +475 -0
  122. package/coverage/html/backend/src/testing/contract-testing.ts.html +1348 -0
  123. package/coverage/html/backend/src/testing/index.html +116 -0
  124. package/coverage/html/base.css +224 -0
  125. package/coverage/html/block-navigation.js +87 -0
  126. package/coverage/html/favicon.png +0 -0
  127. package/coverage/html/index.html +626 -0
  128. package/coverage/html/prettify.css +1 -0
  129. package/coverage/html/prettify.js +2 -0
  130. package/coverage/html/sort-arrow-sprite.png +0 -0
  131. package/coverage/html/sorter.js +196 -0
  132. package/dist/contracts/consent/index.d.ts +401 -0
  133. package/dist/contracts/consent/index.d.ts.map +1 -0
  134. package/dist/contracts/consent/index.test.d.ts +2 -0
  135. package/dist/contracts/consent/index.test.d.ts.map +1 -0
  136. package/dist/contracts/consent/post.contract.d.ts +212 -0
  137. package/dist/contracts/consent/post.contract.d.ts.map +1 -0
  138. package/dist/contracts/consent/post.contract.test.d.ts +2 -0
  139. package/dist/contracts/consent/post.contract.test.d.ts.map +1 -0
  140. package/dist/contracts/consent/show-banner.contract.d.ts +45 -0
  141. package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -0
  142. package/dist/contracts/consent/show-banner.contract.test.d.ts +2 -0
  143. package/dist/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
  144. package/dist/contracts/consent/verify.contract.d.ts +147 -0
  145. package/dist/contracts/consent/verify.contract.d.ts.map +1 -0
  146. package/dist/contracts/consent/verify.contract.test.d.ts +2 -0
  147. package/dist/contracts/consent/verify.contract.test.d.ts.map +1 -0
  148. package/dist/contracts/index.d.ts +963 -0
  149. package/dist/contracts/index.d.ts.map +1 -0
  150. package/dist/contracts/meta/index.d.ts +78 -0
  151. package/dist/contracts/meta/index.d.ts.map +1 -0
  152. package/dist/contracts/meta/index.test.d.ts +2 -0
  153. package/dist/contracts/meta/index.test.d.ts.map +1 -0
  154. package/dist/contracts/meta/status.contract.d.ts +77 -0
  155. package/dist/contracts/meta/status.contract.d.ts.map +1 -0
  156. package/dist/contracts/meta/status.contract.test.d.ts +2 -0
  157. package/dist/contracts/meta/status.contract.test.d.ts.map +1 -0
  158. package/dist/contracts/shared/jurisdiction.schema.d.ts +24 -0
  159. package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
  160. package/dist/core.cjs +3584 -0
  161. package/dist/core.d.ts +533 -76
  162. package/dist/core.d.ts.map +1 -1
  163. package/dist/{index.js → core.js} +1163 -1286
  164. package/dist/handlers/consent/index.d.ts +401 -0
  165. package/dist/handlers/consent/index.d.ts.map +1 -0
  166. package/dist/handlers/consent/post.handler.d.ts +234 -0
  167. package/dist/handlers/consent/post.handler.d.ts.map +1 -0
  168. package/dist/handlers/consent/show-banner.handler.d.ts +57 -0
  169. package/dist/handlers/consent/show-banner.handler.d.ts.map +1 -0
  170. package/dist/handlers/consent/show-banner.handler.test.d.ts +2 -0
  171. package/dist/handlers/consent/show-banner.handler.test.d.ts.map +1 -0
  172. package/dist/handlers/consent/verify.handler.d.ts +169 -0
  173. package/dist/handlers/consent/verify.handler.d.ts.map +1 -0
  174. package/dist/handlers/meta/index.d.ts +78 -0
  175. package/dist/handlers/meta/index.d.ts.map +1 -0
  176. package/dist/handlers/meta/status.handler.d.ts +76 -0
  177. package/dist/handlers/meta/status.handler.d.ts.map +1 -0
  178. package/dist/init.d.ts.map +1 -1
  179. package/dist/pkgs/api-router/hooks/processor.d.ts.map +1 -1
  180. package/dist/pkgs/api-router/types/router-props.d.ts +1 -1
  181. package/dist/pkgs/api-router/types/router-props.d.ts.map +1 -1
  182. package/dist/pkgs/api-router/utils/cors.d.ts +1 -1
  183. package/dist/pkgs/api-router/utils/cors.d.ts.map +1 -1
  184. package/dist/pkgs/data-model/fields/field-types.d.ts +1 -1
  185. package/dist/pkgs/data-model/fields/zod-fields.d.ts +32 -32
  186. package/dist/pkgs/data-model/index.cjs +1433 -1799
  187. package/dist/pkgs/data-model/index.js +20 -385
  188. package/dist/pkgs/data-model/schema/index.cjs +1402 -1768
  189. package/dist/pkgs/data-model/schema/index.js +20 -385
  190. package/dist/pkgs/db-adapters/adapter-factory.d.ts +2 -2
  191. package/dist/pkgs/db-adapters/adapter-factory.d.ts.map +1 -1
  192. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +4 -4
  193. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +19 -151
  194. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +19 -151
  195. package/dist/pkgs/db-adapters/adapters/kysely-adapter/dialect.d.ts +1 -1
  196. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +17 -149
  197. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +17 -149
  198. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +2 -2
  199. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
  200. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +17 -149
  201. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +17 -149
  202. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +19 -151
  203. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +19 -151
  204. package/dist/pkgs/db-adapters/index.cjs +31 -153
  205. package/dist/pkgs/db-adapters/index.js +31 -153
  206. package/dist/pkgs/migrations/get-schema/get-schema.d.ts +2 -2
  207. package/dist/pkgs/migrations/get-schema/index.d.ts +1 -1
  208. package/dist/pkgs/migrations/index.cjs +30 -153
  209. package/dist/pkgs/migrations/index.js +30 -153
  210. package/dist/pkgs/migrations/schema-comparison.d.ts.map +1 -1
  211. package/dist/pkgs/results/core/error-class.d.ts +23 -21
  212. package/dist/pkgs/results/core/error-class.d.ts.map +1 -1
  213. package/dist/pkgs/results/index.cjs +17 -150
  214. package/dist/pkgs/results/index.d.ts +0 -3
  215. package/dist/pkgs/results/index.d.ts.map +1 -1
  216. package/dist/pkgs/results/index.js +17 -138
  217. package/dist/pkgs/results/orpc-error-handler.d.ts +65 -0
  218. package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -0
  219. package/dist/pkgs/results/types.d.ts +7 -7
  220. package/dist/pkgs/results/types.d.ts.map +1 -1
  221. package/dist/pkgs/types/context.d.ts +15 -4
  222. package/dist/pkgs/types/context.d.ts.map +1 -1
  223. package/dist/pkgs/types/endpoints.d.ts +3 -4
  224. package/dist/pkgs/types/endpoints.d.ts.map +1 -1
  225. package/dist/pkgs/types/options.d.ts +2 -3
  226. package/dist/pkgs/types/options.d.ts.map +1 -1
  227. package/dist/pkgs/types/plugins.d.ts +2 -3
  228. package/dist/pkgs/types/plugins.d.ts.map +1 -1
  229. package/dist/pkgs/utils/index.d.ts +1 -0
  230. package/dist/pkgs/utils/index.d.ts.map +1 -1
  231. package/dist/pkgs/utils/logger.d.ts +16 -0
  232. package/dist/pkgs/utils/logger.d.ts.map +1 -0
  233. package/dist/router.cjs +1213 -0
  234. package/dist/router.d.ts +480 -0
  235. package/dist/router.d.ts.map +1 -0
  236. package/dist/router.js +1169 -0
  237. package/dist/schema/audit-log/table.d.ts +1 -1
  238. package/dist/schema/consent/table.d.ts +1 -1
  239. package/dist/schema/consent-policy/registry.d.ts +12 -12
  240. package/dist/schema/consent-policy/schema.d.ts +6 -6
  241. package/dist/schema/consent-policy/table.d.ts +7 -7
  242. package/dist/schema/consent-purpose/registry.d.ts +6 -6
  243. package/dist/schema/consent-purpose/schema.d.ts +6 -6
  244. package/dist/schema/consent-purpose/table.d.ts +7 -7
  245. package/dist/schema/consent-record/table.d.ts +1 -1
  246. package/dist/schema/create-registry.d.ts +32 -32
  247. package/dist/schema/definition.d.ts +19 -19
  248. package/dist/schema/domain/registry.d.ts +10 -10
  249. package/dist/schema/domain/schema.d.ts +5 -5
  250. package/dist/schema/domain/table.d.ts +6 -6
  251. package/dist/schema/index.cjs +1409 -1775
  252. package/dist/schema/index.js +20 -385
  253. package/dist/schema/schemas.d.ts +19 -19
  254. package/dist/schema/subject/registry.d.ts +4 -4
  255. package/dist/schema/subject/schema.d.ts +2 -2
  256. package/dist/schema/subject/table.d.ts +3 -3
  257. package/dist/server.d.ts +2 -0
  258. package/dist/server.d.ts.map +1 -0
  259. package/dist/testing/contract-testing.d.ts +37 -0
  260. package/dist/testing/contract-testing.d.ts.map +1 -0
  261. package/dist/types/context.d.ts +1 -1
  262. package/dist/types/index.d.ts +2 -2
  263. package/dist/types/options.d.ts +33 -2
  264. package/dist/types/options.d.ts.map +1 -1
  265. package/dist/types/plugins.d.ts +3 -4
  266. package/dist/types/plugins.d.ts.map +1 -1
  267. package/package.json +22 -30
  268. package/rslib.config.ts +2 -5
  269. package/src/contracts/consent/index.test.ts +5 -0
  270. package/src/contracts/consent/index.ts +9 -0
  271. package/src/contracts/consent/post.contract.test.ts +526 -0
  272. package/src/contracts/consent/post.contract.ts +160 -0
  273. package/src/contracts/consent/show-banner.contract.test.ts +214 -0
  274. package/src/contracts/consent/show-banner.contract.ts +45 -0
  275. package/src/contracts/consent/verify.contract.test.ts +185 -0
  276. package/src/contracts/consent/verify.contract.ts +126 -0
  277. package/src/contracts/index.ts +18 -0
  278. package/src/contracts/meta/index.test.ts +5 -0
  279. package/src/contracts/meta/index.ts +5 -0
  280. package/src/contracts/meta/status.contract.test.ts +338 -0
  281. package/src/contracts/meta/status.contract.ts +37 -0
  282. package/src/contracts/shared/jurisdiction.schema.ts +30 -0
  283. package/src/core.ts +451 -159
  284. package/src/handlers/consent/index.ts +9 -0
  285. package/src/handlers/consent/post.handler.ts +273 -0
  286. package/src/handlers/consent/show-banner.handler.test.ts +148 -0
  287. package/src/handlers/consent/show-banner.handler.ts +150 -0
  288. package/src/handlers/consent/verify.handler.ts +305 -0
  289. package/src/handlers/meta/index.ts +5 -0
  290. package/src/handlers/meta/status.handler.ts +47 -0
  291. package/src/init.ts +8 -5
  292. package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +6 -0
  293. package/src/pkgs/api-router/hooks/processor.ts +2 -0
  294. package/src/pkgs/api-router/types/router-props.ts +1 -1
  295. package/src/pkgs/api-router/utils/cors.ts +1 -1
  296. package/src/pkgs/data-model/fields/field-types.ts +1 -1
  297. package/src/pkgs/data-model/fields/id-generator.ts +1 -1
  298. package/src/pkgs/db-adapters/README.md +3 -3
  299. package/src/pkgs/db-adapters/adapter-factory.ts +8 -4
  300. package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +13 -13
  301. package/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts +1 -1
  302. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +1 -1
  303. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +1 -1
  304. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +2 -2
  305. package/src/pkgs/migrations/get-migration.ts +3 -3
  306. package/src/pkgs/migrations/get-schema/get-schema.ts +2 -2
  307. package/src/pkgs/migrations/get-schema/index.ts +1 -1
  308. package/src/pkgs/migrations/migration-builders.ts +2 -2
  309. package/src/pkgs/migrations/migration-execution.ts +2 -2
  310. package/src/pkgs/migrations/schema-comparison.ts +5 -4
  311. package/src/pkgs/results/__tests__/error-class.test.ts +8 -7
  312. package/src/pkgs/results/core/error-class.ts +31 -43
  313. package/src/pkgs/results/index.ts +0 -10
  314. package/src/pkgs/results/orpc-error-handler.ts +137 -0
  315. package/src/pkgs/results/types.ts +8 -7
  316. package/src/pkgs/types/context.ts +18 -4
  317. package/src/pkgs/types/endpoints.ts +3 -5
  318. package/src/pkgs/types/options.ts +2 -3
  319. package/src/pkgs/types/plugins.ts +2 -3
  320. package/src/pkgs/utils/index.ts +1 -0
  321. package/src/pkgs/utils/logger.ts +38 -0
  322. package/src/router.ts +8 -0
  323. package/src/schema/audit-log/table.ts +1 -1
  324. package/src/schema/consent/table.ts +1 -1
  325. package/src/schema/consent-policy/table.ts +1 -1
  326. package/src/schema/consent-purpose/table.ts +1 -1
  327. package/src/schema/consent-record/table.ts +1 -1
  328. package/src/schema/definition.ts +2 -2
  329. package/src/schema/domain/table.ts +1 -1
  330. package/src/schema/subject/table.ts +1 -1
  331. package/src/server.ts +130 -0
  332. package/src/testing/contract-testing.ts +437 -0
  333. package/src/types/context.ts +1 -1
  334. package/src/types/index.ts +2 -2
  335. package/src/types/options.ts +38 -2
  336. package/src/types/plugins.ts +3 -4
  337. package/dist/index.cjs +0 -3701
  338. package/dist/index.d.ts +0 -11
  339. package/dist/index.d.ts.map +0 -1
  340. package/dist/init.test.d.ts +0 -2
  341. package/dist/init.test.d.ts.map +0 -1
  342. package/dist/integrations/cloudflare.cjs +0 -312
  343. package/dist/integrations/cloudflare.d.ts +0 -32
  344. package/dist/integrations/cloudflare.d.ts.map +0 -1
  345. package/dist/integrations/cloudflare.js +0 -278
  346. package/dist/integrations/next.cjs +0 -276
  347. package/dist/integrations/next.d.ts +0 -68
  348. package/dist/integrations/next.d.ts.map +0 -1
  349. package/dist/integrations/next.js +0 -239
  350. package/dist/integrations/node.cjs +0 -257
  351. package/dist/integrations/node.d.ts +0 -29
  352. package/dist/integrations/node.d.ts.map +0 -1
  353. package/dist/integrations/node.js +0 -223
  354. package/dist/pkgs/api-router/index.d.ts +0 -9
  355. package/dist/pkgs/api-router/index.d.ts.map +0 -1
  356. package/dist/pkgs/api-router/utils/define-route.d.ts +0 -87
  357. package/dist/pkgs/api-router/utils/define-route.d.ts.map +0 -1
  358. package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts +0 -2
  359. package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts.map +0 -1
  360. package/dist/pkgs/logger/__tests__/integration.test.d.ts +0 -2
  361. package/dist/pkgs/logger/__tests__/integration.test.d.ts.map +0 -1
  362. package/dist/pkgs/logger/__tests__/log-levels.test.d.ts +0 -2
  363. package/dist/pkgs/logger/__tests__/log-levels.test.d.ts.map +0 -1
  364. package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts +0 -2
  365. package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts.map +0 -1
  366. package/dist/pkgs/logger/__tests__/result-logging.test.d.ts +0 -2
  367. package/dist/pkgs/logger/__tests__/result-logging.test.d.ts.map +0 -1
  368. package/dist/pkgs/logger/__tests__/types.test.d.ts +0 -2
  369. package/dist/pkgs/logger/__tests__/types.test.d.ts.map +0 -1
  370. package/dist/pkgs/logger/console-formatter.d.ts +0 -56
  371. package/dist/pkgs/logger/console-formatter.d.ts.map +0 -1
  372. package/dist/pkgs/logger/index.cjs +0 -240
  373. package/dist/pkgs/logger/index.d.ts +0 -35
  374. package/dist/pkgs/logger/index.d.ts.map +0 -1
  375. package/dist/pkgs/logger/index.js +0 -185
  376. package/dist/pkgs/logger/log-levels.d.ts +0 -29
  377. package/dist/pkgs/logger/log-levels.d.ts.map +0 -1
  378. package/dist/pkgs/logger/logger-factory.d.ts +0 -42
  379. package/dist/pkgs/logger/logger-factory.d.ts.map +0 -1
  380. package/dist/pkgs/logger/result-logging.d.ts +0 -71
  381. package/dist/pkgs/logger/result-logging.d.ts.map +0 -1
  382. package/dist/pkgs/logger/telemetry.d.ts +0 -14
  383. package/dist/pkgs/logger/telemetry.d.ts.map +0 -1
  384. package/dist/pkgs/logger/types.d.ts +0 -121
  385. package/dist/pkgs/logger/types.d.ts.map +0 -1
  386. package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts +0 -2
  387. package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts.map +0 -1
  388. package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts +0 -2
  389. package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts.map +0 -1
  390. package/dist/pkgs/results/h3-integration.d.ts +0 -52
  391. package/dist/pkgs/results/h3-integration.d.ts.map +0 -1
  392. package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts +0 -101
  393. package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts.map +0 -1
  394. package/dist/pkgs/results/pipeline/validation-pipeline.d.ts +0 -89
  395. package/dist/pkgs/results/pipeline/validation-pipeline.d.ts.map +0 -1
  396. package/dist/response-types.d.ts +0 -19
  397. package/dist/response-types.d.ts.map +0 -1
  398. package/dist/routes/__test__/index.test.d.ts +0 -17
  399. package/dist/routes/__test__/index.test.d.ts.map +0 -1
  400. package/dist/routes/__test__/set-consent.test.d.ts +0 -2
  401. package/dist/routes/__test__/set-consent.test.d.ts.map +0 -1
  402. package/dist/routes/__test__/show-consent-banner.test.d.ts +0 -2
  403. package/dist/routes/__test__/show-consent-banner.test.d.ts.map +0 -1
  404. package/dist/routes/__test__/status.test.d.ts +0 -2
  405. package/dist/routes/__test__/status.test.d.ts.map +0 -1
  406. package/dist/routes/__test__/verify-consent.test.d.ts +0 -2
  407. package/dist/routes/__test__/verify-consent.test.d.ts.map +0 -1
  408. package/dist/routes/index.d.ts +0 -3
  409. package/dist/routes/index.d.ts.map +0 -1
  410. package/dist/routes/set-consent.d.ts +0 -89
  411. package/dist/routes/set-consent.d.ts.map +0 -1
  412. package/dist/routes/show-consent-banner.d.ts +0 -15
  413. package/dist/routes/show-consent-banner.d.ts.map +0 -1
  414. package/dist/routes/status.d.ts +0 -44
  415. package/dist/routes/status.d.ts.map +0 -1
  416. package/dist/routes/types.d.ts +0 -7
  417. package/dist/routes/types.d.ts.map +0 -1
  418. package/dist/routes/verify-consent.d.ts +0 -38
  419. package/dist/routes/verify-consent.d.ts.map +0 -1
  420. package/src/docs/ADVANCED_JSON_HANDLING.md +0 -99
  421. package/src/docs/neverthrow.md +0 -171
  422. package/src/index.ts +0 -34
  423. package/src/init.test.ts +0 -219
  424. package/src/integrations/cloudflare.ts +0 -269
  425. package/src/integrations/next.ts +0 -204
  426. package/src/integrations/node.ts +0 -141
  427. package/src/pkgs/api-router/index.ts +0 -148
  428. package/src/pkgs/api-router/types/h3.d.ts +0 -42
  429. package/src/pkgs/api-router/utils/define-route.ts +0 -410
  430. package/src/pkgs/logger/README.md +0 -213
  431. package/src/pkgs/logger/__tests__/console-formatter.test.ts +0 -67
  432. package/src/pkgs/logger/__tests__/integration.test.ts +0 -184
  433. package/src/pkgs/logger/__tests__/log-levels.test.ts +0 -77
  434. package/src/pkgs/logger/__tests__/logger-factory.test.ts +0 -156
  435. package/src/pkgs/logger/__tests__/result-logging.test.ts +0 -209
  436. package/src/pkgs/logger/__tests__/types.test.ts +0 -94
  437. package/src/pkgs/logger/console-formatter.ts +0 -75
  438. package/src/pkgs/logger/doc.md +0 -569
  439. package/src/pkgs/logger/index.ts +0 -59
  440. package/src/pkgs/logger/log-levels.ts +0 -46
  441. package/src/pkgs/logger/logger-factory.ts +0 -121
  442. package/src/pkgs/logger/result-logging.ts +0 -134
  443. package/src/pkgs/logger/telemetry.ts +0 -96
  444. package/src/pkgs/logger/types.ts +0 -138
  445. package/src/pkgs/results/__tests__/retrieval-pipeline.test.ts +0 -157
  446. package/src/pkgs/results/__tests__/validation-pipeline.test.ts +0 -151
  447. package/src/pkgs/results/h3-integration.ts +0 -142
  448. package/src/pkgs/results/pipeline/retrieval-pipeline.ts +0 -188
  449. package/src/pkgs/results/pipeline/validation-pipeline.ts +0 -164
  450. package/src/plugins/.keep +0 -0
  451. package/src/response-types.ts +0 -29
  452. package/src/routes/__test__/index.test.ts +0 -112
  453. package/src/routes/__test__/set-consent.test.ts +0 -242
  454. package/src/routes/__test__/show-consent-banner.test.ts +0 -98
  455. package/src/routes/__test__/status.test.ts +0 -64
  456. package/src/routes/__test__/verify-consent.test.ts +0 -266
  457. package/src/routes/index.ts +0 -12
  458. package/src/routes/set-consent.ts +0 -249
  459. package/src/routes/show-consent-banner.ts +0 -131
  460. package/src/routes/status.ts +0 -61
  461. package/src/routes/types.ts +0 -7
  462. 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
- }