@hot-updater/console 1.0.0-rc.8 → 1.0.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 (342) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/assets/ConsoleFeatureUnavailable-jB4Loglh.js +1 -0
  3. package/.output/public/assets/EventDetails-B6yUsyNA.js +1 -0
  4. package/.output/public/assets/HashValueDisplay-BFX_kY3-.js +1 -0
  5. package/.output/public/assets/InsightsInfo-BNO0WznZ.js +1 -0
  6. package/.output/public/assets/InsightsPageHeader-B892oVml.js +1 -0
  7. package/.output/public/assets/NotFoundPage-DIqCpWa3.js +1 -0
  8. package/.output/public/assets/alert-dialog-Bbk_4-WJ.js +1 -0
  9. package/.output/public/assets/api-DCM0wr6O.js +1 -0
  10. package/.output/public/assets/api-keys-CIO9L_wu.js +1 -0
  11. package/.output/public/assets/api-keys-DVTL_--f.js +1 -0
  12. package/.output/public/assets/arrow-left-CnMYpqB7.js +1 -0
  13. package/.output/public/assets/arrow-up-right-BtffZA6e.js +1 -0
  14. package/.output/public/assets/chevron-right-BqD5wtFb.js +1 -0
  15. package/.output/public/assets/clipboard-DS9ucUQL.js +1 -0
  16. package/.output/public/assets/console-features-api-BH5m_PtQ.js +1 -0
  17. package/.output/public/assets/dialog-Bqbb7B0N.js +1 -0
  18. package/.output/public/assets/dist-LxKJB-Vu.js +1 -0
  19. package/.output/public/assets/empty-CuT2UhFp.js +1 -0
  20. package/.output/public/assets/field-BBDpjIqu.js +1 -0
  21. package/.output/public/assets/index-6o51GkFe.js +11 -0
  22. package/.output/public/assets/input-group-ja_30qaF.js +1 -0
  23. package/.output/public/assets/insights-CmraDzQh.js +1 -0
  24. package/.output/public/assets/insights-CxZ2GCYV.js +2 -0
  25. package/.output/public/assets/insights-api-BigAU9sZ.js +1 -0
  26. package/.output/public/assets/insights-usage-rpc-DYEhsCKT.js +1 -0
  27. package/.output/public/assets/insights-vNRCrfnS.js +42 -0
  28. package/.output/public/assets/insights_.distribution-ChOerfJt.js +1 -0
  29. package/.output/public/assets/insights_.distribution-D-e4iga8.js +1 -0
  30. package/.output/public/assets/insights_.distribution-DZtkibX1.js +2 -0
  31. package/.output/public/assets/installations-BazSJXE0.js +2 -0
  32. package/.output/public/assets/installations-ClHTqdAO.js +1 -0
  33. package/.output/public/assets/installations-DpKsBuHi.js +1 -0
  34. package/.output/public/assets/key-round-wS_SIZ6b.js +1 -0
  35. package/.output/public/assets/list-CgrYiadM.js +1 -0
  36. package/.output/public/assets/refresh-cw-BYgoNCco.js +1 -0
  37. package/.output/public/assets/remote-config-BWwHOkCK.js +1 -0
  38. package/.output/public/assets/remote-config-Br56BODb.js +6 -0
  39. package/.output/public/assets/remote-config-CXOi0LRu.js +1 -0
  40. package/.output/public/assets/routes-B88Erkpk.js +2 -0
  41. package/.output/public/assets/routes-CfzsAleC.js +1 -0
  42. package/.output/public/assets/search-DaTDPW25.js +1 -0
  43. package/.output/public/assets/select-BZZBXMkr.js +1 -0
  44. package/.output/public/assets/sidebar-DNVyJPfX.js +3 -0
  45. package/.output/public/assets/smartphone-DpTFgtKf.js +1 -0
  46. package/.output/public/assets/styles-DTGEAJFv.css +2 -0
  47. package/.output/public/assets/switch-DZ1TPwx-.js +1 -0
  48. package/.output/public/assets/table-Gm4qRWwE.js +1 -0
  49. package/.output/public/assets/tabs-C7FOEjFC.js +1 -0
  50. package/.output/public/assets/undo-2-CmrHjwFc.js +1 -0
  51. package/.output/public/assets/useCompositeListItem-9E4pj_CH.js +1 -0
  52. package/.output/public/assets/valueToPercent-CH8GCHaL.js +1 -0
  53. package/.output/server/__23tanstack-start-server-fn-resolver-BpRlos5Q.mjs +170 -0
  54. package/.output/server/_libs/@base-ui/react+[...].mjs +4389 -4207
  55. package/.output/server/_libs/@tanstack/react-router+[...].mjs +3802 -4022
  56. package/.output/server/_libs/@tanstack/react-router-ssr-query+[...].mjs +140 -97
  57. package/.output/server/_libs/lucide-react.mjs +221 -9
  58. package/.output/server/_libs/next-themes.mjs +1 -1
  59. package/.output/server/_libs/react-redux+[...].mjs +1 -1
  60. package/.output/server/_libs/recharts+[...].mjs +483 -901
  61. package/.output/server/_libs/sonner.mjs +1 -1
  62. package/.output/server/_libs/tanstack__history.mjs +68 -41
  63. package/.output/server/_libs/tanstack__query-core.mjs +2010 -309
  64. package/.output/server/_libs/tanstack__react-query.mjs +448 -21
  65. package/.output/server/_libs/verkit.mjs +102 -1
  66. package/.output/server/_ssr/BundleIdDisplay-x94o9rlU.mjs +13 -0
  67. package/.output/server/_ssr/ConsoleFeatureUnavailable-ldW8v8-q.mjs +58 -0
  68. package/.output/server/_ssr/EventDetails-Q8kfj9Nr.mjs +344 -0
  69. package/.output/server/_ssr/{HashValueDisplay-C5tS4oGo.mjs → HashValueDisplay-n1GholGS.mjs} +3 -3
  70. package/.output/server/_ssr/InsightsInfo-DuJFatQO.mjs +75 -0
  71. package/.output/server/_ssr/InsightsPageHeader-BSUX3Ye9.mjs +145 -0
  72. package/.output/server/_ssr/NotFoundPage-DZzOOzS3.mjs +37 -0
  73. package/.output/server/_ssr/{dialog-WiIAKl4L.mjs → alert-dialog-C43Doa0I.mjs} +6 -83
  74. package/.output/server/_ssr/{api-keys-aXriWrv7.mjs → api-keys-B4sYm8dM.mjs} +48 -9
  75. package/.output/server/_ssr/api-keys-CEnM9fqG.mjs +5 -0
  76. package/.output/server/_ssr/api-keys-rpc-BIFuUgMt.mjs +52 -0
  77. package/.output/server/_ssr/api-oZjRn9tP.mjs +186 -0
  78. package/.output/server/_ssr/api-rpc-BNiFRRK8.mjs +240 -0
  79. package/.output/server/_ssr/{auth-BF8mbAgF.mjs → auth-UP0wXs4i.mjs} +1 -1
  80. package/.output/server/_ssr/{auth-rpc-B7w3AdRr.mjs → auth-rpc-DnZqYxyq.mjs} +6 -6
  81. package/.output/server/_ssr/auth.server-DFpyxRDd.mjs +5374 -0
  82. package/.output/server/_ssr/bundleActivity-M5gzBFNg.mjs +18 -0
  83. package/.output/server/_ssr/config-WVX4IxSR.mjs +15 -0
  84. package/.output/server/_ssr/config.server-DskXCAyI.mjs +35 -0
  85. package/.output/server/_ssr/console-access-BJfAXknd.mjs +17 -0
  86. package/.output/server/_ssr/console-features-Oz0q20jJ.mjs +61 -0
  87. package/.output/server/_ssr/console-features-api-C9kiKvaV.mjs +43 -0
  88. package/.output/server/_ssr/console-features-rpc-P0GL7Z-R.mjs +19 -0
  89. package/.output/server/_ssr/{createServerFn-B2hcXoPM.mjs → createMiddleware-Cm6Tn0_Y.mjs} +67 -56
  90. package/.output/server/_ssr/{createServerRpc-DB29C_5p.mjs → createServerRpc-RLR4H-Fn.mjs} +2 -2
  91. package/.output/server/_ssr/databaseConfig-C5SkAyUy.mjs +5 -0
  92. package/.output/server/_ssr/{databaseJsonValue-d6I3nAS4.mjs → databaseJsonValue-Csbuzc9Q.mjs} +28 -5
  93. package/.output/server/_ssr/databaseRows-CPphvbag.mjs +73 -0
  94. package/.output/server/_ssr/dialog-BbYDMjdC.mjs +84 -0
  95. package/.output/server/_ssr/{dist-CyzPaI5v.mjs → dist-CbQbBIw-.mjs} +140 -7
  96. package/.output/server/_ssr/{downloadBundle-CI7JUKvC.mjs → downloadBundle-CZysjmNW.mjs} +10 -10
  97. package/.output/server/_ssr/empty-CVLGfxuu.mjs +60 -0
  98. package/.output/server/_ssr/{empty-plugin-adapters-B5QvGpEl.mjs → empty-plugin-adapters-CPtwX8a7.mjs} +1 -1
  99. package/.output/server/_ssr/failureReports-DKDhVsXA.mjs +33 -0
  100. package/.output/server/_ssr/field-asw83X0v.mjs +189 -0
  101. package/.output/server/_ssr/getBundleChildren-Cv9iz1As.mjs +22 -0
  102. package/.output/server/_ssr/{input-group-Coj6SwVP.mjs → input-group-CuYJHosb.mjs} +2 -2
  103. package/.output/server/_ssr/insights-B55FG5fm.mjs +14 -0
  104. package/.output/server/_ssr/insights-CWnHIFUV.mjs +5 -0
  105. package/.output/server/_ssr/insights-CpLpedFZ.mjs +2315 -0
  106. package/.output/server/_ssr/insights-api-sjws23WF.mjs +122 -0
  107. package/.output/server/_ssr/insights-errors-BjnFUyZj.mjs +34 -0
  108. package/.output/server/_ssr/insights-failures-rpc-BvbWvqNf.mjs +36 -0
  109. package/.output/server/_ssr/insights-failures-xaa41Buf.mjs +46 -0
  110. package/.output/server/_ssr/insights-recovery-BWQhiZaF.mjs +28 -0
  111. package/.output/server/_ssr/insights-recovery-rpc-GiYXdkaY.mjs +32 -0
  112. package/.output/server/_ssr/{insights-rpc-l2-oBYth.mjs → insights-rpc-DP_8Rmz4.mjs} +22 -14
  113. package/.output/server/_ssr/insights-usage-BpBM0U0c.mjs +29 -0
  114. package/.output/server/_ssr/insights-usage-rpc-BiolgB8e.mjs +29 -0
  115. package/.output/server/_ssr/insights-usage-rpc-KStL0zOx.mjs +41 -0
  116. package/.output/server/_ssr/insightsUsage-CzhVjsc8.mjs +56 -0
  117. package/.output/server/_ssr/insights_.distribution-CVrnbP3R.mjs +7 -0
  118. package/.output/server/_ssr/insights_.distribution-D2HaNTAA.mjs +16 -0
  119. package/.output/server/_ssr/{insights_.distribution-INw6QxbU.mjs → insights_.distribution-DN9pR422.mjs} +50 -22
  120. package/.output/server/_ssr/installations-BHmbbnH8.mjs +5 -0
  121. package/.output/server/_ssr/{installations-DH-tQuRo.mjs → installations-BSCmFq8Q.mjs} +279 -367
  122. package/.output/server/_ssr/installations-DD1g__Nc.mjs +69 -0
  123. package/.output/server/_ssr/listReleases-BfUBlCHo.mjs +79 -0
  124. package/.output/server/_ssr/plugins-BaD1slHx.mjs +2086 -0
  125. package/.output/server/_ssr/release-adoption-005tQRpo.mjs +55 -0
  126. package/.output/server/_ssr/release-adoption-rpc-BsstqxUp.mjs +41 -0
  127. package/.output/server/_ssr/releaseAdoption-CtOFkwli.mjs +114 -0
  128. package/.output/server/_ssr/releaseManagement-DFMUnDF5.mjs +11 -0
  129. package/.output/server/_ssr/remote-config-C2Ee8lXO.mjs +5 -0
  130. package/.output/server/_ssr/remote-config-Dv1ccMo-.mjs +17 -0
  131. package/.output/server/_ssr/remote-config-of0lGQH8.mjs +2648 -0
  132. package/.output/server/_ssr/remote-config-rpc-BzX31mUS.mjs +115 -0
  133. package/.output/server/_ssr/rolldown-runtime-rSIU-vHC.mjs +13 -0
  134. package/.output/server/_ssr/{router-DfFyAp5p.mjs → router-D8NuoJ_I.mjs} +117 -136
  135. package/.output/server/_ssr/{routes-BtsfVx-p.mjs → routes-DgvnFqDy.mjs} +195 -429
  136. package/.output/server/_ssr/routes-V8sDybGf.mjs +409 -0
  137. package/.output/server/_ssr/runtime.server-De0QVWc9.mjs +104 -0
  138. package/.output/server/_ssr/schema-BiAVyEj2.mjs +361 -0
  139. package/.output/server/_ssr/{select-CyvLaMza.mjs → select-t3iXRwc9.mjs} +3 -3
  140. package/.output/server/_ssr/server-h4VxnExB.mjs +8325 -0
  141. package/.output/server/_ssr/{createSsrRpc-C-dLcQuy.mjs → sidebar-DJcErBMo.mjs} +107 -47
  142. package/.output/server/_ssr/ssr.mjs +1 -1
  143. package/.output/server/_ssr/start-BfFbHKMK.mjs +4 -0
  144. package/.output/server/_ssr/switch-E-btwMGt.mjs +43 -0
  145. package/.output/server/_ssr/{table-CkVhsNpe.mjs → table-37Dd23TN.mjs} +2 -2
  146. package/.output/server/_ssr/tabs-DEFnTm95.mjs +45 -0
  147. package/.output/server/_ssr/updateFailures-H6pnnYK4.mjs +40 -0
  148. package/.output/server/_ssr/{uuidv7-D0QFkPL_.mjs → uuidv7-C88s9jWF.mjs} +2 -2
  149. package/.output/server/_tanstack-start-manifest_v-55AGsehh.mjs +139 -0
  150. package/.output/server/index.mjs +303 -205
  151. package/LICENSE +13 -14
  152. package/README.md +80 -71
  153. package/lib/index.d.mts +23 -11
  154. package/lib/vite-internal.mjs +13 -3
  155. package/lib/vite.d.mts +2 -0
  156. package/package.json +14 -14
  157. package/src/components/AppSidebar.tsx +74 -75
  158. package/src/components/ConsoleAccessPage.tsx +5 -1
  159. package/src/components/ConsoleFeatureUnavailable.tsx +80 -0
  160. package/src/components/NotFoundPage.tsx +7 -7
  161. package/src/components/features/FeatureSlots.tsx +103 -0
  162. package/src/components/features/api-keys/apiKeysFeatureUi.tsx +15 -0
  163. package/src/components/features/bundles/BundleMetadata.tsx +8 -5
  164. package/src/components/features/bundles/RolloutCohortsDialog.tsx +1 -1
  165. package/src/components/features/channels/ChannelManagementDialog.tsx +8 -6
  166. package/src/components/features/insights/AppUsage.tsx +41 -14
  167. package/src/components/features/insights/BuiltinBundle.tsx +36 -0
  168. package/src/components/features/insights/ComparedBundlesChart.tsx +310 -0
  169. package/src/components/features/insights/EstimatedCount.tsx +18 -0
  170. package/src/components/features/insights/EventDetails.tsx +390 -26
  171. package/src/components/features/insights/EventHistoryCard.tsx +111 -25
  172. package/src/components/features/insights/EventHistoryList.tsx +1 -1
  173. package/src/components/features/insights/FailureReports.tsx +407 -0
  174. package/src/components/features/insights/InsightsControls.tsx +240 -142
  175. package/src/components/features/insights/InsightsErrorAlert.tsx +14 -1
  176. package/src/components/features/insights/InsightsOverview.tsx +601 -403
  177. package/src/components/features/insights/InsightsPageHeader.tsx +19 -14
  178. package/src/components/features/insights/InsightsPeriodSelector.tsx +67 -12
  179. package/src/components/features/insights/InstallationHistoryCard.tsx +65 -10
  180. package/src/components/features/insights/InstallationMatchesCard.tsx +1 -1
  181. package/src/components/features/insights/ReleaseActivity.tsx +308 -0
  182. package/src/components/features/insights/ReportingDevicesSummary.tsx +13 -13
  183. package/src/components/features/insights/RollbackButton.tsx +118 -0
  184. package/src/components/features/insights/UpdateFailures.tsx +382 -0
  185. package/src/components/features/insights/insightsFeatureUi.tsx +35 -0
  186. package/src/components/features/releases/ReleaseEditorSheet.tsx +27 -13
  187. package/src/components/features/remote-config/ConditionDialog.tsx +592 -0
  188. package/src/components/features/remote-config/ConditionsCard.tsx +247 -0
  189. package/src/components/features/remote-config/ParameterDialog.tsx +426 -0
  190. package/src/components/features/remote-config/ParametersCard.tsx +254 -0
  191. package/src/components/features/remote-config/PreviewCard.tsx +284 -0
  192. package/src/components/features/remote-config/PublishDialog.tsx +325 -0
  193. package/src/components/features/remote-config/RemoteConfigPage.tsx +353 -0
  194. package/src/components/features/remote-config/RuleSummary.tsx +21 -0
  195. package/src/components/features/remote-config/ValueInput.tsx +151 -0
  196. package/src/components/features/remote-config/VersionsCard.tsx +384 -0
  197. package/src/components/features/remote-config/remoteConfigFeatureUi.tsx +15 -0
  198. package/src/components/features/remote-config/useDateTimeText.ts +16 -0
  199. package/src/components/ui/sidebar.tsx +22 -29
  200. package/src/index.ts +26 -19
  201. package/src/lib/api-keys-api.ts +0 -28
  202. package/src/lib/api-keys-rpc.ts +27 -38
  203. package/src/lib/api-rpc.ts +125 -288
  204. package/src/lib/api.ts +15 -134
  205. package/src/lib/bundle-activity.ts +24 -4
  206. package/src/lib/console-access.ts +20 -0
  207. package/src/lib/console-features-api.ts +68 -0
  208. package/src/lib/console-features-rpc.ts +13 -0
  209. package/src/lib/console-features.ts +98 -0
  210. package/src/lib/insights-api.ts +56 -2
  211. package/src/lib/insights-errors.ts +64 -0
  212. package/src/lib/insights-failures-rpc.ts +36 -0
  213. package/src/lib/insights-failures.ts +130 -0
  214. package/src/lib/insights-recovery-rpc.ts +13 -17
  215. package/src/lib/insights-recovery.ts +12 -36
  216. package/src/lib/insights-retention.ts +21 -0
  217. package/src/lib/insights-rpc.ts +30 -12
  218. package/src/lib/insights-search.ts +50 -4
  219. package/src/lib/insights-usage-rpc.ts +15 -9
  220. package/src/lib/insights-usage.ts +41 -3
  221. package/src/lib/insights-view.ts +34 -5
  222. package/src/lib/release-adoption-api.ts +214 -0
  223. package/src/lib/release-adoption-rpc.ts +49 -0
  224. package/src/lib/release-adoption.ts +164 -0
  225. package/src/lib/remote-config-api.ts +119 -0
  226. package/src/lib/remote-config-draft.ts +666 -0
  227. package/src/lib/remote-config-rpc.ts +196 -0
  228. package/src/lib/scroll-restoration.ts +21 -0
  229. package/src/lib/server/auth.server.ts +13 -5
  230. package/src/lib/server/bundleActivity.ts +27 -28
  231. package/src/lib/server/config.server.ts +21 -76
  232. package/src/lib/server/console-feature-apis.ts +70 -0
  233. package/src/lib/server/console-runtime.server.ts +82 -38
  234. package/src/lib/server/downloadBundle.ts +14 -15
  235. package/src/lib/server/failureReports.ts +50 -0
  236. package/src/lib/server/getBundleChildren.ts +31 -122
  237. package/src/lib/server/insightsUsage.ts +52 -113
  238. package/src/lib/server/listReleases.ts +109 -44
  239. package/src/lib/server/releaseAdoption.ts +151 -0
  240. package/src/lib/server/releaseReachability.ts +8 -8
  241. package/src/lib/server/remoteConfig.ts +75 -0
  242. package/src/lib/server/runtime.server.ts +120 -31
  243. package/src/lib/server/updateFailures.ts +66 -0
  244. package/src/lib/use-dialog-target.ts +27 -0
  245. package/src/routeTree.gen.ts +44 -44
  246. package/src/router.tsx +3 -2
  247. package/src/routes/-installations-search.ts +32 -8
  248. package/src/routes/-releases-search.ts +76 -29
  249. package/src/routes/__root.tsx +7 -1
  250. package/src/routes/api/bundles/$bundleId/download.ts +2 -5
  251. package/src/routes/api-keys.tsx +5 -2
  252. package/src/routes/index.tsx +210 -152
  253. package/src/routes/insights.tsx +91 -23
  254. package/src/routes/insights_.distribution.tsx +50 -9
  255. package/src/routes/installations.tsx +97 -40
  256. package/src/routes/remote-config.tsx +42 -0
  257. package/src/styles.css +9 -0
  258. package/src/vite-internal.ts +15 -3
  259. package/src/vite.ts +2 -0
  260. package/.output/public/assets/HashValueDisplay-BpTc3Oyg.js +0 -1
  261. package/.output/public/assets/InsightsPageHeader-DC2eEst8.js +0 -1
  262. package/.output/public/assets/api-CdUyUqzR.js +0 -42
  263. package/.output/public/assets/api-keys-64PM9PwW.js +0 -1
  264. package/.output/public/assets/api-keys-api-BeaJnvY5.js +0 -1
  265. package/.output/public/assets/arrow-left-04Rh8Zgp.js +0 -1
  266. package/.output/public/assets/card-CYHs5FZv.js +0 -1
  267. package/.output/public/assets/chart-no-axes-combined-DwyMsVFW.js +0 -1
  268. package/.output/public/assets/createServerFn-DU71xucx.js +0 -3
  269. package/.output/public/assets/dialog-IVMkBRCq.js +0 -1
  270. package/.output/public/assets/dist-BR4GzeEu.js +0 -1
  271. package/.output/public/assets/field-B3CYDpjg.js +0 -1
  272. package/.output/public/assets/index-C39o7rJH.js +0 -10
  273. package/.output/public/assets/info-C3y9HNoU.js +0 -1
  274. package/.output/public/assets/input-group-nLZylhWF.js +0 -1
  275. package/.output/public/assets/insights-Bm9v8uO3.js +0 -2
  276. package/.output/public/assets/insights-DS3iO7Up.js +0 -1
  277. package/.output/public/assets/insights-search-Byj3g3Mp.js +0 -1
  278. package/.output/public/assets/insights-usage-rpc-BaGR3lgq.js +0 -1
  279. package/.output/public/assets/insights_.distribution-B1i6cjlQ.js +0 -1
  280. package/.output/public/assets/insights_.distribution-C1Wf27eB.js +0 -2
  281. package/.output/public/assets/installations-CkFW4fV9.js +0 -2
  282. package/.output/public/assets/installations-DxTaIcHD.js +0 -1
  283. package/.output/public/assets/lazyRouteComponent-BapzjYnb.js +0 -1
  284. package/.output/public/assets/list-Dqt53fWZ.js +0 -1
  285. package/.output/public/assets/loader-circle-CUKfUqow.js +0 -1
  286. package/.output/public/assets/preload-helper-ClBMtM1g.js +0 -1
  287. package/.output/public/assets/refresh-cw-CNE_2PnD.js +0 -1
  288. package/.output/public/assets/routes-Cgtvspjg.js +0 -2
  289. package/.output/public/assets/routes-O2r2UUN8.js +0 -1
  290. package/.output/public/assets/shield-check-BFcJ46kz.js +0 -1
  291. package/.output/public/assets/signing-BgspC-xP.js +0 -1
  292. package/.output/public/assets/styles-DnrWuBwd.css +0 -2
  293. package/.output/public/assets/table-BuWQgxJJ.js +0 -1
  294. package/.output/public/assets/useMutation-CSV9NCUl.js +0 -1
  295. package/.output/public/assets/useOpenInteractionType-D5kduCTD.js +0 -1
  296. package/.output/public/assets/valueToPercent-BAtcbSLk.js +0 -1
  297. package/.output/server/__23tanstack-start-server-fn-resolver-CmYkol9D.mjs +0 -150
  298. package/.output/server/_ssr/InsightsPageHeader-Dma3dVj1.mjs +0 -64
  299. package/.output/server/_ssr/api-C3bGmgY0.mjs +0 -332
  300. package/.output/server/_ssr/api-keys-api-BRF6rbRC.mjs +0 -60
  301. package/.output/server/_ssr/api-keys-rpc-BMa1ZM6N.mjs +0 -136
  302. package/.output/server/_ssr/api-rpc-BYQ2e0z6.mjs +0 -1399
  303. package/.output/server/_ssr/auth.server-CmicHh0J.mjs +0 -47
  304. package/.output/server/_ssr/bundle-signing-rpc-DbQ4pFAX.mjs +0 -16
  305. package/.output/server/_ssr/bundle-signing.server-Uqt1OF49.mjs +0 -12
  306. package/.output/server/_ssr/bundleActivity-pBrPSG01.mjs +0 -28
  307. package/.output/server/_ssr/card-B7KSO_25.mjs +0 -108
  308. package/.output/server/_ssr/config-Dv8qLDZ0.mjs +0 -13
  309. package/.output/server/_ssr/config.server-C-d1QaBU.mjs +0 -368
  310. package/.output/server/_ssr/databaseRows-5bCRTxm-.mjs +0 -126
  311. package/.output/server/_ssr/deleteBundle-8X-jq7Z7.mjs +0 -66
  312. package/.output/server/_ssr/field-BDwuU8RE.mjs +0 -74
  313. package/.output/server/_ssr/getBundleChildren-DoL8l_AS.mjs +0 -50
  314. package/.output/server/_ssr/insights-BDJjaDLp.mjs +0 -938
  315. package/.output/server/_ssr/insights-D0FWpfOS.mjs +0 -10
  316. package/.output/server/_ssr/insights-recovery-Cv6RSyeR.mjs +0 -21
  317. package/.output/server/_ssr/insights-recovery-rpc-BE9YsK_T.mjs +0 -37
  318. package/.output/server/_ssr/insights-search-1czJMZgk.mjs +0 -21
  319. package/.output/server/_ssr/insights-usage-rpc-BE_aCnea.mjs +0 -184
  320. package/.output/server/_ssr/insights-usage-rpc-CtAolz-t.mjs +0 -24
  321. package/.output/server/_ssr/insightsContract-B09K_Px1.mjs +0 -303
  322. package/.output/server/_ssr/insightsHistory-Ci4rYAgl.mjs +0 -41
  323. package/.output/server/_ssr/insightsRecovery-CaghWL2t.mjs +0 -113
  324. package/.output/server/_ssr/insightsUsage-DNIj6jxF.mjs +0 -71
  325. package/.output/server/_ssr/insights_.distribution-Cp0kf1vW.mjs +0 -10
  326. package/.output/server/_ssr/installations-Bhyiwx8G.mjs +0 -29
  327. package/.output/server/_ssr/routes-xBkI2Fmt.mjs +0 -37
  328. package/.output/server/_ssr/runtime.server-CsiKFp_Z.mjs +0 -436
  329. package/.output/server/_ssr/server-BdkuOWe8.mjs +0 -7468
  330. package/.output/server/_ssr/signing-CQ70saFm.mjs +0 -133
  331. package/.output/server/_ssr/start-DpViQGnt.mjs +0 -4
  332. package/.output/server/_tanstack-start-manifest_v-CrBsoKQQ.mjs +0 -125
  333. package/src/components/features/bundles/BundleActivityChart.tsx +0 -97
  334. package/src/components/features/bundles/BundleInsightsSummary.tsx +0 -126
  335. package/src/components/features/signing/BundleSigningPage.tsx +0 -139
  336. package/src/lib/bundle-signing-api.ts +0 -14
  337. package/src/lib/bundle-signing-rpc.ts +0 -16
  338. package/src/lib/server/bundle-signing.server.ts +0 -23
  339. package/src/lib/server/deleteBundle.ts +0 -145
  340. package/src/lib/server/insightsHistory.ts +0 -52
  341. package/src/lib/server/insightsRecovery.ts +0 -187
  342. package/src/routes/signing.tsx +0 -37
@@ -1,1399 +0,0 @@
1
- import { c as createServerFn } from "./createServerFn-B2hcXoPM.mjs";
2
- import { t as createServerRpc } from "./createServerRpc-DB29C_5p.mjs";
3
- import { t as DatabasePluginInputError } from "./databaseJsonValue-d6I3nAS4.mjs";
4
- import { C as normalizeCohortValue, a as createReleaseCatalogScopeKey, b as isReleaseEligibleForCohort, i as RELEASE_CATALOG_FALLBACK_POLICY, n as MAX_COMPILED_CATALOG_BYTES, o as decodeChannelKey, p as getNumericCohortValue, r as NUMERIC_COHORT_SIZE, s as encodeChannelKey, v as getRolledOutNumericCohorts, w as normalizeRolloutCohortCount, x as isUUIDv7, y as isCustomCohort } from "./dist-CyzPaI5v.mjs";
5
- import { n as createUUIDv7After, t as createUUIDv7 } from "./uuidv7-D0QFkPL_.mjs";
6
- import { i as releaseRowToRelease } from "./databaseRows-5bCRTxm-.mjs";
7
- //#region node_modules/.nitro/vite/services/ssr/assets/api-rpc-BYQ2e0z6.js
8
- var LETTER_DASH_NUMBER = "[a-zA-Z0-9-]";
9
- var NUMERIC_IDENTIFIER = String.raw`0|[1-9]\d*`;
10
- var NUMERIC_IDENTIFIER_LOOSE = String.raw`\d+`;
11
- var NON_NUMERIC_IDENTIFIER = String.raw`\d*[a-zA-Z-]${LETTER_DASH_NUMBER}*`;
12
- var MAIN_VERSION = String.raw`(${NUMERIC_IDENTIFIER})\.(${NUMERIC_IDENTIFIER})\.(${NUMERIC_IDENTIFIER})`;
13
- var MAIN_VERSION_LOOSE = String.raw`(${NUMERIC_IDENTIFIER_LOOSE})\.(${NUMERIC_IDENTIFIER_LOOSE})\.(${NUMERIC_IDENTIFIER_LOOSE})`;
14
- var PRERELEASE_IDENTIFIER = `(?:${NON_NUMERIC_IDENTIFIER}|${NUMERIC_IDENTIFIER})`;
15
- var PRERELEASE_IDENTIFIER_LOOSE = `(?:${NON_NUMERIC_IDENTIFIER}|${NUMERIC_IDENTIFIER_LOOSE})`;
16
- var PRERELEASE = String.raw`(?:-(${PRERELEASE_IDENTIFIER}(?:\.${PRERELEASE_IDENTIFIER})*))`;
17
- var PRERELEASE_LOOSE = String.raw`(?:-?(${PRERELEASE_IDENTIFIER_LOOSE}(?:\.${PRERELEASE_IDENTIFIER_LOOSE})*))`;
18
- var BUILD_IDENTIFIER = `${LETTER_DASH_NUMBER}+`;
19
- var BUILD = String.raw`(?:\+(${BUILD_IDENTIFIER}(?:\.${BUILD_IDENTIFIER})*))`;
20
- var FULL_PLAIN = `v?${MAIN_VERSION}${PRERELEASE}?${BUILD}?`;
21
- var LOOSE_PLAIN = String.raw`[v=\s]*${MAIN_VERSION_LOOSE}${PRERELEASE_LOOSE}?${BUILD}?`;
22
- var GREATER_LESS_THAN = "((?:<|>)?=?)";
23
- var XRANGE_IDENTIFIER = String.raw`${NUMERIC_IDENTIFIER}|x|X|\*`;
24
- var XRANGE_IDENTIFIER_LOOSE = String.raw`${NUMERIC_IDENTIFIER_LOOSE}|x|X|\*`;
25
- var XRANGE_PLAIN = String.raw`[v=\s]*(${XRANGE_IDENTIFIER})(?:\.(${XRANGE_IDENTIFIER})(?:\.(${XRANGE_IDENTIFIER})(?:${PRERELEASE})?${BUILD}?)?)?`;
26
- var XRANGE_PLAIN_LOOSE = String.raw`[v=\s]*(${XRANGE_IDENTIFIER_LOOSE})(?:\.(${XRANGE_IDENTIFIER_LOOSE})(?:\.(${XRANGE_IDENTIFIER_LOOSE})(?:${PRERELEASE_LOOSE})?${BUILD}?)?)?`;
27
- var LONE_TILDE = "(?:~>?)";
28
- var LONE_CARET = String.raw`(?:\^)`;
29
- var COERCE_PLAIN = String.raw`(^|[^\d])(\d{1,${16}})(?:\.(\d{1,${16}}))?(?:\.(\d{1,${16}}))?`;
30
- var COERCE = String.raw`${COERCE_PLAIN}(?:$|[^\d])`;
31
- var COERCE_FULL = String.raw`${COERCE_PLAIN}(?:${PRERELEASE})?(?:${BUILD})?(?:$|[^\d])`;
32
- function makeSafeRegexSource(source) {
33
- const replacements = [
34
- [String.raw`\s`, 1],
35
- [String.raw`\d`, 256],
36
- [LETTER_DASH_NUMBER, 250]
37
- ];
38
- for (const [token, maximum] of replacements) source = source.split(`${token}*`).join(`${token}{0,${maximum}}`).split(`${token}+`).join(`${token}{1,${maximum}}`);
39
- return source;
40
- }
41
- function safeRegex(source, flags) {
42
- return new RegExp(makeSafeRegexSource(source), flags);
43
- }
44
- var FULL = safeRegex(`^${FULL_PLAIN}$`);
45
- var LOOSE = safeRegex(`^${LOOSE_PLAIN}$`);
46
- var NUMERIC$1 = /^\d+$/;
47
- function formatComparableVersion(version) {
48
- const base = `${version.major}.${version.minor}.${version.patch}`;
49
- return version.prerelease?.length ? `${base}-${version.prerelease.join(".")}` : base;
50
- }
51
- function parse(version, options = {}) {
52
- if (typeof version !== "string") return version;
53
- if (version.length > 256) throw new TypeError(`Version exceeds the maximum length of 256 characters`);
54
- const match = version.trim().match(options.loose ? LOOSE : FULL);
55
- if (!match) throw new TypeError(`Invalid version syntax: ${version}`);
56
- const major = Number(match[1]);
57
- const minor = Number(match[2]);
58
- const patch = Number(match[3]);
59
- if (major > Number.MAX_SAFE_INTEGER || major < 0) throw new TypeError(`Invalid major version: ${match[1]}`);
60
- if (minor > Number.MAX_SAFE_INTEGER || minor < 0) throw new TypeError(`Invalid minor version: ${match[2]}`);
61
- if (patch > Number.MAX_SAFE_INTEGER || patch < 0) throw new TypeError(`Invalid patch version: ${match[3]}`);
62
- const prerelease = match[4] ? match[4].split(".").map((identifier) => {
63
- if (NUMERIC$1.test(identifier)) {
64
- const numeric = Number(identifier);
65
- if (numeric >= 0 && numeric < Number.MAX_SAFE_INTEGER) return numeric;
66
- }
67
- return identifier;
68
- }) : void 0;
69
- return {
70
- build: match[5]?.split("."),
71
- major,
72
- minor,
73
- patch,
74
- prerelease
75
- };
76
- }
77
- function tryParse(version, options = {}) {
78
- try {
79
- return parse(version, options);
80
- } catch {
81
- return null;
82
- }
83
- }
84
- var NUMERIC = /^\d+$/;
85
- function compareIdentifiers(left, right) {
86
- if (typeof left === "number" && typeof right === "number") return left === right ? 0 : left < right ? -1 : 1;
87
- const leftNumeric = NUMERIC.test(String(left));
88
- const rightNumeric = NUMERIC.test(String(right));
89
- const normalizedLeft = leftNumeric ? Number(left) : left;
90
- const normalizedRight = rightNumeric ? Number(right) : right;
91
- return normalizedLeft === normalizedRight ? 0 : leftNumeric && !rightNumeric ? -1 : rightNumeric && !leftNumeric ? 1 : normalizedLeft < normalizedRight ? -1 : 1;
92
- }
93
- function compareMainParsed(left, right) {
94
- return left.major === right.major ? left.minor === right.minor ? left.patch === right.patch ? 0 : left.patch < right.patch ? -1 : 1 : left.minor < right.minor ? -1 : 1 : left.major < right.major ? -1 : 1;
95
- }
96
- function comparePrereleaseParsed(left, right) {
97
- const leftPrerelease = left.prerelease;
98
- const rightPrerelease = right.prerelease;
99
- if (leftPrerelease?.length && !rightPrerelease?.length) return -1;
100
- if (!leftPrerelease?.length && rightPrerelease?.length) return 1;
101
- if (!leftPrerelease?.length && !rightPrerelease?.length) return 0;
102
- for (let index = 0;; index++) {
103
- const leftIdentifier = leftPrerelease?.[index];
104
- const rightIdentifier = rightPrerelease?.[index];
105
- if (leftIdentifier === void 0 && rightIdentifier === void 0) return 0;
106
- if (rightIdentifier === void 0) return 1;
107
- if (leftIdentifier === void 0) return -1;
108
- if (leftIdentifier !== rightIdentifier) return compareIdentifiers(leftIdentifier, rightIdentifier);
109
- }
110
- }
111
- function compareParsed(left, right) {
112
- return compareMainParsed(left, right) || comparePrereleaseParsed(left, right);
113
- }
114
- function compare(left, right, options = {}) {
115
- return compareParsed(parse(left, options), parse(right, options));
116
- }
117
- var STRICT_COMPARATOR = safeRegex(String.raw`^${GREATER_LESS_THAN}\s*(${FULL_PLAIN})$|^$`);
118
- var LOOSE_COMPARATOR$1 = safeRegex(String.raw`^${GREATER_LESS_THAN}\s*(${LOOSE_PLAIN})$|^$`);
119
- function parseComparator(comparator, options = {}) {
120
- if (typeof comparator !== "string") return comparator;
121
- const normalized = comparator.trim().replaceAll(/\s+/g, " ");
122
- const match = normalized.match(options.loose ? LOOSE_COMPARATOR$1 : STRICT_COMPARATOR);
123
- if (!match) throw new TypeError(`Invalid comparator: ${normalized}`);
124
- const operator = match[1] === "=" ? "" : match[1] || "";
125
- const version = match[2] ? parse(match[2], options) : null;
126
- return {
127
- operator,
128
- options,
129
- value: version ? `${operator}${formatComparableVersion(version)}` : "",
130
- version
131
- };
132
- }
133
- var BUILD_STRIP = new RegExp(BUILD, "g");
134
- var BUILD_SAFE = safeRegex(BUILD);
135
- var STRICT_HYPHEN = safeRegex(String.raw`^\s*(${XRANGE_PLAIN})\s+-\s+(${XRANGE_PLAIN})\s*$`);
136
- var LOOSE_HYPHEN = safeRegex(String.raw`^\s*(${XRANGE_PLAIN_LOOSE})\s+-\s+(${XRANGE_PLAIN_LOOSE})\s*$`);
137
- var COMPARATOR_TRIM = safeRegex(String.raw`(\s*)${GREATER_LESS_THAN}\s*(${LOOSE_PLAIN}|${XRANGE_PLAIN})`, "g");
138
- var TILDE_TRIM = safeRegex(String.raw`(\s*)${LONE_TILDE}\s+`, "g");
139
- var CARET_TRIM = safeRegex(String.raw`(\s*)${LONE_CARET}\s+`, "g");
140
- var STRICT_TILDE = safeRegex(`^${LONE_TILDE}${XRANGE_PLAIN}$`);
141
- var LOOSE_TILDE = safeRegex(`^${LONE_TILDE}${XRANGE_PLAIN_LOOSE}$`);
142
- var STRICT_CARET = safeRegex(`^${LONE_CARET}${XRANGE_PLAIN}$`);
143
- var LOOSE_CARET = safeRegex(`^${LONE_CARET}${XRANGE_PLAIN_LOOSE}$`);
144
- var STRICT_XRANGE = safeRegex(String.raw`^${GREATER_LESS_THAN}\s*${XRANGE_PLAIN}$`);
145
- var LOOSE_XRANGE = safeRegex(String.raw`^${GREATER_LESS_THAN}\s*${XRANGE_PLAIN_LOOSE}$`);
146
- var STAR = safeRegex(String.raw`(<|>)?=?\s*\*`);
147
- var GTE_ZERO = /^\s*>=\s*0\.0\.0\s*$/;
148
- var GTE_ZERO_PRERELEASE = /^\s*>=\s*0\.0\.0-0\s*$/;
149
- var LOOSE_COMPARATOR = safeRegex(String.raw`^${GREATER_LESS_THAN}\s*(${LOOSE_PLAIN})$|^$`);
150
- function isWildcard(value) {
151
- return !value || String(value).toLowerCase() === "x" || String(value) === "*";
152
- }
153
- function hasInvalidWildcardOrder(major, minor, patch) {
154
- return isWildcard(major) && !isWildcard(minor) || isWildcard(minor) && Boolean(patch) && !isWildcard(patch);
155
- }
156
- function replaceTilde(comparator, options) {
157
- const expression = options.loose ? LOOSE_TILDE : STRICT_TILDE;
158
- const lowerPrerelease = options.includePrerelease ? "-0" : "";
159
- return comparator.replace(expression, (_match, major, minor, patch, prerelease) => {
160
- if (isWildcard(major)) return "";
161
- if (isWildcard(minor)) return `>=${major}.0.0${lowerPrerelease} <${Number(major) + 1}.0.0-0`;
162
- if (isWildcard(patch)) return `>=${major}.${minor}.0${lowerPrerelease} <${major}.${Number(minor) + 1}.0-0`;
163
- return prerelease ? `>=${major}.${minor}.${patch}-${prerelease} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0`;
164
- });
165
- }
166
- function replaceTildes(comparator, options) {
167
- return comparator.trim().split(/\s+/).map((part) => replaceTilde(part, options)).join(" ");
168
- }
169
- function replaceCaret(comparator, options) {
170
- const expression = options.loose ? LOOSE_CARET : STRICT_CARET;
171
- const lowerPrerelease = options.includePrerelease ? "-0" : "";
172
- return comparator.replace(expression, (_match, major, minor, patch, prerelease) => {
173
- if (isWildcard(major)) return "";
174
- if (isWildcard(minor)) return `>=${major}.0.0${lowerPrerelease} <${Number(major) + 1}.0.0-0`;
175
- if (isWildcard(patch)) return major === "0" ? `>=${major}.${minor}.0${lowerPrerelease} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.0${lowerPrerelease} <${Number(major) + 1}.0.0-0`;
176
- if (prerelease) return major === "0" ? minor === "0" ? `>=${major}.${minor}.${patch}-${prerelease} <${major}.${minor}.${Number(patch) + 1}-0` : `>=${major}.${minor}.${patch}-${prerelease} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.${patch}-${prerelease} <${Number(major) + 1}.0.0-0`;
177
- return major === "0" ? minor === "0" ? `>=${major}.${minor}.${patch} <${major}.${minor}.${Number(patch) + 1}-0` : `>=${major}.${minor}.${patch} <${major}.${Number(minor) + 1}.0-0` : `>=${major}.${minor}.${patch} <${Number(major) + 1}.0.0-0`;
178
- });
179
- }
180
- function replaceCarets(comparator, options) {
181
- return comparator.trim().split(/\s+/).map((part) => replaceCaret(part, options)).join(" ");
182
- }
183
- function replaceXRange(comparator, options) {
184
- const expression = options.loose ? LOOSE_XRANGE : STRICT_XRANGE;
185
- return comparator.trim().replace(expression, (match, rawOperator, rawMajor, rawMinor, rawPatch) => {
186
- let operator = rawOperator;
187
- let major = rawMajor;
188
- let minor = rawMinor;
189
- let patch = rawPatch;
190
- if (hasInvalidWildcardOrder(String(major), minor === void 0 ? void 0 : String(minor), patch === void 0 ? void 0 : String(patch))) return comparator;
191
- const wildcardMajor = isWildcard(major);
192
- const wildcardMinor = wildcardMajor || isWildcard(minor);
193
- const wildcardPatch = wildcardMinor || isWildcard(patch);
194
- if (operator === "=" && wildcardPatch) operator = "";
195
- if (wildcardMajor) return operator === ">" || operator === "<" ? "<0.0.0-0" : "*";
196
- let prerelease = options.includePrerelease ? "-0" : "";
197
- if (operator && wildcardPatch) {
198
- if (wildcardMinor) minor = 0;
199
- patch = 0;
200
- if (operator === ">") {
201
- operator = ">=";
202
- if (wildcardMinor) {
203
- major = Number(major) + 1;
204
- minor = 0;
205
- } else minor = Number(minor) + 1;
206
- } else if (operator === "<=") {
207
- operator = "<";
208
- if (wildcardMinor) major = Number(major) + 1;
209
- else minor = Number(minor) + 1;
210
- }
211
- if (operator === "<") prerelease = "-0";
212
- return `${operator}${major}.${minor}.${patch}${prerelease}`;
213
- }
214
- if (wildcardMinor) return `>=${major}.0.0${prerelease} <${Number(major) + 1}.0.0-0`;
215
- if (wildcardPatch) return `>=${major}.${minor}.0${prerelease} <${major}.${Number(minor) + 1}.0-0`;
216
- return match;
217
- });
218
- }
219
- function replaceXRanges(comparator, options) {
220
- return comparator.split(/\s+/).map((part) => replaceXRange(part, options)).join(" ");
221
- }
222
- function replaceHyphenRange(range, options) {
223
- const expression = options.loose ? LOOSE_HYPHEN : STRICT_HYPHEN;
224
- return range.replace(expression, (_match, rawFrom, fromMajor, fromMinor, fromPatch, fromPrerelease, _fromBuild, rawTo, toMajor, toMinor, toPatch, toPrerelease) => {
225
- let from = rawFrom;
226
- let to = rawTo;
227
- if (isWildcard(fromMajor)) from = "";
228
- else if (isWildcard(fromMinor)) from = `>=${fromMajor}.0.0${options.includePrerelease ? "-0" : ""}`;
229
- else if (isWildcard(fromPatch)) from = `>=${fromMajor}.${fromMinor}.0${options.includePrerelease ? "-0" : ""}`;
230
- else if (fromPrerelease) from = `>=${from}`;
231
- else from = `>=${from}${options.includePrerelease ? "-0" : ""}`;
232
- if (isWildcard(toMajor)) to = "";
233
- else if (isWildcard(toMinor)) to = `<${Number(toMajor) + 1}.0.0-0`;
234
- else if (isWildcard(toPatch)) to = `<${toMajor}.${Number(toMinor) + 1}.0-0`;
235
- else if (toPrerelease) to = `<=${toMajor}.${toMinor}.${toPatch}-${toPrerelease}`;
236
- else if (options.includePrerelease) to = `<${toMajor}.${toMinor}.${Number(toPatch) + 1}-0`;
237
- else to = `<=${to}`;
238
- return `${from} ${to}`.trim();
239
- });
240
- }
241
- function expandComparator(comparator, options) {
242
- return replaceXRanges(replaceTildes(replaceCarets(comparator.replace(BUILD_SAFE, ""), options), options), options).trim().replace(STAR, "");
243
- }
244
- function parseSimpleRange(input, options) {
245
- let parts = replaceHyphenRange(input.replace(BUILD_STRIP, ""), options).replace(COMPARATOR_TRIM, "$1$2$3").replace(TILDE_TRIM, "$1~").replace(CARET_TRIM, "$1^").split(" ").map((part) => expandComparator(part, options)).join(" ").split(/\s+/).map((part) => part.trim().replace(options.includePrerelease ? GTE_ZERO_PRERELEASE : GTE_ZERO, ""));
246
- if (options.loose) parts = parts.filter((part) => LOOSE_COMPARATOR.test(part));
247
- const unique = /* @__PURE__ */ new Map();
248
- for (const comparator of parts.map((part) => parseComparator(part, options))) {
249
- if (comparator.value === "<0.0.0-0") return [comparator];
250
- unique.set(comparator.value, comparator);
251
- }
252
- if (unique.size > 1) unique.delete("");
253
- return [...unique.values()];
254
- }
255
- function parseRange(range, options = {}) {
256
- if (typeof range !== "string") return range;
257
- const parsedOptions = { ...options };
258
- const normalizedRange = range.trim().replaceAll(/\s+/g, " ");
259
- let sets = normalizedRange.split("||").map((part) => parseSimpleRange(part.trim(), parsedOptions)).filter((set) => set.length);
260
- if (!sets.length) throw new TypeError(`Range contains no valid comparator sets: ${normalizedRange}`);
261
- if (sets.length > 1) {
262
- const first = sets[0];
263
- sets = sets.filter((set) => set[0]?.value !== "<0.0.0-0");
264
- if (!sets.length) sets = [first];
265
- else if (sets.length > 1) {
266
- const any = sets.find((set) => set.length === 1 && set[0]?.value === "");
267
- if (any) sets = [any];
268
- }
269
- }
270
- return {
271
- options: parsedOptions,
272
- sets
273
- };
274
- }
275
- safeRegex(COERCE);
276
- safeRegex(COERCE_FULL);
277
- safeRegex(`^${PRERELEASE}$`);
278
- safeRegex(`^${PRERELEASE_LOOSE}$`);
279
- function normalize(version, options = {}) {
280
- const parsed = tryParse(version, options);
281
- return parsed ? formatComparableVersion(parsed) : null;
282
- }
283
- var ReleaseCatalogCompilationError = class extends Error {
284
- code;
285
- constructor(code, message) {
286
- super(message);
287
- this.name = "ReleaseCatalogCompilationError";
288
- this.code = code;
289
- }
290
- };
291
- function compareBounds(left, right) {
292
- return compare(left, right);
293
- }
294
- function strongerLower(current, candidate) {
295
- if (current === null) return candidate;
296
- const compared = compareBounds(candidate.version, current.version);
297
- if (compared > 0) return candidate;
298
- if (compared < 0) return current;
299
- return {
300
- version: current.version,
301
- inclusive: current.inclusive && candidate.inclusive
302
- };
303
- }
304
- function strongerUpper(current, candidate) {
305
- if (current === null) return candidate;
306
- const compared = compareBounds(candidate.version, current.version);
307
- if (compared < 0) return candidate;
308
- if (compared > 0) return current;
309
- return {
310
- version: current.version,
311
- inclusive: current.inclusive && candidate.inclusive
312
- };
313
- }
314
- function comparatorVersion(comparator) {
315
- const version = comparator.version && normalize(comparator.version);
316
- if (version === null) throw new ReleaseCatalogCompilationError("INVALID_TARGET_RANGE", `Invalid comparator: ${comparator.value}`);
317
- return version;
318
- }
319
- function comparatorSetToInterval(comparators) {
320
- let lower = null;
321
- let upper = null;
322
- for (const comparator of comparators) {
323
- if (comparator.version === null) continue;
324
- const version = comparatorVersion(comparator);
325
- if (comparator.operator === "") {
326
- lower = strongerLower(lower, {
327
- inclusive: true,
328
- version
329
- });
330
- upper = strongerUpper(upper, {
331
- inclusive: true,
332
- version
333
- });
334
- } else if (comparator.operator === ">") lower = strongerLower(lower, {
335
- inclusive: false,
336
- version
337
- });
338
- else if (comparator.operator === ">=") lower = strongerLower(lower, {
339
- inclusive: true,
340
- version
341
- });
342
- else if (comparator.operator === "<") upper = strongerUpper(upper, {
343
- inclusive: false,
344
- version
345
- });
346
- else if (comparator.operator === "<=") upper = strongerUpper(upper, {
347
- inclusive: true,
348
- version
349
- });
350
- }
351
- if (lower !== null && upper !== null) {
352
- const compared = compareBounds(lower.version, upper.version);
353
- if (compared > 0 || compared === 0 && (!lower.inclusive || !upper.inclusive)) return null;
354
- }
355
- return {
356
- lower,
357
- upper
358
- };
359
- }
360
- function rangeToIntervals(range) {
361
- try {
362
- return parseRange(range).sets.flatMap((comparators) => {
363
- const interval = comparatorSetToInterval(comparators);
364
- return interval === null ? [] : [interval];
365
- });
366
- } catch {
367
- throw new ReleaseCatalogCompilationError("INVALID_TARGET_RANGE", `Invalid target app-version range: ${range}`);
368
- }
369
- }
370
- function releaseDescriptor(release) {
371
- return {
372
- releaseId: release.id,
373
- kind: release.kind,
374
- bundleId: release.bundleId,
375
- rolloutCohortCount: release.rolloutCohortCount,
376
- targetCohorts: [...new Set(release.targetCohorts)].sort(),
377
- shouldForceUpdate: release.shouldForceUpdate,
378
- message: release.message
379
- };
380
- }
381
- function validateReleases(releases, strategy) {
382
- const enabled = releases.filter((release) => release.enabled).sort((left, right) => right.id.localeCompare(left.id));
383
- const seenIds = /* @__PURE__ */ new Set();
384
- for (const release of enabled) {
385
- if (!isUUIDv7(release.id)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} must use a canonical lowercase UUIDv7 ID`);
386
- if (seenIds.has(release.id)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Duplicate Release ID: ${release.id}`);
387
- seenIds.add(release.id);
388
- if (release.strategy !== strategy) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has the wrong strategy`);
389
- if (release.kind === "BUNDLE" && release.bundleId === null || release.kind === "EMBEDDED" && release.bundleId !== null) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid kind/Bundle combination`);
390
- if (release.targetCohorts.length > 100) throw new ReleaseCatalogCompilationError("TARGET_COHORT_LIMIT", `Release ${release.id} exceeds 100 target cohorts`);
391
- if (strategy === "APP_VERSION" && (release.targetAppVersion === null || release.fingerprintHash !== null)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid app-version target`);
392
- if (strategy === "FINGERPRINT" && (release.fingerprintHash === null || release.targetAppVersion !== null)) throw new ReleaseCatalogCompilationError("INVALID_RELEASE", `Release ${release.id} has an invalid fingerprint target`);
393
- }
394
- return enabled.filter((release) => release.kind === "BUNDLE");
395
- }
396
- function collectFrontierReleaseIds(releases) {
397
- if (releases.every((release) => normalizeRolloutCohortCount(release.rolloutCohortCount) >= 1e3)) {
398
- const retained = /* @__PURE__ */ new Set();
399
- const bundleIds = /* @__PURE__ */ new Set();
400
- let embedded = false;
401
- for (const release of releases) {
402
- if (release.kind === "EMBEDDED") {
403
- if (!embedded) {
404
- embedded = true;
405
- retained.add(release.id);
406
- }
407
- } else if (release.bundleId !== null && bundleIds.size < 11 && !bundleIds.has(release.bundleId)) {
408
- bundleIds.add(release.bundleId);
409
- retained.add(release.id);
410
- }
411
- if (embedded && bundleIds.size >= 11) break;
412
- }
413
- return retained;
414
- }
415
- const explicitTargetCohorts = new Set(releases.flatMap((release) => release.targetCohorts));
416
- const cohortStates = [
417
- void 0,
418
- ...Array.from({ length: 1e3 }, (_, index) => String(index + 1)),
419
- ...[...explicitTargetCohorts].sort(),
420
- "release-catalog-non-targeted-cohort"
421
- ].map((cohort) => {
422
- const normalized = cohort === void 0 ? void 0 : normalizeCohortValue(cohort);
423
- return {
424
- isCustom: normalized !== void 0 && isCustomCohort(normalized),
425
- normalized,
426
- numeric: normalized === void 0 ? null : getNumericCohortValue(normalized),
427
- bundleIds: /* @__PURE__ */ new Set(),
428
- embedded: false,
429
- complete: false
430
- };
431
- });
432
- const stateIndexesByCohort = /* @__PURE__ */ new Map();
433
- const fullRolloutStateIndexes = [];
434
- for (const [index, state] of cohortStates.entries()) {
435
- if (state.normalized !== void 0) {
436
- const indexes = stateIndexesByCohort.get(state.normalized) ?? [];
437
- indexes.push(index);
438
- stateIndexesByCohort.set(state.normalized, indexes);
439
- }
440
- if (state.normalized === void 0 || state.numeric !== null || state.isCustom) fullRolloutStateIndexes.push(index);
441
- }
442
- const retained = /* @__PURE__ */ new Set();
443
- let incompleteStateCount = cohortStates.length;
444
- for (const release of releases) {
445
- const rolloutCohortCount = normalizeRolloutCohortCount(release.rolloutCohortCount);
446
- const eligibleStateIndexes = /* @__PURE__ */ new Set();
447
- if (rolloutCohortCount >= 1e3) for (const index of fullRolloutStateIndexes) eligibleStateIndexes.add(index);
448
- else if (rolloutCohortCount > 0) for (const numericCohort of getRolledOutNumericCohorts(release.id, rolloutCohortCount)) for (const index of stateIndexesByCohort.get(String(numericCohort)) ?? []) eligibleStateIndexes.add(index);
449
- for (const targetCohort of new Set(release.targetCohorts.map(normalizeCohortValue))) for (const index of stateIndexesByCohort.get(targetCohort) ?? []) eligibleStateIndexes.add(index);
450
- for (const index of eligibleStateIndexes) {
451
- const state = cohortStates[index];
452
- if (state.complete) continue;
453
- if (release.kind === "EMBEDDED") {
454
- if (!state.embedded) {
455
- state.embedded = true;
456
- retained.add(release.id);
457
- }
458
- } else if (release.bundleId !== null && state.bundleIds.size < 11 && !state.bundleIds.has(release.bundleId)) {
459
- state.bundleIds.add(release.bundleId);
460
- retained.add(release.id);
461
- }
462
- if (state.embedded && state.bundleIds.size >= 11) {
463
- state.complete = true;
464
- incompleteStateCount -= 1;
465
- }
466
- }
467
- if (incompleteStateCount === 0) break;
468
- }
469
- return retained;
470
- }
471
- function intervalContainsSegment(interval, segment) {
472
- if (interval.lower !== null) {
473
- if (segment.lower === null) return false;
474
- const compared = compareBounds(segment.lower.version, interval.lower.version);
475
- if (compared < 0 || compared === 0 && segment.lower.inclusive && !interval.lower.inclusive) return false;
476
- }
477
- if (interval.upper !== null) {
478
- if (segment.upper === null) return false;
479
- const compared = compareBounds(segment.upper.version, interval.upper.version);
480
- if (compared > 0 || compared === 0 && segment.upper.inclusive && !interval.upper.inclusive) return false;
481
- }
482
- return true;
483
- }
484
- function atomicVersionSegments(intervals) {
485
- const endpoints = [...new Set(intervals.flatMap((interval) => [interval.lower?.version, interval.upper?.version].filter((version) => version !== void 0)))].sort(compareBounds);
486
- if (endpoints.length === 0) return [{
487
- lower: null,
488
- upper: null
489
- }];
490
- const segments = [{
491
- lower: null,
492
- upper: {
493
- inclusive: false,
494
- version: endpoints[0]
495
- }
496
- }];
497
- for (let index = 0; index < endpoints.length; index += 1) {
498
- const endpoint = endpoints[index];
499
- segments.push({
500
- lower: {
501
- inclusive: true,
502
- version: endpoint
503
- },
504
- upper: {
505
- inclusive: true,
506
- version: endpoint
507
- }
508
- });
509
- const next = endpoints[index + 1];
510
- if (next !== void 0) segments.push({
511
- lower: {
512
- inclusive: false,
513
- version: endpoint
514
- },
515
- upper: {
516
- inclusive: false,
517
- version: next
518
- }
519
- });
520
- }
521
- segments.push({
522
- lower: {
523
- inclusive: false,
524
- version: endpoints.at(-1)
525
- },
526
- upper: null
527
- });
528
- return segments;
529
- }
530
- function sameIndexes(left, right) {
531
- return left.length === right.length && left.every((value, index) => value === right[index]);
532
- }
533
- function mergeSegments(segments) {
534
- const merged = [];
535
- for (const segment of segments) {
536
- const previous = merged.at(-1);
537
- if (previous && sameIndexes(previous.releaseIndexes, segment.releaseIndexes) && sameIndexes(previous.rollbackReleaseIndexes, segment.rollbackReleaseIndexes)) merged[merged.length - 1] = {
538
- ...previous,
539
- upper: segment.upper
540
- };
541
- else merged.push(segment);
542
- }
543
- return merged;
544
- }
545
- function compileAppVersion(releases) {
546
- const ranges = /* @__PURE__ */ new Map();
547
- for (const release of releases) ranges.set(release.id, rangeToIntervals(release.targetAppVersion));
548
- const segmentReleases = atomicVersionSegments([...ranges.values()].flat()).map((segment) => {
549
- const applicable = releases.filter((release) => ranges.get(release.id).some((range) => intervalContainsSegment(range, segment)));
550
- return {
551
- rollbackIds: new Set(applicable.map(({ id }) => id)),
552
- segment,
553
- retainedIds: collectFrontierReleaseIds(applicable)
554
- };
555
- });
556
- const retainedIds = new Set(segmentReleases.flatMap(({ retainedIds, rollbackIds }) => [...retainedIds, ...rollbackIds]));
557
- const retainedReleases = releases.filter((release) => retainedIds.has(release.id));
558
- const descriptorIndex = new Map(retainedReleases.map((release, index) => [release.id, index]));
559
- return {
560
- envelope: {
561
- fallbackPolicy: RELEASE_CATALOG_FALLBACK_POLICY,
562
- schemaVersion: 1,
563
- segments: mergeSegments(segmentReleases.map(({ segment, retainedIds, rollbackIds }) => ({
564
- ...segment,
565
- releaseIndexes: releases.filter((release) => retainedIds.has(release.id)).map((release) => descriptorIndex.get(release.id)).filter((index) => index !== void 0),
566
- rollbackReleaseIndexes: releases.filter((release) => rollbackIds.has(release.id)).map((release) => descriptorIndex.get(release.id)).filter((index) => index !== void 0)
567
- })).filter((segment) => segment.releaseIndexes.length > 0 || segment.rollbackReleaseIndexes.length > 0)),
568
- strategy: "APP_VERSION"
569
- },
570
- retainedReleases
571
- };
572
- }
573
- function compileFingerprint(releases) {
574
- const retainedIds = collectFrontierReleaseIds(releases);
575
- const retainedReleases = releases;
576
- return {
577
- envelope: {
578
- fallbackPolicy: RELEASE_CATALOG_FALLBACK_POLICY,
579
- releaseIndexes: retainedReleases.map((release, index) => retainedIds.has(release.id) ? index : -1).filter((index) => index >= 0),
580
- rollbackReleaseIndexes: retainedReleases.map((_, index) => index),
581
- schemaVersion: 1,
582
- strategy: "FINGERPRINT"
583
- },
584
- retainedReleases
585
- };
586
- }
587
- async function sha256(value) {
588
- const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
589
- return `sha256:${[...new Uint8Array(digest)].map((byte) => byte.toString(16).padStart(2, "0")).join("")}`;
590
- }
591
- function canonicalStringify(value) {
592
- if (value === null || typeof value !== "object") return JSON.stringify(value);
593
- if (Array.isArray(value)) return `[${value.map(canonicalStringify).join(",")}]`;
594
- const record = value;
595
- return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalStringify(record[key])}`).join(",")}}`;
596
- }
597
- async function compileReleaseCatalog(input) {
598
- const releases = validateReleases(input.releases, input.strategy);
599
- const targetCohorts = new Set(releases.flatMap((release) => release.targetCohorts));
600
- if (targetCohorts.size > 512) throw new ReleaseCatalogCompilationError("DISTINCT_TARGET_COHORT_LIMIT", `Scope exceeds 512 distinct target cohorts`);
601
- const { envelope, retainedReleases } = input.strategy === "APP_VERSION" ? compileAppVersion(releases) : compileFingerprint(releases);
602
- const payload = {
603
- ...envelope,
604
- releaseDescriptors: retainedReleases.map(releaseDescriptor)
605
- };
606
- const canonicalPayload = canonicalStringify(payload);
607
- const byteSize = new TextEncoder().encode(canonicalPayload).byteLength;
608
- if (byteSize > 262144) throw new ReleaseCatalogCompilationError("CATALOG_OVERSIZE", `Compiled Release catalog is ${byteSize} bytes; maximum is ${MAX_COMPILED_CATALOG_BYTES}`);
609
- return {
610
- byteSize,
611
- canonicalPayload,
612
- catalogHash: await sha256(canonicalPayload),
613
- diagnostics: {
614
- byteSize,
615
- descriptorCount: payload.releaseDescriptors.length,
616
- distinctTargetCohortCount: targetCohorts.size,
617
- releaseCount: releases.length,
618
- segmentCount: payload.strategy === "APP_VERSION" ? payload.segments.length : 1
619
- },
620
- payload
621
- };
622
- }
623
- var RELEASE_PAGE_SIZE$1 = 1e3;
624
- var DEFAULT_MAX_ATTEMPTS = 3;
625
- var ReleaseCatalogMutationError = class extends Error {
626
- code;
627
- name = "ReleaseCatalogMutationError";
628
- constructor(code, message) {
629
- super(message);
630
- this.code = code;
631
- }
632
- };
633
- var readScopeReleases = async (database, scopeKey) => {
634
- const releases = [];
635
- let afterReleaseId;
636
- for (;;) {
637
- const page = await database.models.releases.findManyByScope({
638
- scopeKey,
639
- ...afterReleaseId === void 0 ? {} : { afterReleaseId },
640
- limit: RELEASE_PAGE_SIZE$1,
641
- consistency: "strong"
642
- });
643
- for (const row of page) {
644
- if (row.scope_key !== scopeKey) throw new ReleaseCatalogMutationError("INVALID_SCOPE", `Release "${row.id}" was returned for the wrong catalog scope`);
645
- if (releases.at(-1)?.id === row.id) throw new ReleaseCatalogMutationError("INVALID_SCOPE", `Release "${row.id}" was returned more than once`);
646
- releases.push(row);
647
- }
648
- if (page.length < RELEASE_PAGE_SIZE$1) return releases;
649
- const next = page.at(-1)?.id;
650
- if (next === void 0 || next === afterReleaseId) throw new ReleaseCatalogMutationError("INVALID_SCOPE", "Release scope paging did not advance");
651
- afterReleaseId = next;
652
- }
653
- };
654
- var validateScope = (scope) => {
655
- const channelKey = encodeChannelKey(scope.channelName);
656
- if (scope.strategy === "FINGERPRINT" !== (scope.fingerprintHash !== null)) throw new ReleaseCatalogMutationError("INVALID_SCOPE", "Release catalog strategy and fingerprint are inconsistent");
657
- const expectedScopeKey = scope.strategy === "APP_VERSION" ? createReleaseCatalogScopeKey({
658
- channelKey,
659
- platform: scope.platform,
660
- strategy: "APP_VERSION"
661
- }) : createReleaseCatalogScopeKey({
662
- channelKey,
663
- fingerprintHash: scope.fingerprintHash ?? "",
664
- platform: scope.platform,
665
- strategy: "FINGERPRINT"
666
- });
667
- if (scope.scopeKey !== expectedScopeKey) throw new ReleaseCatalogMutationError("INVALID_SCOPE", "Release catalog scope metadata is inconsistent");
668
- };
669
- var applyMutation = (rows, scope, mutation) => {
670
- const currentIndex = mutation.operation === "insert" ? -1 : rows.findIndex(({ id }) => id === mutation.id);
671
- const current = currentIndex < 0 ? void 0 : rows[currentIndex];
672
- if (mutation.operation === "insert") {
673
- const latestId = rows.at(-1)?.id;
674
- if (mutation.row.scope_key !== scope.scopeKey || mutation.row.channel_id !== scope.channelId || mutation.row.platform !== scope.platform || mutation.row.strategy !== scope.strategy || mutation.row.fingerprint_hash !== scope.fingerprintHash || mutation.row.revision !== 1) throw new ReleaseCatalogMutationError("INVALID_SCOPE", "Inserted Release does not match its catalog scope");
675
- if (latestId !== void 0 && mutation.row.id <= latestId) throw new ReleaseCatalogMutationError("NON_MONOTONIC_RELEASE_ID", `Release "${mutation.row.id}" must sort after "${latestId}"`);
676
- return {
677
- change: {
678
- model: "releases",
679
- operation: "insert",
680
- row: mutation.row
681
- },
682
- expectedRevision: null,
683
- nextRows: [...rows, mutation.row],
684
- release: mutation.row
685
- };
686
- }
687
- if (current === void 0) throw new ReleaseCatalogMutationError("RELEASE_NOT_FOUND", `Release "${mutation.id}" was not found in scope "${scope.scopeKey}"`);
688
- if (mutation.operation === "delete") return {
689
- change: {
690
- model: "releases",
691
- operation: "delete",
692
- where: { id: mutation.id }
693
- },
694
- expectedRevision: current.revision,
695
- nextRows: rows.filter(({ id }) => id !== mutation.id),
696
- release: null
697
- };
698
- const release = {
699
- ...current,
700
- ...mutation.update,
701
- revision: current.revision + 1
702
- };
703
- return {
704
- change: {
705
- model: "releases",
706
- operation: "update",
707
- where: { id: mutation.id },
708
- update: {
709
- ...mutation.update,
710
- revision: release.revision
711
- }
712
- },
713
- expectedRevision: current.revision,
714
- nextRows: rows.map((row) => row.id === release.id ? release : row),
715
- release
716
- };
717
- };
718
- var catalogIdentity = (current, rows) => {
719
- if (current !== null) return current.catalog_id;
720
- if (rows.length > 0) throw new ReleaseCatalogMutationError("CATALOG_IDENTITY_MISSING", "Catalog history is missing. Restore its catalog row from backup before rebuilding or deploying.");
721
- return createUUIDv7();
722
- };
723
- var readCatalogScope = async (database, scopeKey) => {
724
- let currentCatalog = await database.models.releaseCatalogs.findByScopeKey(scopeKey);
725
- let rows = await readScopeReleases(database, scopeKey);
726
- if (currentCatalog === null && rows.length > 0) {
727
- currentCatalog = await database.models.releaseCatalogs.findByScopeKey(scopeKey);
728
- if (currentCatalog !== null) rows = await readScopeReleases(database, scopeKey);
729
- }
730
- return {
731
- currentCatalog,
732
- rows
733
- };
734
- };
735
- var prepareReleaseCatalogMutation = async (database, mutationInput) => {
736
- const { rows, currentCatalog } = await readCatalogScope(database, mutationInput.scope.scopeKey);
737
- const applied = applyMutation(rows, mutationInput.scope, mutationInput.mutation);
738
- const compilation = await compileReleaseCatalog({
739
- strategy: mutationInput.scope.strategy,
740
- releases: applied.nextRows.map(releaseRowToRelease)
741
- });
742
- const generation = (currentCatalog?.generation ?? 0) + 1;
743
- if (!Number.isSafeInteger(generation)) throw new ReleaseCatalogMutationError("CATALOG_GENERATION_EXHAUSTED", `Catalog "${mutationInput.scope.scopeKey}" exhausted its generation counter`);
744
- return {
745
- applied,
746
- catalog: {
747
- scope_key: mutationInput.scope.scopeKey,
748
- catalog_id: catalogIdentity(currentCatalog, rows),
749
- strategy: mutationInput.scope.strategy,
750
- channel_id: mutationInput.scope.channelId,
751
- channel_key: encodeChannelKey(mutationInput.scope.channelName),
752
- platform: mutationInput.scope.platform,
753
- fingerprint_hash: mutationInput.scope.fingerprintHash,
754
- generation,
755
- payload: compilation.canonicalPayload,
756
- catalog_hash: compilation.catalogHash,
757
- byte_size: compilation.byteSize,
758
- is_tombstone: compilation.payload.releaseDescriptors.length === 0,
759
- updated_at_ms: mutationInput.updatedAtMs ?? Date.now()
760
- },
761
- compilation,
762
- currentCatalog,
763
- mutationInput
764
- };
765
- };
766
- async function preflightReleaseCatalogMutation(input) {
767
- validateScope(input.scope);
768
- const prepared = await prepareReleaseCatalogMutation(input.database, input);
769
- return {
770
- catalog: prepared.catalog,
771
- currentCatalog: prepared.currentCatalog,
772
- diagnostics: prepared.compilation.diagnostics,
773
- expectedReleaseRevision: prepared.applied.expectedRevision,
774
- release: prepared.applied.release
775
- };
776
- }
777
- async function commitReleaseCatalogMutations(input) {
778
- if (input.mutations.length === 0) return [];
779
- const scopeKeys = /* @__PURE__ */ new Set();
780
- for (const mutation of input.mutations) {
781
- validateScope(mutation.scope);
782
- if (scopeKeys.has(mutation.scope.scopeKey)) throw new ReleaseCatalogMutationError("INVALID_SCOPE", `A batch cannot mutate catalog scope "${mutation.scope.scopeKey}" more than once`);
783
- scopeKeys.add(mutation.scope.scopeKey);
784
- }
785
- const maxAttempts = input.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
786
- if (!Number.isSafeInteger(maxAttempts) || maxAttempts <= 0) throw new RangeError("maxAttempts must be a positive safe integer");
787
- for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
788
- const prepared = await Promise.all(input.mutations.map((mutationInput) => prepareReleaseCatalogMutation(input.database, mutationInput)));
789
- const result = await input.database.commit({
790
- expectations: prepared.flatMap(({ applied, currentCatalog, mutationInput }) => [{
791
- model: "releases",
792
- id: mutationInput.mutation.operation === "insert" ? mutationInput.mutation.row.id : mutationInput.mutation.id,
793
- revision: applied.expectedRevision
794
- }, {
795
- model: "releaseCatalogs",
796
- scopeKey: mutationInput.scope.scopeKey,
797
- generation: currentCatalog?.generation ?? null
798
- }]),
799
- changes: prepared.flatMap(({ applied, catalog, mutationInput }) => [
800
- ...mutationInput.companionChanges ?? [],
801
- applied.change,
802
- {
803
- model: "releaseCatalogs",
804
- operation: "put",
805
- row: catalog
806
- },
807
- ...mutationInput.trailingChanges ?? []
808
- ])
809
- });
810
- if (result.committed) return prepared.map(({ applied, catalog }) => ({
811
- attempts: attempt,
812
- catalog,
813
- release: applied.release
814
- }));
815
- if (result.conflict.reason !== "version_conflict") throw new ReleaseCatalogMutationError("INVALID_SCOPE", `Release mutation failed: ${result.conflict.reason}`);
816
- }
817
- throw new ReleaseCatalogMutationError("VERSION_CONFLICT", `Release catalog mutation batch conflicted ${maxAttempts} times`);
818
- }
819
- async function commitReleaseCatalogMutation(input) {
820
- const [result] = await commitReleaseCatalogMutations({
821
- database: input.database,
822
- maxAttempts: input.maxAttempts,
823
- mutations: [input]
824
- });
825
- return result;
826
- }
827
- var RELEASE_PAGE_SIZE = 1e3;
828
- var ReleaseManagementError = class extends Error {
829
- code;
830
- name = "ReleaseManagementError";
831
- constructor(code, message) {
832
- super(message);
833
- this.code = code;
834
- }
835
- };
836
- var readReleaseScope = async (database, scopeKey) => {
837
- const rows = [];
838
- let afterReleaseId;
839
- for (;;) {
840
- const page = await database.models.releases.findManyByScope({
841
- scopeKey,
842
- ...afterReleaseId === void 0 ? {} : { afterReleaseId },
843
- consistency: "strong",
844
- limit: RELEASE_PAGE_SIZE
845
- });
846
- rows.push(...page);
847
- if (page.length < RELEASE_PAGE_SIZE) return rows;
848
- const nextCursor = page.at(-1)?.id;
849
- if (nextCursor === void 0 || nextCursor === afterReleaseId) throw new ReleaseCatalogMutationError("INVALID_SCOPE", `Release paging did not advance for scope "${scopeKey}".`);
850
- afterReleaseId = nextCursor;
851
- }
852
- };
853
- var createForwardReleaseId = (rows, candidates, nowMs) => {
854
- return createUUIDv7After([...candidates, rows.at(-1)?.id ?? null].filter((value) => value !== null && isUUIDv7(value)).sort().at(-1) ?? null, nowMs);
855
- };
856
- var prepareTargetScope = async ({ channelName, database, fingerprintHash, platform, strategy }) => {
857
- const channelKey = encodeChannelKey(channelName);
858
- const channel = (await database.models.channels.list({})).channels.find(({ name }) => name === channelName) ?? (await database.models.channels.insert({
859
- row: {
860
- id: `channel:${channelKey}`,
861
- name: channelName
862
- },
863
- onConflict: "returnExisting"
864
- })).row;
865
- const scopeKey = strategy === "APP_VERSION" ? createReleaseCatalogScopeKey({
866
- channelKey,
867
- platform,
868
- strategy
869
- }) : createReleaseCatalogScopeKey({
870
- channelKey,
871
- fingerprintHash: fingerprintHash ?? "",
872
- platform,
873
- strategy
874
- });
875
- return { scope: {
876
- channelId: channel.id,
877
- channelName,
878
- fingerprintHash,
879
- platform,
880
- scopeKey,
881
- strategy
882
- } };
883
- };
884
- var loadReleaseTarget = async (input) => {
885
- const release = await input.database.models.releases.findById(input.releaseId);
886
- if (release === null) throw new ReleaseManagementError("RELEASE_NOT_FOUND", `Release "${input.releaseId}" was not found.`);
887
- if (input.expectedRevision !== void 0 && input.expectedRevision !== release.revision) throw new ReleaseManagementError("VERSION_CONFLICT", `Release "${release.id}" is revision ${release.revision}; expected ${input.expectedRevision}.`);
888
- const catalog = await input.database.models.releaseCatalogs.findByScopeKey(release.scope_key);
889
- if (catalog === null) throw new ReleaseCatalogMutationError("INVALID_SCOPE", `Release "${release.id}" has no catalog projection.`);
890
- return {
891
- release,
892
- scope: {
893
- channelId: release.channel_id,
894
- channelName: decodeChannelKey(catalog.channel_key),
895
- fingerprintHash: release.fingerprint_hash,
896
- platform: release.platform,
897
- scopeKey: release.scope_key,
898
- strategy: release.strategy
899
- }
900
- };
901
- };
902
- var releasePolicyUpdate = (release, patch, updatedAtMs) => {
903
- if (patch.fingerprintHash !== void 0 && patch.fingerprintHash !== release.fingerprint_hash) throw new ReleaseManagementError("SCOPE_MOVE_UNSUPPORTED", "Changing a fingerprint target requires an atomic Release scope move.");
904
- return {
905
- ...patch.enabled === void 0 ? {} : { enabled: patch.enabled },
906
- ...patch.message === void 0 ? {} : { message: patch.message },
907
- ...patch.rolloutCohortCount === void 0 ? {} : { rollout_cohort_count: patch.rolloutCohortCount },
908
- ...patch.shouldForceUpdate === void 0 ? {} : { should_force_update: patch.shouldForceUpdate },
909
- ...patch.targetAppVersion === void 0 ? {} : { target_app_version: patch.targetAppVersion },
910
- ...patch.targetCohorts === void 0 ? {} : { target_cohorts: [...patch.targetCohorts] },
911
- updated_at_ms: updatedAtMs
912
- };
913
- };
914
- async function updateReleasePolicy(input) {
915
- const { release, scope } = await loadReleaseTarget(input);
916
- const updatedAtMs = input.updatedAtMs ?? Date.now();
917
- return commitReleaseCatalogMutation({
918
- database: input.database,
919
- mutation: {
920
- id: release.id,
921
- operation: "update",
922
- update: releasePolicyUpdate(release, input.patch, updatedAtMs)
923
- },
924
- scope,
925
- updatedAtMs
926
- });
927
- }
928
- async function preflightReleasePolicy(input) {
929
- const { release, scope } = await loadReleaseTarget(input);
930
- const updatedAtMs = input.updatedAtMs ?? Date.now();
931
- return preflightReleaseCatalogMutation({
932
- database: input.database,
933
- mutation: {
934
- id: release.id,
935
- operation: "update",
936
- update: releasePolicyUpdate(release, input.patch, updatedAtMs)
937
- },
938
- scope,
939
- updatedAtMs
940
- });
941
- }
942
- async function deleteRelease$1(input) {
943
- const { release, scope } = await loadReleaseTarget(input);
944
- if (release.enabled) throw new ReleaseManagementError("ENABLED_RELEASE", `Disable Release "${release.id}" before hard deletion.`);
945
- return commitReleaseCatalogMutation({
946
- database: input.database,
947
- mutation: {
948
- id: release.id,
949
- operation: "delete"
950
- },
951
- scope,
952
- updatedAtMs: input.updatedAtMs
953
- });
954
- }
955
- async function promoteRelease$1(input) {
956
- const { release: source, scope: sourceScope } = await loadReleaseTarget(input);
957
- if (source.kind !== "BUNDLE" || source.bundle_id === null) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Only a Bundle Release can be promoted.");
958
- const targetChannel = input.targetChannel.trim();
959
- if (targetChannel.length === 0) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Promotion requires a target channel.");
960
- const { scope: targetScope } = await prepareTargetScope({
961
- channelName: targetChannel,
962
- database: input.database,
963
- fingerprintHash: source.fingerprint_hash,
964
- platform: source.platform,
965
- strategy: source.strategy
966
- });
967
- if (targetScope.scopeKey === sourceScope.scopeKey) throw new ReleaseManagementError("TARGET_RELEASE_INVALID", "Source and target Release scopes are the same.");
968
- const targetRows = await readReleaseScope(input.database, targetScope.scopeKey);
969
- const updatedAtMs = input.updatedAtMs ?? Date.now();
970
- const targetMutation = {
971
- mutation: {
972
- operation: "insert",
973
- row: {
974
- ...source,
975
- id: createForwardReleaseId(targetRows, [source.id, source.bundle_id], updatedAtMs),
976
- revision: 1,
977
- scope_key: targetScope.scopeKey,
978
- channel_id: targetScope.channelId,
979
- enabled: true,
980
- rollout_cohort_count: 1e3,
981
- target_cohorts: [],
982
- operation: "PROMOTE",
983
- source_release_id: source.id,
984
- created_at_ms: updatedAtMs,
985
- updated_at_ms: updatedAtMs
986
- }
987
- },
988
- scope: targetScope,
989
- updatedAtMs
990
- };
991
- const sourceMutation = input.action === "move" ? {
992
- mutation: {
993
- id: source.id,
994
- operation: "update",
995
- update: {
996
- enabled: false,
997
- updated_at_ms: updatedAtMs
998
- }
999
- },
1000
- scope: sourceScope,
1001
- updatedAtMs
1002
- } : null;
1003
- const results = await commitReleaseCatalogMutations({
1004
- database: input.database,
1005
- mutations: sourceMutation === null ? [targetMutation] : [sourceMutation, targetMutation]
1006
- });
1007
- return {
1008
- source: sourceMutation === null ? null : results[0],
1009
- target: results.at(-1)
1010
- };
1011
- }
1012
- var withPublicBundleMutationErrors = async (action) => {
1013
- try {
1014
- return await action();
1015
- } catch (error) {
1016
- if (error instanceof ReleaseManagementError) throw new Error(error.message.replace(/\bRelease\b/g, "Bundle").replace("Bundle Bundle", "deployed Bundle"), { cause: error });
1017
- throw error;
1018
- }
1019
- };
1020
- async function listReleases(releases, input) {
1021
- const page = input.page ?? 1;
1022
- const rows = await releases.findMany({
1023
- ...input.afterReleaseId === void 0 ? {} : { afterReleaseId: input.afterReleaseId },
1024
- ...input.beforeReleaseId === void 0 ? {} : { beforeReleaseId: input.beforeReleaseId },
1025
- ...input.bundleId === void 0 ? {} : { bundleId: input.bundleId },
1026
- ...input.channelId === void 0 ? {} : { channelId: input.channelId },
1027
- ...input.enabled === void 0 ? {} : { enabled: input.enabled },
1028
- ...input.platform === void 0 ? {} : { platform: input.platform },
1029
- ...input.targetAppVersion === void 0 ? {} : { targetAppVersion: input.targetAppVersion },
1030
- limit: input.limit + 1
1031
- });
1032
- const isPreviousRequest = input.afterReleaseId !== void 0;
1033
- const hasExtraRow = rows.length > input.limit;
1034
- return {
1035
- data: isPreviousRequest ? hasExtraRow ? rows.slice(1) : rows : rows.slice(0, input.limit),
1036
- pagination: {
1037
- currentPage: page,
1038
- hasNextPage: isPreviousRequest || hasExtraRow,
1039
- hasPreviousPage: page > 1
1040
- }
1041
- };
1042
- }
1043
- var NON_TARGETED_COHORT = "release-catalog-non-targeted-cohort";
1044
- function collectReachableFromIndexes(catalog, indexes, reachableReleaseIds) {
1045
- const descriptors = indexes.flatMap((index) => {
1046
- const descriptor = catalog.releaseDescriptors[index];
1047
- return descriptor === void 0 ? [] : [descriptor];
1048
- });
1049
- const cohorts = new Set([
1050
- void 0,
1051
- ...Array.from({ length: NUMERIC_COHORT_SIZE }, (_, index) => String(index + 1)),
1052
- ...descriptors.flatMap(({ targetCohorts }) => targetCohorts),
1053
- NON_TARGETED_COHORT
1054
- ]);
1055
- for (const cohort of cohorts) {
1056
- const selected = descriptors.find((descriptor) => descriptor.kind === "BUNDLE" && descriptor.bundleId !== null && isReleaseEligibleForCohort(descriptor, cohort));
1057
- if (selected !== void 0) reachableReleaseIds.add(selected.releaseId);
1058
- }
1059
- }
1060
- function collectCurrentlyReachableReleaseIds(catalog) {
1061
- const reachableReleaseIds = /* @__PURE__ */ new Set();
1062
- const indexGroups = catalog.strategy === "APP_VERSION" ? catalog.segments.map(({ releaseIndexes }) => releaseIndexes) : [catalog.releaseIndexes];
1063
- for (const indexes of indexGroups) collectReachableFromIndexes(catalog, indexes, reachableReleaseIds);
1064
- return reachableReleaseIds;
1065
- }
1066
- async function addReleaseReachability(releaseCatalogs, releases) {
1067
- const scopeKeys = [...new Set(releases.map(({ scope_key }) => scope_key))];
1068
- const reachableByScope = new Map(await Promise.all(scopeKeys.map(async (scopeKey) => {
1069
- const row = await releaseCatalogs.findByScopeKey(scopeKey);
1070
- return [scopeKey, row === null ? /* @__PURE__ */ new Set() : collectCurrentlyReachableReleaseIds(JSON.parse(row.payload))];
1071
- })));
1072
- return releases.map((release) => ({
1073
- ...release,
1074
- currentlyUnreachable: !reachableByScope.get(release.scope_key)?.has(release.id)
1075
- }));
1076
- }
1077
- var getReleases_createServerFn_handler = createServerRpc({
1078
- id: "206547cb1526f961070a989818ca7b9e34f6b2b0e4ab851698c3807fe9fb5e0c",
1079
- name: "getReleases",
1080
- filename: "src/lib/api-rpc.ts"
1081
- }, (opts) => getReleases.__executeServer(opts));
1082
- var getReleases = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getReleases_createServerFn_handler, async ({ data }) => {
1083
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1084
- const { config } = await prepareConfig();
1085
- const result = await listReleases(config.database.models.releases, {
1086
- ...data?.afterReleaseId === void 0 ? {} : { afterReleaseId: data.afterReleaseId },
1087
- ...data?.beforeReleaseId === void 0 ? {} : { beforeReleaseId: data.beforeReleaseId },
1088
- ...data?.bundleId === void 0 ? {} : { bundleId: data.bundleId },
1089
- ...data?.channelId === void 0 ? {} : { channelId: data.channelId },
1090
- ...data?.enabled === void 0 ? {} : { enabled: data.enabled },
1091
- ...data?.page === void 0 ? {} : { page: data.page },
1092
- ...data?.platform === void 0 ? {} : { platform: data.platform },
1093
- ...data?.targetAppVersion === void 0 ? {} : { targetAppVersion: data.targetAppVersion },
1094
- limit: data?.limit ?? 20
1095
- });
1096
- const releases = await addReleaseReachability(config.database.models.releaseCatalogs, result.data);
1097
- return {
1098
- ...result,
1099
- data: releases
1100
- };
1101
- });
1102
- var getRelease_createServerFn_handler = createServerRpc({
1103
- id: "a6f23116eeaf76166d405e28a95213123025613c6603030894e519015bf48032",
1104
- name: "getRelease",
1105
- filename: "src/lib/api-rpc.ts"
1106
- }, (opts) => getRelease.__executeServer(opts));
1107
- var getRelease = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getRelease_createServerFn_handler, async ({ data }) => {
1108
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1109
- const { config } = await prepareConfig();
1110
- return config.database.models.releases.findById(data.releaseId);
1111
- });
1112
- var updateRelease_createServerFn_handler = createServerRpc({
1113
- id: "7ea0186f19f9f2bc2ca4b26e3c59636891cf046957f84287b6783f8d88bd8cb7",
1114
- name: "updateRelease",
1115
- filename: "src/lib/api-rpc.ts"
1116
- }, (opts) => updateRelease.__executeServer(opts));
1117
- var updateRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(updateRelease_createServerFn_handler, async ({ data }) => {
1118
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1119
- const { config } = await prepareConfig();
1120
- return withPublicBundleMutationErrors(() => updateReleasePolicy({
1121
- database: config.database,
1122
- ...data
1123
- }));
1124
- });
1125
- var preflightRelease_createServerFn_handler = createServerRpc({
1126
- id: "b46c95dba95a6a3e8fa5c9d100e3622fa5ae7af4f38e10fb1ed2fa48289a3a8f",
1127
- name: "preflightRelease",
1128
- filename: "src/lib/api-rpc.ts"
1129
- }, (opts) => preflightRelease.__executeServer(opts));
1130
- var preflightRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(preflightRelease_createServerFn_handler, async ({ data }) => {
1131
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1132
- const { config } = await prepareConfig();
1133
- return withPublicBundleMutationErrors(() => preflightReleasePolicy({
1134
- database: config.database,
1135
- ...data
1136
- }));
1137
- });
1138
- var deleteRelease_createServerFn_handler = createServerRpc({
1139
- id: "d5b58722ce514e3b63a377f736b4823c2011782495442ae4870ed547e392c70b",
1140
- name: "deleteRelease",
1141
- filename: "src/lib/api-rpc.ts"
1142
- }, (opts) => deleteRelease.__executeServer(opts));
1143
- var deleteRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(deleteRelease_createServerFn_handler, async ({ data }) => {
1144
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1145
- const { config } = await prepareConfig();
1146
- return withPublicBundleMutationErrors(() => deleteRelease$1({
1147
- database: config.database,
1148
- ...data
1149
- }));
1150
- });
1151
- var promoteRelease_createServerFn_handler = createServerRpc({
1152
- id: "956539a300d79a7efa191c1cc2d529d62fc4bfd940442548fdbc1404e0d53078",
1153
- name: "promoteRelease",
1154
- filename: "src/lib/api-rpc.ts"
1155
- }, (opts) => promoteRelease.__executeServer(opts));
1156
- var promoteRelease = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(promoteRelease_createServerFn_handler, async ({ data }) => {
1157
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1158
- const { config } = await prepareConfig();
1159
- return withPublicBundleMutationErrors(() => promoteRelease$1({
1160
- database: config.database,
1161
- ...data
1162
- }));
1163
- });
1164
- var getReleaseCatalogDiagnostics_createServerFn_handler = createServerRpc({
1165
- id: "e8c24b7247936f045a145ffd5c177fd0e3df3b52769d67dfbd8d1de491d66396",
1166
- name: "getReleaseCatalogDiagnostics",
1167
- filename: "src/lib/api-rpc.ts"
1168
- }, (opts) => getReleaseCatalogDiagnostics.__executeServer(opts));
1169
- var getReleaseCatalogDiagnostics = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getReleaseCatalogDiagnostics_createServerFn_handler, async ({ data }) => {
1170
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1171
- const { config } = await prepareConfig();
1172
- return config.database.models.releaseCatalogs.findByScopeKey(data.scopeKey);
1173
- });
1174
- var getConfig_createServerFn_handler = createServerRpc({
1175
- id: "51a34c05479a893c7d320bd4cd1604427289d667698c48b9f30a01aabf8a5e68",
1176
- name: "getConfig",
1177
- filename: "src/lib/api-rpc.ts"
1178
- }, (opts) => getConfig.__executeServer(opts));
1179
- var getConfig = createServerFn().handler(getConfig_createServerFn_handler, async () => {
1180
- try {
1181
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1182
- const { config } = await prepareConfig();
1183
- return { console: config.console };
1184
- } catch (error) {
1185
- console.error("Error during config retrieval:", error);
1186
- throw error;
1187
- }
1188
- });
1189
- var getChannels_createServerFn_handler = createServerRpc({
1190
- id: "79ada05964de8f2123bfcd62b10097d59bf8fd689ef5c7161031e5871d8396c5",
1191
- name: "getChannels",
1192
- filename: "src/lib/api-rpc.ts"
1193
- }, (opts) => getChannels.__executeServer(opts));
1194
- var getChannels = createServerFn().handler(getChannels_createServerFn_handler, async () => {
1195
- try {
1196
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1197
- const { databaseClient } = await prepareConfig();
1198
- return await databaseClient.getChannels() ?? [];
1199
- } catch (error) {
1200
- console.error("Error during channel retrieval:", error);
1201
- throw error;
1202
- }
1203
- });
1204
- var createChannel_createServerFn_handler = createServerRpc({
1205
- id: "2b9b8d1f49f79a511589617d8d4bfc6094a3acf5264f33651b9569ba66d3f321",
1206
- name: "createChannel",
1207
- filename: "src/lib/api-rpc.ts"
1208
- }, (opts) => createChannel.__executeServer(opts));
1209
- var createChannel = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createChannel_createServerFn_handler, async ({ data }) => {
1210
- try {
1211
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1212
- const { databaseClient } = await prepareConfig();
1213
- return { data: await databaseClient.insertChannel(data) };
1214
- } catch (error) {
1215
- console.error("Error during channel creation:", error);
1216
- throw error;
1217
- }
1218
- });
1219
- var deleteChannel_createServerFn_handler = createServerRpc({
1220
- id: "52756dde414919a906bfe83d1ab6d29910c63bcafdb47653d6f1df562d958920",
1221
- name: "deleteChannel",
1222
- filename: "src/lib/api-rpc.ts"
1223
- }, (opts) => deleteChannel.__executeServer(opts));
1224
- var deleteChannel = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(deleteChannel_createServerFn_handler, async ({ data }) => {
1225
- try {
1226
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1227
- const { databaseClient } = await prepareConfig();
1228
- return { data: await databaseClient.deleteChannel(data) };
1229
- } catch (error) {
1230
- console.error("Error during channel deletion:", error);
1231
- throw error;
1232
- }
1233
- });
1234
- var getConfigLoaded_createServerFn_handler = createServerRpc({
1235
- id: "f8bdca3d0579adb812d6404f55d9261a89cdb025e920b1fcad82883646a5fe9e",
1236
- name: "getConfigLoaded",
1237
- filename: "src/lib/api-rpc.ts"
1238
- }, (opts) => getConfigLoaded.__executeServer(opts));
1239
- var getConfigLoaded = createServerFn().handler(getConfigLoaded_createServerFn_handler, async () => {
1240
- try {
1241
- const [{ getRequest }, { requireConsoleAccess }] = await Promise.all([import("./server-BdkuOWe8.mjs").then((n) => n.t), import("./auth.server-CmicHh0J.mjs")]);
1242
- await requireConsoleAccess(getRequest());
1243
- const { isConfigLoaded } = await import("./config.server-C-d1QaBU.mjs");
1244
- return { configLoaded: isConfigLoaded() };
1245
- } catch (error) {
1246
- console.error("Error during config loaded retrieval:", error);
1247
- throw error;
1248
- }
1249
- });
1250
- var getBundles_createServerFn_handler = createServerRpc({
1251
- id: "00ccacb4a0212c83ec29f4d11719046ad91ea8291cfc557d514dbf00d3bd7f5f",
1252
- name: "getBundles",
1253
- filename: "src/lib/api-rpc.ts"
1254
- }, (opts) => getBundles.__executeServer(opts));
1255
- var getBundles = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getBundles_createServerFn_handler, async ({ data }) => {
1256
- try {
1257
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1258
- const query = {
1259
- platform: data?.platform ?? void 0,
1260
- page: typeof data?.page === "number" && Number.isInteger(data.page) && data.page > 1 ? data.page : void 0,
1261
- limit: data?.limit ? Number(data.limit) : 20,
1262
- after: data?.after ?? void 0,
1263
- before: data?.before ?? void 0
1264
- };
1265
- if (query.after !== void 0 && query.before !== void 0 || query.page !== void 0 && (query.after !== void 0 || query.before !== void 0)) throw new DatabasePluginInputError("invalid-pagination");
1266
- const pagination = query.page !== void 0 ? { page: query.page } : query.after !== void 0 ? { cursor: { after: query.after } } : query.before !== void 0 ? { cursor: { before: query.before } } : {};
1267
- const { databaseClient } = await prepareConfig();
1268
- const bundleQueryOptions = {
1269
- where: { platform: query.platform },
1270
- limit: query.limit,
1271
- ...pagination
1272
- };
1273
- return await databaseClient.getBundles(bundleQueryOptions) ?? {
1274
- data: [],
1275
- pagination: {
1276
- total: 0,
1277
- hasNextPage: false,
1278
- hasPreviousPage: false,
1279
- currentPage: 1,
1280
- totalPages: 0
1281
- }
1282
- };
1283
- } catch (error) {
1284
- console.error("Error during bundle retrieval:", error);
1285
- throw error;
1286
- }
1287
- });
1288
- var getBundle_createServerFn_handler = createServerRpc({
1289
- id: "1bd85c2a50e24785cb6abb023a247a9f048f37ddfa85cbb1c57e579563bad013",
1290
- name: "getBundle",
1291
- filename: "src/lib/api-rpc.ts"
1292
- }, (opts) => getBundle.__executeServer(opts));
1293
- var getBundle = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getBundle_createServerFn_handler, async ({ data }) => {
1294
- try {
1295
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1296
- const { databaseClient } = await prepareConfig();
1297
- return await databaseClient.getBundleById(data.bundleId) ?? null;
1298
- } catch (error) {
1299
- console.error("Error during bundle retrieval:", error);
1300
- throw error;
1301
- }
1302
- });
1303
- var getBundleChildren_createServerFn_handler = createServerRpc({
1304
- id: "4370f1bf70b91f1168d85379d3008449a1bedb915e9878ca4ef89d5f3a80fa7f",
1305
- name: "getBundleChildren",
1306
- filename: "src/lib/api-rpc.ts"
1307
- }, (opts) => getBundleChildren.__executeServer(opts));
1308
- var getBundleChildren = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getBundleChildren_createServerFn_handler, async ({ data }) => {
1309
- try {
1310
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1311
- const { getBundleChildren: getBundleChildrenWithConfig } = await import("./getBundleChildren-DoL8l_AS.mjs");
1312
- const { databaseClient } = await prepareConfig();
1313
- return await getBundleChildrenWithConfig(data, { databaseClient });
1314
- } catch (error) {
1315
- console.error("Error during bundle children retrieval:", error);
1316
- throw error;
1317
- }
1318
- });
1319
- var getBundleChildCounts_createServerFn_handler = createServerRpc({
1320
- id: "4ca367070b00f58179a572f0bb8196a4ccdd3881e9b1dbfe33deee0cb6e1f549",
1321
- name: "getBundleChildCounts",
1322
- filename: "src/lib/api-rpc.ts"
1323
- }, (opts) => getBundleChildCounts.__executeServer(opts));
1324
- var getBundleChildCounts = createServerFn({ method: "GET" }).inputValidator((input) => input).handler(getBundleChildCounts_createServerFn_handler, async ({ data }) => {
1325
- try {
1326
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1327
- const { getBundleChildCounts: getBundleChildCountsWithConfig } = await import("./getBundleChildren-DoL8l_AS.mjs");
1328
- const { databaseClient } = await prepareConfig();
1329
- return await getBundleChildCountsWithConfig(data.bundleIds, { databaseClient });
1330
- } catch (error) {
1331
- console.error("Error during bundle child count retrieval:", error);
1332
- throw error;
1333
- }
1334
- });
1335
- var createBundle_createServerFn_handler = createServerRpc({
1336
- id: "16cc7c2f080ea5b73e0c6bba815b110dbd7727796036d248ba0d8ae819ddef08",
1337
- name: "createBundle",
1338
- filename: "src/lib/api-rpc.ts"
1339
- }, (opts) => createBundle.__executeServer(opts));
1340
- var createBundle = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(createBundle_createServerFn_handler, async ({ data }) => {
1341
- try {
1342
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1343
- const { databaseClient } = await prepareConfig();
1344
- await databaseClient.insertBundle(data);
1345
- return {
1346
- success: true,
1347
- bundleId: data.id
1348
- };
1349
- } catch (error) {
1350
- console.error("Error during bundle creation:", error);
1351
- throw error;
1352
- }
1353
- });
1354
- var deleteBundle_createServerFn_handler = createServerRpc({
1355
- id: "3a27ff5679228b86a346b3fe42142e7a5bf0264f73173c0dbe5f07fb37c43cf7",
1356
- name: "deleteBundle",
1357
- filename: "src/lib/api-rpc.ts"
1358
- }, (opts) => deleteBundle.__executeServer(opts));
1359
- var deleteBundle = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(deleteBundle_createServerFn_handler, async ({ data }) => {
1360
- try {
1361
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1362
- const { deleteBundle: deleteBundleWithStorage } = await import("./deleteBundle-8X-jq7Z7.mjs");
1363
- const { databaseClient, storagePlugin } = await prepareConfig();
1364
- await deleteBundleWithStorage(data, {
1365
- databaseClient,
1366
- storagePlugin,
1367
- waitForStorageCleanup: false
1368
- });
1369
- return { success: true };
1370
- } catch (error) {
1371
- console.error("Error during bundle deletion:", error);
1372
- throw error;
1373
- }
1374
- });
1375
- var deleteBundles_createServerFn_handler = createServerRpc({
1376
- id: "61de3b69779c5ce2a5f5d3c27e2cfaca8fba8f14c8803559b9cd733c456494fa",
1377
- name: "deleteBundles",
1378
- filename: "src/lib/api-rpc.ts"
1379
- }, (opts) => deleteBundles.__executeServer(opts));
1380
- var deleteBundles = createServerFn({ method: "POST" }).inputValidator((input) => input).handler(deleteBundles_createServerFn_handler, async ({ data }) => {
1381
- try {
1382
- const { prepareConfig } = await import("./config.server-C-d1QaBU.mjs");
1383
- const { deleteBundles: deleteBundlesWithStorage } = await import("./deleteBundle-8X-jq7Z7.mjs");
1384
- const { databaseClient, storagePlugin } = await prepareConfig();
1385
- return {
1386
- success: true,
1387
- ...await deleteBundlesWithStorage(data, {
1388
- databaseClient,
1389
- storagePlugin,
1390
- waitForStorageCleanup: false
1391
- })
1392
- };
1393
- } catch (error) {
1394
- console.error("Error during bundle deletion:", error);
1395
- throw error;
1396
- }
1397
- });
1398
- //#endregion
1399
- export { createBundle_createServerFn_handler, createChannel_createServerFn_handler, deleteBundle_createServerFn_handler, deleteBundles_createServerFn_handler, deleteChannel_createServerFn_handler, deleteRelease_createServerFn_handler, getBundleChildCounts_createServerFn_handler, getBundleChildren_createServerFn_handler, getBundle_createServerFn_handler, getBundles_createServerFn_handler, getChannels_createServerFn_handler, getConfigLoaded_createServerFn_handler, getConfig_createServerFn_handler, getReleaseCatalogDiagnostics_createServerFn_handler, getRelease_createServerFn_handler, getReleases_createServerFn_handler, preflightRelease_createServerFn_handler, promoteRelease_createServerFn_handler, updateRelease_createServerFn_handler };