@c15t/backend 1.0.0 → 1.1.0-canary.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (478) hide show
  1. package/.turbo/turbo-build.log +33 -39
  2. package/.turbo/turbo-fmt.log +7 -0
  3. package/.turbo/turbo-test.log +531 -0
  4. package/README.md +19 -7
  5. package/coverage/coverage-final.json +84 -0
  6. package/coverage/coverage-summary.json +85 -0
  7. package/coverage/html/backend/index.html +116 -0
  8. package/coverage/html/backend/rslib.config.ts.html +415 -0
  9. package/coverage/html/backend/src/contracts/consent/index.html +161 -0
  10. package/coverage/html/backend/src/contracts/consent/index.ts.html +112 -0
  11. package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +559 -0
  12. package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +220 -0
  13. package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +463 -0
  14. package/coverage/html/backend/src/contracts/index.html +116 -0
  15. package/coverage/html/backend/src/contracts/index.ts.html +139 -0
  16. package/coverage/html/backend/src/contracts/meta/index.html +131 -0
  17. package/coverage/html/backend/src/contracts/meta/index.ts.html +100 -0
  18. package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +196 -0
  19. package/coverage/html/backend/src/contracts/shared/index.html +116 -0
  20. package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +175 -0
  21. package/coverage/html/backend/src/core.ts.html +1624 -0
  22. package/coverage/html/backend/src/handlers/consent/index.html +161 -0
  23. package/coverage/html/backend/src/handlers/consent/index.ts.html +112 -0
  24. package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +889 -0
  25. package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +535 -0
  26. package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +1000 -0
  27. package/coverage/html/backend/src/handlers/meta/index.html +131 -0
  28. package/coverage/html/backend/src/handlers/meta/index.ts.html +100 -0
  29. package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +226 -0
  30. package/coverage/html/backend/src/index.html +161 -0
  31. package/coverage/html/backend/src/init.ts.html +1018 -0
  32. package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +116 -0
  33. package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +544 -0
  34. package/coverage/html/backend/src/pkgs/api-router/index.html +116 -0
  35. package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +334 -0
  36. package/coverage/html/backend/src/pkgs/api-router/utils/cors.ts.html +304 -0
  37. package/coverage/html/backend/src/pkgs/api-router/utils/index.html +131 -0
  38. package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +361 -0
  39. package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +709 -0
  40. package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +256 -0
  41. package/coverage/html/backend/src/pkgs/data-model/fields/index.html +161 -0
  42. package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +136 -0
  43. package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +496 -0
  44. package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +349 -0
  45. package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +176 -0
  46. package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +358 -0
  47. package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +613 -0
  48. package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +538 -0
  49. package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +289 -0
  50. package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +289 -0
  51. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +2203 -0
  52. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +116 -0
  53. package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +116 -0
  54. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +670 -0
  55. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +131 -0
  56. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +3634 -0
  57. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +116 -0
  58. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +1417 -0
  59. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +116 -0
  60. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +2071 -0
  61. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +116 -0
  62. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +1834 -0
  63. package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +316 -0
  64. package/coverage/html/backend/src/pkgs/db-adapters/index.html +131 -0
  65. package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +238 -0
  66. package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +343 -0
  67. package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +217 -0
  68. package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +146 -0
  69. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +280 -0
  70. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +289 -0
  71. package/coverage/html/backend/src/pkgs/migrations/index.html +176 -0
  72. package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +595 -0
  73. package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +301 -0
  74. package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +694 -0
  75. package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +817 -0
  76. package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +976 -0
  77. package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +703 -0
  78. package/coverage/html/backend/src/pkgs/results/core/index.html +146 -0
  79. package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +280 -0
  80. package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +271 -0
  81. package/coverage/html/backend/src/pkgs/results/index.html +131 -0
  82. package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +496 -0
  83. package/coverage/html/backend/src/pkgs/results/results/index.html +131 -0
  84. package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +628 -0
  85. package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +1234 -0
  86. package/coverage/html/backend/src/pkgs/utils/env.ts.html +337 -0
  87. package/coverage/html/backend/src/pkgs/utils/index.html +146 -0
  88. package/coverage/html/backend/src/pkgs/utils/logger.ts.html +199 -0
  89. package/coverage/html/backend/src/pkgs/utils/url.ts.html +400 -0
  90. package/coverage/html/backend/src/router.ts.html +109 -0
  91. package/coverage/html/backend/src/schema/audit-log/index.html +146 -0
  92. package/coverage/html/backend/src/schema/audit-log/registry.ts.html +436 -0
  93. package/coverage/html/backend/src/schema/audit-log/schema.ts.html +223 -0
  94. package/coverage/html/backend/src/schema/audit-log/table.ts.html +640 -0
  95. package/coverage/html/backend/src/schema/consent/index.html +146 -0
  96. package/coverage/html/backend/src/schema/consent/registry.ts.html +616 -0
  97. package/coverage/html/backend/src/schema/consent/schema.ts.html +238 -0
  98. package/coverage/html/backend/src/schema/consent/table.ts.html +748 -0
  99. package/coverage/html/backend/src/schema/consent-policy/index.html +146 -0
  100. package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +1063 -0
  101. package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +265 -0
  102. package/coverage/html/backend/src/schema/consent-policy/table.ts.html +535 -0
  103. package/coverage/html/backend/src/schema/consent-purpose/index.html +146 -0
  104. package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +589 -0
  105. package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +259 -0
  106. package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +547 -0
  107. package/coverage/html/backend/src/schema/consent-record/index.html +131 -0
  108. package/coverage/html/backend/src/schema/consent-record/schema.ts.html +211 -0
  109. package/coverage/html/backend/src/schema/consent-record/table.ts.html +457 -0
  110. package/coverage/html/backend/src/schema/create-registry.ts.html +148 -0
  111. package/coverage/html/backend/src/schema/definition.ts.html +685 -0
  112. package/coverage/html/backend/src/schema/domain/index.html +146 -0
  113. package/coverage/html/backend/src/schema/domain/registry.ts.html +973 -0
  114. package/coverage/html/backend/src/schema/domain/schema.ts.html +214 -0
  115. package/coverage/html/backend/src/schema/domain/table.ts.html +496 -0
  116. package/coverage/html/backend/src/schema/index.html +146 -0
  117. package/coverage/html/backend/src/schema/schemas.ts.html +166 -0
  118. package/coverage/html/backend/src/schema/subject/index.html +146 -0
  119. package/coverage/html/backend/src/schema/subject/registry.ts.html +973 -0
  120. package/coverage/html/backend/src/schema/subject/schema.ts.html +208 -0
  121. package/coverage/html/backend/src/schema/subject/table.ts.html +499 -0
  122. package/coverage/html/backend/src/server.ts.html +475 -0
  123. package/coverage/html/backend/src/testing/contract-testing.ts.html +1348 -0
  124. package/coverage/html/backend/src/testing/index.html +116 -0
  125. package/coverage/html/base.css +224 -0
  126. package/coverage/html/block-navigation.js +87 -0
  127. package/coverage/html/favicon.png +0 -0
  128. package/coverage/html/index.html +626 -0
  129. package/coverage/html/prettify.css +1 -0
  130. package/coverage/html/prettify.js +2 -0
  131. package/coverage/html/sort-arrow-sprite.png +0 -0
  132. package/coverage/html/sorter.js +196 -0
  133. package/dist/contracts/consent/index.d.ts +401 -0
  134. package/dist/contracts/consent/index.d.ts.map +1 -0
  135. package/dist/contracts/consent/index.test.d.ts +2 -0
  136. package/dist/contracts/consent/index.test.d.ts.map +1 -0
  137. package/dist/contracts/consent/post.contract.d.ts +212 -0
  138. package/dist/contracts/consent/post.contract.d.ts.map +1 -0
  139. package/dist/contracts/consent/post.contract.test.d.ts +2 -0
  140. package/dist/contracts/consent/post.contract.test.d.ts.map +1 -0
  141. package/dist/contracts/consent/show-banner.contract.d.ts +45 -0
  142. package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -0
  143. package/dist/contracts/consent/show-banner.contract.test.d.ts +2 -0
  144. package/dist/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
  145. package/dist/contracts/consent/verify.contract.d.ts +147 -0
  146. package/dist/contracts/consent/verify.contract.d.ts.map +1 -0
  147. package/dist/contracts/consent/verify.contract.test.d.ts +2 -0
  148. package/dist/contracts/consent/verify.contract.test.d.ts.map +1 -0
  149. package/dist/contracts/index.d.ts +963 -0
  150. package/dist/contracts/index.d.ts.map +1 -0
  151. package/dist/contracts/meta/index.d.ts +78 -0
  152. package/dist/contracts/meta/index.d.ts.map +1 -0
  153. package/dist/contracts/meta/index.test.d.ts +2 -0
  154. package/dist/contracts/meta/index.test.d.ts.map +1 -0
  155. package/dist/contracts/meta/status.contract.d.ts +77 -0
  156. package/dist/contracts/meta/status.contract.d.ts.map +1 -0
  157. package/dist/contracts/meta/status.contract.test.d.ts +2 -0
  158. package/dist/contracts/meta/status.contract.test.d.ts.map +1 -0
  159. package/dist/contracts/shared/jurisdiction.schema.d.ts +24 -0
  160. package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
  161. package/dist/core.cjs +3584 -0
  162. package/dist/core.d.ts +533 -78
  163. package/dist/core.d.ts.map +1 -1
  164. package/dist/{index.js → core.js} +1164 -1292
  165. package/dist/handlers/consent/index.d.ts +401 -0
  166. package/dist/handlers/consent/index.d.ts.map +1 -0
  167. package/dist/handlers/consent/post.handler.d.ts +234 -0
  168. package/dist/handlers/consent/post.handler.d.ts.map +1 -0
  169. package/dist/handlers/consent/show-banner.handler.d.ts +57 -0
  170. package/dist/handlers/consent/show-banner.handler.d.ts.map +1 -0
  171. package/dist/handlers/consent/show-banner.handler.test.d.ts +2 -0
  172. package/dist/handlers/consent/show-banner.handler.test.d.ts.map +1 -0
  173. package/dist/handlers/consent/verify.handler.d.ts +169 -0
  174. package/dist/handlers/consent/verify.handler.d.ts.map +1 -0
  175. package/dist/handlers/meta/index.d.ts +78 -0
  176. package/dist/handlers/meta/index.d.ts.map +1 -0
  177. package/dist/handlers/meta/status.handler.d.ts +76 -0
  178. package/dist/handlers/meta/status.handler.d.ts.map +1 -0
  179. package/dist/init.d.ts +0 -1
  180. package/dist/init.d.ts.map +1 -1
  181. package/dist/pkgs/api-router/hooks/processor.d.ts.map +1 -1
  182. package/dist/pkgs/api-router/types/router-props.d.ts +1 -1
  183. package/dist/pkgs/api-router/types/router-props.d.ts.map +1 -1
  184. package/dist/pkgs/api-router/utils/cors.d.ts +1 -1
  185. package/dist/pkgs/api-router/utils/cors.d.ts.map +1 -1
  186. package/dist/pkgs/data-model/fields/field-types.d.ts +1 -1
  187. package/dist/pkgs/data-model/fields/zod-fields.d.ts +32 -32
  188. package/dist/pkgs/data-model/index.cjs +1433 -1799
  189. package/dist/pkgs/data-model/index.js +20 -385
  190. package/dist/pkgs/data-model/schema/index.cjs +1402 -1768
  191. package/dist/pkgs/data-model/schema/index.js +20 -385
  192. package/dist/pkgs/db-adapters/adapter-factory.d.ts +2 -2
  193. package/dist/pkgs/db-adapters/adapter-factory.d.ts.map +1 -1
  194. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +4 -7
  195. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -1
  196. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +19 -151
  197. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +19 -151
  198. package/dist/pkgs/db-adapters/adapters/kysely-adapter/dialect.d.ts +1 -3
  199. package/dist/pkgs/db-adapters/adapters/kysely-adapter/dialect.d.ts.map +1 -1
  200. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +17 -149
  201. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +17 -149
  202. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts +0 -1
  203. package/dist/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -1
  204. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +2 -2
  205. package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
  206. package/dist/pkgs/db-adapters/adapters/kysely-adapter/types.d.ts +0 -2
  207. package/dist/pkgs/db-adapters/adapters/kysely-adapter/types.d.ts.map +1 -1
  208. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +17 -149
  209. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +17 -149
  210. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts +0 -1
  211. package/dist/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.d.ts.map +1 -1
  212. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +19 -151
  213. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +19 -151
  214. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts +0 -1
  215. package/dist/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -1
  216. package/dist/pkgs/db-adapters/index.cjs +31 -153
  217. package/dist/pkgs/db-adapters/index.js +31 -153
  218. package/dist/pkgs/migrations/get-schema/get-schema.d.ts +2 -2
  219. package/dist/pkgs/migrations/get-schema/index.d.ts +1 -1
  220. package/dist/pkgs/migrations/index.cjs +30 -153
  221. package/dist/pkgs/migrations/index.js +30 -153
  222. package/dist/pkgs/migrations/schema-comparison.d.ts.map +1 -1
  223. package/dist/pkgs/results/core/error-class.d.ts +23 -21
  224. package/dist/pkgs/results/core/error-class.d.ts.map +1 -1
  225. package/dist/pkgs/results/index.cjs +17 -150
  226. package/dist/pkgs/results/index.d.ts +0 -3
  227. package/dist/pkgs/results/index.d.ts.map +1 -1
  228. package/dist/pkgs/results/index.js +17 -138
  229. package/dist/pkgs/results/orpc-error-handler.d.ts +65 -0
  230. package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -0
  231. package/dist/pkgs/results/types.d.ts +7 -7
  232. package/dist/pkgs/results/types.d.ts.map +1 -1
  233. package/dist/pkgs/types/context.d.ts +15 -8
  234. package/dist/pkgs/types/context.d.ts.map +1 -1
  235. package/dist/pkgs/types/endpoints.d.ts +3 -4
  236. package/dist/pkgs/types/endpoints.d.ts.map +1 -1
  237. package/dist/pkgs/types/options.d.ts +2 -4
  238. package/dist/pkgs/types/options.d.ts.map +1 -1
  239. package/dist/pkgs/types/plugins.d.ts +2 -3
  240. package/dist/pkgs/types/plugins.d.ts.map +1 -1
  241. package/dist/pkgs/utils/index.d.ts +1 -0
  242. package/dist/pkgs/utils/index.d.ts.map +1 -1
  243. package/dist/pkgs/utils/logger.d.ts +16 -0
  244. package/dist/pkgs/utils/logger.d.ts.map +1 -0
  245. package/dist/router.cjs +1213 -0
  246. package/dist/router.d.ts +480 -0
  247. package/dist/router.d.ts.map +1 -0
  248. package/dist/router.js +1169 -0
  249. package/dist/schema/audit-log/table.d.ts +1 -1
  250. package/dist/schema/consent/table.d.ts +1 -1
  251. package/dist/schema/consent-policy/registry.d.ts +12 -12
  252. package/dist/schema/consent-policy/schema.d.ts +6 -6
  253. package/dist/schema/consent-policy/table.d.ts +7 -7
  254. package/dist/schema/consent-purpose/registry.d.ts +6 -6
  255. package/dist/schema/consent-purpose/schema.d.ts +6 -6
  256. package/dist/schema/consent-purpose/table.d.ts +7 -7
  257. package/dist/schema/consent-record/table.d.ts +1 -1
  258. package/dist/schema/create-registry.d.ts +32 -32
  259. package/dist/schema/definition.d.ts +19 -19
  260. package/dist/schema/domain/registry.d.ts +10 -10
  261. package/dist/schema/domain/schema.d.ts +5 -5
  262. package/dist/schema/domain/table.d.ts +6 -6
  263. package/dist/schema/index.cjs +1409 -1775
  264. package/dist/schema/index.js +20 -385
  265. package/dist/schema/schemas.d.ts +19 -19
  266. package/dist/schema/subject/registry.d.ts +4 -4
  267. package/dist/schema/subject/schema.d.ts +2 -2
  268. package/dist/schema/subject/table.d.ts +3 -3
  269. package/dist/server.d.ts +2 -0
  270. package/dist/server.d.ts.map +1 -0
  271. package/dist/testing/contract-testing.d.ts +37 -0
  272. package/dist/testing/contract-testing.d.ts.map +1 -0
  273. package/dist/types/context.d.ts +1 -1
  274. package/dist/types/index.d.ts +2 -2
  275. package/dist/types/options.d.ts +33 -3
  276. package/dist/types/options.d.ts.map +1 -1
  277. package/dist/types/plugins.d.ts +3 -4
  278. package/dist/types/plugins.d.ts.map +1 -1
  279. package/package.json +20 -28
  280. package/rslib.config.ts +2 -5
  281. package/src/contracts/consent/index.test.ts +5 -0
  282. package/src/contracts/consent/index.ts +9 -0
  283. package/src/contracts/consent/post.contract.test.ts +526 -0
  284. package/src/contracts/consent/post.contract.ts +160 -0
  285. package/src/contracts/consent/show-banner.contract.test.ts +214 -0
  286. package/src/contracts/consent/show-banner.contract.ts +45 -0
  287. package/src/contracts/consent/verify.contract.test.ts +185 -0
  288. package/src/contracts/consent/verify.contract.ts +126 -0
  289. package/src/contracts/index.ts +18 -0
  290. package/src/contracts/meta/index.test.ts +5 -0
  291. package/src/contracts/meta/index.ts +5 -0
  292. package/src/contracts/meta/status.contract.test.ts +338 -0
  293. package/src/contracts/meta/status.contract.ts +37 -0
  294. package/src/contracts/shared/jurisdiction.schema.ts +30 -0
  295. package/src/core.ts +451 -161
  296. package/src/handlers/consent/index.ts +9 -0
  297. package/src/handlers/consent/post.handler.ts +273 -0
  298. package/src/handlers/consent/show-banner.handler.test.ts +148 -0
  299. package/src/handlers/consent/show-banner.handler.ts +150 -0
  300. package/src/handlers/consent/verify.handler.ts +305 -0
  301. package/src/handlers/meta/index.ts +5 -0
  302. package/src/handlers/meta/status.handler.ts +47 -0
  303. package/src/init.ts +8 -26
  304. package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +6 -0
  305. package/src/pkgs/api-router/hooks/processor.ts +2 -0
  306. package/src/pkgs/api-router/types/router-props.ts +1 -1
  307. package/src/pkgs/api-router/utils/cors.ts +1 -1
  308. package/src/pkgs/data-model/fields/field-types.ts +1 -1
  309. package/src/pkgs/data-model/fields/id-generator.ts +1 -1
  310. package/src/pkgs/db-adapters/README.md +3 -3
  311. package/src/pkgs/db-adapters/adapter-factory.ts +8 -4
  312. package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +13 -16
  313. package/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts +1 -3
  314. package/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts +0 -1
  315. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +1 -1
  316. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +1 -1
  317. package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +2 -2
  318. package/src/pkgs/db-adapters/adapters/kysely-adapter/types.ts +0 -2
  319. package/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts +0 -1
  320. package/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts +0 -1
  321. package/src/pkgs/migrations/get-migration.ts +3 -3
  322. package/src/pkgs/migrations/get-schema/get-schema.ts +2 -2
  323. package/src/pkgs/migrations/get-schema/index.ts +1 -1
  324. package/src/pkgs/migrations/migration-builders.ts +2 -2
  325. package/src/pkgs/migrations/migration-execution.ts +2 -2
  326. package/src/pkgs/migrations/schema-comparison.ts +5 -4
  327. package/src/pkgs/results/__tests__/error-class.test.ts +8 -7
  328. package/src/pkgs/results/core/error-class.ts +31 -43
  329. package/src/pkgs/results/index.ts +0 -10
  330. package/src/pkgs/results/orpc-error-handler.ts +137 -0
  331. package/src/pkgs/results/types.ts +8 -7
  332. package/src/pkgs/types/context.ts +18 -9
  333. package/src/pkgs/types/endpoints.ts +3 -5
  334. package/src/pkgs/types/options.ts +2 -4
  335. package/src/pkgs/types/plugins.ts +2 -3
  336. package/src/pkgs/utils/index.ts +1 -0
  337. package/src/pkgs/utils/logger.ts +38 -0
  338. package/src/router.ts +8 -0
  339. package/src/schema/audit-log/table.ts +1 -1
  340. package/src/schema/consent/table.ts +1 -1
  341. package/src/schema/consent-policy/table.ts +1 -1
  342. package/src/schema/consent-purpose/table.ts +1 -1
  343. package/src/schema/consent-record/table.ts +1 -1
  344. package/src/schema/definition.ts +2 -2
  345. package/src/schema/domain/table.ts +1 -1
  346. package/src/schema/subject/table.ts +1 -1
  347. package/src/server.ts +130 -0
  348. package/src/testing/contract-testing.ts +437 -0
  349. package/src/types/context.ts +1 -1
  350. package/src/types/index.ts +2 -2
  351. package/src/types/options.ts +38 -3
  352. package/src/types/plugins.ts +3 -4
  353. package/dist/index.cjs +0 -3706
  354. package/dist/index.d.ts +0 -11
  355. package/dist/index.d.ts.map +0 -1
  356. package/dist/init.test.d.ts +0 -2
  357. package/dist/init.test.d.ts.map +0 -1
  358. package/dist/integrations/cloudflare.cjs +0 -312
  359. package/dist/integrations/cloudflare.d.ts +0 -32
  360. package/dist/integrations/cloudflare.d.ts.map +0 -1
  361. package/dist/integrations/cloudflare.js +0 -278
  362. package/dist/integrations/next.cjs +0 -276
  363. package/dist/integrations/next.d.ts +0 -68
  364. package/dist/integrations/next.d.ts.map +0 -1
  365. package/dist/integrations/next.js +0 -239
  366. package/dist/integrations/node.cjs +0 -257
  367. package/dist/integrations/node.d.ts +0 -29
  368. package/dist/integrations/node.d.ts.map +0 -1
  369. package/dist/integrations/node.js +0 -223
  370. package/dist/pkgs/api-router/index.d.ts +0 -9
  371. package/dist/pkgs/api-router/index.d.ts.map +0 -1
  372. package/dist/pkgs/api-router/utils/define-route.d.ts +0 -87
  373. package/dist/pkgs/api-router/utils/define-route.d.ts.map +0 -1
  374. package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts +0 -2
  375. package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts.map +0 -1
  376. package/dist/pkgs/logger/__tests__/integration.test.d.ts +0 -2
  377. package/dist/pkgs/logger/__tests__/integration.test.d.ts.map +0 -1
  378. package/dist/pkgs/logger/__tests__/log-levels.test.d.ts +0 -2
  379. package/dist/pkgs/logger/__tests__/log-levels.test.d.ts.map +0 -1
  380. package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts +0 -2
  381. package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts.map +0 -1
  382. package/dist/pkgs/logger/__tests__/result-logging.test.d.ts +0 -2
  383. package/dist/pkgs/logger/__tests__/result-logging.test.d.ts.map +0 -1
  384. package/dist/pkgs/logger/__tests__/types.test.d.ts +0 -2
  385. package/dist/pkgs/logger/__tests__/types.test.d.ts.map +0 -1
  386. package/dist/pkgs/logger/console-formatter.d.ts +0 -56
  387. package/dist/pkgs/logger/console-formatter.d.ts.map +0 -1
  388. package/dist/pkgs/logger/index.cjs +0 -240
  389. package/dist/pkgs/logger/index.d.ts +0 -35
  390. package/dist/pkgs/logger/index.d.ts.map +0 -1
  391. package/dist/pkgs/logger/index.js +0 -185
  392. package/dist/pkgs/logger/log-levels.d.ts +0 -29
  393. package/dist/pkgs/logger/log-levels.d.ts.map +0 -1
  394. package/dist/pkgs/logger/logger-factory.d.ts +0 -42
  395. package/dist/pkgs/logger/logger-factory.d.ts.map +0 -1
  396. package/dist/pkgs/logger/result-logging.d.ts +0 -71
  397. package/dist/pkgs/logger/result-logging.d.ts.map +0 -1
  398. package/dist/pkgs/logger/telemetry.d.ts +0 -14
  399. package/dist/pkgs/logger/telemetry.d.ts.map +0 -1
  400. package/dist/pkgs/logger/types.d.ts +0 -121
  401. package/dist/pkgs/logger/types.d.ts.map +0 -1
  402. package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts +0 -2
  403. package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts.map +0 -1
  404. package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts +0 -2
  405. package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts.map +0 -1
  406. package/dist/pkgs/results/h3-integration.d.ts +0 -52
  407. package/dist/pkgs/results/h3-integration.d.ts.map +0 -1
  408. package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts +0 -101
  409. package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts.map +0 -1
  410. package/dist/pkgs/results/pipeline/validation-pipeline.d.ts +0 -89
  411. package/dist/pkgs/results/pipeline/validation-pipeline.d.ts.map +0 -1
  412. package/dist/response-types.d.ts +0 -19
  413. package/dist/response-types.d.ts.map +0 -1
  414. package/dist/routes/__test__/index.test.d.ts +0 -17
  415. package/dist/routes/__test__/index.test.d.ts.map +0 -1
  416. package/dist/routes/__test__/set-consent.test.d.ts +0 -2
  417. package/dist/routes/__test__/set-consent.test.d.ts.map +0 -1
  418. package/dist/routes/__test__/show-consent-banner.test.d.ts +0 -2
  419. package/dist/routes/__test__/show-consent-banner.test.d.ts.map +0 -1
  420. package/dist/routes/__test__/status.test.d.ts +0 -2
  421. package/dist/routes/__test__/status.test.d.ts.map +0 -1
  422. package/dist/routes/__test__/verify-consent.test.d.ts +0 -2
  423. package/dist/routes/__test__/verify-consent.test.d.ts.map +0 -1
  424. package/dist/routes/index.d.ts +0 -3
  425. package/dist/routes/index.d.ts.map +0 -1
  426. package/dist/routes/set-consent.d.ts +0 -89
  427. package/dist/routes/set-consent.d.ts.map +0 -1
  428. package/dist/routes/show-consent-banner.d.ts +0 -15
  429. package/dist/routes/show-consent-banner.d.ts.map +0 -1
  430. package/dist/routes/status.d.ts +0 -44
  431. package/dist/routes/status.d.ts.map +0 -1
  432. package/dist/routes/types.d.ts +0 -7
  433. package/dist/routes/types.d.ts.map +0 -1
  434. package/dist/routes/verify-consent.d.ts +0 -38
  435. package/dist/routes/verify-consent.d.ts.map +0 -1
  436. package/src/docs/ADVANCED_JSON_HANDLING.md +0 -99
  437. package/src/docs/neverthrow.md +0 -171
  438. package/src/index.ts +0 -34
  439. package/src/init.test.ts +0 -236
  440. package/src/integrations/cloudflare.ts +0 -269
  441. package/src/integrations/next.ts +0 -204
  442. package/src/integrations/node.ts +0 -141
  443. package/src/pkgs/api-router/index.ts +0 -148
  444. package/src/pkgs/api-router/types/h3.d.ts +0 -42
  445. package/src/pkgs/api-router/utils/define-route.ts +0 -410
  446. package/src/pkgs/logger/README.md +0 -213
  447. package/src/pkgs/logger/__tests__/console-formatter.test.ts +0 -67
  448. package/src/pkgs/logger/__tests__/integration.test.ts +0 -184
  449. package/src/pkgs/logger/__tests__/log-levels.test.ts +0 -77
  450. package/src/pkgs/logger/__tests__/logger-factory.test.ts +0 -156
  451. package/src/pkgs/logger/__tests__/result-logging.test.ts +0 -209
  452. package/src/pkgs/logger/__tests__/types.test.ts +0 -94
  453. package/src/pkgs/logger/console-formatter.ts +0 -75
  454. package/src/pkgs/logger/doc.md +0 -569
  455. package/src/pkgs/logger/index.ts +0 -59
  456. package/src/pkgs/logger/log-levels.ts +0 -46
  457. package/src/pkgs/logger/logger-factory.ts +0 -121
  458. package/src/pkgs/logger/result-logging.ts +0 -134
  459. package/src/pkgs/logger/telemetry.ts +0 -96
  460. package/src/pkgs/logger/types.ts +0 -138
  461. package/src/pkgs/results/__tests__/retrieval-pipeline.test.ts +0 -157
  462. package/src/pkgs/results/__tests__/validation-pipeline.test.ts +0 -151
  463. package/src/pkgs/results/h3-integration.ts +0 -142
  464. package/src/pkgs/results/pipeline/retrieval-pipeline.ts +0 -188
  465. package/src/pkgs/results/pipeline/validation-pipeline.ts +0 -164
  466. package/src/plugins/.keep +0 -0
  467. package/src/response-types.ts +0 -29
  468. package/src/routes/__test__/index.test.ts +0 -112
  469. package/src/routes/__test__/set-consent.test.ts +0 -242
  470. package/src/routes/__test__/show-consent-banner.test.ts +0 -98
  471. package/src/routes/__test__/status.test.ts +0 -64
  472. package/src/routes/__test__/verify-consent.test.ts +0 -266
  473. package/src/routes/index.ts +0 -12
  474. package/src/routes/set-consent.ts +0 -249
  475. package/src/routes/show-consent-banner.ts +0 -131
  476. package/src/routes/status.ts +0 -61
  477. package/src/routes/types.ts +0 -7
  478. package/src/routes/verify-consent.ts +0 -206
@@ -1,121 +0,0 @@
1
- import { formatMessage } from './console-formatter';
2
- import { levels, shouldPublishLog } from './log-levels';
3
- import { withLogSpan } from './telemetry';
4
- import type { LogEntry, LogLevel, Logger, LoggerOptions } from './types';
5
-
6
- /**
7
- * Creates a configured logger instance with methods for each log level.
8
- *
9
- * @param options - Configuration options for the logger or an existing logger instance
10
- * @returns An object with methods for each log level
11
- *
12
- * @example
13
- * ```ts
14
- * // Create a logger that only shows warnings and errors
15
- * const logger = createLogger({ level: 'warn', appName: 'c15t' });
16
- *
17
- * // These will be output
18
- * logger.error('This is an error');
19
- * logger.warn('This is a warning');
20
- *
21
- * // These will be suppressed
22
- * logger.info('This info won\'t be shown');
23
- * logger.debug('This debug message won\'t be shown');
24
- * ```
25
- *
26
- * @public
27
- */
28
- export const createLogger = (options?: LoggerOptions | Logger): Logger => {
29
- // If options is already a Logger instance, return it
30
- if (
31
- options &&
32
- typeof options === 'object' &&
33
- levels.every((level) => typeof (options as Logger)[level] === 'function')
34
- ) {
35
- return options as Logger;
36
- }
37
-
38
- // Otherwise, treat options as LoggerOptions
39
- const loggerOptions = options as LoggerOptions;
40
- const enabled = loggerOptions?.disabled !== true;
41
- const logLevel = loggerOptions?.level ?? 'error';
42
- const appName = loggerOptions?.appName ?? 'c15t';
43
-
44
- /**
45
- * Internal function that handles the actual logging logic.
46
- *
47
- * @param level - The severity level of the log
48
- * @param message - The message to log
49
- * @param args - Additional data to include in the log
50
- *
51
- * @internal
52
- */
53
- const logFunc = async (
54
- level: LogLevel,
55
- message: string,
56
- args: unknown[] = []
57
- ): Promise<void> => {
58
- if (!enabled || !shouldPublishLog(logLevel, level)) {
59
- return;
60
- }
61
-
62
- await withLogSpan(level, message, args, async () => {
63
- const formattedMessage = formatMessage(level, message, appName);
64
-
65
- if (!loggerOptions || typeof loggerOptions.log !== 'function') {
66
- if (level === 'error') {
67
- // biome-ignore lint/suspicious/noConsole: Logger implementation
68
- console.error(formattedMessage, ...args);
69
- } else if (level === 'warn') {
70
- // biome-ignore lint/suspicious/noConsole: Logger implementation
71
- console.warn(formattedMessage, ...args);
72
- } else if (level === 'info') {
73
- // biome-ignore lint/suspicious/noConsole: Logger implementation
74
- // biome-ignore lint/suspicious/noConsoleLog: Logger implementation
75
- console.log(formattedMessage, ...args);
76
- } else if (level === 'debug') {
77
- // biome-ignore lint/suspicious/noConsole: Logger implementation
78
- console.debug(formattedMessage, ...args);
79
- } else if (level === 'success') {
80
- // biome-ignore lint/suspicious/noConsole: Logger implementation
81
- // biome-ignore lint/suspicious/noConsoleLog: Logger implementation
82
- console.log(formattedMessage, ...args);
83
- }
84
- return;
85
- }
86
-
87
- loggerOptions.log(level === 'success' ? 'info' : level, message, ...args);
88
- });
89
- };
90
-
91
- return Object.fromEntries(
92
- levels.map((level) => [
93
- level,
94
- (...[message, ...args]: LogEntry) => {
95
- // Return the promise but don't await it
96
- return logFunc(level, message, args).catch((error) => {
97
- // biome-ignore lint/suspicious/noConsole: <explanation>
98
- console.error('Logger error:', error);
99
- });
100
- },
101
- ])
102
- ) as unknown as Logger;
103
- };
104
-
105
- /**
106
- * Default logger instance with standard configuration.
107
- *
108
- * @remarks
109
- * Ready-to-use logger with default settings (logs errors only).
110
- *
111
- * @example
112
- * ```ts
113
- * import { logger } from '@doubletie/logger';
114
- *
115
- * logger.error('Something went wrong');
116
- * logger.info('This won\'t be shown with default settings');
117
- * ```
118
- *
119
- * @public
120
- */
121
- export const logger = createLogger();
@@ -1,134 +0,0 @@
1
- import { SpanStatusCode } from '@opentelemetry/api';
2
- import type { Result, ResultAsync } from 'neverthrow';
3
- import { getTracer } from './telemetry';
4
- import type { LoggableError } from './types';
5
-
6
- /**
7
- * Logs any errors in a Result without changing the Result.
8
- *
9
- * @remarks
10
- * This utility function allows logging errors from a Result type without
11
- * affecting the Result's flow. It uses the mapErr function to extract
12
- * and log the error if present, then returns the original Result.
13
- *
14
- * @typeParam ValueType - The type of the successful value in the Result
15
- * @typeParam ErrorType - The type of the error in the Result, must extend LoggableError
16
- *
17
- * @param result - The Result that may contain an error
18
- * @param logger - Logger instance with an error method
19
- * @param message - Optional message prefix for the error
20
- * @returns The original Result unchanged
21
- *
22
- * @example
23
- * ```ts
24
- * import { logResult } from '@doubletie/logger';
25
- * import { createLogger } from '@doubletie/logger';
26
- * import { ok, err } from 'neverthrow';
27
- *
28
- * const logger = createLogger();
29
- * const result = err({ message: 'Failed operation', code: 'OP_FAILED' });
30
- *
31
- * // Log the error but continue processing the Result
32
- * const processedResult = logResult(result, logger);
33
- * ```
34
- *
35
- * @public
36
- */
37
- export const logResult = <ValueType, ErrorType extends LoggableError>(
38
- result: Result<ValueType, ErrorType>,
39
- logger: { error: (message: string, ...args: unknown[]) => void },
40
- message = 'Error occurred:'
41
- ): Result<ValueType, ErrorType> => {
42
- const tracer = getTracer();
43
- const span = tracer.startSpan('log_result');
44
-
45
- return result.mapErr((error) => {
46
- span.setAttributes({
47
- 'error.message': error.message,
48
- 'error.code': error.code,
49
- 'error.status': error.status,
50
- 'error.category': error.category,
51
- 'error.has_meta': !!error.meta,
52
- });
53
- span.setStatus({
54
- code: SpanStatusCode.ERROR,
55
- message: error.message,
56
- });
57
-
58
- logger.error(`${message} ${error.message}`, {
59
- code: error.code,
60
- status: error.status,
61
- meta: error.meta,
62
- category: error.category,
63
- stack: error.stack,
64
- });
65
-
66
- span.end();
67
- return error;
68
- });
69
- };
70
-
71
- /**
72
- * Logs any errors in a ResultAsync without changing the ResultAsync.
73
- *
74
- * @remarks
75
- * This utility function allows logging errors from a ResultAsync type without
76
- * affecting the ResultAsync's flow. It uses the mapErr function to extract
77
- * and log the error if present, then returns the original ResultAsync.
78
- *
79
- * @typeParam ValueType - The type of the successful value in the ResultAsync
80
- * @typeParam ErrorType - The type of the error in the ResultAsync, must extend LoggableError
81
- *
82
- * @param resultAsync - The ResultAsync that may contain an error
83
- * @param logger - Logger instance with an error method
84
- * @param message - Optional message prefix for the error
85
- * @returns The original ResultAsync unchanged
86
- *
87
- * @example
88
- * ```ts
89
- * import { logResultAsync } from '@doubletie/logger';
90
- * import { createLogger } from '@doubletie/logger';
91
- * import { okAsync, errAsync } from 'neverthrow';
92
- *
93
- * const logger = createLogger();
94
- * const resultAsync = errAsync({ message: 'Failed async operation', code: 'ASYNC_FAILED' });
95
- *
96
- * // Log the error but continue processing the ResultAsync
97
- * const processedResultAsync = logResultAsync(resultAsync, logger);
98
- * ```
99
- *
100
- * @public
101
- */
102
- export const logResultAsync = <ValueType, ErrorType extends LoggableError>(
103
- resultAsync: ResultAsync<ValueType, ErrorType>,
104
- logger: { error: (message: string, ...args: unknown[]) => void },
105
- message = 'Error occurred:'
106
- ): ResultAsync<ValueType, ErrorType> => {
107
- const tracer = getTracer();
108
- const span = tracer.startSpan('log_result_async');
109
-
110
- return resultAsync.mapErr((error) => {
111
- span.setAttributes({
112
- 'error.message': error.message,
113
- 'error.code': error.code,
114
- 'error.status': error.status,
115
- 'error.category': error.category,
116
- 'error.has_meta': !!error.meta,
117
- });
118
- span.setStatus({
119
- code: SpanStatusCode.ERROR,
120
- message: error.message,
121
- });
122
-
123
- logger.error(`${message} ${error.message}`, {
124
- code: error.code,
125
- status: error.status,
126
- meta: error.meta,
127
- category: error.category,
128
- stack: error.stack,
129
- });
130
-
131
- span.end();
132
- return error;
133
- });
134
- };
@@ -1,96 +0,0 @@
1
- import { SpanStatusCode, trace } from '@opentelemetry/api';
2
- import type { LogLevel, LoggerOptions } from './types';
3
-
4
- const LOGGER_TRACER_NAME = '@doubletie/logger';
5
-
6
- /**
7
- * Maps log levels to OpenTelemetry span status codes
8
- */
9
- const LOG_LEVEL_TO_SPAN_STATUS: Record<LogLevel, SpanStatusCode> = {
10
- error: SpanStatusCode.ERROR,
11
- warn: SpanStatusCode.OK,
12
- info: SpanStatusCode.OK,
13
- success: SpanStatusCode.OK,
14
- debug: SpanStatusCode.OK,
15
- };
16
-
17
- /**
18
- * Gets or creates a tracer for the logger package
19
- */
20
- export const getTracer = (options?: LoggerOptions) => {
21
- if (options?.telemetry?.tracer) {
22
- return options.telemetry.tracer;
23
- }
24
- return trace.getTracer(LOGGER_TRACER_NAME);
25
- };
26
-
27
- /**
28
- * Creates a span for a log entry and sets appropriate attributes
29
- */
30
- export const createLogSpan = (
31
- level: LogLevel,
32
- message: string,
33
- args: unknown[] = [],
34
- options?: LoggerOptions
35
- ) => {
36
- if (options?.telemetry?.disabled) {
37
- return null;
38
- }
39
-
40
- const tracer = getTracer(options);
41
- const span = tracer.startSpan('log_entry', {
42
- attributes: {
43
- 'log.level': level,
44
- 'log.message': message,
45
- 'log.has_args': args.length > 0,
46
- ...(options?.telemetry?.defaultAttributes || {}),
47
- },
48
- });
49
-
50
- // Add any structured data as span attributes
51
- if (args.length > 0 && typeof args[0] === 'object' && args[0] !== null) {
52
- const data = args[0] as Record<string, unknown>;
53
- for (const [key, value] of Object.entries(data)) {
54
- if (value !== undefined && value !== null) {
55
- span.setAttribute(`log.data.${key}`, String(value));
56
- }
57
- }
58
- }
59
-
60
- // Set span status based on log level
61
- span.setStatus({
62
- code: LOG_LEVEL_TO_SPAN_STATUS[level],
63
- message: level === 'error' || level === 'warn' ? message : undefined,
64
- });
65
-
66
- return span;
67
- };
68
-
69
- /**
70
- * Wraps a logging operation in a span
71
- */
72
- export const withLogSpan = async <T>(
73
- level: LogLevel,
74
- message: string,
75
- args: unknown[],
76
- operation: () => T | Promise<T>,
77
- options?: LoggerOptions
78
- ): Promise<T> => {
79
- const span = createLogSpan(level, message, args, options);
80
- if (!span) {
81
- return operation();
82
- }
83
-
84
- try {
85
- const result = await operation();
86
- return result;
87
- } catch (error) {
88
- span.setStatus({
89
- code: SpanStatusCode.ERROR,
90
- message: error instanceof Error ? error.message : String(error),
91
- });
92
- throw error;
93
- } finally {
94
- span.end();
95
- }
96
- };
@@ -1,138 +0,0 @@
1
- import type { Tracer } from '@opentelemetry/api';
2
-
3
- /**
4
- * Represents the available log severity levels.
5
- *
6
- * @remarks
7
- * These levels determine the priority and visibility of log messages.
8
- * The order from highest to lowest severity is:
9
- * error > warn > info > success > debug
10
- *
11
- * @public
12
- */
13
- export type LogLevel = 'info' | 'success' | 'warn' | 'error' | 'debug';
14
-
15
- /**
16
- * Configuration interface for logger instances.
17
- *
18
- * @remarks
19
- * Provides options to customize logger behavior including
20
- * disabling logs, setting log levels, and custom log handlers.
21
- *
22
- * @public
23
- */
24
- export interface LoggerOptions {
25
- /**
26
- * Whether logging is disabled.
27
- *
28
- * @remarks
29
- * When true, no logs will be published regardless of log level.
30
- */
31
- disabled?: boolean;
32
-
33
- /**
34
- * The minimum log level to publish.
35
- *
36
- * @remarks
37
- * Only logs with this level or higher severity will be published.
38
- * Note that 'success' is treated as 'info' when using custom log handlers.
39
- */
40
- level?: Exclude<LogLevel, 'success'>;
41
-
42
- /**
43
- * Custom log handler function.
44
- *
45
- * @remarks
46
- * When provided, this function will be called instead of console methods.
47
- *
48
- * @param level - The severity level of the log message
49
- * @param message - The message to log
50
- * @param args - Additional data to include in the log
51
- */
52
- log?: (level: LogLevel, message: string, ...args: unknown[]) => void;
53
-
54
- /**
55
- * Custom application name to display in log messages.
56
- *
57
- * @remarks
58
- * When provided, this will override the default app name in the log format.
59
- *
60
- * @default '🪢 doubletie'
61
- */
62
- appName?: string;
63
-
64
- /**
65
- * OpenTelemetry configuration options
66
- */
67
- telemetry?: {
68
- /**
69
- * Custom tracer to use for OpenTelemetry integration
70
- */
71
- tracer?: Tracer;
72
-
73
- /**
74
- * Whether to disable OpenTelemetry tracing
75
- */
76
- disabled?: boolean;
77
-
78
- /**
79
- * Additional attributes to add to all spans
80
- */
81
- defaultAttributes?: Record<string, string | number | boolean>;
82
- };
83
- }
84
-
85
- /**
86
- * Type representing the parameters for log handlers.
87
- *
88
- * @remarks
89
- * This utility type extracts parameter types from the Logger.log function,
90
- * excluding the first parameter (log level).
91
- *
92
- * @internal
93
- */
94
- export type LogEntry = Parameters<NonNullable<LoggerOptions['log']>> extends [
95
- LogLevel,
96
- ...infer Rest,
97
- ]
98
- ? Rest
99
- : never;
100
-
101
- /**
102
- * Type representing a logger instance with methods for each log level.
103
- *
104
- * @remarks
105
- * Each method corresponds to a log level and accepts a message and optional arguments.
106
- *
107
- * @public
108
- */
109
- export type Logger = Record<LogLevel, (...params: LogEntry) => void>;
110
-
111
- /**
112
- * Base error interface that must be implemented by errors used with the logger.
113
- *
114
- * @remarks
115
- * This interface defines the minimum properties an error object should have
116
- * to work properly with the logging utilities.
117
- *
118
- * @public
119
- */
120
- export interface LoggableError {
121
- /** The error message */
122
- message: string;
123
-
124
- /** Optional error code */
125
- code?: string | number;
126
-
127
- /** Optional HTTP status code */
128
- status?: number;
129
-
130
- /** Optional additional error metadata */
131
- meta?: Record<string, unknown>;
132
-
133
- /** Optional error category */
134
- category?: string;
135
-
136
- /** Error stack trace */
137
- stack?: string;
138
- }
@@ -1,157 +0,0 @@
1
- import { beforeEach, describe, expect, it, vi } from 'vitest';
2
- import { DoubleTieError } from '../core/error-class';
3
- import { ERROR_CODES } from '../core/error-codes';
4
- import { retrievalPipeline } from '../pipeline/retrieval-pipeline';
5
-
6
- describe('retrievalPipeline', () => {
7
- // Setup test data
8
- const mockUser = { id: '123', name: 'John Doe', email: 'john@example.com' };
9
-
10
- // Mock fetcher and transformer functions
11
- let fetcher: ReturnType<typeof vi.fn>;
12
- let transformer: ReturnType<typeof vi.fn>;
13
-
14
- beforeEach(() => {
15
- fetcher = vi.fn();
16
- transformer = vi.fn().mockImplementation((data) => ({
17
- ...data,
18
- displayName: `${data.name} <${data.email}>`,
19
- }));
20
- });
21
-
22
- it('should return a function that returns a ResultAsync', () => {
23
- fetcher.mockResolvedValue(mockUser);
24
-
25
- const retrieveUser = retrievalPipeline(fetcher, transformer);
26
-
27
- expect(typeof retrieveUser).toBe('function');
28
-
29
- const result = retrieveUser();
30
- expect(result).toHaveProperty('then');
31
- expect(result).toHaveProperty('map');
32
- expect(result).toHaveProperty('mapErr');
33
- });
34
-
35
- it('should transform data successfully when fetcher resolves', async () => {
36
- fetcher.mockResolvedValue(mockUser);
37
-
38
- const retrieveUser = retrievalPipeline(fetcher, transformer);
39
- const result = await retrieveUser();
40
-
41
- expect(result.isOk()).toBe(true);
42
- expect(result._unsafeUnwrap()).toEqual({
43
- id: '123',
44
- name: 'John Doe',
45
- email: 'john@example.com',
46
- displayName: 'John Doe <john@example.com>',
47
- });
48
-
49
- // Verify fetcher and transformer were called correctly
50
- expect(fetcher).toHaveBeenCalledTimes(1);
51
- expect(transformer).toHaveBeenCalledWith(mockUser);
52
- });
53
-
54
- it('should return a not found error when fetcher resolves with null', async () => {
55
- fetcher.mockResolvedValue(null);
56
-
57
- const retrieveUser = retrievalPipeline(fetcher, transformer);
58
- const result = await retrieveUser();
59
-
60
- expect(result.isErr()).toBe(true);
61
- const error = result._unsafeUnwrapErr();
62
-
63
- expect(error).toBeInstanceOf(DoubleTieError);
64
- expect(error.code).toBe(ERROR_CODES.NOT_FOUND);
65
- expect(error.statusCode).toBe(404);
66
- expect(error.message).toBe('Resource not found');
67
-
68
- // Verify fetcher was called but transformer wasn't
69
- expect(fetcher).toHaveBeenCalledTimes(1);
70
- expect(transformer).not.toHaveBeenCalled();
71
- });
72
-
73
- it('should return a not found error when fetcher resolves with undefined', async () => {
74
- fetcher.mockResolvedValue(undefined);
75
-
76
- const retrieveUser = retrievalPipeline(fetcher, transformer);
77
- const result = await retrieveUser();
78
-
79
- expect(result.isErr()).toBe(true);
80
- const error = result._unsafeUnwrapErr();
81
-
82
- expect(error).toBeInstanceOf(DoubleTieError);
83
- expect(error.code).toBe(ERROR_CODES.NOT_FOUND);
84
- expect(error.statusCode).toBe(404);
85
- });
86
-
87
- it('should return a not found error when fetcher rejects with not found message', async () => {
88
- const notFoundError = new Error('Resource not found');
89
- fetcher.mockRejectedValue(notFoundError);
90
-
91
- const retrieveUser = retrievalPipeline(fetcher, transformer);
92
- const result = await retrieveUser();
93
-
94
- expect(result.isErr()).toBe(true);
95
- const error = result._unsafeUnwrapErr();
96
-
97
- expect(error).toBeInstanceOf(DoubleTieError);
98
- expect(error.code).toBe(ERROR_CODES.NOT_FOUND);
99
- expect(error.statusCode).toBe(404);
100
- expect(error.cause).toBe(notFoundError);
101
- });
102
-
103
- it('should return a bad request error when fetcher rejects with other error', async () => {
104
- const connectionError = new Error('Database connection failed');
105
- fetcher.mockRejectedValue(connectionError);
106
-
107
- const retrieveUser = retrievalPipeline(fetcher, transformer);
108
- const result = await retrieveUser();
109
-
110
- expect(result.isErr()).toBe(true);
111
- const error = result._unsafeUnwrapErr();
112
-
113
- expect(error).toBeInstanceOf(DoubleTieError);
114
- expect(error.code).toBe(ERROR_CODES.BAD_REQUEST);
115
- expect(error.statusCode).toBe(400);
116
- expect(error.cause).toBe(connectionError);
117
- });
118
-
119
- it('should use a custom error code when provided', async () => {
120
- const notFoundError = new Error('Record not found');
121
- fetcher.mockRejectedValue(notFoundError);
122
-
123
- const customErrorCode = 'CUSTOM_NOT_FOUND_ERROR';
124
- const retrieveUser = retrievalPipeline(
125
- fetcher,
126
- transformer,
127
- customErrorCode
128
- );
129
- const result = await retrieveUser();
130
-
131
- expect(result.isErr()).toBe(true);
132
- const error = result._unsafeUnwrapErr();
133
-
134
- expect(error).toBeInstanceOf(DoubleTieError);
135
- expect(error.code).toBe(customErrorCode);
136
- });
137
-
138
- it('should return a bad request error when transformer throws', async () => {
139
- fetcher.mockResolvedValue(mockUser);
140
-
141
- const transformerError = new Error('Transformation failed');
142
- transformer.mockImplementation(() => {
143
- throw transformerError;
144
- });
145
-
146
- const retrieveUser = retrievalPipeline(fetcher, transformer);
147
- const result = await retrieveUser();
148
-
149
- expect(result.isErr()).toBe(true);
150
- const error = result._unsafeUnwrapErr();
151
-
152
- expect(error).toBeInstanceOf(DoubleTieError);
153
- expect(error.code).toBe(ERROR_CODES.BAD_REQUEST);
154
- expect(error.statusCode).toBe(400);
155
- expect(error.cause).toBe(transformerError);
156
- });
157
- });