@kuadrant/kuadrant-backstage-plugin-frontend 0.0.2-dev-1cc1a15 → 0.0.2-dev-e6e0dbf

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 (226) hide show
  1. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js +229 -11
  2. package/dist/components/ApiAccessCard/ApiAccessCard.esm.js.map +1 -1
  3. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js +15 -151
  4. package/dist/components/ApiKeyManagementTab/ApiKeyManagementTab.esm.js.map +1 -1
  5. package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js +10 -15
  6. package/dist/components/ApiProductDetailPage/ApiProductDetailPage.esm.js.map +1 -1
  7. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js +6 -1
  8. package/dist/components/ApiProductDetails/ApiProductDetails.esm.js.map +1 -1
  9. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js +15 -2
  10. package/dist/components/ApiProductInfoCard/ApiProductInfoCard.esm.js.map +1 -1
  11. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js +2 -4
  12. package/dist/components/CreateAPIProductDialog/CreateAPIProductDialog.esm.js.map +1 -1
  13. package/dist/components/OidcProviderCard/OidcProviderCard.esm.js +23 -0
  14. package/dist/components/OidcProviderCard/OidcProviderCard.esm.js.map +1 -0
  15. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js +167 -0
  16. package/dist/components/RequestAccessDialog/RequestAccessDialog.esm.js.map +1 -0
  17. package/dist/index.d.ts +1 -5
  18. package/dist/index.esm.js +1 -2
  19. package/dist/index.esm.js.map +1 -1
  20. package/dist/plugin.esm.js +1 -17
  21. package/dist/plugin.esm.js.map +1 -1
  22. package/dist/utils/validation.esm.js.map +1 -1
  23. package/dist-scalprum/configSchema.json +27 -1
  24. package/dist-scalprum/internal.plugin-kuadrant.1ec7b1dc71663b4b9a17.js +2 -0
  25. package/dist-scalprum/internal.plugin-kuadrant.1ec7b1dc71663b4b9a17.js.map +1 -0
  26. package/dist-scalprum/plugin-manifest.json +2 -2
  27. package/dist-scalprum/static/1085.d17e689a.chunk.js +3 -0
  28. package/dist-scalprum/static/{1085.536aa0fa.chunk.js.map → 1085.d17e689a.chunk.js.map} +1 -1
  29. package/dist-scalprum/static/1645.db086648.chunk.js +3 -0
  30. package/dist-scalprum/static/1645.db086648.chunk.js.map +1 -0
  31. package/dist-scalprum/static/2233.bf0c10d7.chunk.js +3 -0
  32. package/dist-scalprum/static/2233.bf0c10d7.chunk.js.map +1 -0
  33. package/dist-scalprum/static/2628.20156dc1.chunk.js +3 -0
  34. package/dist-scalprum/static/2628.20156dc1.chunk.js.map +1 -0
  35. package/dist-scalprum/static/2822.27a4ac5b.chunk.js +2 -0
  36. package/dist-scalprum/static/2822.27a4ac5b.chunk.js.map +1 -0
  37. package/dist-scalprum/static/2946.a35243f1.chunk.js +3 -0
  38. package/dist-scalprum/static/{2946.167c50c2.chunk.js.map → 2946.a35243f1.chunk.js.map} +1 -1
  39. package/dist-scalprum/static/2952.b3c7e41c.chunk.js +2 -0
  40. package/dist-scalprum/static/2952.b3c7e41c.chunk.js.map +1 -0
  41. package/dist-scalprum/static/2967.6a1db3ad.chunk.js +2 -0
  42. package/dist-scalprum/static/2967.6a1db3ad.chunk.js.map +1 -0
  43. package/dist-scalprum/static/3091.9a74ea5f.chunk.js +2 -0
  44. package/dist-scalprum/static/3091.9a74ea5f.chunk.js.map +1 -0
  45. package/dist-scalprum/static/327.a9a99299.chunk.js +2 -0
  46. package/dist-scalprum/static/327.a9a99299.chunk.js.map +1 -0
  47. package/dist-scalprum/static/3459.a7c29521.chunk.js +2 -0
  48. package/dist-scalprum/static/3459.a7c29521.chunk.js.map +1 -0
  49. package/dist-scalprum/static/3504.1c2f2e54.chunk.js +3 -0
  50. package/dist-scalprum/static/3504.1c2f2e54.chunk.js.map +1 -0
  51. package/dist-scalprum/static/3650.4f0dc550.chunk.js +2 -0
  52. package/dist-scalprum/static/3650.4f0dc550.chunk.js.map +1 -0
  53. package/dist-scalprum/static/3657.882640ca.chunk.js +3 -0
  54. package/dist-scalprum/static/3657.882640ca.chunk.js.LICENSE.txt +8 -0
  55. package/dist-scalprum/static/3657.882640ca.chunk.js.map +1 -0
  56. package/dist-scalprum/static/3947.7458971d.chunk.js +2 -0
  57. package/dist-scalprum/static/3947.7458971d.chunk.js.map +1 -0
  58. package/dist-scalprum/static/3954.12dd8006.chunk.js +3 -0
  59. package/dist-scalprum/static/3954.12dd8006.chunk.js.LICENSE.txt +9 -0
  60. package/dist-scalprum/static/3954.12dd8006.chunk.js.map +1 -0
  61. package/dist-scalprum/static/3984.647ef00c.chunk.js +2 -0
  62. package/dist-scalprum/static/3984.647ef00c.chunk.js.map +1 -0
  63. package/dist-scalprum/static/4026.d652a7a1.chunk.js +2 -0
  64. package/dist-scalprum/static/4026.d652a7a1.chunk.js.map +1 -0
  65. package/dist-scalprum/static/4093.4093.3597955d.css +5 -0
  66. package/dist-scalprum/static/4093.4093.3597955d.css.map +1 -0
  67. package/dist-scalprum/static/4093.ee6f0452.chunk.js +3 -0
  68. package/dist-scalprum/static/4093.ee6f0452.chunk.js.LICENSE.txt +26 -0
  69. package/dist-scalprum/static/4093.ee6f0452.chunk.js.map +1 -0
  70. package/dist-scalprum/static/4382.a7363415.chunk.js +3 -0
  71. package/dist-scalprum/static/4382.a7363415.chunk.js.map +1 -0
  72. package/dist-scalprum/static/441.f708f1e0.chunk.js +2 -0
  73. package/dist-scalprum/static/441.f708f1e0.chunk.js.map +1 -0
  74. package/dist-scalprum/static/4611.0d064cdf.chunk.js +2 -0
  75. package/dist-scalprum/static/4611.0d064cdf.chunk.js.map +1 -0
  76. package/dist-scalprum/static/4614.23f2a85b.chunk.js +2 -0
  77. package/dist-scalprum/static/4614.23f2a85b.chunk.js.map +1 -0
  78. package/dist-scalprum/static/4651.c85cecc4.chunk.js +2 -0
  79. package/dist-scalprum/static/4651.c85cecc4.chunk.js.map +1 -0
  80. package/dist-scalprum/static/{4682.6959fcd1.chunk.js → 4682.bd2dfccd.chunk.js} +2 -2
  81. package/dist-scalprum/static/4682.bd2dfccd.chunk.js.map +1 -0
  82. package/dist-scalprum/static/4935.e14465ff.chunk.js +3 -0
  83. package/dist-scalprum/static/4935.e14465ff.chunk.js.LICENSE.txt +9 -0
  84. package/dist-scalprum/static/4935.e14465ff.chunk.js.map +1 -0
  85. package/dist-scalprum/static/501.87de76da.chunk.js +3 -0
  86. package/dist-scalprum/static/501.87de76da.chunk.js.LICENSE.txt +21 -0
  87. package/dist-scalprum/static/501.87de76da.chunk.js.map +1 -0
  88. package/dist-scalprum/static/5010.0cd6c959.chunk.js +3 -0
  89. package/dist-scalprum/static/5010.0cd6c959.chunk.js.map +1 -0
  90. package/dist-scalprum/static/5203.539ed3ec.chunk.js +2 -0
  91. package/dist-scalprum/static/5203.539ed3ec.chunk.js.map +1 -0
  92. package/dist-scalprum/static/5235.2a59dc45.chunk.js +2 -0
  93. package/dist-scalprum/static/5235.2a59dc45.chunk.js.map +1 -0
  94. package/dist-scalprum/static/5453.ecdee66d.chunk.js +2 -0
  95. package/dist-scalprum/static/5453.ecdee66d.chunk.js.map +1 -0
  96. package/dist-scalprum/static/6038.63d1f832.chunk.js +3 -0
  97. package/dist-scalprum/static/6038.63d1f832.chunk.js.LICENSE.txt +8 -0
  98. package/dist-scalprum/static/6038.63d1f832.chunk.js.map +1 -0
  99. package/dist-scalprum/static/635.e030b18a.chunk.js +3 -0
  100. package/dist-scalprum/static/635.e030b18a.chunk.js.LICENSE.txt +9 -0
  101. package/dist-scalprum/static/635.e030b18a.chunk.js.map +1 -0
  102. package/dist-scalprum/static/{6371.c83dc422.chunk.js → 6371.d45f37cc.chunk.js} +2 -2
  103. package/dist-scalprum/static/6371.d45f37cc.chunk.js.map +1 -0
  104. package/dist-scalprum/static/{8563.7e068fb0.chunk.js → 6763.d6cd937f.chunk.js} +3 -3
  105. package/dist-scalprum/static/6763.d6cd937f.chunk.js.map +1 -0
  106. package/dist-scalprum/static/{6800.736d5da3.chunk.js → 6800.6e2a08fe.chunk.js} +2 -2
  107. package/dist-scalprum/static/6800.6e2a08fe.chunk.js.map +1 -0
  108. package/dist-scalprum/static/{6840.4728fab9.chunk.js → 6840.3bd67cf4.chunk.js} +2 -2
  109. package/dist-scalprum/static/6840.3bd67cf4.chunk.js.map +1 -0
  110. package/dist-scalprum/static/7076.8745d395.chunk.js +2 -0
  111. package/dist-scalprum/static/7076.8745d395.chunk.js.map +1 -0
  112. package/dist-scalprum/static/7164.5dc4bc72.chunk.js +2 -0
  113. package/dist-scalprum/static/7164.5dc4bc72.chunk.js.map +1 -0
  114. package/dist-scalprum/static/7367.62c9669e.chunk.js +3 -0
  115. package/dist-scalprum/static/7367.62c9669e.chunk.js.LICENSE.txt +21 -0
  116. package/dist-scalprum/static/7367.62c9669e.chunk.js.map +1 -0
  117. package/dist-scalprum/static/7791.8135d440.chunk.js +2 -0
  118. package/dist-scalprum/static/7791.8135d440.chunk.js.map +1 -0
  119. package/dist-scalprum/static/8083.4763f88b.chunk.js +206 -0
  120. package/dist-scalprum/static/8083.4763f88b.chunk.js.LICENSE.txt +9 -0
  121. package/dist-scalprum/static/8083.4763f88b.chunk.js.map +1 -0
  122. package/dist-scalprum/static/8172.cbe1f2c4.chunk.js +2 -0
  123. package/dist-scalprum/static/8172.cbe1f2c4.chunk.js.map +1 -0
  124. package/dist-scalprum/static/8799.83d049f3.chunk.js +2 -0
  125. package/dist-scalprum/static/8799.83d049f3.chunk.js.map +1 -0
  126. package/dist-scalprum/static/9316.d9f2fe18.chunk.js +2 -0
  127. package/dist-scalprum/static/9316.d9f2fe18.chunk.js.map +1 -0
  128. package/dist-scalprum/static/{7556.aa8a002f.chunk.js → 9655.db0c82b2.chunk.js} +3 -3
  129. package/dist-scalprum/static/9655.db0c82b2.chunk.js.map +1 -0
  130. package/dist-scalprum/static/9710.7ec34777.chunk.js +2 -0
  131. package/dist-scalprum/static/9710.7ec34777.chunk.js.map +1 -0
  132. package/dist-scalprum/static/9738.b037daf3.chunk.js +2 -0
  133. package/dist-scalprum/static/9738.b037daf3.chunk.js.map +1 -0
  134. package/dist-scalprum/static/exposed-PluginRoot.c3fd0cc1.chunk.js +2 -0
  135. package/dist-scalprum/static/exposed-PluginRoot.c3fd0cc1.chunk.js.map +1 -0
  136. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.a55e168b.chunk.js +2 -0
  137. package/dist-scalprum/static/{react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js.map → react-syntax-highlighter_languages_highlight_http.a55e168b.chunk.js.map} +1 -1
  138. package/package.json +12 -11
  139. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js +0 -761
  140. package/dist/components/ApprovalQueueCard/ApprovalQueueCard.esm.js.map +0 -1
  141. package/dist/components/ApprovalQueueCard/index.esm.js +0 -2
  142. package/dist/components/ApprovalQueueCard/index.esm.js.map +0 -1
  143. package/dist/components/PlanPolicyDetailPage/PlanPolicyDetailPage.esm.js +0 -89
  144. package/dist/components/PlanPolicyDetailPage/PlanPolicyDetailPage.esm.js.map +0 -1
  145. package/dist/components/PlanPolicyDetailPage/index.esm.js +0 -2
  146. package/dist/components/PlanPolicyDetailPage/index.esm.js.map +0 -1
  147. package/dist-scalprum/internal.plugin-kuadrant.58a9d553e354df0eed24.js +0 -2
  148. package/dist-scalprum/internal.plugin-kuadrant.58a9d553e354df0eed24.js.map +0 -1
  149. package/dist-scalprum/static/1085.536aa0fa.chunk.js +0 -3
  150. package/dist-scalprum/static/1613.71f0fccd.chunk.js +0 -3
  151. package/dist-scalprum/static/1613.71f0fccd.chunk.js.LICENSE.txt +0 -10
  152. package/dist-scalprum/static/1613.71f0fccd.chunk.js.map +0 -1
  153. package/dist-scalprum/static/1836.b74b4c40.chunk.js +0 -3
  154. package/dist-scalprum/static/1836.b74b4c40.chunk.js.LICENSE.txt +0 -10
  155. package/dist-scalprum/static/1836.b74b4c40.chunk.js.map +0 -1
  156. package/dist-scalprum/static/2198.5905970e.chunk.js +0 -2
  157. package/dist-scalprum/static/2198.5905970e.chunk.js.map +0 -1
  158. package/dist-scalprum/static/2628.6619bf8b.chunk.js +0 -3
  159. package/dist-scalprum/static/2628.6619bf8b.chunk.js.map +0 -1
  160. package/dist-scalprum/static/2759.fceb317f.chunk.js +0 -2
  161. package/dist-scalprum/static/2759.fceb317f.chunk.js.map +0 -1
  162. package/dist-scalprum/static/2928.4303c12e.chunk.js +0 -3
  163. package/dist-scalprum/static/2928.4303c12e.chunk.js.map +0 -1
  164. package/dist-scalprum/static/2946.167c50c2.chunk.js +0 -3
  165. package/dist-scalprum/static/2967.ac3a4bee.chunk.js +0 -2
  166. package/dist-scalprum/static/2967.ac3a4bee.chunk.js.map +0 -1
  167. package/dist-scalprum/static/2987.1da15560.chunk.js +0 -2
  168. package/dist-scalprum/static/2987.1da15560.chunk.js.map +0 -1
  169. package/dist-scalprum/static/3097.4bd6b35f.chunk.js +0 -2
  170. package/dist-scalprum/static/3097.4bd6b35f.chunk.js.map +0 -1
  171. package/dist-scalprum/static/3459.5c90b5a3.chunk.js +0 -2
  172. package/dist-scalprum/static/3459.5c90b5a3.chunk.js.map +0 -1
  173. package/dist-scalprum/static/3466.43dfe991.chunk.js +0 -3
  174. package/dist-scalprum/static/3466.43dfe991.chunk.js.map +0 -1
  175. package/dist-scalprum/static/3503.66b6e510.chunk.js +0 -2
  176. package/dist-scalprum/static/3503.66b6e510.chunk.js.map +0 -1
  177. package/dist-scalprum/static/3647.b96f9b3e.chunk.js +0 -2
  178. package/dist-scalprum/static/3647.b96f9b3e.chunk.js.map +0 -1
  179. package/dist-scalprum/static/3650.515c743a.chunk.js +0 -2
  180. package/dist-scalprum/static/3650.515c743a.chunk.js.map +0 -1
  181. package/dist-scalprum/static/3657.59d45756.chunk.js +0 -3
  182. package/dist-scalprum/static/3657.59d45756.chunk.js.LICENSE.txt +0 -10
  183. package/dist-scalprum/static/3657.59d45756.chunk.js.map +0 -1
  184. package/dist-scalprum/static/428.0a290bc6.chunk.js +0 -2
  185. package/dist-scalprum/static/428.0a290bc6.chunk.js.map +0 -1
  186. package/dist-scalprum/static/441.9f02e61b.chunk.js +0 -2
  187. package/dist-scalprum/static/441.9f02e61b.chunk.js.map +0 -1
  188. package/dist-scalprum/static/4682.6959fcd1.chunk.js.map +0 -1
  189. package/dist-scalprum/static/5010.a4aa0f8e.chunk.js +0 -3
  190. package/dist-scalprum/static/5010.a4aa0f8e.chunk.js.map +0 -1
  191. package/dist-scalprum/static/5453.280127dd.chunk.js +0 -2
  192. package/dist-scalprum/static/5453.280127dd.chunk.js.map +0 -1
  193. package/dist-scalprum/static/5603.05d9ca7f.chunk.js +0 -2
  194. package/dist-scalprum/static/5603.05d9ca7f.chunk.js.map +0 -1
  195. package/dist-scalprum/static/6272.b5ee5195.chunk.js +0 -3
  196. package/dist-scalprum/static/6272.b5ee5195.chunk.js.map +0 -1
  197. package/dist-scalprum/static/6371.c83dc422.chunk.js.map +0 -1
  198. package/dist-scalprum/static/6422.97baf774.chunk.js +0 -2
  199. package/dist-scalprum/static/6422.97baf774.chunk.js.map +0 -1
  200. package/dist-scalprum/static/6800.736d5da3.chunk.js.map +0 -1
  201. package/dist-scalprum/static/6840.4728fab9.chunk.js.map +0 -1
  202. package/dist-scalprum/static/7556.aa8a002f.chunk.js.map +0 -1
  203. package/dist-scalprum/static/7601.4df83556.chunk.js +0 -3
  204. package/dist-scalprum/static/7601.4df83556.chunk.js.map +0 -1
  205. package/dist-scalprum/static/7791.39417f8c.chunk.js +0 -2
  206. package/dist-scalprum/static/7791.39417f8c.chunk.js.map +0 -1
  207. package/dist-scalprum/static/7984.c8511b89.chunk.js +0 -2
  208. package/dist-scalprum/static/7984.c8511b89.chunk.js.map +0 -1
  209. package/dist-scalprum/static/8365.d3360f18.chunk.js +0 -2
  210. package/dist-scalprum/static/8365.d3360f18.chunk.js.map +0 -1
  211. package/dist-scalprum/static/8563.7e068fb0.chunk.js.map +0 -1
  212. package/dist-scalprum/static/8799.7c749838.chunk.js +0 -2
  213. package/dist-scalprum/static/8799.7c749838.chunk.js.map +0 -1
  214. package/dist-scalprum/static/exposed-PluginRoot.a5792fb2.chunk.js +0 -2
  215. package/dist-scalprum/static/exposed-PluginRoot.a5792fb2.chunk.js.map +0 -1
  216. package/dist-scalprum/static/react-syntax-highlighter_languages_highlight_http.5859273c.chunk.js +0 -2
  217. /package/dist-scalprum/static/{1085.536aa0fa.chunk.js.LICENSE.txt → 1085.d17e689a.chunk.js.LICENSE.txt} +0 -0
  218. /package/dist-scalprum/static/{3466.43dfe991.chunk.js.LICENSE.txt → 1645.db086648.chunk.js.LICENSE.txt} +0 -0
  219. /package/dist-scalprum/static/{6272.b5ee5195.chunk.js.LICENSE.txt → 2233.bf0c10d7.chunk.js.LICENSE.txt} +0 -0
  220. /package/dist-scalprum/static/{2628.6619bf8b.chunk.js.LICENSE.txt → 2628.20156dc1.chunk.js.LICENSE.txt} +0 -0
  221. /package/dist-scalprum/static/{2946.167c50c2.chunk.js.LICENSE.txt → 2946.a35243f1.chunk.js.LICENSE.txt} +0 -0
  222. /package/dist-scalprum/static/{7601.4df83556.chunk.js.LICENSE.txt → 3504.1c2f2e54.chunk.js.LICENSE.txt} +0 -0
  223. /package/dist-scalprum/static/{2928.4303c12e.chunk.js.LICENSE.txt → 4382.a7363415.chunk.js.LICENSE.txt} +0 -0
  224. /package/dist-scalprum/static/{5010.a4aa0f8e.chunk.js.LICENSE.txt → 5010.0cd6c959.chunk.js.LICENSE.txt} +0 -0
  225. /package/dist-scalprum/static/{8563.7e068fb0.chunk.js.LICENSE.txt → 6763.d6cd937f.chunk.js.LICENSE.txt} +0 -0
  226. /package/dist-scalprum/static/{7556.aa8a002f.chunk.js.LICENSE.txt → 9655.db0c82b2.chunk.js.LICENSE.txt} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/3647.b96f9b3e.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/analytics/AnalyticsContext.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/system/useApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/system/ApiRef.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/AnalyticsApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/analytics/Tracker.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/analytics/useAnalytics.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/system/helpers.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/auth.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/AlertApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/AppThemeApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/ConfigApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/DiscoveryApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/ErrorApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/FeatureFlagsApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/FetchApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/IdentityApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/OAuthRequestApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/apis/definitions/StorageApi.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/app/useApp.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/extensions/componentData.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/routing/useRouteRef.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/extensions/PluginErrorBoundary.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/extensions/extensions.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/extensions/useElementFilter.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/plugin/Plugin.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/routing/types.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/routing/RouteRef.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/routing/SubRouteRef.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/routing/ExternalRouteRef.esm.js","webpack://internal.plugin-kuadrant/./node_modules/@backstage/plugin-permission-react/node_modules/@backstage/core-plugin-api/dist/routing/useRouteRefParams.esm.js"],"sourcesContent":["import { jsx } from 'react/jsx-runtime';\nimport { createVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\nimport { useContext } from 'react';\n\nconst AnalyticsReactContext = createVersionedContext(\"analytics-context\");\nconst useAnalyticsContext = () => {\n const theContext = useContext(AnalyticsReactContext);\n if (theContext === void 0) {\n return {\n routeRef: \"unknown\",\n pluginId: \"root\",\n extension: \"App\"\n };\n }\n const theValue = theContext.atVersion(1);\n if (theValue === void 0) {\n throw new Error(\"No context found for version 1.\");\n }\n return theValue;\n};\nconst AnalyticsContext = (options) => {\n const { attributes, children } = options;\n const parentValues = useAnalyticsContext();\n const combinedValue = {\n ...parentValues,\n ...attributes\n };\n const versionedCombinedValue = createVersionedValueMap({ 1: combinedValue });\n return /* @__PURE__ */ jsx(AnalyticsReactContext.Provider, { value: versionedCombinedValue, children });\n};\n\nexport { AnalyticsContext, useAnalyticsContext };\n//# sourceMappingURL=AnalyticsContext.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { useVersionedContext } from '@backstage/version-bridge';\nimport { NotImplementedError } from '@backstage/errors';\n\nfunction useApiHolder() {\n const versionedHolder = useVersionedContext(\"api-context\");\n if (!versionedHolder) {\n throw new NotImplementedError(\"API context is not available\");\n }\n const apiHolder = versionedHolder.atVersion(1);\n if (!apiHolder) {\n throw new NotImplementedError(\"ApiContext v1 not available\");\n }\n return apiHolder;\n}\nfunction useApi(apiRef) {\n const apiHolder = useApiHolder();\n const api = apiHolder.get(apiRef);\n if (!api) {\n throw new NotImplementedError(`No implementation available for ${apiRef}`);\n }\n return api;\n}\nfunction withApis(apis) {\n return function withApisWrapper(WrappedComponent) {\n const Hoc = (props) => {\n const apiHolder = useApiHolder();\n const impls = {};\n for (const key in apis) {\n if (apis.hasOwnProperty(key)) {\n const ref = apis[key];\n const api = apiHolder.get(ref);\n if (!api) {\n throw new NotImplementedError(\n `No implementation available for ${ref}`\n );\n }\n impls[key] = api;\n }\n }\n return /* @__PURE__ */ jsx(WrappedComponent, { ...props, ...impls });\n };\n const displayName = WrappedComponent.displayName || WrappedComponent.name || \"Component\";\n Hoc.displayName = `withApis(${displayName})`;\n return Hoc;\n };\n}\n\nexport { useApi, useApiHolder, withApis };\n//# sourceMappingURL=useApi.esm.js.map\n","class ApiRefImpl {\n constructor(config) {\n this.config = config;\n const valid = config.id.split(\".\").flatMap((part) => part.split(\"-\")).every((part) => part.match(/^[a-z][a-z0-9]*$/));\n if (!valid) {\n throw new Error(\n `API id must only contain period separated lowercase alphanum tokens with dashes, got '${config.id}'`\n );\n }\n }\n get id() {\n return this.config.id;\n }\n // Utility for getting type of an api, using `typeof apiRef.T`\n get T() {\n throw new Error(`tried to read ApiRef.T of ${this}`);\n }\n toString() {\n return `apiRef{${this.config.id}}`;\n }\n}\nfunction createApiRef(config) {\n return new ApiRefImpl(config);\n}\n\nexport { createApiRef };\n//# sourceMappingURL=ApiRef.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst analyticsApiRef = createApiRef({\n id: \"core.analytics\"\n});\n\nexport { analyticsApiRef };\n//# sourceMappingURL=AnalyticsApi.esm.js.map\n","import { getOrCreateGlobalSingleton } from '@backstage/version-bridge';\n\nconst globalEvents = getOrCreateGlobalSingleton(\n \"core-plugin-api:analytics-tracker-events\",\n () => ({\n mostRecentGatheredNavigation: void 0,\n mostRecentRoutableExtensionRender: void 0,\n beforeUnloadRegistered: false\n })\n);\nconst routableExtensionRenderedEvent = \"_ROUTABLE-EXTENSION-RENDERED\";\nclass Tracker {\n constructor(analyticsApi, context = {\n routeRef: \"unknown\",\n pluginId: \"root\",\n extension: \"App\"\n }) {\n this.analyticsApi = analyticsApi;\n this.context = context;\n if (!globalEvents.beforeUnloadRegistered) {\n addEventListener(\n \"beforeunload\",\n () => {\n if (globalEvents.mostRecentGatheredNavigation) {\n this.analyticsApi.captureEvent({\n ...globalEvents.mostRecentGatheredNavigation,\n ...globalEvents.mostRecentRoutableExtensionRender\n });\n globalEvents.mostRecentGatheredNavigation = void 0;\n globalEvents.mostRecentRoutableExtensionRender = void 0;\n }\n },\n { once: true, passive: true }\n );\n globalEvents.beforeUnloadRegistered = true;\n }\n }\n setContext(context) {\n this.context = context;\n }\n captureEvent(action, subject, {\n value,\n attributes\n } = {}) {\n const { _routeNodeType, ...context } = this.context;\n if (action === routableExtensionRenderedEvent) {\n if (globalEvents.mostRecentGatheredNavigation) {\n globalEvents.mostRecentRoutableExtensionRender = {\n context: {\n ...context,\n extension: \"App\"\n }\n };\n }\n return;\n }\n if (globalEvents.mostRecentGatheredNavigation) {\n try {\n this.analyticsApi.captureEvent({\n ...globalEvents.mostRecentGatheredNavigation,\n ...globalEvents.mostRecentRoutableExtensionRender\n });\n } catch (e) {\n console.warn(\"Error during analytics event capture. %o\", e);\n }\n globalEvents.mostRecentGatheredNavigation = void 0;\n globalEvents.mostRecentRoutableExtensionRender = void 0;\n }\n if (action === \"navigate\" && _routeNodeType === \"gathered\" && context.pluginId === \"root\") {\n globalEvents.mostRecentGatheredNavigation = {\n action,\n subject,\n value,\n attributes,\n context\n };\n return;\n }\n try {\n this.analyticsApi.captureEvent({\n action,\n subject,\n value,\n attributes,\n context\n });\n } catch (e) {\n console.warn(\"Error during analytics event capture. %o\", e);\n }\n }\n}\n\nexport { Tracker, routableExtensionRenderedEvent };\n//# sourceMappingURL=Tracker.esm.js.map\n","import { useAnalyticsContext } from './AnalyticsContext.esm.js';\nimport { useApi } from '../apis/system/useApi.esm.js';\nimport '../apis/definitions/auth.esm.js';\nimport '../apis/definitions/AlertApi.esm.js';\nimport { analyticsApiRef } from '../apis/definitions/AnalyticsApi.esm.js';\nimport '../apis/definitions/AppThemeApi.esm.js';\nimport '../apis/definitions/ConfigApi.esm.js';\nimport '../apis/definitions/DiscoveryApi.esm.js';\nimport '../apis/definitions/ErrorApi.esm.js';\nimport '../apis/definitions/FeatureFlagsApi.esm.js';\nimport '../apis/definitions/FetchApi.esm.js';\nimport '../apis/definitions/IdentityApi.esm.js';\nimport '../apis/definitions/OAuthRequestApi.esm.js';\nimport '../apis/definitions/StorageApi.esm.js';\nimport { useRef } from 'react';\nimport { Tracker } from './Tracker.esm.js';\n\nfunction useAnalyticsApi() {\n try {\n return useApi(analyticsApiRef);\n } catch {\n return { captureEvent: () => {\n } };\n }\n}\nfunction useAnalytics() {\n const trackerRef = useRef(null);\n const context = useAnalyticsContext();\n const analyticsApi = useAnalyticsApi();\n function getTracker() {\n if (trackerRef.current === null) {\n trackerRef.current = new Tracker(analyticsApi);\n }\n return trackerRef.current;\n }\n const tracker = getTracker();\n tracker.setContext(context);\n return tracker;\n}\n\nexport { useAnalytics };\n//# sourceMappingURL=useAnalytics.esm.js.map\n","function createApiFactory(factory, instance) {\n if (\"id\" in factory) {\n return {\n api: factory,\n deps: {},\n factory: () => instance\n };\n }\n return factory;\n}\n\nexport { createApiFactory };\n//# sourceMappingURL=helpers.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nvar SessionState = /* @__PURE__ */ ((SessionState2) => {\n SessionState2[\"SignedIn\"] = \"SignedIn\";\n SessionState2[\"SignedOut\"] = \"SignedOut\";\n return SessionState2;\n})(SessionState || {});\nconst googleAuthApiRef = createApiRef({\n id: \"core.auth.google\"\n});\nconst githubAuthApiRef = createApiRef({\n id: \"core.auth.github\"\n});\nconst oktaAuthApiRef = createApiRef({\n id: \"core.auth.okta\"\n});\nconst gitlabAuthApiRef = createApiRef({\n id: \"core.auth.gitlab\"\n});\nconst microsoftAuthApiRef = createApiRef({\n id: \"core.auth.microsoft\"\n});\nconst oneloginAuthApiRef = createApiRef({\n id: \"core.auth.onelogin\"\n});\nconst bitbucketAuthApiRef = createApiRef({\n id: \"core.auth.bitbucket\"\n});\nconst bitbucketServerAuthApiRef = createApiRef({\n id: \"core.auth.bitbucket-server\"\n});\nconst atlassianAuthApiRef = createApiRef({\n id: \"core.auth.atlassian\"\n});\nconst vmwareCloudAuthApiRef = createApiRef({\n id: \"core.auth.vmware-cloud\"\n});\nconst openshiftAuthApiRef = createApiRef({\n id: \"core.auth.openshift\"\n});\n\nexport { SessionState, atlassianAuthApiRef, bitbucketAuthApiRef, bitbucketServerAuthApiRef, githubAuthApiRef, gitlabAuthApiRef, googleAuthApiRef, microsoftAuthApiRef, oktaAuthApiRef, oneloginAuthApiRef, openshiftAuthApiRef, vmwareCloudAuthApiRef };\n//# sourceMappingURL=auth.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst alertApiRef = createApiRef({\n id: \"core.alert\"\n});\n\nexport { alertApiRef };\n//# sourceMappingURL=AlertApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst appThemeApiRef = createApiRef({\n id: \"core.apptheme\"\n});\n\nexport { appThemeApiRef };\n//# sourceMappingURL=AppThemeApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst configApiRef = createApiRef({\n id: \"core.config\"\n});\n\nexport { configApiRef };\n//# sourceMappingURL=ConfigApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst discoveryApiRef = createApiRef({\n id: \"core.discovery\"\n});\n\nexport { discoveryApiRef };\n//# sourceMappingURL=DiscoveryApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst errorApiRef = createApiRef({\n id: \"core.error\"\n});\n\nexport { errorApiRef };\n//# sourceMappingURL=ErrorApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nvar FeatureFlagState = /* @__PURE__ */ ((FeatureFlagState2) => {\n FeatureFlagState2[FeatureFlagState2[\"None\"] = 0] = \"None\";\n FeatureFlagState2[FeatureFlagState2[\"Active\"] = 1] = \"Active\";\n return FeatureFlagState2;\n})(FeatureFlagState || {});\nconst featureFlagsApiRef = createApiRef({\n id: \"core.featureflags\"\n});\n\nexport { FeatureFlagState, featureFlagsApiRef };\n//# sourceMappingURL=FeatureFlagsApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst fetchApiRef = createApiRef({\n id: \"core.fetch\"\n});\n\nexport { fetchApiRef };\n//# sourceMappingURL=FetchApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst identityApiRef = createApiRef({\n id: \"core.identity\"\n});\n\nexport { identityApiRef };\n//# sourceMappingURL=IdentityApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst oauthRequestApiRef = createApiRef({\n id: \"core.oauthrequest\"\n});\n\nexport { oauthRequestApiRef };\n//# sourceMappingURL=OAuthRequestApi.esm.js.map\n","import 'react/jsx-runtime';\nimport '@backstage/version-bridge';\nimport '@backstage/errors';\nimport { createApiRef } from '../system/ApiRef.esm.js';\n\nconst storageApiRef = createApiRef({\n id: \"core.storage\"\n});\n\nexport { storageApiRef };\n//# sourceMappingURL=StorageApi.esm.js.map\n","import { useVersionedContext } from '@backstage/version-bridge';\n\nconst useApp = () => {\n const versionedContext = useVersionedContext(\n \"app-context\"\n );\n if (!versionedContext) {\n throw new Error(\"App context is not available\");\n }\n const appContext = versionedContext.atVersion(1);\n if (!appContext) {\n throw new Error(\"AppContext v1 not available\");\n }\n return appContext;\n};\n\nexport { useApp };\n//# sourceMappingURL=useApp.esm.js.map\n","import { getOrCreateGlobalSingleton } from '@backstage/version-bridge';\n\nconst globalStore = getOrCreateGlobalSingleton(\n \"component-data-store\",\n () => /* @__PURE__ */ new WeakMap()\n);\nconst componentDataKey = \"__backstage_data\";\nfunction attachComponentData(component, type, data) {\n const dataComponent = component;\n let container = dataComponent[componentDataKey] ?? globalStore.get(component);\n if (!container) {\n container = { map: /* @__PURE__ */ new Map() };\n Object.defineProperty(dataComponent, componentDataKey, {\n enumerable: false,\n configurable: true,\n writable: false,\n value: container\n });\n globalStore.set(component, container);\n }\n if (container.map.has(type)) {\n const name = component.displayName || component.name;\n throw new Error(\n `Attempted to attach duplicate data \"${type}\" to component \"${name}\"`\n );\n }\n container.map.set(type, data);\n}\nfunction getComponentData(node, type) {\n if (!node) {\n return void 0;\n }\n const component = node.type;\n if (!component) {\n return void 0;\n }\n const container = component[componentDataKey] ?? globalStore.get(component);\n if (!container) {\n return void 0;\n }\n return container.map.get(type);\n}\n\nexport { attachComponentData, getComponentData };\n//# sourceMappingURL=componentData.esm.js.map\n","import { useMemo } from 'react';\nimport { useLocation } from 'react-router-dom';\nimport { useVersionedContext } from '@backstage/version-bridge';\n\nfunction useRouteRef(routeRef) {\n const { pathname } = useLocation();\n const versionedContext = useVersionedContext(\n \"routing-context\"\n );\n if (!versionedContext) {\n throw new Error(\"Routing context is not available\");\n }\n const resolver = versionedContext.atVersion(1);\n const routeFunc = useMemo(\n () => resolver && resolver.resolve(routeRef, { pathname }),\n [resolver, routeRef, pathname]\n );\n if (!versionedContext) {\n throw new Error(\"useRouteRef used outside of routing context\");\n }\n if (!resolver) {\n throw new Error(\"RoutingContext v1 not available\");\n }\n const isOptional = \"optional\" in routeRef && routeRef.optional;\n if (!routeFunc && !isOptional) {\n throw new Error(`No path for ${routeRef}`);\n }\n return routeFunc;\n}\n\nexport { useRouteRef };\n//# sourceMappingURL=useRouteRef.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { Component } from 'react';\n\nclass PluginErrorBoundary extends Component {\n static getDerivedStateFromError(error) {\n return { error };\n }\n state = { error: void 0 };\n handleErrorReset = () => {\n this.setState({ error: void 0 });\n };\n render() {\n const { error } = this.state;\n const { app, plugin } = this.props;\n const { ErrorBoundaryFallback } = app.getComponents();\n if (error) {\n return /* @__PURE__ */ jsx(\n ErrorBoundaryFallback,\n {\n error,\n resetError: this.handleErrorReset,\n plugin\n }\n );\n }\n return this.props.children;\n }\n}\n\nexport { PluginErrorBoundary };\n//# sourceMappingURL=PluginErrorBoundary.esm.js.map\n","import { jsx } from 'react/jsx-runtime';\nimport { lazy, useEffect, Suspense } from 'react';\nimport { AnalyticsContext } from '../analytics/AnalyticsContext.esm.js';\nimport { useAnalytics } from '../analytics/useAnalytics.esm.js';\nimport { useApp } from '../app/useApp.esm.js';\nimport '../routing/types.esm.js';\nimport { useRouteRef } from '../routing/useRouteRef.esm.js';\nimport 'react-router-dom';\nimport { attachComponentData } from './componentData.esm.js';\nimport { PluginErrorBoundary } from './PluginErrorBoundary.esm.js';\nimport { routableExtensionRenderedEvent } from '../analytics/Tracker.esm.js';\nimport { ForwardedError } from '@backstage/errors';\n\nfunction createRoutableExtension(options) {\n const { component, mountPoint, name } = options;\n return createReactExtension({\n component: {\n lazy: () => component().then((InnerComponent) => {\n const RoutableExtensionWrapper = (props) => {\n const analytics = useAnalytics();\n try {\n useRouteRef(mountPoint);\n } catch (error) {\n if (typeof error === \"object\" && error !== null) {\n const { message } = error;\n if (typeof message === \"string\" && message.startsWith(\"No path for \")) {\n throw new Error(\n `Routable extension component with mount point ${mountPoint} was not discovered in the app element tree. Routable extension components may not be rendered by other components and must be directly available as an element within the App provider component.`\n );\n }\n }\n throw error;\n }\n useEffect(() => {\n analytics.captureEvent(routableExtensionRenderedEvent, \"\");\n }, [analytics]);\n return /* @__PURE__ */ jsx(InnerComponent, { ...props });\n };\n const componentName = name || InnerComponent.displayName || InnerComponent.name || \"LazyComponent\";\n RoutableExtensionWrapper.displayName = `RoutableExtension(${componentName})`;\n return RoutableExtensionWrapper;\n })\n },\n data: {\n \"core.mountPoint\": mountPoint\n },\n name\n });\n}\nfunction createComponentExtension(options) {\n const { component, name } = options;\n return createReactExtension({ component, name });\n}\nfunction createReactExtension(options) {\n const { data = {}, name } = options;\n if (!name) {\n console.warn(\n \"Declaring extensions without name is DEPRECATED. Make sure that all usages of createReactExtension, createComponentExtension and createRoutableExtension provide a name.\"\n );\n }\n let Component;\n if (\"lazy\" in options.component) {\n const lazyLoader = options.component.lazy;\n Component = lazy(\n () => lazyLoader().then(\n (component) => ({ default: component }),\n (error) => {\n const ofExtension = name ? ` of the ${name} extension` : \"\";\n throw new ForwardedError(\n `Failed lazy loading${ofExtension}, try to reload the page`,\n error\n );\n }\n )\n );\n } else {\n Component = options.component.sync;\n }\n const componentName = name || Component.displayName || Component.name || \"Component\";\n return {\n expose(plugin) {\n const Result = (props) => {\n const app = useApp();\n const { Progress } = app.getComponents();\n const mountPoint = data?.[\"core.mountPoint\"];\n return /* @__PURE__ */ jsx(Suspense, { fallback: /* @__PURE__ */ jsx(Progress, {}), children: /* @__PURE__ */ jsx(PluginErrorBoundary, { app, plugin, children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n pluginId: plugin.getId(),\n ...name && { extension: name },\n ...mountPoint && { routeRef: mountPoint.id }\n },\n children: /* @__PURE__ */ jsx(Component, { ...props })\n }\n ) }) });\n };\n attachComponentData(Result, \"core.plugin\", plugin);\n attachComponentData(Result, \"core.extensionName\", name);\n for (const [key, value] of Object.entries(data)) {\n attachComponentData(Result, key, value);\n }\n Result.displayName = `Extension(${componentName})`;\n return Result;\n }\n };\n}\n\nexport { createComponentExtension, createReactExtension, createRoutableExtension };\n//# sourceMappingURL=extensions.esm.js.map\n","import { useMemo, Children, isValidElement, Fragment } from 'react';\nimport { getComponentData } from './componentData.esm.js';\nimport { useApi } from '../apis/system/useApi.esm.js';\nimport '../apis/definitions/auth.esm.js';\nimport '../apis/definitions/AlertApi.esm.js';\nimport '../apis/definitions/AnalyticsApi.esm.js';\nimport '../apis/definitions/AppThemeApi.esm.js';\nimport '../apis/definitions/ConfigApi.esm.js';\nimport '../apis/definitions/DiscoveryApi.esm.js';\nimport '../apis/definitions/ErrorApi.esm.js';\nimport { featureFlagsApiRef } from '../apis/definitions/FeatureFlagsApi.esm.js';\nimport '../apis/definitions/FetchApi.esm.js';\nimport '../apis/definitions/IdentityApi.esm.js';\nimport '../apis/definitions/OAuthRequestApi.esm.js';\nimport '../apis/definitions/StorageApi.esm.js';\n\nfunction selectChildren(rootNode, featureFlagsApi, selector, strictError) {\n return Children.toArray(rootNode).flatMap((node) => {\n if (!isValidElement(node)) {\n return [];\n }\n if (node.type === Fragment) {\n return selectChildren(\n node.props.children,\n featureFlagsApi,\n selector,\n strictError\n );\n }\n if (getComponentData(node, \"core.featureFlagged\")) {\n const props = node.props;\n const isEnabled = \"with\" in props ? featureFlagsApi.isActive(props.with) : !featureFlagsApi.isActive(props.without);\n if (isEnabled) {\n return selectChildren(\n node.props.children,\n featureFlagsApi,\n selector,\n strictError\n );\n }\n return [];\n }\n if (selector === void 0 || selector(node)) {\n return [node];\n }\n if (strictError) {\n throw new Error(strictError);\n }\n return selectChildren(\n node.props.children,\n featureFlagsApi,\n selector,\n strictError\n );\n });\n}\nclass Collection {\n constructor(node, featureFlagsApi) {\n this.node = node;\n this.featureFlagsApi = featureFlagsApi;\n }\n selectByComponentData(query) {\n const selection = selectChildren(\n this.node,\n this.featureFlagsApi,\n (node) => getComponentData(node, query.key) !== void 0,\n query.withStrictError\n );\n return new Collection(selection, this.featureFlagsApi);\n }\n findComponentData(query) {\n const selection = selectChildren(\n this.node,\n this.featureFlagsApi,\n (node) => getComponentData(node, query.key) !== void 0\n );\n return selection.map((node) => getComponentData(node, query.key)).filter((data) => data !== void 0);\n }\n getElements() {\n return selectChildren(this.node, this.featureFlagsApi);\n }\n}\nfunction useElementFilter(node, filterFn, dependencies = []) {\n const featureFlagsApi = useApi(featureFlagsApiRef);\n const elements = new Collection(node, featureFlagsApi);\n return useMemo(() => filterFn(elements), [node, ...dependencies]);\n}\n\nexport { useElementFilter };\n//# sourceMappingURL=useElementFilter.esm.js.map\n","class PluginImpl {\n constructor(config) {\n this.config = config;\n }\n getId() {\n return this.config.id;\n }\n getApis() {\n return this.config.apis ?? [];\n }\n getFeatureFlags() {\n return this.config.featureFlags?.slice() ?? [];\n }\n get routes() {\n return this.config.routes ?? {};\n }\n get externalRoutes() {\n return this.config.externalRoutes ?? {};\n }\n provide(extension) {\n return extension.expose(this);\n }\n toString() {\n return `plugin{${this.config.id}}`;\n }\n}\nfunction createPlugin(config) {\n return new PluginImpl(config);\n}\n\nexport { PluginImpl, createPlugin };\n//# sourceMappingURL=Plugin.esm.js.map\n","import { getOrCreateGlobalSingleton } from '@backstage/version-bridge';\n\nconst routeRefType = getOrCreateGlobalSingleton(\n \"route-ref-type\",\n () => Symbol(\"route-ref-type\")\n);\n\nexport { routeRefType };\n//# sourceMappingURL=types.esm.js.map\n","import { routeRefType } from './types.esm.js';\n\nclass RouteRefImpl {\n constructor(id, params) {\n this.id = id;\n this.params = params;\n }\n [routeRefType] = \"absolute\";\n get title() {\n return this.id;\n }\n toString() {\n return `routeRef{type=absolute,id=${this.id}}`;\n }\n}\nfunction createRouteRef(config) {\n return new RouteRefImpl(\n config.id,\n config.params ?? []\n );\n}\n\nexport { RouteRefImpl, createRouteRef };\n//# sourceMappingURL=RouteRef.esm.js.map\n","import { routeRefType } from './types.esm.js';\n\nconst PARAM_PATTERN = /^\\w+$/;\nclass SubRouteRefImpl {\n constructor(id, path, parent, params) {\n this.id = id;\n this.path = path;\n this.parent = parent;\n this.params = params;\n }\n [routeRefType] = \"sub\";\n toString() {\n return `routeRef{type=sub,id=${this.id}}`;\n }\n}\nfunction createSubRouteRef(config) {\n const { id, path, parent } = config;\n const pathParams = path.split(\"/\").filter((p) => p.startsWith(\":\")).map((p) => p.substring(1));\n const params = [...parent.params, ...pathParams];\n if (parent.params.some((p) => pathParams.includes(p))) {\n throw new Error(\n \"SubRouteRef may not have params that overlap with its parent\"\n );\n }\n if (!path.startsWith(\"/\")) {\n throw new Error(`SubRouteRef path must start with '/', got '${path}'`);\n }\n if (path.endsWith(\"/\")) {\n throw new Error(`SubRouteRef path must not end with '/', got '${path}'`);\n }\n for (const param of pathParams) {\n if (!PARAM_PATTERN.test(param)) {\n throw new Error(`SubRouteRef path has invalid param, got '${param}'`);\n }\n }\n const subRouteRef = new SubRouteRefImpl(\n id,\n path,\n parent,\n params\n );\n return subRouteRef;\n}\n\nexport { SubRouteRefImpl, createSubRouteRef };\n//# sourceMappingURL=SubRouteRef.esm.js.map\n","import { routeRefType } from './types.esm.js';\n\nclass ExternalRouteRefImpl {\n constructor(id, params, optional, defaultTarget) {\n this.id = id;\n this.params = params;\n this.optional = optional;\n this.defaultTarget = defaultTarget;\n }\n [routeRefType] = \"external\";\n toString() {\n return `routeRef{type=external,id=${this.id}}`;\n }\n getDefaultTarget() {\n return this.defaultTarget;\n }\n}\nfunction createExternalRouteRef(options) {\n return new ExternalRouteRefImpl(\n options.id,\n options.params ?? [],\n Boolean(options.optional),\n options?.defaultTarget\n );\n}\n\nexport { ExternalRouteRefImpl, createExternalRouteRef };\n//# sourceMappingURL=ExternalRouteRef.esm.js.map\n","import { useParams } from 'react-router-dom';\n\nfunction useRouteRefParams(_routeRef) {\n return useParams();\n}\n\nexport { useRouteRefParams };\n//# sourceMappingURL=useRouteRefParams.esm.js.map\n"],"names":["AnalyticsReactContext","createVersionedContext","useAnalyticsContext","theContext","useContext","routeRef","pluginId","extension","theValue","atVersion","Error","AnalyticsContext","options","attributes","children","combinedValue","versionedCombinedValue","createVersionedValueMap","jsx","Provider","value","useApiHolder","versionedHolder","useVersionedContext","apiHolder","useApi","apiRef","api","get","withApis","apis","WrappedComponent","Hoc","props","impls","key","hasOwnProperty","ref","displayName","name","ApiRefImpl","constructor","config","this","id","split","flatMap","part","every","match","T","toString","createApiRef","analyticsApiRef","globalEvents","getOrCreateGlobalSingleton","mostRecentGatheredNavigation","mostRecentRoutableExtensionRender","beforeUnloadRegistered","routableExtensionRenderedEvent","Tracker","analyticsApi","context","addEventListener","captureEvent","once","passive","setContext","action","subject","_routeNodeType","e","console","warn","useAnalytics","trackerRef","useRef","useAnalyticsApi","tracker","current","createApiFactory","factory","instance","deps","SessionState","SessionState2","googleAuthApiRef","githubAuthApiRef","oktaAuthApiRef","gitlabAuthApiRef","microsoftAuthApiRef","oneloginAuthApiRef","bitbucketAuthApiRef","bitbucketServerAuthApiRef","atlassianAuthApiRef","vmwareCloudAuthApiRef","openshiftAuthApiRef","alertApiRef","appThemeApiRef","configApiRef","discoveryApiRef","errorApiRef","FeatureFlagState","FeatureFlagState2","featureFlagsApiRef","fetchApiRef","identityApiRef","oauthRequestApiRef","storageApiRef","useApp","versionedContext","appContext","globalStore","WeakMap","componentDataKey","attachComponentData","component","type","data","dataComponent","container","map","Map","Object","defineProperty","enumerable","configurable","writable","set","has","getComponentData","node","useRouteRef","pathname","useLocation","resolver","routeFunc","useMemo","resolve","isOptional","optional","PluginErrorBoundary","Component","getDerivedStateFromError","error","state","handleErrorReset","setState","render","app","plugin","ErrorBoundaryFallback","getComponents","resetError","createRoutableExtension","mountPoint","createReactExtension","lazy","then","InnerComponent","RoutableExtensionWrapper","analytics","message","startsWith","useEffect","componentName","createComponentExtension","lazyLoader","default","ofExtension","sync","expose","Result","Progress","Suspense","fallback","getId","entries","selectChildren","rootNode","featureFlagsApi","selector","strictError","Children","toArray","isValidElement","Fragment","isActive","with","without","Collection","selectByComponentData","query","selection","withStrictError","findComponentData","filter","getElements","useElementFilter","filterFn","dependencies","elements","PluginImpl","getApis","getFeatureFlags","featureFlags","slice","routes","externalRoutes","provide","createPlugin","routeRefType","Symbol","RouteRefImpl","params","title","createRouteRef","PARAM_PATTERN","SubRouteRefImpl","path","parent","createSubRouteRef","pathParams","p","substring","some","includes","endsWith","param","test","ExternalRouteRefImpl","defaultTarget","getDefaultTarget","createExternalRouteRef","Boolean","useRouteRefParams","_routeRef","useParams"],"sourceRoot":""}
@@ -1,2 +0,0 @@
1
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3650],{16400:(e,n,t)=>{t.d(n,{tN:()=>r}),t(31085),t(26659);var a=t(64218);function r(){const e=(0,a.useVersionedContext)("entity-context");if(!e)throw new Error("Entity context is not available");const n=e.atVersion(1);if(!n)throw new Error("EntityContext v1 not available");if(!n.entity)throw new Error("useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.");return{entity:n.entity}}(0,a.createVersionedContext)("entity-context")},18466:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"}),"Add");n.A=i},23650:(e,n,t)=>{t.r(n),t.d(n,{ApiKeyManagementTab:()=>U});var a=t(31085),r=t(95478),s=t(35015),i=t(26648),o=t(86687),l=t(42367),d=t(25010),c=t(10394),p=t(72501),u=t(31653),h=t(38605),m=t(67720),y=t(71677),v=t(29365),g=t(78467),A=t(42899),f=t(64947),x=t(76891),j=t(61477),b=t(46805),w=t(95061),k=t(48543),$=t(81215),C=t(26343),P=t(16249),S=t(93453),q=t(37757),E=t(22097),R=t(16400),I=t(32269),T=t(61524),z=t(93246),K=t(92399),B=t(18466),_=t(71407),H=t(99594),D=t(77225),N=t(39053),G=t(34955),V=t(46205),W=t(16397),M=t(63221);function L(e,n,t){const a=t?`${t} `:"";return{curl:`curl -X GET ${e} \\\n -H "Authorization: ${t?`${t} ${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n 'Authorization': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("Authorization", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}const U=({namespace:e})=>{var n,t,U,X,F;const{entity:O}=(0,R.tN)(),J=(0,E.useApi)(E.configApiRef),Y=(0,E.useApi)(E.identityApiRef),Q=(0,E.useApi)(E.fetchApiRef),Z=(0,E.useApi)(E.alertApiRef),ee=J.getString("backend.baseUrl"),[ne,te]=(0,r.useState)(new Set),[ae,re]=(0,r.useState)(0),[se,ie]=(0,r.useState)(""),[oe,le]=(0,r.useState)(""),[de,ce]=(0,r.useState)(!1),[pe,ue]=(0,r.useState)(""),[he,me]=(0,r.useState)(""),[ye,ve]=(0,r.useState)(!1),[ge,Ae]=(0,r.useState)(null),[fe,xe]=(0,r.useState)(!1),[je,be]=(0,r.useState)(null),[we,ke]=(0,r.useState)(null),[$e,Ce]=(0,r.useState)(null),[Pe,Se]=(0,r.useState)(null),[qe,Ee]=(0,r.useState)(new Set),[Re,Ie]=(0,r.useState)({open:!1,request:null}),[Te,ze]=(0,r.useState)(new Map),[Ke,Be]=(0,r.useState)(new Set),[_e,He]=(0,r.useState)(new Set),[De,Ne]=(0,r.useState)(!1),[Ge,Ve]=(0,r.useState)(null),We=(null===(n=O.metadata.annotations)||void 0===n?void 0:n["kuadrant.io/apiproduct"])||O.metadata.name,Me=(null===(t=O.metadata.annotations)||void 0===t?void 0:t["kuadrant.io/namespace"])||e||"default";(0,s.A)(async()=>{const e=await Y.getBackstageIdentity(),n=await Y.getProfileInfo();ie(e.userEntityRef),le(n.email||"")},[Y]);const{value:Le,loading:Ue,error:Xe}=(0,s.A)(async()=>{const e=await Q.fetch(`${ee}/api/kuadrant/requests/my?namespace=${Me}`);if(!e.ok)throw new Error("failed to fetch requests");return((await e.json()).items||[]).filter(e=>e.spec.apiProductRef.name===We&&e.metadata.namespace===Me)},[We,Me,ae,Q,ee]),{value:Fe,loading:Oe,error:Je}=(0,s.A)(async()=>{var e;const n=await Q.fetch(`${ee}/api/kuadrant/apiproducts`);if(!n.ok)throw new Error("failed to fetch api products");return null===(e=(await n.json()).items)||void 0===e?void 0:e.find(e=>e.metadata.namespace===Me&&e.metadata.name===We)},[Me,We,Q]),Ye=Fe?`apiproduct:${Fe.metadata.namespace}/${Fe.metadata.name}`:void 0,{allowed:Qe,loading:Ze,error:en}=(0,V.l)(G.dp,Ye),{allowed:nn,loading:tn,error:an}=(0,V.l)(G.uL),{allowed:rn,loading:sn,error:on}=(0,V.l)(G.jH),{allowed:ln,loading:dn,error:cn}=(0,V.l)(G.q0),pn=()=>{ke(null),Ce(null)},un=()=>{$e&&(be($e),xe(!0),pn())},hn=()=>{if(!$e)return;const e=$e;pn(),Ie({open:!0,request:e})},mn=e=>{te(n=>{const t=new Set(n);return t.has(e)?t.delete(e):t.add(e),t})},yn=(0,r.useMemo)(()=>[{render:e=>{var n;const t=e.rowData;if(!(null==t||null===(n=t.metadata)||void 0===n?void 0:n.name))return(0,a.jsx)(c.A,{});const r=`${t.metadata.namespace}/${t.metadata.name}`,s=Te.get(r);return(0,a.jsx)(vn,{request:t,apiName:We,revealedApiKey:s})}}],[We,Te]),vn=({request:e,apiName:n,revealedApiKey:t})=>{var s,o,l;const[d,m]=(0,r.useState)(0),y=(null===(s=e.status)||void 0===s?void 0:s.apiHostname)||`${n}.apps.example.com`,v=t||"<your-api-key>",g=function(e,n,t){const a=`https://${n}/api/v1/endpoint`;return e?e.authorizationHeader?L(a,t,e.authorizationHeader.prefix||""):e.customHeader?function(e,n,t,a){return{curl:`curl -X GET ${e} \\\n -H "${t}: ${a?`${a}${n}`:n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${t}': '${a}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nheaders = {\n '${t}': '${a}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.Header.Add("${t}", "${a}" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.customHeader.name,e.customHeader.prefix||""):e.queryString?function(e,n,t){return{curl:`curl -X GET "${e}?${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}?${t}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\nparams = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}?${t}=" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.queryString.name):e.cookie?function(e,n,t){return{curl:`curl -X GET ${e} \\\n --cookie "${t}=${n}"`,nodejs:`const fetch = require('node-fetch');\n\nconst apiKey = '${n}';\nconst endpoint = '${e}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${t}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,python:`import requests\n\napi_key = '${n}'\nendpoint = '${e}'\n\ncookies = {\n '${t}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,go:`package main\n\nimport (\n "fmt"\n "net/http"\n "io"\n)\n\nfunc main() {\n apiKey := "${n}"\n endpoint := "${e}"\n\n client := &http.Client{}\n req, _ := http.NewRequest("GET", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: "${t}",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println("Error:", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`}}(a,t,e.cookie.name):L(a,t,"Bearer"):L(a,t,"Bearer")}(null===(l=e.status)||void 0===l||null===(o=l.authScheme)||void 0===o?void 0:o.credentials,y,v);return(0,a.jsxs)(c.A,{p:3,bgcolor:"background.default",onClick:e=>e.stopPropagation(),children:[e.spec.useCase&&(0,a.jsxs)(c.A,{mb:3,children:[(0,a.jsx)(p.A,{variant:"h6",gutterBottom:!0,children:"Use Case"}),(0,a.jsx)(c.A,{p:2,bgcolor:"background.paper",borderRadius:1,border:"1px solid rgba(0, 0, 0, 0.12)",children:(0,a.jsx)(p.A,{variant:"body2",style:{whiteSpace:"pre-wrap",wordBreak:"break-word",overflowWrap:"break-word"},children:e.spec.useCase})})]}),(0,a.jsx)(p.A,{variant:"h6",gutterBottom:!0,children:"Usage Examples"}),(0,a.jsxs)(p.A,{variant:"body2",paragraph:!0,children:["Use these code examples to test the API with your"," ",e.spec.planTier," tier key."]}),(0,a.jsx)(c.A,{onClick:e=>e.stopPropagation(),children:(0,a.jsxs)(u.A,{value:d,onChange:(e,n)=>{e.stopPropagation(),m(n)},indicatorColor:"primary",children:[(0,a.jsx)(h.A,{label:"cURL",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Node.js",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Python",onClick:e=>e.stopPropagation()}),(0,a.jsx)(h.A,{label:"Go",onClick:e=>e.stopPropagation()})]})}),(0,a.jsxs)(c.A,{mt:2,children:[0===d&&(0,a.jsx)(i.z,{text:g.curl,language:"bash",showCopyCodeButton:!0}),1===d&&(0,a.jsx)(i.z,{text:g.nodejs,language:"javascript",showCopyCodeButton:!0}),2===d&&(0,a.jsx)(i.z,{text:g.python,language:"python",showCopyCodeButton:!0}),3===d&&(0,a.jsx)(i.z,{text:g.go,language:"go",showCopyCodeButton:!0})]})]})},gn=Xe||Je,An=en||an||on||cn;if(Ue||Oe||Ze||tn||sn||dn)return(0,a.jsx)(o.k,{});if(gn)return(0,a.jsx)(l._,{error:gn});if(An){const e=en?"kuadrant.apikey.create":an?"kuadrant.apikey.delete.own":on?"kuadrant.apikey.delete.all":cn?"kuadrant.apikey.update.own":"unknown";return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(p.A,{color:"error",children:["Unable to check permissions: ",An.message]}),(0,a.jsxs)(p.A,{variant:"body2",color:"textSecondary",children:["Permission: ",e]}),(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Please try again or contact your administrator"})]})}const fn=(Le||[]).filter(e=>!qe.has(e.metadata.name)),xn=(null==Fe||null===(U=Fe.status)||void 0===U?void 0:U.discoveredPlans)||[],jn=fn.filter(e=>{var n;return!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase}),bn=fn.filter(e=>{var n;return"Approved"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),wn=fn.filter(e=>{var n;return"Rejected"===(null===(n=e.status)||void 0===n?void 0:n.phase)}),kn=[{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Approved",field:"status.reviewedAt",render:e=>{var n;return(0,a.jsx)(p.A,{variant:"body2",children:(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?new Date(e.status.reviewedAt).toLocaleDateString():"-"})}},{title:"API Key",field:"status.secretRef",searchable:!1,filtering:!1,render:e=>{var n,t,r;const s=`${e.metadata.namespace}/${e.metadata.name}`,i=ne.has(e.metadata.name),o=Ke.has(s),l=Te.get(s),d=null===(t=e.status)||void 0===t||null===(n=t.secretRef)||void 0===n?void 0:n.name,u=!1!==(null===(r=e.status)||void 0===r?void 0:r.canReadSecret),h=_e.has(s)||!u;return d?h&&!l?(0,a.jsx)(y.Ay,{title:"This API key has already been viewed and cannot be retrieved again",children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",style:{fontFamily:"monospace",marginRight:8},children:"Already viewed"}),(0,a.jsx)(T.A,{fontSize:"small",color:"disabled"})]})}):(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(p.A,{variant:"body2",style:{fontFamily:"monospace",marginRight:8},children:o?"Loading...":i&&l?l:"••••••••••••••••"}),i&&l&&(0,a.jsx)(y.Ay,{title:"Copy to clipboard",children:(0,a.jsx)(v.A,{size:"small",onClick:async()=>{l&&(await navigator.clipboard.writeText(l),Z.post({message:"API key copied to clipboard",severity:"success",display:"transient"}))},children:(0,a.jsx)(H.A,{fontSize:"small"})})}),(0,a.jsx)(y.Ay,{title:i?"Hide API key":"Reveal API key (one-time only)",children:(0,a.jsx)("span",{children:(0,a.jsx)(v.A,{size:"small",onClick:()=>{i?(((e,n)=>{const t=`${e}/${n}`;ze(e=>{const n=new Map(e);return n.delete(t),n})})(e.metadata.namespace,e.metadata.name),mn(e.metadata.name)):h||(Ve({namespace:e.metadata.namespace,name:e.metadata.name}),Ne(!0))},disabled:o||h&&!l,children:i?(0,a.jsx)(T.A,{}):(0,a.jsx)(I.A,{})})})})]}):(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Awaiting secret..."})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{if(Pe===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const n=e.spec.requestedBy.userId;return(0,V.W)(n,se,nn,rn)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ke({top:t.bottom,left:t.left}),Ce(e)},title:"Actions","aria-controls":we?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(_.A,{})}):null}}],$n=[{title:"Status",field:"status.phase",render:e=>{var n;const t=(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending",r="Pending"===t;return(0,a.jsx)(m.A,{label:t,size:"small",icon:r?(0,a.jsx)(z.A,{}):(0,a.jsx)(K.A,{}),color:r?"default":"secondary"})}},{title:"Tier",field:"spec.planTier",render:e=>(0,a.jsx)(m.A,{label:e.spec.planTier,color:"primary",size:"small"})},{title:"Use Case",field:"spec.useCase",render:e=>e.spec.useCase?(0,a.jsx)(y.Ay,{title:e.spec.useCase,placement:"top",children:(0,a.jsx)(p.A,{variant:"body2",style:{maxWidth:"200px",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.spec.useCase})}):(0,a.jsx)(p.A,{variant:"body2",children:"-"})},{title:"Requested",field:"metadata.creationTimestamp",render:e=>(0,a.jsx)(p.A,{variant:"body2",children:e.metadata.creationTimestamp?new Date(e.metadata.creationTimestamp).toLocaleDateString():"-"})},{title:"Reviewed",field:"status.reviewedAt",render:e=>{var n;return(null===(n=e.status)||void 0===n?void 0:n.reviewedAt)?(0,a.jsx)(p.A,{variant:"body2",children:new Date(e.status.reviewedAt).toLocaleDateString()}):(0,a.jsx)(p.A,{variant:"body2",children:"-"})}},{title:"",field:"actions",searchable:!1,filtering:!1,render:e=>{var n;if(Pe===e.metadata.name)return(0,a.jsx)(g.A,{size:20});const t=!(null===(n=e.status)||void 0===n?void 0:n.phase)||"Pending"===e.status.phase,r=e.spec.requestedBy.userId,s=(0,V.W)(r,se,nn,rn);return t&&(ln&&r===se||s)?(0,a.jsx)(v.A,{size:"small",onClick:n=>{n.stopPropagation();const t=n.currentTarget.getBoundingClientRect();ke({top:t.bottom,left:t.left}),Ce(e)},title:"Actions","aria-controls":we?"actions-menu":void 0,"aria-haspopup":"true",children:(0,a.jsx)(_.A,{})}):null}}],Cn=$n.filter(e=>"Reviewed"!==e.title&&"Reason"!==e.title);return(0,a.jsxs)(c.A,{p:2,children:[(0,a.jsxs)(A.A,{container:!0,spacing:3,direction:"column",children:[Qe&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsxs)(c.A,{display:"flex",flexDirection:"column",alignItems:"flex-end",mb:2,children:[(0,a.jsx)(f.A,{variant:"contained",color:"primary",startIcon:(0,a.jsx)(B.A,{}),onClick:()=>ce(!0),disabled:0===xn.length,"data-testid":"request-api-access-button","data-plans-count":xn.length,children:"Request API Access"}),0===xn.length&&(0,a.jsx)(p.A,{variant:"caption",color:"textSecondary",style:{marginTop:4},"data-testid":"no-plans-message",children:Fe?(()=>{var e,n,t,a;const r=null===(n=Fe.status)||void 0===n||null===(e=n.conditions)||void 0===e?void 0:e.find(e=>"Ready"===e.type),s=null===(a=Fe.status)||void 0===a||null===(t=a.conditions)||void 0===t?void 0:t.find(e=>"PlanPolicyDiscovered"===e.type);return"True"!==(null==r?void 0:r.status)?`HTTPRoute not ready: ${(null==r?void 0:r.message)||"unknown"}`:"True"!==(null==s?void 0:s.status)?`No plans discovered: ${(null==s?void 0:s.message)||"no PlanPolicy found"}`:"No plans available"})():"API product not found"})]})}),0===jn.length&&0===wn.length&&0===bn.length&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(c.A,{p:3,textAlign:"center",children:(0,a.jsx)(p.A,{variant:"body1",color:"textSecondary",children:"No API keys yet. Request access to get started."})})}),jn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Pending Requests",options:{paging:jn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:Cn,data:jn})}),wn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"Rejected Requests",options:{paging:wn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:$n,data:wn})}),bn.length>0&&(0,a.jsx)(A.A,{item:!0,children:(0,a.jsx)(d.X,{title:"API Keys",options:{paging:bn.length>5,pageSize:20,search:!0,filtering:!0,debounceInterval:300,toolbar:!0,emptyRowsWhenPaging:!1},columns:kn,data:bn,detailPanel:yn},"api-keys-table")})]}),(0,a.jsxs)(x.A,{open:de,onClose:()=>ce(!1),maxWidth:"sm",fullWidth:!0,children:[(0,a.jsx)(j.A,{children:"Request API Access"}),(0,a.jsxs)(b.A,{children:[(0,a.jsxs)(c.A,{mb:2,p:1.5,bgcolor:"info.light",borderRadius:1,display:"flex",alignItems:"flex-start",style:{gap:8},children:[(0,a.jsx)(N.A,{color:"primary",fontSize:"small",style:{marginTop:2}}),(0,a.jsx)(p.A,{variant:"body2",children:"Your request will be reviewed by an API owner before access is granted."})]}),ge&&(0,a.jsx)(c.A,{mb:2,p:2,bgcolor:"error.main",color:"error.contrastText",borderRadius:1,children:(0,a.jsx)(p.A,{variant:"body2",children:ge})}),(0,a.jsxs)(w.A,{fullWidth:!0,margin:"normal",disabled:ye,"data-testid":"tier-select-form",children:[(0,a.jsx)(k.A,{id:"tier-select-label",children:"Select Tier"}),(0,a.jsx)($.A,{labelId:"tier-select-label","data-testid":"tier-select",value:pe,onChange:e=>ue(e.target.value),disabled:ye,children:xn.map(e=>{const n=Object.entries(e.limits||{}).map(([e,n])=>`${n} per ${e}`).join(", ");return(0,a.jsxs)(C.A,{value:e.tier,"data-testid":`tier-option-${e.tier}`,children:[e.tier," ",n?`(${n})`:""]},e.tier)})})]}),(0,a.jsx)(P.A,{label:"Use Case (optional)",placeholder:"Describe how you plan to use this API",multiline:!0,rows:3,fullWidth:!0,margin:"normal",value:he,onChange:e=>me(e.target.value),helperText:"Explain your intended use of this API for admin review",disabled:ye})]}),(0,a.jsxs)(S.A,{children:[(0,a.jsx)(f.A,{onClick:()=>ce(!1),disabled:ye,children:"Cancel"}),(0,a.jsx)(f.A,{onClick:async()=>{if(pe){ve(!0),Ae(null);try{const e=await Q.fetch(`${ee}/api/kuadrant/requests`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({apiProductName:We,namespace:Me,planTier:pe,useCase:he.trim()||"",userEmail:oe})});if(!e.ok){const n=await e.json().catch(()=>({}));throw new Error(n.error||`failed to create request: ${e.status}`)}Z.post({message:"API key requested successfully",severity:"success",display:"transient"}),ce(!1),ue(""),me(""),re(e=>e+1)}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";Z.post({message:`Failed to request API key: ${n}`,severity:"error",display:"transient"}),Ae(n)}finally{ve(!1)}}},color:"primary",variant:"contained",disabled:!pe||ye,startIcon:ye?(0,a.jsx)(g.A,{size:16,color:"inherit"}):void 0,children:ye?"Submitting...":"Submit Request"})]})]}),(0,a.jsx)(q.A,{id:"actions-menu",open:Boolean(we),onClose:pn,anchorReference:"anchorPosition",anchorPosition:we||{top:0,left:0},children:$e&&(()=>{var e;const n=!(null===(e=$e.status)||void 0===e?void 0:e.phase)||"Pending"===$e.status.phase,t=$e.spec.requestedBy.userId,r=[];return ln&&t===se&&n&&r.push((0,a.jsx)(C.A,{onClick:un,children:"Edit"},"edit")),r.push((0,a.jsx)(C.A,{onClick:hn,children:"Delete"},"delete")),r})()}),je&&(0,a.jsx)(W.e,{open:fe,onClose:()=>{xe(!1),be(null)},onSuccess:()=>{re(e=>e+1),xe(!1),Z.post({message:"API key updated",severity:"success",display:"transient"}),be(null)},request:je,availablePlans:xn}),(0,a.jsx)(M.K,{open:Re.open,title:"Delete Request",description:`Are you sure you want to delete this ${"Approved"===(null===(F=Re.request)||void 0===F||null===(X=F.status)||void 0===X?void 0:X.phase)?"API key":"request"}?`,deleting:null!==Pe,onConfirm:async()=>{Re.request&&(await(async e=>{Ee(n=>new Set(n).add(e)),Se(e);try{if(!(await Q.fetch(`${ee}/api/kuadrant/requests/${Me}/${e}`,{method:"DELETE"})).ok)throw new Error("failed to delete request");Z.post({message:"API key deleted successfully",severity:"success",display:"transient"}),re(e=>e+1)}catch(n){const t=n instanceof Error?n.message:"unknown error occurred";Ee(n=>{const t=new Set(n);return t.delete(e),t}),Z.post({message:`Failed to delete API key: ${t}`,severity:"error",display:"transient"})}finally{Se(null)}})(Re.request.metadata.name),Ie({open:!1,request:null}))},onCancel:()=>{Ie({open:!1,request:null})}}),(0,a.jsxs)(x.A,{open:De,onClose:()=>{Ne(!1),Ve(null)},maxWidth:"sm",children:[(0,a.jsx)(j.A,{children:(0,a.jsxs)(c.A,{display:"flex",alignItems:"center",children:[(0,a.jsx)(D.A,{color:"primary",style:{marginRight:8}}),"View API Key"]})}),(0,a.jsxs)(b.A,{children:[(0,a.jsxs)(p.A,{variant:"body1",paragraph:!0,children:["This API key can only be viewed ",(0,a.jsx)("strong",{children:"once"}),". After you reveal it, you will not be able to retrieve it again."]}),(0,a.jsx)(p.A,{variant:"body2",color:"textSecondary",children:"Make sure to copy and store it securely before closing this view."})]}),(0,a.jsxs)(S.A,{children:[(0,a.jsx)(f.A,{onClick:()=>{Ne(!1),Ve(null)},children:"Cancel"}),(0,a.jsx)(f.A,{variant:"contained",color:"primary",onClick:()=>{Ge&&((async(e,n)=>{const t=`${e}/${n}`;if(!Ke.has(t)){Be(e=>new Set(e).add(t));try{const a=await Q.fetch(`${ee}/api/kuadrant/apikeys/${e}/${n}/secret`);if(a.ok){const e=await a.json();ze(n=>new Map(n).set(t,e.apiKey)),He(e=>new Set(e).add(t))}else 403===a.status&&(He(e=>new Set(e).add(t)),Z.post({message:"This API key has already been viewed and cannot be retrieved again.",severity:"warning",display:"transient"}))}catch(e){const n=e instanceof Error?e.message:"unknown error occurred";Z.post({message:`Failed to fetch api key: ${n}`,severity:"error",display:"transient"})}finally{Be(e=>{const n=new Set(e);return n.delete(t),n})}}})(Ge.namespace,Ge.name),mn(Ge.name)),Ne(!1),Ve(null)},children:"Reveal API Key"})]})]})]})}},39053:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"}),"Info");n.A=i},71407:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z"}),"MoreVert");n.A=i},93246:(e,n,t)=>{var a=t(4293),r=t(78920);n.A=void 0;var s=r(t(95478)),i=(0,a(t(74044)).default)(s.createElement("path",{d:"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z"}),"HourglassEmpty");n.A=i}}]);
2
- //# sourceMappingURL=3650.515c743a.chunk.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static/3650.515c743a.chunk.js","mappings":"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","sources":["webpack://internal.plugin-kuadrant/../../node_modules/@backstage/plugin-catalog-react/dist/hooks/useEntity.esm.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Add.js","webpack://internal.plugin-kuadrant/./src/utils/codeSnippets.ts","webpack://internal.plugin-kuadrant/./src/components/ApiKeyManagementTab/ApiKeyManagementTab.tsx","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/Info.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/MoreVert.js","webpack://internal.plugin-kuadrant/../../node_modules/@material-ui/icons/HourglassEmpty.js"],"sourcesContent":["import { jsx } from 'react/jsx-runtime';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { AnalyticsContext } from '@backstage/core-plugin-api';\nimport { createVersionedContext, useVersionedContext, createVersionedValueMap } from '@backstage/version-bridge';\n\nconst NewEntityContext = createVersionedContext(\n \"entity-context\"\n);\nconst AsyncEntityProvider = (props) => {\n const { children, entity, loading, error, refresh } = props;\n const value = { entity, loading, error, refresh };\n return /* @__PURE__ */ jsx(NewEntityContext.Provider, { value: createVersionedValueMap({ 1: value }), children: /* @__PURE__ */ jsx(\n AnalyticsContext,\n {\n attributes: {\n ...entity ? { entityRef: stringifyEntityRef(entity) } : void 0\n },\n children\n }\n ) });\n};\nconst EntityProvider = (props) => /* @__PURE__ */ jsx(\n AsyncEntityProvider,\n {\n entity: props.entity,\n loading: !Boolean(props.entity),\n error: void 0,\n refresh: void 0,\n children: props.children\n }\n);\nfunction useEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n if (!value.entity) {\n throw new Error(\n \"useEntity hook is being called outside of an EntityLayout where the entity has not been loaded. If this is intentional, please use useAsyncEntity instead.\"\n );\n }\n return { entity: value.entity };\n}\nfunction useAsyncEntity() {\n const versionedHolder = useVersionedContext(\n \"entity-context\"\n );\n if (!versionedHolder) {\n throw new Error(\"Entity context is not available\");\n }\n const value = versionedHolder.atVersion(1);\n if (!value) {\n throw new Error(\"EntityContext v1 not available\");\n }\n const { entity, loading, error, refresh } = value;\n return { entity, loading, error, refresh };\n}\n\nexport { AsyncEntityProvider, EntityProvider, useAsyncEntity, useEntity };\n//# sourceMappingURL=useEntity.esm.js.map\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z\"\n}), 'Add');\n\nexports.default = _default;","import { Credentials } from '../types/api-management';\n\nexport interface CodeSnippets {\n curl: string;\n nodejs: string;\n python: string;\n go: string;\n}\n\nexport function generateAuthCodeSnippets(\n credentials: Credentials | undefined,\n hostname: string,\n apiKey: string,\n): CodeSnippets {\n const baseUrl = `https://${hostname}/api/v1/endpoint`;\n\n if (!credentials) {\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n }\n\n if (credentials.authorizationHeader) {\n const prefix = credentials!.authorizationHeader!.prefix || '';\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, prefix);\n }\n\n if (credentials.customHeader) {\n const headerName = credentials!.customHeader!.name;\n const prefix = credentials!.customHeader!.prefix || '';\n return generateCustomHeaderSnippets(baseUrl, apiKey, headerName, prefix);\n }\n\n\n if (credentials.queryString) {\n const paramName = credentials!.queryString!.name;\n return generateQueryStringSnippets(baseUrl, apiKey, paramName);\n }\n\n if (credentials.cookie) {\n const cookieName = credentials!.cookie!.name;\n return generateCookieSnippets(baseUrl, apiKey, cookieName);\n }\n // Default to Authorization Bearer if no authScheme specified\n return generateAuthorizationHeaderSnippets(baseUrl, apiKey, 'Bearer');\n}\n\nfunction generateAuthorizationHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n prefix: string,\n): CodeSnippets {\n const authValue = prefix ? `${prefix} ${apiKey}` : apiKey;\n const prefixWithSpace = prefix ? `${prefix} ` : '';\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"Authorization: ${authValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Authorization': '${prefixWithSpace}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n 'Authorization': '${prefixWithSpace}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"Authorization\", \"${prefixWithSpace}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCustomHeaderSnippets(\n baseUrl: string,\n apiKey: string,\n headerName: string,\n prefix: string,\n): CodeSnippets {\n const headerValue = prefix ? `${prefix}${apiKey}` : apiKey;\n\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n -H \"${headerName}: ${headerValue}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n '${headerName}': '${prefix}' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nheaders = {\n '${headerName}': '${prefix}' + api_key\n}\n\nresponse = requests.get(endpoint, headers=headers)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.Header.Add(\"${headerName}\", \"${prefix}\" + apiKey)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateQueryStringSnippets(\n baseUrl: string,\n apiKey: string,\n paramName: string,\n): CodeSnippets {\n const urlWithParam = `${baseUrl}?${paramName}=${apiKey}`;\n\n return {\n curl: `curl -X GET \"${urlWithParam}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}?${paramName}=' + apiKey;\n\nfetch(endpoint, {\n method: 'GET'\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\nparams = {\n '${paramName}': api_key\n}\n\nresponse = requests.get(endpoint, params=params)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}?${paramName}=\" + apiKey\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n\nfunction generateCookieSnippets(\n baseUrl: string,\n apiKey: string,\n cookieName: string,\n): CodeSnippets {\n return {\n curl: `curl -X GET ${baseUrl} \\\\\n --cookie \"${cookieName}=${apiKey}\"`,\n\n nodejs: `const fetch = require('node-fetch');\n\nconst apiKey = '${apiKey}';\nconst endpoint = '${baseUrl}';\n\nfetch(endpoint, {\n method: 'GET',\n headers: {\n 'Cookie': '${cookieName}=' + apiKey\n }\n})\n .then(response => response.json())\n .then(data => console.log(data))\n .catch(error => console.error('Error:', error));`,\n\n python: `import requests\n\napi_key = '${apiKey}'\nendpoint = '${baseUrl}'\n\ncookies = {\n '${cookieName}': api_key\n}\n\nresponse = requests.get(endpoint, cookies=cookies)\nprint(response.json())`,\n\n go: `package main\n\nimport (\n \"fmt\"\n \"net/http\"\n \"io\"\n)\n\nfunc main() {\n apiKey := \"${apiKey}\"\n endpoint := \"${baseUrl}\"\n\n client := &http.Client{}\n req, _ := http.NewRequest(\"GET\", endpoint, nil)\n req.AddCookie(&http.Cookie{\n Name: \"${cookieName}\",\n Value: apiKey,\n })\n\n resp, err := client.Do(req)\n if err != nil {\n fmt.Println(\"Error:\", err)\n return\n }\n defer resp.Body.Close()\n\n body, _ := io.ReadAll(resp.Body)\n fmt.Println(string(body))\n}`,\n };\n}\n","import React, { useState, useMemo } from \"react\";\nimport { useAsync } from \"react-use\";\nimport {\n Table,\n TableColumn,\n Progress,\n ResponseErrorPanel,\n CodeSnippet,\n} from \"@backstage/core-components\";\nimport {\n IconButton,\n Typography,\n Box,\n Chip,\n Grid,\n Button,\n Dialog,\n DialogTitle,\n DialogContent,\n DialogActions,\n TextField,\n Select,\n MenuItem,\n FormControl,\n InputLabel,\n Tabs,\n Tab,\n Menu,\n Tooltip,\n CircularProgress,\n} from \"@material-ui/core\";\nimport {\n useApi,\n configApiRef,\n identityApiRef,\n fetchApiRef,\n alertApiRef,\n} from \"@backstage/core-plugin-api\";\nimport { useEntity } from \"@backstage/plugin-catalog-react\";\nimport VisibilityIcon from \"@material-ui/icons/Visibility\";\nimport VisibilityOffIcon from \"@material-ui/icons/VisibilityOff\";\nimport HourglassEmptyIcon from \"@material-ui/icons/HourglassEmpty\";\nimport CancelIcon from \"@material-ui/icons/Cancel\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport MoreVertIcon from \"@material-ui/icons/MoreVert\";\nimport FileCopyIcon from \"@material-ui/icons/FileCopy\";\nimport WarningIcon from \"@material-ui/icons/Warning\";\nimport InfoIcon from \"@material-ui/icons/Info\";\nimport { APIKey } from \"../../types/api-management\";\nimport {\n kuadrantApiKeyCreatePermission,\n kuadrantApiKeyDeleteOwnPermission,\n kuadrantApiKeyDeleteAllPermission,\n kuadrantApiKeyUpdateOwnPermission,\n} from \"../../permissions\";\nimport {\n useKuadrantPermission,\n canDeleteResource,\n} from \"../../utils/permissions\";\nimport { EditAPIKeyDialog } from \"../EditAPIKeyDialog\";\nimport { ConfirmDeleteDialog } from \"../ConfirmDeleteDialog\";\nimport { generateAuthCodeSnippets } from \"../../utils/codeSnippets\";\n\ninterface APIProduct {\n metadata: {\n name: string;\n namespace: string;\n };\n spec: {\n displayName?: string;\n };\n status?: {\n discoveredPlans?: Array<{\n tier: string;\n description?: string;\n limits?: any;\n }>;\n conditions?: Array<{\n type: string;\n status: \"True\" | \"False\" | \"Unknown\";\n reason?: string;\n message?: string;\n lastTransitionTime?: string;\n }>;\n };\n}\n\ninterface Plan {\n tier: string;\n limits: any;\n}\n\nexport interface ApiKeyManagementTabProps {\n namespace?: string;\n}\n\nexport const ApiKeyManagementTab = ({\n namespace: propNamespace,\n}: ApiKeyManagementTabProps) => {\n const { entity } = useEntity();\n const config = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const fetchApi = useApi(fetchApiRef);\n const alertApi = useApi(alertApiRef);\n const backendUrl = config.getString(\"backend.baseUrl\");\n const [visibleKeys, setVisibleKeys] = useState<Set<string>>(new Set());\n const [refresh, setRefresh] = useState(0);\n const [userId, setUserId] = useState<string>(\"\");\n const [userEmail, setUserEmail] = useState<string>(\"\");\n const [open, setOpen] = useState(false);\n const [selectedPlan, setSelectedPlan] = useState(\"\");\n const [useCase, setUseCase] = useState(\"\");\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [editDialogOpen, setEditDialogOpen] = useState(false);\n const [requestToEdit, setRequestToEdit] = useState<APIKey | null>(null);\n const [menuAnchor, setMenuAnchor] = useState<{\n top: number;\n left: number;\n } | null>(null);\n const [menuRequest, setMenuRequest] = useState<APIKey | null>(null);\n const [deleting, setDeleting] = useState<string | null>(null);\n const [optimisticallyDeleted, setOptimisticallyDeleted] = useState<\n Set<string>\n >(new Set());\n const [deleteDialogState, setDeleteDialogState] = useState<{\n open: boolean;\n request: APIKey | null;\n }>({ open: false, request: null });\n const [apiKeyValues, setApiKeyValues] = useState<Map<string, string>>(\n new Map(),\n );\n const [apiKeyLoading, setApiKeyLoading] = useState<Set<string>>(new Set());\n const [alreadyReadKeys, setAlreadyReadKeys] = useState<Set<string>>(\n new Set(),\n );\n const [showOnceWarningOpen, setShowOnceWarningOpen] = useState(false);\n const [pendingKeyReveal, setPendingKeyReveal] = useState<{\n namespace: string;\n name: string;\n } | null>(null);\n\n // get apiproduct name from entity annotation (set by entity provider)\n const apiProductName =\n entity.metadata.annotations?.[\"kuadrant.io/apiproduct\"] ||\n entity.metadata.name;\n const namespace =\n entity.metadata.annotations?.[\"kuadrant.io/namespace\"] ||\n propNamespace ||\n \"default\";\n\n useAsync(async () => {\n const identity = await identityApi.getBackstageIdentity();\n const profile = await identityApi.getProfileInfo();\n setUserId(identity.userEntityRef);\n setUserEmail(profile.email || \"\");\n }, [identityApi]);\n\n const {\n value: requests,\n loading: requestsLoading,\n error: requestsError,\n } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/my?namespace=${namespace}`,\n );\n if (!response.ok) {\n throw new Error(\"failed to fetch requests\");\n }\n const data = await response.json();\n // filter by apiproduct name, not httproute name\n return (data.items || []).filter(\n (r: APIKey) =>\n r.spec.apiProductRef.name === apiProductName &&\n r.metadata.namespace === namespace, // APIProducts and APIKeys (and its Secret) will be in the same NS\n );\n }, [apiProductName, namespace, refresh, fetchApi, backendUrl]);\n\n const {\n value: apiProduct,\n loading: plansLoading,\n error: plansError,\n } = useAsync(async () => {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apiproducts`,\n );\n if (!response.ok) {\n throw new Error(\"failed to fetch api products\");\n }\n const data = await response.json();\n\n const product = data.items?.find(\n (p: APIProduct) =>\n p.metadata.namespace === namespace &&\n p.metadata.name === apiProductName,\n );\n\n return product;\n }, [namespace, apiProductName, fetchApi]);\n\n // check permissions with resource reference once we have the apiproduct\n const resourceRef = apiProduct\n ? `apiproduct:${apiProduct.metadata.namespace}/${apiProduct.metadata.name}`\n : undefined;\n\n const {\n allowed: canCreateRequest,\n loading: createRequestPermissionLoading,\n error: createRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyCreatePermission, resourceRef);\n\n const {\n allowed: canDeleteOwnKey,\n loading: deleteOwnPermissionLoading,\n error: deleteOwnPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteOwnPermission);\n\n const {\n allowed: canDeleteAllKeys,\n loading: deleteAllPermissionLoading,\n error: deleteAllPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyDeleteAllPermission);\n\n const {\n allowed: canUpdateRequest,\n loading: updateRequestPermissionLoading,\n error: updateRequestPermissionError,\n } = useKuadrantPermission(kuadrantApiKeyUpdateOwnPermission);\n\n const handleDeleteRequest = async (name: string) => {\n // optimistic update - remove from UI immediately\n setOptimisticallyDeleted((prev) => new Set(prev).add(name));\n setDeleting(name);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests/${namespace}/${name}`,\n { method: \"DELETE\" },\n );\n if (!response.ok) {\n throw new Error(\"failed to delete request\");\n }\n alertApi.post({\n message: \"API key deleted successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n // rollback optimistic update on error\n setOptimisticallyDeleted((prev) => {\n const next = new Set(prev);\n next.delete(name);\n return next;\n });\n alertApi.post({\n message: `Failed to delete API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setDeleting(null);\n }\n };\n\n const fetchApiKeyFromSecret = async (\n requestNamespace: string,\n requestName: string,\n ) => {\n const key = `${requestNamespace}/${requestName}`;\n if (apiKeyLoading.has(key)) {\n return;\n }\n\n setApiKeyLoading((prev) => new Set(prev).add(key));\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/apikeys/${requestNamespace}/${requestName}/secret`,\n );\n if (response.ok) {\n const data = await response.json();\n setApiKeyValues((prev) => new Map(prev).set(key, data.apiKey));\n // after successful read, mark as already read (show-once behaviour)\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n } else if (response.status === 403) {\n // secret has already been read\n setAlreadyReadKeys((prev) => new Set(prev).add(key));\n alertApi.post({\n message:\n \"This API key has already been viewed and cannot be retrieved again.\",\n severity: \"warning\",\n display: \"transient\",\n });\n }\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to fetch api key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n } finally {\n setApiKeyLoading((prev) => {\n const next = new Set(prev);\n next.delete(key);\n return next;\n });\n }\n };\n\n const clearApiKeyValue = (requestNamespace: string, requestName: string) => {\n const key = `${requestNamespace}/${requestName}`;\n setApiKeyValues((prev) => {\n const next = new Map(prev);\n next.delete(key);\n return next;\n });\n };\n\n const handleEditRequest = (request: APIKey) => {\n setRequestToEdit(request);\n setEditDialogOpen(true);\n };\n\n const handleEditSuccess = () => {\n setRefresh((r) => r + 1);\n setEditDialogOpen(false);\n alertApi.post({\n message: \"API key updated\",\n severity: \"success\",\n display: \"transient\",\n });\n setRequestToEdit(null);\n };\n\n const handleMenuClose = () => {\n setMenuAnchor(null);\n setMenuRequest(null);\n };\n\n const handleMenuEdit = () => {\n if (!menuRequest) return;\n handleEditRequest(menuRequest);\n handleMenuClose();\n };\n\n const handleMenuDeleteClick = () => {\n if (!menuRequest) return;\n const request = menuRequest;\n handleMenuClose();\n setDeleteDialogState({ open: true, request });\n };\n\n const handleDeleteConfirm = async () => {\n if (!deleteDialogState.request) return;\n await handleDeleteRequest(deleteDialogState.request.metadata.name);\n setDeleteDialogState({ open: false, request: null });\n };\n\n const handleDeleteCancel = () => {\n setDeleteDialogState({ open: false, request: null });\n };\n\n const toggleVisibility = (keyName: string) => {\n setVisibleKeys((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(keyName)) {\n newSet.delete(keyName);\n } else {\n newSet.add(keyName);\n }\n return newSet;\n });\n };\n\n const handleRequestAccess = async () => {\n if (!selectedPlan) return;\n\n setCreating(true);\n setCreateError(null);\n try {\n const response = await fetchApi.fetch(\n `${backendUrl}/api/kuadrant/requests`,\n {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n apiProductName,\n namespace,\n planTier: selectedPlan,\n useCase: useCase.trim() || \"\",\n userEmail,\n }),\n },\n );\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.error || `failed to create request: ${response.status}`,\n );\n }\n\n alertApi.post({\n message: \"API key requested successfully\",\n severity: \"success\",\n display: \"transient\",\n });\n\n setOpen(false);\n setSelectedPlan(\"\");\n setUseCase(\"\");\n setRefresh((r) => r + 1);\n } catch (err) {\n const errorMessage =\n err instanceof Error ? err.message : \"unknown error occurred\";\n alertApi.post({\n message: `Failed to request API key: ${errorMessage}`,\n severity: \"error\",\n display: \"transient\",\n });\n setCreateError(errorMessage);\n } finally {\n setCreating(false);\n }\n };\n\n const detailPanelConfig = useMemo(\n () => [\n {\n render: (data: any) => {\n // backstage Table wraps the data in { rowData: actualData }\n const request = data.rowData as APIKey;\n if (!request?.metadata?.name) {\n return <Box />;\n }\n\n // pass already-revealed key from parent state (don't auto-fetch - that consumes show-once)\n const key = `${request.metadata.namespace}/${request.metadata.name}`;\n const revealedKey = apiKeyValues.get(key);\n return (\n <DetailPanelContent\n request={request}\n apiName={apiProductName}\n revealedApiKey={revealedKey}\n />\n );\n },\n },\n ],\n [apiProductName, apiKeyValues],\n );\n\n // separate component to isolate state\n const DetailPanelContent = ({\n request,\n apiName: api,\n revealedApiKey,\n }: {\n request: APIKey;\n apiName: string;\n revealedApiKey?: string;\n }) => {\n const [selectedLanguage, setSelectedLanguage] = useState(0);\n const hostname = request.status?.apiHostname || `${api}.apps.example.com`;\n\n // use revealed key if available, otherwise show placeholder\n const displayApiKey = revealedApiKey || \"<your-api-key>\";\n\n // Generate code snippets based on authScheme credentials\n const credentials = request.status?.authScheme?.credentials;\n const snippets = generateAuthCodeSnippets(credentials, hostname, displayApiKey);\n\n return (\n <Box\n p={3}\n bgcolor=\"background.default\"\n onClick={(e) => e.stopPropagation()}\n >\n {request.spec.useCase && (\n <Box mb={3}>\n <Typography variant=\"h6\" gutterBottom>\n Use Case\n </Typography>\n <Box\n p={2}\n bgcolor=\"background.paper\"\n borderRadius={1}\n border=\"1px solid rgba(0, 0, 0, 0.12)\"\n >\n <Typography\n variant=\"body2\"\n style={{\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n overflowWrap: \"break-word\",\n }}\n >\n {request.spec.useCase}\n </Typography>\n </Box>\n </Box>\n )}\n <Typography variant=\"h6\" gutterBottom>\n Usage Examples\n </Typography>\n <Typography variant=\"body2\" paragraph>\n Use these code examples to test the API with your{\" \"}\n {request.spec.planTier} tier key.\n </Typography>\n <Box onClick={(e) => e.stopPropagation()}>\n <Tabs\n value={selectedLanguage}\n onChange={(e, newValue) => {\n e.stopPropagation();\n setSelectedLanguage(newValue);\n }}\n indicatorColor=\"primary\"\n >\n <Tab label=\"cURL\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Node.js\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Python\" onClick={(e) => e.stopPropagation()} />\n <Tab label=\"Go\" onClick={(e) => e.stopPropagation()} />\n </Tabs>\n </Box>\n <Box mt={2}>\n {selectedLanguage === 0 && (\n <CodeSnippet\n text={snippets.curl}\n language=\"bash\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 1 && (\n <CodeSnippet\n text={snippets.nodejs}\n language=\"javascript\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 2 && (\n <CodeSnippet\n text={snippets.python}\n language=\"python\"\n showCopyCodeButton\n />\n )}\n {selectedLanguage === 3 && (\n <CodeSnippet\n text={snippets.go}\n language=\"go\"\n showCopyCodeButton\n />\n )}\n </Box>\n </Box>\n );\n };\n\n const loading =\n requestsLoading ||\n plansLoading ||\n createRequestPermissionLoading ||\n deleteOwnPermissionLoading ||\n deleteAllPermissionLoading ||\n updateRequestPermissionLoading;\n const error = requestsError || plansError;\n const permissionError =\n createRequestPermissionError ||\n deleteOwnPermissionError ||\n deleteAllPermissionError ||\n updateRequestPermissionError;\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return <ResponseErrorPanel error={error} />;\n }\n\n if (permissionError) {\n const failedPermission = createRequestPermissionError\n ? \"kuadrant.apikey.create\"\n : deleteOwnPermissionError\n ? \"kuadrant.apikey.delete.own\"\n : deleteAllPermissionError\n ? \"kuadrant.apikey.delete.all\"\n : updateRequestPermissionError\n ? \"kuadrant.apikey.update.own\"\n : \"unknown\";\n return (\n <Box p={2}>\n <Typography color=\"error\">\n Unable to check permissions: {permissionError.message}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Permission: {failedPermission}\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Please try again or contact your administrator\n </Typography>\n </Box>\n );\n }\n\n const myRequests = ((requests || []) as APIKey[]).filter(\n (r) => !optimisticallyDeleted.has(r.metadata.name),\n );\n const plans = (apiProduct?.status?.discoveredPlans || []) as Plan[];\n\n const pendingRequests = myRequests.filter(\n (r) => !r.status?.phase || r.status.phase === \"Pending\",\n );\n const approvedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Approved\",\n );\n const rejectedRequests = myRequests.filter(\n (r) => r.status?.phase === \"Rejected\",\n );\n\n const approvedColumns: TableColumn<APIKey>[] = [\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Approved\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.status?.reviewedAt\n ? new Date(row.status.reviewedAt).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"API Key\",\n field: \"status.secretRef\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const key = `${row.metadata.namespace}/${row.metadata.name}`;\n const isVisible = visibleKeys.has(row.metadata.name);\n const isLoading = apiKeyLoading.has(key);\n const apiKeyValue = apiKeyValues.get(key);\n const hasSecretRef = row.status?.secretRef?.name;\n const canReadSecret = row.status?.canReadSecret !== false;\n const isAlreadyRead = alreadyReadKeys.has(key) || !canReadSecret;\n\n if (!hasSecretRef) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\">\n Awaiting secret...\n </Typography>\n );\n }\n\n // key has already been viewed and cannot be retrieved again\n if (isAlreadyRead && !apiKeyValue) {\n return (\n <Tooltip title=\"This API key has already been viewed and cannot be retrieved again\">\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n color=\"textSecondary\"\n style={{ fontFamily: \"monospace\", marginRight: 8 }}\n >\n Already viewed\n </Typography>\n <VisibilityOffIcon fontSize=\"small\" color=\"disabled\" />\n </Box>\n </Tooltip>\n );\n }\n\n const handleRevealClick = () => {\n if (isVisible) {\n // hiding - clear the value from memory\n clearApiKeyValue(row.metadata.namespace, row.metadata.name);\n toggleVisibility(row.metadata.name);\n } else if (!isAlreadyRead) {\n // show warning dialog before first reveal\n setPendingKeyReveal({\n namespace: row.metadata.namespace,\n name: row.metadata.name,\n });\n setShowOnceWarningOpen(true);\n }\n };\n\n const handleCopy = async () => {\n if (apiKeyValue) {\n await navigator.clipboard.writeText(apiKeyValue);\n alertApi.post({\n message: \"API key copied to clipboard\",\n severity: \"success\",\n display: \"transient\",\n });\n }\n };\n\n return (\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n variant=\"body2\"\n style={{\n fontFamily: \"monospace\",\n marginRight: 8,\n }}\n >\n {isLoading\n ? \"Loading...\"\n : isVisible && apiKeyValue\n ? apiKeyValue\n : \"••••••••••••••••\"}\n </Typography>\n {isVisible && apiKeyValue && (\n <Tooltip title=\"Copy to clipboard\">\n <IconButton size=\"small\" onClick={handleCopy}>\n <FileCopyIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n )}\n <Tooltip\n title={\n isVisible ? \"Hide API key\" : \"Reveal API key (one-time only)\"\n }\n >\n <span>\n <IconButton\n size=\"small\"\n onClick={handleRevealClick}\n disabled={isLoading || (isAlreadyRead && !apiKeyValue)}\n >\n {isVisible ? <VisibilityOffIcon /> : <VisibilityIcon />}\n </IconButton>\n </span>\n </Tooltip>\n </Box>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n if (!canDelete) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n const requestColumns: TableColumn<APIKey>[] = [\n {\n title: \"Status\",\n field: \"status.phase\",\n render: (row: APIKey) => {\n const phase = row.status?.phase || \"Pending\";\n const isPending = phase === \"Pending\";\n return (\n <Chip\n label={phase}\n size=\"small\"\n icon={isPending ? <HourglassEmptyIcon /> : <CancelIcon />}\n color={isPending ? \"default\" : \"secondary\"}\n />\n );\n },\n },\n {\n title: \"Tier\",\n field: \"spec.planTier\",\n render: (row: APIKey) => (\n <Chip label={row.spec.planTier} color=\"primary\" size=\"small\" />\n ),\n },\n {\n title: \"Use Case\",\n field: \"spec.useCase\",\n render: (row: APIKey) => {\n if (!row.spec.useCase) {\n return <Typography variant=\"body2\">-</Typography>;\n }\n return (\n <Tooltip title={row.spec.useCase} placement=\"top\">\n <Typography\n variant=\"body2\"\n style={{\n maxWidth: \"200px\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n }}\n >\n {row.spec.useCase}\n </Typography>\n </Tooltip>\n );\n },\n },\n {\n title: \"Requested\",\n field: \"metadata.creationTimestamp\",\n render: (row: APIKey) => (\n <Typography variant=\"body2\">\n {row.metadata.creationTimestamp\n ? new Date(row.metadata.creationTimestamp).toLocaleDateString()\n : \"-\"}\n </Typography>\n ),\n },\n {\n title: \"Reviewed\",\n field: \"status.reviewedAt\",\n render: (row: APIKey) => {\n if (!row.status?.reviewedAt)\n return <Typography variant=\"body2\">-</Typography>;\n return (\n <Typography variant=\"body2\">\n {new Date(row.status.reviewedAt).toLocaleDateString()}\n </Typography>\n );\n },\n },\n {\n title: \"\",\n field: \"actions\",\n searchable: false,\n filtering: false,\n render: (row: APIKey) => {\n const isDeleting = deleting === row.metadata.name;\n if (isDeleting) {\n return <CircularProgress size={20} />;\n }\n const isPending = !row.status?.phase || row.status.phase === \"Pending\";\n const ownerId = row.spec.requestedBy.userId;\n const canDelete = canDeleteResource(\n ownerId,\n userId,\n canDeleteOwnKey,\n canDeleteAllKeys,\n );\n const canEdit = canUpdateRequest && ownerId === userId;\n if (!isPending || (!canEdit && !canDelete)) return null;\n return (\n <IconButton\n size=\"small\"\n onClick={(e) => {\n e.stopPropagation();\n const rect = e.currentTarget.getBoundingClientRect();\n setMenuAnchor({ top: rect.bottom, left: rect.left });\n setMenuRequest(row);\n }}\n title=\"Actions\"\n aria-controls={menuAnchor ? \"actions-menu\" : undefined}\n aria-haspopup=\"true\"\n >\n <MoreVertIcon />\n </IconButton>\n );\n },\n },\n ];\n\n // Filter columns for pending requests (no Reviewed or Reason)\n const pendingRequestColumns = requestColumns.filter(\n (col) => col.title !== \"Reviewed\" && col.title !== \"Reason\",\n );\n\n return (\n <Box p={2}>\n <Grid container spacing={3} direction=\"column\">\n {canCreateRequest && (\n <Grid item>\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"flex-end\"\n mb={2}\n >\n <Button\n variant=\"contained\"\n color=\"primary\"\n startIcon={<AddIcon />}\n onClick={() => setOpen(true)}\n disabled={plans.length === 0}\n data-testid=\"request-api-access-button\"\n data-plans-count={plans.length}\n >\n Request API Access\n </Button>\n {plans.length === 0 && (\n <Typography\n variant=\"caption\"\n color=\"textSecondary\"\n style={{ marginTop: 4 }}\n data-testid=\"no-plans-message\"\n >\n {!apiProduct\n ? \"API product not found\"\n : (() => {\n const readyCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"Ready\",\n );\n const planCondition =\n apiProduct.status?.conditions?.find(\n (c: any) => c.type === \"PlanPolicyDiscovered\",\n );\n\n if (readyCondition?.status !== \"True\") {\n return `HTTPRoute not ready: ${readyCondition?.message || \"unknown\"}`;\n }\n if (planCondition?.status !== \"True\") {\n return `No plans discovered: ${planCondition?.message || \"no PlanPolicy found\"}`;\n }\n return \"No plans available\";\n })()}\n </Typography>\n )}\n </Box>\n </Grid>\n )}\n {pendingRequests.length === 0 &&\n rejectedRequests.length === 0 &&\n approvedRequests.length === 0 && (\n <Grid item>\n <Box p={3} textAlign=\"center\">\n <Typography variant=\"body1\" color=\"textSecondary\">\n No API keys yet. Request access to get started.\n </Typography>\n </Box>\n </Grid>\n )}\n {pendingRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Pending Requests\"\n options={{\n paging: pendingRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={pendingRequestColumns}\n data={pendingRequests}\n />\n </Grid>\n )}\n {rejectedRequests.length > 0 && (\n <Grid item>\n <Table\n title=\"Rejected Requests\"\n options={{\n paging: rejectedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={requestColumns}\n data={rejectedRequests}\n />\n </Grid>\n )}\n {approvedRequests.length > 0 && (\n <Grid item>\n <Table\n key=\"api-keys-table\"\n title=\"API Keys\"\n options={{\n paging: approvedRequests.length > 5,\n pageSize: 20,\n search: true,\n filtering: true,\n debounceInterval: 300,\n toolbar: true,\n emptyRowsWhenPaging: false,\n }}\n columns={approvedColumns}\n data={approvedRequests}\n detailPanel={detailPanelConfig}\n />\n </Grid>\n )}\n </Grid>\n\n <Dialog\n open={open}\n onClose={() => setOpen(false)}\n maxWidth=\"sm\"\n fullWidth\n >\n <DialogTitle>Request API Access</DialogTitle>\n <DialogContent>\n <Box\n mb={2}\n p={1.5}\n bgcolor=\"info.light\"\n borderRadius={1}\n display=\"flex\"\n alignItems=\"flex-start\"\n style={{ gap: 8 }}\n >\n <InfoIcon\n color=\"primary\"\n fontSize=\"small\"\n style={{ marginTop: 2 }}\n />\n <Typography variant=\"body2\">\n Your request will be reviewed by an API owner before access is\n granted.\n </Typography>\n </Box>\n {createError && (\n <Box\n mb={2}\n p={2}\n bgcolor=\"error.main\"\n color=\"error.contrastText\"\n borderRadius={1}\n >\n <Typography variant=\"body2\">{createError}</Typography>\n </Box>\n )}\n <FormControl\n fullWidth\n margin=\"normal\"\n disabled={creating}\n data-testid=\"tier-select-form\"\n >\n <InputLabel id=\"tier-select-label\">Select Tier</InputLabel>\n <Select\n labelId=\"tier-select-label\"\n data-testid=\"tier-select\"\n value={selectedPlan}\n onChange={(e) => setSelectedPlan(e.target.value as string)}\n disabled={creating}\n >\n {plans.map((plan: Plan) => {\n const limitDesc = Object.entries(plan.limits || {})\n .map(([key, val]) => `${val} per ${key}`)\n .join(\", \");\n return (\n <MenuItem\n key={plan.tier}\n value={plan.tier}\n data-testid={`tier-option-${plan.tier}`}\n >\n {plan.tier} {limitDesc ? `(${limitDesc})` : \"\"}\n </MenuItem>\n );\n })}\n </Select>\n </FormControl>\n <TextField\n label=\"Use Case (optional)\"\n placeholder=\"Describe how you plan to use this API\"\n multiline\n rows={3}\n fullWidth\n margin=\"normal\"\n value={useCase}\n onChange={(e) => setUseCase(e.target.value)}\n helperText=\"Explain your intended use of this API for admin review\"\n disabled={creating}\n />\n </DialogContent>\n <DialogActions>\n <Button onClick={() => setOpen(false)} disabled={creating}>\n Cancel\n </Button>\n <Button\n onClick={handleRequestAccess}\n color=\"primary\"\n variant=\"contained\"\n disabled={!selectedPlan || creating}\n startIcon={\n creating ? (\n <CircularProgress size={16} color=\"inherit\" />\n ) : undefined\n }\n >\n {creating ? \"Submitting...\" : \"Submit Request\"}\n </Button>\n </DialogActions>\n </Dialog>\n\n <Menu\n id=\"actions-menu\"\n open={Boolean(menuAnchor)}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={menuAnchor || { top: 0, left: 0 }}\n >\n {menuRequest &&\n (() => {\n const isPending =\n !menuRequest.status?.phase ||\n menuRequest.status.phase === \"Pending\";\n const ownerId = menuRequest.spec.requestedBy.userId;\n const canEdit = canUpdateRequest && ownerId === userId && isPending;\n\n const items = [];\n if (canEdit) {\n items.push(\n <MenuItem key=\"edit\" onClick={handleMenuEdit}>\n Edit\n </MenuItem>,\n );\n }\n items.push(\n <MenuItem key=\"delete\" onClick={handleMenuDeleteClick}>\n Delete\n </MenuItem>,\n );\n return items;\n })()}\n </Menu>\n\n {requestToEdit && (\n <EditAPIKeyDialog\n open={editDialogOpen}\n onClose={() => {\n setEditDialogOpen(false);\n setRequestToEdit(null);\n }}\n onSuccess={handleEditSuccess}\n request={requestToEdit}\n availablePlans={plans}\n />\n )}\n\n <ConfirmDeleteDialog\n open={deleteDialogState.open}\n title=\"Delete Request\"\n description={`Are you sure you want to delete this ${deleteDialogState.request?.status?.phase === \"Approved\" ? \"API key\" : \"request\"}?`}\n deleting={deleting !== null}\n onConfirm={handleDeleteConfirm}\n onCancel={handleDeleteCancel}\n />\n\n <Dialog\n open={showOnceWarningOpen}\n onClose={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n maxWidth=\"sm\"\n >\n <DialogTitle>\n <Box display=\"flex\" alignItems=\"center\">\n <WarningIcon color=\"primary\" style={{ marginRight: 8 }} />\n View API Key\n </Box>\n </DialogTitle>\n <DialogContent>\n <Typography variant=\"body1\" paragraph>\n This API key can only be viewed <strong>once</strong>. After you\n reveal it, you will not be able to retrieve it again.\n </Typography>\n <Typography variant=\"body2\" color=\"textSecondary\">\n Make sure to copy and store it securely before closing this view.\n </Typography>\n </DialogContent>\n <DialogActions>\n <Button\n onClick={() => {\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Cancel\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={() => {\n if (pendingKeyReveal) {\n fetchApiKeyFromSecret(\n pendingKeyReveal.namespace,\n pendingKeyReveal.name,\n );\n toggleVisibility(pendingKeyReveal.name);\n }\n setShowOnceWarningOpen(false);\n setPendingKeyReveal(null);\n }}\n >\n Reveal API Key\n </Button>\n </DialogActions>\n </Dialog>\n </Box>\n );\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z\"\n}), 'Info');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M12 8c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\"\n}), 'MoreVert');\n\nexports.default = _default;","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = void 0;\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _createSvgIcon = _interopRequireDefault(require(\"./utils/createSvgIcon\"));\n\nvar _default = (0, _createSvgIcon.default)( /*#__PURE__*/React.createElement(\"path\", {\n d: \"M6 2v6h.01L6 8.01 10 12l-4 4 .01.01H6V22h12v-5.99h-.01L18 16l-4-4 4-3.99-.01-.01H18V2H6zm10 14.5V20H8v-3.5l4-4 4 4zm-4-5l-4-4V4h8v3.5l-4 4z\"\n}), 'HourglassEmpty');\n\nexports.default = _default;"],"names":["useEntity","versionedHolder","useVersionedContext","Error","value","atVersion","entity","createVersionedContext","_interopRequireDefault","_interopRequireWildcard","exports","React","_default","default","createElement","d","generateAuthorizationHeaderSnippets","baseUrl","apiKey","prefix","prefixWithSpace","curl","nodejs","python","go","ApiKeyManagementTab","namespace","propNamespace","apiProduct","deleteDialogState","config","useApi","configApiRef","identityApi","identityApiRef","fetchApi","fetchApiRef","alertApi","alertApiRef","backendUrl","getString","visibleKeys","setVisibleKeys","useState","Set","refresh","setRefresh","userId","setUserId","userEmail","setUserEmail","open","setOpen","selectedPlan","setSelectedPlan","useCase","setUseCase","creating","setCreating","createError","setCreateError","editDialogOpen","setEditDialogOpen","requestToEdit","setRequestToEdit","menuAnchor","setMenuAnchor","menuRequest","setMenuRequest","deleting","setDeleting","optimisticallyDeleted","setOptimisticallyDeleted","setDeleteDialogState","request","apiKeyValues","setApiKeyValues","Map","apiKeyLoading","setApiKeyLoading","alreadyReadKeys","setAlreadyReadKeys","showOnceWarningOpen","setShowOnceWarningOpen","pendingKeyReveal","setPendingKeyReveal","apiProductName","metadata","annotations","name","useAsync","async","identity","getBackstageIdentity","profile","getProfileInfo","userEntityRef","email","requests","loading","requestsLoading","error","requestsError","response","fetch","ok","json","items","filter","r","spec","apiProductRef","plansLoading","plansError","data","find","p","resourceRef","undefined","allowed","canCreateRequest","createRequestPermissionLoading","createRequestPermissionError","useKuadrantPermission","kuadrantApiKeyCreatePermission","canDeleteOwnKey","deleteOwnPermissionLoading","deleteOwnPermissionError","kuadrantApiKeyDeleteOwnPermission","canDeleteAllKeys","deleteAllPermissionLoading","deleteAllPermissionError","kuadrantApiKeyDeleteAllPermission","canUpdateRequest","updateRequestPermissionLoading","updateRequestPermissionError","kuadrantApiKeyUpdateOwnPermission","handleMenuClose","handleMenuEdit","handleMenuDeleteClick","toggleVisibility","keyName","prev","newSet","has","delete","add","detailPanelConfig","useMemo","render","rowData","Box","key","revealedKey","get","DetailPanelContent","apiName","revealedApiKey","api","selectedLanguage","setSelectedLanguage","hostname","status","apiHostname","displayApiKey","snippets","credentials","authorizationHeader","customHeader","headerName","generateCustomHeaderSnippets","queryString","paramName","generateQueryStringSnippets","cookie","cookieName","generateCookieSnippets","generateAuthCodeSnippets","authScheme","bgcolor","onClick","e","stopPropagation","mb","Typography","variant","gutterBottom","borderRadius","border","style","whiteSpace","wordBreak","overflowWrap","paragraph","planTier","Tabs","onChange","newValue","indicatorColor","Tab","label","mt","CodeSnippet","text","language","showCopyCodeButton","permissionError","Progress","ResponseErrorPanel","failedPermission","color","message","myRequests","plans","discoveredPlans","pendingRequests","phase","approvedRequests","rejectedRequests","approvedColumns","title","field","row","Chip","size","reviewedAt","Date","toLocaleDateString","searchable","filtering","isVisible","isLoading","apiKeyValue","hasSecretRef","secretRef","canReadSecret","isAlreadyRead","Tooltip","display","alignItems","fontFamily","marginRight","VisibilityOffIcon","fontSize","IconButton","navigator","clipboard","writeText","post","severity","FileCopyIcon","span","requestNamespace","requestName","next","clearApiKeyValue","disabled","VisibilityIcon","CircularProgress","ownerId","requestedBy","canDeleteResource","rect","currentTarget","getBoundingClientRect","top","bottom","left","aria-controls","aria-haspopup","MoreVertIcon","requestColumns","isPending","icon","HourglassEmptyIcon","CancelIcon","placement","maxWidth","overflow","textOverflow","creationTimestamp","canDelete","pendingRequestColumns","col","Grid","container","spacing","direction","item","flexDirection","Button","startIcon","AddIcon","length","data-testid","data-plans-count","marginTop","readyCondition","conditions","c","type","planCondition","textAlign","Table","options","paging","pageSize","search","debounceInterval","toolbar","emptyRowsWhenPaging","columns","detailPanel","Dialog","onClose","fullWidth","DialogTitle","DialogContent","gap","InfoIcon","FormControl","margin","InputLabel","id","Select","labelId","target","map","plan","limitDesc","Object","entries","limits","val","join","MenuItem","tier","TextField","placeholder","multiline","rows","helperText","DialogActions","method","headers","body","JSON","stringify","trim","errorData","catch","err","errorMessage","Menu","Boolean","anchorReference","anchorPosition","push","EditAPIKeyDialog","onSuccess","availablePlans","ConfirmDeleteDialog","description","onConfirm","handleDeleteRequest","onCancel","WarningIcon","strong","set","fetchApiKeyFromSecret"],"sourceRoot":""}
@@ -1,3 +0,0 @@
1
- /*! For license information please see 3657.59d45756.chunk.js.LICENSE.txt */
2
- "use strict";(self.webpackChunkinternal_plugin_kuadrant=self.webpackChunkinternal_plugin_kuadrant||[]).push([[3657],{73657:(e,t,n)=>{n.r(t),n.d(t,{AbortedDeferredError:()=>r.AbortedDeferredError,Await:()=>r.Await,BrowserRouter:()=>P,Form:()=>I,HashRouter:()=>k,Link:()=>V,MemoryRouter:()=>r.MemoryRouter,NavLink:()=>K,Navigate:()=>r.Navigate,NavigationType:()=>r.NavigationType,Outlet:()=>r.Outlet,Route:()=>r.Route,Router:()=>r.Router,RouterProvider:()=>T,Routes:()=>r.Routes,ScrollRestoration:()=>H,UNSAFE_DataRouterContext:()=>r.UNSAFE_DataRouterContext,UNSAFE_DataRouterStateContext:()=>r.UNSAFE_DataRouterStateContext,UNSAFE_ErrorResponseImpl:()=>i.VV,UNSAFE_FetchersContext:()=>C,UNSAFE_LocationContext:()=>r.UNSAFE_LocationContext,UNSAFE_NavigationContext:()=>r.UNSAFE_NavigationContext,UNSAFE_RouteContext:()=>r.UNSAFE_RouteContext,UNSAFE_ViewTransitionContext:()=>b,UNSAFE_useRouteId:()=>r.UNSAFE_useRouteId,UNSAFE_useScrollRestoration:()=>ne,createBrowserRouter:()=>y,createHashRouter:()=>R,createMemoryRouter:()=>r.createMemoryRouter,createPath:()=>r.createPath,createRoutesFromChildren:()=>r.createRoutesFromChildren,createRoutesFromElements:()=>r.createRoutesFromElements,createSearchParams:()=>d,defer:()=>r.defer,generatePath:()=>r.generatePath,isRouteErrorResponse:()=>r.isRouteErrorResponse,json:()=>r.json,matchPath:()=>r.matchPath,matchRoutes:()=>r.matchRoutes,parsePath:()=>r.parsePath,redirect:()=>r.redirect,redirectDocument:()=>r.redirectDocument,renderMatches:()=>r.renderMatches,replace:()=>r.replace,resolvePath:()=>r.resolvePath,unstable_HistoryRouter:()=>D,unstable_usePrompt:()=>ae,useActionData:()=>r.useActionData,useAsyncError:()=>r.useAsyncError,useAsyncValue:()=>r.useAsyncValue,useBeforeUnload:()=>oe,useBlocker:()=>r.useBlocker,useFetcher:()=>Z,useFetchers:()=>$,useFormAction:()=>X,useHref:()=>r.useHref,useInRouterContext:()=>r.useInRouterContext,useLinkClickHandler:()=>Y,useLoaderData:()=>r.useLoaderData,useLocation:()=>r.useLocation,useMatch:()=>r.useMatch,useMatches:()=>r.useMatches,useNavigate:()=>r.useNavigate,useNavigation:()=>r.useNavigation,useNavigationType:()=>r.useNavigationType,useOutlet:()=>r.useOutlet,useOutletContext:()=>r.useOutletContext,useParams:()=>r.useParams,useResolvedPath:()=>r.useResolvedPath,useRevalidator:()=>r.useRevalidator,useRouteError:()=>r.useRouteError,useRouteLoaderData:()=>r.useRouteLoaderData,useRoutes:()=>r.useRoutes,useSearchParams:()=>J,useSubmit:()=>Q,useViewTransitionState:()=>re});var o=n(95478),a=n(40484),r=n(92731),i=n(21613);function s(){return s=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var o in n)Object.prototype.hasOwnProperty.call(n,o)&&(e[o]=n[o])}return e},s.apply(this,arguments)}function u(e,t){if(null==e)return{};var n,o,a={},r=Object.keys(e);for(o=0;o<r.length;o++)n=r[o],t.indexOf(n)>=0||(a[n]=e[n]);return a}const l="get",c="application/x-www-form-urlencoded";function f(e){return null!=e&&"string"==typeof e.tagName}function d(e){return void 0===e&&(e=""),new URLSearchParams("string"==typeof e||Array.isArray(e)||e instanceof URLSearchParams?e:Object.keys(e).reduce((t,n)=>{let o=e[n];return t.concat(Array.isArray(o)?o.map(e=>[n,e]):[[n,o]])},[]))}let h=null;const v=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function m(e){return null==e||v.has(e)?e:null}const p=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],w=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],g=["fetcherKey","navigate","reloadDocument","replace","state","method","action","onSubmit","relative","preventScrollReset","viewTransition"];try{window.__reactRouterVersion="6"}catch(e){}function y(e,t){return(0,i.aE)({basename:null==t?void 0:t.basename,future:s({},null==t?void 0:t.future,{v7_prependBasename:!0}),history:(0,i.zR)({window:null==t?void 0:t.window}),hydrationData:(null==t?void 0:t.hydrationData)||S(),routes:e,mapRouteProperties:r.UNSAFE_mapRouteProperties,dataStrategy:null==t?void 0:t.dataStrategy,patchRoutesOnNavigation:null==t?void 0:t.patchRoutesOnNavigation,window:null==t?void 0:t.window}).initialize()}function R(e,t){return(0,i.aE)({basename:null==t?void 0:t.basename,future:s({},null==t?void 0:t.future,{v7_prependBasename:!0}),history:(0,i.TM)({window:null==t?void 0:t.window}),hydrationData:(null==t?void 0:t.hydrationData)||S(),routes:e,mapRouteProperties:r.UNSAFE_mapRouteProperties,dataStrategy:null==t?void 0:t.dataStrategy,patchRoutesOnNavigation:null==t?void 0:t.patchRoutesOnNavigation,window:null==t?void 0:t.window}).initialize()}function S(){var e;let t=null==(e=window)?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=s({},t,{errors:E(t.errors)})),t}function E(e){if(!e)return null;let t=Object.entries(e),n={};for(let[e,o]of t)if(o&&"RouteErrorResponse"===o.__type)n[e]=new i.VV(o.status,o.statusText,o.data,!0===o.internal);else if(o&&"Error"===o.__type){if(o.__subType){let t=window[o.__subType];if("function"==typeof t)try{let a=new t(o.message);a.stack="",n[e]=a}catch(e){}}if(null==n[e]){let t=new Error(o.message);t.stack="",n[e]=t}}else n[e]=o;return n}const b=o.createContext({isTransitioning:!1}),C=o.createContext(new Map),N=o.startTransition,_=a.flushSync,A=o.useId;function x(e){_?_(e):e()}class L{constructor(){this.status="pending",this.promise=new Promise((e,t)=>{this.resolve=t=>{"pending"===this.status&&(this.status="resolved",e(t))},this.reject=e=>{"pending"===this.status&&(this.status="rejected",t(e))}})}}function T(e){let{fallbackElement:t,router:n,future:a}=e,[i,s]=o.useState(n.state),[u,l]=o.useState(),[c,f]=o.useState({isTransitioning:!1}),[d,h]=o.useState(),[v,m]=o.useState(),[p,w]=o.useState(),g=o.useRef(new Map),{v7_startTransition:y}=a||{},R=o.useCallback(e=>{y?function(e){N?N(e):e()}(e):e()},[y]),S=o.useCallback((e,t)=>{let{deletedFetchers:o,flushSync:a,viewTransitionOpts:r}=t;e.fetchers.forEach((e,t)=>{void 0!==e.data&&g.current.set(t,e.data)}),o.forEach(e=>g.current.delete(e));let i=null==n.window||null==n.window.document||"function"!=typeof n.window.document.startViewTransition;if(r&&!i){if(a){x(()=>{v&&(d&&d.resolve(),v.skipTransition()),f({isTransitioning:!0,flushSync:!0,currentLocation:r.currentLocation,nextLocation:r.nextLocation})});let t=n.window.document.startViewTransition(()=>{x(()=>s(e))});return t.finished.finally(()=>{x(()=>{h(void 0),m(void 0),l(void 0),f({isTransitioning:!1})})}),void x(()=>m(t))}v?(d&&d.resolve(),v.skipTransition(),w({state:e,currentLocation:r.currentLocation,nextLocation:r.nextLocation})):(l(e),f({isTransitioning:!0,flushSync:!1,currentLocation:r.currentLocation,nextLocation:r.nextLocation}))}else a?x(()=>s(e)):R(()=>s(e))},[n.window,v,d,g,R]);o.useLayoutEffect(()=>n.subscribe(S),[n,S]),o.useEffect(()=>{c.isTransitioning&&!c.flushSync&&h(new L)},[c]),o.useEffect(()=>{if(d&&u&&n.window){let e=u,t=d.promise,o=n.window.document.startViewTransition(async()=>{R(()=>s(e)),await t});o.finished.finally(()=>{h(void 0),m(void 0),l(void 0),f({isTransitioning:!1})}),m(o)}},[R,u,d,n.window]),o.useEffect(()=>{d&&u&&i.location.key===u.location.key&&d.resolve()},[d,v,i.location,u]),o.useEffect(()=>{!c.isTransitioning&&p&&(l(p.state),f({isTransitioning:!0,flushSync:!1,currentLocation:p.currentLocation,nextLocation:p.nextLocation}),w(void 0))},[c.isTransitioning,p]),o.useEffect(()=>{},[]);let E=o.useMemo(()=>({createHref:n.createHref,encodeLocation:n.encodeLocation,go:e=>n.navigate(e),push:(e,t,o)=>n.navigate(e,{state:t,preventScrollReset:null==o?void 0:o.preventScrollReset}),replace:(e,t,o)=>n.navigate(e,{replace:!0,state:t,preventScrollReset:null==o?void 0:o.preventScrollReset})}),[n]),_=n.basename||"/",A=o.useMemo(()=>({router:n,navigator:E,static:!1,basename:_}),[n,E,_]),T=o.useMemo(()=>({v7_relativeSplatPath:n.future.v7_relativeSplatPath}),[n.future.v7_relativeSplatPath]);return o.useEffect(()=>(0,r.UNSAFE_logV6DeprecationWarnings)(a,n.future),[a,n.future]),o.createElement(o.Fragment,null,o.createElement(r.UNSAFE_DataRouterContext.Provider,{value:A},o.createElement(r.UNSAFE_DataRouterStateContext.Provider,{value:i},o.createElement(C.Provider,{value:g.current},o.createElement(b.Provider,{value:c},o.createElement(r.Router,{basename:_,location:i.location,navigationType:i.historyAction,navigator:E,future:T},i.initialized||n.future.v7_partialHydration?o.createElement(F,{routes:n.routes,future:n.future,state:i}):t))))),null)}const F=o.memo(U);function U(e){let{routes:t,future:n,state:o}=e;return(0,r.UNSAFE_useRoutesImpl)(t,void 0,o,n)}function P(e){let{basename:t,children:n,future:a,window:s}=e,u=o.useRef();null==u.current&&(u.current=(0,i.zR)({window:s,v5Compat:!0}));let l=u.current,[c,f]=o.useState({action:l.action,location:l.location}),{v7_startTransition:d}=a||{},h=o.useCallback(e=>{d&&N?N(()=>f(e)):f(e)},[f,d]);return o.useLayoutEffect(()=>l.listen(h),[l,h]),o.useEffect(()=>(0,r.UNSAFE_logV6DeprecationWarnings)(a),[a]),o.createElement(r.Router,{basename:t,children:n,location:c.location,navigationType:c.action,navigator:l,future:a})}function k(e){let{basename:t,children:n,future:a,window:s}=e,u=o.useRef();null==u.current&&(u.current=(0,i.TM)({window:s,v5Compat:!0}));let l=u.current,[c,f]=o.useState({action:l.action,location:l.location}),{v7_startTransition:d}=a||{},h=o.useCallback(e=>{d&&N?N(()=>f(e)):f(e)},[f,d]);return o.useLayoutEffect(()=>l.listen(h),[l,h]),o.useEffect(()=>(0,r.UNSAFE_logV6DeprecationWarnings)(a),[a]),o.createElement(r.Router,{basename:t,children:n,location:c.location,navigationType:c.action,navigator:l,future:a})}function D(e){let{basename:t,children:n,future:a,history:i}=e,[s,u]=o.useState({action:i.action,location:i.location}),{v7_startTransition:l}=a||{},c=o.useCallback(e=>{l&&N?N(()=>u(e)):u(e)},[u,l]);return o.useLayoutEffect(()=>i.listen(c),[i,c]),o.useEffect(()=>(0,r.UNSAFE_logV6DeprecationWarnings)(a),[a]),o.createElement(r.Router,{basename:t,children:n,location:s.location,navigationType:s.action,navigator:i,future:a})}const O="undefined"!=typeof window&&void 0!==window.document&&void 0!==window.document.createElement,M=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,V=o.forwardRef(function(e,t){let n,{onClick:a,relative:l,reloadDocument:c,replace:f,state:d,target:h,to:v,preventScrollReset:m,viewTransition:w}=e,g=u(e,p),{basename:y}=o.useContext(r.UNSAFE_NavigationContext),R=!1;if("string"==typeof v&&M.test(v)&&(n=v,O))try{let e=new URL(window.location.href),t=v.startsWith("//")?new URL(e.protocol+v):new URL(v),n=(0,i.pb)(t.pathname,y);t.origin===e.origin&&null!=n?v=n+t.search+t.hash:R=!0}catch(e){}let S=(0,r.useHref)(v,{relative:l}),E=Y(v,{replace:f,state:d,target:h,preventScrollReset:m,relative:l,viewTransition:w});return o.createElement("a",s({},g,{href:n||S,onClick:R||c?a:function(e){a&&a(e),e.defaultPrevented||E(e)},ref:t,target:h}))}),K=o.forwardRef(function(e,t){let{"aria-current":n="page",caseSensitive:a=!1,className:l="",end:c=!1,style:f,to:d,viewTransition:h,children:v}=e,m=u(e,w),p=(0,r.useResolvedPath)(d,{relative:m.relative}),g=(0,r.useLocation)(),y=o.useContext(r.UNSAFE_DataRouterStateContext),{navigator:R,basename:S}=o.useContext(r.UNSAFE_NavigationContext),E=null!=y&&re(p)&&!0===h,b=R.encodeLocation?R.encodeLocation(p).pathname:p.pathname,C=g.pathname,N=y&&y.navigation&&y.navigation.location?y.navigation.location.pathname:null;a||(C=C.toLowerCase(),N=N?N.toLowerCase():null,b=b.toLowerCase()),N&&S&&(N=(0,i.pb)(N,S)||N);const _="/"!==b&&b.endsWith("/")?b.length-1:b.length;let A,x=C===b||!c&&C.startsWith(b)&&"/"===C.charAt(_),L=null!=N&&(N===b||!c&&N.startsWith(b)&&"/"===N.charAt(b.length)),T={isActive:x,isPending:L,isTransitioning:E},F=x?n:void 0;A="function"==typeof l?l(T):[l,x?"active":null,L?"pending":null,E?"transitioning":null].filter(Boolean).join(" ");let U="function"==typeof f?f(T):f;return o.createElement(V,s({},m,{"aria-current":F,className:A,ref:t,style:U,to:d,viewTransition:h}),"function"==typeof v?v(T):v)}),I=o.forwardRef((e,t)=>{let{fetcherKey:n,navigate:a,reloadDocument:r,replace:i,state:c,method:f=l,action:d,onSubmit:h,relative:v,preventScrollReset:m,viewTransition:p}=e,w=u(e,g),y=Q(),R=X(d,{relative:v}),S="get"===f.toLowerCase()?"get":"post";return o.createElement("form",s({ref:t,method:S,action:R,onSubmit:r?h:e=>{if(h&&h(e),e.defaultPrevented)return;e.preventDefault();let t=e.nativeEvent.submitter,o=(null==t?void 0:t.getAttribute("formmethod"))||f;y(t||e.currentTarget,{fetcherKey:n,method:o,navigate:a,replace:i,state:c,relative:v,preventScrollReset:m,viewTransition:p})}},w))});function H(e){let{getKey:t,storageKey:n}=e;return ne({getKey:t,storageKey:n}),null}var B,j;function W(e){let t=o.useContext(r.UNSAFE_DataRouterContext);return t||(0,i.Oi)(!1),t}function z(e){let t=o.useContext(r.UNSAFE_DataRouterStateContext);return t||(0,i.Oi)(!1),t}function Y(e,t){let{target:n,replace:a,state:i,preventScrollReset:s,relative:u,viewTransition:l}=void 0===t?{}:t,c=(0,r.useNavigate)(),f=(0,r.useLocation)(),d=(0,r.useResolvedPath)(e,{relative:u});return o.useCallback(t=>{if(function(e,t){return!(0!==e.button||t&&"_self"!==t||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e))}(t,n)){t.preventDefault();let n=void 0!==a?a:(0,r.createPath)(f)===(0,r.createPath)(d);c(e,{replace:n,state:i,preventScrollReset:s,relative:u,viewTransition:l})}},[f,c,d,a,i,n,e,s,u,l])}function J(e){let t=o.useRef(d(e)),n=o.useRef(!1),a=(0,r.useLocation)(),i=o.useMemo(()=>function(e,t){let n=d(e);return t&&t.forEach((e,o)=>{n.has(o)||t.getAll(o).forEach(e=>{n.append(o,e)})}),n}(a.search,n.current?null:t.current),[a.search]),s=(0,r.useNavigate)(),u=o.useCallback((e,t)=>{const o=d("function"==typeof e?e(i):e);n.current=!0,s("?"+o,t)},[s,i]);return[i,u]}(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmit="useSubmit",e.UseSubmitFetcher="useSubmitFetcher",e.UseFetcher="useFetcher",e.useViewTransitionState="useViewTransitionState"})(B||(B={})),function(e){e.UseFetcher="useFetcher",e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"}(j||(j={}));let q=0,G=()=>"__"+String(++q)+"__";function Q(){let{router:e}=W(B.UseSubmit),{basename:t}=o.useContext(r.UNSAFE_NavigationContext),n=(0,r.UNSAFE_useRouteId)();return o.useCallback(function(o,a){void 0===a&&(a={}),function(){if("undefined"==typeof document)throw new Error("You are calling submit during the server render. Try calling submit within a `useEffect` or callback instead.")}();let{action:r,method:s,encType:u,formData:d,body:v}=function(e,t){let n,o,a,r,s;if(f(u=e)&&"form"===u.tagName.toLowerCase()){let s=e.getAttribute("action");o=s?(0,i.pb)(s,t):null,n=e.getAttribute("method")||l,a=m(e.getAttribute("enctype"))||c,r=new FormData(e)}else if(function(e){return f(e)&&"button"===e.tagName.toLowerCase()}(e)||function(e){return f(e)&&"input"===e.tagName.toLowerCase()}(e)&&("submit"===e.type||"image"===e.type)){let s=e.form;if(null==s)throw new Error('Cannot submit a <button> or <input type="submit"> without a <form>');let u=e.getAttribute("formaction")||s.getAttribute("action");if(o=u?(0,i.pb)(u,t):null,n=e.getAttribute("formmethod")||s.getAttribute("method")||l,a=m(e.getAttribute("formenctype"))||m(s.getAttribute("enctype"))||c,r=new FormData(s,e),!function(){if(null===h)try{new FormData(document.createElement("form"),0),h=!1}catch(e){h=!0}return h}()){let{name:t,type:n,value:o}=e;if("image"===n){let e=t?t+".":"";r.append(e+"x","0"),r.append(e+"y","0")}else t&&r.append(t,o)}}else{if(f(e))throw new Error('Cannot submit element that is not <form>, <button>, or <input type="submit|image">');n=l,o=null,a=c,s=e}var u;return r&&"text/plain"===a&&(s=r,r=void 0),{action:o,method:n.toLowerCase(),encType:a,formData:r,body:s}}(o,t);if(!1===a.navigate){let t=a.fetcherKey||G();e.fetch(t,n,a.action||r,{preventScrollReset:a.preventScrollReset,formData:d,body:v,formMethod:a.method||s,formEncType:a.encType||u,flushSync:a.flushSync})}else e.navigate(a.action||r,{preventScrollReset:a.preventScrollReset,formData:d,body:v,formMethod:a.method||s,formEncType:a.encType||u,replace:a.replace,state:a.state,fromRouteId:n,flushSync:a.flushSync,viewTransition:a.viewTransition})},[e,t,n])}function X(e,t){let{relative:n}=void 0===t?{}:t,{basename:a}=o.useContext(r.UNSAFE_NavigationContext),u=o.useContext(r.UNSAFE_RouteContext);u||(0,i.Oi)(!1);let[l]=u.matches.slice(-1),c=s({},(0,r.useResolvedPath)(e||".",{relative:n})),f=(0,r.useLocation)();if(null==e){c.search=f.search;let e=new URLSearchParams(c.search),t=e.getAll("index");if(t.some(e=>""===e)){e.delete("index"),t.filter(e=>e).forEach(t=>e.append("index",t));let n=e.toString();c.search=n?"?"+n:""}}return e&&"."!==e||!l.route.index||(c.search=c.search?c.search.replace(/^\?/,"?index&"):"?index"),"/"!==a&&(c.pathname="/"===c.pathname?a:(0,i.HS)([a,c.pathname])),(0,r.createPath)(c)}function Z(e){var t;let{key:n}=void 0===e?{}:e,{router:a}=W(B.UseFetcher),u=z(j.UseFetcher),l=o.useContext(C),c=o.useContext(r.UNSAFE_RouteContext),f=null==(t=c.matches[c.matches.length-1])?void 0:t.route.id;l||(0,i.Oi)(!1),c||(0,i.Oi)(!1),null==f&&(0,i.Oi)(!1);let d=A?A():"",[h,v]=o.useState(n||d);n&&n!==h?v(n):h||v(G()),o.useEffect(()=>(a.getFetcher(h),()=>{a.deleteFetcher(h)}),[a,h]);let m=o.useCallback((e,t)=>{f||(0,i.Oi)(!1),a.fetch(h,f,e,t)},[h,f,a]),p=Q(),w=o.useCallback((e,t)=>{p(e,s({},t,{navigate:!1,fetcherKey:h}))},[h,p]),g=o.useMemo(()=>o.forwardRef((e,t)=>o.createElement(I,s({},e,{navigate:!1,fetcherKey:h,ref:t}))),[h]),y=u.fetchers.get(h)||i.HW,R=l.get(h);return o.useMemo(()=>s({Form:g,submit:w,load:m},y,{data:R}),[g,w,m,y,R])}function $(){let e=z(j.UseFetchers);return Array.from(e.fetchers.entries()).map(e=>{let[t,n]=e;return s({},n,{key:t})})}const ee="react-router-scroll-positions";let te={};function ne(e){let{getKey:t,storageKey:n}=void 0===e?{}:e,{router:a}=W(B.UseScrollRestoration),{restoreScrollPosition:u,preventScrollReset:l}=z(j.UseScrollRestoration),{basename:c}=o.useContext(r.UNSAFE_NavigationContext),f=(0,r.useLocation)(),d=(0,r.useMatches)(),h=(0,r.useNavigation)();o.useEffect(()=>(window.history.scrollRestoration="manual",()=>{window.history.scrollRestoration="auto"}),[]),function(e){let{capture:t}={};o.useEffect(()=>{let n=null!=t?{capture:t}:void 0;return window.addEventListener("pagehide",e,n),()=>{window.removeEventListener("pagehide",e,n)}},[e,t])}(o.useCallback(()=>{if("idle"===h.state){let e=(t?t(f,d):null)||f.key;te[e]=window.scrollY}try{sessionStorage.setItem(n||ee,JSON.stringify(te))}catch(e){}window.history.scrollRestoration="auto"},[n,t,h.state,f,d])),"undefined"!=typeof document&&(o.useLayoutEffect(()=>{try{let e=sessionStorage.getItem(n||ee);e&&(te=JSON.parse(e))}catch(e){}},[n]),o.useLayoutEffect(()=>{let e=t&&"/"!==c?(e,n)=>t(s({},e,{pathname:(0,i.pb)(e.pathname,c)||e.pathname}),n):t,n=null==a?void 0:a.enableScrollRestoration(te,()=>window.scrollY,e);return()=>n&&n()},[a,c,t]),o.useLayoutEffect(()=>{if(!1!==u)if("number"!=typeof u){if(f.hash){let e=document.getElementById(decodeURIComponent(f.hash.slice(1)));if(e)return void e.scrollIntoView()}!0!==l&&window.scrollTo(0,0)}else window.scrollTo(0,u)},[f,u,l]))}function oe(e,t){let{capture:n}=t||{};o.useEffect(()=>{let t=null!=n?{capture:n}:void 0;return window.addEventListener("beforeunload",e,t),()=>{window.removeEventListener("beforeunload",e,t)}},[e,n])}function ae(e){let{when:t,message:n}=e,a=(0,r.useBlocker)(t);o.useEffect(()=>{"blocked"===a.state&&(window.confirm(n)?setTimeout(a.proceed,0):a.reset())},[a,n]),o.useEffect(()=>{"blocked"!==a.state||t||a.reset()},[a,t])}function re(e,t){void 0===t&&(t={});let n=o.useContext(b);null==n&&(0,i.Oi)(!1);let{basename:a}=W(B.useViewTransitionState),s=(0,r.useResolvedPath)(e,{relative:t.relative});if(!n.isTransitioning)return!1;let u=(0,i.pb)(n.currentLocation.pathname,a)||n.currentLocation.pathname,l=(0,i.pb)(n.nextLocation.pathname,a)||n.nextLocation.pathname;return null!=(0,i.B6)(s.pathname,l)||null!=(0,i.B6)(s.pathname,u)}}}]);
3
- //# sourceMappingURL=3657.59d45756.chunk.js.map
@@ -1,10 +0,0 @@
1
- /**
2
- * React Router DOM v6.30.1
3
- *
4
- * Copyright (c) Remix Software Inc.
5
- *
6
- * This source code is licensed under the MIT license found in the
7
- * LICENSE.md file in the root directory of this source tree.
8
- *
9
- * @license MIT
10
- */