@geekmidas/constructs 10.0.0-alpha.12 → 10.0.0-alpha.120

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 (454) hide show
  1. package/README.md +222 -158
  2. package/dist/Construct-B7AXn0xH.d.mts +230 -0
  3. package/dist/Construct-B7AXn0xH.d.mts.map +1 -0
  4. package/dist/Construct-CFW0zjdD.d.cts +230 -0
  5. package/dist/Construct-CFW0zjdD.d.cts.map +1 -0
  6. package/dist/{Construct-BD5neF7w.mjs → Construct-CKUA-CTA.mjs} +35 -35
  7. package/dist/Construct-CKUA-CTA.mjs.map +1 -0
  8. package/dist/{Construct-CyS3RpTL.cjs → Construct-DEOVauyA.cjs} +55 -49
  9. package/dist/Construct-DEOVauyA.cjs.map +1 -0
  10. package/dist/{Cron-DmQ8vQ4b.d.cts → Cron-bdGRSROY.d.cts} +15 -9
  11. package/dist/Cron-bdGRSROY.d.cts.map +1 -0
  12. package/dist/{Cron-dh4rUgib.d.mts → Cron-i4Uetezh.d.mts} +15 -9
  13. package/dist/Cron-i4Uetezh.d.mts.map +1 -0
  14. package/dist/CronBuilder-9H4BnD6W.d.mts +47 -0
  15. package/dist/CronBuilder-9H4BnD6W.d.mts.map +1 -0
  16. package/dist/{CronBuilder-Da0C0edR.cjs → CronBuilder-BXTG10u5.cjs} +47 -31
  17. package/dist/CronBuilder-BXTG10u5.cjs.map +1 -0
  18. package/dist/CronBuilder-B_24LZpn.d.cts +47 -0
  19. package/dist/CronBuilder-B_24LZpn.d.cts.map +1 -0
  20. package/dist/{CronBuilder-CYKT5RiO.mjs → CronBuilder-D3sF9tS_.mjs} +37 -21
  21. package/dist/CronBuilder-D3sF9tS_.mjs.map +1 -0
  22. package/dist/{Endpoint-BjWKinFA.d.mts → Endpoint-CeFkSwh5.d.mts} +129 -99
  23. package/dist/Endpoint-CeFkSwh5.d.mts.map +1 -0
  24. package/dist/{Endpoint-dav89W6-.d.cts → Endpoint-DgrpG15P.d.cts} +127 -97
  25. package/dist/Endpoint-DgrpG15P.d.cts.map +1 -0
  26. package/dist/{Endpoint-DCQPMdUX.mjs → Endpoint-gPXhHKhJ.mjs} +208 -100
  27. package/dist/Endpoint-gPXhHKhJ.mjs.map +1 -0
  28. package/dist/{Endpoint-DcWXE-SZ.cjs → Endpoint-yhR2T2Wt.cjs} +248 -122
  29. package/dist/Endpoint-yhR2T2Wt.cjs.map +1 -0
  30. package/dist/{EndpointFactory-CdWB7wPw.cjs → EndpointFactory-CSrAyazj.cjs} +361 -112
  31. package/dist/EndpointFactory-CSrAyazj.cjs.map +1 -0
  32. package/dist/{index-lAO9egTb.d.mts → EndpointFactory-Cc863XJS.d.cts} +190 -136
  33. package/dist/EndpointFactory-Cc863XJS.d.cts.map +1 -0
  34. package/dist/{index-Bd5FqCoe.d.cts → EndpointFactory-Dbw9ugkX.d.mts} +189 -135
  35. package/dist/EndpointFactory-Dbw9ugkX.d.mts.map +1 -0
  36. package/dist/{EndpointFactory-CjV8F_lJ.mjs → EndpointFactory-c2ZugGig.mjs} +283 -76
  37. package/dist/EndpointFactory-c2ZugGig.mjs.map +1 -0
  38. package/dist/Function-B0uZhZnU.d.cts +76 -0
  39. package/dist/Function-B0uZhZnU.d.cts.map +1 -0
  40. package/dist/Function-B_9R7Zy1.d.mts +76 -0
  41. package/dist/Function-B_9R7Zy1.d.mts.map +1 -0
  42. package/dist/{HonoEndpointAdaptor-DtL9j19R.cjs → HonoEndpointAdaptor-CN1jjUBJ.cjs} +115 -71
  43. package/dist/HonoEndpointAdaptor-CN1jjUBJ.cjs.map +1 -0
  44. package/dist/{HonoEndpointAdaptor-P1ahhZHu.mjs → HonoEndpointAdaptor-euH1oSdY.mjs} +105 -64
  45. package/dist/HonoEndpointAdaptor-euH1oSdY.mjs.map +1 -0
  46. package/dist/{Queue-D7ZuwBhy.d.cts → Queue-B-dDXyjF.d.mts} +48 -48
  47. package/dist/Queue-B-dDXyjF.d.mts.map +1 -0
  48. package/dist/Queue-BhuofM3k.cjs +109 -0
  49. package/dist/Queue-BhuofM3k.cjs.map +1 -0
  50. package/dist/{Queue-gVGfi2Yk.d.mts → Queue-JbIjVtTf.d.cts} +49 -49
  51. package/dist/Queue-JbIjVtTf.d.cts.map +1 -0
  52. package/dist/Queue-cmhqEBOB.mjs +104 -0
  53. package/dist/Queue-cmhqEBOB.mjs.map +1 -0
  54. package/dist/QueueBuilder-48W-q8In.d.mts +75 -0
  55. package/dist/QueueBuilder-48W-q8In.d.mts.map +1 -0
  56. package/dist/QueueBuilder-DXu1qxT1.mjs +118 -0
  57. package/dist/QueueBuilder-DXu1qxT1.mjs.map +1 -0
  58. package/dist/QueueBuilder-DdU2klPu.cjs +135 -0
  59. package/dist/QueueBuilder-DdU2klPu.cjs.map +1 -0
  60. package/dist/QueueBuilder-MfpkJ3R9.d.cts +75 -0
  61. package/dist/QueueBuilder-MfpkJ3R9.d.cts.map +1 -0
  62. package/dist/{Subscriber-2mEi0ImH.d.cts → Subscriber-CEt7kHkc.d.cts} +29 -20
  63. package/dist/Subscriber-CEt7kHkc.d.cts.map +1 -0
  64. package/dist/{Subscriber-xTJ9ayPN.d.mts → Subscriber-dsxc5LKa.d.mts} +29 -20
  65. package/dist/Subscriber-dsxc5LKa.d.mts.map +1 -0
  66. package/dist/SubscriberBuilder-BRa_nrmH.d.cts +67 -0
  67. package/dist/SubscriberBuilder-BRa_nrmH.d.cts.map +1 -0
  68. package/dist/SubscriberBuilder-D9bkrYzH.d.mts +67 -0
  69. package/dist/SubscriberBuilder-D9bkrYzH.d.mts.map +1 -0
  70. package/dist/{SubscriberBuilder-BjkbeT9l.mjs → SubscriberBuilder-DRXfxWn_.mjs} +50 -24
  71. package/dist/SubscriberBuilder-DRXfxWn_.mjs.map +1 -0
  72. package/dist/{SubscriberBuilder-4OPehf2R.cjs → SubscriberBuilder-M2EAgQhC.cjs} +61 -36
  73. package/dist/SubscriberBuilder-M2EAgQhC.cjs.map +1 -0
  74. package/dist/Topic-D2R0r24C.mjs +99 -0
  75. package/dist/Topic-D2R0r24C.mjs.map +1 -0
  76. package/dist/Topic-DwS3QO0m.cjs +104 -0
  77. package/dist/Topic-DwS3QO0m.cjs.map +1 -0
  78. package/dist/adaptors/aws.cjs +200 -246
  79. package/dist/adaptors/aws.cjs.map +1 -1
  80. package/dist/adaptors/aws.d.cts +58 -62
  81. package/dist/adaptors/aws.d.cts.map +1 -1
  82. package/dist/adaptors/aws.d.mts +59 -63
  83. package/dist/adaptors/aws.d.mts.map +1 -1
  84. package/dist/adaptors/aws.mjs +171 -219
  85. package/dist/adaptors/aws.mjs.map +1 -1
  86. package/dist/adaptors/hono.cjs +3 -10
  87. package/dist/adaptors/hono.d.cts +7 -16
  88. package/dist/adaptors/hono.d.cts.map +1 -1
  89. package/dist/adaptors/hono.d.mts +9 -18
  90. package/dist/adaptors/hono.d.mts.map +1 -1
  91. package/dist/adaptors/hono.mjs +2 -10
  92. package/dist/adaptors/testing.cjs +765 -99
  93. package/dist/adaptors/testing.cjs.map +1 -1
  94. package/dist/adaptors/testing.d.cts +351 -54
  95. package/dist/adaptors/testing.d.cts.map +1 -1
  96. package/dist/adaptors/testing.d.mts +351 -54
  97. package/dist/adaptors/testing.d.mts.map +1 -1
  98. package/dist/adaptors/testing.mjs +726 -78
  99. package/dist/adaptors/testing.mjs.map +1 -1
  100. package/dist/auth-BMCJN30Y.d.cts +268 -0
  101. package/dist/auth-BMCJN30Y.d.cts.map +1 -0
  102. package/dist/auth-D_0788uW.d.mts +268 -0
  103. package/dist/auth-D_0788uW.d.mts.map +1 -0
  104. package/dist/auth.cjs +301 -33
  105. package/dist/auth.cjs.map +1 -1
  106. package/dist/auth.d.cts +2 -108
  107. package/dist/auth.d.mts +2 -108
  108. package/dist/auth.mjs +289 -27
  109. package/dist/auth.mjs.map +1 -1
  110. package/dist/{cache-BrRz3fEB.d.mts → cache-5QZzh5Er.d.mts} +3 -6
  111. package/dist/cache-5QZzh5Er.d.mts.map +1 -0
  112. package/dist/{cache-BtZY_tHe.d.cts → cache-DnGDGly3.d.cts} +3 -6
  113. package/dist/cache-DnGDGly3.d.cts.map +1 -0
  114. package/dist/cache.cjs +68 -2
  115. package/dist/cache.cjs.map +1 -0
  116. package/dist/cache.d.cts +1 -2
  117. package/dist/cache.d.mts +1 -2
  118. package/dist/cache.mjs +67 -2
  119. package/dist/cache.mjs.map +1 -0
  120. package/dist/cipher-C1lEFX63.mjs +225 -0
  121. package/dist/cipher-C1lEFX63.mjs.map +1 -0
  122. package/dist/cipher-CVxfwLjk.cjs +332 -0
  123. package/dist/cipher-CVxfwLjk.cjs.map +1 -0
  124. package/dist/cipher-DSDxPRIp.d.cts +106 -0
  125. package/dist/cipher-DSDxPRIp.d.cts.map +1 -0
  126. package/dist/cipher-DSDxPRIp.d.mts +106 -0
  127. package/dist/cipher-DSDxPRIp.d.mts.map +1 -0
  128. package/dist/{clone-DblgEZZa.mjs → clone-EKNovYHu.mjs} +3 -3
  129. package/dist/clone-EKNovYHu.mjs.map +1 -0
  130. package/dist/{clone-Dy0cR2SZ.cjs → clone-UGJpvQnL.cjs} +7 -8
  131. package/dist/clone-UGJpvQnL.cjs.map +1 -0
  132. package/dist/{construct-interface-D9d4Gm4p.d.cts → construct-interface-B1AfqRl4.d.cts} +42 -11
  133. package/dist/construct-interface-B1AfqRl4.d.cts.map +1 -0
  134. package/dist/{construct-interface-g5GM5pwR.d.mts → construct-interface-ZvYQbivO.d.mts} +42 -11
  135. package/dist/construct-interface-ZvYQbivO.d.mts.map +1 -0
  136. package/dist/construct-interface.cjs +113 -7
  137. package/dist/construct-interface.cjs.map +1 -0
  138. package/dist/construct-interface.d.cts +2 -2
  139. package/dist/construct-interface.d.mts +2 -2
  140. package/dist/construct-interface.mjs +106 -2
  141. package/dist/construct-interface.mjs.map +1 -0
  142. package/dist/credential-DYymbp_7.cjs +257 -0
  143. package/dist/credential-DYymbp_7.cjs.map +1 -0
  144. package/dist/credential-DfSAOOdY.mjs +222 -0
  145. package/dist/credential-DfSAOOdY.mjs.map +1 -0
  146. package/dist/credential.cjs +8 -96
  147. package/dist/credential.d.cts +2 -61
  148. package/dist/credential.d.mts +2 -61
  149. package/dist/credential.mjs +2 -94
  150. package/dist/crons/index.cjs +129 -7
  151. package/dist/crons/index.cjs.map +1 -1
  152. package/dist/crons/index.d.cts +45 -11
  153. package/dist/crons/index.d.cts.map +1 -1
  154. package/dist/crons/index.d.mts +45 -11
  155. package/dist/crons/index.d.mts.map +1 -1
  156. package/dist/crons/index.mjs +127 -8
  157. package/dist/crons/index.mjs.map +1 -1
  158. package/dist/database/kysely.cjs +4 -181
  159. package/dist/database/kysely.d.cts +2 -152
  160. package/dist/database/kysely.d.mts +2 -152
  161. package/dist/database/kysely.mjs +2 -180
  162. package/dist/email.cjs +25 -12
  163. package/dist/email.cjs.map +1 -1
  164. package/dist/email.d.cts +3 -7
  165. package/dist/email.d.cts.map +1 -1
  166. package/dist/email.d.mts +4 -8
  167. package/dist/email.d.mts.map +1 -1
  168. package/dist/email.mjs +16 -3
  169. package/dist/email.mjs.map +1 -1
  170. package/dist/encryption/kms.cjs +95 -0
  171. package/dist/encryption/kms.cjs.map +1 -0
  172. package/dist/encryption/kms.d.cts +7 -0
  173. package/dist/encryption/kms.d.cts.map +1 -0
  174. package/dist/encryption/kms.d.mts +7 -0
  175. package/dist/encryption/kms.d.mts.map +1 -0
  176. package/dist/encryption/kms.mjs +93 -0
  177. package/dist/encryption/kms.mjs.map +1 -0
  178. package/dist/encryption.cjs +116 -0
  179. package/dist/encryption.cjs.map +1 -0
  180. package/dist/encryption.d.cts +37 -0
  181. package/dist/encryption.d.cts.map +1 -0
  182. package/dist/encryption.d.mts +37 -0
  183. package/dist/encryption.d.mts.map +1 -0
  184. package/dist/encryption.mjs +101 -0
  185. package/dist/encryption.mjs.map +1 -0
  186. package/dist/endpoints/index.cjs +27 -16
  187. package/dist/endpoints/index.d.cts +105 -7
  188. package/dist/endpoints/index.d.cts.map +1 -0
  189. package/dist/endpoints/index.d.mts +105 -7
  190. package/dist/endpoints/index.d.mts.map +1 -0
  191. package/dist/endpoints/index.mjs +6 -10
  192. package/dist/expire-C586zznE.d.cts +38 -0
  193. package/dist/expire-C586zznE.d.cts.map +1 -0
  194. package/dist/expire-C586zznE.d.mts +38 -0
  195. package/dist/expire-C586zznE.d.mts.map +1 -0
  196. package/dist/expire-CieftS01.cjs +67 -0
  197. package/dist/expire-CieftS01.cjs.map +1 -0
  198. package/dist/expire-CpzUAfr9.mjs +50 -0
  199. package/dist/expire-CpzUAfr9.mjs.map +1 -0
  200. package/dist/external-api.cjs +106 -0
  201. package/dist/external-api.cjs.map +1 -0
  202. package/dist/external-api.d.cts +2 -0
  203. package/dist/external-api.d.mts +2 -0
  204. package/dist/external-api.mjs +103 -0
  205. package/dist/external-api.mjs.map +1 -0
  206. package/dist/fake-B7rvi4Qp.d.cts +201 -0
  207. package/dist/fake-B7rvi4Qp.d.cts.map +1 -0
  208. package/dist/fake-JXbkdao8.d.mts +201 -0
  209. package/dist/fake-JXbkdao8.d.mts.map +1 -0
  210. package/dist/file-server.cjs +66 -11
  211. package/dist/file-server.cjs.map +1 -1
  212. package/dist/file-server.d.cts +25 -10
  213. package/dist/file-server.d.cts.map +1 -1
  214. package/dist/file-server.d.mts +25 -10
  215. package/dist/file-server.d.mts.map +1 -1
  216. package/dist/file-server.mjs +58 -4
  217. package/dist/file-server.mjs.map +1 -1
  218. package/dist/functions/index.cjs +3 -6
  219. package/dist/functions/index.d.cts +3 -4
  220. package/dist/functions/index.d.mts +3 -4
  221. package/dist/functions/index.mjs +2 -6
  222. package/dist/{functions-14lpEFL4.mjs → functions-CTI-hDem.mjs} +376 -238
  223. package/dist/{functions-14lpEFL4.mjs.map → functions-CTI-hDem.mjs.map} +1 -1
  224. package/dist/{functions-i_la-N5r.cjs → functions-D7O5SGVc.cjs} +414 -264
  225. package/dist/functions-D7O5SGVc.cjs.map +1 -0
  226. package/dist/index-Cd2w-DRL.d.cts +115 -0
  227. package/dist/index-Cd2w-DRL.d.cts.map +1 -0
  228. package/dist/index-DdRjYhiJ.d.cts +119 -0
  229. package/dist/index-DdRjYhiJ.d.cts.map +1 -0
  230. package/dist/index-DdRjYhiJ.d.mts +119 -0
  231. package/dist/index-DdRjYhiJ.d.mts.map +1 -0
  232. package/dist/index-aBIcAiH5.d.mts +115 -0
  233. package/dist/index-aBIcAiH5.d.mts.map +1 -0
  234. package/dist/index.cjs +6 -3
  235. package/dist/index.d.cts +27 -4
  236. package/dist/index.d.cts.map +1 -0
  237. package/dist/index.d.mts +27 -4
  238. package/dist/index.d.mts.map +1 -0
  239. package/dist/index.mjs +3 -3
  240. package/dist/kysely-BHYV-WC-.d.cts +216 -0
  241. package/dist/kysely-BHYV-WC-.d.cts.map +1 -0
  242. package/dist/kysely-CAW3QSqp.d.mts +216 -0
  243. package/dist/kysely-CAW3QSqp.d.mts.map +1 -0
  244. package/dist/kysely-Cs4uPO8k.mjs +371 -0
  245. package/dist/kysely-Cs4uPO8k.mjs.map +1 -0
  246. package/dist/kysely-CukArHJ0.cjs +384 -0
  247. package/dist/kysely-CukArHJ0.cjs.map +1 -0
  248. package/dist/{telemetry-C3L0iS28.d.cts → lambdaTelemetry-8vnmVZQ5.d.cts} +3 -6
  249. package/dist/lambdaTelemetry-8vnmVZQ5.d.cts.map +1 -0
  250. package/dist/{telemetry-D7bVFLGi.d.mts → lambdaTelemetry-8vnmVZQ5.d.mts} +3 -6
  251. package/dist/lambdaTelemetry-8vnmVZQ5.d.mts.map +1 -0
  252. package/dist/mobile-app.cjs +74 -0
  253. package/dist/mobile-app.cjs.map +1 -0
  254. package/dist/mobile-app.d.cts +73 -0
  255. package/dist/mobile-app.d.cts.map +1 -0
  256. package/dist/mobile-app.d.mts +73 -0
  257. package/dist/mobile-app.d.mts.map +1 -0
  258. package/dist/mobile-app.mjs +73 -0
  259. package/dist/mobile-app.mjs.map +1 -0
  260. package/dist/object-storage.cjs +26 -11
  261. package/dist/object-storage.cjs.map +1 -1
  262. package/dist/object-storage.d.cts +12 -7
  263. package/dist/object-storage.d.cts.map +1 -1
  264. package/dist/object-storage.d.mts +12 -7
  265. package/dist/object-storage.d.mts.map +1 -1
  266. package/dist/object-storage.mjs +18 -5
  267. package/dist/object-storage.mjs.map +1 -1
  268. package/dist/queue/index.cjs +6 -189
  269. package/dist/queue/index.d.cts +3 -60
  270. package/dist/queue/index.d.mts +3 -60
  271. package/dist/queue/index.mjs +3 -186
  272. package/dist/random-password.cjs +86 -0
  273. package/dist/random-password.cjs.map +1 -0
  274. package/dist/random-password.d.cts +30 -0
  275. package/dist/random-password.d.cts.map +1 -0
  276. package/dist/random-password.d.mts +30 -0
  277. package/dist/random-password.d.mts.map +1 -0
  278. package/dist/random-password.mjs +84 -0
  279. package/dist/random-password.mjs.map +1 -0
  280. package/dist/{lazyAccessors-BoJN3SMd.mjs → readRequestBody-BTIl3k-D.mjs} +117 -60
  281. package/dist/readRequestBody-BTIl3k-D.mjs.map +1 -0
  282. package/dist/readRequestBody-Dej_L3c4.cjs +342 -0
  283. package/dist/readRequestBody-Dej_L3c4.cjs.map +1 -0
  284. package/dist/requestLogger-BZcXwdBs.cjs +207 -0
  285. package/dist/requestLogger-BZcXwdBs.cjs.map +1 -0
  286. package/dist/requestLogger-pA4gi3E1.mjs +178 -0
  287. package/dist/requestLogger-pA4gi3E1.mjs.map +1 -0
  288. package/dist/rest-api.cjs +90 -59
  289. package/dist/rest-api.cjs.map +1 -1
  290. package/dist/rest-api.d.cts +70 -42
  291. package/dist/rest-api.d.cts.map +1 -1
  292. package/dist/rest-api.d.mts +70 -42
  293. package/dist/rest-api.d.mts.map +1 -1
  294. package/dist/rest-api.mjs +82 -51
  295. package/dist/rest-api.mjs.map +1 -1
  296. package/dist/{chunk-DWy1uDak.cjs → rolldown-runtime-y5ARvAq5.cjs} +14 -18
  297. package/dist/runSubscriber-BHvJ8POr.mjs +109 -0
  298. package/dist/runSubscriber-BHvJ8POr.mjs.map +1 -0
  299. package/dist/runSubscriber-D8nLXIv1.cjs +126 -0
  300. package/dist/runSubscriber-D8nLXIv1.cjs.map +1 -0
  301. package/dist/shutdown-BMJmAhSt.cjs +38 -0
  302. package/dist/shutdown-BMJmAhSt.cjs.map +1 -0
  303. package/dist/shutdown-C7xa8x9S.mjs +27 -0
  304. package/dist/shutdown-C7xa8x9S.mjs.map +1 -0
  305. package/dist/site.cjs +33 -7
  306. package/dist/site.cjs.map +1 -1
  307. package/dist/site.d.cts +17 -7
  308. package/dist/site.d.cts.map +1 -1
  309. package/dist/site.d.mts +17 -7
  310. package/dist/site.d.mts.map +1 -1
  311. package/dist/site.mjs +29 -3
  312. package/dist/site.mjs.map +1 -1
  313. package/dist/stages-BSCF19o2.d.cts +56 -0
  314. package/dist/stages-BSCF19o2.d.cts.map +1 -0
  315. package/dist/stages-BSCF19o2.d.mts +56 -0
  316. package/dist/stages-BSCF19o2.d.mts.map +1 -0
  317. package/dist/subscribers/index.cjs +118 -6
  318. package/dist/subscribers/index.cjs.map +1 -0
  319. package/dist/subscribers/index.d.cts +51 -6
  320. package/dist/subscribers/index.d.cts.map +1 -0
  321. package/dist/subscribers/index.d.mts +51 -6
  322. package/dist/subscribers/index.d.mts.map +1 -0
  323. package/dist/subscribers/index.mjs +115 -5
  324. package/dist/subscribers/index.mjs.map +1 -0
  325. package/dist/surfaceEnv-CNimK76p.cjs +56 -0
  326. package/dist/surfaceEnv-CNimK76p.cjs.map +1 -0
  327. package/dist/surfaceEnv-wMT5QzgZ.mjs +45 -0
  328. package/dist/surfaceEnv-wMT5QzgZ.mjs.map +1 -0
  329. package/dist/telemetry-B48RLjyk.d.cts +40 -0
  330. package/dist/telemetry-B48RLjyk.d.cts.map +1 -0
  331. package/dist/telemetry-BEoBn6GO.d.mts +40 -0
  332. package/dist/telemetry-BEoBn6GO.d.mts.map +1 -0
  333. package/dist/telemetry.cjs +56 -0
  334. package/dist/telemetry.cjs.map +1 -0
  335. package/dist/telemetry.d.cts +2 -0
  336. package/dist/telemetry.d.mts +2 -0
  337. package/dist/telemetry.mjs +55 -0
  338. package/dist/telemetry.mjs.map +1 -0
  339. package/dist/topic/index.cjs +3 -137
  340. package/dist/topic/index.d.cts +2 -4
  341. package/dist/topic/index.d.mts +2 -4
  342. package/dist/topic/index.mjs +2 -134
  343. package/dist/tracing-Bbj1uoFJ.mjs +127 -0
  344. package/dist/tracing-Bbj1uoFJ.mjs.map +1 -0
  345. package/dist/tracing-C0ooU0V2.cjs +150 -0
  346. package/dist/tracing-C0ooU0V2.cjs.map +1 -0
  347. package/dist/{types-BlAkSuGI.d.cts → types-DMuSQeLL.d.cts} +3 -5
  348. package/dist/types-DMuSQeLL.d.cts.map +1 -0
  349. package/dist/{types-aKksMEWL.d.mts → types-DMuSQeLL.d.mts} +3 -5
  350. package/dist/types-DMuSQeLL.d.mts.map +1 -0
  351. package/dist/types.d.cts +1 -1
  352. package/dist/types.d.mts +1 -1
  353. package/dist/types.mjs +1 -0
  354. package/dist/worker.cjs +59 -34
  355. package/dist/worker.cjs.map +1 -1
  356. package/dist/worker.d.cts +70 -45
  357. package/dist/worker.d.cts.map +1 -1
  358. package/dist/worker.d.mts +71 -45
  359. package/dist/worker.d.mts.map +1 -1
  360. package/dist/worker.mjs +54 -29
  361. package/dist/worker.mjs.map +1 -1
  362. package/package.json +115 -41
  363. package/dist/Construct-BD5neF7w.mjs.map +0 -1
  364. package/dist/Construct-C0ijr2qp.d.cts +0 -117
  365. package/dist/Construct-C0ijr2qp.d.cts.map +0 -1
  366. package/dist/Construct-Ct8nalEi.d.mts +0 -117
  367. package/dist/Construct-Ct8nalEi.d.mts.map +0 -1
  368. package/dist/Construct-CyS3RpTL.cjs.map +0 -1
  369. package/dist/Cron-DmQ8vQ4b.d.cts.map +0 -1
  370. package/dist/Cron-dh4rUgib.d.mts.map +0 -1
  371. package/dist/CronBuilder-BquXDbDI.d.cts +0 -44
  372. package/dist/CronBuilder-BquXDbDI.d.cts.map +0 -1
  373. package/dist/CronBuilder-CGgY2080.d.mts +0 -44
  374. package/dist/CronBuilder-CGgY2080.d.mts.map +0 -1
  375. package/dist/CronBuilder-CYKT5RiO.mjs.map +0 -1
  376. package/dist/CronBuilder-Da0C0edR.cjs.map +0 -1
  377. package/dist/Endpoint-BjWKinFA.d.mts.map +0 -1
  378. package/dist/Endpoint-DCQPMdUX.mjs.map +0 -1
  379. package/dist/Endpoint-DcWXE-SZ.cjs.map +0 -1
  380. package/dist/Endpoint-dav89W6-.d.cts.map +0 -1
  381. package/dist/EndpointFactory-CdWB7wPw.cjs.map +0 -1
  382. package/dist/EndpointFactory-CjV8F_lJ.mjs.map +0 -1
  383. package/dist/HonoEndpointAdaptor-DtL9j19R.cjs.map +0 -1
  384. package/dist/HonoEndpointAdaptor-P1ahhZHu.mjs.map +0 -1
  385. package/dist/Queue-D7ZuwBhy.d.cts.map +0 -1
  386. package/dist/Queue-gVGfi2Yk.d.mts.map +0 -1
  387. package/dist/Subscriber-2mEi0ImH.d.cts.map +0 -1
  388. package/dist/Subscriber-xTJ9ayPN.d.mts.map +0 -1
  389. package/dist/SubscriberBuilder-4OPehf2R.cjs.map +0 -1
  390. package/dist/SubscriberBuilder-BjkbeT9l.mjs.map +0 -1
  391. package/dist/SubscriberBuilder-Dptmo-1A.d.mts +0 -62
  392. package/dist/SubscriberBuilder-Dptmo-1A.d.mts.map +0 -1
  393. package/dist/SubscriberBuilder-waNhzjSM.d.cts +0 -62
  394. package/dist/SubscriberBuilder-waNhzjSM.d.cts.map +0 -1
  395. package/dist/Topic-19QeHBIR.d.cts +0 -91
  396. package/dist/Topic-19QeHBIR.d.cts.map +0 -1
  397. package/dist/Topic-DuFeqkBh.d.mts +0 -91
  398. package/dist/Topic-DuFeqkBh.d.mts.map +0 -1
  399. package/dist/auth.d.cts.map +0 -1
  400. package/dist/auth.d.mts.map +0 -1
  401. package/dist/cache-0ANvRQnD.mjs +0 -51
  402. package/dist/cache-0ANvRQnD.mjs.map +0 -1
  403. package/dist/cache-3WSvAulx.cjs +0 -57
  404. package/dist/cache-3WSvAulx.cjs.map +0 -1
  405. package/dist/cache-BrRz3fEB.d.mts.map +0 -1
  406. package/dist/cache-BtZY_tHe.d.cts.map +0 -1
  407. package/dist/clone-DblgEZZa.mjs.map +0 -1
  408. package/dist/clone-Dy0cR2SZ.cjs.map +0 -1
  409. package/dist/construct-interface-BfjcOD_E.cjs +0 -117
  410. package/dist/construct-interface-BfjcOD_E.cjs.map +0 -1
  411. package/dist/construct-interface-D9d4Gm4p.d.cts.map +0 -1
  412. package/dist/construct-interface-Z4CpS8tK.mjs +0 -81
  413. package/dist/construct-interface-Z4CpS8tK.mjs.map +0 -1
  414. package/dist/construct-interface-g5GM5pwR.d.mts.map +0 -1
  415. package/dist/credential.cjs.map +0 -1
  416. package/dist/credential.d.cts.map +0 -1
  417. package/dist/credential.d.mts.map +0 -1
  418. package/dist/credential.mjs.map +0 -1
  419. package/dist/database/kysely.cjs.map +0 -1
  420. package/dist/database/kysely.d.cts.map +0 -1
  421. package/dist/database/kysely.d.mts.map +0 -1
  422. package/dist/database/kysely.mjs.map +0 -1
  423. package/dist/functions-i_la-N5r.cjs.map +0 -1
  424. package/dist/index-Bd5FqCoe.d.cts.map +0 -1
  425. package/dist/index-BknhM6Ux.d.mts +0 -31
  426. package/dist/index-BknhM6Ux.d.mts.map +0 -1
  427. package/dist/index-CBSfrowv.d.cts +0 -31
  428. package/dist/index-CBSfrowv.d.cts.map +0 -1
  429. package/dist/index-D24Xm79M.d.cts +0 -171
  430. package/dist/index-D24Xm79M.d.cts.map +0 -1
  431. package/dist/index-_ajboYxK.d.mts +0 -171
  432. package/dist/index-_ajboYxK.d.mts.map +0 -1
  433. package/dist/index-lAO9egTb.d.mts.map +0 -1
  434. package/dist/lazyAccessors-BoJN3SMd.mjs.map +0 -1
  435. package/dist/lazyAccessors-e3j2oE2m.cjs +0 -274
  436. package/dist/lazyAccessors-e3j2oE2m.cjs.map +0 -1
  437. package/dist/processAudits-CGqttuXm.cjs +0 -92
  438. package/dist/processAudits-CGqttuXm.cjs.map +0 -1
  439. package/dist/processAudits-Dmts9H_b.mjs +0 -80
  440. package/dist/processAudits-Dmts9H_b.mjs.map +0 -1
  441. package/dist/queue/index.cjs.map +0 -1
  442. package/dist/queue/index.d.cts.map +0 -1
  443. package/dist/queue/index.d.mts.map +0 -1
  444. package/dist/queue/index.mjs.map +0 -1
  445. package/dist/surfaceEnv-BFXEms2f.cjs +0 -39
  446. package/dist/surfaceEnv-BFXEms2f.cjs.map +0 -1
  447. package/dist/surfaceEnv-C3Ktahea.mjs +0 -27
  448. package/dist/surfaceEnv-C3Ktahea.mjs.map +0 -1
  449. package/dist/telemetry-C3L0iS28.d.cts.map +0 -1
  450. package/dist/telemetry-D7bVFLGi.d.mts.map +0 -1
  451. package/dist/topic/index.cjs.map +0 -1
  452. package/dist/topic/index.mjs.map +0 -1
  453. package/dist/types-BlAkSuGI.d.cts.map +0 -1
  454. package/dist/types-aKksMEWL.d.mts.map +0 -1
@@ -0,0 +1,103 @@
1
+ import { a as fake, i as readCredentials, o as isFake } from "./credential-DfSAOOdY.mjs";
2
+ import { i as traceClient } from "./tracing-Bbj1uoFJ.mjs";
3
+ import { canonicalId, provideKey, serviceKey } from "@geekmidas/manifest";
4
+ //#region src/external-api.ts
5
+ /**
6
+ * `ExternalApi` — an HTTP API somebody else runs.
7
+ *
8
+ * Polar, Stripe, a payment gateway: nothing to provision, but an address that
9
+ * changes by stage and credentials the provider issued for each one. Without a
10
+ * construct every integration writes that switching by hand — an optional
11
+ * `POLAR_URL`, a fake started somewhere, a client built in a service — and the
12
+ * target cannot see any of it.
13
+ *
14
+ * ```ts
15
+ * // constructs/polar.ts
16
+ * export const polar = new ExternalApi('Polar', {
17
+ * url: 'https://www.polaraccesslink.com',
18
+ * credentials: z.object({ clientId: z.string(), clientSecret: z.string() }),
19
+ * client: ({ url, credentials }) => new PolarClient(url, credentials),
20
+ * });
21
+ *
22
+ * // test/fakes/polar.ts
23
+ * export default fake.app(new Hono().post('/v3/oauth2/token', …), {
24
+ * credentials: { clientId: 'fake', clientSecret: 'fake' },
25
+ * });
26
+ *
27
+ * // in a handler — the real API deployed, the fake locally and in tests
28
+ * .dependsOn([polar])
29
+ * .handle(({ services }) => services.polar.exchangeCode(code))
30
+ * ```
31
+ *
32
+ * Deployed, the URL is `url` — one for every stage, or one per stage name with
33
+ * a `default` — and the credentials are the stage's `<ID>_CREDENTIALS`, one
34
+ * JSON value read the way a `Credential`'s is. Locally and in tests both come
35
+ * from the fake.
36
+ *
37
+ * **The construct never names its fake.** It is found by convention, at
38
+ * `test/fakes/<id>.ts`, and read only by gkm and the generated test harness —
39
+ * so a fake, and the recorded responses it answers from, cannot end up in a
40
+ * deployed bundle however the bundler follows imports.
41
+ */
42
+ var ExternalApi = class {
43
+ options;
44
+ id;
45
+ service;
46
+ /** Read by both `declare()` and `connect()`, so the two cannot drift. */
47
+ keys;
48
+ /** The promise, so concurrent registrations share one client. */
49
+ connected;
50
+ constructor(id, options) {
51
+ this.options = options;
52
+ const canonical = canonicalId(id);
53
+ this.id = canonical;
54
+ this.keys = {
55
+ url: provideKey(canonical, "url"),
56
+ credentials: provideKey(canonical, "credentials")
57
+ };
58
+ this.service = {
59
+ serviceName: serviceKey(canonical),
60
+ register: (registerOptions) => {
61
+ this.connected ??= this.connect(registerOptions);
62
+ return this.connected;
63
+ }
64
+ };
65
+ }
66
+ /**
67
+ * What the stage's `<ID>_CREDENTIALS` must look like — the schema the value
68
+ * is validated against where it is read. Public so a tool setting the value
69
+ * (`gkm secrets:add`) can check it, and describe its fields, before it is
70
+ * stored rather than at the first request.
71
+ */
72
+ get credentialsSchema() {
73
+ return this.options.credentials;
74
+ }
75
+ declare() {
76
+ return [{
77
+ kind: "external-api",
78
+ id: this.id,
79
+ url: this.options.url,
80
+ provides: [this.keys.url, this.keys.credentials]
81
+ }];
82
+ }
83
+ async connect(options) {
84
+ const { url } = options.envParser.create((get) => ({ url: get(this.keys.url).string() })).parse();
85
+ const credentials = await readCredentials(this.id, this.keys.credentials, this.options.credentials, options.envParser);
86
+ const client = await this.options.client({
87
+ url,
88
+ credentials
89
+ });
90
+ return traceClient(this.id, client, { "server.address": hostOf(url) });
91
+ }
92
+ };
93
+ function hostOf(url) {
94
+ try {
95
+ return new URL(url).host;
96
+ } catch {
97
+ return url;
98
+ }
99
+ }
100
+ //#endregion
101
+ export { ExternalApi, fake, isFake };
102
+
103
+ //# sourceMappingURL=external-api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-api.mjs","names":[],"sources":["../src/external-api.ts"],"sourcesContent":["/**\n * `ExternalApi` — an HTTP API somebody else runs.\n *\n * Polar, Stripe, a payment gateway: nothing to provision, but an address that\n * changes by stage and credentials the provider issued for each one. Without a\n * construct every integration writes that switching by hand — an optional\n * `POLAR_URL`, a fake started somewhere, a client built in a service — and the\n * target cannot see any of it.\n *\n * ```ts\n * // constructs/polar.ts\n * export const polar = new ExternalApi('Polar', {\n * url: 'https://www.polaraccesslink.com',\n * credentials: z.object({ clientId: z.string(), clientSecret: z.string() }),\n * client: ({ url, credentials }) => new PolarClient(url, credentials),\n * });\n *\n * // test/fakes/polar.ts\n * export default fake.app(new Hono().post('/v3/oauth2/token', …), {\n * credentials: { clientId: 'fake', clientSecret: 'fake' },\n * });\n *\n * // in a handler — the real API deployed, the fake locally and in tests\n * .dependsOn([polar])\n * .handle(({ services }) => services.polar.exchangeCode(code))\n * ```\n *\n * Deployed, the URL is `url` — one for every stage, or one per stage name with\n * a `default` — and the credentials are the stage's `<ID>_CREDENTIALS`, one\n * JSON value read the way a `Credential`'s is. Locally and in tests both come\n * from the fake.\n *\n * **The construct never names its fake.** It is found by convention, at\n * `test/fakes/<id>.ts`, and read only by gkm and the generated test harness —\n * so a fake, and the recorded responses it answers from, cannot end up in a\n * deployed bundle however the bundler follows imports.\n */\n\nimport {\n\ttype ConstructName,\n\tcanonicalId,\n\ttype Declaration,\n\tprovideKey,\n\tserviceKey,\n} from '@geekmidas/manifest';\nimport type { Service, ServiceRegisterOptions } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Consumable } from './construct-interface';\nimport { readCredentials } from './credential';\nimport type { DeployedStage, LocalStage } from './stages';\nimport { traceClient } from './tracing';\n\n/** What a credentials schema yields. */\ntype Value<TSchema extends StandardSchemaV1> =\n\tStandardSchemaV1.InferOutput<TSchema>;\n\n/**\n * Where an external API answers: one URL for every stage, or one per stage\n * name with `default` for any stage not listed.\n *\n * Keyed by the stages `gkm.config.ts` declares once `.gkm/stages.d.ts` exists,\n * so a key that names no stage — `prodution` — is a type error rather than a\n * URL nothing reads. Without the file any key goes, as before.\n */\nexport type ExternalApiUrl =\n\t| string\n\t| (string extends LocalStage | DeployedStage\n\t\t\t? Readonly<Record<string, string>>\n\t\t\t: { readonly [S in LocalStage | DeployedStage]?: string } & {\n\t\t\t\t\treadonly default?: string;\n\t\t\t\t});\n\nexport interface ExternalApiOptions<TSchema extends StandardSchemaV1, TClient> {\n\t/**\n\t * Where it answers deployed: one URL for every stage, or one per stage\n\t * name, with `default` for any stage not listed.\n\t */\n\turl: ExternalApiUrl;\n\t/** What the stage's `<ID>_CREDENTIALS` must look like. */\n\tcredentials: TSchema;\n\t/** What a handler is handed, built from where it answers and the credentials. */\n\tclient: (connection: {\n\t\turl: string;\n\t\tcredentials: Value<TSchema>;\n\t}) => TClient | Promise<TClient>;\n}\n\nexport class ExternalApi<\n\tTName extends string = string,\n\tTSchema extends StandardSchemaV1 = StandardSchemaV1,\n\tTClient = unknown,\n> implements Consumable<TName, TClient>\n{\n\t// `Consumable` for the reason `Credential` gives: a client generic in\n\t// `TClient` cannot satisfy `Construct`'s conditional service type.\n\treadonly id: TName;\n\treadonly service: Service<Uncapitalize<TName>, TClient>;\n\n\t/** Read by both `declare()` and `connect()`, so the two cannot drift. */\n\tprivate readonly keys: { url: string; credentials: string };\n\n\t/** The promise, so concurrent registrations share one client. */\n\tprivate connected?: Promise<TClient>;\n\n\tconstructor(\n\t\tid: ConstructName<TName>,\n\t\tprivate readonly options: ExternalApiOptions<TSchema, TClient>,\n\t) {\n\t\tconst canonical = canonicalId(id as string);\n\n\t\tthis.id = canonical as TName;\n\t\tthis.keys = {\n\t\t\turl: provideKey(canonical, 'url'),\n\t\t\tcredentials: provideKey(canonical, 'credentials'),\n\t\t};\n\n\t\t// A field, not a getter: consumers cache services by object identity.\n\t\tthis.service = {\n\t\t\tserviceName: serviceKey(canonical) as Uncapitalize<TName>,\n\t\t\tregister: (registerOptions) => {\n\t\t\t\tthis.connected ??= this.connect(registerOptions);\n\t\t\t\treturn this.connected;\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * What the stage's `<ID>_CREDENTIALS` must look like — the schema the value\n\t * is validated against where it is read. Public so a tool setting the value\n\t * (`gkm secrets:add`) can check it, and describe its fields, before it is\n\t * stored rather than at the first request.\n\t */\n\tget credentialsSchema(): TSchema {\n\t\treturn this.options.credentials;\n\t}\n\n\tdeclare(): Declaration[] {\n\t\treturn [\n\t\t\t{\n\t\t\t\tkind: 'external-api',\n\t\t\t\tid: this.id,\n\t\t\t\t// The stage-keyed map is a record of URLs to the manifest, which\n\t\t\t\t// reads it by whatever stage it is resolving.\n\t\t\t\turl: this.options.url as Readonly<Record<string, string>> | string,\n\t\t\t\tprovides: [this.keys.url, this.keys.credentials],\n\t\t\t},\n\t\t];\n\t}\n\n\tprivate async connect(options: ServiceRegisterOptions): Promise<TClient> {\n\t\tconst { url } = options.envParser\n\t\t\t.create((get) => ({ url: get(this.keys.url).string() }))\n\t\t\t.parse();\n\t\tconst credentials = await readCredentials(\n\t\t\tthis.id,\n\t\t\tthis.keys.credentials,\n\t\t\tthis.options.credentials,\n\t\t\toptions.envParser,\n\t\t);\n\n\t\tconst client = await this.options.client({ url, credentials });\n\t\t// Each call a span carrying this API's name — the parent of the fetch\n\t\t// it makes, which is traced already.\n\t\treturn traceClient(this.id, client, {\n\t\t\t'server.address': hostOf(url),\n\t\t});\n\t}\n}\n\nfunction hostOf(url: string): string {\n\ttry {\n\t\treturn new URL(url).host;\n\t} catch {\n\t\treturn url;\n\t}\n}\n\nexport {\n\ttype Fake,\n\ttype FetchHandler,\n\tfake,\n\tisFake,\n} from './fake';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuFA,IAAa,cAAb,MAKA;CAcmB;CAXlB;CACA;;CAGA;;CAGA;CAEA,YACC,IACA,SACC;EADgB,KAAA,UAAA;EAEjB,MAAM,YAAY,YAAY,EAAY;EAE1C,KAAK,KAAK;EACV,KAAK,OAAO;GACX,KAAK,WAAW,WAAW,KAAK;GAChC,aAAa,WAAW,WAAW,aAAa;EACjD;EAGA,KAAK,UAAU;GACd,aAAa,WAAW,SAAS;GACjC,WAAW,oBAAoB;IAC9B,KAAK,cAAc,KAAK,QAAQ,eAAe;IAC/C,OAAO,KAAK;GACb;EACD;CACD;;;;;;;CAQA,IAAI,oBAA6B;EAChC,OAAO,KAAK,QAAQ;CACrB;CAEA,UAAyB;EACxB,OAAO,CACN;GACC,MAAM;GACN,IAAI,KAAK;GAGT,KAAK,KAAK,QAAQ;GAClB,UAAU,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,WAAW;EAChD,CACD;CACD;CAEA,MAAc,QAAQ,SAAmD;EACxE,MAAM,EAAE,QAAQ,QAAQ,UACtB,QAAQ,SAAS,EAAE,KAAK,IAAI,KAAK,KAAK,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CACvD,MAAM;EACR,MAAM,cAAc,MAAM,gBACzB,KAAK,IACL,KAAK,KAAK,aACV,KAAK,QAAQ,aACb,QAAQ,SACT;EAEA,MAAM,SAAS,MAAM,KAAK,QAAQ,OAAO;GAAE;GAAK;EAAY,CAAC;EAG7D,OAAO,YAAY,KAAK,IAAI,QAAQ,EACnC,kBAAkB,OAAO,GAAG,EAC7B,CAAC;CACF;AACD;AAEA,SAAS,OAAO,KAAqB;CACpC,IAAI;EACH,OAAO,IAAI,IAAI,GAAG,CAAC,CAAC;CACrB,QAAQ;EACP,OAAO;CACR;AACD"}
@@ -0,0 +1,201 @@
1
+ import { n as StandardSchemaV1 } from "./index-DdRjYhiJ.cjs";
2
+ import { r as Consumable } from "./construct-interface-B1AfqRl4.cjs";
3
+ import { n as DeployedStage, r as LocalStage } from "./stages-BSCF19o2.cjs";
4
+ import { Service, ServiceRegisterOptions } from "@geekmidas/services";
5
+ import { ConstructName, Declaration } from "@geekmidas/manifest";
6
+ //#region src/credential.d.ts
7
+ /** What a credential's schema yields. */
8
+ type Value$1<TSchema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<TSchema>;
9
+ interface CredentialOptions<TSchema extends StandardSchemaV1> {
10
+ /**
11
+ * What the credential must look like.
12
+ *
13
+ * Validated at registration, so a malformed or half-set credential fails
14
+ * when the process starts rather than on the first request that needs the
15
+ * one field somebody forgot.
16
+ */
17
+ schema: TSchema;
18
+ /**
19
+ * Re-resolve on every registration instead of once per process.
20
+ *
21
+ * Off by default: a credential is resolved once and reused, because the
22
+ * alternative is a fetch on every request. The cost of that default is that
23
+ * a rotated credential needs a restart, which is the right trade for a value
24
+ * that changes a few times a year — and this is the escape hatch for when it
25
+ * is not.
26
+ */
27
+ refresh?: boolean;
28
+ }
29
+ declare class Credential<TName extends string = string, TSchema extends StandardSchemaV1 = StandardSchemaV1> implements Consumable<TName, Value$1<TSchema>> {
30
+ private readonly options;
31
+ readonly id: TName;
32
+ readonly service: Service<Uncapitalize<TName>, Value$1<TSchema>>;
33
+ /**
34
+ * Declared once and read by both `declare()` and `connect()`, so the key the
35
+ * target publishes and the key the client reads cannot drift.
36
+ */
37
+ private readonly keys;
38
+ /**
39
+ * The resolved value, held as the *promise* rather than the value.
40
+ *
41
+ * Caching the promise is what makes two concurrent registrations share one
42
+ * resolution: caching the value would let both start before either finished,
43
+ * which is a duplicated fetch every cold start rather than never.
44
+ */
45
+ private resolved?;
46
+ constructor(id: ConstructName<TName>, options: CredentialOptions<TSchema>);
47
+ /**
48
+ * What the stage's `<ID>_CREDENTIALS` must look like — the schema the value
49
+ * is validated against where it is read. Public so a tool setting the value
50
+ * (`gkm secrets:add`) can check it, and describe its fields, before it is
51
+ * stored rather than at the first request.
52
+ */
53
+ get credentialsSchema(): TSchema;
54
+ declare(): Declaration[];
55
+ private connect;
56
+ private resolve;
57
+ }
58
+ /**
59
+ * A credentials key, read and validated against its schema.
60
+ *
61
+ * Shared with every construct that holds a third party's credentials — an
62
+ * `ExternalApi` reads its own the same way — so the shape a stage stores and
63
+ * the error a bad value raises are the same everywhere.
64
+ *
65
+ * @throws {MalformedCredential} when the value is not what the schema says.
66
+ */
67
+ declare function readCredentials<TSchema extends StandardSchemaV1>(id: string, key: string, schema: TSchema, envParser: ServiceRegisterOptions['envParser']): Promise<Value$1<TSchema>>;
68
+ /**
69
+ * The raw environment value as the thing the schema should see.
70
+ *
71
+ * JSON when it is JSON, and the string itself when it is not — a credential
72
+ * with a single opaque field is ordinary, and requiring `"…"` around it would
73
+ * be ceremony that every operator setting one by hand would get wrong once.
74
+ *
75
+ * Exported so a tool checking a value before it is stored reads it exactly as
76
+ * the process that uses it will.
77
+ */
78
+ declare function decodeCredentials(raw: string): unknown;
79
+ /** A credential was set, and is not what its schema says it should be. */
80
+ declare class MalformedCredential extends Error {
81
+ readonly id: string;
82
+ readonly key: string;
83
+ readonly issues: unknown;
84
+ constructor(id: string, key: string, issues: unknown);
85
+ }
86
+ //#endregion
87
+ //#region src/external-api.d.ts
88
+ /** What a credentials schema yields. */
89
+ type Value<TSchema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<TSchema>;
90
+ /**
91
+ * Where an external API answers: one URL for every stage, or one per stage
92
+ * name with `default` for any stage not listed.
93
+ *
94
+ * Keyed by the stages `gkm.config.ts` declares once `.gkm/stages.d.ts` exists,
95
+ * so a key that names no stage — `prodution` — is a type error rather than a
96
+ * URL nothing reads. Without the file any key goes, as before.
97
+ */
98
+ type ExternalApiUrl = string | (string extends LocalStage | DeployedStage ? Readonly<Record<string, string>> : { readonly [S in LocalStage | DeployedStage]?: string; } & {
99
+ readonly default?: string;
100
+ });
101
+ interface ExternalApiOptions<TSchema extends StandardSchemaV1, TClient> {
102
+ /**
103
+ * Where it answers deployed: one URL for every stage, or one per stage
104
+ * name, with `default` for any stage not listed.
105
+ */
106
+ url: ExternalApiUrl;
107
+ /** What the stage's `<ID>_CREDENTIALS` must look like. */
108
+ credentials: TSchema;
109
+ /** What a handler is handed, built from where it answers and the credentials. */
110
+ client: (connection: {
111
+ url: string;
112
+ credentials: Value<TSchema>;
113
+ }) => TClient | Promise<TClient>;
114
+ }
115
+ declare class ExternalApi<TName extends string = string, TSchema extends StandardSchemaV1 = StandardSchemaV1, TClient = unknown> implements Consumable<TName, TClient> {
116
+ private readonly options;
117
+ readonly id: TName;
118
+ readonly service: Service<Uncapitalize<TName>, TClient>;
119
+ /** Read by both `declare()` and `connect()`, so the two cannot drift. */
120
+ private readonly keys;
121
+ /** The promise, so concurrent registrations share one client. */
122
+ private connected?;
123
+ constructor(id: ConstructName<TName>, options: ExternalApiOptions<TSchema, TClient>);
124
+ /**
125
+ * What the stage's `<ID>_CREDENTIALS` must look like — the schema the value
126
+ * is validated against where it is read. Public so a tool setting the value
127
+ * (`gkm secrets:add`) can check it, and describe its fields, before it is
128
+ * stored rather than at the first request.
129
+ */
130
+ get credentialsSchema(): TSchema;
131
+ declare(): Declaration[];
132
+ private connect;
133
+ }
134
+ //#endregion
135
+ //#region src/fake.d.ts
136
+ /**
137
+ * Marks a fake. A registered symbol, so a fake built by a second copy of this
138
+ * package — a linked workspace, two versions in a lockfile — is still one.
139
+ */
140
+ declare const FAKE: unique symbol;
141
+ /** Anything that answers a request — a Hono app, or a bare `{ fetch }`. */
142
+ interface FetchHandler {
143
+ fetch(request: Request): Response | Promise<Response>;
144
+ }
145
+ /**
146
+ * What a construct's credentials look like going in, for a fake to supply —
147
+ * an external API's `credentials` schema, or a credential's `schema`.
148
+ */
149
+ type CredentialsOf<TConstruct> = TConstruct extends ExternalApi<string, infer TSchema, unknown> ? StandardSchemaV1.InferInput<TSchema> : TConstruct extends Credential<string, infer TSchema> ? StandardSchemaV1.InferInput<TSchema> : unknown;
150
+ /**
151
+ * A third party's stand-in, as `test/fakes/<id>.ts` default-exports it.
152
+ *
153
+ * `credentials` are what a local or test stage is handed as `<ID>_CREDENTIALS`
154
+ * in place of the stage's own: what an external API's fake accepts, or a
155
+ * credential's test value.
156
+ */
157
+ type Fake = {
158
+ readonly [FAKE]: true;
159
+ readonly credentials: unknown;
160
+ } & ({
161
+ readonly kind: 'app';
162
+ /** Served by gkm: in-process in a test, on its own port in `gkm dev`. */
163
+ readonly handler: FetchHandler;
164
+ } | {
165
+ readonly kind: 'image';
166
+ /** The provider's own local server, run as a container. */
167
+ readonly image: string;
168
+ /** The port it listens on inside the container. */
169
+ readonly port: number;
170
+ } | {
171
+ /** A `Credential`'s test value — nothing to serve. */
172
+ readonly kind: 'credential';
173
+ });
174
+ /**
175
+ * Build the fake `test/fakes/<id>.ts` default-exports.
176
+ *
177
+ * Pass the construct's type to have the value checked against its schema —
178
+ * `fake.app<typeof polar>(…)`, `fake.credential<typeof stripe>(…)`.
179
+ */
180
+ declare const fake: {
181
+ /** A working implementation of an external API, kept beside the tests that use it. */
182
+ app<TApi = unknown>(handler: FetchHandler, options: {
183
+ credentials: CredentialsOf<TApi>;
184
+ }): Fake;
185
+ /** A local server an external API's provider publishes — `stripe/stripe-mock`. */
186
+ image<TApi = unknown>(image: string, options: {
187
+ port: number;
188
+ credentials: CredentialsOf<TApi>;
189
+ }): Fake;
190
+ /**
191
+ * A `Credential`'s value on the test stage and under `gkm dev --fake`, as
192
+ * its schema takes it — a string, or the object a JSON credential holds.
193
+ * It is validated where it is read, like the real one.
194
+ */
195
+ credential<TCredential = unknown>(credentials: CredentialsOf<TCredential>): Fake;
196
+ };
197
+ /** Whether a value is a fake — what gkm asks of a `test/fakes` default export. */
198
+ declare function isFake(value: unknown): value is Fake;
199
+ //#endregion
200
+ export { ExternalApi as a, Credential as c, decodeCredentials as d, readCredentials as f, isFake as i, CredentialOptions as l, FetchHandler as n, ExternalApiOptions as o, fake as r, ExternalApiUrl as s, Fake as t, MalformedCredential as u };
201
+ //# sourceMappingURL=fake-B7rvi4Qp.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-B7rvi4Qp.d.cts","names":["Value"],"sources":["../src/credential.ts","../src/external-api.ts","../src/fake.ts"],"mappings":";;;;;;;KAiEKA,QAAM,gBAAgB,oBAC1B,iBAAiB,YAAY;UAEb,kBAAkB,gBAAgB;;;;;;;;EAQlD,QAAQ;;;;;;;;;;EAUR;;cAGY,WACZ,+BACA,gBAAgB,mBAAmB,6BACvB,WAAW,OAAOA,QAAM;mBA6BlB;WApBT,IAAI;WACJ,SAAS,QAAQ,aAAa,QAAQA,QAAM;;;;;mBAMpC;;;;;;;;UAST;EAER,YACC,IAAI,cAAc,QACD,SAAS,kBAAkB;;;;;;;MAoBzC,qBAAqB;EAIzB,WAAW;UAUH;UAQA;;;;;;;;;;;iBAmBa,gBAAgB,gBAAgB,kBACrD,YACA,aACA,QAAQ,SACR,WAAW,sCACT,QAAQA,QAAM;;;;;;;;;;;iBAsBD,kBAAkB;;cAoBrB,4BAA4B;WAE9B;WACA;WACA;EAHV,YACU,YACA,aACA;;;;;KCpLN,MAAM,gBAAgB,oBAC1B,iBAAiB,YAAY;;;;;;;;;KAUlB,0CAEO,aAAa,gBAC3B,SAAS,sCACG,KAAK,aAAa;WACrB;;UAGG,mBAAmB,gBAAgB,kBAAkB;;;;;EAKrE,KAAK;;EAEL,aAAa;;EAEb,SAAS;IACR;IACA,aAAa,MAAM;QACd,UAAU,QAAQ;;cAGZ,YACZ,+BACA,gBAAgB,mBAAmB,kBACnC,8BACY,WAAW,OAAO;mBAeZ;WAXT,IAAI;WACJ,SAAS,QAAQ,aAAa,QAAQ;;mBAG9B;;UAGT;EAER,YACC,IAAI,cAAc,QACD,SAAS,mBAAmB,SAAS;;;;;;;MA0BnD,qBAAqB;EAIzB,WAAW;UAaG;;;;;;;;cCjHT;;UAGW;EAChB,MAAM,SAAS,UAAU,WAAW,QAAQ;;;;;;KAOxC,cAAc,cAClB,mBAAmB,0BAA0B,oBAC1C,iBAAiB,WAAW,WAC5B,mBAAmB,yBAAyB,WAC3C,iBAAiB,WAAW;;;;;;;;KAUrB;YACD;WACD;;WAGE;;WAEA,SAAS;;WAGT;;WAEA;;WAEA;;;WAIA;;;;;;;;cAUC;;EAEZ,IAAI,gBAAc,SACR,cAAY;IACV,aAAa,cAAc;MACpC;;EAUH,MAAM,gBAAc,eACN;IACF;IAAc,aAAa,cAAc;MAClD;;;;;;EAeH,WAAW,uBAAqB,aAClB,cAAc,eACzB;;;iBAMY,OAAO,iBAAiB,SAAS"}
@@ -0,0 +1,201 @@
1
+ import { n as StandardSchemaV1 } from "./index-DdRjYhiJ.mjs";
2
+ import { r as Consumable } from "./construct-interface-ZvYQbivO.mjs";
3
+ import { n as DeployedStage, r as LocalStage } from "./stages-BSCF19o2.mjs";
4
+ import { ConstructName, Declaration } from "@geekmidas/manifest";
5
+ import { Service, ServiceRegisterOptions } from "@geekmidas/services";
6
+ //#region src/credential.d.ts
7
+ /** What a credential's schema yields. */
8
+ type Value$1<TSchema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<TSchema>;
9
+ interface CredentialOptions<TSchema extends StandardSchemaV1> {
10
+ /**
11
+ * What the credential must look like.
12
+ *
13
+ * Validated at registration, so a malformed or half-set credential fails
14
+ * when the process starts rather than on the first request that needs the
15
+ * one field somebody forgot.
16
+ */
17
+ schema: TSchema;
18
+ /**
19
+ * Re-resolve on every registration instead of once per process.
20
+ *
21
+ * Off by default: a credential is resolved once and reused, because the
22
+ * alternative is a fetch on every request. The cost of that default is that
23
+ * a rotated credential needs a restart, which is the right trade for a value
24
+ * that changes a few times a year — and this is the escape hatch for when it
25
+ * is not.
26
+ */
27
+ refresh?: boolean;
28
+ }
29
+ declare class Credential<TName extends string = string, TSchema extends StandardSchemaV1 = StandardSchemaV1> implements Consumable<TName, Value$1<TSchema>> {
30
+ private readonly options;
31
+ readonly id: TName;
32
+ readonly service: Service<Uncapitalize<TName>, Value$1<TSchema>>;
33
+ /**
34
+ * Declared once and read by both `declare()` and `connect()`, so the key the
35
+ * target publishes and the key the client reads cannot drift.
36
+ */
37
+ private readonly keys;
38
+ /**
39
+ * The resolved value, held as the *promise* rather than the value.
40
+ *
41
+ * Caching the promise is what makes two concurrent registrations share one
42
+ * resolution: caching the value would let both start before either finished,
43
+ * which is a duplicated fetch every cold start rather than never.
44
+ */
45
+ private resolved?;
46
+ constructor(id: ConstructName<TName>, options: CredentialOptions<TSchema>);
47
+ /**
48
+ * What the stage's `<ID>_CREDENTIALS` must look like — the schema the value
49
+ * is validated against where it is read. Public so a tool setting the value
50
+ * (`gkm secrets:add`) can check it, and describe its fields, before it is
51
+ * stored rather than at the first request.
52
+ */
53
+ get credentialsSchema(): TSchema;
54
+ declare(): Declaration[];
55
+ private connect;
56
+ private resolve;
57
+ }
58
+ /**
59
+ * A credentials key, read and validated against its schema.
60
+ *
61
+ * Shared with every construct that holds a third party's credentials — an
62
+ * `ExternalApi` reads its own the same way — so the shape a stage stores and
63
+ * the error a bad value raises are the same everywhere.
64
+ *
65
+ * @throws {MalformedCredential} when the value is not what the schema says.
66
+ */
67
+ declare function readCredentials<TSchema extends StandardSchemaV1>(id: string, key: string, schema: TSchema, envParser: ServiceRegisterOptions['envParser']): Promise<Value$1<TSchema>>;
68
+ /**
69
+ * The raw environment value as the thing the schema should see.
70
+ *
71
+ * JSON when it is JSON, and the string itself when it is not — a credential
72
+ * with a single opaque field is ordinary, and requiring `"…"` around it would
73
+ * be ceremony that every operator setting one by hand would get wrong once.
74
+ *
75
+ * Exported so a tool checking a value before it is stored reads it exactly as
76
+ * the process that uses it will.
77
+ */
78
+ declare function decodeCredentials(raw: string): unknown;
79
+ /** A credential was set, and is not what its schema says it should be. */
80
+ declare class MalformedCredential extends Error {
81
+ readonly id: string;
82
+ readonly key: string;
83
+ readonly issues: unknown;
84
+ constructor(id: string, key: string, issues: unknown);
85
+ }
86
+ //#endregion
87
+ //#region src/external-api.d.ts
88
+ /** What a credentials schema yields. */
89
+ type Value<TSchema extends StandardSchemaV1> = StandardSchemaV1.InferOutput<TSchema>;
90
+ /**
91
+ * Where an external API answers: one URL for every stage, or one per stage
92
+ * name with `default` for any stage not listed.
93
+ *
94
+ * Keyed by the stages `gkm.config.ts` declares once `.gkm/stages.d.ts` exists,
95
+ * so a key that names no stage — `prodution` — is a type error rather than a
96
+ * URL nothing reads. Without the file any key goes, as before.
97
+ */
98
+ type ExternalApiUrl = string | (string extends LocalStage | DeployedStage ? Readonly<Record<string, string>> : { readonly [S in LocalStage | DeployedStage]?: string; } & {
99
+ readonly default?: string;
100
+ });
101
+ interface ExternalApiOptions<TSchema extends StandardSchemaV1, TClient> {
102
+ /**
103
+ * Where it answers deployed: one URL for every stage, or one per stage
104
+ * name, with `default` for any stage not listed.
105
+ */
106
+ url: ExternalApiUrl;
107
+ /** What the stage's `<ID>_CREDENTIALS` must look like. */
108
+ credentials: TSchema;
109
+ /** What a handler is handed, built from where it answers and the credentials. */
110
+ client: (connection: {
111
+ url: string;
112
+ credentials: Value<TSchema>;
113
+ }) => TClient | Promise<TClient>;
114
+ }
115
+ declare class ExternalApi<TName extends string = string, TSchema extends StandardSchemaV1 = StandardSchemaV1, TClient = unknown> implements Consumable<TName, TClient> {
116
+ private readonly options;
117
+ readonly id: TName;
118
+ readonly service: Service<Uncapitalize<TName>, TClient>;
119
+ /** Read by both `declare()` and `connect()`, so the two cannot drift. */
120
+ private readonly keys;
121
+ /** The promise, so concurrent registrations share one client. */
122
+ private connected?;
123
+ constructor(id: ConstructName<TName>, options: ExternalApiOptions<TSchema, TClient>);
124
+ /**
125
+ * What the stage's `<ID>_CREDENTIALS` must look like — the schema the value
126
+ * is validated against where it is read. Public so a tool setting the value
127
+ * (`gkm secrets:add`) can check it, and describe its fields, before it is
128
+ * stored rather than at the first request.
129
+ */
130
+ get credentialsSchema(): TSchema;
131
+ declare(): Declaration[];
132
+ private connect;
133
+ }
134
+ //#endregion
135
+ //#region src/fake.d.ts
136
+ /**
137
+ * Marks a fake. A registered symbol, so a fake built by a second copy of this
138
+ * package — a linked workspace, two versions in a lockfile — is still one.
139
+ */
140
+ declare const FAKE: unique symbol;
141
+ /** Anything that answers a request — a Hono app, or a bare `{ fetch }`. */
142
+ interface FetchHandler {
143
+ fetch(request: Request): Response | Promise<Response>;
144
+ }
145
+ /**
146
+ * What a construct's credentials look like going in, for a fake to supply —
147
+ * an external API's `credentials` schema, or a credential's `schema`.
148
+ */
149
+ type CredentialsOf<TConstruct> = TConstruct extends ExternalApi<string, infer TSchema, unknown> ? StandardSchemaV1.InferInput<TSchema> : TConstruct extends Credential<string, infer TSchema> ? StandardSchemaV1.InferInput<TSchema> : unknown;
150
+ /**
151
+ * A third party's stand-in, as `test/fakes/<id>.ts` default-exports it.
152
+ *
153
+ * `credentials` are what a local or test stage is handed as `<ID>_CREDENTIALS`
154
+ * in place of the stage's own: what an external API's fake accepts, or a
155
+ * credential's test value.
156
+ */
157
+ type Fake = {
158
+ readonly [FAKE]: true;
159
+ readonly credentials: unknown;
160
+ } & ({
161
+ readonly kind: 'app';
162
+ /** Served by gkm: in-process in a test, on its own port in `gkm dev`. */
163
+ readonly handler: FetchHandler;
164
+ } | {
165
+ readonly kind: 'image';
166
+ /** The provider's own local server, run as a container. */
167
+ readonly image: string;
168
+ /** The port it listens on inside the container. */
169
+ readonly port: number;
170
+ } | {
171
+ /** A `Credential`'s test value — nothing to serve. */
172
+ readonly kind: 'credential';
173
+ });
174
+ /**
175
+ * Build the fake `test/fakes/<id>.ts` default-exports.
176
+ *
177
+ * Pass the construct's type to have the value checked against its schema —
178
+ * `fake.app<typeof polar>(…)`, `fake.credential<typeof stripe>(…)`.
179
+ */
180
+ declare const fake: {
181
+ /** A working implementation of an external API, kept beside the tests that use it. */
182
+ app<TApi = unknown>(handler: FetchHandler, options: {
183
+ credentials: CredentialsOf<TApi>;
184
+ }): Fake;
185
+ /** A local server an external API's provider publishes — `stripe/stripe-mock`. */
186
+ image<TApi = unknown>(image: string, options: {
187
+ port: number;
188
+ credentials: CredentialsOf<TApi>;
189
+ }): Fake;
190
+ /**
191
+ * A `Credential`'s value on the test stage and under `gkm dev --fake`, as
192
+ * its schema takes it — a string, or the object a JSON credential holds.
193
+ * It is validated where it is read, like the real one.
194
+ */
195
+ credential<TCredential = unknown>(credentials: CredentialsOf<TCredential>): Fake;
196
+ };
197
+ /** Whether a value is a fake — what gkm asks of a `test/fakes` default export. */
198
+ declare function isFake(value: unknown): value is Fake;
199
+ //#endregion
200
+ export { ExternalApi as a, Credential as c, decodeCredentials as d, readCredentials as f, isFake as i, CredentialOptions as l, FetchHandler as n, ExternalApiOptions as o, fake as r, ExternalApiUrl as s, Fake as t, MalformedCredential as u };
201
+ //# sourceMappingURL=fake-JXbkdao8.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake-JXbkdao8.d.mts","names":["Value"],"sources":["../src/credential.ts","../src/external-api.ts","../src/fake.ts"],"mappings":";;;;;;;KAiEKA,QAAM,gBAAgB,oBAC1B,iBAAiB,YAAY;UAEb,kBAAkB,gBAAgB;;;;;;;;EAQlD,QAAQ;;;;;;;;;;EAUR;;cAGY,WACZ,+BACA,gBAAgB,mBAAmB,6BACvB,WAAW,OAAOA,QAAM;mBA6BlB;WApBT,IAAI;WACJ,SAAS,QAAQ,aAAa,QAAQA,QAAM;;;;;mBAMpC;;;;;;;;UAST;EAER,YACC,IAAI,cAAc,QACD,SAAS,kBAAkB;;;;;;;MAoBzC,qBAAqB;EAIzB,WAAW;UAUH;UAQA;;;;;;;;;;;iBAmBa,gBAAgB,gBAAgB,kBACrD,YACA,aACA,QAAQ,SACR,WAAW,sCACT,QAAQA,QAAM;;;;;;;;;;;iBAsBD,kBAAkB;;cAoBrB,4BAA4B;WAE9B;WACA;WACA;EAHV,YACU,YACA,aACA;;;;;KCpLN,MAAM,gBAAgB,oBAC1B,iBAAiB,YAAY;;;;;;;;;KAUlB,0CAEO,aAAa,gBAC3B,SAAS,sCACG,KAAK,aAAa;WACrB;;UAGG,mBAAmB,gBAAgB,kBAAkB;;;;;EAKrE,KAAK;;EAEL,aAAa;;EAEb,SAAS;IACR;IACA,aAAa,MAAM;QACd,UAAU,QAAQ;;cAGZ,YACZ,+BACA,gBAAgB,mBAAmB,kBACnC,8BACY,WAAW,OAAO;mBAeZ;WAXT,IAAI;WACJ,SAAS,QAAQ,aAAa,QAAQ;;mBAG9B;;UAGT;EAER,YACC,IAAI,cAAc,QACD,SAAS,mBAAmB,SAAS;;;;;;;MA0BnD,qBAAqB;EAIzB,WAAW;UAaG;;;;;;;;cCjHT;;UAGW;EAChB,MAAM,SAAS,UAAU,WAAW,QAAQ;;;;;;KAOxC,cAAc,cAClB,mBAAmB,0BAA0B,oBAC1C,iBAAiB,WAAW,WAC5B,mBAAmB,yBAAyB,WAC3C,iBAAiB,WAAW;;;;;;;;KAUrB;YACD;WACD;;WAGE;;WAEA,SAAS;;WAGT;;WAEA;;WAEA;;;WAIA;;;;;;;;cAUC;;EAEZ,IAAI,gBAAc,SACR,cAAY;IACV,aAAa,cAAc;MACpC;;EAUH,MAAM,gBAAc,eACN;IACF;IAAc,aAAa,cAAc;MAClD;;;;;;EAeH,WAAW,uBAAqB,aAClB,cAAc,eACzB;;;iBAMY,OAAO,iBAAiB,SAAS"}
@@ -1,10 +1,58 @@
1
- const require_chunk = require('./chunk-DWy1uDak.cjs');
2
- const __geekmidas_manifest = require_chunk.__toESM(require("@geekmidas/manifest"));
3
- const __geekmidas_storage = require_chunk.__toESM(require("@geekmidas/storage"));
4
-
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_expire = require("./expire-CieftS01.cjs");
3
+ let _geekmidas_manifest = require("@geekmidas/manifest");
4
+ let _geekmidas_storage = require("@geekmidas/storage");
5
5
  //#region src/file-server.ts
6
+ /**
7
+ * `FileServer` — a domain that serves a bucket's objects.
8
+ *
9
+ * `ObjectStorage` is the bucket: it writes, it presigns, and its URL is never
10
+ * public. Serving those objects on a domain is a different thing, and it is a
11
+ * construct of its own rather than a flag on the bucket — see
12
+ * `docs/design/constructs-paradigm.md`, "Why a separate construct, and what it
13
+ * costs", for the comparison that rules the other two shapes out.
14
+ *
15
+ * ```ts
16
+ * export const uploads = new FileServer('Uploads', { open: ['brand/**'] });
17
+ *
18
+ * uploads.getUploadURL({ path, contentType }) // an S3 presign at the bucket
19
+ * uploads.url('brand/logo.png') // open path — no signature
20
+ * uploads.signedUrl('invoices/7.pdf') // one object, one recipient
21
+ * ```
22
+ *
23
+ * **One construct, one client, both halves.** How a file lands in the bucket is
24
+ * the same whether or not it is served, so splitting the upload half from the
25
+ * serving half would be ceremony rather than safety. The client is a *superset*
26
+ * of `StorageClient`, made literal in the type, so anything taking
27
+ * `services.uploads` keeps compiling when the construct behind it grows a
28
+ * serving half.
29
+ *
30
+ * **The id names the bucket, not the surface.** This is the detail that has to
31
+ * be right before anything ships, because getting it backwards is destructive:
32
+ * the migration people actually perform is serving a bucket they already have,
33
+ * and naming the bucket after the construct makes that edit *add* a node rather
34
+ * than rename the one holding the data.
35
+ */
36
+ /**
37
+ * A bucket setting given to a file server that fronts a bucket declared
38
+ * elsewhere — where the bucket's own construct is the one that says it.
39
+ */
40
+ var BucketOptionOnOrigin = class extends Error {
41
+ server;
42
+ origin;
43
+ option;
44
+ constructor(server, origin, option) {
45
+ super(`'${server}' fronts '${origin}', which declares itself, so '${option}' belongs on the construct that declares '${origin}', not on the file server.`);
46
+ this.server = server;
47
+ this.origin = origin;
48
+ this.option = option;
49
+ this.name = "BucketOptionOnOrigin";
50
+ }
51
+ };
6
52
  /** A key was asked to be served unsigned, and no open pattern admits it. */
7
53
  var NotOpen = class extends Error {
54
+ key;
55
+ open;
8
56
  constructor(key, open) {
9
57
  super(`'${key}' is not served without a signature. ` + (open.length ? `Open paths: ${open.join(", ")}. Use signedUrl() for anything else.` : "This file server declares no open paths, so every object needs signedUrl()."));
10
58
  this.key = key;
@@ -13,11 +61,14 @@ var NotOpen = class extends Error {
13
61
  }
14
62
  };
15
63
  var FileServer = class {
64
+ options;
16
65
  id;
17
66
  service;
18
67
  /** The id of the surface node, as opposed to the bucket's. */
19
68
  surfaceId;
20
69
  open;
70
+ /** The vended bucket's expiry, checked once: prefix → days. */
71
+ expire;
21
72
  /**
22
73
  * Declared once and read by both `declare()` and `connect()`, so the keys the
23
74
  * target publishes and the keys the client reads cannot drift.
@@ -25,17 +76,19 @@ var FileServer = class {
25
76
  keys;
26
77
  constructor(id, options = {}) {
27
78
  this.options = options;
28
- const canonical = (0, __geekmidas_manifest.canonicalId)(id);
79
+ const canonical = (0, _geekmidas_manifest.canonicalId)(id);
29
80
  this.id = canonical;
30
81
  this.open = options.open ?? [];
31
82
  const originId = options.origin?.id ?? canonical;
83
+ if (options.origin && options.expire) throw new BucketOptionOnOrigin(canonical, originId, "expire");
84
+ this.expire = require_expire.expiryDays(canonical, options.expire);
32
85
  this.surfaceId = `${canonical}Server`;
33
86
  this.keys = {
34
- origin: (0, __geekmidas_manifest.provideKey)(originId, "url"),
35
- server: (0, __geekmidas_manifest.provideKey)(this.surfaceId, "url")
87
+ origin: (0, _geekmidas_manifest.provideKey)(originId, "url"),
88
+ server: (0, _geekmidas_manifest.provideKey)(this.surfaceId, "url")
36
89
  };
37
90
  this.service = {
38
- serviceName: (0, __geekmidas_manifest.serviceKey)(canonical),
91
+ serviceName: (0, _geekmidas_manifest.serviceKey)(canonical),
39
92
  register: (registerOptions) => this.connect(registerOptions)
40
93
  };
41
94
  }
@@ -83,7 +136,8 @@ var FileServer = class {
83
136
  kind: "objects",
84
137
  id: this.id,
85
138
  provides: [this.keys.origin],
86
- ...this.options.versioned ? { versioned: true } : {}
139
+ ...this.options.versioned ? { versioned: true } : {},
140
+ ...this.expire ? { expire: this.expire } : {}
87
141
  }, surface];
88
142
  }
89
143
  /**
@@ -99,7 +153,7 @@ var FileServer = class {
99
153
  origin: get(this.keys.origin).string(),
100
154
  server: get(this.keys.server).string()
101
155
  })).parse();
102
- const storage = (0, __geekmidas_storage.createStorageClient)(origin);
156
+ const storage = (0, _geekmidas_storage.createStorageClient)(origin);
103
157
  const base = server.replace(/\/+$/, "");
104
158
  const serve = (key) => {
105
159
  if (!this.serves(key)) throw new NotOpen(key, this.open);
@@ -147,8 +201,9 @@ function globToRegExp(pattern) {
147
201
  }
148
202
  return new RegExp(`^${source}$`);
149
203
  }
150
-
151
204
  //#endregion
205
+ exports.BucketOptionOnOrigin = BucketOptionOnOrigin;
152
206
  exports.FileServer = FileServer;
153
207
  exports.NotOpen = NotOpen;
208
+
154
209
  //# sourceMappingURL=file-server.cjs.map