@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
@@ -9,7 +9,7 @@ import { auditLogSchema } from './schema';
9
9
  * and any additional fields from plugins or configuration. The resulting schema is used
10
10
  * for database migrations, schema validation, and query building.
11
11
  *
12
- * @param options - C15T configuration options that may contain audit log table customizations
12
+ * @param options - c15t configuration options that may contain audit log table customizations
13
13
  * @param auditLogFields - Additional fields from plugins to include in the audit log table
14
14
  * @returns A complete table schema definition with fields, model name, and metadata
15
15
  *
@@ -8,7 +8,7 @@ import { consentSchema } from './schema';
8
8
  * and any additional fields from plugins or configuration. The resulting schema is used
9
9
  * for database migrations, schema validation, and query building.
10
10
  *
11
- * @param options - C15T configuration options that may contain consent table customizations
11
+ * @param options - c15t configuration options that may contain consent table customizations
12
12
  * @param consentFields - Additional fields from plugins to include in the consent table
13
13
  * @returns A complete table schema definition with fields, model name, and metadata
14
14
  *
@@ -9,7 +9,7 @@ import { consentPolicySchema } from './schema';
9
9
  * and any additional fields from plugins or configuration. The resulting schema is used
10
10
  * for database migrations, schema validation, and query building.
11
11
  *
12
- * @param options - C15T configuration options that may contain policy table customizations
12
+ * @param options - c15t configuration options that may contain policy table customizations
13
13
  * @param policyFields - Additional fields from plugins to include in the policy table
14
14
  * @returns A complete table schema definition with fields, model name, and metadata
15
15
  *
@@ -9,7 +9,7 @@ import { purposeSchema } from './schema';
9
9
  * and any additional fields from plugins or configuration. The resulting schema is used
10
10
  * for database migrations, schema validation, and query building.
11
11
  *
12
- * @param options - C15T configuration options that may contain consentPurpose table customizations
12
+ * @param options - c15t configuration options that may contain consentPurpose table customizations
13
13
  * @param purposeFields - Additional fields from plugins to include in the consentPurpose table
14
14
  * @returns A complete table schema definition with fields, model name, and metadata
15
15
  *
@@ -9,7 +9,7 @@ import { consentRecordSchema } from './schema';
9
9
  * and any additional fields from plugins or configuration. The resulting schema is used
10
10
  * for database migrations, schema validation, and query building.
11
11
  *
12
- * @param options - C15T configuration options that may contain consent record table customizations
12
+ * @param options - c15t configuration options that may contain consent record table customizations
13
13
  * @param recordFields - Additional fields from plugins to include in the consent record table
14
14
  * @returns A complete table schema definition with fields, model name, and metadata
15
15
  *
@@ -1,6 +1,6 @@
1
- import { ZodError } from 'node_modules/zod/lib/ZodError';
1
+ import { logger } from '@doubletie/logger';
2
+ import { ZodError } from 'zod';
2
3
  import type { Field, PluginSchema } from '~/pkgs/data-model';
3
- import { logger } from '~/pkgs/logger';
4
4
  import type { C15TOptions } from '~/types';
5
5
  import { getAuditLogTable } from './audit-log/table';
6
6
  import { getConsentPolicyTable } from './consent-policy/table';
@@ -9,7 +9,7 @@ import { domainSchema } from './schema';
9
9
  * and any additional fields from plugins or configuration. The resulting schema is used
10
10
  * for database migrations, schema validation, and query building.
11
11
  *
12
- * @param options - C15T configuration options that may contain domain table customizations
12
+ * @param options - c15t configuration options that may contain domain table customizations
13
13
  * @param domainFields - Additional fields from plugins to include in the domain table
14
14
  * @returns A complete table schema definition with fields, model name, and metadata
15
15
  *
@@ -9,7 +9,7 @@ import { subjectSchema } from './schema';
9
9
  * and any additional fields from plugins or configuration. The resulting schema is used
10
10
  * for database migrations, schema validation, and query building.
11
11
  *
12
- * @param options - C15T configuration options that may contain subject table customizations
12
+ * @param options - c15t configuration options that may contain subject table customizations
13
13
  * @param subjectFields - Additional fields from plugins to include in the subject table
14
14
  * @returns A complete table schema definition with fields, model name, and metadata
15
15
  *
package/src/server.ts ADDED
@@ -0,0 +1,130 @@
1
+ import { createServer } from 'node:http';
2
+ import { c15tInstance } from './core';
3
+ import { DoubleTieError } from './pkgs/results';
4
+ import { getLogger } from './pkgs/utils/logger';
5
+
6
+ // Use the centralized logger
7
+ const logger = getLogger({
8
+ level: 'info',
9
+ // appName: 'c15t-server'
10
+ });
11
+
12
+ // Create the c15t instance with our configuration
13
+ const instance = c15tInstance({
14
+ advanced: {
15
+ cors: {
16
+ allowedOrigins: ['*'], // Allow all origins for development
17
+ },
18
+ },
19
+ // Add OpenAPI configuration
20
+ openapi: {
21
+ enabled: true, // Set to true to enable docs
22
+ // Additional OpenAPI options can be added here
23
+ },
24
+ // Add logger
25
+ logger: {
26
+ level: 'info',
27
+ },
28
+ });
29
+
30
+ // Create HTTP server
31
+ const server = createServer(async (req, res) => {
32
+ // Convert Node.js request to Web Request
33
+ const url = new URL(req.url || '/', `http://${req.headers.host}`);
34
+ const headers = new Headers();
35
+
36
+ // Convert Node.js headers to Headers object
37
+ for (const [key, value] of Object.entries(req.headers)) {
38
+ if (value) {
39
+ headers.set(key, Array.isArray(value) ? value.join(', ') : value);
40
+ }
41
+ }
42
+
43
+ // Create a Request object compatible with oRPC
44
+ const request = new Request(url.toString(), {
45
+ method: req.method || 'GET',
46
+ headers,
47
+ // Handle request body for POST/PUT/PATCH requests
48
+ ...(req.method !== 'GET' &&
49
+ req.method !== 'HEAD' && {
50
+ body: req,
51
+ }),
52
+ });
53
+
54
+ try {
55
+ // Use c15tInstance handler to process the request
56
+ // It will automatically handle OpenAPI spec and docs UI
57
+ const response = await instance.handler(request);
58
+
59
+ // Convert Web API Response to Node.js response
60
+ res.writeHead(
61
+ response.status,
62
+ response.statusText,
63
+ Object.fromEntries(response.headers.entries())
64
+ );
65
+
66
+ // Handle different response types
67
+ if (response.body) {
68
+ // Stream the response body
69
+ const reader = response.body.getReader();
70
+ const processChunk = async () => {
71
+ try {
72
+ const { done, value } = await reader.read();
73
+ if (done) {
74
+ res.end();
75
+ return;
76
+ }
77
+
78
+ // Check if response already ended
79
+ if (!res.writableEnded) {
80
+ const canContinue = res.write(value);
81
+ if (canContinue) {
82
+ processChunk();
83
+ } else {
84
+ // If the buffer is full, wait for the drain event
85
+ res.once('drain', processChunk);
86
+ }
87
+ }
88
+ } catch (err) {
89
+ logger.error('Error while streaming response:', err);
90
+ if (!res.writableEnded) {
91
+ res.end();
92
+ }
93
+ }
94
+ };
95
+ processChunk();
96
+ } else {
97
+ res.end();
98
+ }
99
+ } catch (error) {
100
+ logger.error('Error handling request:', error);
101
+
102
+ // Return a proper error response based on the error type
103
+ if (error instanceof DoubleTieError) {
104
+ res.writeHead(error.statusCode, { 'Content-Type': 'application/json' });
105
+ res.end(
106
+ JSON.stringify({
107
+ code: error.code,
108
+ message: error.message,
109
+ data: error.meta,
110
+ })
111
+ );
112
+ } else {
113
+ // Generic error handler
114
+ res.writeHead(500, { 'Content-Type': 'application/json' });
115
+ res.end(
116
+ JSON.stringify({
117
+ error: 'Internal Server Error',
118
+ message: error instanceof Error ? error.message : String(error),
119
+ })
120
+ );
121
+ }
122
+ }
123
+ });
124
+
125
+ // Start the server
126
+ const PORT = process.env.PORT ? Number.parseInt(process.env.PORT, 10) : 3000;
127
+ server.listen(PORT, () => {
128
+ logger.info(`c15t server is running at http://localhost:${PORT}`);
129
+ logger.info(`API documentation available at http://localhost:${PORT}/docs`);
130
+ });
@@ -0,0 +1,437 @@
1
+ import type { Schema as ORPCSchema } from '@orpc/contract';
2
+ import { describe, expect, it } from 'vitest';
3
+ import type { ZodIssue, z } from 'zod';
4
+
5
+ /**
6
+ * Contract test utilities for creating reusable test patterns
7
+ * across multiple contracts
8
+ */
9
+
10
+ type ContractTestHelpers = {
11
+ validateInput?: (
12
+ input: unknown
13
+ ) => z.SafeParseReturnType<unknown, unknown> | undefined;
14
+ validateOutput: (
15
+ output: unknown
16
+ ) => z.SafeParseReturnType<unknown, unknown> | undefined;
17
+ testInput: (testName: string, input: unknown, shouldBeValid: boolean) => void;
18
+ testOutput: (
19
+ testName: string,
20
+ output: unknown,
21
+ shouldBeValid: boolean
22
+ ) => void;
23
+ testDiscriminatedUnion: (
24
+ discriminator: string,
25
+ validValues: string[]
26
+ ) => void;
27
+ testRequiredFields: (schema: 'input' | 'output', fields: string[]) => void;
28
+ };
29
+
30
+ type ContractSchema = z.ZodType | ORPCSchema<unknown, unknown>;
31
+
32
+ /**
33
+ * Creates a test suite for basic contract validation
34
+ * @param contractName Display name for the contract
35
+ * @param contract The contract to test
36
+ */
37
+ export function createContractTests(
38
+ contractName: string,
39
+ contract: {
40
+ '~orpc'?: { inputSchema?: ContractSchema; outputSchema?: ContractSchema };
41
+ }
42
+ ): ContractTestHelpers {
43
+ const schemas = {
44
+ input: contract['~orpc']?.inputSchema,
45
+ output: contract['~orpc']?.outputSchema,
46
+ };
47
+
48
+ // Helper functions
49
+ const validateInput = (input: unknown) => {
50
+ const schema = schemas.input;
51
+ if (!schema) {
52
+ return undefined;
53
+ }
54
+
55
+ // Handle both Zod and oRPC schemas
56
+ if ('safeParse' in schema) {
57
+ return schema.safeParse(input);
58
+ }
59
+ // For oRPC schemas, we'll need to implement validation
60
+ // This is a placeholder - you may need to implement actual validation
61
+ return { success: true, data: input } as z.SafeParseReturnType<
62
+ unknown,
63
+ unknown
64
+ >;
65
+ };
66
+
67
+ const validateOutput = (output: unknown) => {
68
+ const schema = schemas.output;
69
+ if (!schema) {
70
+ return undefined;
71
+ }
72
+
73
+ // Handle both Zod and oRPC schemas
74
+ if ('safeParse' in schema) {
75
+ return schema.safeParse(output);
76
+ }
77
+ // For oRPC schemas, we'll need to implement validation
78
+ // This is a placeholder - you may need to implement actual validation
79
+ return { success: true, data: output } as z.SafeParseReturnType<
80
+ unknown,
81
+ unknown
82
+ >;
83
+ };
84
+
85
+ // Create base test suite
86
+ describe(`${contractName} Contract`, () => {
87
+ describe('Schema Structure', () => {
88
+ it('has properly defined schemas', () => {
89
+ // Only require output schema
90
+ expect(schemas.output).toBeDefined();
91
+
92
+ // Input schema is optional
93
+ if (schemas.input) {
94
+ expect(schemas.input).toBeDefined();
95
+ }
96
+ });
97
+
98
+ it('schemas are serializable', () => {
99
+ // Test serialization for output schema
100
+ if (schemas.output) {
101
+ const serialized = JSON.stringify(schemas.output);
102
+ expect(serialized).toBeDefined();
103
+ expect(typeof serialized).toBe('string');
104
+ expect(() => JSON.parse(serialized)).not.toThrow();
105
+ }
106
+
107
+ // Test serialization for input schema if it exists
108
+ if (schemas.input) {
109
+ const serialized = JSON.stringify(schemas.input);
110
+ expect(serialized).toBeDefined();
111
+ expect(typeof serialized).toBe('string');
112
+ expect(() => JSON.parse(serialized)).not.toThrow();
113
+ }
114
+ });
115
+ });
116
+ });
117
+
118
+ // Define test helpers
119
+ const testInput = (
120
+ testName: string,
121
+ input: unknown,
122
+ shouldBeValid: boolean
123
+ ) => {
124
+ it(`${testName}`, () => {
125
+ const result = validateInput(input);
126
+ if (!result) {
127
+ throw new Error('Validation result is undefined');
128
+ }
129
+ expect(result.success).toBe(shouldBeValid);
130
+ });
131
+ };
132
+
133
+ const testOutput = (
134
+ testName: string,
135
+ output: unknown,
136
+ shouldBeValid: boolean
137
+ ) => {
138
+ it(`${testName}`, () => {
139
+ const result = validateOutput(output);
140
+ if (!result) {
141
+ throw new Error('Validation result is undefined');
142
+ }
143
+ expect(result.success).toBe(shouldBeValid);
144
+ });
145
+ };
146
+
147
+ const testDiscriminatedUnion = (
148
+ discriminator: string,
149
+ validValues: string[]
150
+ ) => {
151
+ describe('Discriminated Union validation', () => {
152
+ it(`uses '${discriminator}' as discriminator`, () => {
153
+ if (!schemas.input) {
154
+ return;
155
+ }
156
+ // Only check Zod schemas for discriminated unions
157
+ if ('_def' in schemas.input) {
158
+ const schema = schemas.input as z.ZodDiscriminatedUnion<
159
+ string,
160
+ z.ZodObject<z.ZodRawShape>[]
161
+ >;
162
+ expect(schema._def.typeName).toBe('ZodDiscriminatedUnion');
163
+ expect(schema._def.discriminator).toBe(discriminator);
164
+ }
165
+ });
166
+
167
+ it('validates all defined discriminator values', () => {
168
+ if (!schemas.input) {
169
+ return;
170
+ }
171
+ for (const value of validValues) {
172
+ const input = {
173
+ [discriminator]: value,
174
+ // Add minimum required fields based on your contract
175
+ };
176
+
177
+ // This test assumes minimal input - you may need to add required fields
178
+ // based on the specific contract being tested
179
+ const result = validateInput(input);
180
+ // Specifically assert that it fails due to missing required fields
181
+ expect(result?.success).toBe(false);
182
+ if (!result?.success) {
183
+ expect(
184
+ result?.error.issues.some(
185
+ (issue) => issue.code === 'invalid_type'
186
+ )
187
+ ).toBe(true);
188
+ }
189
+ }
190
+ });
191
+ });
192
+ };
193
+
194
+ const testRequiredFields = (schema: 'input' | 'output', fields: string[]) => {
195
+ describe(`Required ${schema} fields`, () => {
196
+ // Skip if testing input fields but no input schema exists
197
+ if (schema === 'input' && !schemas.input) {
198
+ it('skips input field tests as no input schema exists', () => {
199
+ expect(true).toBe(true);
200
+ });
201
+ return;
202
+ }
203
+
204
+ // Create a sample of valid data to test against
205
+ let sampleValid: Record<string, unknown>;
206
+
207
+ if (schema === 'input') {
208
+ // For input schema, we need a valid input based on the contract type
209
+ sampleValid = {
210
+ type: 'marketing_communications', // A common type that most contracts would have
211
+ domain: 'example.com',
212
+ // Add other fields that might be required by your contracts
213
+ subjectId: 'test-123',
214
+ metadata: {},
215
+ };
216
+ } else {
217
+ // For output schema, create a generic valid output
218
+ sampleValid = {
219
+ id: 'test-123',
220
+ domainId: 'domain-123',
221
+ domain: 'example.com',
222
+ type: 'marketing_communications',
223
+ status: 'granted',
224
+ recordId: 'record-123',
225
+ givenAt: new Date().toISOString(),
226
+ metadata: {},
227
+ };
228
+ }
229
+
230
+ for (const field of fields) {
231
+ it(`requires '${field}' field`, () => {
232
+ // Create a copy of the valid data without the tested field
233
+ const invalidData = { ...sampleValid };
234
+ delete invalidData[field];
235
+
236
+ const validator = schema === 'input' ? validateInput : validateOutput;
237
+ const result = validator(invalidData);
238
+
239
+ if (!result) {
240
+ throw new Error('Validation result is undefined');
241
+ }
242
+
243
+ expect(result.success).toBe(false);
244
+ if (!result.success) {
245
+ expect(
246
+ result.error.issues.some(
247
+ (issue: ZodIssue) =>
248
+ issue.path.some((p) => String(p).includes(field)) ||
249
+ issue.message.includes('required')
250
+ )
251
+ ).toBe(true);
252
+ }
253
+ });
254
+ }
255
+ });
256
+ };
257
+
258
+ // Return the test helpers for re-use
259
+ return {
260
+ validateInput,
261
+ validateOutput,
262
+ testInput,
263
+ testOutput,
264
+ testDiscriminatedUnion,
265
+ testRequiredFields,
266
+ };
267
+ }
268
+
269
+ /**
270
+ * Creates consistency tests for multiple related contracts
271
+ */
272
+ export function createConsistencyTests(
273
+ contracts: Record<
274
+ string,
275
+ {
276
+ '~orpc'?: {
277
+ inputSchema?: ContractSchema;
278
+ outputSchema?: ContractSchema;
279
+ };
280
+ }
281
+ >
282
+ ) {
283
+ describe('Contract Consistency', () => {
284
+ it('all contracts have output schemas', () => {
285
+ for (const [_name, contract] of Object.entries(contracts)) {
286
+ expect(contract['~orpc']?.outputSchema).toBeDefined();
287
+ }
288
+ });
289
+
290
+ // Field type consistency - ensure common fields use same types across contracts
291
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: excessive cognitive complexity is acceptable here
292
+ it('common fields have consistent types across contracts', () => {
293
+ const commonFields = ['id', 'domainId', 'type', 'status'];
294
+ const contractEntries = Object.entries(contracts);
295
+
296
+ for (const field of commonFields) {
297
+ const fieldTypes = new Set();
298
+
299
+ for (const [_name, contract] of contractEntries) {
300
+ const schema = contract['~orpc']?.outputSchema;
301
+ if (!schema || !('shape' in schema)) {
302
+ continue;
303
+ }
304
+
305
+ const shape = schema.shape as Record<string, z.ZodTypeAny>;
306
+ if (field in shape) {
307
+ const fieldDef = shape[field];
308
+ if (fieldDef) {
309
+ fieldTypes.add(fieldDef.constructor.name);
310
+ }
311
+ }
312
+ }
313
+
314
+ // If the field exists in multiple contracts, they should all use the same type
315
+ if (fieldTypes.size > 0) {
316
+ expect(
317
+ fieldTypes.size,
318
+ `Field '${field}' has inconsistent types across contracts`
319
+ ).toBe(1);
320
+ }
321
+ }
322
+ });
323
+
324
+ // Validate enum value consistency across contracts
325
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: excessive cognitive complexity is acceptable here
326
+ it('enum values are consistent across contracts', () => {
327
+ // Example: status field should have the same allowed values in all contracts
328
+ const statusValues = new Map<string, string[]>();
329
+
330
+ for (const [name, contract] of Object.entries(contracts)) {
331
+ const schema = contract['~orpc']?.outputSchema;
332
+ if (!schema || !('shape' in schema)) {
333
+ continue;
334
+ }
335
+
336
+ const shape = schema.shape as Record<string, z.ZodTypeAny>;
337
+ if (!shape.status) {
338
+ continue;
339
+ }
340
+
341
+ const statusField = shape.status;
342
+ if ('_def' in statusField && 'values' in statusField._def) {
343
+ statusValues.set(name, statusField._def.values as string[]);
344
+ }
345
+ }
346
+
347
+ // All status enums should have the same values
348
+ const allValues = Array.from(statusValues.values());
349
+ if (allValues.length > 1) {
350
+ for (let i = 1; i < allValues.length; i++) {
351
+ expect(allValues[i]).toEqual(allValues[0]);
352
+ }
353
+ }
354
+ });
355
+
356
+ // Validation rule consistency for common fields
357
+ // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: excessive cognitive complexity is acceptable here
358
+ it('validation rules for common fields are consistent', () => {
359
+ const contractEntries = Object.entries(contracts);
360
+ const commonStringFields = ['domain', 'subjectId', 'externalSubjectId'];
361
+
362
+ for (const field of commonStringFields) {
363
+ const minLengths = new Set();
364
+ const maxLengths = new Set();
365
+
366
+ for (const [_name, contract] of contractEntries) {
367
+ const schema = contract['~orpc']?.inputSchema;
368
+ if (!schema || !('shape' in schema)) {
369
+ continue;
370
+ }
371
+
372
+ const shape = schema.shape as Record<string, z.ZodTypeAny>;
373
+ if (!shape[field]) {
374
+ continue;
375
+ }
376
+
377
+ const fieldSchema = shape[field];
378
+ if (
379
+ '_def' in fieldSchema &&
380
+ fieldSchema._def.typeName === 'ZodString'
381
+ ) {
382
+ // Extract min/max length if they exist
383
+ const checks = fieldSchema._def.checks || [];
384
+ for (const check of checks) {
385
+ if (check.kind === 'min') {
386
+ minLengths.add(check.value);
387
+ }
388
+ if (check.kind === 'max') {
389
+ maxLengths.add(check.value);
390
+ }
391
+ }
392
+ }
393
+ }
394
+
395
+ // All contracts should use the same min/max for common string fields
396
+ expect(
397
+ minLengths.size,
398
+ `Inconsistent min length for field '${field}'`
399
+ ).toBeLessThanOrEqual(1);
400
+ expect(
401
+ maxLengths.size,
402
+ `Inconsistent max length for field '${field}'`
403
+ ).toBeLessThanOrEqual(1);
404
+ }
405
+ });
406
+
407
+ // Discriminated union consistency
408
+ it('discriminated unions use consistent discriminator across contracts', () => {
409
+ const discriminators = new Set();
410
+
411
+ for (const [_name, contract] of Object.entries(contracts)) {
412
+ const schema = contract['~orpc']?.inputSchema;
413
+ if (!schema || !('_def' in schema)) {
414
+ continue;
415
+ }
416
+
417
+ // Check if schema is a discriminated union
418
+ if (
419
+ 'typeName' in schema._def &&
420
+ schema._def.typeName === 'ZodDiscriminatedUnion' &&
421
+ 'discriminator' in schema._def
422
+ ) {
423
+ // Safe assertion since we've checked the property exists
424
+ discriminators.add(
425
+ (schema._def as { discriminator: string }).discriminator
426
+ );
427
+ }
428
+ }
429
+
430
+ // All contracts should use the same discriminator (e.g., 'type')
431
+ expect(
432
+ discriminators.size,
433
+ 'Inconsistent discriminator fields used across contracts'
434
+ ).toBeLessThanOrEqual(1);
435
+ });
436
+ });
437
+ }
@@ -2,7 +2,7 @@ import type { DoubleTieContext } from '~/pkgs/types/context';
2
2
  import type { C15TPlugin, InferPluginContexts } from './plugins';
3
3
 
4
4
  /**
5
- * Complete C15T context type for consent management
5
+ * Complete c15t context type for consent management
6
6
  *
7
7
  * This type combines the base consent context with plugin-specific context extensions.
8
8
  * It's the primary context type used throughout the consent management system.
@@ -1,7 +1,7 @@
1
1
  /**
2
- * C15T Types Package
2
+ * c15t Types Package
3
3
  *
4
- * This package provides type definitions specific to the C15T consent management system.
4
+ * This package provides type definitions specific to the c15t consent management system.
5
5
  * It extends the base DoubleTie framework types with consent management specific functionality.
6
6
  *
7
7
  * The types in this folder should be used for consent management specific features, while