unleash-server 5.8.2 → 5.9.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 (1000) hide show
  1. package/dist/lib/addons/addon.d.ts.map +1 -1
  2. package/dist/lib/addons/addon.js +1 -0
  3. package/dist/lib/addons/addon.js.map +1 -1
  4. package/dist/lib/addons/datadog.d.ts.map +1 -1
  5. package/dist/lib/addons/datadog.js.map +1 -1
  6. package/dist/lib/addons/feature-event-formatter-md.d.ts.map +1 -1
  7. package/dist/lib/addons/feature-event-formatter-md.js +5 -1
  8. package/dist/lib/addons/feature-event-formatter-md.js.map +1 -1
  9. package/dist/lib/addons/feature-event-formatter-md.test.js +18 -0
  10. package/dist/lib/addons/feature-event-formatter-md.test.js.map +1 -1
  11. package/dist/lib/addons/slack-app-definition.d.ts.map +1 -1
  12. package/dist/lib/addons/slack-app-definition.js +1 -0
  13. package/dist/lib/addons/slack-app-definition.js.map +1 -1
  14. package/dist/lib/addons/slack-app.test.js +9 -2
  15. package/dist/lib/addons/slack-app.test.js.map +1 -1
  16. package/dist/lib/addons/webhook-definition.d.ts.map +1 -1
  17. package/dist/lib/addons/webhook-definition.js +1 -0
  18. package/dist/lib/addons/webhook-definition.js.map +1 -1
  19. package/dist/lib/addons/webhook.js.map +1 -1
  20. package/dist/lib/app.d.ts +1 -1
  21. package/dist/lib/app.d.ts.map +1 -1
  22. package/dist/lib/app.js.map +1 -1
  23. package/dist/lib/create-config.d.ts.map +1 -1
  24. package/dist/lib/create-config.js +3 -1
  25. package/dist/lib/create-config.js.map +1 -1
  26. package/dist/lib/db/access-store.d.ts +1 -1
  27. package/dist/lib/db/access-store.d.ts.map +1 -1
  28. package/dist/lib/db/access-store.js +3 -4
  29. package/dist/lib/db/access-store.js.map +1 -1
  30. package/dist/lib/db/access-store.test.js +1 -1
  31. package/dist/lib/db/access-store.test.js.map +1 -1
  32. package/dist/lib/db/client-applications-store.d.ts.map +1 -1
  33. package/dist/lib/db/client-applications-store.js.map +1 -1
  34. package/dist/lib/db/client-instance-store.d.ts +1 -0
  35. package/dist/lib/db/client-instance-store.d.ts.map +1 -1
  36. package/dist/lib/db/client-instance-store.js +9 -0
  37. package/dist/lib/db/client-instance-store.js.map +1 -1
  38. package/dist/lib/db/event-store.d.ts +2 -95
  39. package/dist/lib/db/event-store.d.ts.map +1 -1
  40. package/dist/lib/db/event-store.js +21 -293
  41. package/dist/lib/db/event-store.js.map +1 -1
  42. package/dist/lib/db/feature-environment-store.d.ts.map +1 -1
  43. package/dist/lib/db/feature-environment-store.js +7 -3
  44. package/dist/lib/db/feature-environment-store.js.map +1 -1
  45. package/dist/lib/db/feature-strategy-store.test.js +2 -6
  46. package/dist/lib/db/feature-strategy-store.test.js.map +1 -1
  47. package/dist/lib/db/index.js +5 -5
  48. package/dist/lib/db/index.js.map +1 -1
  49. package/dist/lib/db/project-stats-store.d.ts +3 -3
  50. package/dist/lib/db/project-stats-store.d.ts.map +1 -1
  51. package/dist/lib/db/project-store.d.ts.map +1 -1
  52. package/dist/lib/db/project-store.js +10 -1
  53. package/dist/lib/db/project-store.js.map +1 -1
  54. package/dist/lib/db/role-store.d.ts +4 -4
  55. package/dist/lib/db/role-store.d.ts.map +1 -1
  56. package/dist/lib/db/segment-store.d.ts.map +1 -1
  57. package/dist/lib/db/segment-store.js +1 -2
  58. package/dist/lib/db/segment-store.js.map +1 -1
  59. package/dist/lib/db/segment-store.test.js +5 -3
  60. package/dist/lib/db/segment-store.test.js.map +1 -1
  61. package/dist/lib/db/transaction.d.ts +1 -1
  62. package/dist/lib/db/transaction.d.ts.map +1 -1
  63. package/dist/lib/domain/project-health/project-health.d.ts +2 -2
  64. package/dist/lib/domain/project-health/project-health.d.ts.map +1 -1
  65. package/dist/lib/error/archivedfeature-error.d.ts +7 -0
  66. package/dist/lib/error/archivedfeature-error.d.ts.map +1 -0
  67. package/dist/lib/error/archivedfeature-error.js +12 -0
  68. package/dist/lib/error/archivedfeature-error.js.map +1 -0
  69. package/dist/lib/error/permission-error.js +1 -2
  70. package/dist/lib/error/permission-error.js.map +1 -1
  71. package/dist/lib/features/access/createAccessService.d.ts +1 -1
  72. package/dist/lib/features/access/createAccessService.d.ts.map +1 -1
  73. package/dist/lib/features/access/createAccessService.js +2 -5
  74. package/dist/lib/features/access/createAccessService.js.map +1 -1
  75. package/dist/lib/features/change-request-access-service/createChangeRequestAccessReadModel.d.ts +1 -1
  76. package/dist/lib/features/change-request-access-service/createChangeRequestAccessReadModel.d.ts.map +1 -1
  77. package/dist/lib/features/change-request-segment-usage-service/createChangeRequestSegmentUsageReadModel.d.ts +1 -1
  78. package/dist/lib/features/change-request-segment-usage-service/createChangeRequestSegmentUsageReadModel.d.ts.map +1 -1
  79. package/dist/lib/features/client-feature-toggles/client-feature-toggle-service.d.ts.map +1 -1
  80. package/dist/lib/features/client-feature-toggles/client-feature-toggle-service.js.map +1 -1
  81. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.d.ts.map +1 -1
  82. package/dist/lib/features/client-feature-toggles/client-feature-toggle.controller.js.map +1 -1
  83. package/dist/lib/features/client-feature-toggles/tests/client-feature-toggle.e2e.test.js.map +1 -1
  84. package/dist/lib/features/client-feature-toggles/tests/client-feature-toggles.e2e.test.js.map +1 -1
  85. package/dist/lib/features/dependent-features/createDependentFeaturesService.d.ts.map +1 -1
  86. package/dist/lib/features/dependent-features/createDependentFeaturesService.js +3 -21
  87. package/dist/lib/features/dependent-features/createDependentFeaturesService.js.map +1 -1
  88. package/dist/lib/features/dependent-features/dependent-features-read-model-type.d.ts.map +1 -1
  89. package/dist/lib/features/dependent-features/dependent-features-read-model.d.ts.map +1 -1
  90. package/dist/lib/features/dependent-features/dependent-features-read-model.js.map +1 -1
  91. package/dist/lib/features/dependent-features/fake-dependent-features-read-model.d.ts.map +1 -1
  92. package/dist/lib/features/dependent-features/fake-dependent-features-read-model.js.map +1 -1
  93. package/dist/lib/features/events/createEventsService.d.ts +6 -0
  94. package/dist/lib/features/events/createEventsService.d.ts.map +1 -0
  95. package/dist/lib/features/events/createEventsService.js +24 -0
  96. package/dist/lib/features/events/createEventsService.js.map +1 -0
  97. package/dist/lib/features/events/event-created-by-migration.test.d.ts +2 -0
  98. package/dist/lib/features/events/event-created-by-migration.test.d.ts.map +1 -0
  99. package/dist/lib/features/events/event-created-by-migration.test.js +130 -0
  100. package/dist/lib/features/events/event-created-by-migration.test.js.map +1 -0
  101. package/dist/lib/features/events/event-service.d.ts +35 -0
  102. package/dist/lib/features/events/event-service.d.ts.map +1 -0
  103. package/dist/lib/features/events/event-service.js +103 -0
  104. package/dist/lib/features/events/event-service.js.map +1 -0
  105. package/dist/lib/features/events/event-service.test.d.ts +2 -0
  106. package/dist/lib/features/events/event-service.test.d.ts.map +1 -0
  107. package/dist/lib/features/events/event-service.test.js +22 -0
  108. package/dist/lib/features/events/event-service.test.js.map +1 -0
  109. package/dist/lib/features/events/event-store.d.ts +100 -0
  110. package/dist/lib/features/events/event-store.d.ts.map +1 -0
  111. package/dist/lib/features/events/event-store.js +340 -0
  112. package/dist/lib/features/events/event-store.js.map +1 -0
  113. package/dist/lib/features/events/event-store.test.d.ts.map +1 -0
  114. package/dist/lib/{db → features/events}/event-store.test.js +9 -5
  115. package/dist/lib/features/events/event-store.test.js.map +1 -0
  116. package/dist/lib/features/export-import-toggles/createExportImportService.d.ts +1 -1
  117. package/dist/lib/features/export-import-toggles/createExportImportService.d.ts.map +1 -1
  118. package/dist/lib/features/export-import-toggles/createExportImportService.js +4 -6
  119. package/dist/lib/features/export-import-toggles/createExportImportService.js.map +1 -1
  120. package/dist/lib/features/export-import-toggles/export-import-permissions.e2e.test.js.map +1 -1
  121. package/dist/lib/features/export-import-toggles/export-import-service.d.ts.map +1 -1
  122. package/dist/lib/features/export-import-toggles/export-import-service.js +5 -1
  123. package/dist/lib/features/export-import-toggles/export-import-service.js.map +1 -1
  124. package/dist/lib/features/export-import-toggles/export-import.e2e.test.js +60 -0
  125. package/dist/lib/features/export-import-toggles/export-import.e2e.test.js.map +1 -1
  126. package/dist/lib/features/export-import-toggles/import-permissions-service.d.ts.map +1 -1
  127. package/dist/lib/features/export-import-toggles/import-permissions-service.js.map +1 -1
  128. package/dist/lib/features/feature-search/fake-feature-search-store.d.ts +1 -1
  129. package/dist/lib/features/feature-search/fake-feature-search-store.d.ts.map +1 -1
  130. package/dist/lib/features/feature-search/feature-search-controller.d.ts.map +1 -1
  131. package/dist/lib/features/feature-search/feature-search-controller.js +35 -38
  132. package/dist/lib/features/feature-search/feature-search-controller.js.map +1 -1
  133. package/dist/lib/features/feature-search/feature-search-store.d.ts.map +1 -1
  134. package/dist/lib/features/feature-search/feature-search-store.js.map +1 -1
  135. package/dist/lib/features/feature-search/feature.search.e2e.test.js +0 -1
  136. package/dist/lib/features/feature-search/feature.search.e2e.test.js.map +1 -1
  137. package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.d.ts.map +1 -1
  138. package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.js +1 -1
  139. package/dist/lib/features/feature-toggle/archive-feature-toggle-controller.js.map +1 -1
  140. package/dist/lib/features/feature-toggle/converters/feature-toggle-row-converter.d.ts +1 -1
  141. package/dist/lib/features/feature-toggle/createFeatureToggleService.d.ts.map +1 -1
  142. package/dist/lib/features/feature-toggle/createFeatureToggleService.js +6 -6
  143. package/dist/lib/features/feature-toggle/createFeatureToggleService.js.map +1 -1
  144. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.d.ts +3 -2
  145. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.d.ts.map +1 -1
  146. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.js +3 -0
  147. package/dist/lib/features/feature-toggle/fakes/fake-feature-toggle-store.js.map +1 -1
  148. package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts +7 -4
  149. package/dist/lib/features/feature-toggle/feature-toggle-service.d.ts.map +1 -1
  150. package/dist/lib/features/feature-toggle/feature-toggle-service.js +51 -7
  151. package/dist/lib/features/feature-toggle/feature-toggle-service.js.map +1 -1
  152. package/dist/lib/features/feature-toggle/feature-toggle-store.d.ts +2 -1
  153. package/dist/lib/features/feature-toggle/feature-toggle-store.d.ts.map +1 -1
  154. package/dist/lib/features/feature-toggle/feature-toggle-store.js +27 -0
  155. package/dist/lib/features/feature-toggle/feature-toggle-store.js.map +1 -1
  156. package/dist/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.js +3 -0
  157. package/dist/lib/features/feature-toggle/tests/feature-toggle-service.e2e.test.js.map +1 -1
  158. package/dist/lib/features/feature-toggle/tests/feature-toggle-store.e2e.test.js.map +1 -1
  159. package/dist/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.js +3 -3
  160. package/dist/lib/features/feature-toggle/tests/feature-toggle-strategies-store.e2e.test.js.map +1 -1
  161. package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js +36 -0
  162. package/dist/lib/features/feature-toggle/tests/feature-toggles.e2e.test.js.map +1 -1
  163. package/dist/lib/features/feature-toggle/types/feature-toggle-store-type.d.ts +2 -1
  164. package/dist/lib/features/feature-toggle/types/feature-toggle-store-type.d.ts.map +1 -1
  165. package/dist/lib/features/feature-toggle/types/feature-toggle-strategies-store-type.d.ts.map +1 -1
  166. package/dist/lib/features/group/createGroupService.d.ts.map +1 -1
  167. package/dist/lib/features/group/createGroupService.js +3 -6
  168. package/dist/lib/features/group/createGroupService.js.map +1 -1
  169. package/dist/lib/features/index.d.ts +2 -0
  170. package/dist/lib/features/index.d.ts.map +1 -1
  171. package/dist/lib/features/index.js +2 -0
  172. package/dist/lib/features/index.js.map +1 -1
  173. package/dist/lib/features/instance-stats/createInstanceStatsService.d.ts +6 -0
  174. package/dist/lib/features/instance-stats/createInstanceStatsService.d.ts.map +1 -0
  175. package/dist/lib/features/instance-stats/createInstanceStatsService.js +129 -0
  176. package/dist/lib/features/instance-stats/createInstanceStatsService.js.map +1 -0
  177. package/dist/lib/features/instance-stats/getActiveUsers.d.ts +1 -1
  178. package/dist/lib/features/instance-stats/getActiveUsers.d.ts.map +1 -1
  179. package/dist/lib/features/instance-stats/getProductionChanges.d.ts +1 -1
  180. package/dist/lib/features/instance-stats/getProductionChanges.d.ts.map +1 -1
  181. package/dist/lib/features/instance-stats/getProductionChanges.js.map +1 -1
  182. package/dist/lib/features/instance-stats/instance-stats-service.d.ts +6 -1
  183. package/dist/lib/features/instance-stats/instance-stats-service.d.ts.map +1 -1
  184. package/dist/lib/features/instance-stats/instance-stats-service.js +5 -2
  185. package/dist/lib/features/instance-stats/instance-stats-service.js.map +1 -1
  186. package/dist/lib/features/maintenance/maintenance-controller.d.ts +1 -1
  187. package/dist/lib/features/maintenance/maintenance-controller.d.ts.map +1 -1
  188. package/dist/lib/features/maintenance/maintenance-service.js +1 -1
  189. package/dist/lib/features/maintenance/maintenance-service.js.map +1 -1
  190. package/dist/lib/features/metrics/client-metrics/client-metrics-service.e2e.test.d.ts.map +1 -0
  191. package/dist/{test/e2e/services → lib/features/metrics/client-metrics}/client-metrics-service.e2e.test.js +6 -6
  192. package/dist/lib/features/metrics/client-metrics/client-metrics-service.e2e.test.js.map +1 -0
  193. package/dist/lib/{types/stores/client-metrics-store-v2.d.ts → features/metrics/client-metrics/client-metrics-store-v2-type.d.ts} +13 -2
  194. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2-type.d.ts.map +1 -0
  195. package/dist/lib/{types/stores/client-metrics-store-v2.js → features/metrics/client-metrics/client-metrics-store-v2-type.js} +1 -1
  196. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2-type.js.map +1 -0
  197. package/dist/lib/{db → features/metrics/client-metrics}/client-metrics-store-v2.d.ts +15 -4
  198. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.d.ts.map +1 -0
  199. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.e2e.test.d.ts.map +1 -0
  200. package/dist/{test/e2e/stores → lib/features/metrics/client-metrics}/client-metrics-store-v2.e2e.test.js +2 -2
  201. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.e2e.test.js.map +1 -0
  202. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.js +300 -0
  203. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.js.map +1 -0
  204. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.d.ts +2 -0
  205. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.d.ts.map +1 -0
  206. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.js +202 -0
  207. package/dist/lib/features/metrics/client-metrics/client-metrics-store-v2.test.js.map +1 -0
  208. package/dist/lib/{routes/admin-api → features/metrics/client-metrics}/client-metrics.d.ts +7 -5
  209. package/dist/lib/features/metrics/client-metrics/client-metrics.d.ts.map +1 -0
  210. package/dist/lib/features/metrics/client-metrics/client-metrics.e2e.test.d.ts.map +1 -0
  211. package/dist/{test/e2e/api/admin → lib/features/metrics/client-metrics}/client-metrics.e2e.test.js +8 -4
  212. package/dist/lib/features/metrics/client-metrics/client-metrics.e2e.test.js.map +1 -0
  213. package/dist/lib/{routes/admin-api → features/metrics/client-metrics}/client-metrics.js +13 -9
  214. package/dist/lib/{routes/admin-api → features/metrics/client-metrics}/client-metrics.js.map +1 -1
  215. package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.d.ts +1 -1
  216. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.d.ts.map +1 -0
  217. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.js.map +1 -0
  218. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.test.d.ts.map +1 -0
  219. package/dist/lib/features/metrics/client-metrics/collapseHourlyMetrics.test.js.map +1 -0
  220. package/dist/{test/fixtures → lib/features/metrics/client-metrics}/fake-client-metrics-store-v2.d.ts +12 -1
  221. package/dist/lib/features/metrics/client-metrics/fake-client-metrics-store-v2.d.ts.map +1 -0
  222. package/dist/{test/fixtures → lib/features/metrics/client-metrics}/fake-client-metrics-store-v2.js +15 -0
  223. package/dist/lib/features/metrics/client-metrics/fake-client-metrics-store-v2.js.map +1 -0
  224. package/dist/lib/{services → features/metrics}/client-metrics/metrics-service-v2.d.ts +11 -8
  225. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.d.ts.map +1 -0
  226. package/dist/lib/{services → features/metrics}/client-metrics/metrics-service-v2.js +54 -9
  227. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.js.map +1 -0
  228. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.test.d.ts.map +1 -0
  229. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.test.js +271 -0
  230. package/dist/lib/features/metrics/client-metrics/metrics-service-v2.test.js.map +1 -0
  231. package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.d.ts +9 -8
  232. package/dist/lib/features/metrics/instance/instance-service.d.ts.map +1 -0
  233. package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.js +18 -5
  234. package/dist/lib/features/metrics/instance/instance-service.js.map +1 -0
  235. package/dist/lib/features/metrics/instance/instance-service.test.d.ts.map +1 -0
  236. package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.test.js +18 -15
  237. package/dist/lib/features/metrics/instance/instance-service.test.js.map +1 -0
  238. package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.d.ts +9 -7
  239. package/dist/lib/features/metrics/instance/metrics.d.ts.map +1 -0
  240. package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.js +51 -4
  241. package/dist/lib/features/metrics/instance/metrics.js.map +1 -0
  242. package/dist/lib/features/metrics/instance/metrics.test.d.ts.map +1 -0
  243. package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.test.js +124 -7
  244. package/dist/lib/features/metrics/instance/metrics.test.js.map +1 -0
  245. package/dist/lib/{services/client-metrics → features/metrics/instance}/models.d.ts +1 -1
  246. package/dist/lib/features/metrics/instance/models.d.ts.map +1 -0
  247. package/dist/lib/features/metrics/instance/models.js.map +1 -0
  248. package/dist/lib/{routes/client-api → features/metrics/instance}/register.d.ts +8 -8
  249. package/dist/lib/features/metrics/instance/register.d.ts.map +1 -0
  250. package/dist/lib/{routes/client-api → features/metrics/instance}/register.js +8 -7
  251. package/dist/lib/features/metrics/instance/register.js.map +1 -0
  252. package/dist/lib/features/metrics/instance/register.test.d.ts.map +1 -0
  253. package/dist/lib/{routes/client-api → features/metrics/instance}/register.test.js +20 -5
  254. package/dist/lib/features/metrics/instance/register.test.js.map +1 -0
  255. package/dist/lib/features/metrics/last-seen/createLastSeenService.d.ts.map +1 -0
  256. package/dist/lib/{services/client-metrics → features/metrics}/last-seen/createLastSeenService.js +2 -2
  257. package/dist/lib/features/metrics/last-seen/createLastSeenService.js.map +1 -0
  258. package/dist/lib/features/metrics/last-seen/fake-last-seen-read-model.d.ts.map +1 -0
  259. package/dist/lib/features/metrics/last-seen/fake-last-seen-read-model.js.map +1 -0
  260. package/dist/lib/features/metrics/last-seen/fake-last-seen-store.d.ts.map +1 -0
  261. package/dist/lib/features/metrics/last-seen/fake-last-seen-store.js.map +1 -0
  262. package/dist/lib/features/metrics/last-seen/last-seen-read-model.d.ts.map +1 -0
  263. package/dist/lib/features/metrics/last-seen/last-seen-read-model.js.map +1 -0
  264. package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-service.d.ts +2 -2
  265. package/dist/lib/features/metrics/last-seen/last-seen-service.d.ts.map +1 -0
  266. package/dist/lib/features/metrics/last-seen/last-seen-service.js.map +1 -0
  267. package/dist/lib/features/metrics/last-seen/last-seen-store.d.ts.map +1 -0
  268. package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-store.js +1 -1
  269. package/dist/lib/features/metrics/last-seen/last-seen-store.js.map +1 -0
  270. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.d.ts.map +1 -0
  271. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.e2e.test.js.map +1 -0
  272. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.test.d.ts.map +1 -0
  273. package/dist/lib/features/metrics/last-seen/tests/last-seen-service.test.js.map +1 -0
  274. package/dist/lib/features/metrics/last-seen/types/last-seen-read-model-type.d.ts.map +1 -0
  275. package/dist/lib/features/metrics/last-seen/types/last-seen-read-model-type.js.map +1 -0
  276. package/dist/lib/features/metrics/last-seen/types/last-seen-store-type.d.ts.map +1 -0
  277. package/dist/lib/features/metrics/last-seen/types/last-seen-store-type.js.map +1 -0
  278. package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.d.ts +1 -1
  279. package/dist/lib/features/metrics/shared/schema.d.ts.map +1 -0
  280. package/dist/lib/features/metrics/shared/schema.js.map +1 -0
  281. package/dist/lib/features/metrics/shared/schema.test.d.ts.map +1 -0
  282. package/dist/lib/features/metrics/shared/schema.test.js.map +1 -0
  283. package/dist/lib/features/playground/advanced-playground.test.js +12 -13
  284. package/dist/lib/features/playground/advanced-playground.test.js.map +1 -1
  285. package/dist/lib/features/playground/feature-evaluator/client.d.ts +2 -2
  286. package/dist/lib/features/playground/feature-evaluator/client.d.ts.map +1 -1
  287. package/dist/lib/features/playground/feature-evaluator/client.js +17 -7
  288. package/dist/lib/features/playground/feature-evaluator/client.js.map +1 -1
  289. package/dist/lib/features/playground/feature-evaluator/feature-evaluator.d.ts.map +1 -1
  290. package/dist/lib/features/playground/feature-evaluator/feature-evaluator.js +3 -2
  291. package/dist/lib/features/playground/feature-evaluator/feature-evaluator.js.map +1 -1
  292. package/dist/lib/features/playground/feature-evaluator/repository/index.d.ts.map +1 -1
  293. package/dist/lib/features/playground/feature-evaluator/repository/storage-provider.js.map +1 -1
  294. package/dist/lib/features/playground/feature-evaluator/strategy/strategy.d.ts +2 -2
  295. package/dist/lib/features/playground/feature-evaluator/strategy/strategy.d.ts.map +1 -1
  296. package/dist/lib/features/playground/feature-evaluator/variant.d.ts +5 -0
  297. package/dist/lib/features/playground/feature-evaluator/variant.d.ts.map +1 -1
  298. package/dist/lib/features/playground/feature-evaluator/variant.js.map +1 -1
  299. package/dist/lib/features/playground/offline-unleash-client.d.ts +3 -3
  300. package/dist/lib/features/playground/offline-unleash-client.d.ts.map +1 -1
  301. package/dist/lib/features/playground/offline-unleash-client.js +5 -2
  302. package/dist/lib/features/playground/offline-unleash-client.js.map +1 -1
  303. package/dist/lib/features/playground/offline-unleash-client.test.js +1 -1
  304. package/dist/lib/features/playground/offline-unleash-client.test.js.map +1 -1
  305. package/dist/lib/features/playground/playground-service.d.ts +6 -6
  306. package/dist/lib/features/playground/playground-service.d.ts.map +1 -1
  307. package/dist/lib/features/playground/playground-service.js +7 -3
  308. package/dist/lib/features/playground/playground-service.js.map +1 -1
  309. package/dist/lib/features/playground/playground-view-model.d.ts +1 -1
  310. package/dist/lib/features/playground/playground-view-model.d.ts.map +1 -1
  311. package/dist/lib/features/playground/playground.d.ts.map +1 -1
  312. package/dist/lib/features/playground/playground.js +2 -1
  313. package/dist/lib/features/playground/playground.js.map +1 -1
  314. package/dist/lib/features/private-project/createPrivateProjectChecker.d.ts +1 -1
  315. package/dist/lib/features/private-project/createPrivateProjectChecker.d.ts.map +1 -1
  316. package/dist/lib/features/private-project/privateProjectStore.js +1 -1
  317. package/dist/lib/features/private-project/privateProjectStore.js.map +1 -1
  318. package/dist/lib/features/project/createProjectService.d.ts +1 -1
  319. package/dist/lib/features/project/createProjectService.d.ts.map +1 -1
  320. package/dist/lib/features/project/createProjectService.js +2 -2
  321. package/dist/lib/features/project/createProjectService.js.map +1 -1
  322. package/dist/lib/features/project-environments/createEnvironmentService.d.ts.map +1 -1
  323. package/dist/lib/features/project-environments/createEnvironmentService.js +2 -8
  324. package/dist/lib/features/project-environments/createEnvironmentService.js.map +1 -1
  325. package/dist/lib/features/project-environments/environment-service.d.ts +1 -1
  326. package/dist/lib/features/project-environments/environment-service.d.ts.map +1 -1
  327. package/dist/lib/features/project-environments/environment-service.test.js.map +1 -1
  328. package/dist/lib/features/project-environments/environment-store.d.ts.map +1 -1
  329. package/dist/lib/features/project-environments/environment-store.js +12 -0
  330. package/dist/lib/features/project-environments/environment-store.js.map +1 -1
  331. package/dist/lib/features/project-environments/environments.d.ts.map +1 -1
  332. package/dist/lib/features/scheduler/schedule-services.d.ts.map +1 -1
  333. package/dist/lib/features/scheduler/schedule-services.js +3 -1
  334. package/dist/lib/features/scheduler/schedule-services.js.map +1 -1
  335. package/dist/lib/features/scheduler/scheduler-service.d.ts +2 -1
  336. package/dist/lib/features/scheduler/scheduler-service.d.ts.map +1 -1
  337. package/dist/lib/features/scheduler/scheduler-service.js +42 -13
  338. package/dist/lib/features/scheduler/scheduler-service.js.map +1 -1
  339. package/dist/lib/features/scheduler/scheduler-service.test.js +35 -2
  340. package/dist/lib/features/scheduler/scheduler-service.test.js.map +1 -1
  341. package/dist/lib/features/segment/createSegmentService.d.ts +1 -1
  342. package/dist/lib/features/segment/createSegmentService.d.ts.map +1 -1
  343. package/dist/lib/features/segment/createSegmentService.js +2 -7
  344. package/dist/lib/features/segment/createSegmentService.js.map +1 -1
  345. package/dist/lib/features/segment/segment-controller.d.ts.map +1 -1
  346. package/dist/lib/features/segment/segment-controller.js +14 -25
  347. package/dist/lib/features/segment/segment-controller.js.map +1 -1
  348. package/dist/lib/features/tag-type/createTagTypeService.d.ts.map +1 -1
  349. package/dist/lib/features/tag-type/createTagTypeService.js +3 -17
  350. package/dist/lib/features/tag-type/createTagTypeService.js.map +1 -1
  351. package/dist/lib/features/tag-type/tag-type-service.d.ts +1 -1
  352. package/dist/lib/features/tag-type/tag-type-service.d.ts.map +1 -1
  353. package/dist/lib/features/tag-type/tag-types.e2e.test.js.map +1 -1
  354. package/dist/lib/metric-events.d.ts +3 -1
  355. package/dist/lib/metric-events.d.ts.map +1 -1
  356. package/dist/lib/metric-events.js +5 -1
  357. package/dist/lib/metric-events.js.map +1 -1
  358. package/dist/lib/metrics.d.ts +2 -3
  359. package/dist/lib/metrics.d.ts.map +1 -1
  360. package/dist/lib/metrics.js +150 -89
  361. package/dist/lib/metrics.js.map +1 -1
  362. package/dist/lib/metrics.test.js.map +1 -1
  363. package/dist/lib/middleware/api-token-middleware.d.ts +1 -1
  364. package/dist/lib/middleware/api-token-middleware.d.ts.map +1 -1
  365. package/dist/lib/middleware/demo-authentication.d.ts +1 -1
  366. package/dist/lib/middleware/demo-authentication.d.ts.map +1 -1
  367. package/dist/lib/middleware/demo-authentication.js +6 -2
  368. package/dist/lib/middleware/demo-authentication.js.map +1 -1
  369. package/dist/lib/middleware/pat-middleware.d.ts +4 -1
  370. package/dist/lib/middleware/pat-middleware.d.ts.map +1 -1
  371. package/dist/lib/middleware/pat-middleware.js +0 -1
  372. package/dist/lib/middleware/pat-middleware.js.map +1 -1
  373. package/dist/lib/middleware/pat-middleware.test.js +5 -0
  374. package/dist/lib/middleware/pat-middleware.test.js.map +1 -1
  375. package/dist/lib/middleware/response-time-metrics.d.ts +1 -1
  376. package/dist/lib/middleware/response-time-metrics.d.ts.map +1 -1
  377. package/dist/lib/middleware/response-time-metrics.js.map +1 -1
  378. package/dist/lib/middleware/session-db.js.map +1 -1
  379. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts +4 -0
  380. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.d.ts.map +1 -1
  381. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js +4 -0
  382. package/dist/lib/openapi/spec/advanced-playground-environment-feature-schema.js.map +1 -1
  383. package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts +4 -0
  384. package/dist/lib/openapi/spec/advanced-playground-feature-schema.d.ts.map +1 -1
  385. package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts +8 -0
  386. package/dist/lib/openapi/spec/advanced-playground-response-schema.d.ts.map +1 -1
  387. package/dist/lib/openapi/spec/create-api-token-schema.d.ts +1 -1
  388. package/dist/lib/openapi/spec/event-schema.d.ts +1 -1
  389. package/dist/lib/openapi/spec/events-schema.d.ts +1 -1
  390. package/dist/lib/openapi/spec/feature-events-schema.d.ts +1 -1
  391. package/dist/lib/openapi/spec/feature-type-count-schema.d.ts.map +1 -1
  392. package/dist/lib/openapi/spec/feature-type-count-schema.js.map +1 -1
  393. package/dist/lib/openapi/spec/feature-type-count-schema.test.js.map +1 -1
  394. package/dist/lib/openapi/spec/instance-admin-stats-schema.d.ts +18 -0
  395. package/dist/lib/openapi/spec/instance-admin-stats-schema.d.ts.map +1 -1
  396. package/dist/lib/openapi/spec/instance-admin-stats-schema.js +18 -0
  397. package/dist/lib/openapi/spec/instance-admin-stats-schema.js.map +1 -1
  398. package/dist/lib/openapi/spec/playground-feature-schema.d.ts +11 -0
  399. package/dist/lib/openapi/spec/playground-feature-schema.d.ts.map +1 -1
  400. package/dist/lib/openapi/spec/playground-feature-schema.js +11 -0
  401. package/dist/lib/openapi/spec/playground-feature-schema.js.map +1 -1
  402. package/dist/lib/openapi/spec/playground-response-schema.d.ts +11 -0
  403. package/dist/lib/openapi/spec/playground-response-schema.d.ts.map +1 -1
  404. package/dist/lib/openapi/spec/project-overview-schema.test.js.map +1 -1
  405. package/dist/lib/openapi/spec/project-schema.d.ts +15 -0
  406. package/dist/lib/openapi/spec/project-schema.d.ts.map +1 -1
  407. package/dist/lib/openapi/spec/project-schema.js +15 -0
  408. package/dist/lib/openapi/spec/project-schema.js.map +1 -1
  409. package/dist/lib/openapi/spec/projects-schema.d.ts +15 -0
  410. package/dist/lib/openapi/spec/projects-schema.d.ts.map +1 -1
  411. package/dist/lib/openapi/spec/proxy-feature-schema.d.ts +12 -1
  412. package/dist/lib/openapi/spec/proxy-feature-schema.d.ts.map +1 -1
  413. package/dist/lib/openapi/spec/proxy-feature-schema.js +12 -1
  414. package/dist/lib/openapi/spec/proxy-feature-schema.js.map +1 -1
  415. package/dist/lib/openapi/spec/proxy-features-schema.d.ts +12 -1
  416. package/dist/lib/openapi/spec/proxy-features-schema.d.ts.map +1 -1
  417. package/dist/lib/openapi/spec/search-events-schema.d.ts +1 -1
  418. package/dist/lib/openapi/spec/state-schema.d.ts +15 -0
  419. package/dist/lib/openapi/spec/state-schema.d.ts.map +1 -1
  420. package/dist/lib/openapi/spec/ui-config-schema.d.ts +12 -1
  421. package/dist/lib/openapi/spec/ui-config-schema.d.ts.map +1 -1
  422. package/dist/lib/openapi/spec/variant-flag-schema.d.ts +12 -1
  423. package/dist/lib/openapi/spec/variant-flag-schema.d.ts.map +1 -1
  424. package/dist/lib/openapi/spec/variant-flag-schema.js +12 -1
  425. package/dist/lib/openapi/spec/variant-flag-schema.js.map +1 -1
  426. package/dist/lib/proxy/proxy-repository.d.ts.map +1 -1
  427. package/dist/lib/proxy/proxy-repository.js.map +1 -1
  428. package/dist/lib/routes/admin-api/addon.d.ts +1 -1
  429. package/dist/lib/routes/admin-api/addon.d.ts.map +1 -1
  430. package/dist/lib/routes/admin-api/api-token.d.ts +1 -0
  431. package/dist/lib/routes/admin-api/api-token.d.ts.map +1 -1
  432. package/dist/lib/routes/admin-api/api-token.js +5 -0
  433. package/dist/lib/routes/admin-api/api-token.js.map +1 -1
  434. package/dist/lib/routes/admin-api/api-token.test.d.ts +2 -0
  435. package/dist/lib/routes/admin-api/api-token.test.d.ts.map +1 -0
  436. package/dist/lib/routes/admin-api/api-token.test.js +105 -0
  437. package/dist/lib/routes/admin-api/api-token.test.js.map +1 -0
  438. package/dist/lib/routes/admin-api/config.d.ts +3 -1
  439. package/dist/lib/routes/admin-api/config.d.ts.map +1 -1
  440. package/dist/lib/routes/admin-api/config.js +15 -3
  441. package/dist/lib/routes/admin-api/config.js.map +1 -1
  442. package/dist/lib/routes/admin-api/config.test.js +44 -0
  443. package/dist/lib/routes/admin-api/config.test.js.map +1 -1
  444. package/dist/lib/routes/admin-api/context.d.ts +2 -2
  445. package/dist/lib/routes/admin-api/context.d.ts.map +1 -1
  446. package/dist/lib/routes/admin-api/context.js +1 -1
  447. package/dist/lib/routes/admin-api/context.js.map +1 -1
  448. package/dist/lib/routes/admin-api/context.test.js.map +1 -1
  449. package/dist/lib/routes/admin-api/index.js +1 -1
  450. package/dist/lib/routes/admin-api/index.js.map +1 -1
  451. package/dist/lib/routes/admin-api/instance-admin.d.ts.map +1 -1
  452. package/dist/lib/routes/admin-api/instance-admin.js +4 -0
  453. package/dist/lib/routes/admin-api/instance-admin.js.map +1 -1
  454. package/dist/lib/routes/admin-api/metrics.d.ts.map +1 -1
  455. package/dist/lib/routes/admin-api/metrics.js +2 -1
  456. package/dist/lib/routes/admin-api/metrics.js.map +1 -1
  457. package/dist/lib/routes/admin-api/metrics.test.js.map +1 -1
  458. package/dist/lib/routes/admin-api/project/project-api.d.ts +1 -1
  459. package/dist/lib/routes/admin-api/project/project-api.d.ts.map +1 -1
  460. package/dist/lib/routes/admin-api/project/project-api.js.map +1 -1
  461. package/dist/lib/routes/admin-api/project/variants.d.ts +2 -2
  462. package/dist/lib/routes/admin-api/project/variants.d.ts.map +1 -1
  463. package/dist/lib/routes/admin-api/public-signup.test.js +14 -3
  464. package/dist/lib/routes/admin-api/public-signup.test.js.map +1 -1
  465. package/dist/lib/routes/admin-api/state.d.ts.map +1 -1
  466. package/dist/lib/routes/admin-api/state.js +1 -0
  467. package/dist/lib/routes/admin-api/state.js.map +1 -1
  468. package/dist/lib/routes/admin-api/tag.test.js.map +1 -1
  469. package/dist/lib/routes/admin-api/telemetry.d.ts +2 -2
  470. package/dist/lib/routes/admin-api/telemetry.d.ts.map +1 -1
  471. package/dist/lib/routes/client-api/index.js +2 -2
  472. package/dist/lib/routes/client-api/index.js.map +1 -1
  473. package/dist/lib/routes/controller.d.ts.map +1 -1
  474. package/dist/lib/routes/controller.js.map +1 -1
  475. package/dist/lib/routes/edge-api/index.js +2 -2
  476. package/dist/lib/routes/edge-api/index.js.map +1 -1
  477. package/dist/lib/routes/health-check.test.js.map +1 -1
  478. package/dist/lib/routes/public-invite.test.js +7 -2
  479. package/dist/lib/routes/public-invite.test.js.map +1 -1
  480. package/dist/lib/segments/segment-service-interface.d.ts +3 -3
  481. package/dist/lib/segments/segment-service-interface.d.ts.map +1 -1
  482. package/dist/lib/server-impl.d.ts.map +1 -1
  483. package/dist/lib/server-impl.js +4 -3
  484. package/dist/lib/server-impl.js.map +1 -1
  485. package/dist/lib/services/access-service.d.ts +10 -3
  486. package/dist/lib/services/access-service.d.ts.map +1 -1
  487. package/dist/lib/services/access-service.js.map +1 -1
  488. package/dist/lib/services/access-service.test.js +2 -5
  489. package/dist/lib/services/access-service.test.js.map +1 -1
  490. package/dist/lib/services/account-service.d.ts +1 -1
  491. package/dist/lib/services/account-service.d.ts.map +1 -1
  492. package/dist/lib/services/account-service.js.map +1 -1
  493. package/dist/lib/services/addon-service.d.ts +1 -1
  494. package/dist/lib/services/addon-service.d.ts.map +1 -1
  495. package/dist/lib/services/addon-service.test.js +6 -2
  496. package/dist/lib/services/addon-service.test.js.map +1 -1
  497. package/dist/lib/services/api-token-service.d.ts +9 -2
  498. package/dist/lib/services/api-token-service.d.ts.map +1 -1
  499. package/dist/lib/services/api-token-service.js +22 -3
  500. package/dist/lib/services/api-token-service.js.map +1 -1
  501. package/dist/lib/services/api-token-service.test.js +20 -5
  502. package/dist/lib/services/api-token-service.test.js.map +1 -1
  503. package/dist/lib/services/context-service.d.ts +1 -1
  504. package/dist/lib/services/context-service.d.ts.map +1 -1
  505. package/dist/lib/services/context-service.js.map +1 -1
  506. package/dist/lib/services/email-service.d.ts +1 -1
  507. package/dist/lib/services/email-service.d.ts.map +1 -1
  508. package/dist/lib/services/email-service.js +5 -1
  509. package/dist/lib/services/email-service.js.map +1 -1
  510. package/dist/lib/services/event-service.d.ts +3 -18
  511. package/dist/lib/services/event-service.d.ts.map +1 -1
  512. package/dist/lib/services/event-service.js +21 -58
  513. package/dist/lib/services/event-service.js.map +1 -1
  514. package/dist/lib/services/favorites-service.d.ts +1 -1
  515. package/dist/lib/services/favorites-service.d.ts.map +1 -1
  516. package/dist/lib/services/feature-service-potentially-stale.test.js +1 -1
  517. package/dist/lib/services/feature-service-potentially-stale.test.js.map +1 -1
  518. package/dist/lib/services/feature-tag-service.d.ts +1 -1
  519. package/dist/lib/services/feature-tag-service.d.ts.map +1 -1
  520. package/dist/lib/services/feature-type-service.d.ts +1 -1
  521. package/dist/lib/services/feature-type-service.d.ts.map +1 -1
  522. package/dist/lib/services/feature-type-service.js.map +1 -1
  523. package/dist/lib/services/group-service.d.ts +1 -1
  524. package/dist/lib/services/group-service.d.ts.map +1 -1
  525. package/dist/lib/services/index.d.ts +4 -4
  526. package/dist/lib/services/index.d.ts.map +1 -1
  527. package/dist/lib/services/index.js +9 -6
  528. package/dist/lib/services/index.js.map +1 -1
  529. package/dist/lib/services/pat-service.d.ts +1 -1
  530. package/dist/lib/services/pat-service.d.ts.map +1 -1
  531. package/dist/lib/services/project-service.d.ts +3 -3
  532. package/dist/lib/services/project-service.d.ts.map +1 -1
  533. package/dist/lib/services/proxy-service.d.ts.map +1 -1
  534. package/dist/lib/services/proxy-service.js.map +1 -1
  535. package/dist/lib/services/public-signup-token-service.d.ts +2 -2
  536. package/dist/lib/services/public-signup-token-service.d.ts.map +1 -1
  537. package/dist/lib/services/reset-token-service.js.map +1 -1
  538. package/dist/lib/services/segment-service.d.ts +2 -2
  539. package/dist/lib/services/segment-service.d.ts.map +1 -1
  540. package/dist/lib/services/segment-service.js +1 -2
  541. package/dist/lib/services/segment-service.js.map +1 -1
  542. package/dist/lib/services/setting-service.d.ts +1 -1
  543. package/dist/lib/services/setting-service.d.ts.map +1 -1
  544. package/dist/lib/services/state-service.d.ts +1 -1
  545. package/dist/lib/services/state-service.d.ts.map +1 -1
  546. package/dist/lib/services/state-service.js +1 -0
  547. package/dist/lib/services/state-service.js.map +1 -1
  548. package/dist/lib/services/state-service.test.js +14 -4
  549. package/dist/lib/services/state-service.test.js.map +1 -1
  550. package/dist/lib/services/state-util.d.ts.map +1 -1
  551. package/dist/lib/services/state-util.js.map +1 -1
  552. package/dist/lib/services/strategy-service.d.ts +1 -1
  553. package/dist/lib/services/strategy-service.d.ts.map +1 -1
  554. package/dist/lib/services/tag-service.d.ts +1 -1
  555. package/dist/lib/services/tag-service.d.ts.map +1 -1
  556. package/dist/lib/services/user-service.d.ts +1 -1
  557. package/dist/lib/services/user-service.d.ts.map +1 -1
  558. package/dist/lib/services/user-service.js +6 -3
  559. package/dist/lib/services/user-service.js.map +1 -1
  560. package/dist/lib/services/user-service.test.js +1 -1
  561. package/dist/lib/services/user-service.test.js.map +1 -1
  562. package/dist/lib/services/version-service.d.ts.map +1 -1
  563. package/dist/lib/services/version-service.js.map +1 -1
  564. package/dist/lib/types/api-user.d.ts +1 -0
  565. package/dist/lib/types/api-user.d.ts.map +1 -1
  566. package/dist/lib/types/api-user.js.map +1 -1
  567. package/dist/lib/types/core.d.ts +2 -1
  568. package/dist/lib/types/core.d.ts.map +1 -1
  569. package/dist/lib/types/core.js +10 -3
  570. package/dist/lib/types/core.js.map +1 -1
  571. package/dist/lib/types/core.test.d.ts +2 -0
  572. package/dist/lib/types/core.test.d.ts.map +1 -0
  573. package/dist/lib/types/core.test.js +62 -0
  574. package/dist/lib/types/core.test.js.map +1 -0
  575. package/dist/lib/types/events.d.ts +19 -2
  576. package/dist/lib/types/events.d.ts.map +1 -1
  577. package/dist/lib/types/events.js +10 -4
  578. package/dist/lib/types/events.js.map +1 -1
  579. package/dist/lib/types/experimental.d.ts +1 -1
  580. package/dist/lib/types/experimental.d.ts.map +1 -1
  581. package/dist/lib/types/experimental.js +29 -6
  582. package/dist/lib/types/experimental.js.map +1 -1
  583. package/dist/lib/types/model.d.ts +4 -1
  584. package/dist/lib/types/model.d.ts.map +1 -1
  585. package/dist/lib/types/models/api-token.js +1 -1
  586. package/dist/lib/types/models/api-token.js.map +1 -1
  587. package/dist/lib/types/no-auth-user.d.ts +0 -1
  588. package/dist/lib/types/no-auth-user.d.ts.map +1 -1
  589. package/dist/lib/types/no-auth-user.js +1 -3
  590. package/dist/lib/types/no-auth-user.js.map +1 -1
  591. package/dist/lib/types/option.d.ts +2 -1
  592. package/dist/lib/types/option.d.ts.map +1 -1
  593. package/dist/lib/types/permissions.d.ts +8 -0
  594. package/dist/lib/types/permissions.d.ts.map +1 -1
  595. package/dist/lib/types/permissions.js +9 -1
  596. package/dist/lib/types/permissions.js.map +1 -1
  597. package/dist/lib/types/services.d.ts +9 -9
  598. package/dist/lib/types/services.d.ts.map +1 -1
  599. package/dist/lib/types/stores/access-store.d.ts +1 -1
  600. package/dist/lib/types/stores/access-store.d.ts.map +1 -1
  601. package/dist/lib/types/stores/client-instance-store.d.ts +1 -0
  602. package/dist/lib/types/stores/client-instance-store.d.ts.map +1 -1
  603. package/dist/lib/types/stores/event-store.d.ts +2 -1
  604. package/dist/lib/types/stores/event-store.d.ts.map +1 -1
  605. package/dist/lib/types/stores/project-stats-store-type.d.ts +2 -2
  606. package/dist/lib/types/stores/project-stats-store-type.d.ts.map +1 -1
  607. package/dist/lib/types/stores/role-store.d.ts +1 -1
  608. package/dist/lib/types/stores/role-store.d.ts.map +1 -1
  609. package/dist/lib/types/stores/strategy-store.d.ts +1 -1
  610. package/dist/lib/types/stores/strategy-store.d.ts.map +1 -1
  611. package/dist/lib/types/stores.d.ts +2 -2
  612. package/dist/lib/types/stores.d.ts.map +1 -1
  613. package/dist/lib/util/anonymise.d.ts +1 -0
  614. package/dist/lib/util/anonymise.d.ts.map +1 -1
  615. package/dist/lib/util/anonymise.js +13 -1
  616. package/dist/lib/util/anonymise.js.map +1 -1
  617. package/dist/lib/util/constants.d.ts +1 -0
  618. package/dist/lib/util/constants.d.ts.map +1 -1
  619. package/dist/lib/util/constants.js +2 -1
  620. package/dist/lib/util/constants.js.map +1 -1
  621. package/dist/lib/util/extract-user.d.ts +6 -6
  622. package/dist/lib/util/extract-user.d.ts.map +1 -1
  623. package/dist/lib/util/extract-user.js +3 -1
  624. package/dist/lib/util/extract-user.js.map +1 -1
  625. package/dist/lib/util/flag-resolver.js +1 -1
  626. package/dist/lib/util/flag-resolver.js.map +1 -1
  627. package/dist/lib/util/flag-resolver.test.js +34 -0
  628. package/dist/lib/util/flag-resolver.test.js.map +1 -1
  629. package/dist/lib/util/index.d.ts +1 -1
  630. package/dist/lib/util/index.d.ts.map +1 -1
  631. package/dist/lib/util/index.js +1 -1
  632. package/dist/lib/util/index.js.map +1 -1
  633. package/dist/lib/util/metrics/createCounter.d.ts +15 -0
  634. package/dist/lib/util/metrics/createCounter.d.ts.map +1 -0
  635. package/dist/lib/util/metrics/createCounter.js +48 -0
  636. package/dist/lib/util/metrics/createCounter.js.map +1 -0
  637. package/dist/lib/util/metrics/createGauge.d.ts +15 -0
  638. package/dist/lib/util/metrics/createGauge.d.ts.map +1 -0
  639. package/dist/lib/util/metrics/createGauge.js +45 -0
  640. package/dist/lib/util/metrics/createGauge.js.map +1 -0
  641. package/dist/lib/util/metrics/createSummary.d.ts +14 -0
  642. package/dist/lib/util/metrics/createSummary.d.ts.map +1 -0
  643. package/dist/lib/util/metrics/createSummary.js +39 -0
  644. package/dist/lib/util/metrics/createSummary.js.map +1 -0
  645. package/dist/lib/util/metrics/index.d.ts +4 -0
  646. package/dist/lib/util/metrics/index.d.ts.map +1 -0
  647. package/dist/lib/util/metrics/index.js +20 -0
  648. package/dist/lib/util/metrics/index.js.map +1 -0
  649. package/dist/lib/util/omit-keys.d.ts.map +1 -1
  650. package/dist/lib/util/omit-keys.js.map +1 -1
  651. package/dist/lib/util/time-utils.d.ts +1 -0
  652. package/dist/lib/util/time-utils.d.ts.map +1 -1
  653. package/dist/lib/util/time-utils.js +11 -1
  654. package/dist/lib/util/time-utils.js.map +1 -1
  655. package/dist/lib/util/time-utils.test.js +7 -0
  656. package/dist/lib/util/time-utils.test.js.map +1 -1
  657. package/dist/lib/util/timer.test.js.map +1 -1
  658. package/dist/mailtemplates/scheduled-change-conflict/scheduled-change-conflict.html.mustache +91 -206
  659. package/dist/mailtemplates/scheduled-change-conflict/scheduled-change-conflict.plain.mustache +4 -0
  660. package/dist/mailtemplates/scheduled-execution-failed/scheduled-execution-failed.html.mustache +83 -202
  661. package/dist/mailtemplates/scheduled-execution-failed/scheduled-execution-failed.plain.mustache +0 -1
  662. package/dist/migrations/20240108151652-add-daily-metrics.d.ts +3 -0
  663. package/dist/migrations/20240108151652-add-daily-metrics.d.ts.map +1 -0
  664. package/dist/migrations/20240108151652-add-daily-metrics.js +40 -0
  665. package/dist/migrations/20240108151652-add-daily-metrics.js.map +1 -0
  666. package/dist/migrations/20240109093021-incoming-webhooks-description.d.ts +3 -0
  667. package/dist/migrations/20240109093021-incoming-webhooks-description.d.ts.map +1 -0
  668. package/dist/migrations/20240109093021-incoming-webhooks-description.js +10 -0
  669. package/dist/migrations/20240109093021-incoming-webhooks-description.js.map +1 -0
  670. package/dist/migrations/20240109095348-add-reason-column-to-schedule.d.ts +3 -0
  671. package/dist/migrations/20240109095348-add-reason-column-to-schedule.d.ts.map +1 -0
  672. package/dist/migrations/20240109095348-add-reason-column-to-schedule.js +9 -0
  673. package/dist/migrations/20240109095348-add-reason-column-to-schedule.js.map +1 -0
  674. package/dist/migrations/20240111075911-update-system-user-email.d.ts +3 -0
  675. package/dist/migrations/20240111075911-update-system-user-email.d.ts.map +1 -0
  676. package/dist/migrations/20240111075911-update-system-user-email.js +8 -0
  677. package/dist/migrations/20240111075911-update-system-user-email.js.map +1 -0
  678. package/dist/migrations/20240111125100-automated-actions.d.ts +3 -0
  679. package/dist/migrations/20240111125100-automated-actions.d.ts.map +1 -0
  680. package/dist/migrations/20240111125100-automated-actions.js +39 -0
  681. package/dist/migrations/20240111125100-automated-actions.js.map +1 -0
  682. package/dist/migrations/20240116104456-drop-unused-column-permissionid.d.ts +3 -0
  683. package/dist/migrations/20240116104456-drop-unused-column-permissionid.d.ts.map +1 -0
  684. package/dist/migrations/20240116104456-drop-unused-column-permissionid.js +14 -0
  685. package/dist/migrations/20240116104456-drop-unused-column-permissionid.js.map +1 -0
  686. package/dist/migrations/20240116154700-unleash-admin-token-user.d.ts +3 -0
  687. package/dist/migrations/20240116154700-unleash-admin-token-user.d.ts.map +1 -0
  688. package/dist/migrations/20240116154700-unleash-admin-token-user.js +15 -0
  689. package/dist/migrations/20240116154700-unleash-admin-token-user.js.map +1 -0
  690. package/dist/migrations/20240117093601-add-more-granular-project-permissions.d.ts +3 -0
  691. package/dist/migrations/20240117093601-add-more-granular-project-permissions.d.ts.map +1 -0
  692. package/dist/migrations/20240117093601-add-more-granular-project-permissions.js +27 -0
  693. package/dist/migrations/20240117093601-add-more-granular-project-permissions.js.map +1 -0
  694. package/dist/migrations/20240118093611-missing-primary-keys.d.ts +3 -0
  695. package/dist/migrations/20240118093611-missing-primary-keys.d.ts.map +1 -0
  696. package/dist/migrations/20240118093611-missing-primary-keys.js +17 -0
  697. package/dist/migrations/20240118093611-missing-primary-keys.js.map +1 -0
  698. package/dist/migrations/20240119171200-action-states.d.ts +3 -0
  699. package/dist/migrations/20240119171200-action-states.d.ts.map +1 -0
  700. package/dist/migrations/20240119171200-action-states.js +23 -0
  701. package/dist/migrations/20240119171200-action-states.js.map +1 -0
  702. package/dist/migrations/20240124123000-add-enabled-to-action-sets.d.ts +3 -0
  703. package/dist/migrations/20240124123000-add-enabled-to-action-sets.d.ts.map +1 -0
  704. package/dist/migrations/20240124123000-add-enabled-to-action-sets.js +12 -0
  705. package/dist/migrations/20240124123000-add-enabled-to-action-sets.js.map +1 -0
  706. package/dist/migrations/20240125084701-add-user-trends.d.ts +3 -0
  707. package/dist/migrations/20240125084701-add-user-trends.d.ts.map +1 -0
  708. package/dist/migrations/20240125084701-add-user-trends.js +14 -0
  709. package/dist/migrations/20240125084701-add-user-trends.js.map +1 -0
  710. package/dist/migrations/20240125085703-users-table-increae-image-url-size.d.ts +3 -0
  711. package/dist/migrations/20240125085703-users-table-increae-image-url-size.d.ts.map +1 -0
  712. package/dist/migrations/20240125085703-users-table-increae-image-url-size.js +14 -0
  713. package/dist/migrations/20240125085703-users-table-increae-image-url-size.js.map +1 -0
  714. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.d.ts +3 -0
  715. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.d.ts.map +1 -0
  716. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.js +18 -0
  717. package/dist/migrations/20240125090553-events-fix-incorrectly-assigned-sysuser-id.js.map +1 -0
  718. package/dist/migrations/20240125100000-events-system-user-old2new.d.ts +3 -0
  719. package/dist/migrations/20240125100000-events-system-user-old2new.d.ts.map +1 -0
  720. package/dist/migrations/20240125100000-events-system-user-old2new.js +10 -0
  721. package/dist/migrations/20240125100000-events-system-user-old2new.js.map +1 -0
  722. package/dist/migrations/20240126095544-add-flag-trends.d.ts +3 -0
  723. package/dist/migrations/20240126095544-add-flag-trends.d.ts.map +1 -0
  724. package/dist/migrations/20240126095544-add-flag-trends.js +17 -0
  725. package/dist/migrations/20240126095544-add-flag-trends.js.map +1 -0
  726. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.d.ts +3 -0
  727. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.d.ts.map +1 -0
  728. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.js +14 -0
  729. package/dist/migrations/20240130104757-flag-trends-health-time-to-production.js.map +1 -0
  730. package/dist/migrator.js +1 -1
  731. package/dist/migrator.js.map +1 -1
  732. package/dist/server-dev.js +2 -3
  733. package/dist/server-dev.js.map +1 -1
  734. package/dist/test/arbitraries.test.d.ts +2 -2
  735. package/dist/test/arbitraries.test.d.ts.map +1 -1
  736. package/dist/test/config/test-config.d.ts.map +1 -1
  737. package/dist/test/config/test-config.js +1 -0
  738. package/dist/test/config/test-config.js.map +1 -1
  739. package/dist/test/e2e/api/admin/addon.e2e.test.js +1 -1
  740. package/dist/test/e2e/api/admin/addon.e2e.test.js.map +1 -1
  741. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js +102 -0
  742. package/dist/test/e2e/api/admin/api-token.auth.e2e.test.js.map +1 -1
  743. package/dist/test/e2e/api/admin/api-token.e2e.test.js +6 -0
  744. package/dist/test/e2e/api/admin/api-token.e2e.test.js.map +1 -1
  745. package/dist/test/e2e/api/admin/constraints.e2e.test.js.map +1 -1
  746. package/dist/test/e2e/api/admin/context.e2e.test.js.map +1 -1
  747. package/dist/test/e2e/api/admin/event.e2e.test.js +5 -1
  748. package/dist/test/e2e/api/admin/event.e2e.test.js.map +1 -1
  749. package/dist/test/e2e/api/admin/favorites.e2e.test.js.map +1 -1
  750. package/dist/test/e2e/api/admin/feature-type.test.js.map +1 -1
  751. package/dist/test/e2e/api/admin/feature.auth.e2e.test.js.map +1 -1
  752. package/dist/test/e2e/api/admin/feature.custom-auth.e2e.test.js.map +1 -1
  753. package/dist/test/e2e/api/admin/feedback.e2e.test.js.map +1 -1
  754. package/dist/test/e2e/api/admin/instance-admin.e2e.test.js +10 -4
  755. package/dist/test/e2e/api/admin/instance-admin.e2e.test.js.map +1 -1
  756. package/dist/test/e2e/api/admin/project/api-token.e2e.test.js.map +1 -1
  757. package/dist/test/e2e/api/admin/project/project.health.e2e.test.js.map +1 -1
  758. package/dist/test/e2e/api/admin/public-signup-token.e2e.test.js +3 -7
  759. package/dist/test/e2e/api/admin/public-signup-token.e2e.test.js.map +1 -1
  760. package/dist/test/e2e/api/admin/segment.e2e.test.js +2 -5
  761. package/dist/test/e2e/api/admin/segment.e2e.test.js.map +1 -1
  762. package/dist/test/e2e/api/admin/splash.e2e.test.js.map +1 -1
  763. package/dist/test/e2e/api/admin/strategy.e2e.test.js.map +1 -1
  764. package/dist/test/e2e/api/admin/tags.e2e.test.js +1 -1
  765. package/dist/test/e2e/api/admin/tags.e2e.test.js.map +1 -1
  766. package/dist/test/e2e/api/admin/user/pat.e2e.test.js +1 -1
  767. package/dist/test/e2e/api/admin/user/pat.e2e.test.js.map +1 -1
  768. package/dist/test/e2e/api/admin/user/user.test.js.map +1 -1
  769. package/dist/test/e2e/api/admin/user-admin.e2e.test.js +1 -1
  770. package/dist/test/e2e/api/admin/user-admin.e2e.test.js.map +1 -1
  771. package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js +1 -1
  772. package/dist/test/e2e/api/auth/reset-password-controller.e2e.test.js.map +1 -1
  773. package/dist/test/e2e/api/auth/simple-password-provider.e2e.test.js.map +1 -1
  774. package/dist/test/e2e/api/client/metrics.e2e.test.js.map +1 -1
  775. package/dist/test/e2e/api/client/metricsV2.e2e.test.js +7 -6
  776. package/dist/test/e2e/api/client/metricsV2.e2e.test.js.map +1 -1
  777. package/dist/test/e2e/api/client/register.e2e.test.js +1 -0
  778. package/dist/test/e2e/api/client/register.e2e.test.js.map +1 -1
  779. package/dist/test/e2e/api/client/segment.e2e.test.js +1 -3
  780. package/dist/test/e2e/api/client/segment.e2e.test.js.map +1 -1
  781. package/dist/test/e2e/api/openapi/openapi.e2e.test.js.map +1 -1
  782. package/dist/test/e2e/api/proxy/proxy.e2e.test.js +84 -14
  783. package/dist/test/e2e/api/proxy/proxy.e2e.test.js.map +1 -1
  784. package/dist/test/e2e/custom-auth.test.js.map +1 -1
  785. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.d.ts +2 -0
  786. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.d.ts.map +1 -0
  787. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.js +223 -0
  788. package/dist/test/e2e/features-created-by-user-id-data-migration.e2e.test.js.map +1 -0
  789. package/dist/test/e2e/health.e2e.test.js.map +1 -1
  790. package/dist/test/e2e/helpers/app.utils.d.ts +1 -1
  791. package/dist/test/e2e/helpers/app.utils.d.ts.map +1 -1
  792. package/dist/test/e2e/helpers/database-init.d.ts +1 -1
  793. package/dist/test/e2e/helpers/database-init.d.ts.map +1 -1
  794. package/dist/test/e2e/helpers/database-init.js +2 -0
  795. package/dist/test/e2e/helpers/database-init.js.map +1 -1
  796. package/dist/test/e2e/helpers/test-helper.d.ts +4 -2
  797. package/dist/test/e2e/helpers/test-helper.d.ts.map +1 -1
  798. package/dist/test/e2e/helpers/test-helper.js.map +1 -1
  799. package/dist/test/e2e/migrator.e2e.test.js +27 -1
  800. package/dist/test/e2e/migrator.e2e.test.js.map +1 -1
  801. package/dist/test/e2e/routes/routes.test.js.map +1 -1
  802. package/dist/test/e2e/services/access-service.e2e.test.js +26 -8
  803. package/dist/test/e2e/services/access-service.e2e.test.js.map +1 -1
  804. package/dist/test/e2e/services/addon-service.e2e.test.js.map +1 -1
  805. package/dist/test/e2e/services/api-token-service.e2e.test.js.map +1 -1
  806. package/dist/test/e2e/services/group-service.e2e.test.js.map +1 -1
  807. package/dist/test/e2e/services/playground-service.test.d.ts +2 -2
  808. package/dist/test/e2e/services/playground-service.test.d.ts.map +1 -1
  809. package/dist/test/e2e/services/playground-service.test.js +7 -6
  810. package/dist/test/e2e/services/playground-service.test.js.map +1 -1
  811. package/dist/test/e2e/services/project-health-service.e2e.test.js +0 -5
  812. package/dist/test/e2e/services/project-health-service.e2e.test.js.map +1 -1
  813. package/dist/test/e2e/services/reset-token-service.e2e.test.js +6 -6
  814. package/dist/test/e2e/services/reset-token-service.e2e.test.js.map +1 -1
  815. package/dist/test/e2e/services/session-service.e2e.test.js.map +1 -1
  816. package/dist/test/e2e/services/setting-service.test.js.map +1 -1
  817. package/dist/test/e2e/services/state-service.e2e.test.js +9 -7
  818. package/dist/test/e2e/services/state-service.e2e.test.js.map +1 -1
  819. package/dist/test/e2e/services/user-service.e2e.test.js +48 -1
  820. package/dist/test/e2e/services/user-service.e2e.test.js.map +1 -1
  821. package/dist/test/e2e/stores/client-application-store.e2e.test.js +6 -2
  822. package/dist/test/e2e/stores/client-application-store.e2e.test.js.map +1 -1
  823. package/dist/test/e2e/stores/event-store.e2e.test.js.map +1 -1
  824. package/dist/test/e2e/stores/feature-environment-store.e2e.test.js +76 -0
  825. package/dist/test/e2e/stores/feature-environment-store.e2e.test.js.map +1 -1
  826. package/dist/test/e2e/stores/feature-tag-store.e2e.test.js.map +1 -1
  827. package/dist/test/e2e/stores/feature-toggle-client-store.e2e.test.js +1 -1
  828. package/dist/test/e2e/stores/feature-toggle-client-store.e2e.test.js.map +1 -1
  829. package/dist/test/e2e/stores/feature-type-store.e2e.test.js.map +1 -1
  830. package/dist/test/e2e/stores/project-store.e2e.test.js.map +1 -1
  831. package/dist/test/e2e/stores/setting-store.e2e.test.js.map +1 -1
  832. package/dist/test/e2e/stores/user-feedback-store.e2e.test.js.map +1 -1
  833. package/dist/test/e2e/stores/user-splash-store.e2e.test.js.map +1 -1
  834. package/dist/test/e2e/stores/user-store.e2e.test.js +4 -3
  835. package/dist/test/e2e/stores/user-store.e2e.test.js.map +1 -1
  836. package/dist/test/e2e/system-user-migration.test.js +1 -1
  837. package/dist/test/fixtures/fake-access-store.d.ts +1 -1
  838. package/dist/test/fixtures/fake-access-store.d.ts.map +1 -1
  839. package/dist/test/fixtures/fake-access-store.js.map +1 -1
  840. package/dist/test/fixtures/fake-client-instance-store.d.ts +1 -0
  841. package/dist/test/fixtures/fake-client-instance-store.d.ts.map +1 -1
  842. package/dist/test/fixtures/fake-client-instance-store.js +3 -0
  843. package/dist/test/fixtures/fake-client-instance-store.js.map +1 -1
  844. package/dist/test/fixtures/fake-event-store.d.ts +2 -1
  845. package/dist/test/fixtures/fake-event-store.d.ts.map +1 -1
  846. package/dist/test/fixtures/fake-event-store.js +3 -0
  847. package/dist/test/fixtures/fake-event-store.js.map +1 -1
  848. package/dist/test/fixtures/fake-favorite-features-store.d.ts.map +1 -1
  849. package/dist/test/fixtures/fake-favorite-features-store.js.map +1 -1
  850. package/dist/test/fixtures/fake-favorite-projects-store.d.ts.map +1 -1
  851. package/dist/test/fixtures/fake-favorite-projects-store.js.map +1 -1
  852. package/dist/test/fixtures/fake-project-stats-store.d.ts +2 -2
  853. package/dist/test/fixtures/fake-project-stats-store.d.ts.map +1 -1
  854. package/dist/test/fixtures/fake-project-store.d.ts +1 -1
  855. package/dist/test/fixtures/fake-project-store.d.ts.map +1 -1
  856. package/dist/test/fixtures/fake-project-store.js +8 -1
  857. package/dist/test/fixtures/fake-project-store.js.map +1 -1
  858. package/dist/test/fixtures/fake-role-store.d.ts +4 -4
  859. package/dist/test/fixtures/fake-role-store.d.ts.map +1 -1
  860. package/dist/test/fixtures/fake-strategies-store.js +1 -1
  861. package/dist/test/fixtures/fake-strategies-store.js.map +1 -1
  862. package/dist/test/fixtures/store.js +2 -2
  863. package/dist/test/fixtures/store.js.map +1 -1
  864. package/frontend/build/index.html +2 -2
  865. package/frontend/build/static/AdvancedPlayground-DoQ1u8B6.js +4 -0
  866. package/frontend/build/static/{CreateProject-aN-UGdcb.js → CreateProject-iLBz5afO.js} +2 -2
  867. package/frontend/build/static/{FeatureArchiveDialog-eHyhx7Yo.js → FeatureArchiveDialog-NSAcrt7Z.js} +2 -2
  868. package/frontend/build/static/FeatureMetricsChart-UhDepK_o.js +2 -0
  869. package/frontend/build/static/FeatureViewLazyExport-SpKYIb_J.js +25 -0
  870. package/frontend/build/static/LazyAdminExport-w5iLam_A.js +44 -0
  871. package/frontend/build/static/LazyProjectExport-iqGbEmyw.js +27 -0
  872. package/frontend/build/static/LineChartComponent-rG1KLVNr.js +1 -0
  873. package/frontend/build/static/NetworkOverview-7SCGp57r.js +1304 -0
  874. package/frontend/build/static/NetworkTraffic-awTd8Zg5.js +1 -0
  875. package/frontend/build/static/ReactJSONEditor-N-DWXE0h.js +106 -0
  876. package/frontend/build/static/RoleCell-mJ7DV61l.js +1 -0
  877. package/frontend/build/static/{StrategyItemContainer-JoMPKX3L.js → StrategyItemContainer-wxQbaPXr.js} +1 -1
  878. package/frontend/build/static/changeRequestProcessWithSchedule-ZryCFkCp.svg +1 -0
  879. package/frontend/build/static/{flowchart-elk-definition-170a3958-NkZoK_zv.js → flowchart-elk-definition-170a3958-fa48ti80.js} +2 -2
  880. package/frontend/build/static/index-TzAeUmk4.js +10 -0
  881. package/frontend/build/static/index-p2PlVFLf.js +524 -0
  882. package/frontend/build/static/index-pAMHRYpv.js +1 -0
  883. package/frontend/build/static/is_dark-aAyqOy_I.js +1 -0
  884. package/frontend/build/static/{mindmap-definition-44684416-obuYUG0L.js → mindmap-definition-44684416-AfCKDD9v.js} +2 -2
  885. package/frontend/build/static/{style-gSb9cHBe.css → style-4Ai58kIl.css} +1 -1
  886. package/frontend/build/static/{timeline-definition-8e5a9bc6-33WsNwwr.js → timeline-definition-8e5a9bc6-NKNlIEgm.js} +2 -2
  887. package/frontend/build/static/uniqueId-ebLYlRiD.js +1 -0
  888. package/frontend/build/static/{unknownify-YD2Teyht.js → unknownify-g-QgUElr.js} +1 -1
  889. package/frontend/build/static/{useApiTokens-XTOY616x.js → useApiTokens-hvnEZWgJ.js} +1 -1
  890. package/frontend/build/static/{useProjectForm--jxh4Dtm.js → useProjectForm-zqz6LJw4.js} +1 -1
  891. package/frontend/build/static/vanilla-picker-P0dws0ou.js +8 -0
  892. package/frontend/package.json +32 -23
  893. package/package.json +10 -10
  894. package/dist/lib/db/client-metrics-store-v2.d.ts.map +0 -1
  895. package/dist/lib/db/client-metrics-store-v2.js +0 -173
  896. package/dist/lib/db/client-metrics-store-v2.js.map +0 -1
  897. package/dist/lib/db/event-store.test.d.ts.map +0 -1
  898. package/dist/lib/db/event-store.test.js.map +0 -1
  899. package/dist/lib/routes/admin-api/client-metrics.d.ts.map +0 -1
  900. package/dist/lib/routes/client-api/metrics.d.ts.map +0 -1
  901. package/dist/lib/routes/client-api/metrics.js.map +0 -1
  902. package/dist/lib/routes/client-api/metrics.test.d.ts.map +0 -1
  903. package/dist/lib/routes/client-api/metrics.test.js.map +0 -1
  904. package/dist/lib/routes/client-api/register.d.ts.map +0 -1
  905. package/dist/lib/routes/client-api/register.js.map +0 -1
  906. package/dist/lib/routes/client-api/register.test.d.ts.map +0 -1
  907. package/dist/lib/routes/client-api/register.test.js.map +0 -1
  908. package/dist/lib/services/client-metrics/instance-service.d.ts.map +0 -1
  909. package/dist/lib/services/client-metrics/instance-service.js.map +0 -1
  910. package/dist/lib/services/client-metrics/instance-service.test.d.ts.map +0 -1
  911. package/dist/lib/services/client-metrics/instance-service.test.js.map +0 -1
  912. package/dist/lib/services/client-metrics/last-seen/createLastSeenService.d.ts.map +0 -1
  913. package/dist/lib/services/client-metrics/last-seen/createLastSeenService.js.map +0 -1
  914. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-read-model.d.ts.map +0 -1
  915. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-read-model.js.map +0 -1
  916. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-store.d.ts.map +0 -1
  917. package/dist/lib/services/client-metrics/last-seen/fake-last-seen-store.js.map +0 -1
  918. package/dist/lib/services/client-metrics/last-seen/last-seen-read-model.d.ts.map +0 -1
  919. package/dist/lib/services/client-metrics/last-seen/last-seen-read-model.js.map +0 -1
  920. package/dist/lib/services/client-metrics/last-seen/last-seen-service.d.ts.map +0 -1
  921. package/dist/lib/services/client-metrics/last-seen/last-seen-service.js.map +0 -1
  922. package/dist/lib/services/client-metrics/last-seen/last-seen-store.d.ts.map +0 -1
  923. package/dist/lib/services/client-metrics/last-seen/last-seen-store.js.map +0 -1
  924. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.e2e.test.d.ts.map +0 -1
  925. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.e2e.test.js.map +0 -1
  926. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.test.d.ts.map +0 -1
  927. package/dist/lib/services/client-metrics/last-seen/tests/last-seen-service.test.js.map +0 -1
  928. package/dist/lib/services/client-metrics/last-seen/types/last-seen-read-model-type.d.ts.map +0 -1
  929. package/dist/lib/services/client-metrics/last-seen/types/last-seen-read-model-type.js.map +0 -1
  930. package/dist/lib/services/client-metrics/last-seen/types/last-seen-store-type.d.ts.map +0 -1
  931. package/dist/lib/services/client-metrics/last-seen/types/last-seen-store-type.js.map +0 -1
  932. package/dist/lib/services/client-metrics/metrics-service-v2.d.ts.map +0 -1
  933. package/dist/lib/services/client-metrics/metrics-service-v2.js.map +0 -1
  934. package/dist/lib/services/client-metrics/metrics-service-v2.test.d.ts.map +0 -1
  935. package/dist/lib/services/client-metrics/metrics-service-v2.test.js +0 -99
  936. package/dist/lib/services/client-metrics/metrics-service-v2.test.js.map +0 -1
  937. package/dist/lib/services/client-metrics/models.d.ts.map +0 -1
  938. package/dist/lib/services/client-metrics/models.js.map +0 -1
  939. package/dist/lib/services/client-metrics/schema.d.ts.map +0 -1
  940. package/dist/lib/services/client-metrics/schema.js.map +0 -1
  941. package/dist/lib/services/client-metrics/schema.test.d.ts.map +0 -1
  942. package/dist/lib/services/client-metrics/schema.test.js.map +0 -1
  943. package/dist/lib/types/stores/client-metrics-store-v2.d.ts.map +0 -1
  944. package/dist/lib/types/stores/client-metrics-store-v2.js.map +0 -1
  945. package/dist/lib/util/collapseHourlyMetrics.d.ts.map +0 -1
  946. package/dist/lib/util/collapseHourlyMetrics.js.map +0 -1
  947. package/dist/lib/util/collapseHourlyMetrics.test.d.ts.map +0 -1
  948. package/dist/lib/util/collapseHourlyMetrics.test.js.map +0 -1
  949. package/dist/test/e2e/api/admin/client-metrics.e2e.test.d.ts.map +0 -1
  950. package/dist/test/e2e/api/admin/client-metrics.e2e.test.js.map +0 -1
  951. package/dist/test/e2e/services/client-metrics-service.e2e.test.d.ts.map +0 -1
  952. package/dist/test/e2e/services/client-metrics-service.e2e.test.js.map +0 -1
  953. package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.d.ts.map +0 -1
  954. package/dist/test/e2e/stores/client-metrics-store-v2.e2e.test.js.map +0 -1
  955. package/dist/test/fixtures/fake-client-metrics-store-v2.d.ts.map +0 -1
  956. package/dist/test/fixtures/fake-client-metrics-store-v2.js.map +0 -1
  957. package/frontend/build/static/AdvancedPlayground-FxfPUa2V.js +0 -13
  958. package/frontend/build/static/FeatureMetricsChart-ExGq1eXl.js +0 -2
  959. package/frontend/build/static/FeatureViewLazyExport-S8mj8m0z.js +0 -25
  960. package/frontend/build/static/LazyAdminExport-fpVZFnP9.js +0 -44
  961. package/frontend/build/static/LazyProjectExport-_QSE5C5m.js +0 -25
  962. package/frontend/build/static/NetworkOverview-ylTzmeDg.js +0 -1304
  963. package/frontend/build/static/NetworkTraffic-qj5h7JRk.js +0 -1
  964. package/frontend/build/static/ReactJSONEditor-E59dRBYR.js +0 -129
  965. package/frontend/build/static/RoleCell-TGTVkKHO.js +0 -1
  966. package/frontend/build/static/chartjs-adapter-date-fns.esm-JSlDxtwH.js +0 -23
  967. package/frontend/build/static/index-JVRlSBvr.js +0 -501
  968. package/frontend/build/static/is_dark-gjUQW15t.js +0 -1
  969. /package/dist/lib/{db → features/events}/event-store.test.d.ts +0 -0
  970. /package/dist/{test/e2e/services → lib/features/metrics/client-metrics}/client-metrics-service.e2e.test.d.ts +0 -0
  971. /package/dist/{test/e2e/stores → lib/features/metrics/client-metrics}/client-metrics-store-v2.e2e.test.d.ts +0 -0
  972. /package/dist/{test/e2e/api/admin → lib/features/metrics/client-metrics}/client-metrics.e2e.test.d.ts +0 -0
  973. /package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.js +0 -0
  974. /package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.test.d.ts +0 -0
  975. /package/dist/lib/{util → features/metrics/client-metrics}/collapseHourlyMetrics.test.js +0 -0
  976. /package/dist/lib/{services → features/metrics}/client-metrics/metrics-service-v2.test.d.ts +0 -0
  977. /package/dist/lib/{services/client-metrics → features/metrics/instance}/instance-service.test.d.ts +0 -0
  978. /package/dist/lib/{routes/client-api → features/metrics/instance}/metrics.test.d.ts +0 -0
  979. /package/dist/lib/{services/client-metrics → features/metrics/instance}/models.js +0 -0
  980. /package/dist/lib/{routes/client-api → features/metrics/instance}/register.test.d.ts +0 -0
  981. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/createLastSeenService.d.ts +0 -0
  982. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-read-model.d.ts +0 -0
  983. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-read-model.js +0 -0
  984. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-store.d.ts +0 -0
  985. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/fake-last-seen-store.js +0 -0
  986. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-read-model.d.ts +0 -0
  987. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-read-model.js +0 -0
  988. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-service.js +0 -0
  989. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/last-seen-store.d.ts +0 -0
  990. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.e2e.test.d.ts +0 -0
  991. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.e2e.test.js +0 -0
  992. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.test.d.ts +0 -0
  993. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/tests/last-seen-service.test.js +0 -0
  994. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-read-model-type.d.ts +0 -0
  995. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-read-model-type.js +0 -0
  996. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-store-type.d.ts +0 -0
  997. /package/dist/lib/{services/client-metrics → features/metrics}/last-seen/types/last-seen-store-type.js +0 -0
  998. /package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.js +0 -0
  999. /package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.test.d.ts +0 -0
  1000. /package/dist/lib/{services/client-metrics → features/metrics/shared}/schema.test.js +0 -0
@@ -1,7 +1,7 @@
1
- import{c as le,j as t,aE as H,aW as z,b7 as _,C as A,J as D,T as E,ct as ce,s as q,gy as ue,bc as de,bv as X,ay as Z,ax as I,gz as he,gA as ge,gB as pe,gC as me,cd as fe,bH as N,gD as xe,h as ve,gE as be,cF as ye,bs as je,r as x,az as M,e as O,bw as Se,aj as Te,bu as Ce,aA as Ae,aX as Ee,bm as we,ce as ke,g as P,B as Re,ah as De,eS as qe,gF as Fe,aV as ee,aF as Pe,aJ as W,c6 as U,gG as $e,gH as Oe,gI as Be,fA as Ve,ba as _e,bb as Le,A as te,k as se,c9 as Ne,l as He,n as ze,Q as Me,gJ as Ue,m as Ge,b as We,u as Je,bZ as Ye,aQ as Ke,aO as ne,aP as ae,b6 as Qe,aK as V,bV as re,a_ as oe}from"./index-JVRlSBvr.js";const kt=le(t.jsx("path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"}),"WatchLater"),Xe=({isOpen:e,onConfirm:a,onClose:n,showBanner:s,environment:r,messageComponent:o})=>{const i=H("projectId"),{data:d}=z(i),{changeRequestInReviewOrApproved:h,alert:p}=ce(d),g=h(r||""),m=g?"Add to existing change request":"Add suggestion to draft";return t.jsxs(_,{open:e,primaryButtonText:m,secondaryButtonText:"Cancel",onClick:a,onClose:n,title:"Request changes",fullWidth:!0,children:[t.jsx(A,{condition:g,show:p}),t.jsx(A,{condition:!!s,show:t.jsxs(D,{severity:"info",sx:{mb:2},children:["Change requests feature is enabled for ",r,". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})}),t.jsx(E,{variant:"body2",color:"text.secondary",children:"Your suggestion:"}),o]})},Ze=q("form")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),J=q("hr")(({theme:e})=>({width:"100%",height:"1px",margin:e.spacing(2,0),border:"none",background:e.palette.background.elevation2})),Ie=q("div")(({theme:e})=>({display:"flex",justifyContent:"end",gap:e.spacing(2),paddingBottom:e.spacing(10)})),et=({projectId:e,environmentId:a,permission:n,onSubmit:s,onCancel:r,loading:o,strategy:i,setStrategy:d,segments:h,setSegments:p,errors:g})=>{const m=ue(i.constraints),l=de(n,e,a),{strategyDefinition:u}=X(i==null?void 0:i.name),v=Z(),{uiConfig:b,error:S,loading:C}=I();if(S)throw S;if(C||!u)return null;const w=y=>u.parameters.find(T=>T.name===y),c=(y,T)=>{const F=w(y);if(y!=="groupId"){const j=be(F,T);return j?(g.setFormError(y,j),!1):(g.removeFormError(y),!0)}return!0},R=()=>u.parameters.map(y=>y.name).map(y=>{var T;return c(y,(T=i.parameters)==null?void 0:T[y])}).every(Boolean),$=()=>{v(`/projects/${e}/settings/default-strategy`)},B=async y=>{if(y.preventDefault(),R())s();else return};return t.jsxs(Ze,{onSubmit:B,children:[t.jsx(he,{title:i.title||"",setTitle:y=>{d(T=>({...T,title:y}))}}),t.jsx(ge,{segments:h,setSegments:p,projectId:e}),t.jsx(pe,{projectId:e,environmentId:a,strategy:i,setStrategy:d}),t.jsx(J,{}),t.jsx(me,{strategy:i,strategyDefinition:u,setStrategy:d,validateParameter:c,errors:g,hasAccess:l}),t.jsx(A,{condition:i.parameters!=null&&"stickiness"in i.parameters,show:t.jsx(fe,{strategy:i,setStrategy:d,environment:a,projectId:e})}),t.jsx(J,{}),t.jsxs(Ie,{children:[t.jsx(N,{permission:n,projectId:e,environmentId:a,variant:"contained",color:"primary",type:"submit",disabled:o||!m||g.hasFormErrors(),"data-testid":xe,children:"Save strategy"}),t.jsx(ve,{type:"button",color:"primary",onClick:r||$,disabled:o,children:"Cancel"})]})]})},tt=(e,a)=>{var i;const{project:n,refetch:s}=ye(e),r={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:n.defaultStickiness||"default",groupId:""}},o=(i=n.environments.find(d=>d.environment===a))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:r,strategy:o,refetch:s}},Rt=()=>{const e=H("projectId"),a=je("environmentId"),{defaultStrategyFallback:n,strategy:s,refetch:r}=tt(e,a),[o,i]=x.useState(s||n),[d,h]=x.useState([]),{updateDefaultStrategy:p,loading:g}=M(),{strategyDefinition:m}=X(o==null?void 0:o.name),{setToastData:l,setToastApiError:u}=O(),v=Se(),{uiConfig:b}=I(),{unleashUrl:S}=b,C=Z(),{trackEvent:w}=Te(),{segments:c,refetchSegments:R}=Ce();x.useEffect(()=>{if(c&&(s!=null&&s.segments)){const T=[];for(const F of s==null?void 0:s.segments)T.push(...c.filter(j=>j.id===F));h(T)}},[JSON.stringify(c),JSON.stringify(s==null?void 0:s.segments)]);const $=st(o,d),B=async T=>{await p(e,a,T),w("default_strategy",{props:{action:"edit",hasTitle:!!T.title}}),await R(),l({title:"Default Strategy updated",type:"success",confetti:!0})},y=async()=>{const T=`/projects/${e}/settings/default-strategy`;try{await B($),await r(),C(T)}catch(F){u(P(F))}};return!m||!o?null:t.jsx(Ae,{modal:!0,title:Ee((o==null?void 0:o.name)??""),description:at,documentationLink:rt,documentationLinkLabel:ot,formatApiCode:()=>nt(e,a,$,m,S),children:t.jsx(et,{projectId:e,strategy:o,setStrategy:i,segments:d,setSegments:h,environmentId:a,onSubmit:y,loading:g,permission:we,errors:v,isChangeRequest:!1})})},st=(e,a)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:a.map(n=>n.id),disabled:e.disabled??!1}),nt=(e,a,n,s,r)=>{if(!r)return"";const o={...n,parameters:ke(n.parameters??{},s)},i=`${r}/api/admin/projects/${e}/environments/${a}/default-strategy}`,d=JSON.stringify(o,void 0,2);return`curl --location --request PUT '${i}' \\
1
+ import{c as le,j as t,aE as H,aW as z,b7 as _,C as E,J as D,T as A,cu as ce,s as q,gD as ue,bc as de,bw as X,ay as Z,ax as I,gE as he,gF as ge,gG as pe,gH as me,gI as fe,bI as N,gJ as xe,h as ve,gK as be,cL as ye,bt as je,r as x,az as M,b as O,bx as Se,aj as Te,bv as Ce,aA as Ee,aX as Ae,bm as we,ce as ke,f as F,B as Re,ah as De,eR as qe,gL as Pe,aV as ee,aF as Fe,aJ as W,c6 as U,gM as $e,gN as Oe,gO as Be,fq as Ve,ba as _e,bb as Le,A as te,k as se,c9 as Ne,l as He,n as ze,Q as Me,gP as Ue,m as Ge,a as We,u as Je,bZ as Ye,aQ as Ke,aO as ne,aP as ae,bp as Qe,aK as V,bV as re,a_ as oe}from"./index-p2PlVFLf.js";const kt=le(t.jsx("path",{d:"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10 10-4.5 10-10S17.5 2 12 2zm4.2 14.2L11 13V7h1.5v5.2l4.5 2.7-.8 1.3z"}),"WatchLater"),Xe=({isOpen:e,onConfirm:a,onClose:n,showBanner:s,environment:r,messageComponent:o})=>{const i=H("projectId"),{data:d}=z(i),{changeRequestInReviewOrApproved:h,alert:p}=ce(d),g=h(r||""),m=g?"Add to existing change request":"Add suggestion to draft";return t.jsxs(_,{open:e,primaryButtonText:m,secondaryButtonText:"Cancel",onClick:a,onClose:n,title:"Request changes",fullWidth:!0,children:[t.jsx(E,{condition:g,show:p}),t.jsx(E,{condition:!!s,show:t.jsxs(D,{severity:"info",sx:{mb:2},children:["Change requests feature is enabled for ",r,". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})}),t.jsx(A,{variant:"body2",color:"text.secondary",children:"Your suggestion:"}),o]})},Ze=q("form")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),J=q("hr")(({theme:e})=>({width:"100%",height:"1px",margin:e.spacing(2,0),border:"none",background:e.palette.background.elevation2})),Ie=q("div")(({theme:e})=>({display:"flex",justifyContent:"end",gap:e.spacing(2),paddingBottom:e.spacing(10)})),et=({projectId:e,environmentId:a,permission:n,onSubmit:s,onCancel:r,loading:o,strategy:i,setStrategy:d,segments:h,setSegments:p,errors:g})=>{const m=ue(i.constraints),l=de(n,e,a),{strategyDefinition:u}=X(i==null?void 0:i.name),v=Z(),{uiConfig:b,error:S,loading:C}=I();if(S)throw S;if(C||!u)return null;const w=y=>u.parameters.find(T=>T.name===y),c=(y,T)=>{const P=w(y);if(y!=="groupId"){const j=be(P,T);return j?(g.setFormError(y,j),!1):(g.removeFormError(y),!0)}return!0},R=()=>u.parameters.map(y=>y.name).map(y=>{var T;return c(y,(T=i.parameters)==null?void 0:T[y])}).every(Boolean),$=()=>{v(`/projects/${e}/settings/default-strategy`)},B=async y=>{if(y.preventDefault(),R())s();else return};return t.jsxs(Ze,{onSubmit:B,children:[t.jsx(he,{title:i.title||"",setTitle:y=>{d(T=>({...T,title:y}))}}),t.jsx(ge,{segments:h,setSegments:p,projectId:e}),t.jsx(pe,{projectId:e,environmentId:a,strategy:i,setStrategy:d}),t.jsx(J,{}),t.jsx(me,{strategy:i,strategyDefinition:u,setStrategy:d,validateParameter:c,errors:g,hasAccess:l}),t.jsx(E,{condition:i.parameters!=null&&"stickiness"in i.parameters,show:t.jsx(fe,{strategy:i,setStrategy:d,environment:a,projectId:e})}),t.jsx(J,{}),t.jsxs(Ie,{children:[t.jsx(N,{permission:n,projectId:e,environmentId:a,variant:"contained",color:"primary",type:"submit",disabled:o||!m||g.hasFormErrors(),"data-testid":xe,children:"Save strategy"}),t.jsx(ve,{type:"button",color:"primary",onClick:r||$,disabled:o,children:"Cancel"})]})]})},tt=(e,a)=>{var i;const{project:n,refetch:s}=ye(e),r={name:"flexibleRollout",constraints:[],parameters:{rollout:"100",stickiness:n.defaultStickiness||"default",groupId:""}},o=(i=n.environments.find(d=>d.environment===a))==null?void 0:i.defaultStrategy;return{defaultStrategyFallback:r,strategy:o,refetch:s}},Rt=()=>{const e=H("projectId"),a=je("environmentId"),{defaultStrategyFallback:n,strategy:s,refetch:r}=tt(e,a),[o,i]=x.useState(s||n),[d,h]=x.useState([]),{updateDefaultStrategy:p,loading:g}=M(),{strategyDefinition:m}=X(o==null?void 0:o.name),{setToastData:l,setToastApiError:u}=O(),v=Se(),{uiConfig:b}=I(),{unleashUrl:S}=b,C=Z(),{trackEvent:w}=Te(),{segments:c,refetchSegments:R}=Ce();x.useEffect(()=>{if(c&&(s!=null&&s.segments)){const T=[];for(const P of s==null?void 0:s.segments)T.push(...c.filter(j=>j.id===P));h(T)}},[JSON.stringify(c),JSON.stringify(s==null?void 0:s.segments)]);const $=st(o,d),B=async T=>{await p(e,a,T),w("default_strategy",{props:{action:"edit",hasTitle:!!T.title}}),await R(),l({title:"Default Strategy updated",type:"success",confetti:!0})},y=async()=>{const T=`/projects/${e}/settings/default-strategy`;try{await B($),await r(),C(T)}catch(P){u(F(P))}};return!m||!o?null:t.jsx(Ee,{modal:!0,title:Ae((o==null?void 0:o.name)??""),description:at,documentationLink:rt,documentationLinkLabel:ot,formatApiCode:()=>nt(e,a,$,m,S),children:t.jsx(et,{projectId:e,strategy:o,setStrategy:i,segments:d,setSegments:h,environmentId:a,onSubmit:y,loading:g,permission:we,errors:v,isChangeRequest:!1})})},st=(e,a)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:a.map(n=>n.id),disabled:e.disabled??!1}),nt=(e,a,n,s,r)=>{if(!r)return"";const o={...n,parameters:ke(n.parameters??{},s)},i=`${r}/api/admin/projects/${e}/environments/${a}/default-strategy}`,d=JSON.stringify(o,void 0,2);return`curl --location --request PUT '${i}' \\
2
2
  --header 'Authorization: INSERT_API_KEY' \\
3
3
  --header 'Content-Type: application/json' \\
4
4
  --data-raw '${d}'`},at=`
5
5
  An activation strategy will only run when a feature toggle is enabled and provides a way to control who will get access to the feature.
6
6
  If any of a feature toggle's activation strategies returns true, the user will get access.
7
- `,rt="https://docs.getunleash.io/reference/activation-strategies",ot="Default strategy documentation",it=e=>{const[a,n]=x.useState(e),s=x.useCallback(()=>n(e),[e]);return x.useEffect(()=>{n(e)},[e]),[a,n,s]},lt=q(Re)(()=>({mx:"auto",...De})),Dt=({projectId:e,featureId:a,environmentName:n,value:s,onToggle:r})=>{const[o,i,d]=it(s),h=()=>{i(!o),requestAnimationFrame(()=>{r(!o,d)})},p=`${a}-${n}`;return t.jsx(t.Fragment,{children:t.jsx(lt,{"data-testid":`TOGGLE-${p}`,children:t.jsx(qe,{tooltip:o?`Disable feature in ${n}`:`Enable feature in ${n}`,checked:s,environmentId:n,projectId:e,permission:Fe,inputProps:{"aria-label":n},onClick:h,"data-testid":"permission-switch",disableRipple:!0,disabled:s!==o})},p)})},ct=e=>{const{setToastData:a,setToastApiError:n}=O(),{addChange:s}=ee(),{refetch:r}=z(e),[o,i]=x.useState({isOpen:!1}),d=x.useCallback((g,m,l,u)=>{i({featureName:g,environment:m,enabled:l,shouldActivateDisabledStrategies:u,isOpen:!0})},[]),h=x.useCallback(()=>{i(g=>({...g,isOpen:!1}))},[]),p=x.useCallback(async()=>{try{await s(e,o.environment,{feature:o.featureName,action:"updateEnabled",payload:{enabled:!!o.enabled,shouldActivateDisabledStrategies:!!o.shouldActivateDisabledStrategies}}),r(),i(g=>({...g,isOpen:!1})),a({type:"success",title:"Changes added to the draft!"})}catch(g){n(P(g)),i(m=>({...m,isOpen:!1}))}},[s]);return{onChangeRequestToggle:d,onChangeRequestToggleClose:h,onChangeRequestToggleConfirm:p,changeRequestDialogDetails:o}},ut=({enabled:e,featureName:a,environment:n})=>t.jsxs(E,{"data-testid":"update-enabled-message",children:[t.jsx("strong",{children:e?"Enable":"Disable"})," feature toggle"," ",t.jsx("strong",{children:a})," in ",t.jsx("strong",{children:n})]}),dt=q("ul")(({theme:e})=>({margin:e.spacing(1),paddingLeft:e.spacing(2)})),ht=({isOpen:e,onAddDefaultStrategy:a,onActivateDisabledStrategies:n,onClose:s,environment:r,featureId:o})=>{var g,m,l;const i=H("projectId"),{feature:d}=Pe(i,o),h=(l=(m=(g=d.environments)==null?void 0:g.find(({name:u})=>u===r))==null?void 0:m.strategies)==null?void 0:l.filter(({disabled:u})=>u).length,p=h?h===1?"1 disabled strategy":`${h} disabled strategies`:"disabled strategies";return t.jsxs(_,{open:e,secondaryButtonText:"Cancel",permissionButton:t.jsxs(t.Fragment,{children:[t.jsx(N,{type:"button",variant:"outlined",permission:W,projectId:i,environmentId:r,onClick:a,children:"Add default strategy"}),t.jsx(N,{type:"button",variant:"outlined",permission:W,projectId:i,environmentId:r,onClick:n,children:"Enable all strategies"})]}),onClose:s,title:`Enable feature toggle in ${r}`,fullWidth:!0,children:[t.jsx(E,{sx:{mb:u=>u.spacing(3)},children:"A feature toggle cannot be enabled without an enabled strategy."}),t.jsx(E,{children:"To enable this feature toggle you can choose to:"}),t.jsxs(dt,{children:[t.jsx("li",{children:t.jsx(E,{children:t.jsx("strong",{children:"Add the default strategy"})})}),t.jsx("li",{children:t.jsxs(E,{children:[t.jsx("strong",{children:"Enable all the disabled strategies"})," ","(this feature toggle has ",p,")"]})})]})]})},gt=e=>{const a=n=>{n<e.length&&e[n](()=>a(n+1))};a(0)},qt=e=>{const{toggleFeatureEnvironmentOn:a,toggleFeatureEnvironmentOff:n}=U(),{setToastData:s,setToastApiError:r}=O(),[o,i]=x.useState({open:!1,label:"",loading:!1,onClose:()=>{},onClick:()=>{}}),[d,h]=x.useState({isOpen:!1,environment:"",featureId:"",onClose:()=>{},onActivateDisabledStrategies:()=>{},onAddDefaultStrategy:()=>{}}),{onChangeRequestToggle:p,onChangeRequestToggleClose:g,onChangeRequestToggleConfirm:m,changeRequestDialogDetails:l}=ct(e),[u,v]=x.useState(),b=x.useCallback(async(w,c)=>{let R=!1;return gt([j=>{if(c.isChangeRequestEnabled||!Oe(c.environmentType||""))return j();i({open:!0,label:`${w?"Enable":"Disable"} Environment`,loading:!1,onClose:()=>{var f;i(k=>({...k,open:!1})),(f=c.onRollback)==null||f.call(c)},onClick:()=>{i(f=>({...f,open:!1,loading:!0})),j()}})},j=>{if(w===!1||!c.hasStrategies||c.hasEnabledStrategies)return j();h({isOpen:!0,environment:c.environmentName,featureId:c.featureId,onClose:()=>{var f;h(k=>({...k,isOpen:!1})),(f=c.onRollback)==null||f.call(c)},onActivateDisabledStrategies:()=>{h(f=>({...f,isOpen:!1})),R=!0,j()},onAddDefaultStrategy:()=>{h(f=>({...f,isOpen:!1})),j()}})},j=>{if(!c.isChangeRequestEnabled)return j();v(()=>{var f;v(void 0),(f=c.onRollback)==null||f.call(c)}),p(c.featureId,c.environmentName,w,R)},async j=>{var f,k;if(w!==!1)return j();try{await n(c.projectId,c.featureId,c.environmentName),s({type:"success",title:`Disabled in ${c.environmentName}`,text:`${c.featureId} is unavailable in ${c.environmentName} and its strategies will no longer have any effect.`}),(f=c.onSuccess)==null||f.call(c)}catch(L){r(P(L)),(k=c.onRollback)==null||k.call(c)}},async j=>{var f,k;if(w!==!0)return j();try{await a(c.projectId,c.featureId,c.environmentName,R),s({type:"success",title:`Enabled in ${c.environmentName}`,text:`${c.featureId} is now available in ${c.environmentName} based on its defined strategies.`}),(f=c.onSuccess)==null||f.call(c)}catch(L){r(P(L)),(k=c.onRollback)==null||k.call(c)}}])},[i]),S=d.featureId.length!==0,C=t.jsxs(t.Fragment,{children:[t.jsx($e,{...o}),t.jsx(A,{condition:S,show:t.jsx(ht,{...d})}),t.jsx(Xe,{isOpen:l.isOpen,onClose:()=>{u==null||u(),g()},environment:l==null?void 0:l.environment,onConfirm:()=>{u==null||u(),m()},messageComponent:t.jsx(ut,{enabled:l==null?void 0:l.enabled,featureName:l==null?void 0:l.featureName,environment:l.environment})})]});return{onToggle:b,modals:C}},pt=q(Be)(({theme:e})=>({color:e.palette.warning.main,fontSize:e.fontSizes.bodySize})),Ft=()=>t.jsx(Ve,{arrow:!0,title:t.jsxs(t.Fragment,{children:["This environment has no variants enabled. If you check this feature's variants in this environment, you will get the"," ",t.jsx("a",{href:"https://docs.getunleash.io/reference/feature-toggle-variants#the-disabled-variant",target:"_blank",rel:"noreferrer",children:"disabled variant"}),"."]}),children:t.jsx(pt,{})});var G={},mt=Le;Object.defineProperty(G,"__esModule",{value:!0});var ie=G.default=void 0,ft=mt(_e()),xt=t,vt=(0,ft.default)((0,xt.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"}),"IndeterminateCheckBox");ie=G.default=vt;const bt=Ue(),Pt=({options:e,selectedOptions:a,indeterminateOptions:n,tagType:s,existingTags:r,disabled:o=!1,onChange:i})=>{const d=t.jsx(Ge,{fontSize:"small"}),h=l=>l.inputValue?l.inputValue:l.title,p=(l,u,{selected:v})=>{const b=(n==null?void 0:n.some(S=>S.title===u.title))??!1;return t.jsxs("li",{...l,children:[t.jsx(A,{condition:!!u.inputValue,show:t.jsx(Ne,{sx:{mr:S=>S.spacing(.5)}}),elseShow:t.jsx(He,{icon:d,checkedIcon:t.jsx(ze,{fontSize:"small"}),indeterminateIcon:t.jsx(ie,{fontSize:"small"}),sx:{mr:S=>S.spacing(.5)},checked:v&&!b,indeterminate:b})}),u.title]})},g=(l,u)=>l.map((v,b)=>r.some(C=>C.value===v.title&&C.type===s.name)&&n===void 0?null:t.jsx(Me,{...u({index:b}),label:v.title})),m=(l,u)=>{const v=bt(l,u),{inputValue:b}=u,S=l.some(C=>b===C.title);return b!==""&&!S&&v.push({inputValue:b,title:`Create new value "${b}"`}),v};return t.jsx(te,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:l=>l.spacing(2),width:500},disableCloseOnSelect:!0,placeholder:"Select Values",options:e,value:a,renderTags:g,isOptionEqualToValue:(l,u)=>u.inputValue&&u.inputValue!==""?l.title===u.inputValue:l.title===u.title,getOptionLabel:h,renderOption:p,filterOptions:m,ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:i,renderInput:l=>t.jsx(se,{...l,label:"Select values",placeholder:"Select values"}),disabled:o})},yt=q("li")({flexDirection:"column"}),$t=({options:e,value:a,disabled:n=!1,onChange:s})=>{const r=We();return t.jsx(te,{disablePortal:!0,disabled:n,id:"tag-type-select",sx:{marginTop:o=>o.spacing(2),width:500},options:e,disableClearable:!0,value:a,getOptionLabel:o=>o.name,renderOption:(o,i)=>t.jsxs(yt,{...o,style:{alignItems:"flex-start",gap:r.spacing(.5)},children:[t.jsx(E,{variant:"body1",children:i.name}),t.jsx(E,{variant:"caption",children:i.description})]}),renderInput:o=>t.jsx(se,{...o,label:"Tag type",value:a}),onChange:s,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Ot=()=>{const{makeRequest:e,createRequest:a,errors:n,loading:s}=Je({propagateErrors:!0});return{createTag:async i=>{const h=a("api/admin/tags",{method:"POST",body:JSON.stringify(i)});return e(h.caller,h.id)},bulkUpdateTags:async(i,d)=>{const h=`api/admin/projects/${d}/tags`,p=a(h,{method:"PUT",body:JSON.stringify(i)});return e(p.caller,p.id)},errors:n,loading:s}},Bt=(e,a={})=>{const n=async()=>{const p=ne(`api/admin/tags/${e}`);return(await fetch(p,{method:"GET"}).then(ae("Tags"))).json()},s=`api/admin/tags/${e}`,{data:r,error:o}=Ye(!!e,{tags:[]},s,n,a),[i,d]=x.useState(!o&&!r),h=()=>{Ke(s)};return x.useEffect(()=>{d(!o&&!r)},[r,o]),{tags:(r==null?void 0:r.tags)||[],error:o,loading:i,refetch:h}},Vt=({isStale:e,isOpen:a,projectId:n,featureId:s,onClose:r})=>{const{setToastData:o,setToastApiError:i}=O(),{patchFeatureToggle:d}=U(),h=t.jsx(E,{children:"Setting a toggle to stale marks it for cleanup"}),p=t.jsx(E,{children:"Setting a toggle to active marks it as in active use"}),g=e?"active":"stale",m=async l=>{l.stopPropagation();try{await d(n,s,[{op:"replace",path:"/stale",value:!e}]),r()}catch(u){i(P(u))}o(e?{type:"success",title:"And we're back!",text:"The toggle is no longer marked as stale."}:{type:"success",title:"A job well done.",text:"The toggle has been marked as stale."})};return t.jsx(_,{open:a,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${g}`,title:`Set feature state to ${g}`,onClick:m,onClose:r,children:t.jsx(A,{condition:e,show:p,elseShow:h})})},jt=e=>fetch(e).then(ae("ChangeRequest")).then(a=>a.json()),St=(e,a)=>{const n=a.map(i=>`feature=${i}`).join("&"),{data:s,error:r,mutate:o}=Qe([],ne(`api/admin/projects/${e}/change-requests/scheduled?${n}`),jt);return{changeRequests:s,loading:!r&&!s,refetch:o,error:r}},Y=()=>t.jsx(D,{severity:"warning",sx:{m:e=>e.spacing(2,0)},children:"Archiving features with dependencies will also remove those dependencies."}),Tt=({ids:e,projectId:a})=>{const n=s=>`/projects/${a}/features/${s}`;return e?t.jsxs(D,{severity:"warning",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(E,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t.jsx("span",{children:"have usage from applications. If you archive these feature toggles they will not be available to Client SDKs:"}),t.jsx("ul",{children:e==null?void 0:e.map(s=>t.jsx("li",{children:t.jsx(V,{to:n(s),children:s})},s))})]}):null},K=({ids:e,projectId:a})=>{const n=s=>`/projects/${a}/features/${s}`;return e&&e.length>1?t.jsxs(D,{severity:"error",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(E,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t.jsx("span",{children:"have child features that depend on them and are not part of the archive operation. These parent features can not be archived:"}),t.jsx("ul",{children:e==null?void 0:e.map(s=>t.jsx("li",{children:t.jsx(V,{to:n(s),children:s})},s))})]}):e&&e.length===1?t.jsxs(D,{severity:"error",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(V,{to:n(e[0]),children:e[0]})," has child features that depend on it and are not part of the archive operation."]}):null},Q=({changeRequests:e,projectId:a})=>e&&e.length>0?t.jsxs(D,{severity:"warning",sx:{m:n=>n.spacing(2,0)},children:[t.jsxs("p",{children:["This archive operation would conflict with"," ",e.length," scheduled change request(s). The change request(s) that would be affected by this are:"]}),t.jsx("ul",{children:e.map(({id:n,title:s})=>{const r=s?`#${n} (${s})`:`Change request #${n}`;return t.jsx("li",{children:t.jsx(V,{to:`/projects/${a}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:r})},n)})})]}):e===void 0?t.jsx(D,{severity:"warning",children:t.jsx("p",{children:"This archive operation might conflict with one or more scheduled change requests. If you complete it, those change requests can no longer be applied."})}):null,Ct=(e,a)=>{const s=re(e)(),{isChangeRequestConfigured:r}=oe(e);return s&&r(s)&&a?"Add to change request":s&&r(s)?"Add change to draft":a?"Archive toggles":"Archive toggle"},At=({projectId:e,featureIds:a,onSuccess:n,onError:s})=>{const{setToastData:r,setToastApiError:o}=O(),{archiveFeatureToggle:i}=U(),{archiveFeatures:d}=M(),{isChangeRequestConfigured:h}=oe(e),{addChange:p}=ee(),{refetch:g}=z(e),m=re(e),l=(a==null?void 0:a.length)>1,u=m(),v=async()=>{if(!u){console.error("No change request environment");return}await p(e,u,a.map(C=>({action:"archiveFeature",feature:C,payload:void 0}))),g(),r({text:l?"Your archive feature toggles changes have been added to change request":"Your archive feature toggle change has been added to change request",type:"success",title:l?"Changes added to a draft":"Change added to a draft"})},b=async()=>{await i(e,a[0]),r({text:"Your feature toggle has been archived",type:"success",title:"Feature archived"})},S=async()=>{await d(e,a),r({text:"Selected feature toggles have been archived",type:"success",title:"Features archived"})};return async()=>{try{u&&h(u)?await v():l?await S():await b(),n()}catch(C){o(P(C)),s()}}},Et=(e,a,n)=>{const[s,r]=x.useState(!0),[o,i]=x.useState([]),[d,h]=x.useState(!1),{verifyArchiveFeatures:p}=M();return x.useEffect(()=>{n&&p(a,e).then(g=>g.json()).then(({hasDeletedDependencies:g,parentsWithChildFeatures:m})=>{m.length===0?(r(!1),i(m)):(r(!0),i(m)),h(g)})},[JSON.stringify(e),n,a,i,r,h]),{disableArchive:s,offendingParents:o,hasDeletedDependencies:d}},_t=({isOpen:e,onClose:a,onConfirm:n,projectId:s,featureIds:r,featuresWithUsage:o})=>{const i=(r==null?void 0:r.length)>1,d=Ct(s,i),h=i?"Archive feature toggles":"Archive feature toggle",p=At({projectId:s,featureIds:r,onSuccess(){n(),a()},onError(){a()}}),{changeRequests:g}=St(s,r),{disableArchive:m,offendingParents:l,hasDeletedDependencies:u}=Et(r,s,e),v=l.length===0&&u;return t.jsx(_,{onClick:p,open:e,onClose:a,primaryButtonText:d,secondaryButtonText:"Cancel",title:h,disabledPrimaryButton:m,children:t.jsx(A,{condition:i,show:t.jsxs(t.Fragment,{children:[t.jsxs("p",{children:["Are you sure you want to archive"," ",t.jsx("strong",{children:r==null?void 0:r.length})," feature toggles?"]}),t.jsx(A,{condition:!!(o&&(o==null?void 0:o.length)>0),show:t.jsx(Tt,{ids:o,projectId:s})}),t.jsx(A,{condition:l.length>0,show:t.jsx(K,{ids:l,projectId:s})}),t.jsx(A,{condition:v,show:t.jsx(Y,{})}),t.jsx(Q,{changeRequests:g,projectId:s}),t.jsx(A,{condition:(r==null?void 0:r.length)<=5,show:t.jsx("ul",{children:r==null?void 0:r.map(b=>t.jsx("li",{children:b},b))})})]}),elseShow:t.jsxs(t.Fragment,{children:[t.jsxs("p",{children:["Are you sure you want to archive"," ",i?"these feature toggles":"this feature toggle","?"]}),t.jsx(A,{condition:l.length>0,show:t.jsx(K,{ids:l,projectId:s})}),t.jsx(A,{condition:v,show:t.jsx(Y,{})}),t.jsx(Q,{changeRequests:g,projectId:s})]})})})};export{Xe as C,Rt as E,Dt as F,$t as T,Ft as V,kt as W,qt as a,Ot as b,Bt as c,Pt as d,_t as e,Vt as f,tt as u};
7
+ `,rt="https://docs.getunleash.io/reference/activation-strategies",ot="Default strategy documentation",it=e=>{const[a,n]=x.useState(e),s=x.useCallback(()=>n(e),[e]);return x.useEffect(()=>{n(e)},[e]),[a,n,s]},lt=q(Re)(()=>({mx:"auto",...De})),Dt=({projectId:e,featureId:a,environmentName:n,value:s,onToggle:r})=>{const[o,i,d]=it(s),h=()=>{i(!o),requestAnimationFrame(()=>{r(!o,d)})},p=`${a}-${n}`;return t.jsx(t.Fragment,{children:t.jsx(lt,{"data-testid":`TOGGLE-${p}`,children:t.jsx(qe,{tooltip:o?`Disable feature in ${n}`:`Enable feature in ${n}`,checked:s,environmentId:n,projectId:e,permission:Pe,inputProps:{"aria-label":n},onClick:h,"data-testid":"permission-switch",disableRipple:!0,disabled:s!==o})},p)})},ct=e=>{const{setToastData:a,setToastApiError:n}=O(),{addChange:s}=ee(),{refetch:r}=z(e),[o,i]=x.useState({isOpen:!1}),d=x.useCallback((g,m,l,u)=>{i({featureName:g,environment:m,enabled:l,shouldActivateDisabledStrategies:u,isOpen:!0})},[]),h=x.useCallback(()=>{i(g=>({...g,isOpen:!1}))},[]),p=x.useCallback(async()=>{try{await s(e,o.environment,{feature:o.featureName,action:"updateEnabled",payload:{enabled:!!o.enabled,shouldActivateDisabledStrategies:!!o.shouldActivateDisabledStrategies}}),r(),i(g=>({...g,isOpen:!1})),a({type:"success",title:"Changes added to the draft!"})}catch(g){n(F(g)),i(m=>({...m,isOpen:!1}))}},[s]);return{onChangeRequestToggle:d,onChangeRequestToggleClose:h,onChangeRequestToggleConfirm:p,changeRequestDialogDetails:o}},ut=({enabled:e,featureName:a,environment:n})=>t.jsxs(A,{"data-testid":"update-enabled-message",children:[t.jsx("strong",{children:e?"Enable":"Disable"})," feature toggle"," ",t.jsx("strong",{children:a})," in ",t.jsx("strong",{children:n})]}),dt=q("ul")(({theme:e})=>({margin:e.spacing(1),paddingLeft:e.spacing(2)})),ht=({isOpen:e,onAddDefaultStrategy:a,onActivateDisabledStrategies:n,onClose:s,environment:r,featureId:o})=>{var g,m,l;const i=H("projectId"),{feature:d}=Fe(i,o),h=(l=(m=(g=d.environments)==null?void 0:g.find(({name:u})=>u===r))==null?void 0:m.strategies)==null?void 0:l.filter(({disabled:u})=>u).length,p=h?h===1?"1 disabled strategy":`${h} disabled strategies`:"disabled strategies";return t.jsxs(_,{open:e,secondaryButtonText:"Cancel",permissionButton:t.jsxs(t.Fragment,{children:[t.jsx(N,{type:"button",variant:"outlined",permission:W,projectId:i,environmentId:r,onClick:a,children:"Add default strategy"}),t.jsx(N,{type:"button",variant:"outlined",permission:W,projectId:i,environmentId:r,onClick:n,children:"Enable all strategies"})]}),onClose:s,title:`Enable feature toggle in ${r}`,fullWidth:!0,children:[t.jsx(A,{sx:{mb:u=>u.spacing(3)},children:"A feature toggle cannot be enabled without an enabled strategy."}),t.jsx(A,{children:"To enable this feature toggle you can choose to:"}),t.jsxs(dt,{children:[t.jsx("li",{children:t.jsx(A,{children:t.jsx("strong",{children:"Add the default strategy"})})}),t.jsx("li",{children:t.jsxs(A,{children:[t.jsx("strong",{children:"Enable all the disabled strategies"})," ","(this feature toggle has ",p,")"]})})]})]})},gt=e=>{const a=n=>{n<e.length&&e[n](()=>a(n+1))};a(0)},qt=e=>{const{toggleFeatureEnvironmentOn:a,toggleFeatureEnvironmentOff:n}=U(),{setToastData:s,setToastApiError:r}=O(),[o,i]=x.useState({open:!1,label:"",loading:!1,onClose:()=>{},onClick:()=>{}}),[d,h]=x.useState({isOpen:!1,environment:"",featureId:"",onClose:()=>{},onActivateDisabledStrategies:()=>{},onAddDefaultStrategy:()=>{}}),{onChangeRequestToggle:p,onChangeRequestToggleClose:g,onChangeRequestToggleConfirm:m,changeRequestDialogDetails:l}=ct(e),[u,v]=x.useState(),b=x.useCallback(async(w,c)=>{let R=!1;return gt([j=>{if(c.isChangeRequestEnabled||!Oe(c.environmentType||""))return j();i({open:!0,label:`${w?"Enable":"Disable"} Environment`,loading:!1,onClose:()=>{var f;i(k=>({...k,open:!1})),(f=c.onRollback)==null||f.call(c)},onClick:()=>{i(f=>({...f,open:!1,loading:!0})),j()}})},j=>{if(w===!1||!c.hasStrategies||c.hasEnabledStrategies)return j();h({isOpen:!0,environment:c.environmentName,featureId:c.featureId,onClose:()=>{var f;h(k=>({...k,isOpen:!1})),(f=c.onRollback)==null||f.call(c)},onActivateDisabledStrategies:()=>{h(f=>({...f,isOpen:!1})),R=!0,j()},onAddDefaultStrategy:()=>{h(f=>({...f,isOpen:!1})),j()}})},j=>{if(!c.isChangeRequestEnabled)return j();v(()=>{var f;v(void 0),(f=c.onRollback)==null||f.call(c)}),p(c.featureId,c.environmentName,w,R)},async j=>{var f,k;if(w!==!1)return j();try{await n(c.projectId,c.featureId,c.environmentName),s({type:"success",title:`Disabled in ${c.environmentName}`,text:`${c.featureId} is unavailable in ${c.environmentName} and its strategies will no longer have any effect.`}),(f=c.onSuccess)==null||f.call(c)}catch(L){r(F(L)),(k=c.onRollback)==null||k.call(c)}},async j=>{var f,k;if(w!==!0)return j();try{await a(c.projectId,c.featureId,c.environmentName,R),s({type:"success",title:`Enabled in ${c.environmentName}`,text:`${c.featureId} is now available in ${c.environmentName} based on its defined strategies.`}),(f=c.onSuccess)==null||f.call(c)}catch(L){r(F(L)),(k=c.onRollback)==null||k.call(c)}}])},[i]),S=d.featureId.length!==0,C=t.jsxs(t.Fragment,{children:[t.jsx($e,{...o}),t.jsx(E,{condition:S,show:t.jsx(ht,{...d})}),t.jsx(Xe,{isOpen:l.isOpen,onClose:()=>{u==null||u(),g()},environment:l==null?void 0:l.environment,onConfirm:()=>{u==null||u(),m()},messageComponent:t.jsx(ut,{enabled:l==null?void 0:l.enabled,featureName:l==null?void 0:l.featureName,environment:l.environment})})]});return{onToggle:b,modals:C}},pt=q(Be)(({theme:e})=>({color:e.palette.warning.main,fontSize:e.fontSizes.bodySize})),Pt=()=>t.jsx(Ve,{arrow:!0,title:t.jsxs(t.Fragment,{children:["This environment has no variants enabled. If you check this feature's variants in this environment, you will get the"," ",t.jsx("a",{href:"https://docs.getunleash.io/reference/feature-toggle-variants#the-disabled-variant",target:"_blank",rel:"noreferrer",children:"disabled variant"}),"."]}),children:t.jsx(pt,{})});var G={},mt=Le;Object.defineProperty(G,"__esModule",{value:!0});var ie=G.default=void 0,ft=mt(_e()),xt=t,vt=(0,ft.default)((0,xt.jsx)("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-2 10H7v-2h10v2z"}),"IndeterminateCheckBox");ie=G.default=vt;const bt=Ue(),Ft=({options:e,selectedOptions:a,indeterminateOptions:n,tagType:s,existingTags:r,disabled:o=!1,onChange:i})=>{const d=t.jsx(Ge,{fontSize:"small"}),h=l=>l.inputValue?l.inputValue:l.title,p=(l,u,{selected:v})=>{const b=(n==null?void 0:n.some(S=>S.title===u.title))??!1;return t.jsxs("li",{...l,children:[t.jsx(E,{condition:!!u.inputValue,show:t.jsx(Ne,{sx:{mr:S=>S.spacing(.5)}}),elseShow:t.jsx(He,{icon:d,checkedIcon:t.jsx(ze,{fontSize:"small"}),indeterminateIcon:t.jsx(ie,{fontSize:"small"}),sx:{mr:S=>S.spacing(.5)},checked:v&&!b,indeterminate:b})}),u.title]})},g=(l,u)=>l.map((v,b)=>r.some(C=>C.value===v.title&&C.type===s.name)&&n===void 0?null:t.jsx(Me,{...u({index:b}),label:v.title})),m=(l,u)=>{const v=bt(l,u),{inputValue:b}=u,S=l.some(C=>b===C.title);return b!==""&&!S&&v.push({inputValue:b,title:`Create new value "${b}"`}),v};return t.jsx(te,{multiple:!0,id:"checkboxes-tag",sx:{marginTop:l=>l.spacing(2),width:500},disableCloseOnSelect:!0,placeholder:"Select Values",options:e,value:a,renderTags:g,isOptionEqualToValue:(l,u)=>u.inputValue&&u.inputValue!==""?l.title===u.inputValue:l.title===u.title,getOptionLabel:h,renderOption:p,filterOptions:m,ListboxProps:{style:{maxHeight:200,overflow:"auto"}},onChange:i,renderInput:l=>t.jsx(se,{...l,label:"Select values",placeholder:"Select values"}),disabled:o})},yt=q("li")({flexDirection:"column"}),$t=({options:e,value:a,disabled:n=!1,onChange:s})=>{const r=We();return t.jsx(te,{disablePortal:!0,disabled:n,id:"tag-type-select",sx:{marginTop:o=>o.spacing(2),width:500},options:e,disableClearable:!0,value:a,getOptionLabel:o=>o.name,renderOption:(o,i)=>t.jsxs(yt,{...o,style:{alignItems:"flex-start",gap:r.spacing(.5)},children:[t.jsx(A,{variant:"body1",children:i.name}),t.jsx(A,{variant:"caption",children:i.description})]}),renderInput:o=>t.jsx(se,{...o,label:"Tag type",value:a}),onChange:s,ListboxProps:{style:{maxHeight:200,overflow:"auto"}}})},Ot=()=>{const{makeRequest:e,createRequest:a,errors:n,loading:s}=Je({propagateErrors:!0});return{createTag:async i=>{const h=a("api/admin/tags",{method:"POST",body:JSON.stringify(i)});return e(h.caller,h.id)},bulkUpdateTags:async(i,d)=>{const h=`api/admin/projects/${d}/tags`,p=a(h,{method:"PUT",body:JSON.stringify(i)});return e(p.caller,p.id)},errors:n,loading:s}},Bt=(e,a={})=>{const n=async()=>{const p=ne(`api/admin/tags/${e}`);return(await fetch(p,{method:"GET"}).then(ae("Tags"))).json()},s=`api/admin/tags/${e}`,{data:r,error:o}=Ye(!!e,{tags:[]},s,n,a),[i,d]=x.useState(!o&&!r),h=()=>{Ke(s)};return x.useEffect(()=>{d(!o&&!r)},[r,o]),{tags:(r==null?void 0:r.tags)||[],error:o,loading:i,refetch:h}},Vt=({isStale:e,isOpen:a,projectId:n,featureId:s,onClose:r})=>{const{setToastData:o,setToastApiError:i}=O(),{patchFeatureToggle:d}=U(),h=t.jsx(A,{children:"Setting a toggle to stale marks it for cleanup"}),p=t.jsx(A,{children:"Setting a toggle to active marks it as in active use"}),g=e?"active":"stale",m=async l=>{l.stopPropagation();try{await d(n,s,[{op:"replace",path:"/stale",value:!e}]),r()}catch(u){i(F(u))}o(e?{type:"success",title:"And we're back!",text:"The toggle is no longer marked as stale."}:{type:"success",title:"A job well done.",text:"The toggle has been marked as stale."})};return t.jsx(_,{open:a,secondaryButtonText:"Cancel",primaryButtonText:`Flip to ${g}`,title:`Set feature state to ${g}`,onClick:m,onClose:r,children:t.jsx(E,{condition:e,show:p,elseShow:h})})},jt=e=>fetch(e).then(ae("ChangeRequest")).then(a=>a.json()),St=(e,a)=>{const n=a.map(i=>`feature=${i}`).join("&"),{data:s,error:r,mutate:o}=Qe([],ne(`api/admin/projects/${e}/change-requests/scheduled?${n}`),jt);return{changeRequests:s,loading:!r&&!s,refetch:o,error:r}},Y=()=>t.jsx(D,{severity:"warning",sx:{m:e=>e.spacing(2,0)},children:"Archiving features with dependencies will also remove those dependencies."}),Tt=({ids:e,projectId:a})=>{const n=s=>`/projects/${a}/features/${s}`;return e?t.jsxs(D,{severity:"warning",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(A,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t.jsx("span",{children:"have usage from applications. If you archive these feature toggles they will not be available to Client SDKs:"}),t.jsx("ul",{children:e==null?void 0:e.map(s=>t.jsx("li",{children:t.jsx(V,{to:n(s),children:s})},s))})]}):null},K=({ids:e,projectId:a})=>{const n=s=>`/projects/${a}/features/${s}`;return e&&e.length>1?t.jsxs(D,{severity:"error",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(A,{fontWeight:"bold",variant:"body2",display:"inline",children:`${e.length} feature toggles `}),t.jsx("span",{children:"have child features that depend on them and are not part of the archive operation. These parent features can not be archived:"}),t.jsx("ul",{children:e==null?void 0:e.map(s=>t.jsx("li",{children:t.jsx(V,{to:n(s),children:s})},s))})]}):e&&e.length===1?t.jsxs(D,{severity:"error",sx:{m:s=>s.spacing(2,0)},children:[t.jsx(V,{to:n(e[0]),children:e[0]})," has child features that depend on it and are not part of the archive operation."]}):null},Q=({changeRequests:e,projectId:a})=>e&&e.length>0?t.jsxs(D,{severity:"warning",sx:{m:n=>n.spacing(2,0)},children:[t.jsxs("p",{children:["This archive operation would conflict with"," ",e.length," scheduled change request(s). The change request(s) that would be affected by this are:"]}),t.jsx("ul",{children:e.map(({id:n,title:s})=>{const r=s?`#${n} (${s})`:`Change request #${n}`;return t.jsx("li",{children:t.jsx(V,{to:`/projects/${a}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:r})},n)})})]}):e===void 0?t.jsx(D,{severity:"warning",children:t.jsx("p",{children:"This archive operation might conflict with one or more scheduled change requests. If you complete it, those change requests can no longer be applied."})}):null,Ct=(e,a)=>{const s=re(e)(),{isChangeRequestConfigured:r}=oe(e);return s&&r(s)&&a?"Add to change request":s&&r(s)?"Add change to draft":a?"Archive toggles":"Archive toggle"},Et=({projectId:e,featureIds:a,onSuccess:n,onError:s})=>{const{setToastData:r,setToastApiError:o}=O(),{archiveFeatureToggle:i}=U(),{archiveFeatures:d}=M(),{isChangeRequestConfigured:h}=oe(e),{addChange:p}=ee(),{refetch:g}=z(e),m=re(e),l=(a==null?void 0:a.length)>1,u=m(),v=async()=>{if(!u){console.error("No change request environment");return}await p(e,u,a.map(C=>({action:"archiveFeature",feature:C,payload:void 0}))),g(),r({text:l?"Your archive feature toggles changes have been added to change request":"Your archive feature toggle change has been added to change request",type:"success",title:l?"Changes added to a draft":"Change added to a draft"})},b=async()=>{await i(e,a[0]),r({text:"Your feature toggle has been archived",type:"success",title:"Feature archived"})},S=async()=>{await d(e,a),r({text:"Selected feature toggles have been archived",type:"success",title:"Features archived"})};return async()=>{try{u&&h(u)?await v():l?await S():await b(),n()}catch(C){o(F(C)),s()}}},At=(e,a,n)=>{const[s,r]=x.useState(!0),[o,i]=x.useState([]),[d,h]=x.useState(!1),{verifyArchiveFeatures:p}=M();return x.useEffect(()=>{n&&p(a,e).then(g=>g.json()).then(({hasDeletedDependencies:g,parentsWithChildFeatures:m})=>{m.length===0?(r(!1),i(m)):(r(!0),i(m)),h(g)})},[JSON.stringify(e),n,a,i,r,h]),{disableArchive:s,offendingParents:o,hasDeletedDependencies:d}},_t=({isOpen:e,onClose:a,onConfirm:n,projectId:s,featureIds:r,featuresWithUsage:o})=>{const i=(r==null?void 0:r.length)>1,d=Ct(s,i),h=i?"Archive feature toggles":"Archive feature toggle",p=Et({projectId:s,featureIds:r,onSuccess(){n(),a()},onError(){a()}}),{changeRequests:g}=St(s,r),{disableArchive:m,offendingParents:l,hasDeletedDependencies:u}=At(r,s,e),v=l.length===0&&u;return t.jsx(_,{onClick:p,open:e,onClose:a,primaryButtonText:d,secondaryButtonText:"Cancel",title:h,disabledPrimaryButton:m,children:t.jsx(E,{condition:i,show:t.jsxs(t.Fragment,{children:[t.jsxs("p",{children:["Are you sure you want to archive"," ",t.jsx("strong",{children:r==null?void 0:r.length})," feature toggles?"]}),t.jsx(E,{condition:!!(o&&(o==null?void 0:o.length)>0),show:t.jsx(Tt,{ids:o,projectId:s})}),t.jsx(E,{condition:l.length>0,show:t.jsx(K,{ids:l,projectId:s})}),t.jsx(E,{condition:v,show:t.jsx(Y,{})}),t.jsx(Q,{changeRequests:g,projectId:s}),t.jsx(E,{condition:(r==null?void 0:r.length)<=5,show:t.jsx("ul",{children:r==null?void 0:r.map(b=>t.jsx("li",{children:b},b))})})]}),elseShow:t.jsxs(t.Fragment,{children:[t.jsxs("p",{children:["Are you sure you want to archive"," ",i?"these feature toggles":"this feature toggle","?"]}),t.jsx(E,{condition:l.length>0,show:t.jsx(K,{ids:l,projectId:s})}),t.jsx(E,{condition:v,show:t.jsx(Y,{})}),t.jsx(Q,{changeRequests:g,projectId:s})]})})})};export{Xe as C,Rt as E,Dt as F,$t as T,Pt as V,kt as W,qt as a,Ot as b,Bt as c,Ft as d,_t as e,Vt as f,tt as u};
@@ -0,0 +1,2 @@
1
+ import{h0 as c,cA as g,h1 as u,b$ as m,a as x,b_ as f,r as d,j as b,gT as C,gU as v,gV as M,gW as S,gX as q,gY as h,g_ as T,gZ as $,h2 as D}from"./index-p2PlVFLf.js";import{L as E}from"./index-pAMHRYpv.js";import{d as L}from"./FeatureViewLazyExport-SpKYIb_J.js";import"./FeatureArchiveDialog-NSAcrt7Z.js";import"./StrategyItemContainer-wxQbaPXr.js";const j=(e,l,s)=>{const a={label:"Total requests",borderColor:e.palette.primary.main,backgroundColor:e.palette.primary.main,data:p(l,s,o=>o.yes+o.no),elements:{point:{radius:6,pointStyle:"circle"},line:{borderDash:[8,4]}}},t={label:"Exposed",borderColor:e.palette.success.main,backgroundColor:e.palette.success.main,data:p(l,s,o=>o.yes),elements:{point:{radius:6,pointStyle:"triangle"}}},r={label:"Not exposed",borderColor:e.palette.error.main,backgroundColor:e.palette.error.main,data:p(l,s,o=>o.no),elements:{point:{radius:6,pointStyle:"triangle",pointRotation:180}}};return{datasets:[t,r,a]}},p=(e,l,s)=>e.map(a=>({x:a.timestamp,y:s(a),variants:a.variants||{}})),_=(e,l)=>{if(l===0)return"";const[s,a]=e,t=Math.floor(Number(a)/l*100);return`${a} (${t}%) - ${s}`},k=(e,l,s,a)=>({locale:a.locale,responsive:!0,maintainAspectRatio:!1,interaction:{mode:"index",intersect:!1},color:e.palette.text.secondary,plugins:{tooltip:{backgroundColor:e.palette.background.paper,bodyColor:e.palette.text.primary,titleColor:e.palette.text.secondary,borderColor:e.palette.primary.main,borderWidth:1,padding:10,boxPadding:5,usePointStyle:!0,itemSort:(t,r)=>{const o=["Total requests","Exposed","Not exposed"],n=o.indexOf(t.dataset.label),i=o.indexOf(r.dataset.label);return n-i},callbacks:{label:t=>`${t.formattedValue} - ${t.dataset.label}`,afterLabel:t=>{const r=t.dataset.data[t.dataIndex];if(t.dataset.label!=="Exposed"||r.variants===void 0)return"";const{disabled:o,...n}=r.variants;return Object.entries(n).map(i=>_(i,r.y)).join(`
2
+ `)},title:t=>`Time: ${s>48?g(t[0].parsed.x,a.locale,"UTC"):u(t[0].parsed.x,a.locale)}`}},legend:{position:"top",align:"end",labels:{boxWidth:10,boxHeight:10,usePointStyle:!0}},title:{text:O(s),position:"top",align:"start",display:!0,font:{size:16,weight:"400"},color:e.palette.text.primary}},scales:{y:{type:"linear",title:{display:!0,text:"Number of requests",color:e.palette.text.secondary},suggestedMin:0,ticks:{precision:0,color:e.palette.text.secondary},grid:{color:e.palette.divider,borderColor:e.palette.divider}},x:{type:"time",time:{unit:s>48?"day":"hour"},grid:{display:!1},ticks:{callback:(t,r,o)=>s>48?m(o[r].value,a.locale,"UTC"):u(o[r].value,a.locale),color:e.palette.text.secondary}}}}),O=e=>e===1?"Requests in the last hour":`Requests in the last ${L(e)}`;c.font={...c.font,family:"Sen",size:13,weight:"400"};const w=({metrics:e,hoursBack:l,statsSectionId:s})=>{const a=x(),{locationSettings:t}=f(),r=d.useMemo(()=>[...e].sort((i,y)=>i.timestamp.localeCompare(y.timestamp)),[e]),o=d.useMemo(()=>k(a,r,l,t),[a,r,l,t]),n=d.useMemo(()=>j(a,r,t),[a,r,t]);return b.jsx("div",{style:{height:400},children:b.jsx(E,{options:o,data:n,"aria-label":"A feature metrics line chart, with three lines: all requests, positive requests, and negative requests.","aria-describedby":s})})};C.register(v,M,S,q,h,T,$,D);export{w as FeatureMetricsChart,w as default};
@@ -0,0 +1,25 @@
1
+ import{c as pt,j as t,s as p,aE as A,aF as M,aG as Js,aH as Qs,C as b,aI as re,aJ as Ce,aK as Q,aL as we,aM as Zs,aN as He,r as g,aO as ge,aP as ye,aQ as gt,aR as Xs,aS as en,aT as tn,aU as sn,b as U,aV as ne,aW as te,f as N,T as W,aX as Fe,aY as he,aZ as rs,a_ as Z,a$ as de,t as ee,x as $e,b0 as nn,b1 as an,b2 as ke,M as ue,b3 as Te,b4 as os,b5 as me,b6 as is,b7 as oe,ay as ce,b8 as We,J as ie,b9 as rn,ba as on,bb as cn,bc as lt,bd as ln,be as dn,B as K,bf as un,bg as pn,bh as gn,bi as hn,bj as fn,bk as xn,bl as mn,bm as cs,bn as yn,bo as Ft,bp as ls,aw as jn,bq as Sn,a as ht,ac as Ie,br as ft,G as Ee,K as bn,bs as xt,h as je,bt as Ae,bu as ds,bv as mt,bw as yt,bx as jt,ax as fe,aj as ae,by as St,bz as us,aA as Ue,bA as ps,bB as gs,bC as hs,bD as vn,bE as bt,R as vt,bF as fs,Y as Cn,bG as Ct,bH as ve,bI as pe,bJ as xs,a1 as ms,bK as wn,bL as le,bM as Tn,bN as En,X as An,ai as Dn,bO as Fn,bP as Rn,bQ as $n,bR as kn,bS as In,bT as Pn,u as On,bU as ys,bV as wt,bW as Bn,bX as Ln,bY as Rt,bZ as js,b_ as Ss,b$ as _n,c0 as bs,c1 as Mn,c2 as qn,c3 as zn,c4 as Tt,c5 as Vn,c6 as Ye,c7 as Nn,Q as vs,D as Re,c8 as Hn,c9 as Wn,ca as Un,cb as Yn,cc as Cs,cd as ws,ce as Gn,cf as Kn,cg as _e,ch as Ts,ci as Es,cj as As,ck as xe,cl as dt,cm as Jn,cn as Ds,co as Qn,cp as Zn,e as Xn,cq as ea,cr as $t,av as ta,cs as be,ct as kt,cu as sa,cv as na,cw as aa,l as ra,at as Et,au as oa,ao as It,cx as ia,cy as ca,cz as la,cA as Pt,ab as Fs,cB as da,a3 as Je,af as ua,a5 as pa,a6 as ga,a7 as ha,a8 as fa,a9 as xa,aa as ma,cC as ya,cD as ja,cE as Ot,cF as Sa,cG as ba,cH as Qe,cI as va,cJ as Ca,cK as wa,cL as Rs,q as Ta,cM as Bt,cN as Ea,cO as Aa,cP as Da,cQ as Fa,cR as Ra,cS as $a,al as ka,cT as Ia,cU as Pa,cV as Oa,cW as Ba,cX as La,cY as _a,cZ as Ma,c_ as qa}from"./index-p2PlVFLf.js";import{C as $s,u as ks,a as za,F as Va,V as Na,b as Ha,c as Wa,T as Ua,d as Ya,W as Ga,e as Ka,f as Ja}from"./FeatureArchiveDialog-NSAcrt7Z.js";import{S as Qa}from"./StrategyItemContainer-wxQbaPXr.js";const Za=pt(t.jsx("path",{d:"m20.54 5.23-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27zM12 17.5 6.5 12H10v-2h4v2h3.5L12 17.5zM5.12 5l.81-1h12l.94 1H5.12z"}),"Archive"),Xa=pt(t.jsx("path",{d:"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z"}),"Assessment"),er=pt(t.jsx("path",{d:"M4 6H2v14c0 1.1.9 2 2 2h14v-2H4V6zm16-4H8c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-1 9h-4v4h-2v-4H9V9h4V5h2v4h4v2z"}),"LibraryAdd"),tr=p("div")(({theme:e})=>({borderRadius:e.spacing(1.5),backgroundColor:e.palette.background.paper,padding:e.spacing(4)})),sr=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=M(e,s);return n.name?t.jsx(tr,{children:t.jsx(Js,{title:"Event log",feature:s,displayInline:!0})}):null},nr=p("div")(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,color:e.palette.primary.contrastText,backgroundColor:e.palette.background.alternative,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:e.spacing(2),[e.breakpoints.down(1e3)]:{width:"100%",maxWidth:"none",minWidth:"auto"}})),ar=p("div")({padding:"1.5rem 1.5rem 0 1.5rem"}),rr=p("div")({display:"flex",alignItems:"center"}),or=p("h2")(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:"normal",margin:0})),ir=p("div")(({theme:e})=>({margin:e.spacing(2,0),display:"flex",flexDirection:"column"})),Lt=p("span")(({theme:e})=>({margin:e.spacing(1,0),fontSize:e.fontSizes.bodySize})),_t=p("div")(({theme:e})=>({display:"flex",alignItems:"center",color:e.palette.primary.contrastText})),cr=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=M(e,s),{project:r,description:a,type:o}=n,i=Zs(o);return t.jsx(nr,{children:t.jsxs(ar,{children:[t.jsxs(rr,{"data-loading":!0,children:[t.jsx(i,{sx:c=>({marginRight:c.spacing(2),height:"40px",width:"40px",fill:c.palette.primary.contrastText})})," ",t.jsxs(or,{children:[Qs(o||"")," toggle"]})]}),t.jsxs(ir,{children:[t.jsxs(Lt,{"data-loading":!0,children:["Project: ",r]}),t.jsx(b,{condition:!!a,show:t.jsxs(Lt,{"data-loading":!0,children:[t.jsx("div",{children:"Description:"}),t.jsxs(_t,{children:[t.jsx("p",{children:a}),t.jsx(re,{projectId:e,permission:Ce,component:Q,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(we,{sx:c=>({color:c.palette.primary.contrastText})})})]})]}),elseShow:t.jsx("span",{"data-loading":!0,children:t.jsxs(_t,{children:["No description."," ",t.jsx(re,{projectId:e,permission:Ce,component:Q,to:`/projects/${e}/features/${s}/settings`,tooltipProps:{title:"Edit description"},children:t.jsx(we,{sx:c=>({color:c.palette.primary.contrastText})})})]})})})]})]})})},Mt={lastHourUsage:[],seenApplications:[]},lr=(e,s,n={})=>{const r=async()=>{const u=ge(`api/admin/client-metrics/features/${s}`),h=await fetch(u,{method:"GET"}).then(ye("feature metrics"));return h.ok?h.json():Mt},a=`${e}_${s}_metrics`,{data:o,error:i}=He(a,r,{...n}),[c,l]=g.useState(!i&&!o),d=()=>{gt(a)};return g.useEffect(()=>{l(!i&&!o)},[o,i]),{metrics:o||Mt,error:i,loading:c,refetch:d,FEATURE_METRICS_CACHE_KEY:a}},dr=e=>({yes:0,no:0,environment:e,timestamp:""}),ur=(e,s)=>e.map(n=>s.lastHourUsage.find(a=>a.environment===n.name)||dr(n.name)),pr=e=>(s,n,r)=>(r.revalidateOnFocus=!1,r.revalidateIfStale=!1,r.revalidateOnReconnect=!1,e(s,n,r)),gr=Xs(He,pr),Is=(e,s)=>{const{refetchFeature:n}=M(e,s),r=en(e,s),{data:a,error:o,mutate:i}=gr(["useFeatureImmutable",r],()=>tn(r)),c=g.useCallback(async()=>{await i(),await n()},[i,n]);return{feature:(a==null?void 0:a.body)||sn,refetchFeature:c,loading:!o&&!a,status:a==null?void 0:a.status,error:o}},Ps=(e,s,n)=>{const{setToastData:r,setToastApiError:a}=U(),{addChange:o}=ne(),{refetch:i}=te(e),[c,l]=g.useState({isOpen:!1}),d=g.useCallback((y,T,f)=>{l({featureName:s,environment:y,fromEnvironment:f,strategy:T,isOpen:!0})},[]),u=g.useCallback((y,T,f)=>{l({featureName:s,environment:y,fromEnvironment:f,strategies:T,isOpen:!0})},[]),h=g.useCallback(()=>{l({isOpen:!1})},[]),m=g.useCallback(async()=>{try{await o(e,c.environment,{feature:c.featureName,action:n,payload:c.strategy}),i(),l({isOpen:!1}),r({type:"success",title:"Changes added to the draft!"})}catch(y){a(N(y)),l({isOpen:!1})}},[o]),j=g.useCallback(async()=>{try{await Promise.all(c.strategies.map(y=>o(e,c.environment,{feature:c.featureName,action:n,payload:y}))),i(),l({isOpen:!1}),r({type:"success",title:"Changes added to the draft!"})}catch(y){a(N(y)),l({isOpen:!1})}},[o]);return{onChangeRequestAddStrategy:d,onChangeRequestAddStrategies:u,onChangeRequestAddStrategyClose:h,onChangeRequestAddStrategyConfirm:m,onChangeRequestAddStrategiesConfirm:j,changeRequestDialogDetails:c}},hr=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(W,{children:[t.jsxs("strong",{children:["Copy ",Fe((e==null?void 0:e.name)||"")," strategy"," "]})," ","from ",s," to ",n]}),fr=({environmentId:e,environments:s,strategy:n})=>{const r=A("projectId"),a=A("featureId"),[o,i]=g.useState(null),c=!!o,{addStrategyToFeature:l}=he(),{setToastData:d,setToastApiError:u}=U(),{refetchFeature:h}=M(r,a),{refetchFeature:m}=Is(r,a),j=()=>{i(null)},y=rs(r),{isChangeRequestConfigured:T}=Z(r),{changeRequestDialogDetails:f,onChangeRequestAddStrategyClose:x,onChangeRequestAddStrategy:R,onChangeRequestAddStrategyConfirm:L}=Ps(r,a,"addStrategy"),q=async v=>{const{id:C,...$}={...n,targetEnvironment:v};if(T(v)){await R(v,{id:C,...$},e);return}try{await l(r,a,v,n),h(),m(),d({title:"Strategy created",text:`Successfully copied a strategy to ${v}`,type:"success"})}catch(O){u(N(O))}j()},z=s.some(v=>y(de,v));return t.jsxs("div",{children:[t.jsx($s,{isOpen:f.isOpen,onClose:x,environment:f==null?void 0:f.environment,onConfirm:L,messageComponent:t.jsx(hr,{fromEnvironment:f.fromEnvironment,payload:f.strategy})}),t.jsx(ee,{title:`Copy to another environment${z?"":" (Access denied)"}`,children:t.jsx("div",{children:t.jsx($e,{size:"large",id:`copy-strategy-icon-menu-${n.id}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:v=>{i(v.currentTarget)},"data-testid":nn,disabled:!z,children:t.jsx(an,{})})})}),t.jsx(ke,{id:"basic-menu",anchorEl:o,open:c,onClose:j,MenuListProps:{"aria-labelledby":`copy-strategy-icon-menu-${n.id}`},children:s.map(v=>{const C=y(de,v);return t.jsx(ee,{title:C?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(ue,{onClick:()=>q(v),disabled:!C,children:[t.jsx(b,{condition:!C,show:t.jsx(Te,{children:t.jsx(os,{fontSize:"small"})})}),t.jsxs(me,{children:["Copy to ",v]})]})})},v)})})]})},xr=()=>t.jsx(ie,{severity:"error",children:"Removing the strategy will change which users receive access to the feature."}),mr=p("div")(({theme:e})=>({"> * + *":{marginTop:e.spacing(1)}})),yr=({changeRequests:e,projectId:s})=>e&&e.length>0?t.jsxs(ie,{severity:"warning",children:[t.jsx("p",{children:"This strategy is in use by at least one scheduled change request. If you remove it, those change requests can no longer be applied."}),t.jsx("p",{children:"The following scheduled change requests use this strategy:"}),t.jsx("ul",{children:e.map(({id:n,title:r})=>{const a=r?`#${n} (${r})`:`#${n}`;return t.jsx("li",{children:t.jsx(Q,{to:`/projects/${s}/change-requests/${n}`,target:"_blank",rel:"noopener noreferrer",title:`Change request ${n}`,children:a})},n)})})]}):e===void 0?t.jsx(ie,{severity:"warning",children:t.jsx("p",{children:"This strategy may be in use by one or more scheduled change requests. If you remove it, those change requests can no longer be applied."})}):null,Os=({scheduledChangeRequestsForStrategy:e})=>t.jsxs(mr,{children:[t.jsx(xr,{}),t.jsx(yr,{projectId:e.projectId,changeRequests:e.changeRequests})]}),jr=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:r})=>t.jsx(oe,{title:"Are you sure you want to delete this strategy?",open:n,primaryButtonText:"Remove strategy",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:t.jsx(Os,{scheduledChangeRequestsForStrategy:r})}),Sr=p("div")(({theme:e})=>({marginTop:e.spacing(3),marginBottom:e.spacing(1)})),br=({onRemove:e,onClose:s,isOpen:n,scheduledChangeRequestsForStrategy:r})=>t.jsxs(oe,{title:"Suggest changes",open:n,primaryButtonText:"Add suggestion to draft",secondaryButtonText:"Cancel",onClick:e,onClose:s,children:[t.jsx(Os,{scheduledChangeRequestsForStrategy:r}),t.jsx(Sr,{children:t.jsx(W,{variant:"body2",color:"text.secondary",children:"Your suggestion:"})}),t.jsx(W,{fontWeight:"bold",children:"Remove strategy"})]}),vr=({projectId:e,featureId:s,environmentId:n,strategyId:r})=>{const{deleteStrategyFromFeature:a}=he(),{setToastData:o,setToastApiError:i}=U(),c=ce(),{refetchFeature:l}=M(e,s);return async u=>{try{u.preventDefault(),await a(e,s,n,r),o({title:"Strategy deleted",type:"success"}),l(),c(We(e,s))}catch(h){i(N(h))}}},Cr=({projectId:e,featureId:s,environmentId:n,strategyId:r})=>{const{addChange:a}=ne(),{refetch:o}=te(e),{setToastData:i,setToastApiError:c}=U();return async d=>{try{d.preventDefault(),await a(e,n,{action:"deleteStrategy",feature:s,payload:{id:r}}),i({title:"Changes added to the draft!",type:"success"}),await o()}catch(u){c(N(u))}}},wr=({projectId:e,featureId:s,environmentId:n,strategyId:r,isOpen:a,onClose:o})=>{const{isChangeRequestConfigured:i}=Z(e),{changeRequests:c}=is(e,r),l={changeRequests:c,projectId:e},d=vr({featureId:s,projectId:e,strategyId:r,environmentId:n}),u=Cr({featureId:s,projectId:e,strategyId:r,environmentId:n});return i(n)?t.jsx(br,{isOpen:a,onClose:()=>o(),onRemove:async h=>{await u(h),o()},scheduledChangeRequestsForStrategy:l}):t.jsx(jr,{isOpen:a,onClose:()=>o(),onRemove:d,scheduledChangeRequestsForStrategy:l})},Tr=({projectId:e,environmentId:s,featureId:n,strategy:r})=>{const{refetchFeature:a}=M(e,n),{setStrategyDisabledState:o}=he(),{setToastData:i,setToastApiError:c}=U(),l=d=>async()=>{try{await o(e,n,s,r.id,!d),i({title:`Strategy ${d?"enabled":"disabled"}`,type:"success"}),a()}catch(u){c(N(u))}};return{onDisable:l(!1),onEnable:l(!0)}},Er=({projectId:e,environmentId:s,featureId:n,strategy:r})=>{const{addChange:a}=ne(),{refetch:o}=te(e),{setToastData:i,setToastApiError:c}=U(),l=d=>async()=>{try{await a(e,s,{action:"updateStrategy",feature:n,payload:{...r,disabled:!d}}),i({title:"Changes added to the draft!",type:"success"}),await o()}catch(u){c(N(u))}};return{onSuggestDisable:l(!1),onSuggestEnable:l(!0)}},Ar=({isOpen:e,onClose:s,...n})=>{var j;const{projectId:r,environmentId:a}=n,{isChangeRequestConfigured:o}=Z(r),i=o(a),{onSuggestEnable:c,onSuggestDisable:l}=Er({...n}),{onEnable:d,onDisable:u}=Tr({...n}),h=!!((j=n.strategy)!=null&&j.disabled),m=y=>{y.preventDefault(),i?h?c():l():h?d():u(),s()};return t.jsx(oe,{title:i?`Add ${h?"enable":"disable"} strategy to change request?`:`Are you sure you want to ${h?"enable":"disable"} this strategy?`,open:e,primaryButtonText:i?"Add to draft":`${h?"Enable":"Disable"} strategy`,secondaryButtonText:"Cancel",onClick:m,onClose:()=>s(),children:t.jsx(b,{condition:i,show:t.jsx(rn,{environment:a}),elseShow:t.jsxs(ie,{severity:"error",children:[h?"Enabling":"Disabling"," the strategy will change which users receive access to the feature."]})})})};var At={},Dr=cn;Object.defineProperty(At,"__esModule",{value:!0});var Bs=At.default=void 0,Fr=Dr(on()),Rr=t,$r=(0,Fr.default)((0,Rr.jsx)("path",{d:"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z"}),"Delete");Bs=At.default=$r;const kr=({projectId:e,strategy:s,featureId:n,environmentId:r})=>{const[a,o]=g.useState(null),[i,c]=g.useState(!1),[l,d]=g.useState(!1),u=!!a,h=T=>{o(T.currentTarget)},m=T=>{o(null),T.stopPropagation()},j=lt(ln,e,r),y=lt(dn,e,r);return t.jsxs(t.Fragment,{children:[t.jsx(K,{sx:{display:"flex",alignItems:"center",textAlign:"center"},children:t.jsx(ee,{title:"More actions",children:t.jsx($e,{onClick:h,size:"small","aria-controls":u?"actions-menu":void 0,"aria-haspopup":"true","aria-expanded":u?"true":void 0,"data-testid":un,children:t.jsx(pn,{sx:{width:32,height:32}})})})}),t.jsxs(ke,{anchorEl:a,id:"actions-menu",open:u,onClose:m,onClick:m,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},"data-testid":gn,children:[t.jsx(ee,{title:s.disabled?"Enable strategy":"Disable strategy",arrow:!0,placement:"left",children:t.jsxs(ue,{disabled:!j,onClick:()=>c(!0),children:[t.jsx(Te,{children:s.disabled?t.jsx(hn,{}):t.jsx(fn,{})}),t.jsx(me,{children:s.disabled?"Enable":"Disable"})]})}),t.jsx(ee,{title:"Remove strategy",arrow:!0,placement:"left",children:t.jsxs(ue,{disabled:!y,onClick:()=>d(!0),"data-testid":xn,children:[t.jsx(Te,{children:t.jsx(Bs,{})}),t.jsx(me,{children:"Remove"})]})})]}),t.jsx(Ar,{isOpen:i,onClose:()=>c(!1),projectId:e,featureId:n,environmentId:r,strategy:s}),t.jsx(wr,{isOpen:l,onClose:()=>d(!1),projectId:e,featureId:n,environmentId:r,strategyId:s.id})]})},Ir=({environmentId:e,strategy:s,onDragStart:n,onDragEnd:r,otherEnvironments:a,orderNumber:o,headerChildren:i})=>{const c=A("projectId"),l=A("featureId"),d=mn(c,l,e,s.id);return t.jsxs(Qa,{strategy:s,onDragStart:n,onDragEnd:r,orderNumber:o,actions:t.jsxs(t.Fragment,{children:[i,t.jsx(b,{condition:!!(a&&(a==null?void 0:a.length)>0),show:()=>t.jsx(fr,{environmentId:e,environments:a,strategy:s})}),t.jsx(re,{permission:cs,environmentId:e,projectId:c,component:Q,to:d,tooltipProps:{title:"Edit strategy"},"data-testid":`STRATEGY_EDIT-${s.name}`,children:t.jsx(we,{})}),t.jsx(kr,{projectId:c,featureId:l,environmentId:e,strategy:s})]}),children:[t.jsx(yn,{strategy:s}),s.variants&&s.variants.length>0&&(s.disabled?t.jsx(K,{sx:{opacity:"0.5"},children:t.jsx(Ft,{variants:s.variants})}):t.jsx(Ft,{variants:s.variants}))]})},Pr=e=>fetch(e).then(ye("ChangeRequest")).then(s=>s.json()),Ls=(e,s)=>{const{data:n,error:r,mutate:a}=ls([],ge(`api/admin/projects/${e}/change-requests/pending/${s}`),Pr);return{changeRequests:n,loading:!r&&!n,refetch:a,error:r}},Or=(e,s,n,r)=>{const{user:a}=jn(),{changeRequests:o}=Ls(e,s),i=[],c=o==null?void 0:o.filter(l=>l.environment===n);return c==null||c.forEach(l=>{const d=l==null?void 0:l.features.find(h=>h.name===s),u=d==null?void 0:d.changes.find(h=>h.action==="updateStrategy"||h.action==="deleteStrategy"?h.payload.id===r:!1);if(u){const h=l.state==="Scheduled",m=!h&&l.createdBy.id===(a==null?void 0:a.id);h&&i.push({changeRequestId:l.id,change:u,isScheduledChange:h}),m&&i.push({changeRequestId:l.id,change:u,isScheduledChange:h})}}),i},Me=p("div")({display:"flex",flexDirection:"row",justifyContent:"space-between",alignItems:"center"}),qe=p("div")(({theme:e})=>({justifyContent:"center",paddingTop:e.spacing(.75),...Sn})),ze=p("span")(({theme:e})=>({color:e.palette.text.secondary,marginRight:e.spacing(1)})),Dt=p(Q)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),_s=({scheduledChangeRequestIds:e})=>{const s=ht(),n=Ie(s.breakpoints.down("sm")),r=A("projectId");return n?null:t.jsx(K,{sx:{mr:1.5},children:t.jsx(ft,{tooltip:t.jsx(t.Fragment,{children:e==null?void 0:e.map((a,o)=>t.jsxs(Dt,{to:`/projects/${r}/change-requests/${a}`,children:["Change request #",a]},`${r}-${o}`))}),children:t.jsx(Ee,{color:"warning",children:"Changes Scheduled"})})})},Br=({strategy:e,index:s,environmentName:n,otherEnvironments:r,isDragging:a,onDragStartRef:o,onDragOver:i,onDragEnd:c})=>{const l=A("projectId"),d=A("featureId"),u=g.useRef(null),h=Or(l,d,n,e.id),{changeRequests:m}=is(l,e.id);return t.jsxs(K,{ref:u,onDragOver:i(u,s),sx:{opacity:a?"0.5":"1"},children:[t.jsx(b,{condition:s>0,show:t.jsx(bn,{text:"OR"})}),t.jsx(Ir,{strategy:e,environmentId:n,otherEnvironments:r,onDragStart:o(u,s),onDragEnd:c,orderNumber:s+1,headerChildren:_r(h,m)})]},e.id)},Lr=({change:e})=>{const s=ht();return Ie(s.breakpoints.down("sm"))?null:t.jsxs(K,{sx:{mr:1.5},children:[t.jsx(b,{condition:(e==null?void 0:e.action)==="updateStrategy",show:t.jsx(Ee,{color:"warning",children:"Modified in draft"})}),t.jsx(b,{condition:(e==null?void 0:e.action)==="deleteStrategy",show:t.jsx(Ee,{color:"error",children:"Deleted in draft"})})]})},_r=(e,s)=>{const n=[];if((e==null?void 0:e.length)===0&&(s==null?void 0:s.length)===0)return[];const r=e==null?void 0:e.find(({isScheduledChange:a})=>!a);return r&&n.push(t.jsx(Lr,{change:r.change},`draft-change#${r.change.id}`)),s&&s.length>0&&n.push(t.jsx(_s,{scheduledChangeRequestIds:s.map(a=>a.id)},"scheduled-changes")),n},Mr=({environmentId:e,environments:s,onClick:n})=>{const r=A("projectId"),[a,o]=g.useState(null),i=!!a,{hasAccess:c}=g.useContext(xt),l=s.some(d=>c(de,r,d));return t.jsxs("div",{children:[t.jsx(ee,{title:l?"":"(Access denied)",children:t.jsx("div",{children:t.jsx(je,{id:`copy-all-strategies-${e}`,"aria-controls":i?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":i?"true":void 0,onClick:d=>{o(d.currentTarget)},disabled:!l,variant:"outlined",children:"Copy from another environment"})})}),t.jsx(ke,{id:"basic-menu",anchorEl:a,open:i,onClose:()=>{o(null)},MenuListProps:{"aria-labelledby":`copy-all-strategies-${e}`},children:s.map(d=>{const u=c(de,r,d);return t.jsx(ee,{title:u?"":"You don't have access to add a strategy to this environment",children:t.jsx("div",{children:t.jsxs(ue,{onClick:()=>n(d),disabled:!u,children:[t.jsx(b,{condition:!u,show:t.jsx(Te,{children:t.jsx(os,{fontSize:"small"})})}),t.jsxs(me,{children:["Copy from ",d]})]})})},d)})})]})},qr=p("div")(({theme:e})=>({"&>*:nth-child(n)":{margin:e.spacing(1,0)}})),zr=({payload:e,fromEnvironment:s,environment:n})=>t.jsxs(qr,{children:[t.jsx(W,{children:t.jsx("strong",{children:"Copy: "})}),e==null?void 0:e.map(r=>t.jsxs(W,{children:[t.jsxs("strong",{children:[Fe((r==null?void 0:r.name)||"")," strategy"," "]})," "]})),t.jsxs(W,{children:["from ",s," to ",n]})]}),Ms=(e,s)=>{const n={};return s.parameters.forEach(r=>{n[r.name]=Vr(e,r)}),{name:s.name,constraints:[],parameters:n}},Vr=(e,s)=>s.name==="rollout"||s.name==="percentage"||s.type==="percentage"?"50":s.name==="stickiness"?"":s.name==="groupId"?e:s.type==="boolean"?"false":"",Nr=()=>{const e=A("projectId"),s=A("featureId"),n=Ae("environmentId"),r=Ae("strategyName"),{strategy:a,defaultStrategyFallback:o}=ks(e,n),i=JSON.parse(ds().get("defaultStrategy")||"false"),{segments:c}=mt(),l=(c||[]).filter(P=>{var H;return(H=a==null?void 0:a.segments)==null?void 0:H.includes(P.id)}),[d,u]=g.useState({}),[h,m]=g.useState(i?l:[]),{strategyDefinition:j}=yt(r),y=jt(),{addStrategyToFeature:T,loading:f}=he(),{addChange:x}=ne(),{setToastData:R,setToastApiError:L}=U(),{uiConfig:q}=fe(),{unleashUrl:z}=q,v=ce(),{feature:C,refetchFeature:$}=M(e,s),O=g.useRef(C),{isChangeRequestConfigured:V}=Z(e),{refetch:G}=te(e),{trackEvent:Y}=ae(),{data:S,staleDataNotification:k,forceRefreshCache:w}=St({unleashGetter:M,params:[e,s],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},C,{afterSubmitAction:$},bt);g.useEffect(()=>{O.current.name===""&&C.name&&(w(C),O.current=C)},[C.name]),g.useEffect(()=>{var P;if(i){const H=a||o;((P=H.parameters)==null?void 0:P.groupId)===""&&s?u({...H,parameters:{...H.parameters,groupId:s}}):u(H)}else j&&u(Ms(s,j))},[s,JSON.stringify(j),i]);const E=async P=>{await T(e,s,n,P),R({title:"Strategy created",type:"success",confetti:!0})},F=async P=>{await x(e,n,{action:"addStrategy",feature:s,payload:P}),R({title:"Strategy added to draft",type:"success",confetti:!0}),G()},B=us(d,h),I=async()=>{Y("strategyTitle",{props:{hasTitle:!!d.title,on:"create"}});try{V(n)?await F(B):await E(B),$(),v(We(e,s))}catch(P){L(N(P))}};return!S||!S.project?null:t.jsxs(Ue,{modal:!0,title:Fe(r),description:ps,documentationLink:gs,documentationLinkLabel:hs,formatApiCode:()=>Hr(e,s,n,B,z),children:[t.jsx(vn,{projectId:e,feature:S,strategy:d,setStrategy:u,segments:h,setSegments:m,environmentId:n,onSubmit:I,loading:f,permission:de,errors:y,isChangeRequest:V(n)}),k]})},qs=(e,s,n,r,a=!1)=>{const o=new URLSearchParams({environmentId:n,strategyName:r,defaultStrategy:String(a)});return`/projects/${e}/features/${s}/strategies/create?${o}`},Hr=(e,s,n,r,a)=>{if(!a)return"";const o=`${a}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(r,void 0,2);return`curl --location --request POST '${o}' \\
2
+ --header 'Authorization: INSERT_API_KEY' \\
3
+ --header 'Content-Type: application/json' \\
4
+ --data-raw '${i}'`},Wr=p("div")(({theme:e})=>({width:e.spacing(4),height:"auto","& > svg":{fill:e.palette.primary.main},"& > div":{height:e.spacing(2),marginLeft:"-.75rem",color:e.palette.primary.main}})),Ur=p("div")(({theme:e})=>({fontSize:e.fontSizes.smallBody})),Yr=p(vt)(({theme:e})=>({fontWeight:e.fontWeight.bold})),Gr=p(Q)(({theme:e})=>({display:"grid",gridTemplateColumns:"3rem 1fr",width:"20rem",padding:e.spacing(2),color:"inherit",textDecoration:"inherit",lineHeight:1.25,borderWidth:"1px",borderStyle:"solid",borderColor:e.palette.divider,borderRadius:e.spacing(1),"&:hover, &:focus":{borderColor:e.palette.primary.main}})),Ze=({projectId:e,featureId:s,environmentId:n,strategy:r,defaultStrategy:a})=>{const o=fs(r.name),i=Fe(r.name),{trackEvent:c}=ae(),l=qs(e,s,n,r.name,a),d=()=>{c("strategy-add",{props:{buttonTitle:r.displayName||i}})};return t.jsxs(Gr,{to:l,onClick:d,children:[t.jsx(Wr,{children:t.jsx(o,{})}),t.jsxs("div",{children:[t.jsx(Yr,{text:r.displayName||i,maxWidth:"200",maxLength:25}),t.jsx(Ur,{children:r.description})]})]})},Xe=p(W)(({theme:e})=>({fontSize:e.fontSizes.smallBody,padding:e.spacing(1,2)})),Kr=({projectId:e,featureId:s,environmentId:n})=>{const{strategies:r}=Cn(),a=r.filter(c=>!c.deprecated&&!c.editable),o=r.filter(c=>!c.deprecated&&c.editable),i={name:"flexibleRollout",displayName:"Default strategy",description:"This is the default strategy defined for this environment in the project"};return t.jsxs(Ct,{dense:!0,children:[t.jsxs(t.Fragment,{children:[t.jsxs(Xe,{color:"textSecondary",children:[n," environment default strategy"]}),t.jsx(ve,{children:t.jsx(Ze,{projectId:e,featureId:s,environmentId:n,strategy:i,defaultStrategy:!0})},i.name)]}),t.jsx(Xe,{color:"textSecondary",children:"Predefined strategy types"}),a.map(c=>t.jsx(ve,{children:t.jsx(Ze,{projectId:e,featureId:s,environmentId:n,strategy:c})},c.name)),t.jsx(b,{condition:o.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Xe,{color:"textSecondary",children:"Custom strategies"}),o.map(c=>t.jsx(ve,{children:t.jsx(Ze,{projectId:e,featureId:s,environmentId:n,strategy:c})},c.name))]})})]})},Jr=p("div")({flexShrink:0}),Qr=p(pe)(({theme:e})=>({minWidth:0,width:e.spacing(4.5),alignItems:"center",justifyContent:"center",align:"center",flexDirection:"column",marginLeft:e.spacing(1)})),ut=({label:e,projectId:s,featureId:n,environmentId:r,variant:a,size:o,matchWidth:i})=>{const[c,l]=g.useState(),d=ce(),{trackEvent:u}=ae(),h=!!c,m=h?"FeatureStrategyMenuPopover":void 0,j=()=>{l(void 0)},y=x=>{u("strategy-add",{props:{buttonTitle:e}}),d(f)},T=x=>{l(x.currentTarget)},f=qs(s,n,r,"flexibleRollout",!0);return t.jsxs(Jr,{onClick:x=>x.stopPropagation(),children:[t.jsx(pe,{permission:de,projectId:s,environmentId:r,onClick:y,"aria-labelledby":m,variant:a,size:o,sx:{minWidth:i?"282px":"auto"},children:e}),t.jsx(Qr,{permission:de,projectId:s,environmentId:r,onClick:T,"aria-labelledby":m,variant:"outlined",size:o,hideLockIcon:!0,tooltipProps:{title:"More strategies"},children:t.jsx(xs,{sx:x=>({margin:x.spacing(.25,0)})})}),t.jsx(ms,{id:m,open:h,anchorEl:c,onClose:j,onClick:j,PaperProps:{sx:x=>({paddingBottom:x.spacing(1)})},children:t.jsx(Kr,{projectId:s,featureId:n,environmentId:r})})]})},Zr=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",paddingTop:e.spacing(2)})),Xr=p("div")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",color:e.palette.text.primary,marginBottom:e.spacing(1)})),eo=p("p")(({theme:e})=>({color:e.palette.text.secondary,fontSize:e.fontSizes.smallBody,textAlign:"center",marginBottom:e.spacing(3),a:{color:e.palette.links}})),to=({projectId:e,featureId:s,environmentId:n})=>{const{addStrategyToFeature:r}=he(),{setToastData:a,setToastApiError:o}=U(),{refetchFeature:i}=M(e,s),{refetchFeature:c}=Is(e,s),{feature:l}=M(e,s),d=l==null?void 0:l.environments.filter(R=>R.name!==n&&R.strategies&&R.strategies.length>0),{isChangeRequestConfigured:u}=Z(e),{changeRequestDialogDetails:h,onChangeRequestAddStrategies:m,onChangeRequestAddStrategiesConfirm:j,onChangeRequestAddStrategyClose:y}=Ps(e,s,"addStrategy"),T=(R=!1)=>{i(),c(),a({title:R?"Strategies created":"Strategy created",text:R?"Successfully copied from another environment":"Successfully created strategy",type:"success"})},f=async R=>{var q;const L=((q=d==null?void 0:d.find(z=>z.name===R))==null?void 0:q.strategies)||[];if(u(n)){await m(n,L,R);return}try{await Promise.all(L.map(z=>{const{id:v,...C}={...z,environment:n};return r(e,s,n,C)})),T(!0)}catch(z){o(N(z))}},x=d&&d.length>0;return t.jsxs(t.Fragment,{children:[t.jsx($s,{isOpen:h.isOpen,onClose:y,environment:h==null?void 0:h.environment,onConfirm:j,messageComponent:t.jsx(zr,{fromEnvironment:h.fromEnvironment,payload:h.strategies})}),t.jsxs(Zr,{children:[t.jsx(Xr,{children:"You have not defined any strategies yet."}),t.jsxs(eo,{children:["Strategies added in this environment will only be executed if the SDK is using an"," ",t.jsx(Q,{to:"/admin/api",children:"API key configured"})," for this environment."]}),t.jsxs(K,{sx:{w:"100%",display:"flex",flexWrap:"wrap",gap:2,alignItems:"center",justifyContent:"center"},children:[t.jsx(ut,{label:"Add your first strategy",projectId:e,featureId:s,environmentId:n,matchWidth:x}),t.jsx(b,{condition:x,show:t.jsx(Mr,{environmentId:n,environments:d.map(R=>R.name),onClick:f})})]})]})]})},so=p("div")(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),no=p("div")(({theme:e})=>({[e.breakpoints.down(400)]:{padding:e.spacing(1)}})),ao=({featureEnvironment:e,isDisabled:s,otherEnvironments:n})=>{const r=A("projectId"),a=A("featureId"),{setStrategiesSortOrder:o}=he(),{addChange:i}=ne(),{isChangeRequestConfigured:c}=Z(r),{refetch:l}=te(r),{setToastData:d,setToastApiError:u}=U(),{refetchFeature:h}=M(r,a),[m,j]=g.useState((e==null?void 0:e.strategies)||[]),[y,T]=g.useState(null);if(g.useEffect(()=>{j((e==null?void 0:e.strategies)||[])},[e==null?void 0:e.strategies]),!e)return null;const f=async v=>{try{await o(r,a,e.name,v),h(),d({title:"Order of strategies updated",type:"success"})}catch(C){u(N(C))}},x=async v=>{await i(r,e.name,{action:"reorderStrategy",feature:a,payload:v}),d({title:"Strategy execution order added to draft",type:"success",confetti:!0}),l()},R=async v=>{try{c(e.name)?await x(v):await f(v)}catch(C){u(N(C))}},L=(v,C)=>$=>{var O;T({id:m[C].id,index:C,height:((O=v.current)==null?void 0:O.offsetHeight)||0}),v!=null&&v.current&&($.dataTransfer.effectAllowed="move",$.dataTransfer.setData("text/html",v.current.outerHTML),$.dataTransfer.setDragImage(v.current,20,20))},q=v=>(C,$)=>O=>{if(y===null||C.current===null||y.index===$||v===y.id)return;const{top:V,bottom:G}=C.current.getBoundingClientRect(),Y=O.clientY-V<y.height,S=G-O.clientY<y.height,k=y.index>$;if(Y&&k||S&&!k){const w=[...m],E=w.splice(y.index,1)[0];w.splice($,0,E),j(w),T({...y,index:$})}},z=()=>{T(null),R(m.map((v,C)=>({id:v.id,sortOrder:C})))};return t.jsx(so,{children:t.jsxs(no,{children:[t.jsx(b,{condition:m.length>0&&s,show:()=>t.jsx(ie,{severity:"warning",sx:{mb:2},children:"This environment is disabled, which means that none of your strategies are executing."})}),t.jsx(b,{condition:m.length>0,show:t.jsx(t.Fragment,{children:m.map((v,C)=>t.jsx(Br,{strategy:v,index:C,environmentName:e.name,otherEnvironments:n,isDragging:(y==null?void 0:y.id)===v.id,onDragStartRef:L,onDragOver:q(v.id),onDragEnd:z},v.id))}),elseShow:t.jsx(to,{projectId:r,featureId:a,environmentId:e.name})})]})})},zs=(e,s)=>e===0?0:Math.round(s/e*100);var Ge={},Ke={};Object.defineProperty(Ke,"__esModule",{value:!0});Ke.defaultOptions=void 0;Ke.defaultOptions={lowercase:!1,precision:1,space:!1,units:["","K","M","B","T","P","E"]};var se={};Object.defineProperty(se,"__esModule",{value:!0});se.getLocales=se.getFractionDigits=se.roundTo=se.parseValue=void 0;function ro(e){const s=parseFloat(e==null?void 0:e.toString());if(isNaN(s))throw new Error("Input value is not a number");if(s>Number.MAX_SAFE_INTEGER||s<Number.MIN_SAFE_INTEGER)throw new RangeError("Input value is outside of safe integer range");return s}se.parseValue=ro;function oo(e,s){if(!Number.isFinite(e))throw new Error("Input value is not a finite number");if(!Number.isInteger(s)||s<0)throw new Error("Precision is not a positive integer");return Number.isInteger(e)?e:parseFloat(e.toFixed(s))}se.roundTo=oo;function io(e){var s;if(Number.isInteger(e))return 0;const n=e.toString().split(".")[1];return(s=n==null?void 0:n.length)!==null&&s!==void 0?s:0}se.getFractionDigits=io;function co(){var e;return typeof navigator>"u"?[]:Array.from((e=navigator.languages)!==null&&e!==void 0?e:[])}se.getLocales=co;Object.defineProperty(Ge,"__esModule",{value:!0});Ge.millify=void 0;const qt=Ke,Oe=se,zt=1e3;function*Vt(e){let s=zt;for(;;){const n=e/s;if(n<1)return;yield n,s*=zt}}function Vs(e,s){var n,r;const a=s?{...qt.defaultOptions,...s}:qt.defaultOptions;if(!Array.isArray(a.units)||!a.units.length)throw new Error("Option `units` must be a non-empty array");let o;try{o=Oe.parseValue(e)}catch(y){return y instanceof Error&&console.warn(`WARN: ${y.message} (millify)`),String(e)}const i=o<0?"-":"";o=Math.abs(o);let c=0;for(const y of Vt(o))o=y,c+=1;if(c>=a.units.length)return e.toString();let d=Oe.roundTo(o,a.precision);for(const y of Vt(d))d=y,c+=1;const u=(n=a.units[c])!==null&&n!==void 0?n:"",h=a.lowercase?u.toLowerCase():u,m=a.space?" ":"",j=d.toLocaleString((r=a.locales)!==null&&r!==void 0?r:Oe.getLocales(),{minimumFractionDigits:Oe.getFractionDigits(d)});return`${i}${j}${m}${h}`}Ge.millify=Vs;var lo=Ge.default=Vs;const Ve=({value:e,threshold:s=1e6,precision:n=2})=>{let r,a=!1;e<s?r=e.toLocaleString():(r=lo(e,{precision:n}),a=!0);const o=t.jsx("span",{"data-testid":wn,children:r});return t.jsx(b,{condition:a,show:t.jsx(ee,{title:e.toLocaleString(),arrow:!0,children:o}),elseShow:o})},uo=e=>e>48?`${Math.floor(e/24)} days (UTC)`:`${e} hours (local time)`,et=p("article")(({theme:e})=>({padding:e.spacing(2),background:"transparent",borderRadius:e.spacing(2),textAlign:"center",[e.breakpoints.up("md")]:{padding:e.spacing(4)}})),tt=p("h3")(({theme:e})=>({margin:0,fontSize:e.fontSizes.bodySize,fontWeight:e.fontWeight.thin})),st=p("p")(({theme:e})=>({fontSize:"2.25rem",fontWeight:e.fontWeight.bold,color:e.palette.primary.main})),nt=p("p")(({theme:e})=>({margin:e.spacing(1,0,0,0),padding:e.spacing(2,0,0,0),borderTopWidth:"1px",borderTopStyle:"solid",borderTopColor:e.palette.divider,fontSize:e.fontSizes.smallerBody,color:e.palette.text.secondary})),Ns=({totalYes:e,totalNo:s,hoursBack:n,statsSectionId:r,tableSectionId:a})=>{const o=n===1?"in the last hour":`in the last ${uo(n)}`;return t.jsxs(le,{container:!0,spacing:2,id:r,"aria-describedby":a,"aria-label":"Feature metrics summary",component:"section",children:[t.jsx(le,{item:!0,xs:12,sm:4,children:t.jsxs(et,{children:[t.jsx(tt,{children:"Exposure"}),t.jsx(st,{children:t.jsx(Ve,{value:e})}),t.jsxs(nt,{children:["Total exposure of the feature in the environment"," ",o,"."]})]})}),t.jsx(le,{item:!0,xs:12,sm:4,children:t.jsxs(et,{children:[t.jsx(tt,{children:"Exposure %"}),t.jsxs(st,{children:[zs(e+s,e),"%"]}),t.jsxs(nt,{children:["% total exposure of the feature in the environment"," ",o,"."]})]})}),t.jsx(le,{item:!0,xs:12,sm:4,children:t.jsxs(et,{children:[t.jsx(tt,{children:"Requests"}),t.jsx(st,{children:t.jsx(Ve,{value:e+s})}),t.jsxs(nt,{children:["Total requests for the feature in the environment"," ",o,"."]})]})})]})},po=p("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",margin:"1rem 0",position:"relative","&:before":{content:'""',position:"absolute",top:"50%",transform:"translateY(-50%)",height:2,width:"100%",backgroundColor:e.palette.divider}})),go=p("span")(({theme:e})=>({fontSize:e.fontSizes.bodySize,textAlign:"center",padding:"0 1rem",background:e.palette.envAccordion.expanded,position:"relative",maxWidth:"80%",color:e.palette.text.primary})),ho=({children:e})=>t.jsx(po,{children:t.jsx(go,{children:e})}),fo=({environmentMetric:e})=>e?t.jsxs(t.Fragment,{children:[t.jsx(ho,{children:"Feature toggle exposure"}),t.jsx("div",{children:t.jsx(Ns,{totalYes:e.yes,totalNo:e.no,hoursBack:1})})]}):null,Nt=p("div")({marginLeft:"auto",display:"flex",alignItems:"center"}),Ht=p("div")(({theme:e})=>({marginRight:e.spacing(1),display:"flex",flexDirection:"column"})),Wt=p("p")(({theme:e})=>({color:e.palette.primary.main,textAlign:"right",fontSize:e.fontSizes.bodySize})),Ut=p("p")(({theme:e})=>({maxWidth:"270px",marginTop:e.spacing(.5),fontSize:e.fontSizes.smallBody,textAlign:"right",[e.breakpoints.down(700)]:{display:"none"}})),xo=p(Tn)(({theme:e})=>({fill:e.palette.background.elevation2,height:"75px",width:"75px",[e.breakpoints.down(500)]:{display:"none"}})),mo=p("div")(({theme:e})=>({margin:e.spacing(0,2),[e.breakpoints.down(500)]:{display:"none"}})),yo=({environmentMetric:e,disabled:s=!1})=>{const n=En();if(!e)return null;const r=e.yes+e.no,a=zs(r,e==null?void 0:e.yes);return!e||e.yes===0&&e.no===0?t.jsxs(Nt,{children:[t.jsxs(Ht,{children:[t.jsxs(Wt,{style:{color:s?n.palette.text.secondary:void 0},"data-loading":!0,children:[a,"%"]}),t.jsxs(Ut,{style:{color:s?n.palette.text.secondary:n.palette.text.primary},"data-loading":!0,children:["The feature has been requested ",t.jsx("b",{children:"0 times"})," and exposed",t.jsx("b",{children:" 0 times"})," in the last hour"]})]}),t.jsx(xo,{style:{transform:"scale(1.1)"},"data-loading":!0})]}):t.jsxs(Nt,{children:[t.jsxs(Ht,{children:[t.jsxs(Wt,{children:[a,"%"]}),t.jsxs(Ut,{children:["The feature has been requested"," ",t.jsxs("b",{children:[t.jsx(Ve,{value:r})," times"]})," ","and exposed"," ",t.jsxs("b",{children:[t.jsx(Ve,{value:e.yes})," ","times"]})," ","in the last hour"]})]}),t.jsx(mo,{"data-loading":!0,children:t.jsx(An,{percentage:a,size:"3rem"})})]})},at=({strategy:e})=>{const s=fs(e.name);return t.jsx(ee,{title:Fe(e.name)+(e.title?` - ${e.title}`:""),arrow:!0,children:t.jsx(jo,{children:t.jsx(s,{})})})},jo=p("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"center",color:e.palette.action.disabled,"& svg":{width:e.spacing(2.5),height:e.spacing(2.5)}})),Yt=p("ul")(()=>({all:"unset",display:"flex",alignItems:"center",alignContent:"center"})),rt=p("li")(()=>({all:"unset",minWidth:30,textAlign:"center"})),So=p("div")(({theme:e})=>({display:"flex",flexDirection:"row",alignItems:"center",gap:e.spacing(1)})),Be=5,bo=({strategies:e})=>e!=null&&e.length?e.length>Be+1?t.jsxs(Yt,{"aria-label":"Feature strategies",children:[e.slice(0,Be).map(s=>t.jsx(rt,{children:t.jsx(at,{strategy:s})},s.id)),t.jsxs(ft,{tooltip:e.slice(Be).map(s=>t.jsx(rt,{children:t.jsxs(So,{children:[t.jsx(at,{strategy:s})," ",Fe(s.name)+(s.title?` - ${s.title}`:"")]})},s.id)),children:["(+",e.length-Be,")"]})]}):t.jsx(Yt,{"aria-label":"Feature strategies",children:e.map(s=>t.jsx(rt,{children:t.jsx(at,{strategy:s})},s.id))}):null,Hs=()=>{const{value:e,setValue:s}=Dn("global:v1",{});return{value:{...e,hiddenEnvironments:Array.from(e.hiddenEnvironments||[])},setValue:s}},vo=p("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:s})=>({borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2),backgroundColor:s?e.palette.background.paper:e.palette.envAccordion.disabled})),Co=p(Fn)({boxShadow:"none",background:"none"}),wo=p(Rn)(({theme:e})=>({boxShadow:"none",padding:e.spacing(2,4),[e.breakpoints.down(400)]:{padding:e.spacing(1,2)}})),To=p($n,{shouldForwardProp:e=>e!=="enabled"})(({theme:e})=>({padding:e.spacing(3),background:e.palette.envAccordion.expanded,borderBottomLeftRadius:e.shape.borderRadiusLarge,borderBottomRightRadius:e.shape.borderRadiusLarge,boxShadow:"inset 0px 2px 4px rgba(32, 32, 33, 0.05)",[e.breakpoints.down("md")]:{padding:e.spacing(2,1)}})),Eo=p(ao)(({theme:e})=>({width:"100%",position:"relative",paddingBottom:e.spacing(2)})),Ao=p("div",{shouldForwardProp:e=>e!=="enabled"})(({theme:e,enabled:s})=>({display:"flex",justifyContent:"center",flexDirection:"column",color:s?e.palette.text.primary:e.palette.text.secondary})),Do=p("div")(({theme:e})=>({display:"flex",alignItems:"center",[e.breakpoints.down(560)]:{flexDirection:"column",textAlign:"center"}})),Fo=p(kn)(({theme:e})=>({[e.breakpoints.down(560)]:{marginBottom:"0.5rem"}})),Ro=p(vt)(({theme:e})=>({fontSize:e.fontSizes.bodySize,fontWeight:e.typography.fontWeightMedium,[e.breakpoints.down(560)]:{textAlign:"center"}})),$o=p("div")(({theme:e})=>({display:"flex",alignItems:"center",marginTop:e.spacing(2),gap:e.spacing(2),flexWrap:"wrap",[e.breakpoints.down(560)]:{flexDirection:"column"}})),ko=({env:e})=>{var d;const s=A("projectId"),n=A("featureId"),{metrics:r}=lr(s,n),{feature:a}=M(s,n),{value:o}=Hs(),c=ur(a==null?void 0:a.environments,r).find(u=>u.environment===e.name),l=a==null?void 0:a.environments.find(u=>u.name===e.name);return t.jsx(b,{condition:!new Set(o.hiddenEnvironments).has(e.name),show:t.jsx(vo,{enabled:e.enabled,children:t.jsxs(Co,{TransitionProps:{mountOnEnter:!0},"data-testid":`${In}_${e.name}`,className:`environment-accordion ${e.enabled?"":"accordion-disabled"}`,children:[t.jsxs(wo,{expandIcon:t.jsx(Pn,{titleAccess:"Toggle"}),children:[t.jsxs(Ao,{"data-loading":!0,enabled:e.enabled,children:[t.jsxs(Do,{children:[t.jsx(Fo,{enabled:e.enabled}),t.jsx("div",{children:t.jsx(Ro,{text:e.name,maxWidth:"100",maxLength:15})}),t.jsx(b,{condition:!e.enabled,show:t.jsx(Ee,{color:"neutral",sx:{ml:1},children:"Disabled"})})]}),t.jsxs($o,{children:[t.jsx(ut,{label:"Add strategy",projectId:s,featureId:n,environmentId:e.name,variant:"outlined",size:"small"}),t.jsx(bo,{strategies:l==null?void 0:l.strategies})]})]}),t.jsx(yo,{environmentMetric:c,disabled:!e.enabled})]}),t.jsxs(To,{enabled:e.enabled,children:[t.jsx(Eo,{featureEnvironment:l,isDisabled:!e.enabled,otherEnvironments:a==null?void 0:a.environments.map(({name:u})=>u).filter(u=>u!==e.name)}),t.jsx(b,{condition:(((d=l==null?void 0:l.strategies)==null?void 0:d.length)||0)>0,show:t.jsxs(t.Fragment,{children:[t.jsx(K,{sx:{display:"flex",justifyContent:"center",py:1},children:t.jsx(ut,{label:"Add strategy",projectId:s,featureId:n,environmentId:e.name})}),t.jsx(fo,{environmentMetric:c})]})})]})]})})})},Io=()=>{const e=A("projectId"),s=A("featureId"),{feature:n}=M(e,s);if(!n)return null;const{environments:r}=n;return t.jsx(t.Fragment,{children:r==null?void 0:r.map(a=>t.jsx(ko,{env:a},a.name))})},Ws=e=>{const{makeRequest:s,createRequest:n,errors:r,loading:a}=On({propagateErrors:!0}),o=async(d,u)=>{const h=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"POST",body:JSON.stringify(u)});await s(h.caller,h.id)},i=async(d,u)=>{const h=n(`/api/admin/projects/${e}/features/${d}/dependencies/${u}`,{method:"DELETE"});await s(h.caller,h.id)},c=async d=>{const u=n(`/api/admin/projects/${e}/features/${d}/dependencies`,{method:"DELETE"});await s(u.caller,u.id)},l=[n,s,N,e];return{addDependency:g.useCallback(o,l),removeDependency:g.useCallback(i,l),removeDependencies:g.useCallback(c,l),errors:r,loading:a}},Po=(e,s,n={})=>{const r=ge(`/api/admin/projects/${e}/features/${s}/parents`),{data:a,error:o,mutate:i}=He(r,Oo,n);return{parentOptions:a,error:o,loading:!o&&!a}},Oo=async e=>await(await fetch(e).then(ye("Parent Options"))).json(),Bo=()=>t.jsxs(ie,{severity:"warning",children:["Remember to update your Unleash client! Feature dependencies require new SDK versions. Read more about ",t.jsx(Lo,{}),"."]}),Lo=()=>t.jsx("a",{href:"https://docs.getunleash.io/reference/dependent-features#client-sdk-support",target:"_blank",rel:"noreferrer",children:"Client SDK support for feature dependencies"}),_o=p(ys)(({theme:e})=>({marginTop:e.spacing(2),marginBottom:e.spacing(1.5)})),De={key:"none (remove dependency)",label:"none (remove dependency)"},Mo=({project:e,featureId:s,parent:n,onSelect:r})=>{const{parentOptions:a,loading:o}=Po(e,s),i=a?[De,...a.map(c=>({key:c,label:c}))]:[De];return t.jsx(_o,{fullWidth:!0,options:i,value:n,onChange:r})},qo=(e,s,n,r)=>{const{trackEvent:a}=ae(),{addChange:o}=ne(),{refetch:i}=te(e),{setToastData:c,setToastApiError:l}=U(),{refetchFeature:d}=M(e,s),u=wt(e)(),{isChangeRequestConfiguredInAnyEnv:h}=Z(e),{addDependency:m,removeDependencies:j}=Ws(e),y=async f=>{if(!u){console.error("No change request environment");return}f==="addDependency"&&(await o(e,u,[{action:f,feature:s,payload:{feature:n}}]),a("dependent_features",{props:{eventType:"dependency added"}})),f==="deleteDependency"&&await o(e,u,[{action:f,feature:s,payload:void 0}]),i(),c({text:f==="addDependency"?`${s} will depend on ${n}`:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"})};return async()=>{try{if(h()){const f=n===De.key?"deleteDependency":"addDependency";await y(f),a("dependent_features",{props:{eventType:f==="addDependency"?"add dependency added to change request":"delete dependency added to change request"}})}else n===De.key?(await j(s),a("dependent_features",{props:{eventType:"dependency removed"}}),c({title:"Dependency removed",type:"success"})):(await m(s,{feature:n}),a("dependent_features",{props:{eventType:"dependency added"}}),c({title:"Dependency added",type:"success"}))}catch(f){l(N(f))}await d(),r()}},zo=({project:e,featureId:s,showDependencyDialogue:n,onClose:r})=>{const[a,o]=g.useState(De.key),i=qo(e,s,a,r),{isChangeRequestConfiguredInAnyEnv:c}=Z(e);return t.jsx(oe,{open:n,title:"Add parent feature dependency",onClose:r,onClick:i,primaryButtonText:c()?"Add change to draft":a===De.key?"Remove":"Add",secondaryButtonText:"Cancel",children:t.jsxs(K,{children:[t.jsx(Bo,{}),t.jsx(K,{sx:{mt:2,mb:4},children:"Your feature will be evaluated only when the selected parent feature is enabled in the same environment."}),t.jsx(W,{children:"What feature do you want to depend on?"}),t.jsx(b,{condition:n,show:t.jsx(Mo,{project:e,featureId:s,parent:a,onSelect:o})})]})})},Vo=p(ms)(({theme:e})=>({borderRadius:e.shape.borderRadiusLarge,padding:e.spacing(1,1.5)})),No=({feature:e,onEdit:s,onDelete:n})=>{const r=`dependency-${e}-actions`,a=`${r}-menu`,[o,i]=g.useState(null),c=!!o,l=u=>{i(u.currentTarget)},d=()=>{i(null)};return t.jsxs("span",{children:[t.jsx(ee,{title:"Dependency actions",arrow:!0,describeChild:!0,children:t.jsx($e,{id:r,"aria-controls":c?a:void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,onClick:l,type:"button",children:t.jsx(xs,{})})}),t.jsx(Vo,{id:a,anchorEl:o,open:c,onClose:d,transformOrigin:{horizontal:"right",vertical:"top"},anchorOrigin:{horizontal:"right",vertical:"bottom"},disableScrollLock:!0,children:t.jsxs(Bn,{"aria-labelledby":r,children:[t.jsx(b,{condition:!0,show:t.jsxs(ue,{onClick:()=>{s(),d()},children:[t.jsx(Te,{children:t.jsx(we,{})}),t.jsx(me,{children:t.jsx(W,{variant:"body2",children:"Edit"})})]})}),t.jsx(b,{condition:!0,show:t.jsxs(ue,{onClick:()=>{n(),d()},children:[t.jsx(Te,{children:t.jsx(Ln,{})}),t.jsx(me,{children:t.jsx(W,{variant:"body2",children:"Delete"})})]})})]})})]})},Us=({childFeatures:e,project:s})=>t.jsx(ft,{tooltip:t.jsx(t.Fragment,{children:e.map(n=>t.jsx(Dt,{to:`/projects/${s}/features/${n}`,children:t.jsx("div",{children:n})},`${s}-${n}`))}),children:e.length===1?"1 feature":`${e.length} features`}),Ho=(e,s)=>{const{trackEvent:n}=ae(),{addChange:r}=ne(),{refetch:a}=te(e),{setToastData:o,setToastApiError:i}=U(),{refetchFeature:c}=M(e,s),l=wt(e)(),{isChangeRequestConfiguredInAnyEnv:d}=Z(e),{removeDependencies:u}=Ws(e),h=async()=>{if(!l){console.error("No change request environment");return}await r(e,l,[{action:"deleteDependency",feature:s,payload:void 0}])};return async()=>{try{d()?(await h(),n("dependent_features",{props:{eventType:"delete dependency added to change request"}}),o({text:`${s} dependency will be removed`,type:"success",title:"Change added to a draft"}),await a()):(await u(s),n("dependent_features",{props:{eventType:"dependency removed"}}),o({title:"Dependency removed",type:"success"}),await c())}catch(j){i(N(j))}}},Wo=({feature:e})=>{var d,u;const[s,n]=g.useState(!1),r=!!e.project&&e.dependencies.length===0&&e.children.length===0,a=!!e.project&&e.dependencies.length>0,o=!!e.project&&e.children.length>0,i=wt(e.project)(),c=rs(e.project),l=Ho(e.project,e.name);return t.jsxs(t.Fragment,{children:[t.jsx(b,{condition:r,show:t.jsx(Me,{children:t.jsxs(qe,{children:[t.jsx(ze,{children:"Dependency:"}),t.jsx(pe,{permission:Rt,projectId:e.project,variant:"text",onClick:()=>{n(!0)},children:"Add parent feature"})]})})}),t.jsx(b,{condition:a,show:t.jsxs(Me,{children:[t.jsxs(qe,{children:[t.jsx(ze,{children:"Dependency:"}),t.jsx(Dt,{to:`/projects/${e.project}/features/${(d=e.dependencies[0])==null?void 0:d.feature}`,children:(u=e.dependencies[0])==null?void 0:u.feature})]}),t.jsx(b,{condition:c(Rt,i),show:t.jsx(No,{feature:e.name,onEdit:()=>n(!0),onDelete:l})})]})}),t.jsx(b,{condition:o,show:t.jsx(Me,{children:t.jsxs(qe,{children:[t.jsx(ze,{children:"Children:"}),t.jsx(Us,{childFeatures:e.children,project:e.project})]})})}),t.jsx(b,{condition:!!e.project,show:t.jsx(zo,{project:e.project,featureId:e.name,onClose:()=>n(!1),showDependencyDialogue:s})})]})},Uo=(e,s={})=>{const n=ge(`/api/admin/projects/${e}/dependencies`),{data:r,error:a}=js(e,!1,n,Yo,s);return{dependenciesExist:r,error:a,loading:!a&&!r}},Yo=async e=>await(await fetch(e).then(ye("Dependencies exist check"))).json(),Go=e=>{const{dependenciesExist:s}=Uo(e),{isOss:n}=fe();return!!(!n()||s)},Ko=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",justifyItems:"center",padding:e.spacing(3),fontSize:e.fontSizes.smallBody})),Jo=({feature:e,header:s})=>{var o;const{locationSettings:n}=Ss();fe();const r=Go(e.project),a=(o=e.environments)==null?void 0:o.map(i=>({name:i.name,lastSeenAt:i.lastSeenAt,enabled:i.enabled}));return t.jsxs(Ko,{children:[s,t.jsxs(Me,{children:[t.jsxs(qe,{children:[t.jsx(ze,{children:"Created at:"}),t.jsx("span",{children:_n(bs(e.createdAt),n.locale)})]}),t.jsx(Mn,{featureLastSeen:e.lastSeenAt,environments:a,sx:{p:0}})]}),t.jsx(b,{condition:r,show:t.jsx(Wo,{feature:e})})]})},Qo=p($e,{shouldForwardProp:e=>e!=="visibilityOff"})(({theme:e,visibilityOff:s})=>({marginLeft:"auto",marginRight:e.spacing(-1),color:s?e.palette.action.active:e.palette.action.focus,"&:hover":{color:e.palette.action.active}})),Zo=({environment:e,hiddenEnvironments:s,setHiddenEnvironments:n})=>{const r=()=>{n(e.name)};return t.jsx(Qo,{onClick:r,visibilityOff:s.has(e.name),children:t.jsx(b,{condition:s.has(e.name),show:t.jsx(qn,{}),elseShow:t.jsx(zn,{})})})},Xo=p("div")(({theme:e})=>({marginLeft:e.spacing(-1.5),"&:not(:last-of-type)":{marginBottom:e.spacing(2)},display:"flex",alignItems:"center"})),ei=p("label")(()=>({display:"inline-flex",alignItems:"center",cursor:"pointer"})),ti=({environment:e,callback:s,children:n,hiddenEnvironments:r,setHiddenEnvironments:a})=>{const o=A("projectId"),i=A("featureId"),{feature:c,refetchFeature:l}=M(o,i),{isChangeRequestConfigured:d}=Z(o),u=t.jsxs(t.Fragment,{children:[" ",t.jsxs("span",{"data-loading":!0,children:[e.enabled?"enabled":"disabled"," in"]})," ",t.jsx(vt,{text:e.name,maxWidth:"120",maxLength:15})]}),{onToggle:h,modals:m}=za(o),j=(y,T)=>h(y,{projectId:o,featureId:i,environmentName:e.name,environmentType:e.type,hasStrategies:e.strategies.length>0,hasEnabledStrategies:e.strategies.some(f=>!f.disabled),isChangeRequestEnabled:d(e.name),onRollback:T,onSuccess:()=>{s&&s(),l()}});return t.jsxs(Xo,{children:[t.jsxs(ei,{children:[t.jsx(Va,{featureId:c.name,projectId:o,environmentName:e.name,onToggle:j,value:e.enabled}),n??u]}),t.jsx(Zo,{environment:e,hiddenEnvironments:r,setHiddenEnvironments:a}),m]})},si=p("div")(({theme:e})=>({padding:e.spacing(3)})),ni=p("div")(()=>({display:"flex",flexDirection:"column"})),ai=p("p")(({theme:e})=>({fontSize:e.fontSizes.bodySize})),ri=p("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,display:"flex",alignItems:"center"})),Gt=p("span")(({theme:e})=>({padding:e.spacing(0,.5),"::after":{content:'"-"'}})),oi=p(Tt)(()=>({"&:hover, &:focus":{textDecoration:"underline"}})),ii=({feature:e,header:s,hiddenEnvironments:n,setHiddenEnvironments:r})=>{const a=e.environments.some(o=>{var i;return o.enabled&&((i=o.variants)==null?void 0:i.length)});return t.jsxs(si,{"data-testid":"feature-toggle-status",children:[s,e.environments.map(o=>{const i=o.strategies.length===1?"1 strategy":`${o.strategies.length} strategies`,c=o.variants??[],l=c.length>0&&t.jsxs(t.Fragment,{children:[t.jsx(Gt,{}),t.jsx(ee,{title:"View variants",arrow:!0,describeChild:!0,children:t.jsx(oi,{component:Q,to:`/projects/${e.project}/features/${e.name}/variants`,underline:"hover",children:c.length===1?"1 variant":`${c.length} variants`})})]}),d=o.enabled&&c.length===0&&a;return t.jsx(ti,{environment:o,hiddenEnvironments:n,setHiddenEnvironments:r,children:t.jsxs(ni,{children:[t.jsx(ai,{children:o.name}),t.jsxs(ri,{children:[i,l,t.jsx(b,{condition:d,show:t.jsxs(t.Fragment,{children:[t.jsx(Gt,{}),t.jsx(Na,{})]})})]})]})},o.name)})]})},Ys=(e,s={})=>{const n=async()=>{const d=ge(`api/admin/features/${e}/tags`);return(await fetch(d,{method:"GET"}).then(ye("Tags"))).json()},r=`api/admin/features/${e}/tags`,{data:a,error:o}=js(!!e,{tags:[]},r,n,s),[i,c]=g.useState(!o&&!a),l=()=>{gt(r)};return g.useEffect(()=>{c(!o&&!a)},[a,o]),{tags:(a==null?void 0:a.tags)||[],error:o,loading:i,refetch:l}},ci=p("section")(({theme:e})=>({"& > *":{margin:e.spacing(1,0)}})),ot=e=>e.map(s=>({title:s.value})),Kt=(e,s)=>e.map(n=>({value:n.title,type:s})),Gs=({open:e,setOpen:s})=>{const{tagTypes:n}=Vn(),r=A("featureId"),{createTag:a}=Ha(),{updateFeatureTags:o,loading:i}=Ye(),{tags:c,refetch:l,loading:d}=Ys(r),{setToastData:u}=U(),h=n&&n.length>0?n[0]:{name:"simple",description:"Simple tag to get you started",icon:""},[m,j]=g.useState(h),y=i||d,[T,f]=g.useState(0),{trackEvent:x}=ae(),[R,L]=g.useState(ot(c.filter(E=>E.type===m.name))),{tags:q,refetch:z}=Wa(m.name),v=g.useMemo(()=>ot(q),[q]);g.useEffect(()=>{c&&m&&L(ot(c.filter(E=>E.type===m.name)))},[JSON.stringify(c),m]);const C=()=>{s(!1),L([])};function $(E,F){const B=E.filter(_=>_.type===m.name).filter(_=>!F.find(P=>_.value===P.value&&_.type===P.type)),I=F.filter(_=>_.type===m.name).filter(_=>!E.find(P=>_.value===P.value&&_.type===P.type));return f(B.length+I.length),{added:B,removed:I}}const O=E=>E.filter(F=>!F.title.startsWith("Create")),V=async(E,F)=>{try{await o(r,{addedTags:E,removedTags:F}),await l()}catch(B){const I=N(B);u({type:"error",title:"Failed to add tag",text:I,confetti:!1})}},G=(E,F)=>{let B="We successfully";return E>0&&(B=B.concat(` added ${E} new tag${E>1?"s":""}`)),E>0&&F>0&&(B=B.concat(" and ")),F>0&&(B=B.concat(` removed ${F} tag${F>1?"s":""}`)),B},Y=async E=>{E.preventDefault();const F=Kt(O(R),m.name),{added:B,removed:I}=$(F,c);T>0&&(await V(B,I),T>1&&x("suggest_tags",{props:{eventType:"multiple_tags_added"}}),T>0&&u({type:"success",title:`Updated tag${B.length>1?"s":""} to toggle`,text:G(B.length,I.length),confetti:!0})),f(0),L([]),s(!1)},S=(E,F)=>{F!=null&&typeof F!="string"&&(E.preventDefault(),j(F),L([]),f(0))},k=(E,F,B)=>{const I=Nn(F);B==="selectOption"&&F.forEach((P,H)=>{if(typeof P!="string"&&P.inputValue&&P.inputValue!==""){const J={value:P.inputValue,type:m.name};a(J).then(()=>{x("suggest_tags",{props:{eventType:"tag_created"}}),z()}),P.title=P.inputValue,P.inputValue="",I[H]=P}});const _=Kt(O(I),m.name);$(_,c),L(I)},w="add-tag-form";return t.jsx(oe,{open:e,secondaryButtonText:"Cancel",primaryButtonText:"Save tags",title:"Update feature toggle tags",onClick:Y,disabledPrimaryButton:y||T===0,onClose:C,formId:w,children:t.jsxs(t.Fragment,{children:[t.jsx(W,{paragraph:!0,sx:{marginBottom:E=>E.spacing(2.5)},children:"Tags allow you to group features together"}),t.jsx("form",{id:w,onSubmit:Y,children:t.jsxs(ci,{children:[t.jsx(Ua,{options:n,value:m,onChange:S}),t.jsx(Ya,{options:v,existingTags:c,tagType:m,selectedOptions:R,onChange:k})]})})]})})},li=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",padding:e.spacing(3)})),di=p("div")(({theme:e})=>({display:"flex",gap:e.spacing(1),flexWrap:"wrap"})),ui=p(vs)(({theme:e})=>({fontSize:e.fontSizes.smallBody})),pi=p(Re)(({theme:e})=>({margin:e.spacing(3),borderStyle:"dashed"})),gi=p(je)(({theme:e})=>({maxWidth:e.spacing(20),alignSelf:"center"})),hi=({feature:e,header:s})=>{const{tags:n,refetch:r}=Ys(e.name),{deleteTagFromFeature:a}=Ye(),[o,i]=g.useState(!1),[c,l]=g.useState(!1),[d,u]=g.useState(),{setToastData:h,setToastApiError:m}=U(),{hasAccess:j}=g.useContext(xt),y=j(Ce,e.project),T=async()=>{if(d)try{await a(e.name,d.type,d.value),r(),h({type:"success",title:"Tag deleted",text:"Successfully deleted tag"})}catch(f){m(N(f))}};return t.jsxs(li,{children:[s,t.jsx(di,{children:n.map(f=>{const x=`${f.type}:${f.value}`;return t.jsx(ui,{label:x,deleteIcon:t.jsx(Hn,{titleAccess:"Remove"}),onDelete:y?()=>{l(!0),u(f)}:void 0},x)})}),t.jsx(b,{condition:y,show:t.jsxs(t.Fragment,{children:[t.jsx(b,{condition:n.length>0,show:t.jsx(pi,{})}),t.jsx(gi,{"data-loading":!0,variant:"outlined",startIcon:t.jsx(Wn,{}),onClick:()=>i(!0),children:"Add new tag"})]})}),t.jsx(Gs,{open:o,setOpen:i}),t.jsxs(oe,{open:c,primaryButtonText:"Delete tag",secondaryButtonText:"Cancel",onClose:()=>{l(!1),u(void 0)},onClick:()=>{l(!1),T(),u(void 0)},title:"Delete tag?",children:["You are about to delete tag:"," ",t.jsxs("strong",{children:[d==null?void 0:d.type,":",d==null?void 0:d.value]})]})]})},fi=p(K)(({theme:e})=>({top:e.spacing(2),borderRadius:e.shape.borderRadiusLarge,backgroundColor:e.palette.background.paper,display:"flex",flexDirection:"column",maxWidth:"350px",minWidth:"350px",marginRight:"1rem",marginTop:"1rem",[e.breakpoints.down(1e3)]:{marginBottom:"1rem",width:"100%",maxWidth:"none",minWidth:"auto"}})),it=p("h3")(({theme:e})=>({display:"flex",gap:e.spacing(1),alignItems:"center",fontSize:e.fontSizes.bodySize,margin:0,marginBottom:e.spacing(3),"& > :last-child":{position:"relative",top:1}})),xi=({hiddenEnvironments:e,setHiddenEnvironments:s})=>{var i;const n=A("projectId"),r=A("featureId"),{feature:a}=M(n,r),o=((i=a.environments)==null?void 0:i.length)<=3;return t.jsxs(fi,{as:o?Un:K,children:[t.jsx(ii,{header:t.jsxs(it,{"data-loading":!0,children:["Enabled in environments (",a.environments.filter(({enabled:c})=>c).length,")",t.jsx(Yn,{tooltip:"When a feature is switched off in an environment, it will always return false. When switched on, it will return true or false depending on its strategies.",placement:"top"})]}),feature:a,hiddenEnvironments:e,setHiddenEnvironments:s}),t.jsx(Re,{}),t.jsx(Jo,{header:t.jsx(it,{"data-loading":!0,children:"Feature toggle details"}),feature:a}),t.jsx(Re,{}),t.jsx(hi,{header:t.jsx(it,{"data-loading":!0,children:"Tags for this feature toggle"}),feature:a})]})},mi=()=>{const{trackEvent:e}=ae(),{value:s,setValue:n}=Hs(),[r,a]=g.useState(new Set(s.hiddenEnvironments));return{hiddenEnvironments:r,setHiddenEnvironments:i=>{n(c=>{const l=new Set(Array.from(c.hiddenEnvironments||[]));return l.has(i)?(l.delete(i),e("hidden_environment",{props:{eventType:"environment unhidden"}})):(l.add(i),e("hidden_environment",{props:{eventType:"environment hidden"}})),a(l),{...s,hiddenEnvironments:[...l]}})}}},yi=()=>{const[e,s]=g.useState(0),n=A("projectId"),r=A("featureId"),a=Ae("environmentId"),o=Ae("strategyName"),{strategy:i,defaultStrategyFallback:c}=ks(n,a),l=JSON.parse(ds().get("defaultStrategy")||"false"),{segments:d}=mt(),u=(d||[]).filter(J=>{var D;return(D=i==null?void 0:i.segments)==null?void 0:D.includes(J.id)}),[h,m]=g.useState({}),[j,y]=g.useState(l?u:[]),{strategyDefinition:T}=yt(o),f=jt(),{addStrategyToFeature:x,loading:R}=he(),{addChange:L}=ne(),{setToastData:q,setToastApiError:z}=U(),{uiConfig:v}=fe(),{unleashUrl:C}=v,$=ce(),{feature:O,refetchFeature:V}=M(n,r),G=g.useRef(O),{isChangeRequestConfigured:Y}=Z(n),{refetch:S}=te(n),{trackEvent:k}=ae(),{data:w,staleDataNotification:E,forceRefreshCache:F}=St({unleashGetter:M,params:[n,r],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},O,{afterSubmitAction:V},bt);g.useEffect(()=>{G.current.name===""&&O.name&&(F(O),G.current=O)},[O.name]),g.useEffect(()=>{var J;if(l){const D=i||c;((J=D.parameters)==null?void 0:J.groupId)===""&&r?m({...D,parameters:{...D.parameters,groupId:r}}):m(D)}else T&&m(Ms(r,T))},[r,JSON.stringify(T),l]);const B=async J=>{await x(n,r,a,J),q({title:"Strategy created",type:"success",confetti:!0})},I=async J=>{await L(n,a,{action:"addStrategy",feature:r,payload:J}),q({title:"Strategy added to draft",type:"success",confetti:!0}),S()},_=us(h,j),P=async()=>{k("strategyTitle",{props:{hasTitle:!!h.title,on:"create"}});try{Y(a)?await I(_):await B(_),V(),$(We(n,r))}catch(J){z(N(J))}};return!w||!w.project?null:t.jsxs(Ue,{modal:!0,description:ps,documentationLink:gs,documentationLinkLabel:hs,disablePadding:!0,formatApiCode:()=>ji(n,r,a,_,C),children:[t.jsx(Cs,{projectId:n,feature:w,strategy:h,setStrategy:m,segments:j,setSegments:y,environmentId:a,onSubmit:P,loading:R,permission:de,errors:f,isChangeRequest:Y(a),tab:e,setTab:s,StrategyVariants:t.jsx(ws,{strategy:h,setStrategy:m,environment:a,projectId:n,editable:!0})}),E]})},ji=(e,s,n,r,a)=>{if(!a)return"";const o=`${a}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies`,i=JSON.stringify(r,void 0,2);return`curl --location --request POST '${o}' \\
5
+ --header 'Authorization: INSERT_API_KEY' \\
6
+ --header 'Content-Type: application/json' \\
7
+ --data-raw '${i}'`},Si=()=>{const[e,s]=g.useState(""),{trackEvent:n}=ae();return{setPreviousTitle:s,trackTitle:(a="")=>{a===e&&n("strategyTitle",{props:{action:"none",on:"edit"}}),e===""&&a!==""&&n("strategyTitle",{props:{action:"added",on:"edit"}}),e!==""&&a===""&&n("strategyTitle",{props:{action:"removed",on:"edit"}}),e!==""&&a!==""&&a!==e&&n("strategyTitle",{props:{action:"edited",on:"edit"}})}}},bi=e=>{if(e)return e==null?void 0:e.constraints.map(s=>({...s,[Kn]:_e()}))},vi=()=>{const e=A("projectId"),s=A("featureId"),n=Ae("environmentId"),r=Ae("strategyId"),[a,o]=g.useState(0),[i,c]=g.useState({}),[l,d]=g.useState([]),{updateStrategyOnFeature:u,loading:h}=he(),{strategyDefinition:m}=yt(i.name),{setToastData:j,setToastApiError:y}=U(),T=jt(),{uiConfig:f}=fe(),{unleashUrl:x}=f,R=ce(),{addChange:L}=ne(),{isChangeRequestConfigured:q}=Z(e),{refetch:z}=te(e),{setPreviousTitle:v}=Si(),{feature:C,refetchFeature:$}=M(e,s),O=g.useRef(C),{data:V,staleDataNotification:G,forceRefreshCache:Y}=St({unleashGetter:M,params:[e,s],dataKey:"feature",refetchFunctionKey:"refetchFeature",options:{}},C,{afterSubmitAction:$},bt);g.useEffect(()=>{O.current.name===""&&C.name&&(Y(C),O.current=C)},[C]);const{segments:S,refetchSegments:k}=mt(r);g.useEffect(()=>{const I=V==null?void 0:V.environments.flatMap(H=>H.strategies).find(H=>H.id===r),_=bi(I),P={...I,constraints:_};c(H=>({...H,...P})),v((I==null?void 0:I.title)||"")},[r,V]),g.useEffect(()=>{S&&d(S)},[JSON.stringify(S)]);const w=Ci(i,l),E=async I=>{await u(e,s,n,r,I),await k(),j({title:"Strategy updated",type:"success",confetti:!0})},F=async I=>{await L(e,n,{action:"updateStrategy",feature:s,payload:{...I,id:r}}),j({title:"Change added to draft",type:"success",confetti:!0}),z()},B=async()=>{try{q(n)?await F(w):await E(w),$(),R(wi(e,s))}catch(I){y(N(I))}};return!i.id||!m||!V?null:t.jsxs(Ue,{modal:!0,disablePadding:!0,description:Ei,documentationLink:Ai,documentationLinkLabel:Di,formatApiCode:()=>Ti(e,s,n,r,w,m,x),children:[t.jsx(Cs,{projectId:e,feature:V,strategy:i,setStrategy:c,segments:l,setSegments:d,environmentId:n,onSubmit:B,loading:h,permission:cs,errors:T,isChangeRequest:q(n),tab:a,setTab:o,StrategyVariants:t.jsx(ws,{strategy:i,setStrategy:c,environment:n,projectId:e})}),G]})},Ci=(e,s)=>({name:e.name,title:e.title,constraints:e.constraints??[],parameters:e.parameters??{},variants:e.variants??[],segments:s.map(n=>n.id),disabled:e.disabled??!1}),wi=(e,s)=>`/projects/${e}/features/${s}`,Ti=(e,s,n,r,a,o,i)=>{if(!i)return"";const c={...a,parameters:Gn(a.parameters??{},o)},l=`${i}/api/admin/projects/${e}/features/${s}/environments/${n}/strategies/${r}`,d=JSON.stringify(c,void 0,2);return`curl --location --request PUT '${l}' \\
8
+ --header 'Authorization: INSERT_API_KEY' \\
9
+ --header 'Content-Type: application/json' \\
10
+ --data-raw '${d}'`},Ei=`
11
+ An activation strategy will only run when a feature toggle is enabled and provides a way to control who will get access to the feature.
12
+ If any of a feature toggle's activation strategies returns true, the user will get access.
13
+ `,Ai="https://docs.getunleash.io/reference/activation-strategies",Di="Strategies documentation",Fi=p("div")(({theme:e})=>({display:"flex",width:"100%",[e.breakpoints.down(1e3)]:{flexDirection:"column"}})),Ri=p("div")(({theme:e})=>({display:"flex",flexDirection:"column",width:"calc(100% - (350px + 1rem))",[e.breakpoints.down(1e3)]:{width:"100%"}})),$i=()=>{const e=ce(),s=A("projectId"),n=A("featureId"),r=We(s,n),{hiddenEnvironments:a,setHiddenEnvironments:o}=mi(),i=()=>e(r);Ts(n);const c=Es("newStrategyConfiguration");return t.jsxs(Fi,{children:[t.jsxs("div",{children:[t.jsx(cr,{}),t.jsx(xi,{hiddenEnvironments:a,setHiddenEnvironments:o})]}),t.jsx(Ri,{children:t.jsx(Io,{})}),t.jsxs(As,{children:[t.jsx(xe,{path:"strategies/create",element:t.jsx(dt,{label:"Create feature strategy",onClose:i,open:!0,children:t.jsx(b,{condition:c,show:t.jsx(yi,{}),elseShow:t.jsx(Nr,{})})})}),t.jsx(xe,{path:"strategies/edit",element:t.jsx(dt,{label:"Edit feature strategy",onClose:i,open:!0,children:t.jsx(b,{condition:c,show:t.jsx(vi,{}),elseShow:t.jsx(Jn,{})})})})]})]})},ki=p("div")(({theme:e})=>({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"},marginTop:e.spacing(-3.5),marginBottom:e.spacing(2),backgroundColor:e.palette.background.default,paddingTop:e.spacing(2),paddingBottom:e.spacing(2),position:"sticky",top:0,zIndex:2})),Ii=p(Ds,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Pi=p("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontSize:e.fontSizes.mainHeader,fontWeight:e.fontWeight.bold})),Oi=p("form")(()=>({display:"flex",flexDirection:"column",height:"100%"})),Bi=p(ie)(({theme:e})=>({marginBottom:e.spacing(2)})),Li=p(ie)(({theme:e})=>({marginTop:e.spacing(4)})),_i=p("div")({display:"flex",flexDirection:"column"}),Mi=p("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),Jt=p("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),qi=p(Re)(({theme:e})=>({margin:e.spacing(4,0)})),zi=p(Qn)(({theme:e})=>({minWidth:e.spacing(20),width:"100%"})),Vi=p("div")(({theme:e})=>({marginTop:"auto",paddingTop:e.spacing(4),display:"flex",justifyContent:"flex-end"})),Ni=p(je)(({theme:e})=>({marginLeft:e.spacing(3)})),Hi=g.memo(Zn),Wi=({environment:e,open:s,setOpen:n,getApiPayload:r,getCrPayload:a,onConfirm:o})=>{const i=A("projectId"),c=A("featureId"),{uiConfig:l}=fe(),{context:d}=Xn(),{defaultStickiness:u,loading:h}=ea(i),{isChangeRequestConfigured:m}=Z(i),{data:j}=te(i),{changeRequestInReviewOrApproved:y,alert:T}=sa(j),f=(e==null?void 0:e.variants)||[],[x,R]=g.useState([]),[L,q]=g.useState();g.useEffect(()=>{h||R(f.length?f.map(D=>({...D,isValid:!0,new:!1,id:_e()})):[{name:"",weightType:$t.VARIABLE,weight:0,overrides:[],stickiness:(x==null?void 0:x.length)>0?x[0].stickiness:u,new:!0,isValid:!1,id:_e()}])},[s,h]);const z=(D,X)=>{R(Se=>kt(Se.map(Pe=>Pe.id===X?D:Pe),1e3))},v=()=>{const D=_e();R(X=>[...X,{name:"",weightType:$t.VARIABLE,weight:0,overrides:[],stickiness:(X==null?void 0:X.length)>0?X[0].stickiness:u,new:!0,isValid:!1,id:D}]),q(D)};g.useEffect(()=>{if(L){const D=document.getElementById(`variant-name-input-${L}`);D==null||D.scrollIntoView({behavior:"smooth",block:"center"}),D==null||D.focus({preventScroll:!0}),q(void 0)}},[L]);const C=x.map(({new:D,isValid:X,id:Se,...Pe})=>Pe),$=r(f,C),O=a(C),V=async D=>{D.preventDefault(),o(C)},G=()=>w?`curl --location --request POST '${l.unleashUrl}/api/admin/projects/${i}/environments/${e==null?void 0:e.name}/change-requests' \\
14
+ --header 'Authorization: INSERT_API_KEY' \\
15
+ --header 'Content-Type: application/json' \\
16
+ --data-raw '${JSON.stringify(O,void 0,2)}'`:`curl --location --request PATCH '${l.unleashUrl}/api/admin/projects/${i}/features/${c}/environments/${e==null?void 0:e.name}/variants' \\
17
+ --header 'Authorization: INSERT_API_KEY' \\
18
+ --header 'Content-Type: application/json' \\
19
+ --data-raw '${JSON.stringify($.patch,void 0,2)}'`,Y=x.every(({isValid:D})=>D),S=y((e==null?void 0:e.name)||""),k=S?"Add to existing change request":"Add change to draft",w=m((e==null?void 0:e.name)||""),E=g.useMemo(()=>{var D;return h?"":((D=C[0])==null?void 0:D.stickiness)||u},[h,u,JSON.stringify(C[0]??{})]),F=g.useMemo(()=>["default",...d.filter(D=>D.stickiness).map(D=>D.name)],[d]),B=F.map(D=>({key:D,label:D}));F.includes(E)||B.push({key:E,label:E});const I=async D=>{R(X=>X.map(Se=>({...Se,stickiness:D})))},_=D=>{I(D)},[P,H]=g.useState();g.useEffect(()=>{H(void 0),$.error&&H($.error)},[$.error]);const J=()=>{I(u),n(!1)};return h||E===""?t.jsx(ta,{}):t.jsx(dt,{open:s,onClose:J,label:"",children:t.jsxs(Ue,{modal:!0,title:"",description:"Variants allow you to return a variant object if the feature toggle is considered enabled for the current request.",documentationLink:"https://docs.getunleash.io/reference/feature-toggle-variants",documentationLinkLabel:"Feature toggle variants documentation",formatApiCode:G,loading:!s,children:[t.jsxs(ki,{children:[t.jsxs("div",{children:[t.jsx(Ii,{deprecated:!(e!=null&&e.enabled)}),t.jsx(Pi,{deprecated:!(e!=null&&e.enabled),children:e==null?void 0:e.name})]}),t.jsx(pe,{"data-testid":"MODAL_ADD_VARIANT_BUTTON",onClick:v,variant:"outlined",permission:be,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"})]}),t.jsxs(Oi,{onSubmit:V,children:[t.jsx(b,{condition:S,show:T,elseShow:t.jsx(b,{condition:!!w,show:t.jsxs(Bi,{severity:"info",children:[t.jsx("strong",{children:"Change requests"})," are enabled",e?` for ${e.name}`:"",". Your changes need to be approved before they will be live. All the changes you do now will be added into a draft that you can submit for review."]})})}),t.jsx(_i,{children:x.map(D=>t.jsx(Hi,{variant:D,variants:x,updateVariant:X=>z(X,D.id),removeVariant:()=>R(X=>kt(X.filter(Se=>Se.id!==D.id),1e3)),error:$.error},D.id))}),t.jsx(pe,{onClick:v,variant:"outlined",permission:be,projectId:i,environmentId:e==null?void 0:e.name,children:"Add variant"}),t.jsx(qi,{}),t.jsx(b,{condition:x.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(Mi,{children:t.jsx("p",{children:"Stickiness"})}),t.jsxs(Jt,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Tt,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]}),t.jsx("div",{children:t.jsx(zi,{value:E,label:"",editable:!0,onChange:D=>_(D.target.value)})})]}),elseShow:t.jsx(Jt,{children:"This environment has no variants. Get started by adding a variant."})}),t.jsxs(Li,{severity:"error",hidden:!P,children:[t.jsx("strong",{children:"Error: "}),P]}),t.jsxs(Vi,{children:[t.jsx(je,{"data-testid":"DIALOGUE_CONFIRM_ID",type:"submit",variant:"contained",color:"primary",disabled:!Y,children:w?k:"Save variants"}),t.jsx(Ni,{onClick:J,children:"Cancel"})]})]})]})})},Ui=e=>fetch(e).then(ye("ChangeRequest")).then(s=>s.json()),Yi=(e,s)=>{const{data:n,error:r,mutate:a}=ls([],ge(`api/admin/projects/${e}/change-requests/scheduled?variantForFlag=${s}`),Ui);return{changeRequests:n,loading:!r&&!n,refetch:a,error:r}},Gi=(e,s,n)=>{const{changeRequests:r}=Yi(e,s),a=r==null?void 0:r.filter(o=>o.environment===n);return a?a.map(o=>o.id):[]},Ki=p("div")(({theme:e})=>({padding:e.spacing(3),borderRadius:e.shape.borderRadiusLarge,border:`1px solid ${e.palette.divider}`,"&:not(:last-child)":{marginBottom:e.spacing(3)}})),Ji=p("div")({display:"flex",alignItems:"center",justifyContent:"space-between","& > div":{display:"flex",alignItems:"center"}}),Qi=p(Ds,{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.neutral.border:e.palette.primary.main})),Zi=p("span",{shouldForwardProp:e=>e!=="deprecated"})(({theme:e,deprecated:s})=>({color:s?e.palette.text.secondary:e.palette.text.primary,marginLeft:e.spacing(1.25),fontWeight:e.fontWeight.bold})),Xi=p("p")(({theme:e})=>({fontSize:e.fontSizes.smallBody,color:e.palette.text.secondary,marginBottom:e.spacing(1.5)})),ec=p("div")(({theme:e})=>({margin:e.spacing(3,0)})),tc=p("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1.5),marginBottom:e.spacing(.5)})),sc=({environment:e,searchValue:s,children:n})=>{var l;const r=A("projectId"),a=A("featureId"),o=Gi(r,a,e.name),i=e.variants??[],c=((l=i[0])==null?void 0:l.stickiness)||"default";return t.jsxs(Ki,{children:[t.jsxs(Ji,{children:[t.jsxs("div",{children:[t.jsx(Qi,{deprecated:!e.enabled}),t.jsx(Zi,{deprecated:!e.enabled,children:e.name}),t.jsx(b,{condition:o.length>0,show:t.jsx(na,{sx:{ml:2},children:t.jsx(_s,{scheduledChangeRequestIds:o})})})]}),n]}),t.jsx(b,{condition:i.length>0,show:t.jsxs(t.Fragment,{children:[t.jsx(ec,{children:t.jsx(aa,{variants:i,searchValue:s})}),t.jsx(b,{condition:i.length>1,show:t.jsxs(t.Fragment,{children:[t.jsxs(tc,{children:[t.jsx("p",{children:"Stickiness:"}),t.jsx(Ee,{children:c})]}),t.jsxs(Xi,{children:["By overriding the stickiness you can control which parameter is used to ensure consistent traffic allocation across variants."," ",t.jsx(Tt,{href:"https://docs.getunleash.io/reference/feature-toggle-variants",target:"_blank",rel:"noreferrer",children:"Read more"})]})]})})]})})]})},nc=p(me)(({theme:e})=>({"& span":{fontSize:e.fontSizes.smallBody}})),ac=({environment:e,permission:s,projectId:n,environmentId:r,onCopyVariantsFrom:a,otherEnvsWithVariants:o})=>{const[i,c]=g.useState(null),l=!!i,d=e.variants??[];return t.jsx(b,{condition:o.length>0&&d.length===0,show:t.jsxs(t.Fragment,{children:[t.jsx(pe,{onClick:u=>{c(u.currentTarget)},id:`copy-from-menu-${e.name}`,"aria-controls":l?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":l?"true":void 0,variant:"outlined",permission:s,projectId:n,environmentId:r,children:"Copy variants from"}),t.jsx(ke,{anchorEl:i,open:l,onClose:()=>c(null),MenuListProps:{"aria-labelledby":`copy-from-menu-${e.name}`},children:o.map(u=>t.jsx(ue,{onClick:()=>a(u,e),children:t.jsx(nc,{children:`Copy from ${u.name}`})},u.name))})]})})},rc=({permission:e,projectId:s,environment:n,checked:r,onClick:a,...o})=>{const i=lt(e,s,n);return t.jsxs(ue,{disabled:!i,onClick:a,...o,children:[t.jsx(ra,{checked:r}),n]})},oc=p(ke)(({theme:e})=>({"& > div > ul":{display:"flex",flexDirection:"column",justifyContent:"center","& > li":{padding:e.spacing(0,1)}}})),ic=p("div")(({theme:e})=>({margin:e.spacing(1,2)})),cc=p(je)(({theme:e})=>({marginTop:e.spacing(2)})),lc=({current:e,environments:s,permission:n,projectId:r,onSubmit:a})=>{var T;const[o,i]=g.useState(null),c=!!o,[l,d]=g.useState([]),u=f=>{d(x=>[...x,f])},h=f=>{d(x=>x.filter(({name:R})=>R!==f.name))},m=f=>{l.includes(f)?h(f):u(f)},j=()=>{d([]),i(null)},y=((T=s.find(f=>f.name===e))==null?void 0:T.variants)??[];return t.jsx(b,{condition:y.length>0&&s.length>1,show:t.jsxs(t.Fragment,{children:[t.jsx(je,{onClick:f=>{i(f.currentTarget)},id:`push-to-menu-${e}`,"aria-controls":c?"basic-menu":void 0,"aria-haspopup":"true","aria-expanded":c?"true":void 0,variant:"outlined",children:"Copy to environment"}),t.jsxs(oc,{anchorEl:o,open:c,onClose:()=>i(null),MenuListProps:{"aria-labelledby":`push-to-menu-${e}`},children:[s.filter(f=>f.name!==e).map(f=>t.jsx(rc,{projectId:r,permission:n,environment:f.name,checked:l.includes(f),onClick:()=>m(f)},f.name)),t.jsxs(ic,{children:[t.jsx(Re,{}),t.jsxs(cc,{variant:"outlined",onClick:()=>{a(l),j()},disabled:l.length===0,children:["Push to selected (",l.length,")"]})]})]})]})})},dc=p("div")(({theme:e})=>({display:"flex",gap:e.spacing(1.5)})),uc=()=>{const{setToastData:e,setToastApiError:s}=U(),n=ht(),r=Ie(n.breakpoints.down("md")),a=A("projectId"),o=A("featureId"),{feature:i,refetchFeature:c,loading:l}=M(a,o),{patchFeatureEnvironmentVariants:d,overrideVariantsInEnvironments:u}=Ye(),{refetch:h}=te(a),{addChange:m}=ne(),{isChangeRequestConfigured:j}=Z(a),[y,T]=g.useState(""),[f,x]=g.useState(),[R,L]=g.useState(!1),q=g.useMemo(()=>{var S;return((S=i==null?void 0:i.environments)==null?void 0:S.map(k=>({...k,crEnabled:j(k.name)})))||[]},[i.environments]),z=(S,k)=>la(S,k),v=(S,k)=>{try{const w=ca(k,1e3);return{patch:z(S,w)}}catch(w){return{patch:[],error:N(w)}}},C=S=>({feature:o,action:"patchVariant",payload:{variants:S}}),$=async(S,k)=>{if(S.crEnabled)await m(a,S.name,C(k)),h();else{const w=S.variants??[],{patch:E,error:F}=v(w,k);if(E.length===0)return;if(F){e({type:"error",title:F});return}await d(a,o,S.name,E)}c()},O=async(S,k)=>{try{const w=k.filter(({crEnabled:_})=>_),E=k.filter(({crEnabled:_})=>!_);w.length&&await Promise.all(w.map(_=>m(a,_.name,C(S)))),E.length&&await u(a,o,S,E.map(({name:_})=>_)),h(),c();const F=E.length?`Variants pushed to ${E.length===1?E[0].name:`${E.length} environments`}`:"",B=w.length?`Variants push added to ${w.length===1?`${w[0].name} draft`:`${w.length} drafts`}`:"",I=`${F}${F&&B?". ":""}${B}`;e({title:I,type:"success"})}catch(w){s(N(w))}},V=S=>{x(S),L(!0)},G=async S=>{if(f)try{await $(f,S),L(!1),e({title:f.crEnabled?"Variant changes added to draft":"Variants updated successfully",type:"success"})}catch(k){s(N(k))}},Y=async(S,k)=>{try{const w=S.variants??[];await $(k,w),e({title:k.crEnabled?"Variants copy added to draft":"Variants copied successfully",type:"success"})}catch(w){s(N(w))}};return t.jsxs(Et,{isLoading:l,header:t.jsx(oa,{title:"Variants",actions:t.jsx(b,{condition:!r,show:t.jsx(t.Fragment,{children:t.jsx(It,{initialValue:y,onChange:T})})}),children:t.jsx(b,{condition:r,show:t.jsx(It,{initialValue:y,onChange:T})})}),children:[t.jsx(ia,{}),q.map(S=>{var w;const k=q.filter(({name:E,variants:F})=>E!==S.name&&(F==null?void 0:F.length));return t.jsx(sc,{environment:S,searchValue:y,children:t.jsxs(dc,{children:[t.jsx(lc,{current:S.name,environments:q,permission:be,projectId:a,onSubmit:E=>O(S.variants??[],E)}),t.jsx(ac,{environment:S,permission:be,projectId:a,environmentId:S.name,onCopyVariantsFrom:Y,otherEnvsWithVariants:k}),t.jsx(b,{condition:!!((w=S.variants)!=null&&w.length),show:t.jsx(re,{"data-testid":"EDIT_VARIANTS_BUTTON",onClick:()=>V(S),permission:be,projectId:a,environmentId:S.name,tooltipProps:{title:"Edit variants"},children:t.jsx(we,{})}),elseShow:t.jsx(pe,{"data-testid":"ADD_VARIANT_BUTTON",onClick:()=>V(S),variant:"outlined",permission:be,projectId:a,environmentId:S.name,children:"Add variant"})})]})},S.name)}),t.jsx(Wi,{environment:f,open:R,setOpen:L,getApiPayload:v,getCrPayload:C,onConfirm:G})]})},pc=ge("api/admin/client-metrics/features"),Ks=(e,s)=>{const n=ge(`api/admin/client-metrics/features/${e}/raw?hoursBack=${s}`),{data:r,error:a}=He(n,()=>gc(n)),o=g.useCallback(()=>{gt(pc).catch(console.warn)},[]);return{featureMetrics:r==null?void 0:r.data,loading:!a&&!r,refetchFeatureMetrics:o,error:a}},gc=e=>fetch(e).then(ye("Features")).then(s=>s.json()).then(),hc=()=>{const{isEnterprise:e}=fe(),s=Es("extendedUsageMetricsUI");return e()&&s},fc=p("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),Ne=48,xc=({hoursBack:e,setHoursBack:s})=>{const{trackEvent:n}=ae(),r=c=>{s(parseInt(c)),n("feature-metrics",{props:{eventType:"change-period",hoursBack:c}})},o=hc()?[...Qt,...mc]:Qt,i=o.map(c=>Number(c.key)).includes(e)?e:Ne;return g.useEffect(()=>{e!==i&&s(i)},[e]),t.jsxs("div",{children:[t.jsx(fc,{children:"Period"}),t.jsx(ys,{name:"feature-metrics-period",id:"feature-metrics-period",options:o,value:String(i),onChange:r,fullWidth:!0})]})},Qt=[{key:"1",label:"Last hour"},{key:"24",label:"Last 24 hours"},{key:"48",label:"Last 48 hours"}],mc=[{key:`${7*24}`,label:"Last 7 days"},{key:`${30*24}`,label:"Last 30 days"},{key:`${90*24}`,label:"Last 90 days"}],yc=({value:e,timeZone:s})=>{const{locationSettings:n}=Ss(),r=e?e instanceof Date?Pt(e,n.locale,s):Pt(bs(e),n.locale,s):void 0;return t.jsx(Fs,{lineClamp:1,children:r})},jc=({metrics:e,tableSectionId:s})=>{const n=Ie(da.breakpoints.down("md")),r=g.useMemo(()=>({sortBy:[{id:"timestamp"}]}),[]),{getTableProps:a,getTableBodyProps:o,headerGroups:i,rows:c,prepareRow:l,setHiddenColumns:d}=Je.useTable({initialState:r,columns:Zt,data:e,autoResetHiddenColumns:!1,disableSortRemove:!0,defaultColumn:{Cell:Fs}},Je.useGlobalFilter,Je.useSortBy);return ua([{condition:n,columns:["appName","environment"]}],d,Zt),e.length===0?null:t.jsxs(pa,{...a(),rowHeight:"standard",id:s,children:[t.jsx(ga,{headerGroups:i}),t.jsx(ha,{...o(),children:c.map(u=>(l(u),t.jsx(fa,{hover:!0,...u.getRowProps(),children:u.cells.map(h=>t.jsx(xa,{...h.getCellProps(),children:h.render("Cell")}))})))})]})},Zt=[{id:"Icon",width:"1%",disableSortBy:!0,Cell:()=>t.jsx(ma,{icon:t.jsx(Xa,{color:"disabled"})})},{Header:"Time",accessor:"timestamp",Cell:e=>t.jsx(yc,{value:e.row.original.timestamp,timeZone:e.row.original.timestamp.includes("23:59")?"UTC":void 0})},{Header:"Application",accessor:"appName"},{Header:"Environment",accessor:"environment"},{id:"requested",Header:"Requested",accessor:e=>e.yes+e.no},{Header:"Exposed",accessor:"yes"}],Sc=({metrics:e,...s})=>{const n=g.useMemo(()=>e.reduce((a,o)=>a+o.yes,0),[e]),r=g.useMemo(()=>e.reduce((a,o)=>a+o.no,0),[e]);return t.jsx(Ns,{...s,totalYes:n,totalNo:r})},bc=({metrics:e,hoursBack:s})=>{const n=Ot(),r=Ot();return e.length===0?t.jsxs(K,{mt:6,children:[t.jsx(W,{variant:"body1",paragraph:!0,children:"We have yet to receive any metrics for this feature toggle in the selected time period."}),t.jsx(W,{variant:"body1",paragraph:!0,children:"Please note that, since the SDKs send metrics on an interval, it might take some time before metrics appear."})]}):t.jsxs(g.Suspense,{fallback:null,children:[t.jsx(K,{borderTop:1,pt:2,mt:3,borderColor:"divider",children:t.jsx(vc,{metrics:e,hoursBack:s,statsSectionId:n})}),t.jsx(K,{mt:4,children:t.jsx(Sc,{metrics:e,hoursBack:s,statsSectionId:n,tableSectionId:r})}),t.jsx(K,{mt:4,children:t.jsx(jc,{metrics:e,tableSectionId:r})})]})},vc=ya.lazy(()=>ja(()=>import("./FeatureMetricsChart-UhDepK_o.js"),__vite__mapDeps([]))),Cc=p("h2")(({theme:e})=>({margin:0,marginBottom:e.spacing(1.5),fontSize:e.fontSizes.smallBody,fontWeight:e.fontWeight.thin,color:e.palette.text.secondary})),wc=p("ul")(({theme:e})=>({display:"flex",flexWrap:"wrap",gap:e.spacing(1),listStyleType:"none",padding:0,minHeight:"100%",alignItems:"center",maxHeight:"200px",overflowY:"auto"})),Tc=p("li")(({theme:e})=>({"& > [aria-pressed=true]":{backgroundColor:e.palette.background.alternative,color:e.palette.primary.contrastText},"& > [aria-pressed=true]:hover":{backgroundColor:e.palette.primary.light}})),Xt=({title:e,values:s,selectedValues:n,toggleValue:r,toggleValues:a})=>{const o=l=>()=>{r(l)},i=[...s].every(l=>n.includes(l)),c=g.useMemo(()=>Array.from(s).sort((l,d)=>l.localeCompare(d)),[s]);return t.jsxs("div",{children:[t.jsx(Cc,{children:e}),t.jsxs(wc,{children:[c.map(l=>t.jsx(Tc,{children:t.jsx(vs,{label:l,onClick:o(l),"aria-pressed":n==null?void 0:n.includes(l),sx:Sa})},l)),a&&s.size>1&&t.jsx(je,{size:"small",onClick:a,"aria-pressed":i,children:i?"Unselect":"Select all"})]})]})},Ec=e=>{const s=new Map;return e.forEach(n=>{let r=s.get(n.timestamp);if(r||(r={...n,yes:0,no:0,variants:{}},s.set(n.timestamp,r)),r.yes+=n.yes,r.no+=n.no,n.variants){r.variants=r.variants||{};for(const[a,o]of Object.entries(n.variants))r.variants[a]=(r.variants[a]||0)+o}}),Array.from(s.values()).map(n=>({...n,variants:n.variants&&Object.keys(n.variants).length===0?void 0:n.variants}))},Ac=()=>{const e=A("projectId"),s=A("featureId"),n=Dc(e,s);Ts("Metrics");const r=Array.from(n)[0],[a,o]=ba({environment:Qe(va,r),applications:Qe(Ca,[]),hoursBack:Qe(wa,Ne)}),i=Fc(s,a.hoursBack||Ne),c=Array.from(i)[0],{environment:l,hoursBack:d}=a,u=a.applications.filter(f=>f!==null);g.useEffect(()=>{a.applications&&a.applications.length===0&&c&&o({applications:[c]})},[JSON.stringify(Array.from(i))]);const h=[...i].every(f=>u.includes(f)),{featureMetrics:m}=Ks(s,d),[j,y]=g.useState(m);g.useEffect(()=>{m&&y(m)},[m]);const T=g.useMemo(()=>Ec((j==null?void 0:j.filter(f=>l===f.environment).filter(f=>u.includes(f.appName)))||[]),[j,l,JSON.stringify(u)]);return T?t.jsxs(Et,{children:[t.jsxs(le,{container:!0,component:"header",spacing:2,children:[t.jsx(le,{item:!0,xs:12,md:5,children:t.jsx(b,{condition:n.size>0,show:t.jsx(Xt,{title:"Environments",values:n,selectedValues:[l],toggleValue:f=>{o({environment:f})}})})}),t.jsx(le,{item:!0,xs:12,md:5,children:t.jsx(b,{condition:i.size>0,show:t.jsx(Xt,{title:"Applications",values:i,selectedValues:u,toggleValues:()=>{o(h?{applications:[c]}:{applications:[...i]})},toggleValue:f=>{u.includes(f)?o({applications:u.filter(x=>x!==f)}):o({applications:[...u,f]})}})})}),t.jsx(le,{item:!0,xs:12,md:2,children:t.jsx(xc,{hoursBack:d,setHoursBack:f=>o({hoursBack:f})})})]}),t.jsx(bc,{metrics:T,hoursBack:d})]}):null},Dc=(e,s)=>{const{feature:n}=M(e,s),r=n.environments.map(a=>a.name);return new Set(r)},Fc=(e,s=Ne)=>{const{featureMetrics:n=[]}=Ks(e,s),r=n.map(a=>a.appName);return new Set(r)},Rc=(e,s)=>{const n=new Set(e),r=new Set(s);return n.size!==r.size?!1:[...n].every(a=>r.has(a))},es=p("div")(({theme:e})=>({display:"grid",gap:e.spacing(2)})),ts=p(ie)(({theme:e})=>({marginBottom:e.spacing(1)})),$c=p(Ct)({padding:0}),kc=({projectId:e,open:s,onClose:n,onClick:r,feature:a,changeRequests:o})=>{const i=A("projectId"),{project:c}=Rs(e),{isChangeRequestConfiguredInAnyEnv:l}=Z(e),d=l(),u=g.useMemo(()=>Rc(a.environments.map(j=>j.name),c.environments.map(j=>j.environment)),[a,c]),h=o?o.length>0:!1,m=a.dependencies.length>0||a.children.length>0;return t.jsx(b,{condition:u&&!m&&!h&&!d,show:t.jsx(oe,{open:s,onClose:n,onClick:r,title:"Confirm change project",primaryButtonText:"Change project",secondaryButtonText:"Cancel",children:t.jsxs(es,{children:[t.jsx(ts,{severity:"success",children:"This feature toggle is compatible with the new project."}),t.jsx("p",{children:"Are you sure you want to change the project for this toggle?"})]})}),elseShow:t.jsx(oe,{open:s,onClick:n,title:"Confirm change project",primaryButtonText:"Close",children:t.jsxs(es,{children:[t.jsx(ts,{severity:"warning",children:"Cannot proceed with the move"}),t.jsx(b,{condition:m,show:t.jsxs("p",{children:[t.jsx("span",{children:"The feature toggle must not have any dependencies."})," ",t.jsx("br",{}),t.jsx("span",{children:"Please remove feature dependencies first."})]})}),t.jsx(b,{condition:!u,show:t.jsx("p",{children:"In order to move a feature toggle between two projects, both projects must have the exact same environments enabled."})}),t.jsx(b,{condition:h,show:t.jsxs(t.Fragment,{children:[t.jsx("p",{children:"The feature toggle must not have any pending change requests. This feature toggle is currently referenced in the following change requests:"}),t.jsx($c,{children:o==null?void 0:o.map(j=>t.jsx(ve,{children:t.jsxs(Q,{to:`/projects/${i}/change-requests/${j.id}`,children:["View change request"," ",j.id]})},j.id))})]})}),t.jsx(b,{condition:d,show:t.jsxs("p",{children:["You're not allowed to move the feature to project"," ",t.jsx(Q,{to:`/projects/${e}/settings/change-requests`,children:e}),". This project has change requests enabled."]})})]})})})},Ic=()=>{const{hasAccess:e}=g.useContext(xt),s=A("projectId"),n=A("featureId"),{feature:r,refetchFeature:a}=M(s,n),[o,i]=g.useState(!1),{changeFeatureProject:c}=Ye(),{setToastData:l,setToastApiError:d}=U(),[u,h]=g.useState(s),{projects:m}=Ta(),j=ce(),{changeRequests:y}=Ls(s,n),T=async()=>{try{u&&(await c(s,n,u),a(),l({title:"Project changed",type:"success"}),i(!1),j(`/projects/${u}/features/${n}/settings`,{replace:!0}))}catch(x){d(N(x))}},f=g.useMemo(()=>m.map(x=>x.id).filter(x=>e(Bt,x)),[m,e]);return f.length===0?null:t.jsxs(t.Fragment,{children:[t.jsx(Ea,{value:u,onChange:h,label:"Project",filter:x=>f.includes(x),enabled:!0}),t.jsx(pe,{permission:Bt,onClick:()=>i(!0),disabled:u===s,projectId:s,children:"Save"}),t.jsx(kc,{changeRequests:y,projectId:u,open:o,feature:r,onClose:()=>i(!1),onClick:T})]})},Pc=p("div")({display:"flex",alignItems:"center"}),Oc=p(W)(({theme:e})=>({fontSize:e.fontSizes.mainHeader})),Bc=({projectId:e,featureId:s})=>{var o;const{feature:n}=M(e,s),r=ce(),a=()=>{r(`/projects/${e}/features/${s}/edit`)};return t.jsxs(t.Fragment,{children:[t.jsxs(Pc,{children:[t.jsx(Oc,{children:"Feature information"}),t.jsx(re,{permission:Ce,projectId:e,"data-loading":!0,onClick:a,tooltipProps:{title:"Edit"},children:t.jsx(we,{})})]}),t.jsxs(W,{children:["Name: ",t.jsx("strong",{children:n.name})]}),t.jsxs(W,{children:["Description:"," ",t.jsx("strong",{children:(o=n.description)!=null&&o.length?n.description:"no description"})]}),t.jsxs(W,{children:["Type: ",t.jsx("strong",{children:n.type})]}),t.jsxs(W,{children:["Impression Data:"," ",t.jsx("strong",{children:n.impressionData?"enabled":"disabled"})]})]})},Le="metadata",ct="project",Lc=p("div")(({theme:e})=>({width:"20%",borderRight:`1px solid ${e.palette.divider}`,padding:e.spacing(2,0),[e.breakpoints.down("md")]:{width:"35%"}})),_c=p("div")(({theme:e})=>({padding:e.spacing(4),display:"flex",flexDirection:"column",width:400,"& > *":{margin:e.spacing(1,0)}})),Mc=()=>{const e=A("projectId"),s=A("featureId"),[n,r]=g.useState(Le),{uiConfig:a}=fe();return t.jsx(Et,{header:"Settings",sx:{padding:0},children:t.jsxs(K,{sx:{display:"flex"},children:[t.jsx(Lc,{children:t.jsxs(Ct,{children:[t.jsx(ve,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>r(Le),selected:n===Le,children:"Metadata"},0),t.jsx(ve,{sx:{padding:"0.75rem 2rem"},button:!0,onClick:()=>r(ct),selected:n===ct,hidden:!a.flags.P,children:"Project"},1)]})}),t.jsxs(_c,{children:[t.jsx(b,{condition:n===Le,show:t.jsx(Bc,{projectId:e,featureId:s})}),t.jsx(b,{condition:n===ct&&a.flags.P,show:t.jsx(Ic,{})})]})]})})},qc=({stale:e,showActive:s=!0})=>{if(!e&&!s)return null;const n=e?"Feature toggle is deprecated.":"Feature toggle is active.",r=e?"Stale":"Active";return t.jsx("div",{"data-loading":!0,style:{marginLeft:"8px"},children:t.jsx(Ee,{color:e?"error":"success",title:n,children:r})})},ss=p("strong")({wordBreak:"break-all"}),zc=()=>{const e=A("projectId"),s=A("featureId"),{archivedFeatures:n}=Aa(),r=Da(e,{name:s});return n?n.some(o=>o.name===s)?t.jsxs("p",{children:["The feature ",t.jsx(ss,{children:s})," has been archived. You can find it on the"," ",t.jsx(Q,{to:`/projects/${e}/archive`,children:"project archive page"}),"."]}):t.jsxs("p",{children:["The feature ",t.jsx(ss,{children:s})," does not exist. Would you like to"," ",t.jsx(Q,{to:r,children:"create it"}),"?"]}):null},Vc=p(Q)(({theme:e})=>({textDecoration:"none",color:e.palette.primary.main,fontWeight:e.fontWeight.bold})),Nc=({isOpen:e,onClose:s,features:n,project:r})=>t.jsxs(oe,{title:"You can't archive a feature that other features depend on",open:e,primaryButtonText:"OK",onClick:s,children:[t.jsx("p",{children:"The following features depend on your feature:"}),t.jsx("ul",{children:n.map(a=>t.jsx("li",{children:t.jsx(Vc,{to:`/projects/${r}/features/${a}`,target:"_blank",rel:"noopener noreferrer",children:a})},a))})]}),Hc=e=>g.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},g.createElement("path",{d:"M1 12a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 9H6a3 3 0 1 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 17H6a5 5 0 0 1-5-5Z",fill:"#202021"}),g.createElement("path",{d:"M9 12c0-.711.148-1.387.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 15h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 7.013 13.788 7 14 7h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),Wc=e=>g.createElement("svg",{fill:"none",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",...e},g.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M1 8a5 5 0 0 1 5-5h4a5 5 0 0 1 4.584 7H14a1.993 1.993 0 0 1-1.375-.547A3 3 0 0 0 10 5H6a3 3 0 0 0 0 6h2.803a6.03 6.03 0 0 0 1.822 1.961A5.033 5.033 0 0 1 10 13H8v3a1 1 0 0 0 1 1h1.17A3.001 3.001 0 0 1 13 15h7a3 3 0 1 1 0 6h-7a3.001 3.001 0 0 1-2.83-2H9a3 3 0 0 1-3-3v-3a5 5 0 0 1-5-5Zm8 0c0-.711.148-1.388.416-2H10c.532 0 1.016.208 1.375.547A3 3 0 0 0 14 11h4a3 3 0 1 0 0-6h-2.803a6.03 6.03 0 0 0-1.822-1.961C13.58 3.013 13.788 3 14 3h4a5 5 0 0 1 0 10h-4a5 5 0 0 1-5-5Z",fill:"#202021"})),Uc=p("div")(({theme:e})=>({backgroundColor:e.palette.background.paper,borderRadius:e.shape.borderRadiusLarge,marginBottom:e.spacing(2)})),Yc=p("div")(({theme:e})=>({padding:e.spacing(2,4,2,2),display:"flex",justifyContent:"space-between",alignItems:"center",[e.breakpoints.down(500)]:{flexDirection:"column"}})),ns=p("div")({display:"flex",alignItems:"center"}),as=p("div")(({theme:e})=>({display:"flex",alignItems:"center",gap:e.spacing(1),marginTop:e.spacing(1),fontSize:e.fontSizes.smallBody,padding:e.spacing(.75,1.5),backgroundColor:e.palette.background.elevation2,borderRadius:`${e.shape.borderRadiusMedium}px`,width:"max-content"}));p(Hc)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));p(Wc)(({theme:e})=>({width:e.fontSizes.smallBody,height:e.fontSizes.smallBody}));const Gc=p("h1")(({theme:e})=>({fontSize:e.fontSizes.mainHeader,fontWeight:"normal",display:"flex",alignItems:"center",wordBreak:"break-all"})),Kc=p("div")({flexShrink:0,display:"flex"}),Jc=p("div")(({theme:e})=>({width:"100%",backgroundColor:e.palette.divider,height:"1px"})),Qc=p("div")(({theme:e})=>({padding:e.spacing(0,4)})),Zc=p(Fa)(({theme:e})=>({textTransform:"none",width:"auto",fontSize:e.fontSizes.bodySize,padding:"0 !important",[e.breakpoints.up("md")]:{minWidth:160}})),Xc=p(Q)(({theme:e})=>({maxWidth:"100%",textDecoration:"none","&:hover, &:focus":{textDecoration:"underline"}})),el=()=>{var S,k;const e=A("projectId"),s=A("featureId"),{refetch:n}=Rs(e),{favorite:r,unfavorite:a}=Ra(),{refetchFeature:o}=M(e,s),{setToastData:i,setToastApiError:c}=U(),[l,d]=g.useState(!1),[u,h]=g.useState(!1),[m,j]=g.useState(!1),[y,T]=g.useState(!1),f=Ie("(max-width:500px)"),{feature:x,loading:R,error:L,status:q}=M(e,s),z=ce(),{pathname:v}=$a(),C=ka(R),$=`/projects/${e}/features/${s}`,O=[{title:"Overview",path:`${$}`,name:"overview"},{title:"Metrics",path:`${$}/metrics`,name:"Metrics"},{title:"Variants",path:`${$}/variants`,name:"Variants"},{title:"Settings",path:`${$}/settings`,name:"Settings"},{title:"Event log",path:`${$}/logs`,name:"Event log"}],V=O.find(w=>w.path===v)??O[0],G=async()=>{try{x!=null&&x.favorite?await a(e,x.name):await r(e,x.name),o()}catch{c("Something went wrong, could not update favorite")}};if(q===404)return t.jsx(zc,{});if(L!==void 0)return t.jsx("div",{ref:C});const Y=()=>{try{qa(x.name),T(!0),setTimeout(()=>{T(!1)},3e3)}catch{i({type:"error",title:"Could not copy feature name"})}};return t.jsxs("div",{ref:C,children:[t.jsxs(Uc,{children:[t.jsxs(Yc,{children:[t.jsxs(ns,{children:[t.jsx(Ia,{onClick:G,isFavorite:x==null?void 0:x.favorite}),t.jsxs("div",{children:[t.jsxs(ns,{children:[t.jsxs(Gc,{"data-loading":!0,children:[x.name," "]}),t.jsx(ee,{title:y?"Copied!":"Copy name",arrow:!0,children:t.jsx($e,{onClick:Y,style:{marginLeft:8},children:y?t.jsx(Pa,{style:{fontSize:16}}):t.jsx(Oa,{style:{fontSize:16}})})}),t.jsx(b,{condition:!f,show:t.jsx(qc,{stale:x==null?void 0:x.stale})})]}),t.jsx(b,{condition:x.dependencies.length>0,show:t.jsxs(as,{children:[t.jsx("b",{children:"Has parent: "}),t.jsx(Xc,{to:`/projects/${x.project}/features/${(S=x==null?void 0:x.dependencies[0])==null?void 0:S.feature}`,children:(k=x==null?void 0:x.dependencies[0])==null?void 0:k.feature})]})}),t.jsx(b,{condition:x.children.length>0,show:t.jsxs(as,{children:[t.jsx("b",{children:"Has children:"}),t.jsx(Us,{childFeatures:x.children,project:x.project})]})})]})]}),t.jsxs(Kc,{children:[t.jsx(re,{permission:Ba,projectId:e,"data-loading":!0,component:Q,to:`/projects/${e}/features/${s}/copy`,tooltipProps:{title:"Clone"},children:t.jsx(er,{})}),t.jsx(re,{permission:La,projectId:e,tooltipProps:{title:"Archive feature toggle"},"data-loading":!0,onClick:()=>h(!0),children:t.jsx(Za,{})}),t.jsx(re,{onClick:()=>j(!0),permission:Ce,projectId:e,tooltipProps:{title:"Toggle stale state"},"data-loading":!0,children:t.jsx(Ga,{})}),t.jsx(re,{onClick:()=>d(!0),permission:Ce,projectId:e,tooltipProps:{title:"Add tag"},"data-loading":!0,children:t.jsx(_a,{})})]})]}),t.jsx(Jc,{}),t.jsx(Qc,{children:t.jsx(Ma,{value:V.path,indicatorColor:"primary",textColor:"primary",children:O.map(w=>t.jsx(Zc,{label:w.title,value:w.path,onClick:()=>z(w.path),"data-testid":`TAB-${w.title}`},w.title))})})]}),t.jsxs(As,{children:[t.jsx(xe,{path:"metrics",element:t.jsx(Ac,{})}),t.jsx(xe,{path:"logs",element:t.jsx(sr,{})}),t.jsx(xe,{path:"variants",element:t.jsx(uc,{})}),t.jsx(xe,{path:"settings",element:t.jsx(Mc,{})}),t.jsx(xe,{path:"*",element:t.jsx($i,{})})]}),t.jsx(b,{condition:x.children.length>0,show:t.jsx(Nc,{features:x.children,project:e,isOpen:u,onClose:()=>h(!1)}),elseShow:t.jsx(Ka,{isOpen:u,onConfirm:()=>{n(),z(`/projects/${e}`)},onClose:()=>h(!1),projectId:e,featureIds:[s]})}),t.jsx(Ja,{isStale:x.stale,isOpen:m,onClose:()=>{j(!1),o()},featureId:s,projectId:e}),t.jsx(Gs,{open:l,setOpen:d})]})},al=Object.freeze(Object.defineProperty({__proto__:null,default:el},Symbol.toStringTag,{value:"Module"}));export{al as F,uo as d};
20
+ function __vite__mapDeps(indexes) {
21
+ if (!__vite__mapDeps.viteFileDeps) {
22
+ __vite__mapDeps.viteFileDeps = []
23
+ }
24
+ return indexes.map((i) => __vite__mapDeps.viteFileDeps[i])
25
+ }