@hot-updater/console 1.1.4 → 1.2.0-rc.1

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 (273) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/-native-builds-search-C-TGpFAm.js +1 -0
  3. package/.output/public/assets/{ConsoleFeatureUnavailable-C0KfsKWL.js → ConsoleFeatureUnavailable-CUtcXuY2.js} +1 -1
  4. package/.output/public/assets/EventDetails-Dl2RvPAk.js +1 -0
  5. package/.output/public/assets/HashValueDisplay-6lNRxDJX.js +1 -0
  6. package/.output/public/assets/InsightsPageHeader-DHhqY3DT.js +1 -0
  7. package/.output/public/assets/NotFoundPage-DZ3DxyRA.js +1 -0
  8. package/.output/public/assets/PlatformIcon-BBWQlWm9.js +1 -0
  9. package/.output/public/assets/RolloutPercentageBadge-Cxogpi8F.js +1 -0
  10. package/.output/public/assets/StoreSubmission-JpngSvHS.js +1 -0
  11. package/.output/public/assets/alert-dialog-BqYScr9y.js +1 -0
  12. package/.output/public/assets/api-P2g8dCNg.js +1 -0
  13. package/.output/public/assets/api-keys-DWQC2q6y.js +1 -0
  14. package/.output/public/assets/api-keys-FueRkF9q.js +1 -0
  15. package/.output/public/assets/arrow-left-g9cKqXuC.js +1 -0
  16. package/.output/public/assets/arrow-right-CNII8TYn.js +1 -0
  17. package/.output/public/assets/arrow-up-right-DK8Zdg40.js +1 -0
  18. package/.output/public/assets/badge-DWFcDWho.js +1 -0
  19. package/.output/public/assets/check-CXVR3s3X.js +1 -0
  20. package/.output/public/assets/chevron-right-BoUXo82O.js +1 -0
  21. package/.output/public/assets/circle-off-C7Muo0ss.js +1 -0
  22. package/.output/public/assets/{clipboard-DTkrlIMn.js → clipboard-DQbOcrL7.js} +1 -1
  23. package/.output/public/assets/console-features-api-DEXSwFtc.js +1 -0
  24. package/.output/public/assets/copy-DsuLj3oj.js +1 -0
  25. package/.output/public/assets/dialog-CNUPxNxH.js +1 -0
  26. package/.output/public/assets/{dist-dDj-R6uh.js → dist-CPlO6ko9.js} +1 -1
  27. package/.output/public/assets/download-Cf24LBde.js +1 -0
  28. package/.output/public/assets/{empty-Bf4DanOL.js → empty-B3Uwdd6k.js} +1 -1
  29. package/.output/public/assets/{field-GxF9SyUo.js → field-D-2-mnNh.js} +1 -1
  30. package/.output/public/assets/history-DqHlgSuV.js +1 -0
  31. package/.output/public/assets/index-BWU6owTG.js +10 -0
  32. package/.output/public/assets/{input-group-B4nrqIh0.js → input-group-D3OUBk4n.js} +1 -1
  33. package/.output/public/assets/insights-B-0odqpt.js +42 -0
  34. package/.output/public/assets/insights-BSVGfxSL.js +1 -0
  35. package/.output/public/assets/insights-NK5B6ReS.js +2 -0
  36. package/.output/public/assets/insights-api-BVCXJsoV.js +1 -0
  37. package/.output/public/assets/insights-search-DghCbEnk.js +1 -0
  38. package/.output/public/assets/insights-usage-rpc-CKQH0pUS.js +1 -0
  39. package/.output/public/assets/insights_.distribution-CJvgwcVZ.js +2 -0
  40. package/.output/public/assets/insights_.distribution-DblZM0mO.js +1 -0
  41. package/.output/public/assets/insights_.distribution-dvk6vYDM.js +1 -0
  42. package/.output/public/assets/installations-B674P5Z5.js +2 -0
  43. package/.output/public/assets/installations-BWxczZ2t.js +1 -0
  44. package/.output/public/assets/installations-Dv4kWQYz.js +1 -0
  45. package/.output/public/assets/{key-round-B4fI1psK.js → key-round-DwNKkHhy.js} +1 -1
  46. package/.output/public/assets/link-DTEyW70e.js +2 -0
  47. package/.output/public/assets/{list-Dtj7TtzV.js → list--NIee1FZ.js} +1 -1
  48. package/.output/public/assets/native-builds-BOC71grI.js +1 -0
  49. package/.output/public/assets/native-builds-BswZazmc.js +1 -0
  50. package/.output/public/assets/native-builds-c4BpOLAe.js +2 -0
  51. package/.output/public/assets/native-builds_._buildId-D_Spjl10.js +1 -0
  52. package/.output/public/assets/native-builds_._buildId-DtoXD8rz.js +2 -0
  53. package/.output/public/assets/plus-BReVKct-.js +1 -0
  54. package/.output/public/assets/preload-helper-B44EvKhG.js +1 -0
  55. package/.output/public/assets/{refresh-cw-DjIKjmrS.js → refresh-cw-B9HHjLej.js} +1 -1
  56. package/.output/public/assets/relativeTime-YQt84dYr.js +1 -0
  57. package/.output/public/assets/remote-config-B7ujqhLa.js +6 -0
  58. package/.output/public/assets/remote-config-WjpozBG5.js +1 -0
  59. package/.output/public/assets/remote-config-gXeH6PBW.js +1 -0
  60. package/.output/public/assets/rotate-cw-Cv2aVbYr.js +1 -0
  61. package/.output/public/assets/routes-BDdBIxYS.js +1 -0
  62. package/.output/public/assets/routes-CCD33Azv.js +2 -0
  63. package/.output/public/assets/search-BCel4Oy6.js +1 -0
  64. package/.output/public/assets/select-CBIU0_M1.js +1 -0
  65. package/.output/public/assets/{sidebar-BqX460IW.js → sidebar-Di9SN47G.js} +1 -1
  66. package/.output/public/assets/smartphone-CMaSy_ir.js +1 -0
  67. package/.output/public/assets/styles-Ccxthuz1.css +2 -0
  68. package/.output/public/assets/switch-BpdiHL_t.js +1 -0
  69. package/.output/public/assets/{table-ek1DmRHq.js → table-Bpy3SvSo.js} +1 -1
  70. package/.output/public/assets/{tabs-CgEH_fMT.js → tabs-Xmt7tZeG.js} +1 -1
  71. package/.output/public/assets/{undo-2-DxXx9Zvr.js → undo-2-CUX96_BG.js} +1 -1
  72. package/.output/public/assets/useCompositeListItem-JmyDfo3-.js +1 -0
  73. package/.output/public/assets/useInfiniteQuery-DX4WpBRG.js +1 -0
  74. package/.output/public/assets/useMutation-DbYw7boA.js +1 -0
  75. package/.output/public/assets/uuidv7-zXMtwR9Q.js +1 -0
  76. package/.output/public/assets/{valueToPercent-B44vDssN.js → valueToPercent-BLwGy_xK.js} +1 -1
  77. package/.output/server/{__23tanstack-start-server-fn-resolver-KpQ5Z_24.mjs → __23tanstack-start-server-fn-resolver-CygMPYHZ.mjs} +64 -40
  78. package/.output/server/_chunks/ssr-renderer.mjs +2 -2
  79. package/.output/server/_libs/@tanstack/react-router+[...].mjs +1 -1
  80. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +1 -1
  81. package/.output/server/_libs/lucide-react.mjs +88 -1
  82. package/.output/server/_libs/uqr.mjs +858 -0
  83. package/.output/server/_ssr/-native-builds-search-CwNcoXf4.mjs +37 -0
  84. package/.output/server/_ssr/{BundleIdDisplay-CjSnY65J.mjs → BundleIdDisplay-DOPz4pUS.mjs} +2 -2
  85. package/.output/server/_ssr/{ConsoleFeatureUnavailable-CHxn9f-w.mjs → ConsoleFeatureUnavailable-Xb1JKqcc.mjs} +7 -7
  86. package/.output/server/_ssr/{EventDetails-l6dF54zp.mjs → EventDetails-D7MejFCN.mjs} +8 -8
  87. package/.output/server/_ssr/{HashValueDisplay-Zs7ABoOi.mjs → HashValueDisplay-Dd-wu5rY.mjs} +2 -2
  88. package/.output/server/_ssr/{InsightsPageHeader-ZlAlDxQy.mjs → InsightsPageHeader-CWf1n4Vt.mjs} +13 -11
  89. package/.output/server/_ssr/{NotFoundPage-u28ndvp1.mjs → NotFoundPage-C5rFdUpg.mjs} +2 -2
  90. package/.output/server/_ssr/PlatformIcon-CFLiTjh1.mjs +29 -0
  91. package/.output/server/_ssr/RolloutPercentageBadge-g0Bhfl3M.mjs +21 -0
  92. package/.output/server/_ssr/StoreSubmission-JZ2Zltak.mjs +139 -0
  93. package/.output/server/_ssr/{alert-dialog-B8AqlJwo.mjs → alert-dialog-CvNvTvIJ.mjs} +1 -1
  94. package/.output/server/_ssr/{api-C_0B7NXM.mjs → api-0vtwA5vY.mjs} +126 -7
  95. package/.output/server/_ssr/{api-keys-pRNvn2-9.mjs → api-keys-D5dyA4D1.mjs} +10 -10
  96. package/.output/server/_ssr/{api-keys-rpc-wecWs0nA.mjs → api-keys-rpc-BOIUHhDi.mjs} +5 -5
  97. package/.output/server/_ssr/{api-keys-CLH38u9B.mjs → api-keys-yFlQDwQF.mjs} +2 -2
  98. package/.output/server/_ssr/{api-rpc-DWN8eOHS.mjs → api-rpc-COeFOpYi.mjs} +79 -12
  99. package/.output/server/_ssr/{auth-UP0wXs4i.mjs → auth-Z-wLddzh.mjs} +1 -1
  100. package/.output/server/_ssr/{auth-rpc-CLRArbIl.mjs → auth-rpc-D1ss2GUI.mjs} +6 -6
  101. package/.output/server/_ssr/{auth.server-DR9zc0EU.mjs → auth.server-DYS1OJ6P.mjs} +771 -641
  102. package/.output/server/_ssr/{badge-BpT7r-ng.mjs → badge-CEdVRgyl.mjs} +1 -1
  103. package/.output/server/_ssr/{bundleActivity-0qFIcvqt.mjs → bundleActivity-MLrjNJCT.mjs} +1 -1
  104. package/.output/server/_ssr/{config-WVX4IxSR.mjs → config-CjIBFhJX.mjs} +1 -1
  105. package/.output/server/_ssr/config.server-NnMFjMFX.mjs +43 -0
  106. package/.output/server/_ssr/{console-access-aUpQs49I.mjs → console-access-33BNlH97.mjs} +3 -3
  107. package/.output/server/_ssr/{console-features-4xAGfZHw.mjs → console-features-BTV-XuhQ.mjs} +1 -1
  108. package/.output/server/_ssr/{console-features-api-DSSgCV3v.mjs → console-features-api-v1fSycue.mjs} +6 -6
  109. package/.output/server/_ssr/{console-features-rpc-D6kMlR2A.mjs → console-features-rpc-C7XNVqm0.mjs} +5 -5
  110. package/.output/server/_ssr/createCsrfMiddleware-BwHbC8n-.mjs +159 -0
  111. package/.output/server/_ssr/createMiddleware-C3ACsfuG.mjs +24 -0
  112. package/.output/server/_ssr/{createMiddleware-B1iPez7u.mjs → createServerFn-AQvBMBjJ.mjs} +2 -23
  113. package/.output/server/_ssr/{createServerRpc-BaDJLGBx.mjs → createServerRpc-BVvRVOz5.mjs} +2 -2
  114. package/.output/server/_ssr/{databaseConfig-C5SkAyUy.mjs → databaseConfig-B_Bg7qS5.mjs} +1 -1
  115. package/.output/server/_ssr/{databaseJsonValue-Csbuzc9Q.mjs → databaseJsonValue-kS7cvEtz.mjs} +1 -1
  116. package/.output/server/_ssr/{databaseRows-CPphvbag.mjs → databaseRows-B6H8Cmgq.mjs} +3 -3
  117. package/.output/server/_ssr/{dialog-B4ALf7NJ.mjs → dialog-C8CS8RMt.mjs} +1 -1
  118. package/.output/server/_ssr/{dist-CbQbBIw-.mjs → dist-TEpM_UAD.mjs} +125 -125
  119. package/.output/server/_ssr/{downloadBundle-94jPBGSO.mjs → downloadBundle-DCmr7vsj.mjs} +1 -1
  120. package/.output/server/_ssr/{empty-Bh1FEeYF.mjs → empty-CkdEAvCY.mjs} +2 -2
  121. package/.output/server/_ssr/{empty-plugin-adapters-CpCHi1TV.mjs → empty-plugin-adapters-zrZ0xs6n.mjs} +1 -1
  122. package/.output/server/_ssr/{failureReports-Bh22wois.mjs → failureReports-Cn_zU9S8.mjs} +3 -3
  123. package/.output/server/_ssr/{field-HKCaPH3e.mjs → field-CW08sZXd.mjs} +2 -2
  124. package/.output/server/_ssr/{getBundleChildren-DfxB2K8D.mjs → getBundleChildren-rtkEEJw5.mjs} +2 -2
  125. package/.output/server/_ssr/git-CTA8Aqr0.mjs +56 -0
  126. package/.output/server/_ssr/{input-group-xm3LzDuq.mjs → input-group-D-TpFPuG.mjs} +1 -1
  127. package/.output/server/_ssr/{insights-BKZpJ_K4.mjs → insights-CMyzPs8l.mjs} +28 -27
  128. package/.output/server/_ssr/{insights-CCyTACIw.mjs → insights-CYeBl8N9.mjs} +5 -5
  129. package/.output/server/_ssr/{insights-CNqWQLJR.mjs → insights-DAi9KknT.mjs} +2 -2
  130. package/.output/server/_ssr/{insights-api-DtRFz5X3.mjs → insights-api-BFARQ5ct.mjs} +6 -6
  131. package/.output/server/_ssr/{insights-errors-Iy-lBaM7.mjs → insights-errors-7BCwFybo.mjs} +2 -2
  132. package/.output/server/_ssr/{insights-failures-BJN3RfLu.mjs → insights-failures-B9VPkzZE.mjs} +2 -2
  133. package/.output/server/_ssr/{insights-failures-rpc-DLZ91uOG.mjs → insights-failures-rpc-Q4WNNJkU.mjs} +12 -12
  134. package/.output/server/_ssr/{insights-recovery-BUuQdlA3.mjs → insights-recovery-BtXVU3ro.mjs} +1 -1
  135. package/.output/server/_ssr/{insights-recovery-rpc-BQHUhPi7.mjs → insights-recovery-rpc-CY5RYJKa.mjs} +8 -8
  136. package/.output/server/_ssr/{insights-rpc-C6Vukyn7.mjs → insights-rpc-BO7_evvs.mjs} +5 -5
  137. package/.output/server/_ssr/{insights-search-CBYoxT7v.mjs → insights-search-DKfxgHD3.mjs} +5 -5
  138. package/.output/server/_ssr/{insights-usage-CHqvtehH.mjs → insights-usage-DiGnuxW8.mjs} +1 -1
  139. package/.output/server/_ssr/{insights-usage-rpc-BJ7a-xco.mjs → insights-usage-rpc-B4czku50.mjs} +8 -8
  140. package/.output/server/_ssr/{insights-usage-rpc-C-lNUIsD.mjs → insights-usage-rpc-CUCTFska.mjs} +5 -5
  141. package/.output/server/_ssr/{insightsUsage-COUG-_-U.mjs → insightsUsage-ClAmoUz8.mjs} +3 -3
  142. package/.output/server/_ssr/{insights_.distribution-DmLW8I8a.mjs → insights_.distribution-BDeUhZGj.mjs} +2 -2
  143. package/.output/server/_ssr/{insights_.distribution-CTwilMPm.mjs → insights_.distribution-BRrbZN1X.mjs} +5 -5
  144. package/.output/server/_ssr/{insights_.distribution-DztDyrBj.mjs → insights_.distribution-C2MXpzKd.mjs} +15 -14
  145. package/.output/server/_ssr/{installations-Bct7ag5y.mjs → installations-BVk7okiY.mjs} +4 -4
  146. package/.output/server/_ssr/{installations-B6MK5iA8.mjs → installations-BjLMgBoH.mjs} +2 -2
  147. package/.output/server/_ssr/{installations-_N4PtYFl.mjs → installations-DxGZEC5G.mjs} +12 -12
  148. package/.output/server/_ssr/{listReleases-BfUBlCHo.mjs → listReleases-D_GY00SQ.mjs} +1 -1
  149. package/.output/server/_ssr/native-builds-CSCgFB21.mjs +10 -0
  150. package/.output/server/_ssr/native-builds-CdlyAldW.mjs +569 -0
  151. package/.output/server/_ssr/native-builds-DhXL5zf_.mjs +137 -0
  152. package/.output/server/_ssr/native-builds_._buildId-CMp1h8dT.mjs +10 -0
  153. package/.output/server/_ssr/native-builds_._buildId-GHpGaYyE.mjs +813 -0
  154. package/.output/server/_ssr/nativeBuildQr-84cnFQPX.mjs +59 -0
  155. package/.output/server/_ssr/nativeBuilds-B_7BPjt_.mjs +133 -0
  156. package/.output/server/_ssr/{plugins-BaD1slHx.mjs → plugins-RIryUNWj.mjs} +6 -5
  157. package/.output/server/_ssr/qr-code-C7kNRIDX.mjs +22 -0
  158. package/.output/server/_ssr/{release-adoption-DuYJTGuX.mjs → release-adoption-DoAtNPED.mjs} +2 -2
  159. package/.output/server/_ssr/{release-adoption-rpc-CHl7G_Zy.mjs → release-adoption-rpc-BJXZvtoQ.mjs} +10 -10
  160. package/.output/server/_ssr/{releaseAdoption-B39cpvfo.mjs → releaseAdoption-a2byXMfz.mjs} +4 -4
  161. package/.output/server/_ssr/releaseCatalogCompiler-DLcean2k.mjs +364 -0
  162. package/.output/server/_ssr/{releaseManagement-DFMUnDF5.mjs → releaseManagement-DHUux2az.mjs} +1 -1
  163. package/.output/server/_ssr/{releaseReachability-bFsuElSS.mjs → releaseReachability-DZOK_dH-.mjs} +2 -2
  164. package/.output/server/_ssr/{remote-config-Mj05qVYZ.mjs → remote-config-DjsEl270.mjs} +20 -19
  165. package/.output/server/_ssr/{remote-config-10-obSZ0.mjs → remote-config-DlyyohL2.mjs} +2 -2
  166. package/.output/server/_ssr/{remote-config-Dj1eTYi4.mjs → remote-config-XdYuByHz.mjs} +2 -2
  167. package/.output/server/_ssr/{remote-config-rpc-lteqDSLn.mjs → remote-config-rpc-GMLPb-90.mjs} +6 -6
  168. package/.output/server/_ssr/request-guard-CPdRBuGW.mjs +108 -0
  169. package/.output/server/_ssr/{router-Dr4jjjhx.mjs → router-vpxd56RW.mjs} +317 -71
  170. package/.output/server/_ssr/{routes-BZbrY_qw.mjs → routes-DyEM4b3x.mjs} +14 -14
  171. package/.output/server/_ssr/{routes-B5KrCDwk.mjs → routes-dQe3XhiS.mjs} +99 -81
  172. package/.output/server/_ssr/{runtime.server-DsHqVqTr.mjs → runtime.server-BdMY1blX.mjs} +4 -4
  173. package/.output/server/_ssr/schema-ChlRtZIo.mjs +23 -0
  174. package/.output/server/_ssr/schema-migration-rpc-BfGzEK_o.mjs +65 -0
  175. package/.output/server/_ssr/{select-BtdGNSmp.mjs → select-DM1uwtk9.mjs} +3 -27
  176. package/.output/server/_ssr/{server-BxaHSwHh.mjs → server-BUUKNSPI.mjs} +7 -161
  177. package/.output/server/_ssr/{sidebar-CVsgosaD.mjs → sidebar-DB2YQlok.mjs} +4 -4
  178. package/.output/server/_ssr/ssr.mjs +1 -1
  179. package/.output/server/_ssr/start-BvDsQehg.mjs +49 -0
  180. package/.output/server/_ssr/{switch-BmARgkUP.mjs → switch-DLD58zLy.mjs} +2 -2
  181. package/.output/server/_ssr/{table-M5P3YUfY.mjs → table-P4TnAZhl.mjs} +1 -1
  182. package/.output/server/_ssr/{tabs-CrmfOlJj.mjs → tabs-B7ZeLicF.mjs} +2 -2
  183. package/.output/server/_ssr/{updateFailures-z1IQy_4q.mjs → updateFailures-n-tGv90S.mjs} +3 -3
  184. package/.output/server/_ssr/{uuidv7-C88s9jWF.mjs → uuidv7-BIF4nb_q.mjs} +2 -2
  185. package/.output/server/_ssr/{schema-BiAVyEj2.mjs → version-CQ98ZBpL-CWSkTT9J.mjs} +2 -22
  186. package/.output/server/_tanstack-start-manifest_v-C-KC63Zq.mjs +184 -0
  187. package/.output/server/index.mjs +432 -271
  188. package/lib/vite-internal.mjs +32 -1
  189. package/package.json +8 -7
  190. package/src/components/AppSidebar.tsx +12 -1
  191. package/src/components/ConsoleAccessPage.tsx +49 -3
  192. package/src/components/QrCode.tsx +35 -0
  193. package/src/components/SchemaMigrationRequired.tsx +139 -0
  194. package/src/components/features/insights/BuiltinBundle.tsx +5 -3
  195. package/src/components/features/native-builds/BuiltInBundleCard.tsx +163 -0
  196. package/src/components/features/native-builds/CommitLink.tsx +30 -0
  197. package/src/components/features/native-builds/CopyableText.tsx +48 -0
  198. package/src/components/features/native-builds/ImportBuild.tsx +91 -0
  199. package/src/components/features/native-builds/InstallCard.tsx +205 -0
  200. package/src/components/features/native-builds/NativeBuildDetailPage.tsx +175 -0
  201. package/src/components/features/native-builds/NativeBuildsPage.tsx +151 -0
  202. package/src/components/features/native-builds/NativeBuildsTable.tsx +426 -0
  203. package/src/components/features/native-builds/PatchesCard.tsx +222 -0
  204. package/src/components/features/native-builds/ReleaseNativeBuildLink.tsx +101 -0
  205. package/src/components/features/native-builds/ServedNowCard.tsx +214 -0
  206. package/src/components/features/native-builds/ShortHash.tsx +41 -0
  207. package/src/components/features/native-builds/StoreSubmission.tsx +73 -0
  208. package/src/components/features/releases/ReleaseEditorSheet.tsx +8 -0
  209. package/src/lib/api-rpc.ts +98 -0
  210. package/src/lib/api.ts +120 -0
  211. package/src/lib/native-builds.ts +162 -0
  212. package/src/lib/qr-code.ts +16 -0
  213. package/src/lib/schema-migration-api.ts +54 -0
  214. package/src/lib/schema-migration-rpc.ts +26 -0
  215. package/src/lib/schema-migration.ts +101 -0
  216. package/src/lib/server/config.server.ts +23 -14
  217. package/src/lib/server/console-runtime.server.ts +4 -6
  218. package/src/lib/server/local-console.ts +164 -0
  219. package/src/lib/server/nativeBuildQr.ts +73 -0
  220. package/src/lib/server/nativeBuilds.ts +288 -0
  221. package/src/lib/shell.ts +9 -0
  222. package/src/routeTree.gen.ts +88 -1
  223. package/src/router.tsx +11 -1
  224. package/src/routes/-native-builds-search.ts +51 -0
  225. package/src/routes/[_]hot-updater/native-builds/qr.ts +14 -0
  226. package/src/routes/__root.tsx +11 -1
  227. package/src/routes/api/native-builds/$buildId/download.ts +50 -0
  228. package/src/routes/native-builds.tsx +21 -0
  229. package/src/routes/native-builds_.$buildId.tsx +23 -0
  230. package/src/start.ts +33 -0
  231. package/src/virtual-modules.d.ts +18 -0
  232. package/src/vite-internal.ts +57 -1
  233. package/.output/public/assets/EventDetails-gbD_fCqc.js +0 -1
  234. package/.output/public/assets/HashValueDisplay-BGkDPaYi.js +0 -1
  235. package/.output/public/assets/InsightsPageHeader-BRw8XkJW.js +0 -1
  236. package/.output/public/assets/NotFoundPage-Cei6W2lm.js +0 -1
  237. package/.output/public/assets/alert-dialog-BtVg50WQ.js +0 -1
  238. package/.output/public/assets/api-DoicFJfd.js +0 -1
  239. package/.output/public/assets/api-keys-D81VHHNM.js +0 -1
  240. package/.output/public/assets/api-keys-Dia6i8K1.js +0 -1
  241. package/.output/public/assets/arrow-left-DsivSewE.js +0 -1
  242. package/.output/public/assets/arrow-up-right-B5aM0F7f.js +0 -1
  243. package/.output/public/assets/badge-Bqf3UDee.js +0 -1
  244. package/.output/public/assets/circle-off-BsbZQtsF.js +0 -1
  245. package/.output/public/assets/console-features-api-DPE4C06Y.js +0 -2
  246. package/.output/public/assets/dialog-CGKPxz3n.js +0 -1
  247. package/.output/public/assets/index-DrkdiRIn.js +0 -10
  248. package/.output/public/assets/insights-C-5t8wh2.js +0 -2
  249. package/.output/public/assets/insights-D_ngQdiz.js +0 -1
  250. package/.output/public/assets/insights-KigRBDgC.js +0 -42
  251. package/.output/public/assets/insights-api-1ZjVu3Sb.js +0 -1
  252. package/.output/public/assets/insights-search-aT8BVCci.js +0 -1
  253. package/.output/public/assets/insights-usage-rpc-DqTiXI1_.js +0 -1
  254. package/.output/public/assets/insights_.distribution-Bzl6RFBR.js +0 -2
  255. package/.output/public/assets/insights_.distribution-Cthgttqb.js +0 -1
  256. package/.output/public/assets/insights_.distribution-D2c2v1bu.js +0 -1
  257. package/.output/public/assets/installations-2Nx8Htf-.js +0 -1
  258. package/.output/public/assets/installations-BskJ1xQr.js +0 -2
  259. package/.output/public/assets/installations-K2iJ_r0h.js +0 -1
  260. package/.output/public/assets/remote-config-D9X3NiwV.js +0 -6
  261. package/.output/public/assets/remote-config-DzOOiBIO.js +0 -1
  262. package/.output/public/assets/remote-config-ikg7kak0.js +0 -1
  263. package/.output/public/assets/routes-9rb9P5Y7.js +0 -2
  264. package/.output/public/assets/routes-P7683vKQ.js +0 -1
  265. package/.output/public/assets/search-DuI1FBpg.js +0 -1
  266. package/.output/public/assets/select-M3H2gxCc.js +0 -1
  267. package/.output/public/assets/smartphone-CtsHuiIC.js +0 -1
  268. package/.output/public/assets/styles-CpiW_YdW.css +0 -2
  269. package/.output/public/assets/switch-By_vfm8I.js +0 -1
  270. package/.output/public/assets/useCompositeListItem-B-UkrDlu.js +0 -1
  271. package/.output/server/_ssr/config.server-DTdsG47T.mjs +0 -35
  272. package/.output/server/_ssr/start-B6ECIE_7.mjs +0 -4
  273. package/.output/server/_tanstack-start-manifest_v-_BY9hYTm.mjs +0 -136
@@ -0,0 +1,813 @@
1
+ import { i as __toESM } from "../_runtime.mjs";
2
+ import { bt as require_react, yt as require_jsx_runtime } from "../_libs/@base-ui/react+[...].mjs";
3
+ import { B as Download, J as ChevronLeft, M as HardDrive, P as GitBranch, S as PackageOpen, W as CircleCheck, _ as RefreshCw, i as TriangleAlert, j as History, q as ChevronRight, tt as ArrowUpRight } from "../_libs/lucide-react.mjs";
4
+ import { C as Skeleton, O as buttonVariants, S as SidebarTrigger, k as cn, t as Button$1 } from "./sidebar-DB2YQlok.mjs";
5
+ import { a as Badge, d as CardTitle, i as AlertTitle, n as AlertAction, o as Card, r as AlertDescription, s as CardContent, t as Alert, u as CardHeader } from "./badge-CEdVRgyl.mjs";
6
+ import { a as TableHeader, i as TableHead, n as TableBody, o as TableRow, r as TableCell, t as Table } from "./table-P4TnAZhl.mjs";
7
+ import { h as Link } from "../_libs/@tanstack/react-router+[...].mjs";
8
+ import { a as EmptyMedia, i as EmptyHeader, n as EmptyContent, o as EmptyTitle, r as EmptyDescription, t as Empty } from "./empty-CkdEAvCY.mjs";
9
+ import { i as NUMERIC_COHORT_SIZE } from "./dist-TEpM_UAD.mjs";
10
+ import { c as nativeBuildFileName, d as platformLabel, i as nativeBuildArtifacts, p as simulatorInstallCommand, r as formatByteSize, s as nativeBuildDownloadPath, t as apkInstallCommand, u as nativeBuildTarget } from "./native-builds-DhXL5zf_.mjs";
11
+ import { t as PlatformIcon } from "./PlatformIcon-CFLiTjh1.mjs";
12
+ import { d as useNativeBuildPatchesQuery, l as useNativeBuildDetailQuery, u as useNativeBuildDownloadUrlQuery } from "./api-0vtwA5vY.mjs";
13
+ import { t as TimestampDisplay } from "./git-CTA8Aqr0.mjs";
14
+ import { a as isSubmitted, i as StoreSubmissionBadge, n as CopyableText, r as ShortHash, t as CommitLink } from "./StoreSubmission-JZ2Zltak.mjs";
15
+ import { t as qrCodePath } from "./qr-code-C7kNRIDX.mjs";
16
+ import { t as Route } from "./native-builds_._buildId-CMp1h8dT.mjs";
17
+ import { t as RolloutPercentageBadge } from "./RolloutPercentageBadge-g0Bhfl3M.mjs";
18
+ //#region node_modules/.nitro/vite/services/ssr/assets/native-builds_._buildId-GHpGaYyE.js
19
+ var import_react = /* @__PURE__ */ __toESM(require_react());
20
+ var import_jsx_runtime = require_jsx_runtime();
21
+ function Row({ label, children }) {
22
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
23
+ className: "grid gap-1 sm:grid-cols-[10rem_minmax(0,1fr)] sm:gap-4",
24
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("dt", {
25
+ className: "text-xs font-medium text-muted-foreground",
26
+ children: label
27
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("dd", {
28
+ className: "min-w-0 text-sm",
29
+ children
30
+ })]
31
+ });
32
+ }
33
+ /** Whether new deploys patch from this build, or from a newer one of its scope. */
34
+ function BaselineStatus({ detail }) {
35
+ const { build, newestInScope } = detail;
36
+ if (newestInScope === null) return null;
37
+ if (newestInScope.id === build.id) return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
38
+ className: "flex items-start gap-2 rounded-md border bg-muted/40 p-3 text-xs",
39
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CircleCheck, {
40
+ "aria-hidden": "true",
41
+ className: "mt-0.5 size-3.5 shrink-0 text-muted-foreground"
42
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
43
+ className: "font-medium",
44
+ children: "Current baseline."
45
+ }), " New deploys to this scope add a patch from this build's bundle."] })]
46
+ });
47
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
48
+ className: "flex items-start gap-2 rounded-md border bg-muted/40 p-3 text-xs",
49
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(History, {
50
+ "aria-hidden": "true",
51
+ className: "mt-0.5 size-3.5 shrink-0 text-muted-foreground"
52
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", { children: [
53
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
54
+ className: "font-medium",
55
+ children: "Superseded"
56
+ }),
57
+ " by",
58
+ " ",
59
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Link, {
60
+ className: "inline-flex items-center gap-0.5 font-medium underline underline-offset-4",
61
+ params: { buildId: newestInScope.id },
62
+ to: "/native-builds/$buildId",
63
+ children: [
64
+ platformLabel(newestInScope.platform),
65
+ " ",
66
+ nativeBuildArtifacts[newestInScope.artifact_kind].label,
67
+ " ·",
68
+ " ",
69
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: newestInScope.id }),
70
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowUpRight, {
71
+ "aria-hidden": "true",
72
+ className: "size-3"
73
+ })
74
+ ]
75
+ }),
76
+ ". New deploys patch from that build, so this one gets no new patches."
77
+ ] })]
78
+ });
79
+ }
80
+ /**
81
+ * The build's built-in bundle: the bundle every install runs until its
82
+ * first OTA, and the base that OTA's patch starts from.
83
+ */
84
+ function BuiltInBundleCard({ detail }) {
85
+ const { build, builtInBundle, channel } = detail;
86
+ const target = nativeBuildTarget(build);
87
+ const childCount = builtInBundle?.childCount ?? 0;
88
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, {
89
+ className: "overflow-hidden shadow-sm",
90
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
91
+ className: "border-b px-4 py-3",
92
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
93
+ className: "text-sm",
94
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Built-in bundle" })
95
+ })
96
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
97
+ className: "flex flex-col gap-4 p-4 sm:p-6",
98
+ children: [
99
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("dl", {
100
+ className: "flex flex-col gap-3",
101
+ children: [
102
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
103
+ label: "Bundle ID",
104
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
105
+ className: "break-all font-mono text-xs",
106
+ translate: "no",
107
+ children: build.min_bundle_id
108
+ })
109
+ }),
110
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
111
+ label: "OTAs patching from it",
112
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
113
+ className: "tabular-nums",
114
+ children: childCount === 1 ? "1 bundle" : `${childCount} bundles`
115
+ })
116
+ }),
117
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
118
+ label: "Scope",
119
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
120
+ className: "flex flex-wrap items-center gap-1.5",
121
+ children: [
122
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
123
+ "aria-label": `Show the builds that embed ${channel}`,
124
+ search: { channel },
125
+ to: "/native-builds",
126
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
127
+ translate: "no",
128
+ variant: "outline",
129
+ children: channel
130
+ })
131
+ }),
132
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
133
+ className: "text-xs",
134
+ children: platformLabel(build.platform)
135
+ }),
136
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
137
+ className: "text-xs text-muted-foreground",
138
+ children: ["· ", target.label]
139
+ }),
140
+ build.fingerprint_hash === null ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
141
+ className: "font-mono text-xs",
142
+ translate: "no",
143
+ children: target.value
144
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ShortHash, {
145
+ label: "fingerprint",
146
+ length: 12,
147
+ value: build.fingerprint_hash
148
+ })
149
+ ]
150
+ })
151
+ }),
152
+ !build.build_number ? null : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
153
+ label: "Build number",
154
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
155
+ className: "font-mono text-xs tabular-nums",
156
+ translate: "no",
157
+ children: build.build_number
158
+ })
159
+ }),
160
+ isSubmitted(build) ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
161
+ label: "Store",
162
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(StoreSubmissionBadge, {
163
+ build,
164
+ withTime: true
165
+ })
166
+ }) : null,
167
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
168
+ label: "Commit",
169
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CommitLink, { hash: build.git_commit_hash })
170
+ }),
171
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Row, {
172
+ label: "Created",
173
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, {
174
+ format: "both",
175
+ uuid: build.id
176
+ })
177
+ })
178
+ ]
179
+ }),
180
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BaselineStatus, { detail }),
181
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
182
+ className: "text-xs text-muted-foreground",
183
+ children: "A store or test install of this build runs this bundle until its first OTA. That OTA downloads as a patch from this bundle when one exists, and as the full bundle otherwise."
184
+ })
185
+ ]
186
+ })]
187
+ });
188
+ }
189
+ /**
190
+ * A QR code of `value`, drawn as one SVG path with the standard four-module
191
+ * quiet zone. Phone cameras read dark modules on a light ground, so the code
192
+ * keeps its own two colors in both themes instead of the theme's tokens.
193
+ */
194
+ function QrCode({ value, label, className }) {
195
+ const { size, path } = (0, import_react.useMemo)(() => qrCodePath(value), [value]);
196
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("svg", {
197
+ "aria-label": label,
198
+ className: cn("aspect-square rounded-md", className),
199
+ role: "img",
200
+ shapeRendering: "crispEdges",
201
+ viewBox: `0 0 ${size} ${size}`,
202
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("rect", {
203
+ fill: "#fff",
204
+ height: size,
205
+ width: size
206
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", {
207
+ d: path,
208
+ fill: "#000"
209
+ })]
210
+ });
211
+ }
212
+ /**
213
+ * What an artifact installs on, where the file alone isn't enough: the card
214
+ * says it once, under the QR code, or without one, in its place.
215
+ */
216
+ var INSTALL_LIMITS = {
217
+ ipa: "The .ipa installs only on devices its signing profile allows (development or ad hoc); an App Store export reaches testers through TestFlight.",
218
+ aab: "The .aab installs through Google Play or bundletool, not from the file."
219
+ };
220
+ /**
221
+ * What scanning a build's QR code gets, by its artifact. The install steps
222
+ * beside it add only what this doesn't say, so the card says each thing once.
223
+ */
224
+ var QR_CAPTIONS = {
225
+ apk: "Scan with an Android phone's camera, then open the APK to install it.",
226
+ ipa: `Scan to download. ${INSTALL_LIMITS.ipa}`,
227
+ aab: `Scan to download. ${INSTALL_LIMITS.aab}`,
228
+ app: "Scan to download the .app.zip on a Mac."
229
+ };
230
+ /**
231
+ * The QR code of the build's download: the storage's URL, which a phone
232
+ * opens without the console's sign-in, read again before it expires.
233
+ */
234
+ function DownloadQrCode({ build }) {
235
+ const downloadUrl = useNativeBuildDownloadUrlQuery(build.id, true);
236
+ const url = downloadUrl.data?.url;
237
+ if (url === null) {
238
+ const limits = INSTALL_LIMITS[build.artifact_kind];
239
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
240
+ className: "flex flex-col gap-2 text-xs text-muted-foreground",
241
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: "This storage gives no download link a phone can open without signing in, so there is no QR code. Download the build here, or open this page on the phone signed in to the console." }), limits ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", { children: limits }) : null]
242
+ });
243
+ }
244
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
245
+ className: "flex flex-col items-center gap-2",
246
+ children: [url === void 0 ? downloadUrl.isError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
247
+ variant: "destructive",
248
+ children: [
249
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, {}),
250
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "The download link couldn't be created" }),
251
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: downloadUrl.error.message })
252
+ ]
253
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "size-48" }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(QrCode, {
254
+ className: "size-48",
255
+ label: `Download ${nativeBuildFileName(build)}`,
256
+ value: url
257
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
258
+ className: "max-w-56 text-center text-xs text-muted-foreground",
259
+ children: QR_CAPTIONS[build.artifact_kind]
260
+ })]
261
+ });
262
+ }
263
+ /** The store's label of a submitted build. */
264
+ function SubmittedVersion({ build }) {
265
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
266
+ className: "font-mono text-foreground",
267
+ translate: "no",
268
+ children: build.submitted_version ?? "this build"
269
+ });
270
+ }
271
+ /**
272
+ * How else the artifact installs, beside its QR code's caption and its
273
+ * download: none of it repeats the caption.
274
+ */
275
+ function InstallSteps({ build }) {
276
+ switch (build.artifact_kind) {
277
+ case "apk": return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
278
+ className: "flex min-w-0 flex-col gap-2",
279
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
280
+ className: "text-xs text-muted-foreground",
281
+ children: "On an emulator or a phone over USB, download the APK and install it:"
282
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
283
+ label: "the install command",
284
+ value: apkInstallCommand(build)
285
+ })]
286
+ });
287
+ case "app": return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
288
+ className: "flex min-w-0 flex-col gap-2",
289
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
290
+ className: "text-xs text-muted-foreground",
291
+ children: "It runs only in the iOS Simulator. Install it on the booted one:"
292
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
293
+ label: "the install command",
294
+ value: simulatorInstallCommand(build)
295
+ })]
296
+ });
297
+ case "aab": return isSubmitted(build) ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
298
+ className: "text-xs text-muted-foreground",
299
+ children: [
300
+ "Submitted to Google Play internal testing as",
301
+ " ",
302
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SubmittedVersion, { build }),
303
+ ". Testers get it once its release is rolled out; on an app Play Console hasn't published, the release is a draft you roll out in Play Console."
304
+ ]
305
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
306
+ className: "flex min-w-0 flex-col gap-2",
307
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
308
+ className: "text-xs text-muted-foreground",
309
+ children: "For testers, build and release to internal testing:"
310
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
311
+ label: "the Google Play command",
312
+ value: "npx hot-updater google-play upload"
313
+ })]
314
+ });
315
+ case "ipa": return isSubmitted(build) ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
316
+ className: "text-xs text-muted-foreground",
317
+ children: [
318
+ "On TestFlight as ",
319
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SubmittedVersion, { build }),
320
+ "."
321
+ ]
322
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
323
+ className: "flex min-w-0 flex-col gap-2",
324
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)("p", {
325
+ className: "text-xs text-muted-foreground",
326
+ children: "Over USB, Xcode or Apple Configurator installs it. For testers:"
327
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CopyableText, {
328
+ label: "the TestFlight command",
329
+ value: "npx hot-updater testflight"
330
+ })]
331
+ });
332
+ }
333
+ }
334
+ /**
335
+ * Installs one native build: every artifact by a QR code of its download,
336
+ * which a phone scans, and by download here; an APK also with `adb`, a
337
+ * simulator app with `xcrun simctl`, and an IPA's or an AAB's testers through
338
+ * its store.
339
+ */
340
+ function InstallCard({ build }) {
341
+ const fileName = nativeBuildFileName(build);
342
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, {
343
+ className: "overflow-hidden shadow-sm",
344
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
345
+ className: "border-b px-4 py-3",
346
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
347
+ className: "text-sm",
348
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Install" })
349
+ })
350
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
351
+ className: "grid gap-6 p-4 sm:grid-cols-[12rem_minmax(0,1fr)] sm:p-6",
352
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(DownloadQrCode, { build }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
353
+ className: "flex min-w-0 flex-col gap-4",
354
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(InstallSteps, { build }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
355
+ className: buttonVariants({
356
+ className: "h-auto min-h-11 w-full min-w-0 py-2 whitespace-normal sm:min-h-8 sm:w-fit",
357
+ variant: "outline"
358
+ }),
359
+ download: true,
360
+ href: nativeBuildDownloadPath(build.id),
361
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Download, { "data-icon": "inline-start" }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
362
+ className: "text-left [overflow-wrap:anywhere]",
363
+ children: ["Download ", fileName]
364
+ })]
365
+ })]
366
+ })]
367
+ })]
368
+ });
369
+ }
370
+ var BUNDLE_DIFFING_GUIDE_URL = "https://hot-updater.dev/docs/guides/bundle-diffing#first-ota-update";
371
+ /**
372
+ * The bundles that patch from the build's built-in bundle, newest first, a
373
+ * page at a time: the newest page comes with the build's page, and others
374
+ * are read as they are asked for.
375
+ */
376
+ function PatchesCard({ detail, page, onPage }) {
377
+ const paged = page.before !== void 0 || page.after !== void 0;
378
+ const query = useNativeBuildPatchesQuery(detail.build.min_bundle_id, page, paged);
379
+ const patches = paged ? query.data : detail.patches;
380
+ const { next, previous } = patches ?? {};
381
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, {
382
+ className: "overflow-hidden shadow-sm",
383
+ id: "patches",
384
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
385
+ className: "border-b px-4 py-3",
386
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
387
+ className: "text-sm",
388
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Patches from this build" })
389
+ })
390
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(CardContent, {
391
+ className: "p-0",
392
+ children: [paged && query.isError ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
393
+ className: "p-4",
394
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
395
+ variant: "destructive",
396
+ children: [
397
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, {}),
398
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "Patches couldn't be loaded" }),
399
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: query.error.message }),
400
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertAction, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
401
+ onClick: () => void query.refetch(),
402
+ size: "xs",
403
+ variant: "outline",
404
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefreshCw, { "data-icon": "inline-start" }), "Retry"]
405
+ }) })
406
+ ]
407
+ })
408
+ }) : patches === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
409
+ className: "flex flex-col gap-2 p-4",
410
+ children: [
411
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
412
+ className: "sr-only",
413
+ children: "Loading patches"
414
+ }),
415
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-full" }),
416
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-4 w-2/3" })
417
+ ]
418
+ }) : patches.data.length === 0 ? paged ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Empty, {
419
+ className: "py-10",
420
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTitle, { children: "No more patches" }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Button$1, {
421
+ className: "min-h-11 sm:min-h-8",
422
+ onClick: () => onPage({}),
423
+ variant: "outline",
424
+ children: "Show the newest patches"
425
+ })]
426
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Empty, {
427
+ className: "py-10",
428
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyHeader, { children: [
429
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyMedia, {
430
+ variant: "icon",
431
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(GitBranch, {})
432
+ }),
433
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTitle, { children: "No patches from this build" }),
434
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyDescription, { children: [
435
+ "A deploy adds a patch from this build's bundle while it is its scope's newest build and the deploy config turns patches on, with ",
436
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
437
+ className: "font-mono",
438
+ children: "patch"
439
+ }),
440
+ " in",
441
+ " ",
442
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
443
+ className: "font-mono",
444
+ children: "hot-updater.config.ts"
445
+ }),
446
+ "."
447
+ ] })
448
+ ] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("a", {
449
+ className: buttonVariants({
450
+ className: "min-h-11 sm:min-h-8",
451
+ variant: "outline"
452
+ }),
453
+ href: BUNDLE_DIFFING_GUIDE_URL,
454
+ rel: "noreferrer",
455
+ target: "_blank",
456
+ children: ["Bundle diffing guide", /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowUpRight, { "data-icon": "inline-end" })]
457
+ }) })]
458
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Table, {
459
+ "aria-busy": paged && query.isPlaceholderData,
460
+ "aria-label": "Patches from this build",
461
+ className: "table-fixed",
462
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, { children: [
463
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Target bundle" }),
464
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
465
+ className: "w-28",
466
+ children: "Patch size"
467
+ }),
468
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
469
+ className: "hidden w-32 sm:table-cell",
470
+ children: "Created"
471
+ })
472
+ ] }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableBody, { children: patches.data.map((patch) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, { children: [
473
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
474
+ className: "py-3 whitespace-normal",
475
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
476
+ className: "block font-mono text-xs [overflow-wrap:anywhere] underline-offset-4 hover:underline",
477
+ search: { bundleId: patch.bundleId },
478
+ title: patch.bundleId,
479
+ to: "/",
480
+ translate: "no",
481
+ children: patch.bundleId
482
+ })
483
+ }),
484
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
485
+ className: "text-xs tabular-nums",
486
+ children: formatByteSize(patch.byteSize)
487
+ }),
488
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
489
+ className: "hidden sm:table-cell",
490
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: patch.bundleId })
491
+ })
492
+ ] }, patch.bundleId)) })]
493
+ }), next !== void 0 || previous !== void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("nav", {
494
+ "aria-label": "Patch pages",
495
+ className: "flex items-center justify-end gap-2 border-t px-4 py-2",
496
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
497
+ className: "min-h-11 sm:min-h-7",
498
+ disabled: previous === void 0 || paged && query.isPlaceholderData,
499
+ onClick: () => onPage({ after: previous }),
500
+ size: "sm",
501
+ variant: "ghost",
502
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronLeft, { "data-icon": "inline-start" }), "Newer"]
503
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
504
+ className: "min-h-11 sm:min-h-7",
505
+ disabled: next === void 0 || paged && query.isPlaceholderData,
506
+ onClick: () => onPage({ before: next }),
507
+ size: "sm",
508
+ variant: "ghost",
509
+ children: ["Older", /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronRight, { "data-icon": "inline-end" })]
510
+ })]
511
+ }) : null]
512
+ })]
513
+ });
514
+ }
515
+ /**
516
+ * How an install of the build downloads `bundleId` as its first OTA: as the
517
+ * patch from the built-in bundle when one exists, else the full bundle. The
518
+ * newest page of patches decides it for every bundle down to the page's
519
+ * oldest; an older bundle is unknown only when the page is full.
520
+ */
521
+ var firstDownloadOf = (patches, bundleId) => {
522
+ const patch = patches.data.find((row) => row.bundleId === bundleId);
523
+ if (patch !== void 0) return {
524
+ kind: "patch",
525
+ byteSize: patch.byteSize
526
+ };
527
+ const oldest = patches.data.at(-1)?.bundleId;
528
+ return patches.next !== void 0 && oldest !== void 0 && bundleId < oldest ? { kind: "unknown" } : { kind: "full" };
529
+ };
530
+ function FirstDownloadCell({ download }) {
531
+ switch (download.kind) {
532
+ case "patch": return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
533
+ className: "text-xs",
534
+ children: [
535
+ "Patch",
536
+ " ",
537
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
538
+ className: "text-muted-foreground tabular-nums",
539
+ children: [
540
+ "(",
541
+ formatByteSize(download.byteSize),
542
+ ")"
543
+ ]
544
+ })
545
+ ]
546
+ });
547
+ case "full": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
548
+ className: "text-xs text-muted-foreground",
549
+ children: "Full bundle"
550
+ });
551
+ case "unknown": return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("a", {
552
+ className: "text-xs underline-offset-4 hover:underline",
553
+ href: "#patches",
554
+ children: "See patches"
555
+ });
556
+ }
557
+ }
558
+ /**
559
+ * What the update check offers an install of the build now: its scope's
560
+ * catalog at the build's app version, down to the built-in bundle, newest
561
+ * first. It is the catalog of now, not the history.
562
+ */
563
+ function ServedNowCard({ detail }) {
564
+ const { servedNow, patches, catalogScopeKey } = detail;
565
+ const scopeLink = /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Link, {
566
+ className: "inline-flex items-center gap-0.5 underline-offset-4 hover:underline",
567
+ search: { scopeKey: catalogScopeKey },
568
+ to: "/",
569
+ children: ["All releases in this scope", /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ArrowUpRight, {
570
+ "aria-hidden": "true",
571
+ className: "size-3"
572
+ })]
573
+ });
574
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Card, {
575
+ className: "overflow-hidden shadow-sm",
576
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardHeader, {
577
+ className: "border-b px-4 py-3",
578
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardTitle, {
579
+ className: "text-sm",
580
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h2", { children: "Served now" })
581
+ })
582
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(CardContent, {
583
+ className: "p-0",
584
+ children: servedNow.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Empty, {
585
+ className: "py-10",
586
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyHeader, { children: [
587
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyMedia, {
588
+ variant: "icon",
589
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PackageOpen, {})
590
+ }),
591
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTitle, { children: "No OTA for this build yet" }),
592
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyDescription, { children: [
593
+ "No release in this build's scope is newer than its built-in bundle. Deploy one with",
594
+ " ",
595
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
596
+ className: "font-mono",
597
+ children: "hot-updater deploy"
598
+ }),
599
+ ", and it shows here."
600
+ ] })
601
+ ] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
602
+ className: buttonVariants({
603
+ className: "min-h-11 sm:min-h-8",
604
+ variant: "outline"
605
+ }),
606
+ search: { scopeKey: catalogScopeKey },
607
+ to: "/",
608
+ children: "All releases in this scope"
609
+ }) })]
610
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Table, {
611
+ "aria-label": "Served now",
612
+ className: "table-fixed",
613
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHeader, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, { children: [
614
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, { children: "Bundle" }),
615
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
616
+ className: "hidden w-40 md:table-cell",
617
+ children: "Rollout"
618
+ }),
619
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
620
+ className: "hidden w-32 sm:table-cell",
621
+ children: "Created"
622
+ }),
623
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableHead, {
624
+ className: "w-32",
625
+ children: "First OTA download"
626
+ })
627
+ ] }) }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableBody, { children: servedNow.map((release) => {
628
+ const bundleId = release.bundleId;
629
+ const percentage = release.rolloutCohortCount / NUMERIC_COHORT_SIZE * 100;
630
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(TableRow, { children: [
631
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
632
+ className: "py-3 whitespace-normal",
633
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
634
+ className: "flex min-w-0 flex-col gap-1",
635
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
636
+ className: "font-mono text-xs [overflow-wrap:anywhere] underline-offset-4 hover:underline",
637
+ search: { releaseId: release.releaseId },
638
+ title: bundleId,
639
+ to: "/",
640
+ translate: "no",
641
+ children: bundleId
642
+ }), release.message ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
643
+ className: "text-xs text-muted-foreground",
644
+ children: release.message
645
+ }) : null]
646
+ })
647
+ }),
648
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
649
+ className: "hidden md:table-cell",
650
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
651
+ className: "flex flex-wrap gap-1",
652
+ children: [release.targetCohorts.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
653
+ variant: "secondary",
654
+ children: release.targetCohorts.length === 1 ? "1 cohort" : `${release.targetCohorts.length} cohorts`
655
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)(RolloutPercentageBadge, { percentage }), release.shouldForceUpdate ? /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Badge, {
656
+ variant: "outline",
657
+ children: "Forced"
658
+ }) : null]
659
+ })
660
+ }),
661
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, {
662
+ className: "hidden sm:table-cell",
663
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TimestampDisplay, { uuid: bundleId })
664
+ }),
665
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TableCell, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(FirstDownloadCell, { download: firstDownloadOf(patches, bundleId) }) })
666
+ ] }, release.releaseId);
667
+ }) })]
668
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("p", {
669
+ className: "border-t px-4 py-3 text-xs text-muted-foreground",
670
+ children: ["What the update check serves an install of this build now, newest first: not the history. ", scopeLink]
671
+ })] })
672
+ })]
673
+ });
674
+ }
675
+ /**
676
+ * One native build: how to install it, its built-in bundle as the base its
677
+ * OTAs patch from, what an install is served now, and the patches from it.
678
+ * The patch page is in the URL, so a link opens it.
679
+ */
680
+ function NativeBuildDetailPage({ buildId, search, onSearchChange }) {
681
+ const query = useNativeBuildDetailQuery(buildId);
682
+ const detail = query.data;
683
+ const page = {
684
+ ...search.patchesBefore === void 0 ? {} : { before: search.patchesBefore },
685
+ ...search.patchesAfter === void 0 ? {} : { after: search.patchesAfter }
686
+ };
687
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("div", {
688
+ className: "flex h-svh min-h-0 flex-col",
689
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)("header", {
690
+ className: "sticky top-0 z-10 flex shrink-0 items-center gap-x-2 border-b bg-background px-3 py-3 sm:min-h-12 sm:bg-card/70 sm:px-4 sm:backdrop-blur-sm",
691
+ children: [
692
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(SidebarTrigger, { className: "-ml-1 size-11 lg:size-7" }),
693
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Link, {
694
+ className: buttonVariants({
695
+ className: "min-h-11 sm:min-h-7",
696
+ size: "sm",
697
+ variant: "ghost"
698
+ }),
699
+ to: "/native-builds",
700
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(ChevronLeft, { "data-icon": "inline-start" }), "Native builds"]
701
+ }),
702
+ detail ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("h1", {
703
+ className: "flex min-w-0 items-center gap-1.5 text-sm font-medium",
704
+ children: [
705
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PlatformIcon, {
706
+ className: "size-3.5 shrink-0 text-muted-foreground",
707
+ platform: detail.build.platform
708
+ }),
709
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)("span", {
710
+ className: "min-w-0 [overflow-wrap:anywhere]",
711
+ children: [
712
+ platformLabel(detail.build.platform),
713
+ " ",
714
+ nativeBuildArtifacts[detail.build.artifact_kind].label,
715
+ " ·",
716
+ " ",
717
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
718
+ translate: "no",
719
+ children: detail.channel
720
+ })
721
+ ]
722
+ }),
723
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
724
+ className: "hidden text-xs font-normal text-muted-foreground tabular-nums sm:inline",
725
+ children: formatByteSize(detail.build.byte_size)
726
+ })
727
+ ]
728
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsx)("h1", {
729
+ className: "sr-only",
730
+ children: "Native build"
731
+ })
732
+ ]
733
+ }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
734
+ className: "min-h-0 min-w-0 flex-1 overflow-y-auto bg-muted/5 p-3 sm:p-6",
735
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", {
736
+ className: "mx-auto flex w-full max-w-5xl flex-col gap-4 sm:gap-6",
737
+ children: query.isError ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Alert, {
738
+ variant: "destructive",
739
+ children: [
740
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(TriangleAlert, {}),
741
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertTitle, { children: "The native build couldn't be loaded" }),
742
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertDescription, { children: query.error.message }),
743
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(AlertAction, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Button$1, {
744
+ onClick: () => void query.refetch(),
745
+ size: "xs",
746
+ variant: "outline",
747
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsx)(RefreshCw, { "data-icon": "inline-start" }), "Retry"]
748
+ }) })
749
+ ]
750
+ }) : detail === void 0 ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
751
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", {
752
+ className: "sr-only",
753
+ children: "Loading the native build"
754
+ }),
755
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-56 w-full rounded-xl" }),
756
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Skeleton, { className: "h-64 w-full rounded-xl" })
757
+ ] }) : detail === null ? /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(Empty, {
758
+ className: "border py-16",
759
+ children: [/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyHeader, { children: [
760
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyMedia, {
761
+ variant: "icon",
762
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(HardDrive, {})
763
+ }),
764
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyTitle, { children: "Native build not found" }),
765
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(EmptyDescription, { children: [
766
+ "No native build has this ID. It may have been deleted with",
767
+ " ",
768
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("code", {
769
+ className: "font-mono",
770
+ children: "native-build delete"
771
+ }),
772
+ ", or be from another console."
773
+ ] })
774
+ ] }), /* @__PURE__ */ (0, import_jsx_runtime.jsx)(EmptyContent, { children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Link, {
775
+ className: buttonVariants({
776
+ className: "min-h-11 sm:min-h-8",
777
+ variant: "outline"
778
+ }),
779
+ to: "/native-builds",
780
+ children: "Show all native builds"
781
+ }) })]
782
+ }) : /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
783
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(InstallCard, { build: detail.build }),
784
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(BuiltInBundleCard, { detail }),
785
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ServedNowCard, { detail }),
786
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(PatchesCard, {
787
+ detail,
788
+ onPage: (next) => onSearchChange({
789
+ ...next.before === void 0 ? {} : { patchesBefore: next.before },
790
+ ...next.after === void 0 ? {} : { patchesAfter: next.after }
791
+ }),
792
+ page
793
+ })
794
+ ] })
795
+ })
796
+ })]
797
+ });
798
+ }
799
+ function NativeBuildDetailRoute() {
800
+ const { buildId } = Route.useParams();
801
+ const search = Route.useSearch();
802
+ const navigate = Route.useNavigate();
803
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(NativeBuildDetailPage, {
804
+ buildId,
805
+ onSearchChange: (next) => void navigate({
806
+ search: next,
807
+ replace: true
808
+ }),
809
+ search
810
+ });
811
+ }
812
+ //#endregion
813
+ export { NativeBuildDetailRoute as component };