@geekmidas/constructs 10.0.0-alpha.37 → 10.0.0-alpha.39

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 (267) hide show
  1. package/README.md +156 -155
  2. package/dist/{Construct-Detz65RA.mjs → Construct-BO1X-kt9.mjs} +3 -6
  3. package/dist/Construct-BO1X-kt9.mjs.map +1 -0
  4. package/dist/Construct-BQALFCh2.d.cts +230 -0
  5. package/dist/Construct-BQALFCh2.d.cts.map +1 -0
  6. package/dist/{Construct-yG9Sw-5p.cjs → Construct-DmvXceVY.cjs} +3 -6
  7. package/dist/Construct-DmvXceVY.cjs.map +1 -0
  8. package/dist/Construct-QXnl3VqT.d.mts +230 -0
  9. package/dist/Construct-QXnl3VqT.d.mts.map +1 -0
  10. package/dist/{Cron-CA2oa2nC.d.cts → Cron-CMEGfRs8.d.cts} +7 -5
  11. package/dist/Cron-CMEGfRs8.d.cts.map +1 -0
  12. package/dist/{Cron-B_iuyNxr.d.mts → Cron-D6X4-xjB.d.mts} +7 -5
  13. package/dist/Cron-D6X4-xjB.d.mts.map +1 -0
  14. package/dist/{CronBuilder-B_KqaodP.d.cts → CronBuilder-CEK7aOqD.d.cts} +21 -16
  15. package/dist/CronBuilder-CEK7aOqD.d.cts.map +1 -0
  16. package/dist/{CronBuilder-BbnT7tqo.cjs → CronBuilder-DB35T5dL.cjs} +13 -11
  17. package/dist/CronBuilder-DB35T5dL.cjs.map +1 -0
  18. package/dist/{CronBuilder-BRkzUOAs.mjs → CronBuilder-Dv0IlZs0.mjs} +14 -12
  19. package/dist/CronBuilder-Dv0IlZs0.mjs.map +1 -0
  20. package/dist/{CronBuilder-BIKCLWu7.d.mts → CronBuilder-O_gvButp.d.mts} +21 -16
  21. package/dist/CronBuilder-O_gvButp.d.mts.map +1 -0
  22. package/dist/{Endpoint-DO332Dnm.mjs → Endpoint-CQAeh1Rh.mjs} +5 -5
  23. package/dist/Endpoint-CQAeh1Rh.mjs.map +1 -0
  24. package/dist/{Endpoint-QKuFg5gs.cjs → Endpoint-D1L9qu5C.cjs} +5 -5
  25. package/dist/Endpoint-D1L9qu5C.cjs.map +1 -0
  26. package/dist/{Endpoint-1-XYQSx0.d.cts → Endpoint-Dp5AKIXl.d.cts} +10 -13
  27. package/dist/Endpoint-Dp5AKIXl.d.cts.map +1 -0
  28. package/dist/{Endpoint-GFIxYb9L.d.mts → Endpoint-DtI7heFm.d.mts} +10 -13
  29. package/dist/Endpoint-DtI7heFm.d.mts.map +1 -0
  30. package/dist/{EndpointFactory-B9HAjDAP.mjs → EndpointFactory-BBdNeaGJ.mjs} +23 -52
  31. package/dist/EndpointFactory-BBdNeaGJ.mjs.map +1 -0
  32. package/dist/{EndpointFactory-BmO0WnXE.cjs → EndpointFactory-BZOCOaK6.cjs} +22 -51
  33. package/dist/EndpointFactory-BZOCOaK6.cjs.map +1 -0
  34. package/dist/{EndpointFactory-BCZdh_u3.d.mts → EndpointFactory-CgMDvERK.d.mts} +58 -48
  35. package/dist/EndpointFactory-CgMDvERK.d.mts.map +1 -0
  36. package/dist/{EndpointFactory-BnK_YkW1.d.cts → EndpointFactory-FeFRmlDZ.d.cts} +58 -48
  37. package/dist/EndpointFactory-FeFRmlDZ.d.cts.map +1 -0
  38. package/dist/{HonoEndpointAdaptor-CiqAZ5Mt.mjs → HonoEndpointAdaptor-Aui-x9Lg.mjs} +4 -3
  39. package/dist/HonoEndpointAdaptor-Aui-x9Lg.mjs.map +1 -0
  40. package/dist/{HonoEndpointAdaptor-DoEQdC3r.cjs → HonoEndpointAdaptor-Cq99r9H7.cjs} +5 -4
  41. package/dist/HonoEndpointAdaptor-Cq99r9H7.cjs.map +1 -0
  42. package/dist/{Queue-DpKTLl6E.mjs → Queue-C1uDgjxt.mjs} +29 -48
  43. package/dist/Queue-C1uDgjxt.mjs.map +1 -0
  44. package/dist/{Queue-B7yRXQmL.cjs → Queue-Ckmudcm8.cjs} +29 -48
  45. package/dist/Queue-Ckmudcm8.cjs.map +1 -0
  46. package/dist/{Queue-Bhzi2WQC.d.cts → Queue-CpQIGB_2.d.cts} +22 -33
  47. package/dist/Queue-CpQIGB_2.d.cts.map +1 -0
  48. package/dist/{Queue-BoUA-e83.d.mts → Queue-YmvN2vEP.d.mts} +21 -32
  49. package/dist/Queue-YmvN2vEP.d.mts.map +1 -0
  50. package/dist/QueueBuilder-CJNcv4dy.cjs +112 -0
  51. package/dist/QueueBuilder-CJNcv4dy.cjs.map +1 -0
  52. package/dist/QueueBuilder-CM0WUxfw.d.mts +62 -0
  53. package/dist/QueueBuilder-CM0WUxfw.d.mts.map +1 -0
  54. package/dist/QueueBuilder-XEnnOWGe.d.cts +62 -0
  55. package/dist/QueueBuilder-XEnnOWGe.d.cts.map +1 -0
  56. package/dist/QueueBuilder-XuPKZwKH.mjs +95 -0
  57. package/dist/QueueBuilder-XuPKZwKH.mjs.map +1 -0
  58. package/dist/{Subscriber-DQCaiOXF.d.cts → Subscriber-B91YSkZt.d.cts} +12 -13
  59. package/dist/Subscriber-B91YSkZt.d.cts.map +1 -0
  60. package/dist/{Subscriber-CIO3pwji.d.mts → Subscriber-BjHYe5hK.d.mts} +11 -12
  61. package/dist/Subscriber-BjHYe5hK.d.mts.map +1 -0
  62. package/dist/{SubscriberBuilder-CjDGSTZc.d.cts → SubscriberBuilder-BSpQX1JT.d.cts} +19 -23
  63. package/dist/SubscriberBuilder-BSpQX1JT.d.cts.map +1 -0
  64. package/dist/{SubscriberBuilder-C2FRfd26.d.mts → SubscriberBuilder-BhMphk4z.d.mts} +18 -22
  65. package/dist/SubscriberBuilder-BhMphk4z.d.mts.map +1 -0
  66. package/dist/{SubscriberBuilder-C2bCOuPT.cjs → SubscriberBuilder-Duk028pD.cjs} +11 -19
  67. package/dist/SubscriberBuilder-Duk028pD.cjs.map +1 -0
  68. package/dist/{SubscriberBuilder-B4YRTBng.mjs → SubscriberBuilder-DzQUWE08.mjs} +11 -19
  69. package/dist/SubscriberBuilder-DzQUWE08.mjs.map +1 -0
  70. package/dist/{Topic-D5rlM9wS.cjs → Topic-BBVXC3H4.cjs} +46 -51
  71. package/dist/Topic-BBVXC3H4.cjs.map +1 -0
  72. package/dist/Topic-DOw051ch.mjs +98 -0
  73. package/dist/Topic-DOw051ch.mjs.map +1 -0
  74. package/dist/adaptors/aws.cjs +5 -5
  75. package/dist/adaptors/aws.cjs.map +1 -1
  76. package/dist/adaptors/aws.d.cts +26 -26
  77. package/dist/adaptors/aws.d.cts.map +1 -1
  78. package/dist/adaptors/aws.d.mts +25 -25
  79. package/dist/adaptors/aws.d.mts.map +1 -1
  80. package/dist/adaptors/aws.mjs +5 -5
  81. package/dist/adaptors/aws.mjs.map +1 -1
  82. package/dist/adaptors/hono.cjs +1 -1
  83. package/dist/adaptors/hono.d.cts +4 -5
  84. package/dist/adaptors/hono.d.cts.map +1 -1
  85. package/dist/adaptors/hono.d.mts +4 -5
  86. package/dist/adaptors/hono.d.mts.map +1 -1
  87. package/dist/adaptors/hono.mjs +1 -1
  88. package/dist/adaptors/testing.cjs +59 -23
  89. package/dist/adaptors/testing.cjs.map +1 -1
  90. package/dist/adaptors/testing.d.cts +40 -28
  91. package/dist/adaptors/testing.d.cts.map +1 -1
  92. package/dist/adaptors/testing.d.mts +40 -28
  93. package/dist/adaptors/testing.d.mts.map +1 -1
  94. package/dist/adaptors/testing.mjs +59 -23
  95. package/dist/adaptors/testing.mjs.map +1 -1
  96. package/dist/{auth-c6nWnvD8.d.cts → auth-CMwml9QN.d.mts} +4 -4
  97. package/dist/{auth-c6nWnvD8.d.cts.map → auth-CMwml9QN.d.mts.map} +1 -1
  98. package/dist/{auth-pS_U1H_X.d.mts → auth-rVRDjIw_.d.cts} +4 -4
  99. package/dist/{auth-pS_U1H_X.d.mts.map → auth-rVRDjIw_.d.cts.map} +1 -1
  100. package/dist/auth.d.cts +1 -1
  101. package/dist/auth.d.mts +1 -1
  102. package/dist/{cache-B2s0b-ss.d.mts → cache-C9a_hVCc.d.cts} +3 -3
  103. package/dist/{cache-B2s0b-ss.d.mts.map → cache-C9a_hVCc.d.cts.map} +1 -1
  104. package/dist/{cache-CYe2Kzjc.d.cts → cache-CeTMI8LR.d.mts} +3 -3
  105. package/dist/{cache-CYe2Kzjc.d.cts.map → cache-CeTMI8LR.d.mts.map} +1 -1
  106. package/dist/cache.d.cts +1 -1
  107. package/dist/cache.d.mts +1 -1
  108. package/dist/{construct-interface-D2gesxos.d.mts → construct-interface-_3zgxzXl.d.mts} +11 -20
  109. package/dist/{construct-interface-D2gesxos.d.mts.map → construct-interface-_3zgxzXl.d.mts.map} +1 -1
  110. package/dist/{construct-interface-DPusCUSQ.d.cts → construct-interface-_xi4BPN8.d.cts} +11 -20
  111. package/dist/{construct-interface-DPusCUSQ.d.cts.map → construct-interface-_xi4BPN8.d.cts.map} +1 -1
  112. package/dist/construct-interface.cjs +4 -33
  113. package/dist/construct-interface.cjs.map +1 -1
  114. package/dist/construct-interface.d.cts +2 -2
  115. package/dist/construct-interface.d.mts +2 -2
  116. package/dist/construct-interface.mjs +5 -32
  117. package/dist/construct-interface.mjs.map +1 -1
  118. package/dist/credential.cjs +22 -9
  119. package/dist/credential.cjs.map +1 -1
  120. package/dist/credential.d.cts +12 -2
  121. package/dist/credential.d.cts.map +1 -1
  122. package/dist/credential.d.mts +12 -2
  123. package/dist/credential.d.mts.map +1 -1
  124. package/dist/credential.mjs +22 -10
  125. package/dist/credential.mjs.map +1 -1
  126. package/dist/crons/index.cjs +1 -1
  127. package/dist/crons/index.d.cts +2 -2
  128. package/dist/crons/index.d.mts +2 -2
  129. package/dist/crons/index.mjs +1 -1
  130. package/dist/database/kysely.d.cts +1 -1
  131. package/dist/database/kysely.d.mts +1 -1
  132. package/dist/email.d.cts +1 -1
  133. package/dist/email.d.mts +1 -1
  134. package/dist/endpoints/index.cjs +5 -4
  135. package/dist/endpoints/index.d.cts +4 -13
  136. package/dist/endpoints/index.d.cts.map +1 -1
  137. package/dist/endpoints/index.d.mts +4 -13
  138. package/dist/endpoints/index.d.mts.map +1 -1
  139. package/dist/endpoints/index.mjs +4 -3
  140. package/dist/external-api-DS3mujT5.d.mts +86 -0
  141. package/dist/external-api-DS3mujT5.d.mts.map +1 -0
  142. package/dist/external-api-LBfE-q3g.d.cts +86 -0
  143. package/dist/external-api-LBfE-q3g.d.cts.map +1 -0
  144. package/dist/external-api.cjs +124 -0
  145. package/dist/external-api.cjs.map +1 -0
  146. package/dist/external-api.d.cts +2 -0
  147. package/dist/external-api.d.mts +2 -0
  148. package/dist/external-api.mjs +121 -0
  149. package/dist/external-api.mjs.map +1 -0
  150. package/dist/file-server.d.cts +1 -1
  151. package/dist/file-server.d.mts +1 -1
  152. package/dist/functions/index.cjs +1 -1
  153. package/dist/functions/index.d.cts +1 -1
  154. package/dist/functions/index.d.mts +1 -1
  155. package/dist/functions/index.mjs +1 -1
  156. package/dist/{functions-DlFm8HmH.mjs → functions-DCIfCRR-.mjs} +94 -23
  157. package/dist/functions-DCIfCRR-.mjs.map +1 -0
  158. package/dist/{functions-DKN6aQWJ.cjs → functions-ZH60FE7H.cjs} +99 -19
  159. package/dist/functions-ZH60FE7H.cjs.map +1 -0
  160. package/dist/{index-BI23K3wy.d.cts → index-B0kxstwf.d.cts} +36 -24
  161. package/dist/index-B0kxstwf.d.cts.map +1 -0
  162. package/dist/{index-yb3fXNyH.d.mts → index-CjVEjOw0.d.mts} +36 -24
  163. package/dist/index-CjVEjOw0.d.mts.map +1 -0
  164. package/dist/index.cjs +1 -1
  165. package/dist/index.d.cts +1 -1
  166. package/dist/index.d.mts +1 -1
  167. package/dist/index.mjs +1 -1
  168. package/dist/{kysely-CEVXacPN.d.cts → kysely-BJ8IQ_1P.d.mts} +4 -4
  169. package/dist/{kysely-CEVXacPN.d.cts.map → kysely-BJ8IQ_1P.d.mts.map} +1 -1
  170. package/dist/{kysely-mcTdPNhl.d.mts → kysely-DVF8wOT4.d.cts} +4 -4
  171. package/dist/{kysely-mcTdPNhl.d.mts.map → kysely-DVF8wOT4.d.cts.map} +1 -1
  172. package/dist/{lazyAccessors-BHtcqgz2.mjs → lazyAccessors-CFanua0O.mjs} +2 -39
  173. package/dist/lazyAccessors-CFanua0O.mjs.map +1 -0
  174. package/dist/{lazyAccessors-Dx9NLwJZ.cjs → lazyAccessors-hJKGv8Ay.cjs} +1 -50
  175. package/dist/lazyAccessors-hJKGv8Ay.cjs.map +1 -0
  176. package/dist/mobile-app.d.cts +1 -1
  177. package/dist/mobile-app.d.mts +1 -1
  178. package/dist/object-storage.d.cts +1 -1
  179. package/dist/object-storage.d.mts +1 -1
  180. package/dist/processAudits-BpRlPQMW.mjs.map +1 -1
  181. package/dist/processAudits-D_2W5x8k.cjs.map +1 -1
  182. package/dist/queue/index.cjs +4 -78
  183. package/dist/queue/index.d.cts +3 -53
  184. package/dist/queue/index.d.mts +3 -53
  185. package/dist/queue/index.mjs +3 -77
  186. package/dist/rest-api.cjs +2 -4
  187. package/dist/rest-api.cjs.map +1 -1
  188. package/dist/rest-api.d.cts +4 -5
  189. package/dist/rest-api.d.cts.map +1 -1
  190. package/dist/rest-api.d.mts +4 -5
  191. package/dist/rest-api.d.mts.map +1 -1
  192. package/dist/rest-api.mjs +2 -4
  193. package/dist/rest-api.mjs.map +1 -1
  194. package/dist/site.d.cts +1 -1
  195. package/dist/site.d.mts +1 -1
  196. package/dist/subscribers/index.cjs +1 -1
  197. package/dist/subscribers/index.d.cts +2 -2
  198. package/dist/subscribers/index.d.mts +2 -2
  199. package/dist/subscribers/index.mjs +1 -1
  200. package/dist/topic/index.cjs +1 -36
  201. package/dist/topic/index.d.cts +2 -3
  202. package/dist/topic/index.d.mts +2 -3
  203. package/dist/topic/index.mjs +2 -35
  204. package/dist/worker.cjs +26 -17
  205. package/dist/worker.cjs.map +1 -1
  206. package/dist/worker.d.cts +37 -29
  207. package/dist/worker.d.cts.map +1 -1
  208. package/dist/worker.d.mts +37 -29
  209. package/dist/worker.d.mts.map +1 -1
  210. package/dist/worker.mjs +26 -17
  211. package/dist/worker.mjs.map +1 -1
  212. package/package.json +41 -31
  213. package/dist/Construct-DTqYvkPG.d.cts +0 -115
  214. package/dist/Construct-DTqYvkPG.d.cts.map +0 -1
  215. package/dist/Construct-Detz65RA.mjs.map +0 -1
  216. package/dist/Construct-pVadmURD.d.mts +0 -115
  217. package/dist/Construct-pVadmURD.d.mts.map +0 -1
  218. package/dist/Construct-yG9Sw-5p.cjs.map +0 -1
  219. package/dist/Cron-B_iuyNxr.d.mts.map +0 -1
  220. package/dist/Cron-CA2oa2nC.d.cts.map +0 -1
  221. package/dist/CronBuilder-BIKCLWu7.d.mts.map +0 -1
  222. package/dist/CronBuilder-BRkzUOAs.mjs.map +0 -1
  223. package/dist/CronBuilder-B_KqaodP.d.cts.map +0 -1
  224. package/dist/CronBuilder-BbnT7tqo.cjs.map +0 -1
  225. package/dist/Endpoint-1-XYQSx0.d.cts.map +0 -1
  226. package/dist/Endpoint-DO332Dnm.mjs.map +0 -1
  227. package/dist/Endpoint-GFIxYb9L.d.mts.map +0 -1
  228. package/dist/Endpoint-QKuFg5gs.cjs.map +0 -1
  229. package/dist/EndpointFactory-B9HAjDAP.mjs.map +0 -1
  230. package/dist/EndpointFactory-BCZdh_u3.d.mts.map +0 -1
  231. package/dist/EndpointFactory-BmO0WnXE.cjs.map +0 -1
  232. package/dist/EndpointFactory-BnK_YkW1.d.cts.map +0 -1
  233. package/dist/HonoEndpointAdaptor-CiqAZ5Mt.mjs.map +0 -1
  234. package/dist/HonoEndpointAdaptor-DoEQdC3r.cjs.map +0 -1
  235. package/dist/Queue-B7yRXQmL.cjs.map +0 -1
  236. package/dist/Queue-Bhzi2WQC.d.cts.map +0 -1
  237. package/dist/Queue-BoUA-e83.d.mts.map +0 -1
  238. package/dist/Queue-DpKTLl6E.mjs.map +0 -1
  239. package/dist/Subscriber-CIO3pwji.d.mts.map +0 -1
  240. package/dist/Subscriber-DQCaiOXF.d.cts.map +0 -1
  241. package/dist/SubscriberBuilder-B4YRTBng.mjs.map +0 -1
  242. package/dist/SubscriberBuilder-C2FRfd26.d.mts.map +0 -1
  243. package/dist/SubscriberBuilder-C2bCOuPT.cjs.map +0 -1
  244. package/dist/SubscriberBuilder-CjDGSTZc.d.cts.map +0 -1
  245. package/dist/Topic-Ct3Le8Wt.mjs +0 -103
  246. package/dist/Topic-Ct3Le8Wt.mjs.map +0 -1
  247. package/dist/Topic-D5rlM9wS.cjs.map +0 -1
  248. package/dist/Topic-D6blllEn.d.cts +0 -89
  249. package/dist/Topic-D6blllEn.d.cts.map +0 -1
  250. package/dist/Topic-DVvheJ_-.d.mts +0 -89
  251. package/dist/Topic-DVvheJ_-.d.mts.map +0 -1
  252. package/dist/functions-DKN6aQWJ.cjs.map +0 -1
  253. package/dist/functions-DlFm8HmH.mjs.map +0 -1
  254. package/dist/index-BI23K3wy.d.cts.map +0 -1
  255. package/dist/index-fnpjXiA-.d.mts +0 -26
  256. package/dist/index-fnpjXiA-.d.mts.map +0 -1
  257. package/dist/index-tE_119SX.d.cts +0 -26
  258. package/dist/index-tE_119SX.d.cts.map +0 -1
  259. package/dist/index-yb3fXNyH.d.mts.map +0 -1
  260. package/dist/lazyAccessors-BHtcqgz2.mjs.map +0 -1
  261. package/dist/lazyAccessors-Dx9NLwJZ.cjs.map +0 -1
  262. package/dist/queue/index.cjs.map +0 -1
  263. package/dist/queue/index.d.cts.map +0 -1
  264. package/dist/queue/index.d.mts.map +0 -1
  265. package/dist/queue/index.mjs.map +0 -1
  266. package/dist/topic/index.cjs.map +0 -1
  267. package/dist/topic/index.mjs.map +0 -1
@@ -1,18 +1,20 @@
1
1
  import { t as StandardSchemaV1 } from "../index-CeEtxDmK.cjs";
2
- import { r as Function } from "../index-BI23K3wy.cjs";
2
+ import { r as Function } from "../index-B0kxstwf.cjs";
3
3
  import { t as HttpMethod } from "../types-DMuSQeLL.cjs";
4
- import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-1-XYQSx0.cjs";
5
- import { t as Queue } from "../Queue-Bhzi2WQC.cjs";
6
- import { t as Subscriber } from "../Subscriber-DQCaiOXF.cjs";
7
- import { t as KyselyDatabase } from "../kysely-CEVXacPN.cjs";
8
- import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
4
+ import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-Dp5AKIXl.cjs";
5
+ import { t as Queue } from "../Queue-CpQIGB_2.cjs";
6
+ import { t as Subscriber } from "../Subscriber-B91YSkZt.cjs";
7
+ import { t as KyselyDatabase } from "../kysely-DVF8wOT4.cjs";
8
+ import { r as Fake } from "../external-api-LBfE-q3g.cjs";
9
9
  import { Logger } from "@geekmidas/logger";
10
10
  import { ComposableStandardSchema, InferComposableStandardSchema, InferStandardSchema } from "@geekmidas/schema";
11
11
  import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
12
12
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
13
+ import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
13
14
  import { TEST_CONTEXT_HEADER } from "@geekmidas/testkit/context";
14
15
  import { HttpHandler } from "msw";
15
16
  import { Browser } from "@geekmidas/testkit/browser";
17
+ import { FakerFactory } from "@geekmidas/testkit/faker";
16
18
  import { Mailbox } from "@geekmidas/testkit/mailbox";
17
19
  import { Kysely } from "kysely";
18
20
  //#region src/endpoints/MswEndpointAdaptor.d.ts
@@ -56,16 +58,16 @@ interface CreateMswHandlersOptions {
56
58
  }
57
59
  /**
58
60
  * Options for registering a per-test context.
59
- * Follows the same pattern as TestRequestAdaptor — services, database,
60
- * publisher, and auditorStorage are provided explicitly.
61
+ * Follows the same pattern as TestRequestAdaptor — services, database and
62
+ * auditorStorage are provided explicitly. A topic is a service under its own
63
+ * name, so a recorder in `services` (`{ users: recorder }`) captures what an
64
+ * endpoint publishes to it.
61
65
  */
62
66
  interface RegisterContextOptions {
63
67
  /** Service instances keyed by serviceName */
64
68
  services?: Record<string, unknown>;
65
69
  /** Database instance — required when endpoints use .database() */
66
70
  database?: unknown;
67
- /** Event publisher service definition */
68
- publisher?: Service;
69
71
  /** Audit storage instance — required when endpoints use .auditor() */
70
72
  auditorStorage?: unknown;
71
73
  }
@@ -101,13 +103,13 @@ type TestHttpResponse<TBody = any> = {
101
103
  status: number;
102
104
  headers: Record<string, string | string[]>;
103
105
  };
104
- export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
106
+ export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
105
107
  private readonly endpoint;
106
108
  private serviceDiscovery;
107
- static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(_endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>): any;
108
- constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery?: ServiceDiscovery<any>);
109
- fullRequest(ctx: TestRequestAdaptor<TInput, TServices, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<TestHttpResponse<InferStandardSchema<TOutSchema>>>;
110
- request(ctx: TestRequestAdaptor<TInput, TServices, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<InferStandardSchema<TOutSchema>>;
109
+ static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(_endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>): any;
110
+ constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery?: ServiceDiscovery<any>);
111
+ fullRequest(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<TestHttpResponse<InferStandardSchema<TOutSchema>>>;
112
+ request(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<InferStandardSchema<TOutSchema>>;
111
113
  }
112
114
  /**
113
115
  * Conditional audit storage requirement - required when TAuditStorage is configured
@@ -123,24 +125,22 @@ type DatabaseRequirement<TDatabase = undefined> = TDatabase extends undefined ?
123
125
  /** Database instance - required when endpoint uses .database() */
124
126
  database: TDatabase;
125
127
  };
126
- type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, _TAuditStorageServiceName extends string = string, TDatabase = undefined, _TDatabaseServiceName extends string = string> = {
128
+ type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TAuditStorage extends AuditStorage | undefined = undefined, _TAuditStorageServiceName extends string = string, TDatabase = undefined, _TDatabaseServiceName extends string = string> = {
127
129
  services: ServiceRecord<TServices>;
128
130
  headers: Record<string, string>;
129
- publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
130
131
  } & InferComposableStandardSchema<TInput> & AuditStorageRequirement<TAuditStorage> & DatabaseRequirement<TDatabase>;
131
132
  //#endregion
132
133
  //#region src/functions/TestFunctionAdaptor.d.ts
133
- export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
134
+ export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
134
135
  private readonly fn;
135
136
  private serviceDiscovery;
136
- static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(_fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>): any;
137
- constructor(fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>, serviceDiscovery?: ServiceDiscovery<any>);
138
- invoke(ctx: TestFunctionRequest<TInput, TServices, TEventPublisher, TEventPublisherServiceName, TDatabase, TAuditAction>): Promise<InferStandardSchema<TOutSchema>>;
137
+ static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(_fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>): any;
138
+ constructor(fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>, serviceDiscovery?: ServiceDiscovery<any>);
139
+ invoke(ctx: TestFunctionRequest<TInput, TServices, TDatabase, TAuditAction>): Promise<InferStandardSchema<TOutSchema>>;
139
140
  }
140
- type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> = {
141
+ type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TDatabase = undefined, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> = {
141
142
  input: InferComposableStandardSchema<TInput>;
142
143
  services: ServiceRecord<TServices>;
143
- publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
144
144
  db?: TDatabase;
145
145
  auditor?: Auditor<TAuditAction>;
146
146
  } & InferComposableStandardSchema<{
@@ -173,11 +173,11 @@ type TestQueueRequest<TMessage extends StandardSchemaV1 = StandardSchemaV1, TSer
173
173
  type ExtractEventPayloads<TPublisher extends EventPublisher<any> | undefined, TEventTypes extends any[]> = TPublisher extends EventPublisher<any> ? Extract<ExtractPublisherMessage<TPublisher>, {
174
174
  type: TEventTypes[number];
175
175
  }> : never;
176
- export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][]> {
176
+ export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][]> {
177
177
  private readonly subscriber;
178
178
  private serviceDiscovery;
179
179
  static getDefaultServiceDiscovery(): any;
180
- constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents>, serviceDiscovery?: ServiceDiscovery<any>);
180
+ constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents>, serviceDiscovery?: ServiceDiscovery<any>);
181
181
  invoke(request: TestSubscriberRequest<TEventPublisher, TSubscribedEvents, TServices>): Promise<InferStandardSchema<OutSchema>>;
182
182
  private filterEvents;
183
183
  }
@@ -262,6 +262,12 @@ interface FeatureTestOptions<TBrowser extends Browser, TFactories extends Factor
262
262
  * back with everything else, and seen by the endpoints it calls.
263
263
  */
264
264
  factories?: TFactories;
265
+ /**
266
+ * Each external API's fake — the default export of `test/fakes/<id>.ts`,
267
+ * which the generated harness imports — keyed by the API's construct id.
268
+ * An app fake is served at the URL the test stage resolved for it.
269
+ */
270
+ fakes?: Readonly<Record<string, Fake>>;
265
271
  }
266
272
  /** Each database's schema, keyed by its service name. */
267
273
  type DatabaseSchemas = Record<string, unknown>;
@@ -299,6 +305,12 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
299
305
  * returns.
300
306
  */
301
307
  factories: TestFactories<TFactories>;
308
+ /**
309
+ * Testkit's faker — the one factories are handed — seeded from this test's
310
+ * name, so a failing test fails again with the same data, and so a test
311
+ * imports nothing to make some.
312
+ */
313
+ faker: FakerFactory;
302
314
  /** The mail sent to an address during this test, read from Mailpit. */
303
315
  mailbox: (address: string) => Mailbox;
304
316
  /**
@@ -314,11 +326,11 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
314
326
  * with this test's services: its databases resolve to this test's
315
327
  * transactions, as an endpoint's do.
316
328
  */
317
- subscriber: <S extends Subscriber<any, any, any, any, any, any>>(subscriber: S) => SubscriberAdaptorOf<S>;
329
+ subscriber: <S extends Subscriber<any, any, any, any, any>>(subscriber: S) => SubscriberAdaptorOf<S>;
318
330
  /** A queue's worker, run on its own with this test's services. */
319
331
  queue: <Q extends Queue<any, any, any, any>>(queue: Q) => QueueAdaptorOf<Q>;
320
332
  }
321
- type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer TEventPublisherServiceName, infer TSubscribedEvents> ? TestSubscriberAdaptor<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents> : never;
333
+ type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer TSubscribedEvents> ? TestSubscriberAdaptor<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents> : never;
322
334
  type QueueAdaptorOf<Q> = Q extends Queue<infer TName, infer TMessage, infer TServices, infer TLogger> ? TestQueueAdaptor<TName, TMessage, TServices, TLogger> : never;
323
335
  /** The schema a database construct was declared with — what `db` is typed by. */
324
336
  type DatabaseOf<C> = C extends KyselyDatabase<infer DB, any> ? DB : unknown;
@@ -358,7 +370,7 @@ interface MagicLinkAuthClient<TSession> {
358
370
  * — and cleared again after the test, like any address a test reads. Returns
359
371
  * the session the auth server then reports, as better-auth hands it back.
360
372
  */
361
- export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email: string): Promise<TSession>;
373
+ export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email?: string): Promise<TSession>;
362
374
  /** `browser.signIn` finished without a session. */
363
375
  export declare class SignInFailed extends Error {
364
376
  readonly email: string;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.cts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"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"}
1
+ {"version":3,"file":"testing.d.cts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"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"}
@@ -1,17 +1,19 @@
1
1
  import { t as StandardSchemaV1 } from "../index-CeEtxDmK.mjs";
2
- import { r as Function } from "../index-yb3fXNyH.mjs";
2
+ import { r as Function } from "../index-CjVEjOw0.mjs";
3
3
  import { t as HttpMethod } from "../types-DMuSQeLL.mjs";
4
- import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-GFIxYb9L.mjs";
5
- import { t as Queue } from "../Queue-BoUA-e83.mjs";
6
- import { t as Subscriber } from "../Subscriber-CIO3pwji.mjs";
7
- import { t as KyselyDatabase } from "../kysely-mcTdPNhl.mjs";
8
- import { Kysely } from "kysely";
4
+ import { c as EndpointSchemas, i as Endpoint } from "../Endpoint-DtI7heFm.mjs";
5
+ import { t as Queue } from "../Queue-YmvN2vEP.mjs";
6
+ import { t as Subscriber } from "../Subscriber-BjHYe5hK.mjs";
7
+ import { t as KyselyDatabase } from "../kysely-BJ8IQ_1P.mjs";
8
+ import { r as Fake } from "../external-api-DS3mujT5.mjs";
9
9
  import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
10
+ import { Kysely } from "kysely";
10
11
  import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
11
12
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
12
13
  import { TEST_CONTEXT_HEADER } from "@geekmidas/testkit/context";
13
14
  import { HttpHandler } from "msw";
14
15
  import { Browser } from "@geekmidas/testkit/browser";
16
+ import { FakerFactory } from "@geekmidas/testkit/faker";
15
17
  import { Mailbox } from "@geekmidas/testkit/mailbox";
16
18
  import { Logger } from "@geekmidas/logger";
17
19
  import { ComposableStandardSchema, InferComposableStandardSchema, InferStandardSchema } from "@geekmidas/schema";
@@ -56,16 +58,16 @@ interface CreateMswHandlersOptions {
56
58
  }
57
59
  /**
58
60
  * Options for registering a per-test context.
59
- * Follows the same pattern as TestRequestAdaptor — services, database,
60
- * publisher, and auditorStorage are provided explicitly.
61
+ * Follows the same pattern as TestRequestAdaptor — services, database and
62
+ * auditorStorage are provided explicitly. A topic is a service under its own
63
+ * name, so a recorder in `services` (`{ users: recorder }`) captures what an
64
+ * endpoint publishes to it.
61
65
  */
62
66
  interface RegisterContextOptions {
63
67
  /** Service instances keyed by serviceName */
64
68
  services?: Record<string, unknown>;
65
69
  /** Database instance — required when endpoints use .database() */
66
70
  database?: unknown;
67
- /** Event publisher service definition */
68
- publisher?: Service;
69
71
  /** Audit storage instance — required when endpoints use .auditor() */
70
72
  auditorStorage?: unknown;
71
73
  }
@@ -101,13 +103,13 @@ type TestHttpResponse<TBody = any> = {
101
103
  status: number;
102
104
  headers: Record<string, string | string[]>;
103
105
  };
104
- export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
106
+ export declare class TestEndpointAdaptor<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string> {
105
107
  private readonly endpoint;
106
108
  private serviceDiscovery;
107
- static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(_endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>): any;
108
- constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery?: ServiceDiscovery<any>);
109
- fullRequest(ctx: TestRequestAdaptor<TInput, TServices, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<TestHttpResponse<InferStandardSchema<TOutSchema>>>;
110
- request(ctx: TestRequestAdaptor<TInput, TServices, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<InferStandardSchema<TOutSchema>>;
109
+ static getDefaultServiceDiscover<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(_endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>): any;
110
+ constructor(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery?: ServiceDiscovery<any>);
111
+ fullRequest(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<TestHttpResponse<InferStandardSchema<TOutSchema>>>;
112
+ request(ctx: TestRequestAdaptor<TInput, TServices, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName>): Promise<InferStandardSchema<TOutSchema>>;
111
113
  }
112
114
  /**
113
115
  * Conditional audit storage requirement - required when TAuditStorage is configured
@@ -123,24 +125,22 @@ type DatabaseRequirement<TDatabase = undefined> = TDatabase extends undefined ?
123
125
  /** Database instance - required when endpoint uses .database() */
124
126
  database: TDatabase;
125
127
  };
126
- type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, _TAuditStorageServiceName extends string = string, TDatabase = undefined, _TDatabaseServiceName extends string = string> = {
128
+ type TestRequestAdaptor<TInput extends EndpointSchemas = {}, TServices extends Service[] = [], TAuditStorage extends AuditStorage | undefined = undefined, _TAuditStorageServiceName extends string = string, TDatabase = undefined, _TDatabaseServiceName extends string = string> = {
127
129
  services: ServiceRecord<TServices>;
128
130
  headers: Record<string, string>;
129
- publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
130
131
  } & InferComposableStandardSchema<TInput> & AuditStorageRequirement<TAuditStorage> & DatabaseRequirement<TDatabase>;
131
132
  //#endregion
132
133
  //#region src/functions/TestFunctionAdaptor.d.ts
133
- export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
134
+ export declare class TestFunctionAdaptor<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> {
134
135
  private readonly fn;
135
136
  private serviceDiscovery;
136
- static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(_fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>): any;
137
- constructor(fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>, serviceDiscovery?: ServiceDiscovery<any>);
138
- invoke(ctx: TestFunctionRequest<TInput, TServices, TEventPublisher, TEventPublisherServiceName, TDatabase, TAuditAction>): Promise<InferStandardSchema<TOutSchema>>;
137
+ static getDefaultServiceDiscovery<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>>(_fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>): any;
138
+ constructor(fn: Function<TInput, TServices, TLogger, TOutSchema, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, any>, serviceDiscovery?: ServiceDiscovery<any>);
139
+ invoke(ctx: TestFunctionRequest<TInput, TServices, TDatabase, TAuditAction>): Promise<InferStandardSchema<TOutSchema>>;
139
140
  }
140
- type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TDatabase = undefined, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> = {
141
+ type TestFunctionRequest<TInput extends ComposableStandardSchema | undefined = undefined, TServices extends Service[] = [], TDatabase = undefined, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> = {
141
142
  input: InferComposableStandardSchema<TInput>;
142
143
  services: ServiceRecord<TServices>;
143
- publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
144
144
  db?: TDatabase;
145
145
  auditor?: Auditor<TAuditAction>;
146
146
  } & InferComposableStandardSchema<{
@@ -173,11 +173,11 @@ type TestQueueRequest<TMessage extends StandardSchemaV1 = StandardSchemaV1, TSer
173
173
  type ExtractEventPayloads<TPublisher extends EventPublisher<any> | undefined, TEventTypes extends any[]> = TPublisher extends EventPublisher<any> ? Extract<ExtractPublisherMessage<TPublisher>, {
174
174
  type: TEventTypes[number];
175
175
  }> : never;
176
- export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][]> {
176
+ export declare class TestSubscriberAdaptor<TServices extends Service[] = [], TLogger extends Logger = Logger, OutSchema extends StandardSchemaV1 | undefined = undefined, TEventPublisher extends EventPublisher<any> | undefined = undefined, TSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][]> {
177
177
  private readonly subscriber;
178
178
  private serviceDiscovery;
179
179
  static getDefaultServiceDiscovery(): any;
180
- constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents>, serviceDiscovery?: ServiceDiscovery<any>);
180
+ constructor(subscriber: Subscriber<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents>, serviceDiscovery?: ServiceDiscovery<any>);
181
181
  invoke(request: TestSubscriberRequest<TEventPublisher, TSubscribedEvents, TServices>): Promise<InferStandardSchema<OutSchema>>;
182
182
  private filterEvents;
183
183
  }
@@ -262,6 +262,12 @@ interface FeatureTestOptions<TBrowser extends Browser, TFactories extends Factor
262
262
  * back with everything else, and seen by the endpoints it calls.
263
263
  */
264
264
  factories?: TFactories;
265
+ /**
266
+ * Each external API's fake — the default export of `test/fakes/<id>.ts`,
267
+ * which the generated harness imports — keyed by the API's construct id.
268
+ * An app fake is served at the URL the test stage resolved for it.
269
+ */
270
+ fakes?: Readonly<Record<string, Fake>>;
265
271
  }
266
272
  /** Each database's schema, keyed by its service name. */
267
273
  type DatabaseSchemas = Record<string, unknown>;
@@ -299,6 +305,12 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
299
305
  * returns.
300
306
  */
301
307
  factories: TestFactories<TFactories>;
308
+ /**
309
+ * Testkit's faker — the one factories are handed — seeded from this test's
310
+ * name, so a failing test fails again with the same data, and so a test
311
+ * imports nothing to make some.
312
+ */
313
+ faker: FakerFactory;
302
314
  /** The mail sent to an address during this test, read from Mailpit. */
303
315
  mailbox: (address: string) => Mailbox;
304
316
  /**
@@ -314,11 +326,11 @@ interface FeatureContext<TBrowser extends Browser, TDatabases extends DatabaseSc
314
326
  * with this test's services: its databases resolve to this test's
315
327
  * transactions, as an endpoint's do.
316
328
  */
317
- subscriber: <S extends Subscriber<any, any, any, any, any, any>>(subscriber: S) => SubscriberAdaptorOf<S>;
329
+ subscriber: <S extends Subscriber<any, any, any, any, any>>(subscriber: S) => SubscriberAdaptorOf<S>;
318
330
  /** A queue's worker, run on its own with this test's services. */
319
331
  queue: <Q extends Queue<any, any, any, any>>(queue: Q) => QueueAdaptorOf<Q>;
320
332
  }
321
- type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer TEventPublisherServiceName, infer TSubscribedEvents> ? TestSubscriberAdaptor<TServices, TLogger, OutSchema, TEventPublisher, TEventPublisherServiceName, TSubscribedEvents> : never;
333
+ type SubscriberAdaptorOf<S> = S extends Subscriber<infer TServices, infer TLogger, infer OutSchema, infer TEventPublisher, infer TSubscribedEvents> ? TestSubscriberAdaptor<TServices, TLogger, OutSchema, TEventPublisher, TSubscribedEvents> : never;
322
334
  type QueueAdaptorOf<Q> = Q extends Queue<infer TName, infer TMessage, infer TServices, infer TLogger> ? TestQueueAdaptor<TName, TMessage, TServices, TLogger> : never;
323
335
  /** The schema a database construct was declared with — what `db` is typed by. */
324
336
  type DatabaseOf<C> = C extends KyselyDatabase<infer DB, any> ? DB : unknown;
@@ -358,7 +370,7 @@ interface MagicLinkAuthClient<TSession> {
358
370
  * — and cleared again after the test, like any address a test reads. Returns
359
371
  * the session the auth server then reports, as better-auth hands it back.
360
372
  */
361
- export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email: string): Promise<TSession>;
373
+ export declare function signInWithMagicLink<TSession>(browser: Browser, auth: MagicLinkAuthClient<TSession>, email?: string): Promise<TSession>;
362
374
  /** `browser.signIn` finished without a session. */
363
375
  export declare class SignInFailed extends Error {
364
376
  readonly email: string;
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.mts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"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"}
1
+ {"version":3,"file":"testing.d.mts","names":["TestBrowser"],"sources":["../../src/endpoints/MswEndpointAdaptor.ts","../../src/endpoints/TestEndpointAdaptor.ts","../../src/functions/TestFunctionAdaptor.ts","../../src/queue/TestQueueAdaptor.ts","../../src/subscribers/TestSubscriberAdaptor.ts","../../src/testing/manifest.ts","../../src/testing/featureTest.ts"],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  import { BetterAuth } from "../auth.mjs";
2
- import { t as FunctionBuilder } from "../functions-DlFm8HmH.mjs";
3
- import { n as ResponseBuilder, t as Endpoint } from "../Endpoint-DO332Dnm.mjs";
2
+ import { a as publishEvents, i as publishConstructEvents, t as FunctionBuilder } from "../functions-DCIfCRR-.mjs";
3
+ import { n as ResponseBuilder, t as Endpoint } from "../Endpoint-CQAeh1Rh.mjs";
4
+ import { t as Queue } from "../Queue-C1uDgjxt.mjs";
4
5
  import { Email } from "../email.mjs";
5
6
  import { KyselyDatabase } from "../database/kysely.mjs";
6
- import { c as createObjectHeaders, l as publishConstructEvents, r as createCookieHeaderAccessor, u as publishEvents } from "../lazyAccessors-BHtcqgz2.mjs";
7
- import { t as Queue } from "../Queue-DpKTLl6E.mjs";
8
- import { t as Topic } from "../Topic-Ct3Le8Wt.mjs";
9
- import { t as HonoEndpoint } from "../HonoEndpointAdaptor-CiqAZ5Mt.mjs";
7
+ import { c as createObjectHeaders, r as createCookieHeaderAccessor } from "../lazyAccessors-CFanua0O.mjs";
8
+ import { t as Topic } from "../Topic-DOw051ch.mjs";
9
+ import { t as HonoEndpoint } from "../HonoEndpointAdaptor-Aui-x9Lg.mjs";
10
10
  import { n as executeWithAuditTransaction } from "../processAudits-BpRlPQMW.mjs";
11
11
  import { provideKey } from "@geekmidas/manifest";
12
12
  import { ForbiddenError } from "@geekmidas/errors";
@@ -18,6 +18,7 @@ import { TEST_CONTEXT_HEADER, currentTestContext, installContextFetch, runAsServ
18
18
  import { http } from "msw";
19
19
  import { randomUUID } from "node:crypto";
20
20
  import { Browser } from "@geekmidas/testkit/browser";
21
+ import { faker } from "@geekmidas/testkit/faker";
21
22
  import { createMailbox } from "@geekmidas/testkit/mailbox";
22
23
  import { TransactionRegistry } from "@geekmidas/testkit/transactions";
23
24
  import { setupServer } from "msw/node";
@@ -73,7 +74,6 @@ function createMswHandlers(endpoints, options) {
73
74
  break;
74
75
  }
75
76
  }
76
- if (ctxOptions.publisher) serviceDefs.push(ctxOptions.publisher);
77
77
  if (ctxOptions.auditorStorage !== void 0) {
78
78
  for (const endpoint of endpoints) if (endpoint.auditorStorageService) {
79
79
  serviceDefs.push({
@@ -256,8 +256,7 @@ var TestEndpointAdaptor = class TestEndpointAdaptor {
256
256
  });
257
257
  }
258
258
  }, { db: rawDb });
259
- ctx.publisher && await this.serviceDiscovery.register([ctx.publisher]);
260
- await publishConstructEvents(this.endpoint, output, this.serviceDiscovery);
259
+ await publishConstructEvents(this.endpoint, output, this.serviceDiscovery, this.endpoint.logger, ctx.services);
261
260
  const headers = { ...metadata.headers || {} };
262
261
  if (metadata.cookies && metadata.cookies.size > 0) {
263
262
  const setCookieValues = [];
@@ -333,7 +332,7 @@ var TestFunctionAdaptor = class TestFunctionAdaptor {
333
332
  await auditor.flush();
334
333
  }
335
334
  }
336
- await publishEvents(logger, this.serviceDiscovery, this.fn.events, output, this.fn.publisherService);
335
+ await publishEvents(logger, this.serviceDiscovery, this.fn.events, output, services);
337
336
  return output;
338
337
  });
339
338
  }
@@ -410,7 +409,6 @@ var TestSubscriberAdaptor = class TestSubscriberAdaptor {
410
409
  if (validationResult.issues) throw new Error("Subscriber output validation failed");
411
410
  output = validationResult.value;
412
411
  }
413
- await publishEvents(logger, this.serviceDiscovery, this.subscriber.events, output, this.subscriber.publisherService);
414
412
  return output;
415
413
  });
416
414
  }
@@ -512,7 +510,7 @@ function featureTest(options = {}) {
512
510
  owned = ownDatabases(app, manifest);
513
511
  factoryDatabases = databasesFor(options.factories ?? {}, owned);
514
512
  for (const database of app.databases) bindToTests(database);
515
- network = setupServer(...surfaceHandlers(app.endpoints, manifest.env), ...app.auths.map((auth) => authHandler(auth, manifest.env, app.envParser)));
513
+ network = setupServer(...surfaceHandlers(app.endpoints, manifest.env), ...app.auths.map((auth) => authHandler(auth, manifest.env, app.envParser)), ...Object.entries(options.fakes ?? {}).flatMap(([id, fake]) => fakeHandler(id, fake, manifest.env)));
516
514
  network.listen({ onUnhandledRequest(request, print) {
517
515
  if (isLocal(new URL(request.url))) return;
518
516
  print.error();
@@ -523,8 +521,9 @@ function featureTest(options = {}) {
523
521
  restoreFetch();
524
522
  network?.close();
525
523
  });
526
- const run = (fn) => async () => {
524
+ const run = (name, fn) => async () => {
527
525
  const id = randomUUID();
526
+ faker.seed(seedOf(name));
528
527
  const state = {
529
528
  transactions: new TransactionRegistry(),
530
529
  discovery: new ServiceDiscovery(app.envParser),
@@ -565,6 +564,7 @@ function featureTest(options = {}) {
565
564
  }
566
565
  return factory;
567
566
  } },
567
+ faker,
568
568
  mailbox: (address) => {
569
569
  if (!state.mailbox) throw new NoInbox();
570
570
  return state.mailbox(address);
@@ -582,12 +582,21 @@ function featureTest(options = {}) {
582
582
  await Promise.all([state.transactions.rollbackAll(), ...[...state.addresses].map((address) => app.readMail?.(address).clear())]);
583
583
  }
584
584
  };
585
- const it = ((name, fn, timeout) => test(name, run(fn), timeout));
586
- it.only = (name, fn, timeout) => test.only(name, run(fn), timeout);
587
- it.skip = (name, fn, timeout) => test.skip(name, run(fn), timeout);
585
+ const it = ((name, fn, timeout) => test(name, run(name, fn), timeout));
586
+ it.only = (name, fn, timeout) => test.only(name, run(name, fn), timeout);
587
+ it.skip = (name, fn, timeout) => test.skip(name, run(name, fn), timeout);
588
588
  return it;
589
589
  }
590
590
  /**
591
+ * A test's faker seed, from its name: the same test draws the same data on
592
+ * every run, and two tests draw different data.
593
+ */
594
+ function seedOf(name) {
595
+ let hash = 0;
596
+ for (const char of name) hash = Math.imul(hash, 31) + char.charCodeAt(0) | 0;
597
+ return hash >>> 0;
598
+ }
599
+ /**
591
600
  * Import what the manifest points at.
592
601
  *
593
602
  * The same modules the app runs, so a construct here *is* the app's construct —
@@ -615,21 +624,22 @@ async function load(manifest, modules) {
615
624
  };
616
625
  }
617
626
  /**
618
- * A publisher that records rather than sends, under every name a topic or
619
- * queue is injected by — `users`, and the older `usersPublisher`.
627
+ * A publisher that records rather than sends, under the name a topic or queue
628
+ * is injected by — `services.users` — which is also the one `.event(users, …)`
629
+ * publishes through.
620
630
  */
621
631
  function recorders(channels, state) {
622
- return channels.flatMap((channel) => {
632
+ return channels.map((channel) => {
623
633
  const publisher = { async publish(messages) {
624
634
  state.published.set(channel.id, [...state.published.get(channel.id) ?? [], ...messages.map(({ type, payload }) => ({
625
635
  type,
626
636
  payload
627
637
  }))]);
628
638
  } };
629
- return [channel.service.serviceName, channel.publisher.serviceName].map((serviceName) => ({
630
- serviceName,
639
+ return {
640
+ serviceName: channel.service.serviceName,
631
641
  register: () => publisher
632
- }));
642
+ };
633
643
  });
634
644
  }
635
645
  /**
@@ -698,6 +708,20 @@ function surfaceHandlers(endpoints, env) {
698
708
  }));
699
709
  });
700
710
  }
711
+ /**
712
+ * An external API's app fake, answering at the URL the test stage resolved for
713
+ * it — so a handler that calls Polar calls the fake, and the test sets up
714
+ * nothing.
715
+ *
716
+ * Not per test, unlike a surface: a fake stands in for somebody else's server,
717
+ * which no test's transaction reaches. An image fake has no handler here — its
718
+ * container answers on localhost, which is let through.
719
+ */
720
+ function fakeHandler(id, fake, env) {
721
+ const base = env[provideKey(id, "url")];
722
+ if (fake.kind !== "app" || !base) return [];
723
+ return [http.all(`${trim(base)}/*`, ({ request }) => fake.handler.fetch(request))];
724
+ }
701
725
  /** An auth server, served at its URL, on the transaction of the test that asked. */
702
726
  function authHandler(auth, env, envParser) {
703
727
  const base = trim(env[provideKey(auth.id, "url")] ?? "");
@@ -735,7 +759,7 @@ function isLocal(url) {
735
759
  * — and cleared again after the test, like any address a test reads. Returns
736
760
  * the session the auth server then reports, as better-auth hands it back.
737
761
  */
738
- async function signInWithMagicLink(browser, auth, email) {
762
+ async function signInWithMagicLink(browser, auth, email = freshAddress()) {
739
763
  const context = currentTestContext();
740
764
  const state = context && contexts.get(context.id);
741
765
  if (!state) throw new UnknownTestContext("signIn", context?.id);
@@ -751,6 +775,18 @@ async function signInWithMagicLink(browser, auth, email) {
751
775
  if (!data) throw new SignInFailed(email, "the auth server reported no session after the link was opened");
752
776
  return data;
753
777
  }
778
+ /**
779
+ * An address nobody else signs in as — what `browser.signIn()` uses when the
780
+ * test does not care who it is.
781
+ *
782
+ * Unique rather than only seeded: tests in other files run at the same time,
783
+ * against the same Mailpit and the same unique columns, and a seeded address
784
+ * repeats wherever two tests share a name. The readable half is the seeded
785
+ * faker's, so a failure still names somebody.
786
+ */
787
+ function freshAddress() {
788
+ return `${faker.internet.username().toLowerCase().replace(/[^a-z0-9]/g, "")}.${randomUUID().slice(0, 8)}@example.test`;
789
+ }
754
790
  /** `browser.signIn` finished without a session. */
755
791
  var SignInFailed = class extends Error {
756
792
  email;