gemi 0.57.0 → 0.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/dist/app/index.js +1 -1
  2. package/dist/broadcasting/index.js +1 -1
  3. package/dist/bun/plugin.js +1 -1
  4. package/dist/bun/preload.js +1 -1
  5. package/dist/{chunk-msyqr4y7.js → chunk-0a2xgcj3.js} +2 -2
  6. package/dist/{chunk-msyqr4y7.js.map → chunk-0a2xgcj3.js.map} +1 -1
  7. package/dist/{chunk-64bq12j3.js → chunk-3337e5g0.js} +2 -2
  8. package/dist/{chunk-64bq12j3.js.map → chunk-3337e5g0.js.map} +1 -1
  9. package/dist/{chunk-5fmbsy4q.js → chunk-3aa287k7.js} +2 -2
  10. package/dist/{chunk-5fmbsy4q.js.map → chunk-3aa287k7.js.map} +1 -1
  11. package/dist/{chunk-f233yzxf.js → chunk-3g5bjvdf.js} +2 -2
  12. package/dist/{chunk-f233yzxf.js.map → chunk-3g5bjvdf.js.map} +1 -1
  13. package/dist/{chunk-rc2asvyf.js → chunk-3xadx444.js} +2 -2
  14. package/dist/{chunk-rc2asvyf.js.map → chunk-3xadx444.js.map} +1 -1
  15. package/dist/{chunk-7pn0bnsc.js → chunk-3zxwscmf.js} +2 -2
  16. package/dist/{chunk-4f69ygc8.js.map → chunk-3zxwscmf.js.map} +1 -1
  17. package/dist/{chunk-jzatvtjd.js → chunk-437085pe.js} +2 -2
  18. package/dist/{chunk-jzatvtjd.js.map → chunk-437085pe.js.map} +1 -1
  19. package/dist/{chunk-17m5wxv0.js → chunk-4yt5x8s2.js} +2 -2
  20. package/dist/{chunk-17m5wxv0.js.map → chunk-4yt5x8s2.js.map} +1 -1
  21. package/dist/{chunk-dxxak51x.js → chunk-5athahgr.js} +2 -2
  22. package/dist/{chunk-dxxak51x.js.map → chunk-5athahgr.js.map} +1 -1
  23. package/dist/{chunk-dcwjwfjc.js → chunk-5n2rvfh3.js} +2 -2
  24. package/dist/{chunk-dcwjwfjc.js.map → chunk-5n2rvfh3.js.map} +1 -1
  25. package/dist/{chunk-r8637cqv.js → chunk-6235kb30.js} +3 -3
  26. package/dist/{chunk-r8637cqv.js.map → chunk-6235kb30.js.map} +1 -1
  27. package/dist/{chunk-67zyjx0c.js → chunk-7b0x860b.js} +2 -2
  28. package/dist/{chunk-67zyjx0c.js.map → chunk-7b0x860b.js.map} +1 -1
  29. package/dist/{chunk-q8k3gh8k.js → chunk-7ef5n8k2.js} +2 -2
  30. package/dist/{chunk-q8k3gh8k.js.map → chunk-7ef5n8k2.js.map} +1 -1
  31. package/dist/{chunk-n2zmg475.js → chunk-7j6wbv12.js} +2 -2
  32. package/dist/{chunk-n2zmg475.js.map → chunk-7j6wbv12.js.map} +1 -1
  33. package/dist/{chunk-g5pj95dz.js → chunk-86jebsm4.js} +3 -3
  34. package/dist/{chunk-g5pj95dz.js.map → chunk-86jebsm4.js.map} +1 -1
  35. package/dist/chunk-87qab82w.js +5 -0
  36. package/dist/{chunk-9j9wqrb2.js.map → chunk-87qab82w.js.map} +7 -3
  37. package/dist/{chunk-dwz0wbhj.js → chunk-8gew8b9a.js} +2 -2
  38. package/dist/{chunk-dwz0wbhj.js.map → chunk-8gew8b9a.js.map} +1 -1
  39. package/dist/{chunk-74aj8ms2.js → chunk-9m2tbf3n.js} +2 -2
  40. package/dist/{chunk-74aj8ms2.js.map → chunk-9m2tbf3n.js.map} +1 -1
  41. package/dist/{chunk-bw8kt7ps.js → chunk-a2sgjpvq.js} +2 -2
  42. package/dist/{chunk-bw8kt7ps.js.map → chunk-a2sgjpvq.js.map} +1 -1
  43. package/dist/chunk-b35e128b.js +5 -0
  44. package/dist/{chunk-r9as9htn.js.map → chunk-b35e128b.js.map} +1 -1
  45. package/dist/{chunk-1esnvq2z.js → chunk-cyaz97p5.js} +2 -2
  46. package/dist/{chunk-1esnvq2z.js.map → chunk-cyaz97p5.js.map} +1 -1
  47. package/dist/{chunk-mqwrmbh4.js → chunk-d125j8t0.js} +3 -3
  48. package/dist/{chunk-mqwrmbh4.js.map → chunk-d125j8t0.js.map} +1 -1
  49. package/dist/{chunk-yhzb9qpk.js → chunk-dgsgjg53.js} +2 -2
  50. package/dist/{chunk-yhzb9qpk.js.map → chunk-dgsgjg53.js.map} +1 -1
  51. package/dist/{chunk-6c14bexh.js → chunk-eejmhtnc.js} +2 -2
  52. package/dist/{chunk-6c14bexh.js.map → chunk-eejmhtnc.js.map} +1 -1
  53. package/dist/{chunk-vdzb29p5.js → chunk-fjm4y8bn.js} +2 -2
  54. package/dist/{chunk-vdzb29p5.js.map → chunk-fjm4y8bn.js.map} +1 -1
  55. package/dist/{chunk-ma5rj4st.js → chunk-grdahng8.js} +2 -2
  56. package/dist/{chunk-ma5rj4st.js.map → chunk-grdahng8.js.map} +1 -1
  57. package/dist/{chunk-5txddtaa.js → chunk-gw6agevz.js} +3 -3
  58. package/dist/{chunk-5txddtaa.js.map → chunk-gw6agevz.js.map} +1 -1
  59. package/dist/{chunk-ba0rkpk5.js → chunk-hppagzz4.js} +4 -4
  60. package/dist/{chunk-ba0rkpk5.js.map → chunk-hppagzz4.js.map} +1 -1
  61. package/dist/chunk-hwa5sqw5.js +19 -0
  62. package/dist/{chunk-r9h6aj7g.js.map → chunk-hwa5sqw5.js.map} +12 -6
  63. package/dist/chunk-hxf1re93.js +4 -0
  64. package/dist/{chunk-6fc909z5.js.map → chunk-hxf1re93.js.map} +6 -5
  65. package/dist/{chunk-d6kgxmp7.js → chunk-j0c6ytkj.js} +3 -3
  66. package/dist/{chunk-d6kgxmp7.js.map → chunk-j0c6ytkj.js.map} +1 -1
  67. package/dist/{chunk-4f69ygc8.js → chunk-jhkjz9jr.js} +2 -2
  68. package/dist/{chunk-7pn0bnsc.js.map → chunk-jhkjz9jr.js.map} +1 -1
  69. package/dist/{chunk-e9zz0zfv.js → chunk-k0fvsyeh.js} +1 -1
  70. package/dist/{chunk-j21tm6jf.js → chunk-keehyx51.js} +2 -2
  71. package/dist/{chunk-j21tm6jf.js.map → chunk-keehyx51.js.map} +1 -1
  72. package/dist/{chunk-a70s8pz4.js → chunk-m3xy5xyf.js} +2 -2
  73. package/dist/{chunk-a70s8pz4.js.map → chunk-m3xy5xyf.js.map} +1 -1
  74. package/dist/{chunk-swe2b6rv.js → chunk-mkfpnymy.js} +1 -1
  75. package/dist/{chunk-qkrba9c2.js → chunk-mwpdp09e.js} +2 -2
  76. package/dist/{chunk-qkrba9c2.js.map → chunk-mwpdp09e.js.map} +1 -1
  77. package/dist/{chunk-tzsnadg1.js → chunk-pmhd6zfc.js} +3 -3
  78. package/dist/{chunk-tzsnadg1.js.map → chunk-pmhd6zfc.js.map} +1 -1
  79. package/dist/chunk-qb5mv6pj.js +5 -0
  80. package/dist/chunk-qb5mv6pj.js.map +12 -0
  81. package/dist/{chunk-nqk3cx97.js → chunk-qgxr0g36.js} +2 -2
  82. package/dist/{chunk-nqk3cx97.js.map → chunk-qgxr0g36.js.map} +1 -1
  83. package/dist/{chunk-btr9kyqh.js → chunk-sy7jbdeb.js} +2 -2
  84. package/dist/{chunk-btr9kyqh.js.map → chunk-sy7jbdeb.js.map} +1 -1
  85. package/dist/{chunk-5z5xskg1.js → chunk-szss069z.js} +2 -2
  86. package/dist/{chunk-5z5xskg1.js.map → chunk-szss069z.js.map} +1 -1
  87. package/dist/{chunk-rxsmwbxv.js → chunk-tss5svjr.js} +2 -2
  88. package/dist/{chunk-rxsmwbxv.js.map → chunk-tss5svjr.js.map} +1 -1
  89. package/dist/{chunk-32d510cd.js → chunk-vr90r27j.js} +2 -2
  90. package/dist/{chunk-32d510cd.js.map → chunk-vr90r27j.js.map} +1 -1
  91. package/dist/{chunk-jny4f23c.js → chunk-w62m5f0n.js} +3 -3
  92. package/dist/{chunk-jny4f23c.js.map → chunk-w62m5f0n.js.map} +1 -1
  93. package/dist/{chunk-k5bjfhz8.js → chunk-w7rf99w6.js} +2 -2
  94. package/dist/{chunk-k5bjfhz8.js.map → chunk-w7rf99w6.js.map} +1 -1
  95. package/dist/{chunk-fck5yw2s.js → chunk-wbrj0gya.js} +2 -2
  96. package/dist/{chunk-fck5yw2s.js.map → chunk-wbrj0gya.js.map} +1 -1
  97. package/dist/{chunk-11dkjm1r.js → chunk-xdv1b8mr.js} +2 -2
  98. package/dist/{chunk-11dkjm1r.js.map → chunk-xdv1b8mr.js.map} +1 -1
  99. package/dist/{chunk-katt90qz.js → chunk-xey9cbap.js} +2 -2
  100. package/dist/{chunk-katt90qz.js.map → chunk-xey9cbap.js.map} +1 -1
  101. package/dist/{chunk-ae6xz52s.js → chunk-xzk827r3.js} +2 -2
  102. package/dist/{chunk-ae6xz52s.js.map → chunk-xzk827r3.js.map} +1 -1
  103. package/dist/{chunk-8v81dvje.js → chunk-y6a8r2bn.js} +3 -3
  104. package/dist/{chunk-8v81dvje.js.map → chunk-y6a8r2bn.js.map} +1 -1
  105. package/dist/{chunk-nkbreczg.js → chunk-yed5whgs.js} +3 -3
  106. package/dist/{chunk-nkbreczg.js.map → chunk-yed5whgs.js.map} +1 -1
  107. package/dist/{chunk-cecq6q1b.js → chunk-yf7vz71n.js} +1 -1
  108. package/dist/{chunk-knvxwrwh.js → chunk-yjzs247s.js} +2 -2
  109. package/dist/{chunk-knvxwrwh.js.map → chunk-yjzs247s.js.map} +1 -1
  110. package/dist/{chunk-ka4tdhm8.js → chunk-yy0eb9wn.js} +2 -2
  111. package/dist/{chunk-ka4tdhm8.js.map → chunk-yy0eb9wn.js.map} +1 -1
  112. package/dist/{chunk-1nqdzmvm.js → chunk-zbxgbr12.js} +2 -2
  113. package/dist/{chunk-1nqdzmvm.js.map → chunk-zbxgbr12.js.map} +1 -1
  114. package/dist/{chunk-wrypq618.js → chunk-zh2egcyb.js} +2 -2
  115. package/dist/{chunk-wrypq618.js.map → chunk-zh2egcyb.js.map} +1 -1
  116. package/dist/chunks/ThemeProvider-li1J_igh.js.map +1 -1
  117. package/dist/client/ClientRouter.d.ts.map +1 -1
  118. package/dist/client/ProgressManager.d.ts +1 -1
  119. package/dist/client/RouteStateContext.d.ts +9 -0
  120. package/dist/client/RouteStateContext.d.ts.map +1 -1
  121. package/dist/client/ServerDataProvider.d.ts +7 -0
  122. package/dist/client/ServerDataProvider.d.ts.map +1 -1
  123. package/dist/client/index.d.ts +2 -1
  124. package/dist/client/index.d.ts.map +1 -1
  125. package/dist/client/index.js +68 -10
  126. package/dist/client/index.js.map +1 -1
  127. package/dist/client/rpc.d.ts +42 -0
  128. package/dist/client/rpc.d.ts.map +1 -1
  129. package/dist/client/useFeature.d.ts +40 -0
  130. package/dist/client/useFeature.d.ts.map +1 -0
  131. package/dist/config/index.js +1 -1
  132. package/dist/console/run.js +2 -2
  133. package/dist/console/run.js.map +1 -1
  134. package/dist/container/index.js +2 -2
  135. package/dist/container/index.js.map +1 -1
  136. package/dist/database/index.js +2 -2
  137. package/dist/database/index.js.map +1 -1
  138. package/dist/email/index.js +2 -2
  139. package/dist/email/index.js.map +1 -1
  140. package/dist/facades/Features.d.ts +57 -0
  141. package/dist/facades/Features.d.ts.map +1 -0
  142. package/dist/facades/index.d.ts +1 -0
  143. package/dist/facades/index.d.ts.map +1 -1
  144. package/dist/facades/index.js +2 -2
  145. package/dist/facades/index.js.map +1 -1
  146. package/dist/foundation/index.js +2 -2
  147. package/dist/foundation/index.js.map +1 -1
  148. package/dist/gemi.d.ts +13 -5
  149. package/dist/http/ApiRouter.d.ts +3 -2
  150. package/dist/http/ApiRouter.d.ts.map +1 -1
  151. package/dist/http/HttpRequest.d.ts +4 -0
  152. package/dist/http/HttpRequest.d.ts.map +1 -1
  153. package/dist/http/ViewRouter.d.ts +127 -4
  154. package/dist/http/ViewRouter.d.ts.map +1 -1
  155. package/dist/http/index.d.ts +1 -0
  156. package/dist/http/index.d.ts.map +1 -1
  157. package/dist/http/index.js +2 -2
  158. package/dist/http/index.js.map +1 -1
  159. package/dist/http/middlewareList.d.ts +25 -0
  160. package/dist/http/middlewareList.d.ts.map +1 -0
  161. package/dist/http/requestContext.d.ts +57 -0
  162. package/dist/http/requestContext.d.ts.map +1 -1
  163. package/dist/i18n/dictionaryRuntime.js +2 -2
  164. package/dist/i18n/dictionaryRuntime.js.map +1 -1
  165. package/dist/i18n/index.js +2 -2
  166. package/dist/i18n/index.js.map +1 -1
  167. package/dist/kernel/index.js +3 -3
  168. package/dist/kernel/index.js.map +3 -3
  169. package/dist/kernel/providers.d.ts +2 -2
  170. package/dist/kernel/providers.d.ts.map +1 -1
  171. package/dist/orm/index.js +2 -2
  172. package/dist/orm/index.js.map +1 -1
  173. package/dist/server/index.js +2 -2
  174. package/dist/server/index.js.map +1 -1
  175. package/dist/services/features/FeatureFlagStore.d.ts +60 -0
  176. package/dist/services/features/FeatureFlagStore.d.ts.map +1 -0
  177. package/dist/services/features/FeatureManager.d.ts +82 -0
  178. package/dist/services/features/FeatureManager.d.ts.map +1 -0
  179. package/dist/services/features/FeaturesServiceProvider.d.ts +6 -0
  180. package/dist/services/features/FeaturesServiceProvider.d.ts.map +1 -0
  181. package/dist/services/features/bucket.d.ts +57 -0
  182. package/dist/services/features/bucket.d.ts.map +1 -0
  183. package/dist/services/features/config.d.ts +57 -0
  184. package/dist/services/features/config.d.ts.map +1 -0
  185. package/dist/services/features/context.d.ts +31 -0
  186. package/dist/services/features/context.d.ts.map +1 -0
  187. package/dist/services/features/defineFeature.d.ts +145 -0
  188. package/dist/services/features/defineFeature.d.ts.map +1 -0
  189. package/dist/services/features/evaluate.d.ts +74 -0
  190. package/dist/services/features/evaluate.d.ts.map +1 -0
  191. package/dist/services/features/sources/DatabaseFeatureFlagSource.d.ts +19 -0
  192. package/dist/services/features/sources/DatabaseFeatureFlagSource.d.ts.map +1 -0
  193. package/dist/services/features/sources/FeatureFlagSource.d.ts +30 -0
  194. package/dist/services/features/sources/FeatureFlagSource.d.ts.map +1 -0
  195. package/dist/services/features/sources/StaticFeatureFlagSource.d.ts +24 -0
  196. package/dist/services/features/sources/StaticFeatureFlagSource.d.ts.map +1 -0
  197. package/dist/services/features/types.d.ts +63 -0
  198. package/dist/services/features/types.d.ts.map +1 -0
  199. package/dist/services/index.d.ts +12 -0
  200. package/dist/services/index.d.ts.map +1 -1
  201. package/dist/services/index.js +8 -8
  202. package/dist/services/index.js.map +6 -4
  203. package/dist/services/router/ViewRouteDispatcher.d.ts +8 -0
  204. package/dist/services/router/ViewRouteDispatcher.d.ts.map +1 -1
  205. package/dist/services/router/createFlatViewRoutes.d.ts +14 -0
  206. package/dist/services/router/createFlatViewRoutes.d.ts.map +1 -1
  207. package/dist/services/router/streamQueryInjection.d.ts.map +1 -1
  208. package/dist/support/index.js +2 -2
  209. package/dist/support/index.js.map +1 -1
  210. package/dist/testing/Page.d.ts +12 -0
  211. package/dist/testing/Page.d.ts.map +1 -1
  212. package/dist/testing/index.js +7 -3
  213. package/dist/testing/index.js.map +1 -1
  214. package/package.json +1 -1
  215. package/dist/chunk-6fc909z5.js +0 -4
  216. package/dist/chunk-9j9wqrb2.js +0 -5
  217. package/dist/chunk-qfzyym5h.js +0 -5
  218. package/dist/chunk-qfzyym5h.js.map +0 -12
  219. package/dist/chunk-r9as9htn.js +0 -5
  220. package/dist/chunk-r9h6aj7g.js +0 -19
  221. /package/dist/{chunk-e9zz0zfv.js.map → chunk-k0fvsyeh.js.map} +0 -0
  222. /package/dist/{chunk-swe2b6rv.js.map → chunk-mkfpnymy.js.map} +0 -0
  223. /package/dist/{chunk-cecq6q1b.js.map → chunk-yf7vz71n.js.map} +0 -0
@@ -42,6 +42,14 @@ export declare class ViewRouteDispatcher {
42
42
  /** See `ViewRouteConfig.partialRendering`. */
43
43
  readonly partialRendering: boolean;
44
44
  constructor(config: ViewRouteConfig);
45
+ /**
46
+ * Whether every flag gating a route is on for this request.
47
+ *
48
+ * All must pass. Gates accumulate down the tree — a router's, then a layout's,
49
+ * then the route's — and the intersection is the only reading that composes:
50
+ * a route inside a gated section cannot be more reachable than the section.
51
+ */
52
+ private passesFeatureGates;
45
53
  onRequestEnd(req: HttpRequest): Promise<void>;
46
54
  /**
47
55
  * Fires the provider's `onStreamComplete` from a stream callback — an
@@ -1 +1 @@
1
- {"version":3,"file":"ViewRouteDispatcher.d.ts","sourceRoot":"","sources":["../../../services/router/ViewRouteDispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAUzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAyHxD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAE/C,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,QAc9D;AAED,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,KAAK,SAAiB;IAE7B,cAAc,EAAE,cAAc,CAAM;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAC7C,0FAA0F;IAC1F,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IACnD,aAAa,EAAE,aAAa,CAAM;IAClC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,IAAI,EAAE,GAAG,CAAQ;IACjB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,CAAgC;IAErD;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY,CAGhB;IAEJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IAEF,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBAEvB,MAAM,EAAE,eAAe;IA2B7B,YAAY,CAAC,GAAG,EAAE,WAAW;IAanC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAatB,0BAA0B;IAC1B,OAAO,CAAC,kBAAkB;YA0CZ,MAAM;IAiYd,iBAAiB,CAAC,GAAG,EAAE,OAAO,gCA9SZ;QACpB,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,aAAa,EAAE,GAAG,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClC;;;;;;;;;;;WAWG;QACH,WAAW,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACpD;;;WAGG;QACH,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KAClD;CAyoBJ"}
1
+ {"version":3,"file":"ViewRouteDispatcher.d.ts","sourceRoot":"","sources":["../../../services/router/ViewRouteDispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzC,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAUzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA0HxD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAE/C,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,EAAE,QAc9D;AAED,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,KAAK,SAAiB;IAE7B,cAAc,EAAE,cAAc,CAAM;IACpC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IAC7C,0FAA0F;IAC1F,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAM;IACnD,aAAa,EAAE,aAAa,CAAM;IAClC,iBAAiB,EAAE,MAAM,EAAE,CAAM;IACjC,IAAI,EAAE,GAAG,CAAQ;IACjB;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,CAAgC;IAErD;;;;;;;;;OASG;IACH,OAAO,CAAC,YAAY,CAGhB;IAEJ,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IAEF,8CAA8C;IAC9C,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;gBAEvB,MAAM,EAAE,eAAe;IA2BnC;;;;;;OAMG;YACW,kBAAkB;IAQ1B,YAAY,CAAC,GAAG,EAAE,WAAW;IAUnC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,cAAc;IAatB,0BAA0B;IAC1B,OAAO,CAAC,kBAAkB;YA0CZ,MAAM;IAwYd,iBAAiB,CAAC,GAAG,EAAE,OAAO,gCA9SZ;QACpB,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,aAAa,EAAE,GAAG,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC3B;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClC;;;;;;;;;;;WAWG;QACH,WAAW,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,EAAE,CAAA;SAAE,CAAC;QACpD;;;WAGG;QACH,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;KAClD;CA6rBJ"}
@@ -20,6 +20,13 @@ export type FlatViewRoutes = Record<string, {
20
20
  middleware: (string | any)[];
21
21
  viewPath: string;
22
22
  segments: ViewRouteSegment[];
23
+ /**
24
+ * Feature flags gating this route, accumulated from every router and layout
25
+ * above it. All must be on for the route to resolve; any one off makes the
26
+ * request a 404. Evaluated per request, after middleware, since the table
27
+ * itself is built once at boot and cannot vary by user.
28
+ */
29
+ features: string[];
23
30
  }>;
24
31
  export declare function createFlatViewRoutes(routes: ViewRoutes): {
25
32
  [k: string]: {
@@ -27,6 +34,13 @@ export declare function createFlatViewRoutes(routes: ViewRoutes): {
27
34
  middleware: (string | any)[];
28
35
  viewPath: string;
29
36
  segments: ViewRouteSegment[];
37
+ /**
38
+ * Feature flags gating this route, accumulated from every router and layout
39
+ * above it. All must be on for the route to resolve; any one off makes the
40
+ * request a 404. Evaluated per request, after middleware, since the table
41
+ * itself is built once at boot and cannot vary by user.
42
+ */
43
+ features: string[];
30
44
  };
31
45
  };
32
46
  //# sourceMappingURL=createFlatViewRoutes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createFlatViewRoutes.d.ts","sourceRoot":"","sources":["../../../services/router/createFlatViewRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CACjC,MAAM,EACN;IACE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,UAAU,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B,CACF,CAAC;AAmCF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU;;cAxC7C,aAAa,EAAE;oBACT,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;kBAClB,MAAM;kBACN,gBAAgB,EAAE;;EAwG/B"}
1
+ {"version":3,"file":"createFlatViewRoutes.d.ts","sourceRoot":"","sources":["../../../services/router/createFlatViewRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,MAAM,CACjC,MAAM,EACN;IACE,IAAI,EAAE,aAAa,EAAE,CAAC;IACtB,UAAU,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB,CACF,CAAC;AAmCF,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU;;cA/C7C,aAAa,EAAE;oBACT,CAAC,MAAM,GAAG,GAAG,CAAC,EAAE;kBAClB,MAAM;kBACN,gBAAgB,EAAE;QAC5B;;;;;WAKG;kBACO,MAAM,EAAE;;EA2GrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"streamQueryInjection.d.ts","sourceRoot":"","sources":["../../../services/router/streamQueryInjection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAKlE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAGlE;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,KAAK,EAAE,gBAAgB,EACvB,KAAK,GAAE,oBAAyB,EAChC,YAAY,CAAC,EAAE,cAAc,GAC5B,cAAc,CAAC,UAAU,CAAC,CAsH5B;AAUD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGhE"}
1
+ {"version":3,"file":"streamQueryInjection.d.ts","sourceRoot":"","sources":["../../../services/router/streamQueryInjection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAE/E,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAE7E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAcnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAKlE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CAGlE;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,IAAI,CAAC;IACtC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC,EAClC,KAAK,EAAE,gBAAgB,EACvB,KAAK,GAAE,oBAAyB,EAChC,YAAY,CAAC,EAAE,cAAc,GAC5B,cAAc,CAAC,UAAU,CAAC,CAsH5B;AAUD,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAGhE"}
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{Mb as S,Nb as U,Ob as V,Pb as W}from"../chunk-vdzb29p5.js";import{Sb as Y}from"../chunk-17m5wxv0.js";import{_e as R}from"../chunk-btr9kyqh.js";import{gf as F,if as q}from"../chunk-mqwrmbh4.js";import"../chunk-yhzb9qpk.js";import"../chunk-4f69ygc8.js";class v{static token;async boot(){}static inject(){if(!this.token)throw Error(`Service [${this.name}] does not declare a \`static token\`, so the container has no key to resolve it by.`);try{return q(this)}catch(x){throw Error(`Could not inject [${this.name}]. Services are constructed when the kernel boots, so `+"inject() only works from code that runs after that \u2014 a constructor default or a method "+`body, never module top level. Check that [${this.name}] is listed in \`services\` on your Kernel.`,{cause:x})}}static with(x){let f=new this;for(let[C,g]of Object.entries(x))if(g!==void 0)f[C]=g;return f}}import{readdir as H}from"fs/promises";import{join as J,parse as z}from"path";var L=[".ts",".tsx",".js",".mjs",".jsx"];function M(x={}){let f={};for(let[C,g]of Object.entries(x))f[C]=B(g);return new F(f)}async function Q(x,f=new F){let C=[];try{C=await H(x)}catch(D){return f}let g=C.filter((D)=>{let{ext:P,name:j}=z(D);return L.includes(P)&&!j.startsWith(".")}).sort();for(let D of g){let{name:P}=z(D),j=await import(J(x,D));f.set(P,B(j))}return f}function B(x){if(x&&typeof x==="object"&&"default"in x)return x.default;return x}export{R as withDefaults,S as sourceFiles,W as projectRoot,Q as loadConfigFrom,V as discoverClasses,M as createConfigRepository,Y as ServiceProvider,v as Service,F as Repository,U as DiscoveryError};
2
+ import{Sb as S,Tb as U,Ub as V,Vb as W}from"../chunk-fjm4y8bn.js";import{Yb as Y}from"../chunk-4yt5x8s2.js";import{qf as R}from"../chunk-sy7jbdeb.js";import{Af as q,yf as F}from"../chunk-d125j8t0.js";import"../chunk-dgsgjg53.js";import"../chunk-jhkjz9jr.js";class v{static token;async boot(){}static inject(){if(!this.token)throw Error(`Service [${this.name}] does not declare a \`static token\`, so the container has no key to resolve it by.`);try{return q(this)}catch(x){throw Error(`Could not inject [${this.name}]. Services are constructed when the kernel boots, so `+"inject() only works from code that runs after that \u2014 a constructor default or a method "+`body, never module top level. Check that [${this.name}] is listed in \`services\` on your Kernel.`,{cause:x})}}static with(x){let f=new this;for(let[C,g]of Object.entries(x))if(g!==void 0)f[C]=g;return f}}import{readdir as H}from"fs/promises";import{join as J,parse as z}from"path";var L=[".ts",".tsx",".js",".mjs",".jsx"];function M(x={}){let f={};for(let[C,g]of Object.entries(x))f[C]=B(g);return new F(f)}async function Q(x,f=new F){let C=[];try{C=await H(x)}catch(D){return f}let g=C.filter((D)=>{let{ext:P,name:j}=z(D);return L.includes(P)&&!j.startsWith(".")}).sort();for(let D of g){let{name:P}=z(D),j=await import(J(x,D));f.set(P,B(j))}return f}function B(x){if(x&&typeof x==="object"&&"default"in x)return x.default;return x}export{R as withDefaults,S as sourceFiles,W as projectRoot,Q as loadConfigFrom,V as discoverClasses,M as createConfigRepository,Y as ServiceProvider,v as Service,F as Repository,U as DiscoveryError};
3
3
 
4
- //# debugId=DB0439368979C04864756E2164756E21
4
+ //# debugId=C2E9E4E1217608F664756E2164756E21
@@ -6,6 +6,6 @@
6
6
  "import { readdir } from \"node:fs/promises\";\nimport { join, parse } from \"node:path\";\n\nimport { Repository } from \"./Repository\";\n\nconst CONFIG_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".mjs\", \".jsx\"];\n\n// Builds a Repository from an already-imported map of config modules. The map\n// key becomes the top-level config key, so `{ mail: mailModule }` is readable\n// as `config.get(\"mail.driver\")`. Each entry may be either the module namespace\n// (its `default` export is unwrapped) or the config object itself.\nexport function createConfigRepository(\n modules: Record<string, any> = {},\n): Repository {\n const items: Record<string, any> = {};\n\n for (const [key, mod] of Object.entries(modules)) {\n items[key] = unwrap(mod);\n }\n\n return new Repository(items);\n}\n\n// Reads every config module in an app's `app/config` directory into a\n// Repository. The file's basename is the top-level key: `app/config/mail.ts`\n// populates `mail.*`. A missing directory yields an empty Repository so apps\n// that declare no config still boot.\nexport async function loadConfigFrom(\n directory: string,\n repository = new Repository(),\n): Promise<Repository> {\n let entries: string[] = [];\n\n try {\n entries = await readdir(directory);\n } catch (err) {\n return repository;\n }\n\n const files = entries\n .filter((entry) => {\n const { ext, name } = parse(entry);\n return CONFIG_EXTENSIONS.includes(ext) && !name.startsWith(\".\");\n })\n .sort();\n\n for (const file of files) {\n const { name } = parse(file);\n const mod = await import(join(directory, file));\n repository.set(name, unwrap(mod));\n }\n\n return repository;\n}\n\nfunction unwrap(mod: any) {\n if (mod && typeof mod === \"object\" && \"default\" in mod) {\n return mod.default;\n }\n return mod;\n}\n"
7
7
  ],
8
8
  "mappings": ";2RAgCO,CAAe,JAAQ,EAOrB,OAMD,AAAI,EAAkB,QAmBrB,OAAS,EAKX,CACH,GAAI,CAAC,KAAK,MACR,MAAU,MACR,YAAY,KAAK,0FACnB,EAGF,GAAI,CACF,OAAO,EAAI,IAAuB,EAClC,MAAO,EAAO,CACd,MAAU,MACR,qBAAqB,KAAK,6DACxB,+FACA,6CAA6C,KAAK,kDAEpD,CAAE,OAAM,CACV,SAoBG,KAAuB,CAAoB,EAA0B,CAC1E,IAAM,EAAW,IAAI,KACrB,QAAY,EAAK,KAAU,OAAO,QAAQ,CAAS,EACjD,GAAI,IAAU,OAAW,EAAS,GAAO,EAE3C,OAAO,EAEX,CChHA,kBAAS,oBACT,eAAS,WAAM,aAIf,IAAM,EAAoB,CAAC,MAAO,OAAQ,MAAO,OAAQ,MAAM,EAMxD,SAAS,CAAsB,CACpC,EAA+B,CAAC,EACpB,CACZ,IAAM,EAA6B,CAAC,EAEpC,QAAY,EAAK,KAAQ,OAAO,QAAQ,CAAO,EAC7C,EAAM,GAAO,EAAO,CAAG,EAGzB,OAAO,IAAI,EAAW,CAAK,EAO7B,eAAsB,CAAc,CAClC,EACA,EAAa,IAAI,EACI,CACrB,IAAI,EAAoB,CAAC,EAEzB,GAAI,CACF,EAAU,MAAM,EAAQ,CAAS,EACjC,MAAO,EAAK,CACZ,OAAO,EAGT,IAAM,EAAQ,EACX,OAAO,CAAC,IAAU,CACjB,IAAQ,MAAK,QAAS,EAAM,CAAK,EACjC,OAAO,EAAkB,SAAS,CAAG,GAAK,CAAC,EAAK,WAAW,GAAG,EAC/D,EACA,KAAK,EAER,QAAW,KAAQ,EAAO,CACxB,IAAQ,QAAS,EAAM,CAAI,EACrB,EAAM,MAAa,SAAK,EAAW,CAAI,GAC7C,EAAW,IAAI,EAAM,EAAO,CAAG,CAAC,EAGlC,OAAO,EAGT,SAAS,CAAM,CAAC,EAAU,CACxB,GAAI,GAAO,OAAO,IAAQ,UAAY,YAAa,EACjD,OAAO,EAAI,QAEb,OAAO",
9
- "debugId": "DB0439368979C04864756E2164756E21",
9
+ "debugId": "C2E9E4E1217608F664756E2164756E21",
10
10
  "names": []
11
11
  }
@@ -2,6 +2,7 @@ import { type ComponentType, type PropsWithChildren, type ReactNode } from "reac
2
2
  import { type FallbackProps } from "react-error-boundary";
3
3
  import type { User } from "../auth/types";
4
4
  import { type QueryConfig } from "../client/QueryManagerContext";
5
+ import type { ClientFeatureKey } from "../client/rpc";
5
6
  import type { Breadcrumb } from "../client/useBreadcrumbs";
6
7
  /**
7
8
  * A dictionary as `Dictionary.create` produces it: a name and a
@@ -93,6 +94,17 @@ export interface PageProps {
93
94
  user?: Partial<User> | null;
94
95
  /** What `useBreadcrumbs()` returns, in order. */
95
96
  breadcrumbs?: Breadcrumb[];
97
+ /**
98
+ * What `useFeature()` reports, keyed by feature key. Anything left out reads
99
+ * as off, exactly as an undeclared key does in a real request.
100
+ *
101
+ * A test seeds the *outcome*, not the declaration: `app/features` owns the
102
+ * targeting and the rollout, and re-deriving those here would mean building a
103
+ * request context — a user, a `session_id`, a bot verdict — to assert a
104
+ * branch that only cares which way the feature came out. Cover the targeting
105
+ * where it lives, with a server test.
106
+ */
107
+ features?: Partial<Record<ClientFeatureKey, boolean>>;
96
108
  /**
97
109
  * The theme `useTheme()` starts on. The app reads a visitor's stored choice
98
110
  * out of `localStorage`; a test has no session to have made one in, so this
@@ -1 +1 @@
1
- {"version":3,"file":"Page.d.ts","sourceRoot":"","sources":["../../testing/Page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AAYvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,kEAAkE;IAClE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACjE;AA6ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,iBAAiB,CAAC,SAAS,CAAC,4CA4PvD,CAAC"}
1
+ {"version":3,"file":"Page.d.ts","sourceRoot":"","sources":["../../testing/Page.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAiB,KAAK,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGzE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAI1C,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,+BAA+B,CAAC;AAYvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAM3D;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,SAAS;IACxB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,+DAA+D;IAC/D,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;;;;;;;OAUG;IACH,YAAY,CAAC,EAAE,cAAc,EAAE,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD;;;;;;;;;;;;;;;;OAgBG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,kEAAkE;IAClE,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC5B,iDAAiD;IACjD,WAAW,CAAC,EAAE,UAAU,EAAE,CAAC;IAC3B;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAC7C;;;;;OAKG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC;CACjE;AA6ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,iBAAiB,CAAC,SAAS,CAAC,4CAiQvD,CAAC"}
@@ -129,7 +129,7 @@ function toClientDictionary(dictionaries, locales, locale, translations) {
129
129
  * `Query.prefetch` does, framework warning included.
130
130
  */
131
131
  var Page = (props) => {
132
- const { children, pathname: routePath = "/", params = {}, searchParams, hash = "", locale = "en-US", defaultLocale = locale, dictionaries = [], translations = {}, queryData = {}, queryConfig, user = null, breadcrumbs = [], theme, fallback = null, errorFallback, onNavigate } = props;
132
+ const { children, pathname: routePath = "/", params = {}, searchParams, hash = "", locale = "en-US", defaultLocale = locale, dictionaries = [], translations = {}, queryData = {}, queryConfig, user = null, breadcrumbs = [], features = {}, theme, fallback = null, errorFallback, onNavigate } = props;
133
133
  const supportedLocales = useMemo(() => Array.from(/* @__PURE__ */ new Set([
134
134
  ...props.supportedLocales ?? [],
135
135
  defaultLocale,
@@ -188,6 +188,7 @@ var Page = (props) => {
188
188
  },
189
189
  prefetchedData,
190
190
  breadcrumbs: breadcrumbsRecord,
191
+ features,
191
192
  appId: "test"
192
193
  }), [
193
194
  params,
@@ -200,7 +201,8 @@ var Page = (props) => {
200
201
  dictionary,
201
202
  supportedLocales,
202
203
  prefetchedData,
203
- breadcrumbsRecord
204
+ breadcrumbsRecord,
205
+ features
204
206
  ]);
205
207
  const [routerSubject] = useState(() => new Subject(routeState));
206
208
  const onNavigateRef = useRef(onNavigate);
@@ -234,6 +236,7 @@ var Page = (props) => {
234
236
  },
235
237
  componentTree: [],
236
238
  auth: { user },
239
+ features,
237
240
  __csrf: "test-csrf-token",
238
241
  cssManifest: {},
239
242
  modulePreloadManifest: {},
@@ -251,7 +254,8 @@ var Page = (props) => {
251
254
  locale,
252
255
  supportedLocales,
253
256
  defaultLocale,
254
- user
257
+ user,
258
+ features
255
259
  ]);
256
260
  const [viewEntriesSubject] = useState(() => new Subject([]));
257
261
  const routerContext = useMemo(() => ({
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../testing/Page.tsx"],"sourcesContent":["import {\n Suspense,\n useContext,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type PropsWithChildren,\n type ReactNode,\n} from \"react\";\nimport { ErrorBoundary, type FallbackProps } from \"react-error-boundary\";\nimport { Action, createMemoryHistory } from \"history\";\n\nimport type { User } from \"../auth/types\";\nimport { ClientRouterContext } from \"../client/ClientRouterContext\";\nimport { I18nProvider } from \"../client/I18nContext\";\nimport { ProgressManager } from \"../client/ProgressManager\";\nimport {\n QueryManagerContext,\n QueryManagerProvider,\n type QueryConfig,\n} from \"../client/QueryManagerContext\";\nimport {\n RouteStateProvider,\n type PageData,\n type RouteState,\n} from \"../client/RouteStateContext\";\nimport { RouteTransitionProvider } from \"../client/RouteTransitionProvider\";\nimport {\n ServerDataContext,\n type ServerDataContextValue,\n} from \"../client/ServerDataProvider\";\nimport { ThemeProvider } from \"../client/ThemeProvider\";\nimport type { Breadcrumb } from \"../client/useBreadcrumbs\";\nimport { WebSocketContext } from \"../client/WebsocketContext\";\nimport { applyParams } from \"../utils/applyParams\";\nimport { Subject } from \"../utils/Subject\";\nimport { toVariantKey } from \"../utils/variantKey\";\n\n/**\n * A dictionary as `Dictionary.create` produces it: a name and a\n * `{ key: { locale: string } }` map.\n *\n * Typed structurally rather than as `Dictionary<T>` for two reasons. It keeps\n * `gemi/testing` from importing `gemi/i18n` — a server entry, which reaches the\n * `Lang` facade and through it the container. And it means an object literal of\n * the same shape is accepted, so a test never *has* to import the app's\n * dictionaries at all.\n *\n * Only `name` and `dictionary` are read — both plain data. `Dictionary`'s\n * server-only methods (`render`, `reference`, which throw once `window` is\n * defined) are never called from here.\n */\nexport interface PageDictionary {\n name: string;\n dictionary: Record<string, Record<string, string>>;\n}\n\nexport interface PageProps {\n /**\n * The URL the view is mounted at. A template (`/app/:orgId/chat`) is resolved\n * against `params`, so the same string can be pasted from the router.\n */\n pathname?: string;\n /** Route params, as the router would have parsed them out of `pathname`. */\n params?: Record<string, string>;\n /** `\"?tab=recent\"`, `\"tab=recent\"`, or `{ tab: \"recent\" }`. */\n searchParams?: string | Record<string, string | number | boolean>;\n hash?: string;\n /** The locale `useTranslator` and `useLocale` report. */\n locale?: string;\n /**\n * The app's default locale. Links and `useNavigate` omit the locale segment\n * for it, so leaving this equal to `locale` (the default) keeps hrefs\n * unprefixed — set it to seed a page being viewed in a non-default locale.\n */\n defaultLocale?: string;\n supportedLocales?: string[];\n /**\n * Dictionaries the components under test translate against — the app's own,\n * or literals of the same shape.\n *\n * Note what importing the app's costs: `app/i18n/index.ts` imports\n * `gemi/i18n`, a server entry, so the test file pulls the container and\n * `node:async_hooks` into its module graph. Nothing there runs (and nothing\n * here calls it), so it is fine under any runner that has Node builtins —\n * vitest, `bun test` — and not under one that renders in a real browser. Use\n * `translations` there, which is the shape the client actually receives.\n */\n dictionaries?: PageDictionary[];\n /**\n * Translations for the current locale, already resolved: dictionary name →\n * key → string. This is the shape the server serializes onto the page, so it\n * is what the client reads at runtime — and it imports nothing.\n *\n * ```tsx\n * <Page translations={{ Chat: { greeting: \"Hello {{name}}\" } }}>\n * ```\n *\n * Merged over `dictionaries`, so the two compose: seed from the app's real\n * dictionary and override the one key a test is about.\n */\n translations?: Record<string, Record<string, string>>;\n /**\n * Data `useQuery` finds already cached, keyed by API path — the path passed\n * to `useQuery`, without the `/api` prefix the client adds when it fetches.\n * A key may carry a query string (`\"/lists?page=2\"`) to seed one search\n * variant.\n *\n * The cache is keyed by the *resolved* path, so a key's `:params` are\n * resolved against the page's `params` — and a key naming one the page does\n * not carry is an error, naming the key. That case is common enough to be\n * worth the loud failure: a query often takes its params from the call site\n * rather than the route (`useQuery(\"/orgs/:orgId/lists\", { params: { orgId } })`\n * with `orgId` in component state), and the right seed for it is the resolved\n * path, `\"/orgs/abc/lists\"`.\n *\n * Seeded at mount only: a component that mutates or refetches its data owns\n * the cache from then on.\n */\n queryData?: Record<string, unknown>;\n /** App-wide `useQuery` defaults, as `createRoot` threads them. */\n queryConfig?: QueryConfig;\n /**\n * What `useUser()` reports. Defaults to `null` — an anonymous visitor — and\n * either way the hook resolves from here without issuing a request.\n */\n user?: Partial<User> | null;\n /** What `useBreadcrumbs()` returns, in order. */\n breadcrumbs?: Breadcrumb[];\n /**\n * The theme `useTheme()` starts on. The app reads a visitor's stored choice\n * out of `localStorage`; a test has no session to have made one in, so this\n * seeds it without writing to storage. `setTheme` works from either.\n */\n theme?: \"light\" | \"dark\" | \"system\";\n /**\n * Fallback for the `Suspense` boundary wrapped around the children — the\n * stand-in for the view's own `Loading` export, which the real router\n * supplies. Defaults to `null`.\n */\n fallback?: ReactNode;\n /**\n * Renders in place of the children when one throws, mirroring a view's\n * `Error` export. Without it a thrown render (an errored suspense query,\n * say) propagates out of `render()` and fails the test, which is usually\n * what you want.\n */\n errorFallback?: ComponentType<FallbackProps>;\n /**\n * Called when something navigates — a `Link` click, `useNavigate().push`.\n * The navigation is reported, not performed: `<Page>` renders one route and\n * does not re-resolve the tree, so `useLocation()` keeps reporting the\n * pathname it was given.\n */\n onNavigate?: (href: string, action: \"push\" | \"replace\") => void;\n}\n\n/** `\"?a=b\"` (or `\"\"`) from any of the shapes `searchParams` accepts. */\nfunction toSearchString(search: PageProps[\"searchParams\"]): string {\n if (!search) return \"\";\n const query =\n typeof search === \"string\"\n ? search.replace(/^\\?/, \"\")\n : new URLSearchParams(\n Object.entries(search).map(([key, value]) => [key, String(value)]),\n ).toString();\n return query ? `?${query}` : \"\";\n}\n\n/**\n * The `:params` a seed key needs supplied. Wildcards (`:rest*`) are excluded —\n * `applyParams` drops those when missing, which is a resolution rather than a\n * failure.\n *\n * Optional params (`:id?`) cannot reach here at all: a key is split at its\n * first `?` to separate the search string, so `\"/lists/:folderId?\"` arrives as\n * the path `/lists/:folderId`. Seed the resolved path for those.\n */\nfunction requiredParamsOf(path: string): string[] {\n return Array.from(path.matchAll(/:([^/]+)/g), ([, name]) => name).filter(\n (name) => !name.endsWith(\"*\"),\n );\n}\n\n/**\n * Fails a `queryData` key whose `:params` the page does not carry, saying so\n * in terms of the key.\n *\n * Without this the two documented runners disagree, and neither is legible.\n * `applyParams` throws `Missing parameter: orgId` under `import.meta.env.DEV`\n * (vitest) — a router-utility stack trace out of `<Page>`'s render, before\n * anything mounts, naming nothing that appears in the test. Under `bun test`\n * that flag is falsy, so it logs and seeds the literal `/orgs/undefined/lists`\n * instead: the seed misses, the query goes to the network, and the assertion\n * runs against a loading state.\n *\n * The case is common because a query's params often come from the call site\n * rather than the route — `useQuery(\"/orgs/:orgId/lists\", { params: { orgId } })`\n * with `orgId` in component state. The cache is keyed by the *resolved* path,\n * so the way out is to seed that path directly.\n */\nfunction resolveSeedPath(\n key: string,\n rawPath: string,\n params: Record<string, string>,\n): string {\n const missing = requiredParamsOf(rawPath).filter(\n (name) => params[name] === undefined,\n );\n if (missing.length > 0) {\n throw new Error(\n `[gemi] <Page> cannot resolve the queryData key \"${key}\": no value for ` +\n `${missing.map((name) => `:${name}`).join(\", \")}. The query cache is ` +\n `keyed by the resolved path, so either add ${missing\n .map((name) => `\\`${name}\\``)\n .join(\", \")} to the page's \\`params\\`, or seed the resolved path ` +\n `(e.g. \"${applyParams(\n rawPath,\n Object.fromEntries(missing.map((name) => [name, \"123\"])),\n )}\") — which is what a query taking its params from component state ` +\n `reads under.`,\n );\n }\n return applyParams(rawPath, params);\n}\n\n/**\n * `queryData` in the shape the query cache seeds from: `{ [path]: { [variant]:\n * data } }`, the same payload `Query.prefetch` puts on a server-rendered page.\n */\nfunction toPrefetchedData(\n queryData: Record<string, unknown>,\n params: Record<string, string>,\n warned: Set<string>,\n) {\n const prefetchedData: Record<string, Record<string, unknown>> = {};\n for (const [key, data] of Object.entries(queryData)) {\n const [rawPath, rawSearch = \"\"] = key.split(\"?\");\n // Once per key per page, not once per render: this runs again on every\n // re-render, and a duplicated warning reads as a second mistake.\n if (rawPath.startsWith(\"/api/\") && !warned.has(key)) {\n warned.add(key);\n console.warn(\n `[gemi] queryData key \"${key}\" starts with /api. useQuery is keyed by ` +\n `the path you pass it — the /api prefix is added when it fetches — ` +\n `so this entry seeds a path no query reads.`,\n );\n }\n const path = resolveSeedPath(key, rawPath, params);\n prefetchedData[path] = {\n ...prefetchedData[path],\n [toVariantKey(rawSearch)]: data,\n };\n }\n return prefetchedData;\n}\n\n/**\n * `{ [locale]: { [dictionary]: { [key]: string } } }` — the payload\n * `Translator` serializes onto the page, which is the only form the client\n * ever sees. `dictionaries` are transposed into it (they are keyed the other\n * way round, by key then locale); `translations` is already in it and lands\n * under `locale`, last, so it wins.\n */\nfunction toClientDictionary(\n dictionaries: PageDictionary[],\n locales: string[],\n locale: string,\n translations: Record<string, Record<string, string>>,\n): Record<string, Record<string, Record<string, string>>> {\n const clientDictionary: Record<\n string,\n Record<string, Record<string, string>>\n > = {};\n for (const supported of locales) {\n clientDictionary[supported] ??= {};\n }\n for (const { name, dictionary } of dictionaries) {\n for (const [key, byLocale] of Object.entries(dictionary ?? {})) {\n for (const [dictLocale, translation] of Object.entries(byLocale ?? {})) {\n clientDictionary[dictLocale] ??= {};\n clientDictionary[dictLocale][name] ??= {};\n clientDictionary[dictLocale][name][key] = translation;\n }\n }\n }\n for (const [name, keys] of Object.entries(translations)) {\n clientDictionary[locale] ??= {};\n clientDictionary[locale][name] = {\n ...clientDictionary[locale][name],\n ...keys,\n };\n }\n return clientDictionary;\n}\n\n/**\n * Mounts a component with the inputs a view normally arrives with — route\n * params, the current locale and its dictionaries, prefetched query data, the\n * signed-in user — so a unit test can assert what it renders rather than only\n * its empty state.\n *\n * ```tsx\n * import { render, screen } from \"@testing-library/react\";\n * import { Page } from \"gemi/testing\";\n *\n * render(\n * <Page\n * pathname=\"/app/:orgId/chat\"\n * params={{ orgId: \"abc\" }}\n * queryData={{ \"/organizations/:orgId/messages\": [{ id: 1, body: \"hi\" }] }}\n * dictionaries={[ChatDictionary]}\n * >\n * <OrgChat />\n * </Page>,\n * );\n *\n * expect(screen.getByText(\"hi\")).toBeDefined();\n * ```\n *\n * It is a plain component, so it composes with any renderer — Testing\n * Library's `render`, `react-test-renderer`, or `renderToString`.\n *\n * Two things it does not do.\n *\n * It does not route: there is no view tree and no route manifest behind it, so\n * a navigation is reported through `onNavigate` rather than resolved. To\n * assert the page *after* one, render a second `<Page>`.\n *\n * And under `renderToString` it renders the server's own no-data branch for an\n * *unseeded* query rather than suspending — deliberately, because suspending\n * there is the streaming server's job: `createRoot` threads the request's\n * `ServerQueryStore` through `ServerQueryContext`, and that store is what runs\n * the route handler. A harness has no request and no handler to run, so there\n * is nothing to suspend on. Seeded queries render their data on the server\n * exactly as they do in the browser; unseeded ones behave as a route with no\n * `Query.prefetch` does, framework warning included.\n */\nexport const Page = (props: PropsWithChildren<PageProps>) => {\n const {\n children,\n pathname: routePath = \"/\",\n params = {},\n searchParams,\n hash = \"\",\n locale = \"en-US\",\n defaultLocale = locale,\n dictionaries = [],\n translations = {},\n queryData = {},\n queryConfig,\n user = null,\n breadcrumbs = [],\n theme,\n fallback = null,\n errorFallback,\n onNavigate,\n } = props;\n\n // The caller's list, in the caller's order — a language switcher maps over\n // it, so hoisting the page's own locale to the front would reorder the\n // rendered options. The defaults are appended, only to guarantee presence.\n const supportedLocales = useMemo(\n () =>\n Array.from(\n new Set([...(props.supportedLocales ?? []), defaultLocale, locale]),\n ),\n [props.supportedLocales, defaultLocale, locale],\n );\n const pathname = applyParams(routePath, params) || \"/\";\n const search = toSearchString(searchParams);\n // The URL's locale segment, which the default locale does not get.\n const urlLocaleSegment = locale === defaultLocale ? null : locale;\n\n const dictionary = useMemo(\n () =>\n toClientDictionary(dictionaries, supportedLocales, locale, translations),\n [dictionaries, supportedLocales, locale, translations],\n );\n\n // Keys that have already drawn a warning, so a re-render does not repeat it.\n const warnedRef = useRef<Set<string>>(new Set());\n const prefetchedData = useMemo(() => {\n const seeded = toPrefetchedData(queryData, params, warnedRef.current);\n // `useUser` reads `/auth/me` like any other query. Seeding it — with `null`\n // for the anonymous default — is what keeps a component test off the\n // network for a hook nothing in the test asked for.\n seeded[\"/auth/me\"] ??= { \"\": user ?? null };\n return seeded;\n }, [queryData, params, user]);\n\n // Keyed by `${view}:${pathname}` in the router's cache; the view names are\n // ours to choose here, and only their order reaches `useBreadcrumbs`.\n const { breadcrumbViews, breadcrumbsCache, breadcrumbsRecord } =\n useMemo(() => {\n const views = breadcrumbs.map((_, index) => `breadcrumb-${index}`);\n const cache = new Map<string, Breadcrumb>(\n breadcrumbs.map((breadcrumb, index) => [\n `${views[index]}:${pathname}`,\n breadcrumb,\n ]),\n );\n return {\n breadcrumbViews: views,\n breadcrumbsCache: cache,\n breadcrumbsRecord: Object.fromEntries(cache),\n };\n }, [breadcrumbs, pathname]);\n\n const [isNavigatingSubject] = useState(() => new Subject<boolean>(false));\n const [progressManager] = useState(\n () => new ProgressManager(isNavigatingSubject),\n );\n const [history] = useState(() =>\n createMemoryHistory({ initialEntries: [`${pathname}${search}${hash}`] }),\n );\n\n const routeState: RouteState & PageData = useMemo(\n () => ({\n views: [],\n params,\n search,\n state: {},\n pathname,\n hash,\n action: null,\n routePath,\n locale: urlLocaleSegment,\n data: {},\n i18n: { currentLocale: locale, dictionary, supportedLocales },\n prefetchedData,\n breadcrumbs: breadcrumbsRecord,\n appId: \"test\",\n }),\n [\n params,\n search,\n pathname,\n hash,\n routePath,\n urlLocaleSegment,\n locale,\n dictionary,\n supportedLocales,\n prefetchedData,\n breadcrumbsRecord,\n ],\n );\n\n const [routerSubject] = useState(() => new Subject<RouteState>(routeState));\n\n const onNavigateRef = useRef(onNavigate);\n onNavigateRef.current = onNavigate;\n // Subscribed during render, not in an effect, because React flushes child\n // effects before parent ones — and mount-time navigation is a real pattern:\n // `<Redirect>` pushes from its own mount effect, as does any auth guard. A\n // listener registered in `<Page>`'s effect is not there yet when those fire,\n // so `onNavigate` would silently miss exactly the redirects a test most\n // wants to assert. Ref-guarded, so React's double-invoke registers one.\n //\n // Nothing unsubscribes: this history is created per `<Page>` and reachable\n // from nowhere else, so it is collected with the page it belongs to.\n const listeningRef = useRef(false);\n if (!listeningRef.current) {\n listeningRef.current = true;\n history.listen(({ location, action }) => {\n const href = `${location.pathname}${location.search}${location.hash}`;\n onNavigateRef.current?.(\n href,\n action === Action.Replace ? \"replace\" : \"push\",\n );\n });\n }\n\n const serverData: ServerDataContextValue = useMemo(\n () => ({\n routeManifest: {},\n pageData: {},\n breadcrumbs: breadcrumbsRecord,\n prefetchedData,\n router: {\n pathname,\n params,\n currentPath: routePath,\n is404: false,\n searchParams: search,\n urlLocaleSegment,\n },\n i18n: {\n dictionary,\n currentLocale: locale,\n supportedLocales,\n defaultLocale,\n },\n componentTree: [],\n auth: { user: user as User },\n __csrf: \"test-csrf-token\",\n cssManifest: {},\n modulePreloadManifest: {},\n meta: {},\n appId: \"test\",\n }),\n [\n breadcrumbsRecord,\n prefetchedData,\n pathname,\n params,\n routePath,\n search,\n urlLocaleSegment,\n dictionary,\n locale,\n supportedLocales,\n defaultLocale,\n user,\n ],\n );\n\n // Everything the router hooks read, inert: nothing here fetches, preloads or\n // resolves a route, but every hook finds the shape it expects rather than an\n // empty context to crash on.\n const [viewEntriesSubject] = useState(() => new Subject<string[]>([]));\n const routerContext = useMemo(\n () => ({\n viewEntriesSubject,\n history,\n updatePageData: () => {},\n getPageData: () => ({}),\n getScrollPosition: () => 0,\n getViewPathsFromPathname: () => breadcrumbViews,\n getRoutePathnameFromHref: (href: string) => href,\n isNavigatingSubject,\n setNavigationAbortController: () => {},\n progressManager,\n fetchRouteCSS: async () => {},\n preloadRouteModules: () => {},\n prefetchRoute: async () => {},\n takePrefetched: () => null,\n clearPrefetchCache: () => {},\n breadcrumbsCache,\n routerSubject,\n urlLocaleSegment,\n }),\n [\n viewEntriesSubject,\n history,\n breadcrumbViews,\n isNavigatingSubject,\n progressManager,\n breadcrumbsCache,\n routerSubject,\n urlLocaleSegment,\n ],\n );\n\n const [websocket] = useState(() => ({\n subscribe: async () => {},\n unsubscribe: async () => {},\n broadcast: () => {},\n }));\n\n return (\n <ThemeProvider theme={theme}>\n <ServerDataContext.Provider value={serverData}>\n <I18nProvider>\n <WebSocketContext.Provider value={websocket}>\n <QueryManagerProvider queryConfig={queryConfig}>\n <ClientRouterContext.Provider value={routerContext}>\n <RouteTransitionProvider\n isPending={false}\n isFetching={false}\n transitionPath={[\"\", pathname]}\n >\n <RouteStateProvider state={routeState}>\n <Boundary\n errorFallback={errorFallback}\n fallback={fallback}\n resetKey={pathname}\n >\n {children}\n </Boundary>\n </RouteStateProvider>\n </RouteTransitionProvider>\n </ClientRouterContext.Provider>\n </QueryManagerProvider>\n </WebSocketContext.Provider>\n </I18nProvider>\n </ServerDataContext.Provider>\n </ThemeProvider>\n );\n};\n\n/**\n * The `Suspense` boundary every view renders inside, and — when the test\n * supplies a fallback for it — the error boundary too.\n *\n * `onReset={clearErrors}` is the part that has to be here rather than inline\n * above: it needs `QueryManagerContext`, and it is what makes a view's real\n * `Error` export testable. A fallback whose \"Try again\" calls\n * `resetErrorBoundary()` re-renders the child, and `useQuery` reads the\n * failure still stored on the `QueryResource` and throws it straight back —\n * so without this the fallback never goes away and the retry path that works\n * in the app cannot be exercised. `ClientRouter`'s own boundary wires exactly\n * this pair.\n */\nconst Boundary = (\n props: PropsWithChildren<{\n errorFallback?: ComponentType<FallbackProps>;\n fallback: ReactNode;\n resetKey: string;\n }>,\n) => {\n const { errorFallback: ErrorFallback, fallback, resetKey, children } = props;\n const { clearErrors } = useContext(QueryManagerContext);\n const content = <Suspense fallback={fallback}>{children}</Suspense>;\n\n if (!ErrorFallback) {\n return content;\n }\n\n return (\n <ErrorBoundary\n FallbackComponent={ErrorFallback}\n resetKeys={[resetKey]}\n onReset={clearErrors}\n >\n {content}\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;AA+JA,SAAS,eAAe,QAA2C;CACjE,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,QACJ,OAAO,WAAW,WACd,OAAO,QAAQ,OAAO,EAAE,IACxB,IAAI,gBACF,OAAO,QAAQ,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC,CACnE,CAAC,CAAC,SAAS;CACjB,OAAO,QAAQ,IAAI,UAAU;AAC/B;;;;;;;;;;AAWA,SAAS,iBAAiB,MAAwB;CAChD,OAAO,MAAM,KAAK,KAAK,SAAS,WAAW,IAAI,GAAG,UAAU,IAAI,CAAC,CAAC,QAC/D,SAAS,CAAC,KAAK,SAAS,GAAG,CAC9B;AACF;;;;;;;;;;;;;;;;;;AAmBA,SAAS,gBACP,KACA,SACA,QACQ;CACR,MAAM,UAAU,iBAAiB,OAAO,CAAC,CAAC,QACvC,SAAS,OAAO,UAAU,KAAA,CAC7B;CACA,IAAI,QAAQ,SAAS,GACnB,MAAM,IAAI,MACR,mDAAmD,IAAI,kBAClD,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,KAAK,IAAI,EAAE,iEACH,QAC1C,KAAK,SAAS,KAAK,KAAK,GAAG,CAAC,CAC5B,KAAK,IAAI,EAAE,8DACJ,YACR,SACA,OAAO,YAAY,QAAQ,KAAK,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CACzD,EAAE,+EAEN;CAEF,OAAO,YAAY,SAAS,MAAM;AACpC;;;;;AAMA,SAAS,iBACP,WACA,QACA,QACA;CACA,MAAM,iBAA0D,CAAC;CACjE,KAAK,MAAM,CAAC,KAAK,SAAS,OAAO,QAAQ,SAAS,GAAG;EACnD,MAAM,CAAC,SAAS,YAAY,MAAM,IAAI,MAAM,GAAG;EAG/C,IAAI,QAAQ,WAAW,OAAO,KAAK,CAAC,OAAO,IAAI,GAAG,GAAG;GACnD,OAAO,IAAI,GAAG;GACd,QAAQ,KACN,yBAAyB,IAAI,sJAG/B;EACF;EACA,MAAM,OAAO,gBAAgB,KAAK,SAAS,MAAM;EACjD,eAAe,QAAQ;GACrB,GAAG,eAAe;IACjB,aAAa,SAAS,IAAI;EAC7B;CACF;CACA,OAAO;AACT;;;;;;;;AASA,SAAS,mBACP,cACA,SACA,QACA,cACwD;CACxD,MAAM,mBAGF,CAAC;CACL,KAAK,MAAM,aAAa,SACtB,iBAAiB,eAAe,CAAC;CAEnC,KAAK,MAAM,EAAE,MAAM,gBAAgB,cACjC,KAAK,MAAM,CAAC,KAAK,aAAa,OAAO,QAAQ,cAAc,CAAC,CAAC,GAC3D,KAAK,MAAM,CAAC,YAAY,gBAAgB,OAAO,QAAQ,YAAY,CAAC,CAAC,GAAG;EACtE,iBAAiB,gBAAgB,CAAC;EAClC,iBAAiB,WAAW,CAAC,UAAU,CAAC;EACxC,iBAAiB,WAAW,CAAC,KAAK,CAAC,OAAO;CAC5C;CAGJ,KAAK,MAAM,CAAC,MAAM,SAAS,OAAO,QAAQ,YAAY,GAAG;EACvD,iBAAiB,YAAY,CAAC;EAC9B,iBAAiB,OAAO,CAAC,QAAQ;GAC/B,GAAG,iBAAiB,OAAO,CAAC;GAC5B,GAAG;EACL;CACF;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4CA,IAAa,QAAQ,UAAwC;CAC3D,MAAM,EACJ,UACA,UAAU,YAAY,KACtB,SAAS,CAAC,GACV,cACA,OAAO,IACP,SAAS,SACT,gBAAgB,QAChB,eAAe,CAAC,GAChB,eAAe,CAAC,GAChB,YAAY,CAAC,GACb,aACA,OAAO,MACP,cAAc,CAAC,GACf,OACA,WAAW,MACX,eACA,eACE;CAKJ,MAAM,mBAAmB,cAErB,MAAM,qBACJ,IAAI,IAAI;EAAC,GAAI,MAAM,oBAAoB,CAAC;EAAI;EAAe;CAAM,CAAC,CACpE,GACF;EAAC,MAAM;EAAkB;EAAe;CAAM,CAChD;CACA,MAAM,WAAW,YAAY,WAAW,MAAM,KAAK;CACnD,MAAM,SAAS,eAAe,YAAY;CAE1C,MAAM,mBAAmB,WAAW,gBAAgB,OAAO;CAE3D,MAAM,aAAa,cAEf,mBAAmB,cAAc,kBAAkB,QAAQ,YAAY,GACzE;EAAC;EAAc;EAAkB;EAAQ;CAAY,CACvD;CAGA,MAAM,YAAY,uBAAoB,IAAI,IAAI,CAAC;CAC/C,MAAM,iBAAiB,cAAc;EACnC,MAAM,SAAS,iBAAiB,WAAW,QAAQ,UAAU,OAAO;EAIpE,OAAO,gBAAgB,EAAE,IAAI,QAAQ,KAAK;EAC1C,OAAO;CACT,GAAG;EAAC;EAAW;EAAQ;CAAI,CAAC;CAI5B,MAAM,EAAE,iBAAiB,kBAAkB,sBACzC,cAAc;EACZ,MAAM,QAAQ,YAAY,KAAK,GAAG,UAAU,cAAc,OAAO;EACjE,MAAM,QAAQ,IAAI,IAChB,YAAY,KAAK,YAAY,UAAU,CACrC,GAAG,MAAM,OAAO,GAAG,YACnB,UACF,CAAC,CACH;EACA,OAAO;GACL,iBAAiB;GACjB,kBAAkB;GAClB,mBAAmB,OAAO,YAAY,KAAK;EAC7C;CACF,GAAG,CAAC,aAAa,QAAQ,CAAC;CAE5B,MAAM,CAAC,uBAAuB,eAAe,IAAI,QAAiB,KAAK,CAAC;CACxE,MAAM,CAAC,mBAAmB,eAClB,IAAI,gBAAgB,mBAAmB,CAC/C;CACA,MAAM,CAAC,WAAW,eAChB,oBAAoB,EAAE,gBAAgB,CAAC,GAAG,WAAW,SAAS,MAAM,EAAE,CAAC,CACzE;CAEA,MAAM,aAAoC,eACjC;EACL,OAAO,CAAC;EACR;EACA;EACA,OAAO,CAAC;EACR;EACA;EACA,QAAQ;EACR;EACA,QAAQ;EACR,MAAM,CAAC;EACP,MAAM;GAAE,eAAe;GAAQ;GAAY;EAAiB;EAC5D;EACA,aAAa;EACb,OAAO;CACT,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,CAAC,iBAAiB,eAAe,IAAI,QAAoB,UAAU,CAAC;CAE1E,MAAM,gBAAgB,OAAO,UAAU;CACvC,cAAc,UAAU;CAUxB,MAAM,eAAe,OAAO,KAAK;CACjC,IAAI,CAAC,aAAa,SAAS;EACzB,aAAa,UAAU;EACvB,QAAQ,QAAQ,EAAE,UAAU,aAAa;GACvC,MAAM,OAAO,GAAG,SAAS,WAAW,SAAS,SAAS,SAAS;GAC/D,cAAc,UACZ,MACA,WAAW,OAAO,UAAU,YAAY,MAC1C;EACF,CAAC;CACH;CAEA,MAAM,aAAqC,eAClC;EACL,eAAe,CAAC;EAChB,UAAU,CAAC;EACX,aAAa;EACb;EACA,QAAQ;GACN;GACA;GACA,aAAa;GACb,OAAO;GACP,cAAc;GACd;EACF;EACA,MAAM;GACJ;GACA,eAAe;GACf;GACA;EACF;EACA,eAAe,CAAC;EAChB,MAAM,EAAQ,KAAa;EAC3B,QAAQ;EACR,aAAa,CAAC;EACd,uBAAuB,CAAC;EACxB,MAAM,CAAC;EACP,OAAO;CACT,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAKA,MAAM,CAAC,sBAAsB,eAAe,IAAI,QAAkB,CAAC,CAAC,CAAC;CACrE,MAAM,gBAAgB,eACb;EACL;EACA;EACA,sBAAsB,CAAC;EACvB,oBAAoB,CAAC;EACrB,yBAAyB;EACzB,gCAAgC;EAChC,2BAA2B,SAAiB;EAC5C;EACA,oCAAoC,CAAC;EACrC;EACA,eAAe,YAAY,CAAC;EAC5B,2BAA2B,CAAC;EAC5B,eAAe,YAAY,CAAC;EAC5B,sBAAsB;EACtB,0BAA0B,CAAC;EAC3B;EACA;EACA;CACF,IACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CACF;CAEA,MAAM,CAAC,aAAa,gBAAgB;EAClC,WAAW,YAAY,CAAC;EACxB,aAAa,YAAY,CAAC;EAC1B,iBAAiB,CAAC;CACpB,EAAE;CAEF,OACE,oBAAC,eAAD;EAAsB;YACpB,oBAAC,kBAAkB,UAAnB;GAA4B,OAAO;aACjC,oBAAC,cAAD,EAAA,UACE,oBAAC,iBAAiB,UAAlB;IAA2B,OAAO;cAChC,oBAAC,sBAAD;KAAmC;eACjC,oBAAC,oBAAoB,UAArB;MAA8B,OAAO;gBACnC,oBAAC,yBAAD;OACE,WAAW;OACX,YAAY;OACZ,gBAAgB,CAAC,IAAI,QAAQ;iBAE7B,oBAAC,oBAAD;QAAoB,OAAO;kBACzB,oBAAC,UAAD;SACiB;SACL;SACV,UAAU;SAET;QACO,CAAA;OACQ,CAAA;MACG,CAAA;KACG,CAAA;IACV,CAAA;GACG,CAAA,EACf,CAAA;EACY,CAAA;CACf,CAAA;AAEnB;;;;;;;;;;;;;;AAeA,IAAM,YACJ,UAKG;CACH,MAAM,EAAE,eAAe,eAAe,UAAU,UAAU,aAAa;CACvE,MAAM,EAAE,gBAAgB,WAAW,mBAAmB;CACtD,MAAM,UAAU,oBAAC,UAAD;EAAoB;EAAW;CAAmB,CAAA;CAElE,IAAI,CAAC,eACH,OAAO;CAGT,OACE,oBAAC,GAAD;EACE,mBAAmB;EACnB,WAAW,CAAC,QAAQ;EACpB,SAAS;YAER;CACY,CAAA;AAEnB"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../testing/Page.tsx"],"sourcesContent":["import {\n Suspense,\n useContext,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type PropsWithChildren,\n type ReactNode,\n} from \"react\";\nimport { ErrorBoundary, type FallbackProps } from \"react-error-boundary\";\nimport { Action, createMemoryHistory } from \"history\";\n\nimport type { User } from \"../auth/types\";\nimport { ClientRouterContext } from \"../client/ClientRouterContext\";\nimport { I18nProvider } from \"../client/I18nContext\";\nimport { ProgressManager } from \"../client/ProgressManager\";\nimport {\n QueryManagerContext,\n QueryManagerProvider,\n type QueryConfig,\n} from \"../client/QueryManagerContext\";\nimport {\n RouteStateProvider,\n type PageData,\n type RouteState,\n} from \"../client/RouteStateContext\";\nimport { RouteTransitionProvider } from \"../client/RouteTransitionProvider\";\nimport {\n ServerDataContext,\n type ServerDataContextValue,\n} from \"../client/ServerDataProvider\";\nimport { ThemeProvider } from \"../client/ThemeProvider\";\nimport type { ClientFeatureKey } from \"../client/rpc\";\nimport type { Breadcrumb } from \"../client/useBreadcrumbs\";\nimport { WebSocketContext } from \"../client/WebsocketContext\";\nimport { applyParams } from \"../utils/applyParams\";\nimport { Subject } from \"../utils/Subject\";\nimport { toVariantKey } from \"../utils/variantKey\";\n\n/**\n * A dictionary as `Dictionary.create` produces it: a name and a\n * `{ key: { locale: string } }` map.\n *\n * Typed structurally rather than as `Dictionary<T>` for two reasons. It keeps\n * `gemi/testing` from importing `gemi/i18n` — a server entry, which reaches the\n * `Lang` facade and through it the container. And it means an object literal of\n * the same shape is accepted, so a test never *has* to import the app's\n * dictionaries at all.\n *\n * Only `name` and `dictionary` are read — both plain data. `Dictionary`'s\n * server-only methods (`render`, `reference`, which throw once `window` is\n * defined) are never called from here.\n */\nexport interface PageDictionary {\n name: string;\n dictionary: Record<string, Record<string, string>>;\n}\n\nexport interface PageProps {\n /**\n * The URL the view is mounted at. A template (`/app/:orgId/chat`) is resolved\n * against `params`, so the same string can be pasted from the router.\n */\n pathname?: string;\n /** Route params, as the router would have parsed them out of `pathname`. */\n params?: Record<string, string>;\n /** `\"?tab=recent\"`, `\"tab=recent\"`, or `{ tab: \"recent\" }`. */\n searchParams?: string | Record<string, string | number | boolean>;\n hash?: string;\n /** The locale `useTranslator` and `useLocale` report. */\n locale?: string;\n /**\n * The app's default locale. Links and `useNavigate` omit the locale segment\n * for it, so leaving this equal to `locale` (the default) keeps hrefs\n * unprefixed — set it to seed a page being viewed in a non-default locale.\n */\n defaultLocale?: string;\n supportedLocales?: string[];\n /**\n * Dictionaries the components under test translate against — the app's own,\n * or literals of the same shape.\n *\n * Note what importing the app's costs: `app/i18n/index.ts` imports\n * `gemi/i18n`, a server entry, so the test file pulls the container and\n * `node:async_hooks` into its module graph. Nothing there runs (and nothing\n * here calls it), so it is fine under any runner that has Node builtins —\n * vitest, `bun test` — and not under one that renders in a real browser. Use\n * `translations` there, which is the shape the client actually receives.\n */\n dictionaries?: PageDictionary[];\n /**\n * Translations for the current locale, already resolved: dictionary name →\n * key → string. This is the shape the server serializes onto the page, so it\n * is what the client reads at runtime — and it imports nothing.\n *\n * ```tsx\n * <Page translations={{ Chat: { greeting: \"Hello {{name}}\" } }}>\n * ```\n *\n * Merged over `dictionaries`, so the two compose: seed from the app's real\n * dictionary and override the one key a test is about.\n */\n translations?: Record<string, Record<string, string>>;\n /**\n * Data `useQuery` finds already cached, keyed by API path — the path passed\n * to `useQuery`, without the `/api` prefix the client adds when it fetches.\n * A key may carry a query string (`\"/lists?page=2\"`) to seed one search\n * variant.\n *\n * The cache is keyed by the *resolved* path, so a key's `:params` are\n * resolved against the page's `params` — and a key naming one the page does\n * not carry is an error, naming the key. That case is common enough to be\n * worth the loud failure: a query often takes its params from the call site\n * rather than the route (`useQuery(\"/orgs/:orgId/lists\", { params: { orgId } })`\n * with `orgId` in component state), and the right seed for it is the resolved\n * path, `\"/orgs/abc/lists\"`.\n *\n * Seeded at mount only: a component that mutates or refetches its data owns\n * the cache from then on.\n */\n queryData?: Record<string, unknown>;\n /** App-wide `useQuery` defaults, as `createRoot` threads them. */\n queryConfig?: QueryConfig;\n /**\n * What `useUser()` reports. Defaults to `null` — an anonymous visitor — and\n * either way the hook resolves from here without issuing a request.\n */\n user?: Partial<User> | null;\n /** What `useBreadcrumbs()` returns, in order. */\n breadcrumbs?: Breadcrumb[];\n /**\n * What `useFeature()` reports, keyed by feature key. Anything left out reads\n * as off, exactly as an undeclared key does in a real request.\n *\n * A test seeds the *outcome*, not the declaration: `app/features` owns the\n * targeting and the rollout, and re-deriving those here would mean building a\n * request context — a user, a `session_id`, a bot verdict — to assert a\n * branch that only cares which way the feature came out. Cover the targeting\n * where it lives, with a server test.\n */\n features?: Partial<Record<ClientFeatureKey, boolean>>;\n /**\n * The theme `useTheme()` starts on. The app reads a visitor's stored choice\n * out of `localStorage`; a test has no session to have made one in, so this\n * seeds it without writing to storage. `setTheme` works from either.\n */\n theme?: \"light\" | \"dark\" | \"system\";\n /**\n * Fallback for the `Suspense` boundary wrapped around the children — the\n * stand-in for the view's own `Loading` export, which the real router\n * supplies. Defaults to `null`.\n */\n fallback?: ReactNode;\n /**\n * Renders in place of the children when one throws, mirroring a view's\n * `Error` export. Without it a thrown render (an errored suspense query,\n * say) propagates out of `render()` and fails the test, which is usually\n * what you want.\n */\n errorFallback?: ComponentType<FallbackProps>;\n /**\n * Called when something navigates — a `Link` click, `useNavigate().push`.\n * The navigation is reported, not performed: `<Page>` renders one route and\n * does not re-resolve the tree, so `useLocation()` keeps reporting the\n * pathname it was given.\n */\n onNavigate?: (href: string, action: \"push\" | \"replace\") => void;\n}\n\n/** `\"?a=b\"` (or `\"\"`) from any of the shapes `searchParams` accepts. */\nfunction toSearchString(search: PageProps[\"searchParams\"]): string {\n if (!search) return \"\";\n const query =\n typeof search === \"string\"\n ? search.replace(/^\\?/, \"\")\n : new URLSearchParams(\n Object.entries(search).map(([key, value]) => [key, String(value)]),\n ).toString();\n return query ? `?${query}` : \"\";\n}\n\n/**\n * The `:params` a seed key needs supplied. Wildcards (`:rest*`) are excluded —\n * `applyParams` drops those when missing, which is a resolution rather than a\n * failure.\n *\n * Optional params (`:id?`) cannot reach here at all: a key is split at its\n * first `?` to separate the search string, so `\"/lists/:folderId?\"` arrives as\n * the path `/lists/:folderId`. Seed the resolved path for those.\n */\nfunction requiredParamsOf(path: string): string[] {\n return Array.from(path.matchAll(/:([^/]+)/g), ([, name]) => name).filter(\n (name) => !name.endsWith(\"*\"),\n );\n}\n\n/**\n * Fails a `queryData` key whose `:params` the page does not carry, saying so\n * in terms of the key.\n *\n * Without this the two documented runners disagree, and neither is legible.\n * `applyParams` throws `Missing parameter: orgId` under `import.meta.env.DEV`\n * (vitest) — a router-utility stack trace out of `<Page>`'s render, before\n * anything mounts, naming nothing that appears in the test. Under `bun test`\n * that flag is falsy, so it logs and seeds the literal `/orgs/undefined/lists`\n * instead: the seed misses, the query goes to the network, and the assertion\n * runs against a loading state.\n *\n * The case is common because a query's params often come from the call site\n * rather than the route — `useQuery(\"/orgs/:orgId/lists\", { params: { orgId } })`\n * with `orgId` in component state. The cache is keyed by the *resolved* path,\n * so the way out is to seed that path directly.\n */\nfunction resolveSeedPath(\n key: string,\n rawPath: string,\n params: Record<string, string>,\n): string {\n const missing = requiredParamsOf(rawPath).filter(\n (name) => params[name] === undefined,\n );\n if (missing.length > 0) {\n throw new Error(\n `[gemi] <Page> cannot resolve the queryData key \"${key}\": no value for ` +\n `${missing.map((name) => `:${name}`).join(\", \")}. The query cache is ` +\n `keyed by the resolved path, so either add ${missing\n .map((name) => `\\`${name}\\``)\n .join(\", \")} to the page's \\`params\\`, or seed the resolved path ` +\n `(e.g. \"${applyParams(\n rawPath,\n Object.fromEntries(missing.map((name) => [name, \"123\"])),\n )}\") — which is what a query taking its params from component state ` +\n `reads under.`,\n );\n }\n return applyParams(rawPath, params);\n}\n\n/**\n * `queryData` in the shape the query cache seeds from: `{ [path]: { [variant]:\n * data } }`, the same payload `Query.prefetch` puts on a server-rendered page.\n */\nfunction toPrefetchedData(\n queryData: Record<string, unknown>,\n params: Record<string, string>,\n warned: Set<string>,\n) {\n const prefetchedData: Record<string, Record<string, unknown>> = {};\n for (const [key, data] of Object.entries(queryData)) {\n const [rawPath, rawSearch = \"\"] = key.split(\"?\");\n // Once per key per page, not once per render: this runs again on every\n // re-render, and a duplicated warning reads as a second mistake.\n if (rawPath.startsWith(\"/api/\") && !warned.has(key)) {\n warned.add(key);\n console.warn(\n `[gemi] queryData key \"${key}\" starts with /api. useQuery is keyed by ` +\n `the path you pass it — the /api prefix is added when it fetches — ` +\n `so this entry seeds a path no query reads.`,\n );\n }\n const path = resolveSeedPath(key, rawPath, params);\n prefetchedData[path] = {\n ...prefetchedData[path],\n [toVariantKey(rawSearch)]: data,\n };\n }\n return prefetchedData;\n}\n\n/**\n * `{ [locale]: { [dictionary]: { [key]: string } } }` — the payload\n * `Translator` serializes onto the page, which is the only form the client\n * ever sees. `dictionaries` are transposed into it (they are keyed the other\n * way round, by key then locale); `translations` is already in it and lands\n * under `locale`, last, so it wins.\n */\nfunction toClientDictionary(\n dictionaries: PageDictionary[],\n locales: string[],\n locale: string,\n translations: Record<string, Record<string, string>>,\n): Record<string, Record<string, Record<string, string>>> {\n const clientDictionary: Record<\n string,\n Record<string, Record<string, string>>\n > = {};\n for (const supported of locales) {\n clientDictionary[supported] ??= {};\n }\n for (const { name, dictionary } of dictionaries) {\n for (const [key, byLocale] of Object.entries(dictionary ?? {})) {\n for (const [dictLocale, translation] of Object.entries(byLocale ?? {})) {\n clientDictionary[dictLocale] ??= {};\n clientDictionary[dictLocale][name] ??= {};\n clientDictionary[dictLocale][name][key] = translation;\n }\n }\n }\n for (const [name, keys] of Object.entries(translations)) {\n clientDictionary[locale] ??= {};\n clientDictionary[locale][name] = {\n ...clientDictionary[locale][name],\n ...keys,\n };\n }\n return clientDictionary;\n}\n\n/**\n * Mounts a component with the inputs a view normally arrives with — route\n * params, the current locale and its dictionaries, prefetched query data, the\n * signed-in user — so a unit test can assert what it renders rather than only\n * its empty state.\n *\n * ```tsx\n * import { render, screen } from \"@testing-library/react\";\n * import { Page } from \"gemi/testing\";\n *\n * render(\n * <Page\n * pathname=\"/app/:orgId/chat\"\n * params={{ orgId: \"abc\" }}\n * queryData={{ \"/organizations/:orgId/messages\": [{ id: 1, body: \"hi\" }] }}\n * dictionaries={[ChatDictionary]}\n * >\n * <OrgChat />\n * </Page>,\n * );\n *\n * expect(screen.getByText(\"hi\")).toBeDefined();\n * ```\n *\n * It is a plain component, so it composes with any renderer — Testing\n * Library's `render`, `react-test-renderer`, or `renderToString`.\n *\n * Two things it does not do.\n *\n * It does not route: there is no view tree and no route manifest behind it, so\n * a navigation is reported through `onNavigate` rather than resolved. To\n * assert the page *after* one, render a second `<Page>`.\n *\n * And under `renderToString` it renders the server's own no-data branch for an\n * *unseeded* query rather than suspending — deliberately, because suspending\n * there is the streaming server's job: `createRoot` threads the request's\n * `ServerQueryStore` through `ServerQueryContext`, and that store is what runs\n * the route handler. A harness has no request and no handler to run, so there\n * is nothing to suspend on. Seeded queries render their data on the server\n * exactly as they do in the browser; unseeded ones behave as a route with no\n * `Query.prefetch` does, framework warning included.\n */\nexport const Page = (props: PropsWithChildren<PageProps>) => {\n const {\n children,\n pathname: routePath = \"/\",\n params = {},\n searchParams,\n hash = \"\",\n locale = \"en-US\",\n defaultLocale = locale,\n dictionaries = [],\n translations = {},\n queryData = {},\n queryConfig,\n user = null,\n breadcrumbs = [],\n features = {},\n theme,\n fallback = null,\n errorFallback,\n onNavigate,\n } = props;\n\n // The caller's list, in the caller's order — a language switcher maps over\n // it, so hoisting the page's own locale to the front would reorder the\n // rendered options. The defaults are appended, only to guarantee presence.\n const supportedLocales = useMemo(\n () =>\n Array.from(\n new Set([...(props.supportedLocales ?? []), defaultLocale, locale]),\n ),\n [props.supportedLocales, defaultLocale, locale],\n );\n const pathname = applyParams(routePath, params) || \"/\";\n const search = toSearchString(searchParams);\n // The URL's locale segment, which the default locale does not get.\n const urlLocaleSegment = locale === defaultLocale ? null : locale;\n\n const dictionary = useMemo(\n () =>\n toClientDictionary(dictionaries, supportedLocales, locale, translations),\n [dictionaries, supportedLocales, locale, translations],\n );\n\n // Keys that have already drawn a warning, so a re-render does not repeat it.\n const warnedRef = useRef<Set<string>>(new Set());\n const prefetchedData = useMemo(() => {\n const seeded = toPrefetchedData(queryData, params, warnedRef.current);\n // `useUser` reads `/auth/me` like any other query. Seeding it — with `null`\n // for the anonymous default — is what keeps a component test off the\n // network for a hook nothing in the test asked for.\n seeded[\"/auth/me\"] ??= { \"\": user ?? null };\n return seeded;\n }, [queryData, params, user]);\n\n // Keyed by `${view}:${pathname}` in the router's cache; the view names are\n // ours to choose here, and only their order reaches `useBreadcrumbs`.\n const { breadcrumbViews, breadcrumbsCache, breadcrumbsRecord } =\n useMemo(() => {\n const views = breadcrumbs.map((_, index) => `breadcrumb-${index}`);\n const cache = new Map<string, Breadcrumb>(\n breadcrumbs.map((breadcrumb, index) => [\n `${views[index]}:${pathname}`,\n breadcrumb,\n ]),\n );\n return {\n breadcrumbViews: views,\n breadcrumbsCache: cache,\n breadcrumbsRecord: Object.fromEntries(cache),\n };\n }, [breadcrumbs, pathname]);\n\n const [isNavigatingSubject] = useState(() => new Subject<boolean>(false));\n const [progressManager] = useState(\n () => new ProgressManager(isNavigatingSubject),\n );\n const [history] = useState(() =>\n createMemoryHistory({ initialEntries: [`${pathname}${search}${hash}`] }),\n );\n\n const routeState: RouteState & PageData = useMemo(\n () => ({\n views: [],\n params,\n search,\n state: {},\n pathname,\n hash,\n action: null,\n routePath,\n locale: urlLocaleSegment,\n data: {},\n i18n: { currentLocale: locale, dictionary, supportedLocales },\n prefetchedData,\n breadcrumbs: breadcrumbsRecord,\n features: features as Record<string, boolean>,\n appId: \"test\",\n }),\n [\n params,\n search,\n pathname,\n hash,\n routePath,\n urlLocaleSegment,\n locale,\n dictionary,\n supportedLocales,\n prefetchedData,\n breadcrumbsRecord,\n features,\n ],\n );\n\n const [routerSubject] = useState(() => new Subject<RouteState>(routeState));\n\n const onNavigateRef = useRef(onNavigate);\n onNavigateRef.current = onNavigate;\n // Subscribed during render, not in an effect, because React flushes child\n // effects before parent ones — and mount-time navigation is a real pattern:\n // `<Redirect>` pushes from its own mount effect, as does any auth guard. A\n // listener registered in `<Page>`'s effect is not there yet when those fire,\n // so `onNavigate` would silently miss exactly the redirects a test most\n // wants to assert. Ref-guarded, so React's double-invoke registers one.\n //\n // Nothing unsubscribes: this history is created per `<Page>` and reachable\n // from nowhere else, so it is collected with the page it belongs to.\n const listeningRef = useRef(false);\n if (!listeningRef.current) {\n listeningRef.current = true;\n history.listen(({ location, action }) => {\n const href = `${location.pathname}${location.search}${location.hash}`;\n onNavigateRef.current?.(\n href,\n action === Action.Replace ? \"replace\" : \"push\",\n );\n });\n }\n\n const serverData: ServerDataContextValue = useMemo(\n () => ({\n routeManifest: {},\n pageData: {},\n breadcrumbs: breadcrumbsRecord,\n prefetchedData,\n router: {\n pathname,\n params,\n currentPath: routePath,\n is404: false,\n searchParams: search,\n urlLocaleSegment,\n },\n i18n: {\n dictionary,\n currentLocale: locale,\n supportedLocales,\n defaultLocale,\n },\n componentTree: [],\n auth: { user: user as User },\n features: features as Record<string, boolean>,\n __csrf: \"test-csrf-token\",\n cssManifest: {},\n modulePreloadManifest: {},\n meta: {},\n appId: \"test\",\n }),\n [\n breadcrumbsRecord,\n prefetchedData,\n pathname,\n params,\n routePath,\n search,\n urlLocaleSegment,\n dictionary,\n locale,\n supportedLocales,\n defaultLocale,\n user,\n features,\n ],\n );\n\n // Everything the router hooks read, inert: nothing here fetches, preloads or\n // resolves a route, but every hook finds the shape it expects rather than an\n // empty context to crash on.\n const [viewEntriesSubject] = useState(() => new Subject<string[]>([]));\n const routerContext = useMemo(\n () => ({\n viewEntriesSubject,\n history,\n updatePageData: () => {},\n getPageData: () => ({}),\n getScrollPosition: () => 0,\n getViewPathsFromPathname: () => breadcrumbViews,\n getRoutePathnameFromHref: (href: string) => href,\n isNavigatingSubject,\n setNavigationAbortController: () => {},\n progressManager,\n fetchRouteCSS: async () => {},\n preloadRouteModules: () => {},\n prefetchRoute: async () => {},\n takePrefetched: () => null,\n clearPrefetchCache: () => {},\n breadcrumbsCache,\n routerSubject,\n urlLocaleSegment,\n }),\n [\n viewEntriesSubject,\n history,\n breadcrumbViews,\n isNavigatingSubject,\n progressManager,\n breadcrumbsCache,\n routerSubject,\n urlLocaleSegment,\n ],\n );\n\n const [websocket] = useState(() => ({\n subscribe: async () => {},\n unsubscribe: async () => {},\n broadcast: () => {},\n }));\n\n return (\n <ThemeProvider theme={theme}>\n <ServerDataContext.Provider value={serverData}>\n <I18nProvider>\n <WebSocketContext.Provider value={websocket}>\n <QueryManagerProvider queryConfig={queryConfig}>\n <ClientRouterContext.Provider value={routerContext}>\n <RouteTransitionProvider\n isPending={false}\n isFetching={false}\n transitionPath={[\"\", pathname]}\n >\n <RouteStateProvider state={routeState}>\n <Boundary\n errorFallback={errorFallback}\n fallback={fallback}\n resetKey={pathname}\n >\n {children}\n </Boundary>\n </RouteStateProvider>\n </RouteTransitionProvider>\n </ClientRouterContext.Provider>\n </QueryManagerProvider>\n </WebSocketContext.Provider>\n </I18nProvider>\n </ServerDataContext.Provider>\n </ThemeProvider>\n );\n};\n\n/**\n * The `Suspense` boundary every view renders inside, and — when the test\n * supplies a fallback for it — the error boundary too.\n *\n * `onReset={clearErrors}` is the part that has to be here rather than inline\n * above: it needs `QueryManagerContext`, and it is what makes a view's real\n * `Error` export testable. A fallback whose \"Try again\" calls\n * `resetErrorBoundary()` re-renders the child, and `useQuery` reads the\n * failure still stored on the `QueryResource` and throws it straight back —\n * so without this the fallback never goes away and the retry path that works\n * in the app cannot be exercised. `ClientRouter`'s own boundary wires exactly\n * this pair.\n */\nconst Boundary = (\n props: PropsWithChildren<{\n errorFallback?: ComponentType<FallbackProps>;\n fallback: ReactNode;\n resetKey: string;\n }>,\n) => {\n const { errorFallback: ErrorFallback, fallback, resetKey, children } = props;\n const { clearErrors } = useContext(QueryManagerContext);\n const content = <Suspense fallback={fallback}>{children}</Suspense>;\n\n if (!ErrorFallback) {\n return content;\n }\n\n return (\n <ErrorBoundary\n FallbackComponent={ErrorFallback}\n resetKeys={[resetKey]}\n onReset={clearErrors}\n >\n {content}\n </ErrorBoundary>\n );\n};\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gemi",
3
- "version": "0.57.0",
3
+ "version": "0.58.0",
4
4
  "private": false,
5
5
  "license": "MIT",
6
6
  "author": "Enes Tufekci <enes@gemijs.dev>",
@@ -1,4 +0,0 @@
1
- // @bun
2
- import{Be as s0,ye as hs}from"./chunk-qfzyym5h.js";import{_e as c0}from"./chunk-btr9kyqh.js";import{if as uT}from"./chunk-mqwrmbh4.js";class eT{static kind="controller";constructor(){}}class YP extends eT{}function RP(s){return typeof s==="function"&&s.prototype!==void 0}function Ic(s){if(!/^\d+$/.test(s))return null;let c=Number(s);return Number.isSafeInteger(c)?c:null}function si(s){if(!s)return null;let c=s.trim();if(!/^bytes=/i.test(c))return null;let T=c.slice(6).split(",").map((C)=>C.trim()).filter((C)=>C!=="");if(T.length!==1)return null;let a=T[0],f=a.indexOf("-");if(f===-1)return null;let P=a.slice(0,f),D=a.slice(f+1);if(P===""){let C=Ic(D);if(C===null)return null;return{kind:"suffix",suffixLength:C}}let O=Ic(P);if(O===null)return null;if(D==="")return{kind:"offset",start:O,end:null};let F=Ic(D);if(F===null||F<O)return null;return{kind:"offset",start:O,end:F}}function sa(s,c){if(!Number.isFinite(c)||c<=0)return null;let i,T;if(s.kind==="suffix"){if(s.suffixLength<=0)return null;i=Math.max(0,c-s.suffixLength),T=c-1}else{if(s.start>=c)return null;if(i=s.start,T=s.end===null?c-1:Math.min(s.end,c-1),T<i)return null}return{start:i,end:T,length:T-i+1}}function m0(s){if(s.kind==="suffix")return`bytes=-${s.suffixLength}`;return s.end===null?`bytes=${s.start}-`:`bytes=${s.start}-${s.end}`}function Z0(s){if(!s)return null;let c=/^bytes\s+(\d+)-(\d+)\/(\d+)$/i.exec(s.trim());if(!c)return null;let i=Ic(c[1]),T=Ic(c[2]),a=Ic(c[3]);if(i===null||T===null||a===null||T<i)return null;return{start:i,end:T,total:a}}function ca(s,c,i){return`bytes ${s}-${c}/${i}`}function ci(s){return`bytes */${s}`}var ZM="GEMI_REQUEST_BREAKER_ERROR";class N extends Error{kind="GEMI_REQUEST_BREAKER_ERROR";payload={api:{},view:{}}}class ii extends N{errors={};constructor(s){super("Validation error");this.name="ValidationError",this.errors=s,this.payload={api:{status:400,data:{error:{kind:"validation_error",messages:s}},headers:{"Content-Type":"application/json"}},view:{status:400}}}}class Lc{data;constructor(s){this.data=s}get(s){return this.data[s]}has(s){return this.data[s]!==void 0}toJSON(){return this.data}}function A0(s){let[c,i]=s.match(/\d+|\D+/g)??[];if(!c||!i)return 0;let T=Number.parseInt(c);switch(i){case"B":return T;case"KB":return T*1024;case"MB":return T*1024*1024;case"GB":return T*1024*1024*1024;case"TB":return T*1024*1024*1024*1024;default:return 0}}function w0(s){switch(s){case"image":return"image";case"png":return"image/png";case"jpg":return"image/jpeg";case"jpeg":return"image/jpeg";case"ttf":return"font/ttf";case"excel":return"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";case"csv":return"text/csv";case"word":return"application/vnd.openxmlformats-officedocument.wordprocessingml.document";case"pdf":return"application/pdf";case"json":return"application/json";default:return s}}function j0(s){let[c,i]=s.split(":");switch(c){case"required":return(T)=>{if(T instanceof Blob)return T.size>0;return T!==null&&T!==void 0&&T?.length>0};case"password":return(T)=>{return/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^a-zA-Z0-9]).{8,}$/.test(T)};case"number":return(T)=>{if(typeof T!=="number")return!1;return!Number.isNaN(T)};case"min":return(T)=>{return T?.length>=Number.parseInt(i)};case"max":return(T)=>{return T?.length<=Number.parseInt(i)};case"email":return(T)=>{return/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(T)};case"file":return(T)=>{return T instanceof Blob};case"fileType":return(T)=>{if(T instanceof Blob){let a=w0(i);return T.type.startsWith(a)}};case"fileSize":return(T)=>{if(T instanceof Blob){let a=A0(i);return T.size<=a}};default:return()=>!0}}class Us{kind;rawRequest;headers;cookies;search;schema={};routePath;params;constructor(s,c,i,T){if(!s){let F=hs.getStore().req;this.params=F.params,this.rawRequest=F.rawRequest,this.kind=F.kind,this.routePath=F.routePath}else this.params=c,this.rawRequest=s,this.routePath=T,this.kind=i??"api";this.headers=this.rawRequest.headers;let a=this.rawRequest.headers.get("Cookie"),f=new Map;if(a){let F=a.split(";");for(let C of F){let[S,d]=C.split("=");f.set(S.trim(),d.trim())}}let P=new URL(this.rawRequest.url),D=new Map;for(let[F,C]of P.searchParams)if(D.has(F)){let S=D.get(F);if(Array.isArray(S))S.push(C),D.set(F,S);else D.set(F,[S,C])}else D.set(F,C);let O=Object.fromEntries(D.entries());this.search=new Lc(O),this.cookies=f}locale(){return hs.getStore().locale}ctx(){return hs.getStore()}range(){return si(this.rawRequest.headers.get("Range"))}refine(s){return{}}async parseBody(){let s=new Lc({});if(this.rawRequest.headers.get("Content-Type")==="application/json"){let c=await this.rawRequest.json();s=new Lc(c)}if(this.rawRequest.headers.get("Content-Type")==="application/x-www-form-urlencoded"){let c=await this.rawRequest.formData();s=new Lc(c)}if(this.rawRequest.headers.get("Content-Type")?.startsWith("multipart/form-data")){let c=await this.rawRequest.formData(),i=new Map;for(let[T,a]of c.entries())if(i.has(T)){let f=i.get(T);if(Array.isArray(f))f.push(a),i.set(T,f);else i.set(T,[f,a])}else i.set(T,a);s=new Lc(Object.fromEntries(i.entries()))}return s}validateInput(s){let c={};for(let[i,T]of Object.entries(this.schema))for(let[a,f]of Object.entries(T)){let P=j0(a),D=f,O=!1;if(typeof f==="function")D=f(s.get(i)),O=typeof D>"u";else O=P(s.get(i));if(O)continue;if(!s.get(i)&&!Object.keys(T).includes("required"))continue;if(!c[i])c[i]=[];if(a==="required"){c[i]=[String(D)];continue}c[i].push(String(D))}for(let[i,T]of Object.entries(this.refine(s.toJSON())??{})){if(!c[i])c[i]=[];c[i]=[...c[i]??[],T]}if(Object.keys(c).length>0)throw new ii(c);return s}async input(){return this.validateInput(await this.parseBody())}async safeInput(){let s=await this.parseBody();try{return this.validateInput(s),{isValid:!0,errors:{},input:s}}catch(c){if(!(c instanceof ii))throw c;return{isValid:!1,errors:c.errors,input:s}}}}function Yi(s,c){let i=c?"attachment":"inline",T=s.replace(/["\\]/g,"").replace(/[^\x20-\x7e]/g,"_");return`${i}; filename="${T}"; filename*=UTF-8''${encodeURIComponent(s)}`}function x0(s){return"total"in s&&"partial"in s&&"body"in s}function Ti(s){return new Response(null,{status:416,headers:{"Accept-Ranges":"bytes","Content-Range":ci(s),"Content-Length":"0","Cache-Control":"no-store"}})}async function E0(s){if(s instanceof Blob)return{body:s,start:0,end:s.size-1,total:s.size,partial:!1,type:s.type,name:s.name,download:!1,status:200,extraHeaders:{}};if(x0(s))return{body:s.body,start:s.start,end:s.end,total:s.total,partial:s.partial,type:s.type,name:s.name,download:!1,etag:s.etag,lastModified:s.lastModified,status:200,extraHeaders:{}};let c=s.file,i=c instanceof Blob?c:null,T=s.total??i?.size??-1;return{body:c,start:s.start??0,end:s.end??T-1,total:T,partial:s.partial??!1,type:s.type??i?.type??"",name:s.name??c?.name,download:s.download??!1,etag:s.etag,lastModified:s.lastModified,status:s.status??200,extraHeaders:s.headers??{}}}async function ia(s,c){if(s instanceof Response)return s;if(!s)return new Response("Not found",{status:404});let i=await E0(s),{body:T,start:a,end:f,total:P,partial:D}=i;if(T instanceof Blob&&"exists"in T&&typeof T.exists==="function"){if(!await T.exists())return new Response("Not found",{status:404})}let{range:O}=c;if(O){if(P<=0)return Ti(Math.max(P,0));if(!D){if(T instanceof Blob){let d=sa(O,P);if(!d)return Ti(P);T=T.slice(d.start,d.end+1),a=d.start,f=d.end,D=!0}}}let F=Boolean(O)&&D,C=F?206:i.status,S=new Headers;if(S.set("Accept-Ranges","bytes"),S.set("Content-Type",i.type||"application/octet-stream"),F)S.set("Content-Range",ca(a,f,P)),S.set("Content-Length",String(f-a+1));else if(P>=0)S.set("Content-Length",String(P));if(i.name)S.set("Content-Disposition",Yi(i.name,i.download));if(i.etag)S.set("ETag",i.etag);if(i.lastModified)S.set("Last-Modified",i.lastModified.toUTCString());for(let[d,M]of Object.entries(i.extraHeaders))S.set(d,M);if((c.method??"GET").toUpperCase()==="HEAD"){if(T&&"cancel"in T&&typeof T.cancel==="function")await T.cancel();return new Response(null,{status:C,headers:S})}return new Response(T,{status:C,headers:S})}class _P extends N{error;constructor(s="Not authorized"){super("Authentication error");this.name="AuthenticationError",this.error=s,this.payload={api:{status:401,data:{error:this.error}},view:{}}}}class BP extends N{error;constructor(s="Insufficient permissions"){super("Authentication error");this.name="AuthenticationError",this.error=s,this.payload={api:{status:401,data:{error:this.error}},view:{}}}}class Ri extends N{total;constructor(s){super("Range not satisfiable");this.total=s;this.name="RangeNotSatisfiableError",this.payload={api:{status:416,data:{error:{message:"Range not satisfiable"}},headers:{"Content-Range":ci(s),"Accept-Ranges":"bytes","Cache-Control":"no-store"}},view:{}}}}class zP extends N{fileName;constructor(s){super("File not found");this.fileName=s;this.name="FileNotFoundError",this.payload={api:{status:404,data:{error:{message:"Not found"}},headers:{"Cache-Control":"no-store"}},view:{}}}}class ai extends N{constructor(){super("Authentication error");this.name="AuthenticationError"}payload={api:{status:401,data:{error:"Authentication error"}},view:{status:302,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:"/auth/sign-in"}}}}function b0(s){return RP(s)}class Ds{method;handler;methodName;__internal_brand="RouteHandler";middlewares=[];constructor(s,c,i){this.method=s;this.handler=c;this.methodName=i;this.handler=c,this.methodName=i,this.method=s}__internal_use(){return{run:this.run.bind(this),middlewares:this.middlewares}}run(s){if(b0(this.handler)){let c=new this.handler;return c[this.methodName].bind(c)()}return this.handler()}middleware(s){return this.middlewares=s,this}}class HP{url;headers;__internal_brand="ProxyHandler";constructor(s,c){this.url=s;this.headers=c}run(){let s=new Us;return fetch(this.url,{method:s.rawRequest.method,headers:{...s.headers.toJSON(),...this.headers},body:s.rawRequest.body})}}class NP{constructor(...s){return new Ds(...s)}}class pP extends Ds{__internal_brand="StreamHandler";async run(s){let c=hs.getStore(),i=c?.req?.rawRequest,T=si(i?.headers.get("Range"));if(c)c.rangeRequest=T;try{let a=await super.run(s);return await ia(a,{range:T,method:i?.method})}catch(a){if(a instanceof Ri)return Ti(a.total);throw a}finally{if(c)c.rangeRequest=null}}}class VP{constructor(...s){return new pP(...s)}}class hP{__internal_brand="ResourceRoutes";first;second;constructor(s){this.first={get:new Ds("GET",s,"list"),post:new Ds("POST",s,"store")},this.second={get:new Ds("GET",s,"show"),put:new Ds("PUT",s,"update"),delete:new Ds("DELETE",s,"delete")}}middleware(s){if(s.list)this.first.get.middleware(s.list);if(s.store)this.first.post.middleware(s.store);if(s.show)this.second.get.middleware(s.show);if(s.update)this.second.put.middleware(s.update);if(s.delete)this.second.delete.middleware(s.delete);return this}}class kP{static __brand="ApiRouter";routes={};middlewares=[];middleware(s){}get(s,c){return new Ds("GET",s,c)}post(s,c){return new Ds("POST",s,c)}put(s,c){return new Ds("PUT",s,c)}patch(s,c){return new Ds("PATCH",s,c)}delete(s,c){return new Ds("DELETE",s,c)}resource(s){return new hP(s)}file(s,c){return new NP("GET",s,c)}stream(s,c){return new VP("GET",s,c)}proxy(s,c={}){return new HP(s,c)}}function vP(s,c){return s.replace(/:([^/]+[*?]?)/g,(i,T)=>{let a=T.endsWith("?")||T.endsWith("*"),f=a?T.slice(0,-1):T,P=c[f];if(P===void 0){if(a)return"";if(import.meta.env.DEV)throw Error(`Missing parameter: ${f}`);console.error(`Missing parameter: ${f} in URL: ${s}`)}return String(P)}).replace(/\/\//g,"/").replace(/\/$/,"")}class Ta extends N{constructor(s,c=307){super("Redirect error");this.name="RedirectError",this.payload={api:{status:200,data:{},directive:{kind:"Redirect",path:s}},view:{status:c,headers:{"Cache-Control":"private, no-cache, no-store, max-age=0, must-revalidate",Location:s}}}}}class aa{static to(s,...c){let[i={}]=c,{search:T={},params:a={},permanent:f,status:P}={params:{},status:307,permanent:!1,...i},D=new URLSearchParams(T).toString();throw new Ta([vP(s,a),D.toString()].filter(Boolean).join("?"),P??(f?301:307))}static external(s,c=307){throw new Ta(s,c)}}class oP{kind="redirect";viewPath="REDIRECT";middlewares=[];handler;constructor(s){if(!s)this.handler=()=>({});else if(typeof s==="function")this.handler=s;else{let[c,i]=s;this.handler=(T)=>{return new c()[i](T)}}}async run(s,c){let{destination:i,permanent:T=!1,status:a=307}=await this.handler(s);if(!i)throw Error(`Redirect destination is required see ${c}`);return aa.to(i,{permanent:T,status:a}),{}}middleware(s){return this.middlewares=s,this}}async function g0(s,c){if(s instanceof Response)return s;let i=s instanceof Blob,T=i?s:s.file,a=i?s.name:s.name??s.file?.name,f=(i?s.type:s.type??s.file?.type)||"",P=i?!1:s.download??!1,D=i?200:s.status??200;if(!i)for(let[O,F]of Object.entries(s.headers??{}))c.set(O,F);if(T instanceof Blob&&"exists"in T&&typeof T.exists==="function"){if(!await T.exists())return new Response("Not found",{status:404})}if(c.set("Content-Type",f||"application/octet-stream"),T instanceof Blob)c.set("Content-Length",String(T.size));if(a)c.set("Content-Disposition",Yi(a,P));return new Response(T instanceof Blob?T.stream():T,{status:D,headers:c})}class tP{kind="file";viewPath="FILE";middlewares=[];handler;constructor(s){if(!s)this.handler=()=>null;else if(typeof s==="function")this.handler=s;else{let[c,i]=s;this.handler=(T)=>{return new c()[i](T)}}}async run(s,c){let i=await this.handler(s);if(!i)throw Error(`File route handler must return a file see ${c}`);return{FILE:i}}middleware(s){return this.middlewares=s,this}}class rP{viewPath;middlewares=[];handler;constructor(s,c){this.viewPath=s;if(!c)this.handler=()=>({});else if(typeof c==="function")this.handler=c;else{let[i,T]=c;this.handler=(a)=>{return new i()[T](a)}}}async run(s,c){let i=await this.handler(s);return{[this.viewPath]:{...i,breadcrumb:{label:i?.breadcrumb??"",href:c}}}}middleware(s){return this.middlewares=s,this}}class uP{viewPath;children;middlewares=[];alwaysRuns=!1;handler=()=>({});constructor(s,c,i){this.viewPath=s;if(typeof c==="function")this.handler=c,this.children=class extends fi{routes=i??{}};else if(Array.isArray(c)){let[T,a]=c;this.handler=(f)=>{return new T()[a](f)},this.children=class extends fi{routes=i??{}}}else this.children=class extends fi{routes=c},this.handler=()=>({})}async run(s,c){let i=await this.handler(s);return{[this.viewPath]:{...i,breadcrumb:{label:i?.breadcrumb??"",href:c}}}}alwaysRun(){return this.alwaysRuns=!0,this}middleware(s){return this.middlewares=s,this}}class fi{middlewares=[];routes={};view(s,c){return new rP(s,c)}file(s){return new tP(s)}redirect(s){return new oP(s)}layout(s,c,i){return new uP(s,c,i)}}class ms{req;config={};constructor(s){this.req=s}run(...s){return{}}static configure(s){let c=this;return class extends c{config=s}}}function y0(s){let c=s.headers.get("cookie");if(!c)return new Map;let i=new Map,T=c.split(";");for(let a of T){let[f,P]=a.split("=");i.set(f.trim(),P)}return i}function W0(s){return s}function G0(){return{aliases:{}}}import{randomBytes as FM}from"crypto";function Os(s,c,i,T,a){return js(c,MD(s,c),i,T,a)}function js(s,c,i,T,a,f){let P=Fa(c,i,T);if(a&&c!==P)throw RangeError(rF(s,c,i,T,f));return P}function MD(s,c){let i=s[c];if(i===void 0)throw TypeError(Bf(c));return i}function V(s){return s!==null&&/object|function/.test(typeof s)}function Ss(s,c=Map){let i=new c;return(T,...a)=>{if(i.has(T))return i.get(T);let f=s(T,...a);return i.set(T,f),f}}function wa(s){return dc({name:s},1)}function dc(s,c){return gs((i)=>({value:i,configurable:1,writable:!c}),s)}function mD(s){return gs((c)=>({get:c,configurable:1}),s)}function ei(s){return{[Symbol.toStringTag]:{value:s,configurable:1}}}function Xc(s,c){let i={},T=s.length;for(let a of c)i[s[--T]]=a;return i}function gs(s,c,i){let T={};for(let a in c)T[a]=s(c[a],a,i);return T}function mi(s,c,i){let T={};for(let a=0;a<c.length;a++){let f=c[a];T[f]=s(f,a,i)}return T}function I0(s,c,i){let T={};for(let a=0;a<s.length;a++)T[c[a]]=i[s[a]];return T}function Ms(s,c){let i={};for(let T of s)i[T]=c[T];return i}function ja(s,c){let i={};for(let T in c)s.has(T)||(i[T]=c[T]);return i}function xa(s){s={...s};let c=Object.keys(s);for(let i of c)s[i]===void 0&&delete s[i];return s}function ZD(s,c){for(let i of c)if(!(i in s))return 0;return 1}function AD(s,c,i){for(let T of s)if(c[T]!==i[T])return 0;return 1}function wD(s,c,i){let T={...i};for(let a=0;a<c;a++)T[s[a]]=0;return T}function E(s,...c){return(...i)=>s(...c,...i)}function nP(s){return s[0].toUpperCase()+s.substring(1)}function Zi(s){return s.slice().sort()}function Vi(s,c){return String(c).padStart(s,"0")}function ks(s,c){return Math.sign(s-c)}function Fa(s,c,i){return Math.min(Math.max(s,c),i)}function Rs(s,c){return[Math.floor(s/c),Di(s,c)]}function Di(s,c){return(s%c+c)%c}function ts(s,c){return[sT(s,c),Ea(s,c)]}function sT(s,c){return Math.trunc(s/c)||0}function Ea(s,c){return s%c||0}function _i(s){return Math.abs(s%1)===0.5}function jD(s,c,i){let T=0,a=0;for(let D=0;D<=c;D++){let O=s[i[D]],F=Js[D],C=W/F,[S,d]=ts(O,C);T+=d*F,a+=S}let[f,P]=ts(T,W);return[a+f,P]}function cT(s,c,i){let T={};for(let a=c;a>=0;a--){let f=Js[a];T[i[a]]=sT(s,f),s=Ea(s,f)}return T}function xD(s){return s===b?UT:[]}function ED(s){return s===b?Gi:[]}function bD(s){return s===b?["year","day"]:[]}function gD(s){if(s!==void 0)return $(s)}function yD(s){if(s!==void 0)return ys(s)}function ba(s){if(s!==void 0)return Ai(s)}function ys(s){return ID(Ai(s))}function Ai(s){return GD(wS(s))}function ga(s){if(s==null)throw TypeError("Cannot be null or undefined");return s}function WD(s,c){if(c==null)throw RangeError(Bf(s));return c}function Bs(s){if(!V(s))throw TypeError(tF);return s}function iT(s,c,i=s){if(typeof c!==s)throw TypeError(gi(i,c));return c}function GD(s,c="number"){if(!Number.isInteger(s))throw RangeError(N0(c,s));return s||0}function ID(s,c="number"){if(s<=0)throw RangeError(p0(c,s));return s}function ya(s){if(typeof s=="symbol")throw TypeError(v0);return String(s)}function hi(s,c){return V(s)?String(s):$(s,c)}function TT(s){if(typeof s=="string")return BigInt(s);if(typeof s!="bigint")throw TypeError(k0(s));return s}function LD(s,c="number"){if(typeof s=="bigint")throw TypeError(h0(c));if(s=Number(s),!Number.isFinite(s))throw RangeError(V0(c,s));return s}function e(s,c){return Math.trunc(LD(s,c))||0}function qD(s,c){return GD(LD(s,c),c)}function eP(s,c){return ID(e(s,c),c)}function Wa(s,c){let[i,T]=ts(c,W),a=s+i,f=Math.sign(a);return f&&f===-Math.sign(T)&&(a-=f,T+=f*W),[a,T]}function Jc(s,c,i=1){return Wa(s[0]+c[0]*i,s[1]+c[1]*i)}function Kc(s,c){return Wa(s[0],s[1]+c)}function Zs(s,c){return Jc(c,s,-1)}function cs(s,c){return ks(s[0],c[0])||ks(s[1],c[1])}function JD(s,c,i){return cs(s,c)===-1||cs(s,i)===1}function aT(s,c=1){let i=BigInt(W/c);return[Number(s/i),Number(s%i)*c]}function lc(s,c=1){let i=W/c,[T,a]=ts(s,i);return[T,a*c]}function KD(s,c=1){let[i,T]=s,a=Math.floor(T/c),f=W/c;return BigInt(i)*BigInt(f)+BigInt(a)}function As(s,c=1,i){let[T,a]=s,[f,P]=ts(a,c);return T*(W/c)+(f+(i?P/c:0))}function Ga(s,c,i=Rs){let[T,a]=s,[f,P]=i(a,c);return[T*(W/c)+f,P]}function Ia(s,c){let i=s.formatToParts(c),T={};for(let a of i)T[a.type]=a.value;return T}function La(s){return Os(s,"isoYear",Mi,di,1),s.isoYear===Mi?Os(s,"isoMonth",4,12,1):s.isoYear===di&&Os(s,"isoMonth",1,9,1),s}function vs(s){return zs({...s,...bs,isoHour:12}),s}function zs(s){let c=Os(s,"isoYear",Mi,di,1),i=c===Mi?1:c===di?-1:0;return i&&ws(ss({...s,isoDay:s.isoDay+i,isoNanosecond:s.isoNanosecond-i})),s}function ws(s){if(!s||JD(s,WS,yS))throw RangeError(lT);return s}function rs(s){return jD(s,5,Ls)[1]}function fT(s){let[c,i]=Rs(s,W);return[cT(i,5,Ls),c]}function lD(s){return $D(s)[0]}function $D(s){return Ga(s,Es)}function is(s){return Uc(s.isoYear,s.isoMonth,s.isoDay,s.isoHour,s.isoMinute,s.isoSecond,s.isoMillisecond)}function ss(s){let c=is(s);if(c!==void 0){let[i,T]=ts(c,Cs);return[i,T*Ks+(s.isoMicrosecond||0)*bc+(s.isoNanosecond||0)]}}function qa(s,c){let[i,T]=fT(rs(s)-c);return ws(ss({...s,isoDay:s.isoDay+T,...i}))}function ki(...s){return Uc(...s)/DC}function Uc(...s){let[c,i]=QD(...s),T=c.valueOf();if(!isNaN(T))return T-i*Cs}function QD(s,c=1,i=1,T=0,a=0,f=0,P=0){let D=s===Mi?1:s===di?-1:0,O=new Date;return O.setUTCHours(T,a,f,P),O.setUTCFullYear(s,c-1,i+D),[O,D]}function ns(s,c){let[i,T]=Kc(s,c);T<0&&(T+=W,i-=1);let[a,f]=Rs(T,Ks),[P,D]=Rs(f,bc);return PT(i*Cs+a,P,D)}function PT(s,c=0,i=0){let T=Math.ceil(Math.max(0,Math.abs(s)-gS)/Cs)*Math.sign(s),a=new Date(s-T*Cs);return Xc(RT,[a.getUTCFullYear(),a.getUTCMonth()+1,a.getUTCDate()+T,a.getUTCHours(),a.getUTCMinutes(),a.getUTCSeconds(),a.getUTCMilliseconds(),c,i])}function XD(s){return[s.isoYear,s.isoMonth,s.isoDay]}function UD(){return Ys}function Ja(s,c){switch(c){case 2:return Ka(s)?29:28;case 4:case 6:case 9:case 11:return 30}return 31}function YD(s){return Ka(s)?366:365}function Ka(s){return s%4==0&&(s%100!=0||s%400==0)}function RD(s){let[c,i]=QD(s.isoYear,s.isoMonth,s.isoDay);return Di(c.getUTCDay()-i,7)||7}function _D({isoYear:s}){return s<1?["bce",1-s]:["ce",s]}function L0(s){let c=is(s);if(c<IS)return _D(s);let i=Ia(TP($c),c),{era:T,eraYear:a}=tO(i,$c);return[T,a]}function DT(s){return Mc(s),OT(s,1),s}function Mc(s){return BD(s,1),s}function sD(s){return AD(tf,s,BD(s))}function BD(s,c){let{isoYear:i}=s,T=Os(s,"isoMonth",1,UD(),c);return{isoYear:i,isoMonth:T,isoDay:Os(s,"isoDay",1,Ja(i,T),c)}}function OT(s,c){return Xc(Ls,[Os(s,"isoHour",0,23,c),Os(s,"isoMinute",0,59,c),Os(s,"isoSecond",0,59,c),Os(s,"isoMillisecond",0,999,c),Os(s,"isoMicrosecond",0,999,c),Os(s,"isoNanosecond",0,999,c)])}function g(s){return s===void 0?0:WC(Bs(s))}function wi(s,c=0){s=Ws(s);let i=GC(s),T=YS(s,c);return[WC(s),T,i]}function la(s){return GC(Ws(s))}function zD(s){return s=Ws(s),nf(s,9,6,1)}function Yc(s,c,i,T=9,a=0,f=4){c=Ws(c);let P=nf(c,T,a),D=Xa(c),O=Li(c,f),F=Ii(c,T,a,1);return P==null?P=Math.max(i,F):VD(P,F),D=Ua(D,F,1),s&&(O=((C)=>C<4?(C+2)%4:C)(O)),[P,F,D,O]}function FT(s,c=6,i){let T=Xa(s=Ya(s,ni)),a=Li(s,7),f=Ii(s,c);return f=WD(ni,f),T=Ua(T,f,void 0,i),[f,T,a]}function $a(s){return ef(Ws(s))}function HD(s,c){return Qa(Ws(s),c)}function Qa(s,c=4){let i=pD(s);return[Li(s,4),...ND(Ii(s,c),i)]}function ND(s,c){return s!=null?[Js[s],s<4?9-3*s:-1]:[c===void 0?1:10**(9-c),c]}function Xa(s){let c=s[Oi];return c===void 0?1:e(c,Oi)}function Ua(s,c,i,T){let a=T?W:Js[c+1];if(a){let f=Js[c];if(a%((s=js(Oi,s,1,a/f-(T?0:1),1))*f))throw RangeError(gi(Oi,s))}else s=js(Oi,s,1,i?1e9:1,1);return s}function pD(s){let c=s[Oa];if(c!==void 0){if(typeof c!="number"){if(ya(c)==="auto")return;throw RangeError(gi(Oa,c))}c=js(Oa,Math.floor(c),0,9,1)}return c}function Ws(s){return s===void 0?{}:Bs(s)}function Ya(s,c){return typeof s=="string"?{[c]:s}:Bs(s)}function Y(s){if(s!==void 0){if(V(s))return Object.assign(Object.create(null),s);throw TypeError(tF)}}function CT(s,c){return s&&Object.assign(Object.create(null),s,{overflow:qS[c]})}function Ra(s,c,i=9,T=0,a){let f=c[s];if(f===void 0)return a?T:void 0;if(f=ya(f),f==="auto")return a?T:null;let P=Ma[f];if(P===void 0&&(P=ES[f]),P===void 0)throw RangeError(eF(s,f,Ma));return js(s,P,T,i,1,Wi),P}function mc(s,c,i,T=0){let a=i[s];if(a===void 0)return T;let f=ya(a),P=c[f];if(P===void 0)throw RangeError(eF(s,f,c));return P}function VD(s,c){if(c>s)throw RangeError(dS)}function h(s){return{branding:BT,epochNanoseconds:s}}function t(s,c,i){return{branding:Vs,calendar:i,timeZone:c,epochNanoseconds:s}}function R(s,c=s.calendar){return{branding:yc,calendar:c,...Ms(EC,s)}}function _(s,c=s.calendar){return{branding:gc,calendar:c,...Ms(rf,s)}}function Cc(s,c=s.calendar){return{branding:Vc,calendar:c,...Ms(rf,s)}}function vi(s,c=s.calendar){return{branding:hc,calendar:c,...Ms(rf,s)}}function Gs(s){return{branding:_T,...Ms(xC,s)}}function J(s){return{branding:zT,sign:es(s),...Ms(kf,s)}}function hD(s){return lD(s.epochNanoseconds)}function ST(s){return Ga(s.epochNanoseconds,Ks)[0]}function kD(s){return KD(s.epochNanoseconds,bc)}function vD(s){return KD(s.epochNanoseconds)}function oD(s){return s.epochNanoseconds}function v(s){return typeof s=="string"?s:$(s.id)}function Rc(s,c){return s===c||v(s)===v(c)}function tD(s,c,i,T,a){let f=Sc(T),[P,D]=((A,j)=>{let w=j((A=Ya(A,Aa))[gC]),x=US(A);return x=WD(Aa,x),[x,w]})(a,s);if(Ci(Math.max(P,f),D))return cD(T,P);if(!D)throw RangeError($T);let[O,F,C]=wT(c,i,D),S=Of(C),d=jT(C),M=Ff(C),m=d(F,O,T),Z=M(F,O,m,P);return Ci(P,D)?cD(Z,P):((A,j,w,x,U,K,q)=>{let l=es(A),[k,H]=_a(x,of(w,A),w,l,U,K,q),nc=Ba(j,k,H);return A[y[w]]+nc*l})(Z,S(m),P,F,O,S,d)}function cD(s,c){return As(p(s),Js[c],1)}function _a(s,c,i,T,a,f,P){let D=y[i],O={...c,[D]:c[D]+T},F=P(s,a,c),C=P(s,a,O);return[f(F),f(C)]}function Ba(s,c,i){let T=As(Zs(c,i));if(!T)throw RangeError(yi);return As(Zs(c,s))/T}function rD(s,c){let[i,T,a]=FT(c,5,1);return h(MT(s.epochNanoseconds,i,T,a,1))}function uD(s,c,i){let{epochNanoseconds:T,timeZone:a,calendar:f}=c,[P,D,O]=FT(i);if(P===0&&D===1)return c;let F=s(a);if(P===6)T=((C,S,d,M)=>{let m=Ts(d,S),[Z,A]=C(m),j=d.epochNanoseconds,w=ds(S,Z),x=ds(S,A);if(JD(j,w,x))throw RangeError(yi);return PO(Ba(j,w,x),M)?x:w})(aO,F,c,O);else{let C=F.getOffsetNanosecondsFor(T);T=Ac(F,iO(ns(T,C),P,D,O),C,2,0,1)}return t(T,a,f)}function nD(s,c){return R(iO(s,...FT(c)),s.calendar)}function eD(s,c){let[i,T,a]=FT(c,5);var f;return Gs((f=a,za(s,ji(i,T),f)[0]))}function sO(s,c){let i=s(c.timeZone),T=Ts(c,i),[a,f]=aO(T),P=As(Zs(ds(i,a),ds(i,f)),XT,1);if(P<=0)throw RangeError(yi);return P}function cO(s,c){let{timeZone:i,calendar:T}=c,a=((f,P,D)=>ds(P,f(Ts(D,P))))(fO,s(i),c);return t(a,i,T)}function iO(s,c,i,T){return TO(s,ji(c,i),T)}function TO(s,c,i){let[T,a]=za(s,c,i);return zs({...wc(s,a),...T})}function za(s,c,i){return fT(us(rs(s),c,i))}function oi(s){return us(s,QT,7)}function ji(s,c){return Js[s]*c}function aO(s){let c=fO(s);return[c,wc(c,1)]}function fO(s){return bS(6,s)}function q0(s,c,i){let T=Math.min(Sc(s),6);return Bc(mT(p(s,T),c,i),T)}function dT(s,c,i,T,a,f,P,D,O,F){if(T===0&&a===1)return s;let C=Ci(T,D)?xT(D)&&T<6&&i>=6?K0:J0:l0,[S,d,M]=C(s,c,i,T,a,f,P,D,O,F);return M&&T!==7&&(S=((m,Z,A,j,w,x,U,K)=>{let q=es(m);for(let l=j+1;l<=A;l++){if(l===7&&A!==7)continue;let k=of(l,m);k[y[l]]+=q;let H=As(Zs(U(K(w,x,k)),Z));if(H&&Math.sign(H)!==q)break;m=k}return m})(S,d,i,Math.max(6,T),P,D,O,F)),S}function MT(s,c,i,T,a){if(c===6){let f=((P)=>P[0]+P[1]/W)(s);return[us(f,i,T),0]}return mT(s,ji(c,i),T,a)}function mT(s,c,i,T){let[a,f]=s;T&&f<0&&(f+=W,a-=1);let[P,D]=Rs(us(f,c,i),W);return Wa(a+P,D)}function us(s,c,i){return PO(s/c,i)*c}function PO(s,c){return BS[c](s)}function J0(s,c,i,T,a,f){let P=es(s),D=p(s),O=MT(D,T,a,f),F=Zs(D,O),C=Math.sign(O[0]-D[0])===P,S=Bc(O,Math.min(i,6));return[{...s,...S},Jc(c,F),C]}function K0(s,c,i,T,a,f,P,D,O,F){let C=es(s),S=As(p(s,5)),d=ji(T,a),M=us(S,d,f),[m,Z]=_a(P,{...s,...vf},6,C,D,O,F),A=M-As(Zs(m,Z)),j=0;A&&Math.sign(A)!==C?c=Kc(m,M):(j+=C,M=us(A,d,f),c=Kc(Z,M));let w=bT(M);return[{...s,...w,days:s.days+j},c,Boolean(j)]}function l0(s,c,i,T,a,f,P,D,O,F){let C=es(s),S=y[T],d=of(T,s);T===7&&(s={...s,weeks:s.weeks+Math.trunc(s.days/7)});let M=sT(s[S],a)*a;d[S]=M;let[m,Z]=_a(P,d,T,a*C,D,O,F),A=M+Ba(c,m,Z)*C*a,j=us(A,a,f),w=Math.sign(j-A)===C;return d[S]=j,[d,w?Z:m,w]}function Ha(s,c,i,T){let[a,f,P,D]=((F)=>{let C=Qa(F=Ws(F));return[F.timeZone,...C]})(T),O=a!==void 0;return((F,C,S,d,M,m)=>{S=mT(S,M,d,1);let Z=C.getOffsetNanosecondsFor(S);return oa(ns(S,Z),m)+(F?Zc(oi(Z)):"Z")})(O,c(O?s(a):Wc),i.epochNanoseconds,f,P,D)}function Na(s,c,i){let[T,a,f,P,D,O]=((F)=>{F=Ws(F);let C=ef(F),S=pD(F),d=_S(F),M=Li(F,4),m=Ii(F,4);return[C,RS(F),d,M,...ND(m,S)]})(i);return((F,C,S,d,M,m,Z,A,j,w)=>{d=mT(d,j,A,1);let x=F(S).getOffsetNanosecondsFor(d);return oa(ns(d,x),w)+Zc(oi(x),Z)+((U,K)=>K!==1?"["+(K===2?"!":"")+v(U)+"]":"")(S,m)+ta(C,M)})(s,c.calendar,c.timeZone,c.epochNanoseconds,T,a,f,P,D,O)}function pa(s,c){let[i,T,a,f]=((F)=>(F=Ws(F),[ef(F),...Qa(F)]))(c);return P=s.calendar,D=i,O=f,oa(TO(s,a,T),O)+ta(P,D);var P,D,O}function Va(s,c){return i=s.calendar,T=s,a=$a(c),ti(T)+ta(i,a);var i,T,a}function ha(s,c){return DO(s.calendar,OO,s,$a(c))}function ka(s,c){return DO(s.calendar,$0,s,$a(c))}function va(s,c){let[i,T,a]=HD(c);return f=a,FO(za(s,T,i)[0],f);var f}function ZT(s,c){let[i,T,a]=HD(c,3);return T>1&&(s={...s,...q0(s,T,i)}),((f,P)=>{let{sign:D}=f,O=D===-1?as(f):f,{hours:F,minutes:C}=O,[S,d]=Ga(p(O,3),Es,ts);wO(S);let M=ra(d,P),m=P>=0||!D||M;return(D<0?"-":"")+"P"+iD({Y:Fc(O.years),M:Fc(O.months),W:Fc(O.weeks),D:Fc(O.days)})+(F||C||S||m?"T"+iD({H:Fc(F),M:Fc(C),S:Fc(S,m)+M}):"")})(s,a)}function DO(s,c,i,T){let a=v(s),f=T>1||T===0&&a!==b;return T===1?a===b?c(i):ti(i):f?ti(i)+CO(a,T===2):c(i)}function iD(s){let c=[];for(let i in s){let T=s[i];T&&c.push(T,i)}return c.join("")}function oa(s,c){return ti(s)+"T"+FO(s,c)}function ti(s){return OO(s)+"-"+xs(s.isoDay)}function OO(s){let{isoYear:c}=s;return(c<0||c>9999?SO(c)+Vi(6,Math.abs(c)):Vi(4,c))+"-"+xs(s.isoMonth)}function $0(s){return xs(s.isoMonth)+"-"+xs(s.isoDay)}function FO(s,c){let i=[xs(s.isoHour),xs(s.isoMinute)];return c!==-1&&i.push(xs(s.isoSecond)+((T,a,f,P)=>ra(T*Ks+a*bc+f,P))(s.isoMillisecond,s.isoMicrosecond,s.isoNanosecond,c)),i.join(":")}function Zc(s,c=0){if(c===1)return"";let[i,T]=Rs(Math.abs(s),XT),[a,f]=Rs(T,QT),[P,D]=Rs(f,Es);return SO(s)+xs(i)+":"+xs(a)+(P||D?":"+xs(P)+ra(D):"")}function ta(s,c){if(c!==1){let i=v(s);if(c>1||c===0&&i!==b)return CO(i,c===2)}return""}function CO(s,c){return"["+(c?"!":"")+"u-ca="+s+"]"}function ra(s,c){let i=Vi(9,s);return i=c===void 0?i.replace(NS,""):i.slice(0,c),i?"."+i:""}function SO(s){return s<0?"-":"+"}function Fc(s,c){return s||c?s.toLocaleString("fullwide",{useGrouping:0}):""}function Q0(s,c){let{epochNanoseconds:i}=s,T=(c.getOffsetNanosecondsFor?c:c(s.timeZone)).getOffsetNanosecondsFor(i),a=ns(i,T);return{calendar:s.calendar,...a,offsetNanoseconds:T}}function dO(s,c){let i=Ts(c,s);return{calendar:c.calendar,...Ms(EC,i),offset:Zc(i.offsetNanoseconds),timeZone:c.timeZone}}function Ac(s,c,i,T=0,a=0,f,P){if(i!==void 0&&T===1&&(T===1||P))return qa(c,i);let D=s.getPossibleInstantsFor(c);if(i!==void 0&&T!==3){let O=((F,C,S,d)=>{let M=ss(C);d&&(S=oi(S));for(let m of F){let Z=As(Zs(m,M));if(d&&(Z=oi(Z)),Z===S)return m}})(D,c,i,f);if(O!==void 0)return O;if(T===0)throw RangeError(PS)}return P?ss(c):ds(s,c,a,D)}function ds(s,c,i=0,T=s.getPossibleInstantsFor(c)){if(T.length===1)return T[0];if(i===1)throw RangeError(DS);if(T.length)return T[i===3?1:0];let a=ss(c),f=((D,O)=>{let F=D.getOffsetNanosecondsFor(Kc(O,-W));return na(D.getOffsetNanosecondsFor(Kc(O,W))-F)})(s,a),P=f*(i===2?-1:1);return(T=s.getPossibleInstantsFor(ns(a,P)))[i===2?0:T.length-1]}function ua(s){if(Math.abs(s)>=W)throw RangeError(aS);return s}function na(s){if(s>W)throw RangeError(fS);return s}function ea(s,c,i){return h(ws(Jc(c.epochNanoseconds,((T)=>{if(jO(T))throw RangeError(CS);return p(T,5)})(s?as(i):i))))}function sf(s,c,i,T,a,f=Object.create(null)){let P=c(T.timeZone),D=s(T.calendar);return{...T,...Pf(P,D,T,i?as(a):a,f)}}function cf(s,c,i,T,a=Object.create(null)){let{calendar:f}=i;return R(Df(s(f),i,c?as(T):T,a),f)}function Tf(s,c,i,T,a){let{calendar:f}=i;return _(AT(s(f),i,c?as(T):T,a),f)}function af(s,c,i,T,a=Object.create(null)){let f=i.calendar,P=s(f),D=Fi(P,i);c&&(T=ET(T)),T.sign<0&&(D=P.dateAdd(D,{...o,months:1}),D=wc(D,-1));let O=P.dateAdd(D,T,a);return Cc(Fi(P,O),f)}function ff(s,c,i){return Gs(MO(c,s?as(i):i)[0])}function Pf(s,c,i,T,a){let f=p(T,5),P=i.epochNanoseconds;if(jO(T)){let D=Ts(i,s);P=Jc(ds(s,{...AT(c,D,{...T,...vf},a),...Ms(Ls,D)}),f)}else P=Jc(P,f),g(a);return{epochNanoseconds:ws(P)}}function Df(s,c,i,T){let[a,f]=MO(c,i);return zs({...AT(s,c,{...i,...vf,days:i.days+f},T),...a})}function AT(s,c,i,T){if(i.years||i.months||i.weeks)return s.dateAdd(c,i,T);g(T);let a=i.days+p(i,5)[0];return a?vs(wc(c,a)):c}function Fi(s,c,i=1){return wc(c,i-s.day(c))}function MO(s,c){let[i,T]=p(c,5),[a,f]=fT(rs(s)+T);return[a,i+f]}function wc(s,c){return c?{...s,...PT(is(s)+c*Cs)}:s}function wT(s,c,i){let T=s(i.calendar);return xT(i)?[i,T,c(i.timeZone)]:[{...i,...bs},T]}function Of(s){return s?oD:ss}function jT(s){return s?E(Pf,s):Df}function Ff(s){return s?E(U0,s):Y0}function xT(s){return s&&s.epochNanoseconds}function Ci(s,c){return s<=6-(xT(c)?1:0)}function Cf(s,c,i,T,a,f,P){let D=s(Ws(P).relativeTo),O=Math.max(Sc(a),Sc(f));if(Ci(O,D))return J(_c(((Z,A,j,w)=>{let x=Jc(p(Z),p(A),w?-1:1);if(!Number.isFinite(x[0]))throw RangeError(lT);return{...o,...Bc(x,j)}})(a,f,O,T)));if(!D)throw RangeError($T);T&&(f=as(f));let[F,C,S]=wT(c,i,D),d=jT(S),M=Ff(S),m=d(C,F,a);return J(M(C,F,d(C,m,f),O))}function mO(s,c,i,T,a){let f=Sc(T),[P,D,O,F,C]=((q,l,k)=>{q=Ya(q,ni);let H=nf(q),nc=k(q[gC]),ec=Xa(q),M0=Li(q,7),Oc=Ii(q);if(H===void 0&&Oc===void 0)throw RangeError(SS);return Oc==null&&(Oc=0),H==null&&(H=Math.max(Oc,l)),VD(H,Oc),ec=Ua(ec,Oc,1),[H,Oc,ec,M0,nc]})(a,f,s),S=Math.max(f,P);if(!xT(C)&&S<=6)return J(_c(((q,l,k,H,nc)=>{let ec=MT(p(q),k,H,nc);return{...o,...Bc(ec,l)}})(T,P,D,O,F)));if(!C)throw RangeError($T);let[d,M,m]=wT(c,i,C),Z=Of(m),A=jT(m),j=Ff(m),w=A(M,d,T),x=j(M,d,w,P),U=T.sign,K=es(x);if(U&&K&&U!==K)throw RangeError(yi);return K&&(x=dT(x,Z(w),P,D,O,F,M,d,Z,A)),J(x)}function ZO(s){return s.sign===-1?ET(s):s}function ET(s){return J(as(s))}function as(s){let c={};for(let i of y)c[i]=-1*s[i]||0;return c}function AO(s){return!s.sign}function es(s,c=y){let i=0;for(let T of c){let a=Math.sign(s[T]);if(a){if(i&&i!==a)throw RangeError(FS);i=a}}return i}function _c(s){for(let c of xS)js(c,s[c],-FD,FD,1);return wO(As(p(s),Es)),s}function wO(s){if(!Number.isSafeInteger(s))throw RangeError(OS)}function p(s,c=6){return jD(s,c,y)}function Bc(s,c=6){let[i,T]=s,a=cT(T,c,y);if(a[y[c]]+=i*(W/Js[c]),!Number.isFinite(a[y[c]]))throw RangeError(lT);return a}function bT(s,c=5){return cT(s,c,y)}function jO(s){return Boolean(es(s,jC))}function Sc(s){let c=9;for(;c>0&&!s[y[c]];c--);return c}function X0(s,c){return[s,c]}function TD(s){let c=Math.floor(s/Ni)*Ni;return[c,c+Ni]}function xO(s){let c=sc(s=hi(s));if(!c)throw RangeError(Fs(s));let i;if(c.m)i=0;else{if(!c.offset)throw RangeError(Fs(s));i=zc(c.offset)}return c.timeZone&&mf(c.timeZone,1),h(qa(DT(c),i))}function EO(s){let c=sc($(s));if(!c)throw RangeError(Fs(s));if(c.timeZone)return JO(c,c.offset?zc(c.offset):void 0);if(c.m)throw RangeError(Fs(s));return lO(c)}function bO(s,c){let i=sc($(s));if(!i||!i.timeZone)throw RangeError(Fs(s));let{offset:T}=i,a=T?zc(T):void 0,[,f,P]=wi(c);return JO(i,a,f,P)}function zc(s){let c=mf(s);if(c===void 0)throw RangeError(Fs(s));return c}function gO(s){let c=sc($(s));if(!c||c.m)throw RangeError(Fs(s));return R(KO(c))}function gT(s){let c=sc($(s));if(!c||c.m)throw RangeError(Fs(s));return _(c.p?KO(c):lO(c))}function yO(s,c){let i=df($(c));if(i)return Sf(i),Cc(La(Mc(i)));let T=gT(c);return Cc(Fi(s(T.calendar),T))}function Sf(s){if(s.calendar!==b)throw RangeError(_s(s.calendar))}function WO(s,c){let i=Mf($(c));if(i)return Sf(i),vi(Mc(i));let T=gT(c),{calendar:a}=T,f=s(a),[P,D,O]=f.h(T),[F,C]=f.I(P,D),[S,d]=f.N(F,C,O);return vi(vs(f.P(S,d,O)),a)}function GO(s){let c,i=((T)=>{let a=vS.exec(T);return a?(yT(a[10]),XO(a)):void 0})($(s));if(!i){if(i=sc(s),!i)throw RangeError(Fs(s));if(!i.p)throw RangeError(Fs(s));if(i.m)throw RangeError(_s("Z"));Sf(i)}if((c=df(s))&&sD(c))throw RangeError(Fs(s));if((c=Mf(s))&&sD(c))throw RangeError(Fs(s));return Gs(OT(i,1))}function IO(s){let c=((i)=>{let T=rS.exec(i);return T?((a)=>{function f(C,S,d){let M=0,m=0;if(d&&([M,O]=Rs(O,Js[d])),C!==void 0){if(D)throw RangeError(_s(C));m=((Z)=>{let A=parseInt(Z);if(!Number.isFinite(A))throw RangeError(_s(Z));return A})(C),P=1,S&&(O=Zf(S)*(Js[d]/Es),D=1)}return M+m}let P=0,D=0,O=0,F={...Xc(y,[f(a[2]),f(a[3]),f(a[4]),f(a[5]),f(a[6],a[7],5),f(a[8],a[9],4),f(a[10],a[11],3)]),...cT(O,2,y)};if(!P)throw RangeError(uF(y));return Af(a[1])<0&&(F=as(F)),F})(T):void 0})($(s));if(!c)throw RangeError(Fs(s));return J(_c(c))}function LO(s){let c=sc(s)||df(s)||Mf(s);return c?c.calendar:s}function qO(s){let c=sc(s);return c&&(c.timeZone||c.m&&Wc||c.offset)||s}function JO(s,c,i=0,T=0){let a=WT(s.timeZone),f=HT(a);return t(Ac(f,DT(s),c,i,T,!f.v,s.m),a,xi(s.calendar))}function KO(s){return $O(zs(DT(s)))}function lO(s){return $O(vs(Mc(s)))}function $O(s){return{...s,calendar:xi(s.calendar)}}function sc(s){let c=kS.exec(s);return c?((i)=>{let T=i[10],a=(T||"").toUpperCase()==="Z";return{isoYear:QO(i),isoMonth:parseInt(i[4]),isoDay:parseInt(i[5]),...XO(i.slice(5)),...yT(i[16]),p:Boolean(i[6]),m:a,offset:a?void 0:T}})(c):void 0}function df(s){let c=VS.exec(s);return c?((i)=>({isoYear:QO(i),isoMonth:parseInt(i[4]),isoDay:1,...yT(i[5])}))(c):void 0}function Mf(s){let c=hS.exec(s);return c?((i)=>({isoYear:Qc,isoMonth:parseInt(i[1]),isoDay:parseInt(i[2]),...yT(i[3])}))(c):void 0}function mf(s,c){let i=oS.exec(s);return i?((T,a)=>{let f=T[4]||T[5];if(a&&f)throw RangeError(_s(f));return ua((qc(T[2])*XT+qc(T[3])*QT+qc(T[4])*Es+Zf(T[5]||""))*Af(T[1]))})(i,c):void 0}function QO(s){let c=Af(s[1]),i=parseInt(s[2]||s[3]);if(c<0&&!i)throw RangeError(_s(-0));return c*i}function XO(s){let c=qc(s[3]);return{...fT(Zf(s[4]||""))[0],isoHour:qc(s[1]),isoMinute:qc(s[2]),isoSecond:c===60?59:c}}function yT(s){let c,i,T=[];if(s.replace(tS,(a,f,P)=>{let D=Boolean(f),[O,F]=P.split("=").reverse();if(F){if(F==="u-ca")T.push(O),c||(c=D);else if(D||/[A-Z]/.test(F))throw RangeError(_s(a))}else{if(i)throw RangeError(_s(a));i=O}return""}),T.length>1&&c)throw RangeError(_s(s));return{timeZone:i,calendar:T[0]||b}}function Zf(s){return parseInt(s.padEnd(9,"0"))}function Hc(s){return new RegExp(`^${s}$`,"i")}function Af(s){return s&&s!=="+"?-1:1}function qc(s){return s===void 0?0:parseInt(s)}function UO(s){return WT($(s))}function WT(s){let c=wf(s);return typeof c=="number"?Zc(c):c?((i)=>{if(nS.test(i))throw RangeError(TS);return i.toLowerCase().split("/").map((T,a)=>(T.length<=3||/\d/.test(T))&&!/etc|yap/.test(T)?T.toUpperCase():T.replace(/baja|dumont|[a-z]+/g,(f,P)=>f.length<=2&&!a||f==="in"||f==="chat"?f.toUpperCase():f.length>2||!P?nP(f).replace(/island|noronha|murdo|rivadavia|urville/,nP):f)).join("/")})(s):Wc}function aD(s){let c=wf(s);return typeof c=="number"?c:c?c.resolvedOptions().timeZone:Wc}function wf(s){let c=mf(s=s.toUpperCase(),1);return c!==void 0?c:s!==Wc?uS(s):void 0}function jf(s,c){return cs(s.epochNanoseconds,c.epochNanoseconds)}function xf(s,c){return cs(s.epochNanoseconds,c.epochNanoseconds)}function YO(s,c,i,T,a,f){let P=s(Ws(f).relativeTo),D=Math.max(Sc(T),Sc(a));if(AD(y,T,a))return 0;if(Ci(D,P))return cs(p(T),p(a));if(!P)throw RangeError($T);let[O,F,C]=wT(c,i,P),S=Of(C),d=jT(C);return cs(S(d(F,O,T)),S(d(F,O,a)))}function Ef(s,c){return jc(s,c)||GT(s,c)}function jc(s,c){return ks(is(s),is(c))}function GT(s,c){return ks(rs(s),rs(c))}function RO(s,c){return!jf(s,c)}function _O(s,c){return!xf(s,c)&&!!IT(s.timeZone,c.timeZone)&&Rc(s.calendar,c.calendar)}function BO(s,c){return!Ef(s,c)&&Rc(s.calendar,c.calendar)}function zO(s,c){return!jc(s,c)&&Rc(s.calendar,c.calendar)}function HO(s,c){return!jc(s,c)&&Rc(s.calendar,c.calendar)}function NO(s,c){return!jc(s,c)&&Rc(s.calendar,c.calendar)}function pO(s,c){return!GT(s,c)}function IT(s,c){if(s===c)return 1;let i=v(s),T=v(c);if(i===T)return 1;try{return aD(i)===aD(T)}catch(a){}}function bf(s,c,i,T){let a=Yc(s,Y(T),3,5),f=LT(c.epochNanoseconds,i.epochNanoseconds,...a);return J(s?as(f):f)}function gf(s,c,i,T,a,f){let P=JT(T.calendar,a.calendar),D=Y(f),[O,F,C,S]=Yc(i,D,5),d=T.epochNanoseconds,M=a.epochNanoseconds,m=cs(M,d),Z;if(m)if(O<6)Z=LT(d,M,O,F,C,S);else{let A=c(((w,x)=>{if(!IT(w,x))throw RangeError(TC);return w})(T.timeZone,a.timeZone)),j=s(P);Z=hO(j,A,T,a,m,O,D),Z=dT(Z,M,O,F,C,S,j,T,oD,E(Pf,A))}else Z=o;return J(i?as(Z):Z)}function yf(s,c,i,T,a){let f=JT(i.calendar,T.calendar),P=Y(a),[D,O,F,C]=Yc(c,P,6),S=ss(i),d=ss(T),M=cs(d,S),m;if(M)if(D<=6)m=LT(S,d,D,O,F,C);else{let Z=s(f);m=kO(Z,i,T,M,D,P),m=dT(m,d,D,O,F,C,Z,i,ss,Df)}else m=o;return J(c?as(m):m)}function Wf(s,c,i,T,a){let f=JT(i.calendar,T.calendar),P=Y(a);return VO(c,()=>s(f),i,T,...Yc(c,P,6,9,6),P)}function Gf(s,c,i,T,a){let f=JT(i.calendar,T.calendar),P=Y(a),D=Yc(c,P,9,9,8),O=s(f);return VO(c,()=>O,Fi(O,i),Fi(O,T),...D,P)}function VO(s,c,i,T,a,f,P,D,O){let F=ss(i),C=ss(T),S;if(cs(C,F))if(a===6)S=LT(F,C,a,f,P,D);else{let d=c();S=d.dateUntil(i,T,a,O),f===6&&P===1||(S=dT(S,C,a,f,P,D,d,i,ss,AT))}else S=o;return J(s?as(S):S)}function If(s,c,i,T){let a=Y(T),[f,P,D,O]=Yc(s,a,5,5),F=us(Lf(c,i),ji(P,D),O),C={...o,...bT(F,f)};return J(s?as(C):C)}function U0(s,c,i,T,a,f){let P=cs(T.epochNanoseconds,i.epochNanoseconds);return P?a<6?vO(i.epochNanoseconds,T.epochNanoseconds,a):hO(c,s,i,T,P,a,f):o}function Y0(s,c,i,T,a){let f=ss(c),P=ss(i),D=cs(P,f);return D?T<=6?vO(f,P,T):kO(s,c,i,D,T,a):o}function hO(s,c,i,T,a,f,P){let[D,O,F]=((d,M,m,Z)=>{function A(){return l={...wc(x,K++*-Z),...w},k=ds(d,l),cs(U,k)===-Z}let j=Ts(M,d),w=Ms(Ls,j),x=Ts(m,d),U=m.epochNanoseconds,K=0,q=Lf(j,x),l,k;if(Math.sign(q)===-Z&&K++,A()&&(Z===-1||A()))throw RangeError(yi);let H=As(Zs(k,U));return[j,l,H]})(c,i,T,a);var C,S;return{...f===6?(C=D,S=O,{...o,days:oO(C,S)}):s.dateUntil(D,O,f,P),...bT(F)}}function kO(s,c,i,T,a,f){let[P,D,O]=((F,C,S)=>{let d=C,M=Lf(F,C);return Math.sign(M)===-S&&(d=wc(C,-S),M+=W*S),[F,d,M]})(c,i,T);return{...s.dateUntil(P,D,a,f),...bT(O)}}function LT(s,c,i,T,a,f){return{...o,...Bc(MT(Zs(s,c),T,a,f),i)}}function vO(s,c,i){return{...o,...Bc(Zs(s,c),i)}}function oO(s,c){return qT(is(s),is(c))}function qT(s,c){return Math.trunc((c-s)/Cs)}function Lf(s,c){return rs(c)-rs(s)}function JT(s,c){if(!Rc(s,c))throw RangeError(Nf);return s}function R0(s){function c(a){return((f,P)=>({...tO(f,P),F:f.month,day:parseInt(f.day)}))(Ia(i,a),T)}let i=TP(s),T=ri(s);return{id:s,O:_0(c),B:B0(c)}}function _0(s){return Ss((c)=>{let i=is(c);return s(i)},WeakMap)}function B0(s){let c=s(0).year-GS;return Ss((i)=>{let T,a=Uc(i-c),f=[],P=[];do a+=400*Cs;while((T=s(a)).year<=i);do a+=(1-T.day)*Cs,T.year===i&&(f.push(a),P.push(T.F)),a-=Cs;while((T=s(a)).year>=i);return{k:f.reverse(),C:PC(P.reverse())}})}function tO(s,c){let i,T,a=rO(s);if(s.era){let f=ZC[c];f!==void 0&&(i=c==="islamic"?"ah":s.era.normalize("NFD").toLowerCase().replace(/[^a-z0-9]/g,""),i==="bc"||i==="b"?i="bce":i!=="ad"&&i!=="a"||(i="ce"),T=a,a=cF(T,f[i]||0))}return{era:i,eraYear:T,year:a}}function rO(s){return parseInt(s.relatedYear||s.year)}function Ca(s){let{year:c,F:i,day:T}=this.O(s),{C:a}=this.B(c);return[c,a[i]+1,T]}function Si(s,c=1,i=1){return this.B(s).k[c-1]+(i-1)*Cs}function Bi(s){let c=PD(this,s),i=PD(this,s-1),T=c.length;if(T>i.length){let a=iF(this);if(a<0)return-a;for(let f=0;f<T;f++)if(c[f]!==i[f])return f+1}}function zi(s){return qT(Si.call(this,s),Si.call(this,s+1))}function fD(s,c){let{k:i}=this.B(s),T=c+1,a=i;return T>i.length&&(T=1,a=this.B(s+1).k),qT(i[c-1],a[T-1])}function Hi(s){return this.B(s).k.length}function PD(s,c){return Object.keys(s.B(c).C)}function uO(s){return xi($(s))}function xi(s){if((s=s.toLowerCase())!==b&&s!==YT&&ri(s)!==ri(TP(s).resolvedOptions().calendar))throw RangeError(iS(s));return s}function ri(s){return s==="islamicc"&&(s="islamic"),s.split("-")[0]}function nO(s){return this.R(s)[0]}function eO(s){return this.R(s)[1]}function qf(s){let[c]=this.h(s);return qT(this.q(c),is(s))+1}function sF(s){let c=sd.exec(s);if(!c)throw RangeError(sS(s));return[parseInt(c[1]),Boolean(c[2])]}function ui(s,c,i){return s+(c||i&&s>=i?1:0)}function Sa(s,c){return s-(c&&s>=c?1:0)}function cF(s,c){return(c+s)*(Math.sign(c)||1)||0}function da(s){return ZC[TF(s)]}function iF(s){return AS[TF(s)]}function TF(s){return ri(s.id||b)}function aF(s,c,i,T){let a=cc(i,T,Is,[],SC);if(a.timeZone!==void 0){let f=i.dateFromFields(a),P=xc(a),D=s(a.timeZone);return{epochNanoseconds:Ac(c(D),{...f,...P},a.offset!==void 0?zc(a.offset):void 0),timeZone:D}}return{...i.dateFromFields(a),...bs}}function fF(s,c,i,T,a,f){let P=cc(i,a,Is,FC,SC),D=s(P.timeZone),[O,F,C]=wi(f),S=i.dateFromFields(P,CT(f,O)),d=xc(P,O);return t(Ac(c(D),{...S,...d},P.offset!==void 0?zc(P.offset):void 0,F,C),D,T)}function PF(s,c,i){let T=cc(s,c,Is,[],ps),a=g(i);return R(zs({...s.dateFromFields(T,CT(i,a)),...xc(T,a)}))}function Jf(s,c,i,T=[]){let a=cc(s,c,Is,T);return s.dateFromFields(a,i)}function Kf(s,c,i,T){let a=cc(s,c,hf,T);return s.yearMonthFromFields(a,i)}function lf(s,c,i,T,a=[]){let f=cc(s,i,Is,a);return c&&f.month!==void 0&&f.monthCode===void 0&&f.year===void 0&&(f.year=Qc),s.monthDayFromFields(f,T)}function DF(s,c){let i=g(c);return Gs(xc(qs(s,ma,[],1),i))}function OF(s){let c=qs(s,kf);return J(_c({...o,...c}))}function cc(s,c,i,T=[],a=[]){return qs(c,[...s.fields(i),...a].sort(),T)}function qs(s,c,i,T=!i){let a={},f,P=0;for(let D of c){if(D===f)throw RangeError(o0(D));if(D==="constructor"||D==="__proto__")throw RangeError(zf(D));let O=s[D];if(O!==void 0)P=1,CD[D]&&(O=CD[D](O,D)),a[D]=O;else if(i){if(i.includes(D))throw TypeError(Bf(D));a[D]=mC[D]}f=D}if(T&&!P)throw TypeError(uF(c));return a}function xc(s,c){return OT(ad({...mC,...s}),c)}function FF(s,c,i,T,a,f){let P=Y(f),{calendar:D,timeZone:O}=i;return t(((F,C,S,d,M)=>{let m=Ei(F,S,d,Is,CC,OC),[Z,A,j]=wi(M,2);return Ac(C,{...F.dateFromFields(m,CT(M,Z)),...xc(m,Z)},zc(m.offset),A,j)})(s(D),c(O),T,a,P),O,D)}function CF(s,c,i,T,a){let f=Y(a);return R(((P,D,O,F)=>{let C=Ei(P,D,O,Is,ps),S=g(F);return zs({...P.dateFromFields(C,CT(F,S)),...xc(C,S)})})(s(c.calendar),i,T,f))}function SF(s,c,i,T,a){let f=Y(a);return((P,D,O,F)=>{let C=Ei(P,D,O,Is);return P.dateFromFields(C,F)})(s(c.calendar),i,T,f)}function dF(s,c,i,T,a){let f=Y(a);return Cc(((P,D,O,F)=>{let C=Ei(P,D,O,hf);return P.yearMonthFromFields(C,F)})(s(c.calendar),i,T,f))}function MF(s,c,i,T,a){let f=Y(a);return((P,D,O,F)=>{let C=Ei(P,D,O,Is);return P.monthDayFromFields(C,F)})(s(c.calendar),i,T,f)}function mF(s,c,i){return Gs(((T,a,f)=>{let P=g(f);return xc({...Ms(ma,T),...qs(a,ma)},P)})(s,c,i))}function ZF(s,c){return J((i=s,T=c,_c({...i,...qs(T,kf)})));var i,T}function Ei(s,c,i,T,a=[],f=[]){let P=[...s.fields(T),...a].sort(),D=qs(c,P,f),O=qs(i,P);return D=s.mergeFields(D,O),qs(D,P,[])}function $f(s,c){let i=cc(s,c,MC);return s.monthDayFromFields(i)}function Qf(s,c,i){let T=cc(s,c,dC);return s.yearMonthFromFields(T,i)}function AF(s,c,i,T,a){c=Ms(i=s.fields(i),c),T=qs(T,a=s.fields(a),[]);let f=s.mergeFields(c,T);return f=qs(f,[...i,...a].sort(),[]),s.dateFromFields(f)}function fa(s,c){let{era:i,eraYear:T,year:a}=c,f=da(s);if(i!==void 0||T!==void 0){if(i===void 0||T===void 0)throw TypeError(r0);if(!f)throw RangeError(t0);let P=f[i];if(P===void 0)throw RangeError(n0(i));let D=cF(T,P);if(a!==void 0&&a!==D)throw RangeError(u0);a=D}else if(a===void 0)throw TypeError(e0(f));return a}function Pa(s,c,i,T){let{month:a,monthCode:f}=c;if(f!==void 0){let P=((D,O,F,C)=>{let S=D.U(F),[d,M]=sF(O),m=ui(d,M,S);if(M){let Z=iF(D);if(Z===void 0)throw RangeError(Pi);if(Z>0){if(m>Z)throw RangeError(Pi);if(S===void 0){if(C===1)throw RangeError(Pi);m--}}else{if(m!==-Z)throw RangeError(Pi);if(S===void 0&&C===1)throw RangeError(Pi)}}return m})(s,f,i,T);if(a!==void 0&&a!==P)throw RangeError(cC);a=P,T=1}else if(a===void 0)throw TypeError(cS);return js("month",a,1,s.L(i),T)}function DD(s,c,i,T,a){return Os(c,"day",1,s.j(T,i),a)}function Da(s,c,i,T){let a=0,f=[];for(let P of i)c[P]!==void 0?a=1:f.push(P);if(Object.assign(s,c),a)for(let P of T||f)delete s[P]}function wF(s){return h(ws(aT(TT(s))))}function jF(s,c,i,T,a=b){return t(ws(aT(TT(i))),c(T),s(a))}function xF(s,c,i,T,a=0,f=0,P=0,D=0,O=0,F=0,C=b){return R(zs(DT(gs(e,Xc(RT,[c,i,T,a,f,P,D,O,F])))),s(C))}function EF(s,c,i,T,a=b){return _(vs(Mc(gs(e,{isoYear:c,isoMonth:i,isoDay:T}))),s(a))}function bF(s,c,i,T=b,a=1){let f=e(c),P=e(i),D=s(T);return Cc(La(Mc({isoYear:f,isoMonth:P,isoDay:e(a)})),D)}function gF(s,c,i,T=b,a=Qc){let f=e(c),P=e(i),D=s(T);return vi(vs(Mc({isoYear:e(a),isoMonth:f,isoDay:P})),D)}function yF(s=0,c=0,i=0,T=0,a=0,f=0){return Gs(OT(gs(e,Xc(Ls,[s,c,i,T,a,f])),1))}function WF(s=0,c=0,i=0,T=0,a=0,f=0,P=0,D=0,O=0,F=0){return J(_c(gs(qD,Xc(y,[s,c,i,T,a,f,P,D,O,F]))))}function Xf(s,c,i=b){return t(s.epochNanoseconds,c,i)}function GF(s){return h(s.epochNanoseconds)}function Uf(s,c){return R(Ts(c,s))}function Yf(s,c){return _(Ts(c,s))}function IF(s,c,i){return Qf(s(c.calendar),i)}function LF(s,c,i){return $f(s(c.calendar),i)}function Rf(s,c){return Gs(Ts(c,s))}function qF(s,c,i,T){let a=((f,P,D,O)=>{let F=la(O);return ds(f(P),D,F)})(s,i,c,T);return t(ws(a),i,c.calendar)}function JF(s,c,i){let T=s(c.calendar);return Cc({...c,...Qf(T,i)})}function KF(s,c,i){return $f(s(c.calendar),i)}function lF(s,c,i,T,a){let f=s(a.timeZone),P=a.plainTime,D=P!==void 0?c(P):bs;return t(ds(i(f),{...T,...D}),f,T.calendar)}function $F(s,c=bs){return R(zs({...s,...c}))}function QF(s,c,i){return Qf(s(c.calendar),i)}function XF(s,c,i){return $f(s(c.calendar),i)}function UF(s,c,i,T){return((a,f,P)=>AF(a,f,dC,Bs(P),Gi))(s(c.calendar),i,T)}function YF(s,c,i,T){return((a,f,P)=>AF(a,f,MC,Bs(P),UT))(s(c.calendar),i,T)}function RF(s,c,i,T,a){let f=Bs(a),P=c(f.plainDate),D=s(f.timeZone);return t(ds(i(D),{...P,...T}),D,P.calendar)}function _F(s,c){return R(zs({...s,...c}))}function BF(s){return h(ws(lc(s,Es)))}function zF(s){return h(ws(lc(s,Ks)))}function HF(s){return h(ws(aT(TT(s),bc)))}function NF(s){return h(ws(aT(TT(s))))}function pF(s,c,i=bs){let T=c.timeZone,a=s(T),f={...Ts(c,a),...i};return t(Ac(a,f,f.offsetNanoseconds,2),T,c.calendar)}function VF(s,c,i){let T=c.timeZone,a=s(T),f={...Ts(c,a),...i},P=oF(c.calendar,i.calendar);return t(Ac(a,f,f.offsetNanoseconds,2),T,P)}function hF(s,c=bs){return R({...s,...c})}function kF(s,c){return R({...s,...c},oF(s.calendar,c.calendar))}function KT(s,c){return{...s,calendar:c}}function vF(s,c){return{...s,timeZone:c}}function oF(s,c){if(s===c)return s;let i=v(s),T=v(c);if(i===T||i===b)return c;if(T===b)return s;throw RangeError(Nf)}function z0(s,c){return(i)=>i===b?s:i===YT||i===$c?Object.assign(Object.create(s),{id:i}):Object.assign(Object.create(c),eS(i))}function Ec(s,c,i){let T=new Set(i);return(a)=>(((f,P)=>{for(let D of P)if(D in f)return 1;return 0})(a=ja(T,a),s)||Object.assign(a,c),i&&(a.timeZone=Wc,["full","long"].includes(a.timeStyle)&&(a.timeStyle="medium")),a)}function Hs(s,c=_f){let[i,,,T]=s;return(a,f=Ed,...P)=>{let D=c(T&&T(...P),a,f,i),O=D.resolvedOptions();return[D,...H0(s,O,P)]}}function _f(s,c,i,T){if(i=T(i),s){if(i.timeZone!==void 0)throw TypeError(MS);i.timeZone=s}return new ic(c,i)}function H0(s,c,i){let[,T,a]=s;return i.map((f)=>(f.calendar&&((P,D,O)=>{if((O||P!==b)&&P!==D)throw RangeError(Nf)})(v(f.calendar),c.calendar,a),T(f,c)))}function Nc(s){let c=bi();return ns(c,s.getOffsetNanosecondsFor(c))}function bi(){return lc(Date.now(),Ks)}function Ns(){return dD||(dD=new ic().resolvedOptions().timeZone)}var N0=(s,c)=>`Non-integer ${s}: ${c}`,p0=(s,c)=>`Non-positive ${s}: ${c}`,V0=(s,c)=>`Non-finite ${s}: ${c}`,h0=(s)=>`Cannot convert bigint to ${s}`,k0=(s)=>`Invalid bigint: ${s}`,v0="Cannot convert Symbol to string",tF="Invalid object",rF=(s,c,i,T,a)=>a?rF(s,a[c],a[i],a[T]):gi(s,c)+`; must be between ${i}-${T}`,gi=(s,c)=>`Invalid ${s}: ${c}`,Bf=(s)=>`Missing ${s}`,zf=(s)=>`Invalid field ${s}`,o0=(s)=>`Duplicate field ${s}`,uF=(s)=>"No valid fields: "+s.join(),nF="Invalid bag",eF=(s,c,i)=>gi(s,c)+"; must be "+Object.keys(i).join(),sC="Cannot use valueOf",Hf="Invalid calling context",t0="Forbidden era/eraYear",r0="Mismatching era/eraYear",u0="Mismatching year/eraYear",n0=(s)=>`Invalid era: ${s}`,e0=(s)=>"Missing year"+(s?"/era/eraYear":""),sS=(s)=>`Invalid monthCode: ${s}`,cC="Mismatching month/monthCode",cS="Missing month/monthCode",OD="Cannot guess year",Pi="Invalid leap month",iC="Invalid protocol",yi="Invalid protocol results",Nf="Mismatching Calendars",iS=(s)=>`Invalid Calendar: ${s}`,TC="Mismatching TimeZones",TS="Forbidden ICU TimeZone",aS="Out-of-bounds offset",fS="Out-of-bounds TimeZone gap",PS="Invalid TimeZone offset",DS="Ambiguous offset",lT="Out-of-bounds date",OS="Out-of-bounds duration",FS="Cannot mix duration signs",$T="Missing relativeTo",CS="Cannot use large units",SS="Required smallestUnit or largestUnit",dS="smallestUnit > largestUnit",Fs=(s)=>`Cannot parse: ${s}`,_s=(s)=>`Invalid substring: ${s}`,aC=(s)=>`Cannot format ${s}`,fC="Mismatching types for formatting",MS="Cannot specify TimeZone",PC=E(mi,(s,c)=>c),pc=E(mi,(s,c,i)=>i),xs=E(Vi,2),Ma={nanosecond:0,microsecond:1,millisecond:2,second:3,minute:4,hour:5,day:6,week:7,month:8,year:9},Wi=Object.keys(Ma),Cs=86400000,DC=1000,bc=1000,Ks=1e6,Es=1e9,QT=60000000000,XT=3600000000000,W=86400000000000,Js=[1,bc,Ks,Es,QT,XT,W],ps=Wi.slice(0,6),ma=Zi(ps),OC=["offset"],FC=["timeZone"],CC=ps.concat(OC),SC=CC.concat(FC),Za=["era","eraYear"],mS=Za.concat(["year"]),UT=["year"],pf=["monthCode"],Vf=["month"].concat(pf),Gi=["day"],hf=Vf.concat(UT),dC=pf.concat(UT),Is=Gi.concat(hf),ZS=Gi.concat(Vf),MC=Gi.concat(pf),mC=pc(ps,0),b="iso8601",YT="gregory",$c="japanese",ZC={[YT]:{bce:-1,ce:0},[$c]:{bce:-1,ce:0,meiji:1867,taisho:1911,showa:1925,heisei:1988,reiwa:2018},ethioaa:{era0:0},ethiopic:{era0:0,era1:5500},coptic:{era0:-1,era1:0},roc:{beforeroc:-1,minguo:0},buddhist:{be:0},islamic:{ah:0},indian:{saka:0},persian:{ap:0}},AS={chinese:13,dangi:13,hebrew:-6},$=E(iT,"string"),AC=E(iT,"boolean"),wS=E(iT,"number"),wC=E(iT,"function"),y=Wi.map((s)=>s+"s"),kf=Zi(y),jS=y.slice(0,6),jC=y.slice(6),xS=jC.slice(1),ES=PC(y),o=pc(y,0),vf=pc(jS,0),of=E(wD,y),Ls=["isoNanosecond","isoMicrosecond","isoMillisecond","isoSecond","isoMinute","isoHour"],tf=["isoDay","isoMonth","isoYear"],RT=Ls.concat(tf),rf=Zi(tf),xC=Zi(Ls),EC=Zi(RT),bs=pc(xC,0),bS=E(wD,RT),ic=Intl.DateTimeFormat,bC="en-GB",uf=1e8,gS=uf*Cs,yS=[uf,0],WS=[-uf,0],di=275760,Mi=-271821,GS=1970,Qc=1972,Ys=12,IS=Uc(1868,9,8),LS=Ss(L0,WeakMap),ni="smallestUnit",Aa="unit",Oi="roundingIncrement",Oa="fractionalSecondDigits",gC="relativeTo",yC={constrain:0,reject:1},qS=Object.keys(yC),JS={compatible:0,reject:1,earlier:2,later:3},KS={reject:0,use:1,prefer:2,ignore:3},lS={auto:0,never:1,critical:2,always:3},$S={auto:0,never:1,critical:2},QS={auto:0,never:1},XS={floor:0,halfFloor:1,ceil:2,halfCeil:3,trunc:4,halfTrunc:5,expand:6,halfExpand:7,halfEven:8},Ii=E(Ra,ni),nf=E(Ra,"largestUnit"),US=E(Ra,Aa),WC=E(mc,"overflow",yC),GC=E(mc,"disambiguation",JS),YS=E(mc,"offset",KS),ef=E(mc,"calendarName",lS),RS=E(mc,"timeZoneName",$S),_S=E(mc,"offset",QS),Li=E(mc,"roundingMode",XS),Vc="PlainYearMonth",hc="PlainMonthDay",gc="PlainDate",yc="PlainDateTime",_T="PlainTime",Vs="ZonedDateTime",BT="Instant",zT="Duration",BS=[Math.floor,(s)=>_i(s)?Math.floor(s):Math.round(s),Math.ceil,(s)=>_i(s)?Math.ceil(s):Math.round(s),Math.trunc,(s)=>_i(s)?Math.trunc(s)||0:Math.round(s),(s)=>s<0?Math.floor(s):Math.ceil(s),(s)=>Math.sign(s)*Math.round(Math.abs(s))||0,(s)=>_i(s)?(s=Math.trunc(s)||0)+s%2:Math.round(s)],Wc="UTC",Ni=5184000,zS=ki(1847),HS=ki(new Date().getUTCFullYear()+10),NS=/0+$/,Ts=Ss(Q0,WeakMap),FD=4294967295,HT=Ss((s)=>{let c=wf(s);return typeof c=="object"?new LC(c):new IC(c||0)});class IC{constructor(s){this.v=s}getOffsetNanosecondsFor(){return this.v}getPossibleInstantsFor(s){return[qa(s,this.v)]}l(){}}class LC{constructor(s){this.$=((c)=>{function i(O){let F=Fa(O,P,D),[C,S]=TD(F),d=a(C),M=a(S);return d===M?d:T(f(C,S),d,M,O)}function T(O,F,C,S){let d,M;for(;(S===void 0||(d=S<O[0]?F:S>=O[1]?C:void 0)===void 0)&&(M=O[1]-O[0]);){let m=O[0]+Math.floor(M/2);c(m)===C?O[1]=m:O[0]=m+1}return d}let a=Ss(c),f=Ss(X0),P=zS,D=HS;return{G(O){let F=i(O-86400),C=i(O+86400),S=O-F,d=O-C;if(F===C)return[S];let M=i(S);return M===i(d)?[O-M]:F>C?[S,d]:[]},V:i,l(O,F){let C=Fa(O,P,D),[S,d]=TD(C),M=Ni*F,m=F<0?()=>d>P||(P=C,0):()=>S<D||(D=C,0);for(;m();){let Z=a(S),A=a(d);if(Z!==A){let j=f(S,d);T(j,Z,A);let w=j[0];if((ks(w,O)||1)===F)return w}S+=M,d+=M}}}})(((c)=>(i)=>{let T=Ia(c,i*DC);return ki(rO(T),parseInt(T.month),parseInt(T.day),parseInt(T.hour),parseInt(T.minute),parseInt(T.second))-i})(s))}getOffsetNanosecondsFor(s){return this.$.V(lD(s))*Es}getPossibleInstantsFor(s){let[c,i]=[ki((T=s).isoYear,T.isoMonth,T.isoDay,T.isoHour,T.isoMinute,T.isoSecond),T.isoMillisecond*Ks+T.isoMicrosecond*bc+T.isoNanosecond];var T;return this.$.G(c).map((a)=>ws(Kc(lc(a,Es),i)))}l(s,c){let[i,T]=$D(s),a=this.$.l(i+(c>0||T?1:0),c);if(a!==void 0)return lc(a,Es)}}var sP="([+\u2212-])",pi="(?:[.,](\\d{1,9}))?",qC=`(?:(?:${sP}(\\d{6}))|(\\d{4}))-?(\\d{2})`,cP="(\\d{2})(?::?(\\d{2})(?::?(\\d{2})"+pi+")?)?",iP=sP+cP,pS=qC+"-?(\\d{2})(?:[T ]"+cP+"(Z|"+iP+")?)?",JC="\\[(!?)([^\\]]*)\\]",NT=`((?:${JC}){0,9})`,VS=Hc(qC+NT),hS=Hc("(?:--)?(\\d{2})-?(\\d{2})"+NT),kS=Hc(pS+NT),vS=Hc("T?"+cP+"(?:"+iP+")?"+NT),oS=Hc(iP),tS=new RegExp(JC,"g"),rS=Hc(`${sP}?P(\\d+Y)?(\\d+M)?(\\d+W)?(\\d+D)?(?:T(?:(\\d+)${pi}H)?(?:(\\d+)${pi}M)?(?:(\\d+)${pi}S)?)?`),uS=Ss((s)=>new ic(bC,{timeZone:s,era:"short",year:"numeric",month:"numeric",day:"numeric",hour:"numeric",minute:"numeric",second:"numeric"})),nS=/^(AC|AE|AG|AR|AS|BE|BS|CA|CN|CS|CT|EA|EC|IE|IS|JS|MI|NE|NS|PL|PN|PR|PS|SS|VS)T$/,eS=Ss(R0),TP=Ss((s)=>new ic(bC,{calendar:s,timeZone:Wc,era:"short",year:"numeric",month:"short",day:"numeric"})),sd=/^M(\d{2})(L?)$/,cd={era:hi,eraYear:e,year:e,month:eP,monthCode:hi,day:eP},id=pc(ps,e),Td=pc(y,qD),CD=Object.assign({},cd,id,Td,{offset:hi}),ad=E(I0,ps,Ls),SD={dateAdd(s,c,i){let T=g(i),a,{years:f,months:P,weeks:D,days:O}=c;if(O+=p(c,5)[0],f||P)a=((F,C,S,d,M)=>{let[m,Z,A]=F.h(C);if(S){let[j,w]=F.I(m,Z);m+=S,Z=ui(j,w,F.U(m)),Z=js("month",Z,1,F.L(m),M)}return d&&([m,Z]=F._(m,Z,d)),A=js("day",A,1,F.j(m,Z),M),F.q(m,Z,A)})(this,s,f,P,T);else{if(!D&&!O)return s;a=is(s)}return a+=(7*D+O)*Cs,vs(PT(a))},dateUntil(s,c,i){if(i<=7){let O=0,F=oO({...s,...bs},{...c,...bs});return i===7&&([O,F]=ts(F,7)),{...o,weeks:O,days:F}}let T=this.h(s),a=this.h(c),[f,P,D]=((O,F,C,S,d,M,m)=>{let Z=d-F,A=M-C,j=m-S;if(Z||A){let w=Math.sign(Z||A),x=O.j(d,M),U=0;if(Math.sign(j)===-w){let K=x;[d,M]=O._(d,M,-w),Z=d-F,A=M-C,x=O.j(d,M),U=w<0?-K:x}if(j=m-Math.min(S,x)+U,Z){let[K,q]=O.I(F,C),[l,k]=O.I(d,M);if(A=l-K||Number(k)-Number(q),Math.sign(A)===-w){let H=w<0&&-O.L(d);Z=(d-=w)-F,A=M-ui(K,q,O.U(d))+(H||O.L(d))}}}return[Z,A,j]})(this,...T,...a);return i===8&&(P+=this.J(f,T[0]),f=0),{...o,years:f,months:P,days:D}},dateFromFields(s,c){let i=g(c),T=fa(this,s),a=Pa(this,s,T,i),f=DD(this,s,a,T,i);return _(vs(this.P(T,a,f)),this.id||b)},yearMonthFromFields(s,c){let i=g(c),T=fa(this,s),a=Pa(this,s,T,i);return Cc(La(this.P(T,a,1)),this.id||b)},monthDayFromFields(s,c){let i=g(c),T=!this.id,{monthCode:a,year:f,month:P}=s,D,O,F,C,S;if(a!==void 0){[D,O]=sF(a),S=MD(s,"day");let d=this.N(D,O,S);if(!d)throw RangeError(OD);if([F,C]=d,P!==void 0&&P!==C)throw RangeError(cC);T&&(C=js("month",C,1,Ys,1),S=js("day",S,1,Ja(f!==void 0?f:F,C),i))}else{F=f===void 0&&T?Qc:fa(this,s),C=Pa(this,s,F,i),S=DD(this,s,C,F,i);let d=this.U(F);O=C===d,D=Sa(C,d);let M=this.N(D,O,S);if(!M)throw RangeError(OD);[F,C]=M}return vi(vs(this.P(F,C,S)),this.id||b)},fields(s){return da(this)&&s.includes("year")?[...s,...Za]:s},mergeFields(s,c){let i=Object.assign(Object.create(null),s);return Da(i,c,Vf),da(this)&&(Da(i,c,mS),this.id===$c&&Da(i,c,ZS,Za)),i},inLeapYear(s){let[c]=this.h(s);return this.K(c)},monthsInYear(s){let[c]=this.h(s);return this.L(c)},daysInMonth(s){let[c,i]=this.h(s);return this.j(c,i)},daysInYear(s){let[c]=this.h(s);return this.X(c)},dayOfYear:qf,era(s){return this.ee(s)[0]},eraYear(s){return this.ee(s)[1]},monthCode(s){let[c,i]=this.h(s),[T,a]=this.I(c,i);return((f,P)=>"M"+xs(f)+(P?"L":""))(T,a)},dayOfWeek:RD,daysInWeek(){return 7}},fd={dayOfYear:qf,h:XD,q:Uc},Pd=Object.assign({},fd,{weekOfYear:nO,yearOfWeek:eO,R(s){function c(M){return(7-M<T?7:0)-M}function i(M){let m=YD(d+M),Z=M||1,A=c(Di(O+m*Z,7));return C=(m+(A-F)*Z)/7}let T=this.id?1:4,a=RD(s),f=this.dayOfYear(s),P=Di(a-1,7),D=f-1,O=Di(P-D,7),F=c(O),C,S=Math.floor((D-F)/7)+1,d=s.isoYear;return S?S>i(0)&&(S=1,d++):(S=i(-1),d--),[S,d,C]}}),Dd={dayOfYear:qf,h:Ca,q:Si,weekOfYear:nO,yearOfWeek:eO,R(){return[]}},kc=z0(Object.assign({},SD,Pd,{h:XD,ee(s){return this.id===YT?_D(s):this.id===$c?LS(s):[]},I:(s,c)=>[c,0],N(s,c){if(!c)return[Qc,s]},K:Ka,U(){},L:UD,J:(s)=>s*Ys,j:Ja,X:YD,P:(s,c,i)=>({isoYear:s,isoMonth:c,isoDay:i}),q:Uc,_:(s,c,i)=>(s+=sT(i,Ys),(c+=Ea(i,Ys))<1?(s--,c+=Ys):c>Ys&&(s++,c-=Ys),[s,c]),year(s){return s.isoYear},month(s){return s.isoMonth},day:(s)=>s.isoDay}),Object.assign({},SD,Dd,{h:Ca,ee(s){let c=this.O(s);return[c.era,c.eraYear]},I(s,c){let i=Bi.call(this,s);return[Sa(c,i),i===c]},N(s,c,i){let[T,a,f]=Ca.call(this,{isoYear:Qc,isoMonth:Ys,isoDay:31}),P=Bi.call(this,T),D=a===P;(ks(s,Sa(a,P))||ks(Number(c),Number(D))||ks(i,f))===1&&T--;for(let O=0;O<100;O++){let F=T-O,C=Bi.call(this,F),S=ui(s,c,C);if(c===(S===C)&&i<=fD.call(this,F,S))return[F,S]}},K(s){let c=zi.call(this,s);return c>zi.call(this,s-1)&&c>zi.call(this,s+1)},U:Bi,L:Hi,J(s,c){let i=c+s,T=Math.sign(s),a=T<0?-1:0,f=0;for(let P=c;P!==i;P+=T)f+=Hi.call(this,P+a);return f},j:fD,X:zi,P(s,c,i){return PT(Si.call(this,s,c,i))},q:Si,_(s,c,i){if(i){if(c+=i,!Number.isSafeInteger(c))throw RangeError(lT);if(i<0)for(;c<1;)c+=Hi.call(this,--s);else{let T;for(;c>(T=Hi.call(this,s));)c-=T,s++}}return[s,c]},year(s){return this.O(s).year},month(s){let{year:c,F:i}=this.O(s),{C:T}=this.B(c);return T[i]+1},day(s){return this.O(s).day}})),os="numeric",vc=["timeZoneName"],KC={month:os,day:os},aP={year:os,month:os},fP=Object.assign({},aP,{day:os}),PP={hour:os,minute:os,second:os},DP=Object.assign({},fP,PP),Od=Object.assign({},DP,{timeZoneName:"short"}),Fd=Object.keys(aP),Cd=Object.keys(KC),Sd=Object.keys(fP),dd=Object.keys(PP),OP=["dateStyle"],Md=Fd.concat(OP),md=Cd.concat(OP),FP=Sd.concat(OP,["weekday"]),qi=dd.concat(["dayPeriod","timeStyle"]),CP=FP.concat(qi),Zd=CP.concat(vc),Ad=vc.concat(qi),wd=vc.concat(FP),jd=vc.concat(["day","weekday"],qi),xd=vc.concat(["year","weekday"],qi),Ed={},SP=[Ec(CP,DP),ST],lC=[Ec(Zd,Od),ST,0,(s,c)=>{let i=v(s.timeZone);if(c&&v(c.timeZone)!==i)throw RangeError(TC);return i}],dP=[Ec(CP,DP,vc),is],MP=[Ec(FP,fP,Ad),is],mP=[Ec(qi,PP,wd),(s)=>rs(s)/Ks],ZP=[Ec(Md,aP,jd),is,1],AP=[Ec(md,KC,xd),is,1],dD;function Qs(s,c,i,T,a){function f(...O){if(!(this instanceof f))throw TypeError(Hf);UC(this,c(...O))}function P(O,F){return Object.defineProperties(function(...C){return O.call(this,D(this),...C)},wa(F))}function D(O){let F=n(O);if(!F||F.branding!==s)throw TypeError(Hf);return F}return Object.defineProperties(f.prototype,{...mD(gs(P,i)),...dc(gs(P,T)),...ei("Temporal."+s)}),Object.defineProperties(f,{...dc(a),...wa(s)}),[f,(O)=>{let F=Object.create(f.prototype);return UC(F,O),F},D]}function _C(s){return s=s.concat("id").sort(),(c)=>{if(!ZD(c,s))throw TypeError(iC);return c}}function uc(s){if(n(s)||s.calendar!==void 0||s.timeZone!==void 0)throw TypeError(nF);return s}function pT(s,c){let i={};for(let T in s)i[T]=({o:a},f)=>{let P=n(f)||{},{branding:D}=P,O=D===gc||c.includes(D)?P:Ps(f);return a[T](O)};return i}function xP(s){let c={};for(let i in s)c[i]=(T)=>{let{calendar:a}=T;return(f=a,typeof f=="string"?kc(f):(P=f,Object.assign(Object.create(Yd),{i:P})))[i](T);var f,P};return c}function Dc(){throw TypeError(sC)}function Ki({calendar:s}){return typeof s=="string"?new qP(s):s}function $C(s,c){if(c=Y(c),V(s)){let T=n(s);if(T&&T.branding===hc)return g(c),T;let a=HC(s);return lf(rT(a||b),!a,s,c)}let i=WO(kc,s);return g(c),i}function BC(s,c,i){return T=c.call(s,fs(h(i))),ua(Ai(T));var T}function VT(s,c=hC){let i=Object.keys(c).sort(),T={};for(let a of i)T[a]=E(c[a],s,wC(s[a]));return T}function G(s,c){return typeof s=="string"?HT(s):VT(s,c)}function z(s){return G(s,jP)}function ls(s){if(V(s)){let c=n(s);if(c)switch(c.branding){case BT:return c;case Vs:return h(c.epochNanoseconds)}}return xO(s)}function QC(s,c,i){let T=c.l(ls(i).epochNanoseconds,s);return T?fs(h(T)):null}function L(s){return V(s)?(n(s)||{}).timeZone||Nd(s):((c)=>WT(qO($(c))))(s)}function Tc(s,c){if(V(s)){let i=n(s)||{};switch(i.branding){case _T:return g(c),i;case yc:return g(c),Gs(i);case Vs:return g(c),Rf(z,i)}return DF(s,c)}return g(c),GO(s)}function EP(s){return s===void 0?void 0:Tc(s)}function oc(s,c){if(c=Y(c),V(s)){let T=n(s);return T&&T.branding===Vc?(g(c),T):Kf(oT(li(s)),s,c)}let i=yO(kc,s);return g(c),i}function ac(s,c){if(c=Y(c),V(s)){let T=n(s)||{};switch(T.branding){case yc:return g(c),T;case gc:return g(c),R({...T,...bs});case Vs:return g(c),Uf(z,T)}return PF(tT(li(s)),s,c)}let i=gO(s);return g(c),i}function Ps(s,c){if(c=Y(c),V(s)){let T=n(s)||{};switch(T.branding){case gc:return g(c),T;case yc:return g(c),_(T);case Vs:return g(c),Yf(z,T)}return Jf(tT(li(s)),s,c)}let i=gT(s);return g(c),i}function zC(s,c,i){return ys(c.call(s,X(_(i,s))))}function Xs(s){return(c)=>typeof c=="string"?kc(c):((i,T)=>{let a=Object.keys(T).sort(),f={};for(let P of a)f[P]=E(T[P],i,i[P]);return f})(c,s)}function Q(s){if(V(s)){let c=n(s);return c&&c.branding===zT?c:OF(s)}return IO(s)}function Ji(s){if(s!==void 0){if(V(s)){let c=n(s)||{};switch(c.branding){case Vs:case gc:return c;case yc:return _(c)}let i=li(s);return{...aF(L,G,tT(i),s),calendar:i}}return EO(s)}}function li(s){return HC(s)||b}function HC(s){let{calendar:c}=s;if(c!==void 0)return u(c)}function u(s){return V(s)?(n(s)||{}).calendar||TM(s):((c)=>xi(LO($(c))))(s)}function tc(s,c){if(c=Y(c),V(s)){let i=n(s);if(i&&i.branding===Vs)return wi(c),i;let T=li(s);return fF(L,G,tT(T),T,s,c)}return bO(s,c)}function XC(s){return gs((c)=>(i)=>c(wP(i)),s)}function wP(s){return Ts(s,z)}function bd(){let s=ic.prototype,c=Object.getOwnPropertyDescriptors(s),i=Object.getOwnPropertyDescriptors(ic),T=function(a,f={}){if(!(this instanceof T))return new T(a,f);JP.set(this,((P,D={})=>{let O=new ic(P,D),F=O.resolvedOptions(),C=F.locale,S=Ms(Object.keys(D),F),d=Ss(Wd),M=(...m)=>{let Z,A=m.map((j,w)=>{let x=n(j),U=(x||{}).branding;if(w&&Z&&Z!==U)throw TypeError(fC);return Z=U,x});return Z?d(Z)(C,S,...A):[O,...m]};return M.u=O,M})(a,f))};for(let a in c){let f=c[a],P=a.startsWith("format")&&gd(a);typeof f.value=="function"?f.value=a==="constructor"?T:P||yd(a):P&&(f.get=function(){return P.bind(this)})}return i.prototype.value=Object.create(s,c),Object.defineProperties(T,i),T}function gd(s){return function(...c){let i=JP.get(this),[T,...a]=i(...c);return T[s](...a)}}function yd(s){return function(...c){return JP.get(this).u[s](...c)}}function Wd(s){let c=Gd[s];if(!c)throw TypeError(aC(s));return Hs(c,Ss(_f))}var Gd={Instant:SP,PlainDateTime:dP,PlainDate:MP,PlainTime:mP,PlainYearMonth:ZP,PlainMonthDay:AP},Id=Hs(SP),Ld=Hs(lC),qd=Hs(dP),Jd=Hs(MP),Kd=Hs(mP),ld=Hs(ZP),$d=Hs(AP),bP={era:gD,eraYear:ba,year:Ai,month:ys,daysInMonth:ys,daysInYear:ys,inLeapYear:AC,monthsInYear:ys},kT={monthCode:$},gP={day:ys},NC={dayOfWeek:ys,dayOfYear:ys,weekOfYear:yD,yearOfWeek:ba,daysInWeek:ys},pC=Object.assign({},bP,kT,gP,NC),hT=new WeakMap,n=hT.get.bind(hT),UC=hT.set.bind(hT),Qd={...pT(bP,[Vc]),...pT(NC,[]),...pT(kT,[Vc,hc]),...pT(gP,[hc])},yP=xP(pC),Xd=xP({...bP,...kT}),Ud=xP({...kT,...gP}),$i={calendarId:(s)=>v(s.calendar)},Yd=gs((s,c)=>function(i){let{i:T}=this;return s(T[c](X(_(i,T))))},pC),Rd=mi((s)=>(c)=>c[s],y.concat("sign")),WP=mi((s,c)=>(i)=>i[Ls[c]],ps),VC={epochSeconds:hD,epochMilliseconds:ST,epochMicroseconds:kD,epochNanoseconds:vD},Qi=E(ja,new Set(["branding"])),[_d,rc,Bd]=Qs(hc,E(gF,u),{...$i,...Ud},{getISOFields:Qi,getCalendar:Ki,with(s,c,i){return rc(MF(sM,s,this,uc(c),i))},equals:(s,c)=>NO(s,$C(c)),toPlainDate(s,c){return X(YF(Xi,s,this,c))},toLocaleString(s,c,i){let[T,a]=$d(c,i,s);return T.format(a)},toString:ka,toJSON:(s)=>ka(s),valueOf:Dc},{from:(s,c)=>rc($C(s,c))}),hC={getOffsetNanosecondsFor:BC,getPossibleInstantsFor(s,c,i){let T=[...c.call(s,r(R(i,b)))].map((f)=>Hd(f).epochNanoseconds),a=T.length;return a>1&&(T.sort(cs),na(As(Zs(T[0],T[a-1])))),T}},jP={getOffsetNanosecondsFor:BC},[zd,fs,Hd]=Qs(BT,wF,VC,{add:(s,c)=>fs(ea(0,s,Q(c))),subtract:(s,c)=>fs(ea(1,s,Q(c))),until:(s,c,i)=>I(bf(0,s,ls(c),i)),since:(s,c,i)=>I(bf(1,s,ls(c),i)),round:(s,c)=>fs(rD(s,c)),equals:(s,c)=>RO(s,ls(c)),toZonedDateTime(s,c){let i=Bs(c);return B(Xf(s,L(i.timeZone),u(i.calendar)))},toZonedDateTimeISO:(s,c)=>B(Xf(s,L(c))),toLocaleString(s,c,i){let[T,a]=Id(c,i,s);return T.format(a)},toString:(s,c)=>Ha(L,z,s,c),toJSON:(s)=>Ha(L,z,s),valueOf:Dc},{from:(s)=>fs(ls(s)),fromEpochSeconds:(s)=>fs(BF(s)),fromEpochMilliseconds:(s)=>fs(zF(s)),fromEpochMicroseconds:(s)=>fs(HF(s)),fromEpochNanoseconds:(s)=>fs(NF(s)),compare:(s,c)=>jf(ls(s),ls(c))}),[vT,eM]=Qs("TimeZone",(s)=>{let c=UO(s);return{branding:"TimeZone",id:c,o:HT(c)}},{id:(s)=>s.id},{getPossibleInstantsFor:({o:s},c)=>s.getPossibleInstantsFor(ac(c)).map((i)=>fs(h(i))),getOffsetNanosecondsFor:({o:s},c)=>s.getOffsetNanosecondsFor(ls(c).epochNanoseconds),getOffsetStringFor(s,c){let i=ls(c).epochNanoseconds,T=VT(this,jP).getOffsetNanosecondsFor(i);return Zc(T)},getPlainDateTimeFor(s,c,i=b){let T=ls(c).epochNanoseconds,a=VT(this,jP).getOffsetNanosecondsFor(T);return r(R(ns(T,a),u(i)))},getInstantFor(s,c,i){let T=ac(c),a=la(i),f=VT(this);return fs(h(ds(f,T,a)))},getNextTransition:({o:s},c)=>QC(1,s,c),getPreviousTransition:({o:s},c)=>QC(-1,s,c),equals(s,c){return!!IT(this,L(c))},toString:(s)=>s.id,toJSON:(s)=>s.id},{from(s){let c=L(s);return typeof c=="string"?new vT(c):c}}),Nd=_C(Object.keys(hC)),[pd,fc]=Qs(_T,yF,WP,{getISOFields:Qi,with(s,c,i){return fc(mF(this,uc(c),i))},add:(s,c)=>fc(ff(0,s,Q(c))),subtract:(s,c)=>fc(ff(1,s,Q(c))),until:(s,c,i)=>I(If(0,s,Tc(c),i)),since:(s,c,i)=>I(If(1,s,Tc(c),i)),round:(s,c)=>fc(eD(s,c)),equals:(s,c)=>pO(s,Tc(c)),toZonedDateTime:(s,c)=>B(RF(L,Ps,G,s,c)),toPlainDateTime:(s,c)=>r(_F(s,Ps(c))),toLocaleString(s,c,i){let[T,a]=Kd(c,i,s);return T.format(a)},toString:va,toJSON:(s)=>va(s),valueOf:Dc},{from:(s,c)=>fc(Tc(s,c)),compare:(s,c)=>GT(Tc(s),Tc(c))}),[Vd,Pc,hd]=Qs(Vc,E(bF,u),{...$i,...Xd},{getISOFields:Qi,getCalendar:Ki,with(s,c,i){return Pc(dF(ed,s,this,uc(c),i))},add:(s,c,i)=>Pc(af(YC,0,s,Q(c),i)),subtract:(s,c,i)=>Pc(af(YC,1,s,Q(c),i)),until:(s,c,i)=>I(Gf(RC,0,s,oc(c),i)),since:(s,c,i)=>I(Gf(RC,1,s,oc(c),i)),equals:(s,c)=>HO(s,oc(c)),toPlainDate(s,c){return X(UF(Xi,s,this,c))},toLocaleString(s,c,i){let[T,a]=ld(c,i,s);return T.format(a)},toString:ha,toJSON:(s)=>ha(s),valueOf:Dc},{from:(s,c)=>Pc(oc(s,c)),compare:(s,c)=>jc(oc(s),oc(c))}),[kd,r]=Qs(yc,E(xF,u),{...$i,...yP,...WP},{getISOFields:Qi,getCalendar:Ki,with(s,c,i){return r(CF(Xi,s,this,uc(c),i))},withCalendar:(s,c)=>r(KT(s,u(c))),withPlainDate:(s,c)=>r(kF(s,Ps(c))),withPlainTime:(s,c)=>r(hF(s,EP(c))),add:(s,c,i)=>r(cf(Gc,0,s,Q(c),i)),subtract:(s,c,i)=>r(cf(Gc,1,s,Q(c),i)),until:(s,c,i)=>I(yf($s,0,s,ac(c),i)),since:(s,c,i)=>I(yf($s,1,s,ac(c),i)),round:(s,c)=>r(nD(s,c)),equals:(s,c)=>BO(s,ac(c)),toZonedDateTime:(s,c,i)=>B(qF(G,s,L(c),i)),toPlainDate:(s)=>X(_(s)),toPlainTime:(s)=>fc(Gs(s)),toPlainYearMonth(s){return Pc(JF(oT,s,this))},toPlainMonthDay(s){return rc(KF(rT,s,this))},toLocaleString(s,c,i){let[T,a]=qd(c,i,s);return T.format(a)},toString:pa,toJSON:(s)=>pa(s),valueOf:Dc},{from:(s,c)=>r(ac(s,c)),compare:(s,c)=>Ef(ac(s),ac(c))}),[vd,X,kC]=Qs(gc,E(EF,u),{...$i,...yP},{getISOFields:Qi,getCalendar:Ki,with(s,c,i){return X(SF(Xi,s,this,uc(c),i))},withCalendar:(s,c)=>X(KT(s,u(c))),add:(s,c,i)=>X(Tf(Gc,0,s,Q(c),i)),subtract:(s,c,i)=>X(Tf(Gc,1,s,Q(c),i)),until:(s,c,i)=>I(Wf($s,0,s,Ps(c),i)),since:(s,c,i)=>I(Wf($s,1,s,Ps(c),i)),equals:(s,c)=>zO(s,Ps(c)),toZonedDateTime(s,c){let i=!V(c)||c instanceof vT?{timeZone:c}:c;return B(lF(L,Tc,G,s,i))},toPlainDateTime:(s,c)=>r($F(s,EP(c))),toPlainYearMonth(s){return Pc(QF(oT,s,this))},toPlainMonthDay(s){return rc(XF(rT,s,this))},toLocaleString(s,c,i){let[T,a]=Jd(c,i,s);return T.format(a)},toString:Va,toJSON:(s)=>Va(s),valueOf:Dc},{from:(s,c)=>X(Ps(s,c)),compare:(s,c)=>jc(Ps(s),Ps(c))}),GP={fields(s,c,i){return[...c.call(s,i)]}},vC=Object.assign({dateFromFields(s,c,i,T){return kC(c.call(s,Object.assign(Object.create(null),i),T))}},GP),oC=Object.assign({yearMonthFromFields(s,c,i,T){return hd(c.call(s,Object.assign(Object.create(null),i),T))}},GP),tC=Object.assign({monthDayFromFields(s,c,i,T){return Bd(c.call(s,Object.assign(Object.create(null),i),T))}},GP),IP={mergeFields(s,c,i,T){return Bs(c.call(s,Object.assign(Object.create(null),i),Object.assign(Object.create(null),T)))}},od=Object.assign({},vC,IP),td=Object.assign({},oC,IP),rd=Object.assign({},tC,IP),LP={dateAdd(s,c,i,T,a){return kC(c.call(s,X(_(i,s)),I(J(T)),a))}},rC=Object.assign({},LP,{dateUntil(s,c,i,T,a,f){return iM(c.call(s,X(_(i,s)),X(_(T,s)),Object.assign(Object.create(null),f,{largestUnit:Wi[a]})))}}),ud=Object.assign({},LP,{day:zC}),nd=Object.assign({},rC,{day:zC}),oT=Xs(oC),tT=Xs(vC),rT=Xs(tC),ed=Xs(td),Xi=Xs(od),sM=Xs(rd),Gc=Xs(LP),$s=Xs(rC),YC=Xs(ud),RC=Xs(nd),[cM,I,iM]=Qs(zT,WF,{...Rd,blank:AO},{with:(s,c)=>I(ZF(s,c)),negated:(s)=>I(ET(s)),abs:(s)=>I(ZO(s)),add:(s,c,i)=>I(Cf(Ji,$s,G,0,s,Q(c),i)),subtract:(s,c,i)=>I(Cf(Ji,$s,G,1,s,Q(c),i)),round:(s,c)=>I(mO(Ji,$s,G,s,c)),total:(s,c)=>tD(Ji,$s,G,s,c),toLocaleString(s,c,i){return Intl.DurationFormat?new Intl.DurationFormat(c,i).format(this):ZT(s)},toString:ZT,toJSON:(s)=>ZT(s),valueOf:Dc},{from:(s)=>I(Q(s)),compare:(s,c,i)=>YO(Ji,Gc,G,Q(s),Q(c),i)}),uC={toString:(s)=>s.id,toJSON:(s)=>s.id,...Qd,dateAdd:({id:s,o:c},i,T,a)=>X(_(c.dateAdd(Ps(i),Q(T),a),s)),dateUntil:({o:s},c,i,T)=>I(J(s.dateUntil(Ps(c),Ps(i),zD(T)))),dateFromFields:({id:s,o:c},i,T)=>X(Jf(c,i,T,bD(s))),yearMonthFromFields:({id:s,o:c},i,T)=>Pc(Kf(c,i,T,xD(s))),monthDayFromFields:({id:s,o:c},i,T)=>rc(lf(c,0,i,T,ED(s))),fields({o:s},c){let i=new Set(Is),T=[];for(let a of c){if($(a),!i.has(a))throw RangeError(zf(a));i.delete(a),T.push(a)}return s.fields(T)},mergeFields:({o:s},c,i)=>s.mergeFields(xa(ga(c)),xa(ga(i)))},[qP]=Qs("Calendar",(s)=>{let c=uO(s);return{branding:"Calendar",id:c,o:kc(c)}},{id:(s)=>s.id},uC,{from(s){let c=u(s);return typeof c=="string"?new qP(c):c}}),TM=_C(Object.keys(uC).slice(4)),[aM,B]=Qs(Vs,E(jF,u,L),{...VC,...$i,...XC(yP),...XC(WP),offset:(s)=>Zc(wP(s).offsetNanoseconds),offsetNanoseconds:(s)=>wP(s).offsetNanoseconds,timeZoneId:(s)=>v(s.timeZone),hoursInDay:(s)=>sO(G,s)},{getISOFields:(s)=>dO(z,s),getCalendar:Ki,getTimeZone:({timeZone:s})=>typeof s=="string"?new vT(s):s,with(s,c,i){return B(FF(Xi,G,s,this,uc(c),i))},withCalendar:(s,c)=>B(KT(s,u(c))),withTimeZone:(s,c)=>B(vF(s,L(c))),withPlainDate:(s,c)=>B(VF(G,s,Ps(c))),withPlainTime:(s,c)=>B(pF(G,s,EP(c))),add:(s,c,i)=>B(sf(Gc,G,0,s,Q(c),i)),subtract:(s,c,i)=>B(sf(Gc,G,1,s,Q(c),i)),until:(s,c,i)=>I(J(gf($s,G,0,s,tc(c),i))),since:(s,c,i)=>I(J(gf($s,G,1,s,tc(c),i))),round:(s,c)=>B(uD(G,s,c)),startOfDay:(s)=>B(cO(G,s)),equals:(s,c)=>_O(s,tc(c)),toInstant:(s)=>fs(GF(s)),toPlainDateTime:(s)=>r(Uf(z,s)),toPlainDate:(s)=>X(Yf(z,s)),toPlainTime:(s)=>fc(Rf(z,s)),toPlainYearMonth(s){return Pc(IF(oT,s,this))},toPlainMonthDay(s){return rc(LF(rT,s,this))},toLocaleString(s,c,i={}){let[T,a]=Ld(c,i,s);return T.format(a)},toString:(s,c)=>Na(z,s,c),toJSON:(s)=>Na(z,s),valueOf:Dc},{from:(s,c)=>B(tc(s,c)),compare:(s,c)=>xf(tc(s),tc(c))}),fM=Object.defineProperties({},{...ei("Temporal.Now"),...dc({timeZoneId:()=>Ns(),instant:()=>fs(h(bi())),zonedDateTime:(s,c=Ns())=>B(t(bi(),L(c),u(s))),zonedDateTimeISO:(s=Ns())=>B(t(bi(),L(s),b)),plainDateTime:(s,c=Ns())=>r(R(Nc(z(L(c))),u(s))),plainDateTimeISO:(s=Ns())=>r(R(Nc(z(L(s))),b)),plainDate:(s,c=Ns())=>X(_(Nc(z(L(c))),u(s))),plainDateISO:(s=Ns())=>X(_(Nc(z(L(s))),b)),plainTimeISO:(s=Ns())=>fc(Gs(Nc(z(L(s)))))})}),Ui=Object.defineProperties({},{...ei("Temporal"),...dc({PlainYearMonth:Vd,PlainMonthDay:_d,PlainDate:vd,PlainTime:pd,PlainDateTime:kd,ZonedDateTime:aM,Instant:zd,Calendar:qP,TimeZone:vT,Duration:cM,Now:fM})}),PM=bd(),JP=new WeakMap,DM=Object.defineProperties(Object.create(Intl),dc({DateTimeFormat:PM}));class KP extends Us{schema={name:{string:"Invalid name",required:"Name is required","min:2":"Name must be at least 3 characters"},email:{string:"Invalid email",required:"Email is required",email:"Invalid email"},password:{"min:8":"Password must be at least 9 characters"}}}function Dm(s){return s}function nC(s={}){return{basePath:"/auth",verifyEmail:!0,redirectPath:"/dashboard",sessionExpiresInHours:24,sessionAbsoluteExpiresInHours:672,signUpRequest:KP,oauthProviders:{},verifyPassword:async(c,i)=>await Bun.password.verify(c,i),hashPassword:async(c)=>await Bun.password.hash(c),generateForgotPasswordToken:async(c)=>{let i=new Bun.CryptoHasher("sha256");return i.update(`${c.email}${Date.now()}`),i.digest("hex")},generateEmailVerificationToken:(c)=>{if(!(s.verifyEmail??!0))return"";let i=new Bun.CryptoHasher("sha256");return i.update(`${c}${Date.now()}`),i.digest("hex")},generateMagicLinkToken:(c)=>{let i=new Bun.CryptoHasher("sha256");return i.update(`${c}${Date.now()}`),i.digest("hex")},extendSession:()=>({}),onUserCreated:async()=>{},onSignUp:()=>{},onSignIn:()=>{},onSignOut:()=>{},onForgotPassword:()=>{},onResetPassword:()=>{},onMagicLinkCreated:()=>{}}}function eC(s){if(s&&typeof s==="object")delete s.password;return s}function OM(){return new Proxy({},{get:(s,c)=>s0(c)})}var lP={select:{id:!0,publicId:!0,email:!0,name:!0,locale:!0,globalRole:!0,accounts:{select:{id:!0,publicId:!0,organizationRole:!0,organization:!0}}}};class $P{models;constructor(s=OM()){this.models=s}run(s){return this.models.User.asSystem(s)}transaction(s){return this.models.User.transaction(s)}async createUser(s){let c=await this.run(()=>this.models.User.create({data:s}));return eC(c)}async updateUserPassword(s){let c=await this.run(()=>this.models.User.update({where:{id:s.id},data:{password:s.password}}));return eC(c)}async findUserByEmailAddress(s,c){return await this.run(()=>this.models.User.findUnique({where:c?{email:s,emailVerifiedAt:{not:null}}:{email:s}}))}async findUserByVerificationToken(s){return await this.run(()=>this.models.User.findFirst({where:{verificationToken:s}}))}async verifyUser(s){return await this.run(()=>this.models.User.update({where:{email:s},data:{emailVerifiedAt:new Date}}))}async createSession(s){return await this.run(()=>this.models.Session.create({data:s,include:{user:!0}}))}async createSessionV2(s){return await this.run(()=>this.models.Session.create({data:s,select:{token:!0,expiresAt:!0,absoluteExpiresAt:!0,updatedAt:!0,location:!0,userAgent:!0,user:lP}}))}async findSession(s){if(!s.token)return null;try{return await this.run(()=>this.models.Session.findUnique({where:{token:s.token},select:{token:!0,expiresAt:!0,absoluteExpiresAt:!0,updatedAt:!0,location:!0,userAgent:!0,user:lP}}))}catch(c){return console.error("findSession failed:",c),null}}async updateSession(s){return await this.run(()=>this.models.Session.update({where:{token:s.token},data:{expiresAt:s.expiresAt},select:{token:!0,expiresAt:!0,absoluteExpiresAt:!0,updatedAt:!0,location:!0,userAgent:!0,user:lP}}))}async deleteSession(s){await this.run(()=>this.models.Session.deleteMany({where:{token:s.token}}))}async deleteAllUserSessions(s){await this.run(()=>this.models.Session.deleteMany({where:{userId:s}}))}async createPasswordResetToken(s){return await this.run(()=>this.models.PasswordResetToken.create({data:{token:s.token,user:{connect:{id:s.user.id}}}}))}async findPasswordResetToken(s){return await this.run(()=>this.models.PasswordResetToken.findUnique({where:{token:s.token},include:{user:!0}}))}async deletePasswordResetToken(s){return await this.run(()=>this.models.PasswordResetToken.delete({where:{token:s.token}}))}async findInvitation(s,c){return await this.run(()=>this.models.OrganizationInvitation.findFirst({where:{publicId:s,email:c}}))}async deleteInvitationById(s){await this.run(()=>this.models.OrganizationInvitation.delete({where:{publicId:s}}))}async createAccount(s){return await this.run(()=>this.models.Account.create({data:{userId:s.userId,organizationId:s.organizationId,organizationRole:s.organizationRole}}))}async createMagicLinkToken(s){return await this.run(()=>this.models.MagicLinkToken.create({data:{email:s.email,token:s.token,pin:s.pin}}))}async findUserMagicLinkToken(s){return await this.run(()=>s.token?this.models.MagicLinkToken.findUnique({where:{token_email:{token:s.token,email:s.email}}}):this.models.MagicLinkToken.findUnique({where:{pin_email:{pin:s.pin,email:s.email}}}))}async deleteMagicLinkToken(s){await this.run(()=>this.models.MagicLinkToken.deleteMany({where:{email:s}}))}async createSocialAccount(s){return await this.run(()=>this.models.SocialAccount.create({data:s}))}}class QP{static token="auth";config;provider;constructor(s={},c=new $P){this.config=c0(nC(s),s),this.provider=c}get userProvider(){return this.provider}async getSession(s,c){let i=await this.userProvider.findSession({token:s,userAgent:c}),T=null;if(i?.user)T=await this.config.extendSession(i.user),i.user.extension=T;return i}async generateMagicLink(s){}async upsertSession(s){await this.userProvider.findSession({token:"",userAgent:""})}async authenticate(s){try{let c=await this.userProvider.findUserByEmailAddress(s,!1);if(!c)throw Error(`User not found with email: ${s}`);let i=await this.createOrUpdateSession({email:s,id:c.id}),T=new Us,a=new URL(T.rawRequest.url);if(T.ctx().setCookie("access_token",i.token,{expires:i.expiresAt,secure:!a.origin.includes("localhost"),httpOnly:!0}),i?.user)i.user.extension=await this.config.extendSession(i.user);return i}catch(c){console.log(c)}}async createOrUpdateSessionV2(s){let c=await this.createOrUpdateSession(s),i=null;if(c?.user)i=await this.config.extendSession(c.user),c.user.extension=i;return c}async createOrUpdateSession(s){let c=new Us,i=c.headers.get("User-Agent"),T=new Bun.CryptoHasher("sha256");T.update(`${s.email}${i}`);let a=T.digest("hex"),f=await this.userProvider.findSession({token:a,userAgent:Bun.env.NODE_ENV==="development"?"local":c.headers.get("User-Agent")});if(!f){let P=s.id;if(!P){let{id:D}=await this.userProvider.findUserByEmailAddress(s.email,!1);P=D}f=await this.userProvider.createSessionV2({token:a,userId:P,userAgent:Bun.env.NODE_ENV==="development"?"local":c.headers.get("User-Agent"),expiresAt:new Date(Ui.Now.instant().add({hours:this.config.sessionExpiresInHours}).toString()),absoluteExpiresAt:new Date(Ui.Now.instant().add({hours:this.config.sessionAbsoluteExpiresInHours}).toString())})}else f=await this.userProvider.updateSession({token:a,expiresAt:new Date(Ui.Now.instant().add({hours:this.config.sessionExpiresInHours}).toString())});return f}async createMagicLinkToken(s){let c=await this.userProvider.findUserByEmailAddress(s,!1);if(c){await this.userProvider.deleteMagicLinkToken(s);let i=await this.config.generateMagicLinkToken(s),T=(Number.parseInt(FM(4).toString("hex"),16)%1e6).toString().padStart(6,"0");return await this.userProvider.createMagicLinkToken({email:s,token:i,pin:T}),{user:c,email:s,pin:T,token:i}}return{}}}class i0 extends ms{async run(s){let c=hs.getStore(),i=c.req.cookies.get("access_token"),T=c.req.headers.get("access_token"),a=i||T;if(!a)throw new ai;let f=c.user;if(!f){let P=await uT(QP).getSession(a,c.req.headers.get("User-Agent"));if(!P)throw new ai;f=P?.user,c.setUser(f)}return{}}}class T0 extends ms{async run(...s){let[c="public",i="864000",...T]=s,a=`${c}, max-age=${i}${T.length>0?", ":""}${T.join(", ")}`;if(s.length===0)a="public, max-age=864000, stale-while-revalidate=300, stale-if-error=600";if(s.length===1&&s[0]==="public")a="public, max-age=864000, stale-while-revalidate=300, stale-if-error=600";if(s.length===1&&s[0]==="private")a="private, max-age=0, stale-while-revalidate=300, stale-if-error=600";if(this.req.rawRequest.method==="GET")this.req.ctx().setHeaders("Cache-Control",a);return{}}}var CM={"Access-Control-Allow-Methods":"GET, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Allow-Credentials":"true"};class a0 extends ms{config={origins:{"":{"Access-Control-Allow-Methods":"GET, HEAD, POST, PUT, DELETE, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization, X-Requested-With","Access-Control-Allow-Credentials":"true"}}};run(){let s=this.req,c=s.rawRequest.headers.get("Origin");if(this.config.origins[c]){s.ctx().setHeaders("Access-Control-Allow-Origin",c);let i={...CM,...this.config.origins[c]};for(let[T,a]of Object.entries(i))s.ctx().setHeaders(T,a)}return{}}}class nT{config;static token="ratelimiter";constructor(s){this.config=s}get driver(){return this.config.driver}async consume(s,c={}){let i=c.limit??this.config.limit,T=c.window??this.config.window,a=c.cost??1;if(f0("window",T),f0("limit",i),!Number.isFinite(a)||a<0)throw Error(`Rate limiter cost must be zero or greater, got ${a}`);return await this.config.driver.consume({key:s,limit:i,window:T*1000,cost:a})}}function f0(s,c){if(!Number.isFinite(c)||c<=0)throw Error(`Rate limiter ${s} must be greater than zero, got ${c}`)}class XP extends N{constructor(s){super("Rate limit exceeded");let c={"Content-Type":"application/json",...s?F0(s):{}};this.payload={api:{status:429,data:{error:{message:"Rate limit exceeded"}},headers:c},view:{error:{message:"Rate limit exceeded"},status:429,headers:c}}}}class D0 extends ms{async run(s,c){let i=SM();if(!i)return{};let T=await i.consume(this.key(),{limit:P0(s)??this.config.limit,window:P0(c)??this.config.window});if(this.config.headers!==!1){let a=this.req.ctx?.();if(a)for(let[f,P]of Object.entries(F0(T)))a.setHeaders(f,P)}if(!T.allowed)throw new XP(T);return{}}key(){if(this.config.key)return this.config.key(this.req);return`${O0(this.req)}:${this.req.routePath??"*"}`}}function SM(){try{let s=uT();return s.bound(nT)?s.make(nT):null}catch{return null}}function O0(s){let c=s.headers.get("x-forwarded-for");if(c){let[i]=c.split(",");if(i?.trim())return i.trim()}return s.headers.get("x-real-ip")?.trim()||"unknown"}function F0(s){let c={"X-RateLimit-Limit":String(s.limit),"X-RateLimit-Remaining":String(s.remaining),"X-RateLimit-Reset":String(Math.ceil(s.resetAt/1000))};if(!s.allowed)c["Retry-After"]=String(Math.max(1,Math.ceil(s.retryAfter/1000)));return c}function P0(s){if(s===void 0||s===null||s==="")return;let c=Number(s);if(!Number.isFinite(c)||c<=0)return;return c}class C0 extends ms{async run(){let s=this.req.cookies.get("csrf_token");if(!s)throw new UP;if(!["POST","PUT","PATCH","DELETE"].includes(this.req.rawRequest.method))return{};if(!Bun.CSRF.verify(s,{secret:process.env.SECRET}))throw new UP;return{}}}class UP extends N{constructor(){super("Invalid CSRF token");this.name="InvalidCSRFTokenError"}payload={api:{status:403,data:{error:"Invalid CSRF token"}},view:{}}}class S0{policiesList={};constructor(){let s=this.register();for(let c of s){let i=new c;this.policiesList[c.name]=i}}register(){return[]}}class d0{all(s,c){return!0}}export{eT as Id,YP as Jd,RP as Kd,si as Ld,sa as Md,m0 as Nd,Z0 as Od,ca as Pd,ci as Qd,ZM as Rd,N as Sd,ii as Td,Us as Ud,Ti as Vd,ia as Wd,_P as Xd,BP as Yd,Ri as Zd,zP as _d,ai as $d,kP as ae,vP as be,aa as ce,g0 as de,fi as ee,ms as fe,y0 as ge,W0 as he,G0 as ie,Ui as je,Dm as ke,nC as le,$P as me,QP as ne,i0 as oe,T0 as pe,a0 as qe,nT as re,XP as se,D0 as te,O0 as ue,C0 as ve,S0 as we,d0 as xe};
3
-
4
- //# debugId=FC7C510E80513D9364756E2164756E21
@@ -1,5 +0,0 @@
1
- // @bun
2
- import{Db as Q,Fb as I,Hb as m,Ib as l,Jb as p,Lb as b,ub as u,vb as $}from"./chunk-tzsnadg1.js";import{Sb as H}from"./chunk-17m5wxv0.js";import{Ub as S,ac as L,gc as q,hc as U,ic as T,oc as R,qc as E,rc as W,wc as k}from"./chunk-r9h6aj7g.js";import{Gc as v}from"./chunk-g5pj95dz.js";import{ie as w,ne as M,re as j}from"./chunk-6fc909z5.js";import{_e as Y}from"./chunk-btr9kyqh.js";import{df as J}from"./chunk-jny4f23c.js";import{ff as y,if as A}from"./chunk-mqwrmbh4.js";async function a(x){try{if(!await x.shouldRun.call(x))return}catch(B){console.error(`Error evaluating shouldRun for cron job ${x.name}:`,B);return}try{await x.onTick.call(x)}catch(B){console.error(`Error executing cron job ${x.name}:`,B)}try{await x.callback.call(x)}catch(B){console.error(`Error in cron job ${x.name}:`,B)}try{await x.onComplete.call(x)}catch(B){console.error(`Error completing cron job ${x.name}:`,B)}}class V{static token="scheduler";handles=[];resolved;constructor(x){this.resolved=x.jobs}get jobs(){return[...this.resolved]}useJobs(x){this.resolved=x}start(x=(B)=>B()){if(this.resolved.length===0)return;let B=globalThis.__gemiCronJobs??=new Map,C=new Map;for(let F of this.resolved){let G=new F;if(!G.name){console.error(`Cron job must have a name \u2014 ${F.name||"an anonymous class"} has none, so it is not scheduled. If this is a base class that other jobs extend, move it out of the discovered directory: \`abstract\` does not survive to runtime, so a class under app/cron is indistinguishable from a job.`);continue}if(!G.cron){console.error(`Cron job must have an expression. Job: ${G.name}`);continue}let P=C.get(G.name);if(P!==void 0){console.error(`Two cron jobs claim the name "${G.name}" \u2014 ${P} is scheduled and ${F.name||"an anonymous class"} is not. A name is the scheduler's key, so only one job can hold it. Rename one.`);continue}C.set(G.name,F.name||"an anonymous class"),B.get(G.name)?.stop();let X=Bun.cron(G.cron,()=>x(()=>a(G)));B.set(G.name,X),this.handles.push(X)}}stop(){for(let x of this.handles)x.stop();this.handles=[]}}class n extends H{register(){this.app.singleton(M,()=>new M(this.app.config.get("auth",{})))}}class t extends H{register(){this.app.singleton(V,()=>new V(Y(Q(),this.app.config.get("schedule",{}))))}async boot(){let x=this.app.make(V),B=this.app.config.get("schedule",{});if(B.jobs===void 0){let{jobsDir:F}=Y(Q(),B);x.useJobs(await p(F))}if(process.env.GEMI_NO_SCHEDULE==="1")return;let C=this.app;x.start((F)=>y.run(C,F))}}class e extends H{register(){this.app.singleton(J,()=>new J(this.app.config.get("mail",{})))}}function xx(x){return`listener:${x}`}function g(x,B){Bx(x);let{maxAttempts:C,worker:F}=B,G=x.event.name,P=class extends m{maxAttempts=C;worker=F;async run(...X){let[Z,_]=Cx(X),O=A(K).rehydrate(Z,_);await new x().handle(O)}onFail(X){console.error(`The listener ${x.name} threw while handling ${G} off the queue. The queue will retry it up to ${C} times in total; nothing the dispatcher did is waiting on it.`,X)}onDeadletter(X){console.error(`The listener ${x.name} failed every one of its ${C} attempts at ${G} and has been dead-lettered, so this side effect did not happen and will not be retried.`,X)}};return Object.defineProperty(P,"name",{value:xx(x.name),writable:!0}),P}function Bx(x){if(Object.getOwnPropertyDescriptor(x,"name")?.writable)return;throw Error(`The listener ${x.name} sets \`queued = true\` but does not declare \`static name\`, so it would be registered with the queue `+"under its class name \u2014 which a production build renames while the "+`payload that names it does not. Add: static name = "${x.name}";`)}function Cx(x){return typeof x[0]==="string"?x:x[0]}class K{static token="events";listeners={};events={};warnedFor=new Set;warnedAboutWaiting=new Set;config;constructor(x={}){this.config=Y(I(),x),this.useListeners(this.config.listeners)}useListeners(x){this.config.listeners=x,this.listeners={},this.events={};let B=new Set;for(let C of x){if(!C.event){console.error(`Listener ${C.name} does not declare \`static event\`, so there is no event name to register it under and its handle will never run. Add: static event = SomeEvent;`);continue}if(B.has(C.name)){console.error(`Two event listeners are named "${C.name}" \u2014 the first is `+"registered and this one is not. A listener's name identifies it across the framework, so only one class can hold it. Rename one.");continue}B.add(C.name);let F=C.event.name,G=new C;this.events[F]??=C.event,(this.listeners[F]??=[]).push({listener:C,job:G.queued?g(C,G):null})}}get queuedListenerJobs(){return Object.values(this.listeners).flat().flatMap(({job:x})=>x?[x]:[])}get registeredListeners(){return[...this.config.listeners]}dispatch(x,B){if(this.deferToCommit(x,B,!1))return;this.runListeners(x,B)}async dispatchAndWait(x,B){if(this.deferToCommit(x,B,!0))return;return this.runListeners(x,B)}deferToCommit(x,B,C){let{name:F,afterCommit:G}=x.constructor;if(!G)return!1;let P=v(()=>this.runListeners(x,B));if(P&&C)this.warnNothingIsWaitedFor(F);return P}async runListeners(x,B){let C=x.constructor.name,F=this.listeners[C];if(!F?.length){this.warnNothingIsListening(C);return}for(let{listener:G,job:P}of F){if(P){this.enqueue(P,G,C,B);continue}try{await new G().handle(x)}catch(X){console.error(`The listener ${G.name} threw while handling ${C}. The `+"listeners after it still ran \u2014 a listener's failure is its own.",X)}}}rehydrate(x,B=[]){let C=this.events[x];if(!C)throw Error(`Cannot rebuild the event "${x}" that came off the queue: no registered listener binds to an event of that name, so there is no class to construct. A queued listener runs in an application that `+"discovered its own listeners \u2014 check that this process sees the "+`same app/listeners as the one that dispatched, and that the event declares \`static name = "${x}"\`.`);return new C(...B)}enqueue(x,B,C,F){if(F===void 0){console.error(`The listener ${B.name} is queued, but ${C} reached the dispatcher without its constructor arguments, so there is nothing for the queue to rebuild it from and the listener was skipped. Dispatch through ${C}.dispatch(...) or ${C}.dispatchAndWait(...), which carry them.`);return}try{A($).push(x,JSON.stringify([C,F]))}catch(G){console.error(`The listener ${B.name} could not be queued for ${C}, so it did not run and will not be retried. The listeners after it still ran.`,G)}}warnNothingIsWaitedFor(x){if(Bun.env.NODE_ENV==="production")return;if(this.warnedAboutWaiting.has(x))return;this.warnedAboutWaiting.add(x),console.warn(`[gemi] ${x}.dispatchAndWait() was called inside a transaction and ${x} declares \`static afterCommit = true\`, so it resolved `+"immediately with no listener having run \u2014 they run when the "+"transaction commits. Await the transaction instead, or drop afterCommit if the caller needs the side effects first. Development only.")}warnNothingIsListening(x){if(Bun.env.NODE_ENV==="production")return;if(this.warnedFor.has(x))return;this.warnedFor.add(x),console.warn(`[gemi] ${x} was dispatched and nothing is listening for it. A listener registers under the name its event declares, so check that app/listeners holds a Listener with \`static event = ${x}\` and that ${x} declares \`static name = "${x}"\`. Development only.`)}}class Fx extends H{register(){this.app.singleton(K,()=>new K(this.app.config.get("events",{})))}async boot(){let x=this.app.make(K),B=this.app.config.get("events",{});if(B.listeners===void 0){let{listenersDir:G}=Y(I(),B);x.useListeners(await b(G))}let C=x.queuedListenerJobs;if(C.length===0)return;let F=this.app.make($);for(let G of C)F.registerJob(G)}}class Gx extends H{register(){this.app.singleton(L,()=>new L(this.app.config.get("filesystem",{})))}}class Hx extends H{register(){this.app.singleton(q,()=>new q(this.app.config.get("image",{})))}}class Px extends H{register(){this.app.instance(R,new R)}}function GB(x){return x}function c(){return{maxFileSize:10485760,onLogFileClosed:()=>{},onLogCreated:()=>{}}}class Xx extends H{register(){this.app.singleton(U,()=>new U(Y(c(),this.app.config.get("log",{}))))}async boot(){await this.app.make(U).boot()}}class Yx extends H{register(){this.app.singleton(T,()=>new T(Y(w(),this.app.config.get("middleware",{}))))}}function AB(x){return x}function h(){return{channels:{}}}class Zx extends H{register(){this.app.singleton(S,()=>new S(Y(h(),this.app.config.get("broadcast",{}))))}}class _x extends H{register(){this.app.singleton($,()=>new $(this.app.config.get("queue",{})))}async boot(){let x=this.app.config.get("queue",{});if(x.jobs!==void 0)return;let{jobsDir:B}=Y(u(),x);this.app.make($).useJobs(await l(B))}}class N{}function d(x,B){return Math.floor(x/B)*B}function $x(x,B){if(B<=0)return 0;return Math.min(1,Math.max(0,(B-x)/B))}function D(x,B,C,F){return B*$x(C,F)+x}function Ox(x){let{current:B,previous:C,elapsed:F,window:G,limit:P,cost:X}=x,Z=P-X;if(Z<0)return G;let _=Math.max(0,G-F);if(C>0){let z=G*(1-(Z-B)/C);if(z<=G)return Math.max(0,Math.ceil(z-F))}if(B<=Z)return _;if(B<=0)return _;let O=G*(1-Z/B);return _+Math.max(0,Math.ceil(O))}function i(x){let{allowed:B,current:C,previous:F,now:G,elapsed:P,window:X,limit:Z,cost:_}=x;if(B){let z=D(C,F,P,X);return{allowed:!0,limit:Z,remaining:Math.max(0,Math.floor(Z-z)),resetAt:G-P+X,retryAfter:0}}let O=Ox({current:C,previous:F,elapsed:P,window:X,limit:Z,cost:_});return{allowed:!1,limit:Z,remaining:0,resetAt:G+O,retryAfter:O}}class f extends N{buckets=new Map;maxKeys;constructor(x={}){super();this.maxKeys=Math.max(1,x.maxKeys??1e5)}consume(x){let{key:B,limit:C,window:F}=x,G=x.cost??1,P=Date.now(),X=d(P,F),Z=P-X,_=this.roll(B,F,X),z=D(_.current,_.previous,Z,F)+G<=C;if(z)_.current+=G;if(this.buckets.delete(B),this.buckets.set(B,_),this.buckets.size>this.maxKeys)this.evict(P);return i({allowed:z,current:_.current,previous:_.previous,now:P,elapsed:Z,window:F,limit:C,cost:G})}clear(){this.buckets.clear()}get size(){return this.buckets.size}roll(x,B,C){let F=this.buckets.get(x);if(!F||F.window!==B)return{window:B,windowStart:C,current:0,previous:0};if(F.windowStart===C)return F;if(F.windowStart+B===C)return F.previous=F.current,F.current=0,F.windowStart=C,F;return F.previous=0,F.current=0,F.windowStart=C,F}evict(x){for(let[B,C]of this.buckets)if(x-C.windowStart>=C.window*2)this.buckets.delete(B);for(let B of this.buckets.keys()){if(this.buckets.size<=this.maxKeys)break;this.buckets.delete(B)}}}function pB(x){return x}function o(){return{driver:new f,limit:1000,window:60}}class zx extends H{register(){this.app.singleton(j,()=>new j(Y(o(),this.app.config.get("ratelimiter",{}))))}}function hB(x){return x}function s(){return{url:process.env.REDIS_URL,options:void 0}}class Kx extends H{register(){this.app.singleton(k,()=>new k(Y(s(),this.app.config.get("redis",{}))))}}function r(x,B){let C=x.get(B);if(!C)throw Error(`Missing "${B}" configuration. Route dispatching needs a root router \u2014 declare it in "app/config/route.ts".`);return C}class Vx extends H{register(){this.app.singleton(W,()=>new W(r(this.app.config,"route.api"))),this.app.singleton(E,()=>new E(r(this.app.config,"route.view")))}boot(){this.app.make(W),this.app.make(E)}}
3
- export{V as Ta,n as Ua,t as Va,e as Wa,K as Xa,Fx as Ya,Gx as Za,Hx as _a,Px as $a,GB as ab,c as bb,Xx as cb,Yx as db,AB as eb,h as fb,Zx as gb,_x as hb,d as ib,i as jb,N as kb,f as lb,pB as mb,o as nb,zx as ob,hB as pb,s as qb,Kx as rb,Vx as sb};
4
-
5
- //# debugId=B49E52DEF3A11B7964756E2164756E21