openvsx-webui-test 0.19.0-dev.2 → 0.20.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (361) hide show
  1. package/lib/components/banner.js +1 -2
  2. package/lib/components/banner.js.map +1 -1
  3. package/lib/components/delayed-load-indicator.js +2 -4
  4. package/lib/components/delayed-load-indicator.js.map +1 -1
  5. package/lib/components/generate-token-dialog.d.ts +22 -0
  6. package/lib/components/generate-token-dialog.d.ts.map +1 -0
  7. package/lib/components/generate-token-dialog.js +91 -0
  8. package/lib/components/generate-token-dialog.js.map +1 -0
  9. package/lib/components/rate-limiting/customer/general-details.d.ts +20 -0
  10. package/lib/components/rate-limiting/customer/general-details.d.ts.map +1 -0
  11. package/lib/components/rate-limiting/customer/general-details.js +8 -0
  12. package/lib/components/rate-limiting/customer/general-details.js.map +1 -0
  13. package/lib/components/rate-limiting/customer/index.d.ts +17 -0
  14. package/lib/components/rate-limiting/customer/index.d.ts.map +1 -0
  15. package/lib/components/rate-limiting/customer/index.js +15 -0
  16. package/lib/components/rate-limiting/customer/index.js.map +1 -0
  17. package/lib/components/rate-limiting/customer/usage-stats.d.ts +24 -0
  18. package/lib/components/rate-limiting/customer/usage-stats.d.ts.map +1 -0
  19. package/lib/components/rate-limiting/customer/usage-stats.js +6 -0
  20. package/lib/components/rate-limiting/customer/usage-stats.js.map +1 -0
  21. package/lib/{pages/admin-dashboard → components/rate-limiting}/usage-stats/usage-stats-chart.d.ts +5 -2
  22. package/lib/components/rate-limiting/usage-stats/usage-stats-chart.d.ts.map +1 -0
  23. package/lib/{pages/admin-dashboard → components/rate-limiting}/usage-stats/usage-stats-chart.js +32 -22
  24. package/lib/components/rate-limiting/usage-stats/usage-stats-chart.js.map +1 -0
  25. package/lib/components/rate-limiting/usage-stats/usage-stats-utils.d.ts +15 -0
  26. package/lib/components/rate-limiting/usage-stats/usage-stats-utils.d.ts.map +1 -0
  27. package/{src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts → lib/components/rate-limiting/usage-stats/usage-stats-utils.js} +4 -3
  28. package/lib/components/rate-limiting/usage-stats/usage-stats-utils.js.map +1 -0
  29. package/lib/components/rate-limiting/usage-stats/use-usage-stats.d.ts +22 -0
  30. package/lib/components/rate-limiting/usage-stats/use-usage-stats.d.ts.map +1 -0
  31. package/lib/components/rate-limiting/usage-stats/use-usage-stats.js +58 -0
  32. package/lib/components/rate-limiting/usage-stats/use-usage-stats.js.map +1 -0
  33. package/lib/components/scan-admin/common/conditional-tooltip.js +4 -16
  34. package/lib/components/scan-admin/common/conditional-tooltip.js.map +1 -1
  35. package/lib/components/scan-admin/common/file-table.js +24 -13
  36. package/lib/components/scan-admin/common/file-table.js.map +1 -1
  37. package/lib/components/scan-admin/dialogs/quarantine-dialog.js +4 -8
  38. package/lib/components/scan-admin/dialogs/quarantine-dialog.js.map +1 -1
  39. package/lib/components/scan-admin/scan-card/scan-card-content.js +2 -2
  40. package/lib/components/scan-admin/scan-card/scan-card-content.js.map +1 -1
  41. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js +21 -16
  42. package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js.map +1 -1
  43. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js +1 -2
  44. package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js.map +1 -1
  45. package/lib/components/scan-admin/scan-card/scan-card-header.js +10 -5
  46. package/lib/components/scan-admin/scan-card/scan-card-header.js.map +1 -1
  47. package/lib/components/scan-admin/scan-card/utils.js +1 -2
  48. package/lib/components/scan-admin/scan-card/utils.js.map +1 -1
  49. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js +4 -6
  50. package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js.map +1 -1
  51. package/lib/components/sidepanel/drawer-header.d.ts +14 -0
  52. package/lib/components/sidepanel/drawer-header.d.ts.map +1 -0
  53. package/lib/components/sidepanel/drawer-header.js +22 -0
  54. package/lib/components/sidepanel/drawer-header.js.map +1 -0
  55. package/lib/components/sidepanel/navigation-item.d.ts.map +1 -1
  56. package/lib/components/sidepanel/navigation-item.js +3 -3
  57. package/lib/components/sidepanel/navigation-item.js.map +1 -1
  58. package/lib/components/sidepanel/sidepanel.d.ts +7 -1
  59. package/lib/components/sidepanel/sidepanel.d.ts.map +1 -1
  60. package/lib/components/sidepanel/sidepanel.js +12 -13
  61. package/lib/components/sidepanel/sidepanel.js.map +1 -1
  62. package/lib/components/text-divider.js +1 -2
  63. package/lib/components/text-divider.js.map +1 -1
  64. package/lib/components/timestamp.js +2 -3
  65. package/lib/components/timestamp.js.map +1 -1
  66. package/lib/context/scan-admin/scan-api-actions.js +7 -16
  67. package/lib/context/scan-admin/scan-api-actions.js.map +1 -1
  68. package/lib/context/scan-admin/scan-api-effects.js +77 -93
  69. package/lib/context/scan-admin/scan-api-effects.js.map +1 -1
  70. package/lib/context/scan-admin/scan-context.d.ts.map +1 -1
  71. package/lib/context/scan-admin/scan-context.js +1 -0
  72. package/lib/context/scan-admin/scan-context.js.map +1 -1
  73. package/lib/context/scan-admin/scan-reducer.js +134 -53
  74. package/lib/context/scan-admin/scan-reducer.js.map +1 -1
  75. package/lib/default/default-app.d.ts +1 -1
  76. package/lib/default/default-app.d.ts.map +1 -1
  77. package/lib/default/default-app.js +11 -22
  78. package/lib/default/default-app.js.map +1 -1
  79. package/lib/default/menu-content.d.ts +1 -1
  80. package/lib/default/menu-content.d.ts.map +1 -1
  81. package/lib/default/menu-content.js +7 -3
  82. package/lib/default/menu-content.js.map +1 -1
  83. package/lib/default/page-settings.js +13 -18
  84. package/lib/default/page-settings.js.map +1 -1
  85. package/lib/extension-registry-service.d.ts +17 -1
  86. package/lib/extension-registry-service.d.ts.map +1 -1
  87. package/lib/extension-registry-service.js +659 -629
  88. package/lib/extension-registry-service.js.map +1 -1
  89. package/lib/extension-registry-types.d.ts +13 -0
  90. package/lib/extension-registry-types.d.ts.map +1 -1
  91. package/lib/hooks/scan-admin/use-auto-rejected-tab.js +5 -7
  92. package/lib/hooks/scan-admin/use-auto-rejected-tab.js.map +1 -1
  93. package/lib/hooks/scan-admin/use-quarantined-tab.js +5 -7
  94. package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -1
  95. package/lib/main.d.ts.map +1 -1
  96. package/lib/main.js +8 -16
  97. package/lib/main.js.map +1 -1
  98. package/lib/other-pages.d.ts +12 -0
  99. package/lib/other-pages.d.ts.map +1 -1
  100. package/lib/other-pages.js +25 -12
  101. package/lib/other-pages.js.map +1 -1
  102. package/lib/pages/admin-dashboard/admin-dashboard.d.ts +0 -12
  103. package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
  104. package/lib/pages/admin-dashboard/admin-dashboard.js +126 -49
  105. package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
  106. package/lib/pages/admin-dashboard/admin-routes.d.ts +25 -0
  107. package/lib/pages/admin-dashboard/admin-routes.d.ts.map +1 -0
  108. package/lib/pages/admin-dashboard/admin-routes.js +27 -0
  109. package/lib/pages/admin-dashboard/admin-routes.js.map +1 -0
  110. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +1 -9
  111. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -1
  112. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +17 -15
  113. package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -1
  114. package/lib/pages/admin-dashboard/components/data-grid-filter.d.ts +22 -0
  115. package/lib/pages/admin-dashboard/components/data-grid-filter.d.ts.map +1 -0
  116. package/lib/pages/admin-dashboard/components/data-grid-filter.js +13 -0
  117. package/lib/pages/admin-dashboard/components/data-grid-filter.js.map +1 -0
  118. package/lib/pages/admin-dashboard/components/index.d.ts +2 -1
  119. package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -1
  120. package/lib/pages/admin-dashboard/components/index.js +2 -1
  121. package/lib/pages/admin-dashboard/components/index.js.map +1 -1
  122. package/lib/pages/admin-dashboard/{usage-stats/usage-stats-utils.d.ts → customers/customer-details.d.ts} +3 -2
  123. package/lib/pages/admin-dashboard/customers/customer-details.d.ts.map +1 -0
  124. package/lib/pages/admin-dashboard/customers/customer-details.js +78 -0
  125. package/lib/pages/admin-dashboard/customers/customer-details.js.map +1 -0
  126. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +1 -1
  127. package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -1
  128. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +33 -34
  129. package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -1
  130. package/lib/pages/admin-dashboard/customers/customer-member-list.d.ts +19 -0
  131. package/lib/pages/admin-dashboard/customers/customer-member-list.d.ts.map +1 -0
  132. package/lib/pages/admin-dashboard/customers/customer-member-list.js +88 -0
  133. package/lib/pages/admin-dashboard/customers/customer-member-list.js.map +1 -0
  134. package/lib/pages/admin-dashboard/customers/customer-token-list.d.ts +19 -0
  135. package/lib/pages/admin-dashboard/customers/customer-token-list.d.ts.map +1 -0
  136. package/lib/pages/admin-dashboard/customers/customer-token-list.js +70 -0
  137. package/lib/pages/admin-dashboard/customers/customer-token-list.js.map +1 -0
  138. package/lib/pages/admin-dashboard/customers/customers.d.ts +1 -1
  139. package/lib/pages/admin-dashboard/customers/customers.js +20 -29
  140. package/lib/pages/admin-dashboard/customers/customers.js.map +1 -1
  141. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +4 -14
  142. package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -1
  143. package/lib/pages/admin-dashboard/extension-admin.js +7 -16
  144. package/lib/pages/admin-dashboard/extension-admin.js.map +1 -1
  145. package/lib/pages/admin-dashboard/extension-remove-dialog.js +3 -12
  146. package/lib/pages/admin-dashboard/extension-remove-dialog.js.map +1 -1
  147. package/lib/pages/admin-dashboard/extension-version-container.js +3 -5
  148. package/lib/pages/admin-dashboard/extension-version-container.js.map +1 -1
  149. package/lib/pages/admin-dashboard/logs/logs.d.ts.map +1 -1
  150. package/lib/pages/admin-dashboard/logs/logs.js +6 -24
  151. package/lib/pages/admin-dashboard/logs/logs.js.map +1 -1
  152. package/lib/pages/admin-dashboard/namespace-admin.js +7 -16
  153. package/lib/pages/admin-dashboard/namespace-admin.js.map +1 -1
  154. package/lib/pages/admin-dashboard/namespace-change-dialog.js +3 -12
  155. package/lib/pages/admin-dashboard/namespace-change-dialog.js.map +1 -1
  156. package/lib/pages/admin-dashboard/namespace-input.js +1 -1
  157. package/lib/pages/admin-dashboard/namespace-input.js.map +1 -1
  158. package/lib/pages/admin-dashboard/publisher-admin.d.ts.map +1 -1
  159. package/lib/pages/admin-dashboard/publisher-admin.js +28 -22
  160. package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
  161. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +5 -15
  162. package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
  163. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js +3 -12
  164. package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js.map +1 -1
  165. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +4 -13
  166. package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -1
  167. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +34 -23
  168. package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -1
  169. package/lib/pages/admin-dashboard/tiers/tiers.js +12 -21
  170. package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -1
  171. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +3 -14
  172. package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -1
  173. package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -1
  174. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +11 -45
  175. package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -1
  176. package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.d.ts +22 -0
  177. package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.d.ts.map +1 -0
  178. package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.js +58 -0
  179. package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.js.map +1 -0
  180. package/lib/pages/admin-dashboard/welcome.js +1 -1
  181. package/lib/pages/admin-dashboard/welcome.js.map +1 -1
  182. package/lib/pages/extension-detail/extension-detail-changes.js +3 -12
  183. package/lib/pages/extension-detail/extension-detail-changes.js.map +1 -1
  184. package/lib/pages/extension-detail/extension-detail-overview.js +6 -16
  185. package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
  186. package/lib/pages/extension-detail/extension-detail-reviews.js +12 -24
  187. package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
  188. package/lib/pages/extension-detail/extension-detail-routes.d.ts +32 -0
  189. package/lib/pages/extension-detail/extension-detail-routes.d.ts.map +1 -0
  190. package/lib/pages/extension-detail/extension-detail-routes.js +35 -0
  191. package/lib/pages/extension-detail/extension-detail-routes.js.map +1 -0
  192. package/lib/pages/extension-detail/extension-detail.d.ts +0 -19
  193. package/lib/pages/extension-detail/extension-detail.d.ts.map +1 -1
  194. package/lib/pages/extension-detail/extension-detail.js +28 -50
  195. package/lib/pages/extension-detail/extension-detail.js.map +1 -1
  196. package/lib/pages/extension-detail/extension-rating-stars.js +1 -2
  197. package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
  198. package/lib/pages/extension-detail/extension-review-dialog.js +4 -14
  199. package/lib/pages/extension-detail/extension-review-dialog.js.map +1 -1
  200. package/lib/pages/extension-list/extension-list-container.d.ts +0 -3
  201. package/lib/pages/extension-list/extension-list-container.d.ts.map +1 -1
  202. package/lib/pages/extension-list/extension-list-container.js +5 -10
  203. package/lib/pages/extension-list/extension-list-container.js.map +1 -1
  204. package/lib/pages/extension-list/extension-list-header.js +3 -6
  205. package/lib/pages/extension-list/extension-list-header.js.map +1 -1
  206. package/lib/pages/extension-list/extension-list-item.js +7 -17
  207. package/lib/pages/extension-list/extension-list-item.js.map +1 -1
  208. package/lib/pages/extension-list/extension-list-routes.d.ts +16 -0
  209. package/lib/pages/extension-list/extension-list-routes.d.ts.map +1 -0
  210. package/lib/pages/extension-list/extension-list-routes.js +18 -0
  211. package/lib/pages/extension-list/extension-list-routes.js.map +1 -0
  212. package/lib/pages/extension-list/extension-list-searchfield.js +4 -7
  213. package/lib/pages/extension-list/extension-list-searchfield.js.map +1 -1
  214. package/lib/pages/extension-list/extension-list.js +8 -19
  215. package/lib/pages/extension-list/extension-list.js.map +1 -1
  216. package/lib/pages/namespace-detail/namespace-detail-routes.d.ts +20 -0
  217. package/lib/pages/namespace-detail/namespace-detail-routes.d.ts.map +1 -0
  218. package/lib/pages/namespace-detail/namespace-detail-routes.js +23 -0
  219. package/lib/pages/namespace-detail/namespace-detail-routes.js.map +1 -0
  220. package/lib/pages/namespace-detail/namespace-detail.d.ts +0 -7
  221. package/lib/pages/namespace-detail/namespace-detail.d.ts.map +1 -1
  222. package/lib/pages/namespace-detail/namespace-detail.js +4 -24
  223. package/lib/pages/namespace-detail/namespace-detail.js.map +1 -1
  224. package/lib/pages/user/add-namespace-member-dialog.d.ts.map +1 -1
  225. package/lib/pages/user/add-namespace-member-dialog.js +8 -67
  226. package/lib/pages/user/add-namespace-member-dialog.js.map +1 -1
  227. package/lib/pages/user/add-user-dialog.d.ts +25 -0
  228. package/lib/pages/user/add-user-dialog.d.ts.map +1 -0
  229. package/lib/pages/user/add-user-dialog.js +66 -0
  230. package/lib/pages/user/add-user-dialog.js.map +1 -0
  231. package/lib/pages/user/avatar.js +3 -3
  232. package/lib/pages/user/avatar.js.map +1 -1
  233. package/lib/pages/user/create-namespace-dialog.js +3 -12
  234. package/lib/pages/user/create-namespace-dialog.js.map +1 -1
  235. package/lib/pages/user/{generate-token-dialog.d.ts → generate-access-token-dialog.d.ts} +2 -2
  236. package/lib/pages/user/generate-access-token-dialog.d.ts.map +1 -0
  237. package/lib/pages/user/generate-access-token-dialog.js +33 -0
  238. package/lib/pages/user/generate-access-token-dialog.js.map +1 -0
  239. package/lib/pages/user/logout.js +3 -12
  240. package/lib/pages/user/logout.js.map +1 -1
  241. package/lib/pages/user/publish-extension-dialog.js +12 -21
  242. package/lib/pages/user/publish-extension-dialog.js.map +1 -1
  243. package/lib/pages/user/user-namespace-details.js +29 -42
  244. package/lib/pages/user/user-namespace-details.js.map +1 -1
  245. package/lib/pages/user/user-namespace-extension-list-item.js +6 -8
  246. package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
  247. package/lib/pages/user/user-namespace-extension-list.js +6 -15
  248. package/lib/pages/user/user-namespace-extension-list.js.map +1 -1
  249. package/lib/pages/user/user-namespace-member-component.js +1 -1
  250. package/lib/pages/user/user-namespace-member-component.js.map +1 -1
  251. package/lib/pages/user/user-namespace-member-list.js +9 -18
  252. package/lib/pages/user/user-namespace-member-list.js.map +1 -1
  253. package/lib/pages/user/user-publisher-agreement.js +8 -18
  254. package/lib/pages/user/user-publisher-agreement.js.map +1 -1
  255. package/lib/pages/user/user-setting-tabs.d.ts.map +1 -1
  256. package/lib/pages/user/user-setting-tabs.js +2 -2
  257. package/lib/pages/user/user-setting-tabs.js.map +1 -1
  258. package/lib/pages/user/user-settings-customer-detail.d.ts +19 -0
  259. package/lib/pages/user/user-settings-customer-detail.d.ts.map +1 -0
  260. package/lib/pages/user/user-settings-customer-detail.js +9 -0
  261. package/lib/pages/user/user-settings-customer-detail.js.map +1 -0
  262. package/lib/pages/user/user-settings-customers.d.ts +15 -0
  263. package/lib/pages/user/user-settings-customers.d.ts.map +1 -0
  264. package/lib/pages/user/user-settings-customers.js +66 -0
  265. package/lib/pages/user/user-settings-customers.js.map +1 -0
  266. package/lib/pages/user/user-settings-delete-extension.js +8 -17
  267. package/lib/pages/user/user-settings-delete-extension.js.map +1 -1
  268. package/lib/pages/user/user-settings-extensions.js +3 -12
  269. package/lib/pages/user/user-settings-extensions.js.map +1 -1
  270. package/lib/pages/user/user-settings-namespace-detail.d.ts.map +1 -1
  271. package/lib/pages/user/user-settings-namespace-detail.js +4 -12
  272. package/lib/pages/user/user-settings-namespace-detail.js.map +1 -1
  273. package/lib/pages/user/user-settings-namespaces.js +6 -15
  274. package/lib/pages/user/user-settings-namespaces.js.map +1 -1
  275. package/lib/pages/user/user-settings-profile.js +1 -2
  276. package/lib/pages/user/user-settings-profile.js.map +1 -1
  277. package/lib/pages/user/user-settings-routes.d.ts +23 -0
  278. package/lib/pages/user/user-settings-routes.d.ts.map +1 -0
  279. package/lib/pages/user/user-settings-routes.js +25 -0
  280. package/lib/pages/user/user-settings-routes.js.map +1 -0
  281. package/lib/pages/user/user-settings-tokens.d.ts +0 -7
  282. package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
  283. package/lib/pages/user/user-settings-tokens.js +15 -25
  284. package/lib/pages/user/user-settings-tokens.js.map +1 -1
  285. package/lib/pages/user/user-settings.d.ts +0 -9
  286. package/lib/pages/user/user-settings.d.ts.map +1 -1
  287. package/lib/pages/user/user-settings.js +4 -12
  288. package/lib/pages/user/user-settings.js.map +1 -1
  289. package/lib/server-request.js +64 -76
  290. package/lib/server-request.js.map +1 -1
  291. package/lib/utils.js +2 -4
  292. package/lib/utils.js.map +1 -1
  293. package/package.json +9 -7
  294. package/src/components/generate-token-dialog.tsx +167 -0
  295. package/src/components/rate-limiting/customer/general-details.tsx +106 -0
  296. package/src/components/rate-limiting/customer/index.ts +18 -0
  297. package/src/components/rate-limiting/customer/usage-stats.tsx +50 -0
  298. package/src/{pages/admin-dashboard → components/rate-limiting}/usage-stats/usage-stats-chart.tsx +57 -31
  299. package/{lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js → src/components/rate-limiting/usage-stats/usage-stats-utils.ts} +4 -2
  300. package/src/components/rate-limiting/usage-stats/use-usage-stats.ts +70 -0
  301. package/src/components/scan-admin/scan-card/scan-card-header.tsx +2 -2
  302. package/src/components/sidepanel/drawer-header.tsx +23 -0
  303. package/src/components/sidepanel/navigation-item.tsx +3 -2
  304. package/src/components/sidepanel/sidepanel.tsx +29 -17
  305. package/src/context/scan-admin/scan-context.tsx +1 -0
  306. package/src/default/default-app.tsx +1 -1
  307. package/src/default/menu-content.tsx +6 -2
  308. package/src/default/page-settings.tsx +1 -1
  309. package/src/extension-registry-service.ts +153 -26
  310. package/src/extension-registry-types.ts +16 -0
  311. package/src/main.tsx +2 -1
  312. package/src/other-pages.tsx +21 -4
  313. package/src/pages/admin-dashboard/admin-dashboard.tsx +250 -83
  314. package/src/pages/admin-dashboard/admin-routes.ts +27 -0
  315. package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +1 -31
  316. package/src/pages/admin-dashboard/components/data-grid-filter.tsx +45 -0
  317. package/src/pages/admin-dashboard/components/index.ts +1 -1
  318. package/src/pages/admin-dashboard/customers/customer-details.tsx +133 -0
  319. package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +3 -4
  320. package/src/pages/admin-dashboard/customers/customer-member-list.tsx +174 -0
  321. package/src/pages/admin-dashboard/customers/customer-token-list.tsx +135 -0
  322. package/src/pages/admin-dashboard/customers/customers.tsx +8 -8
  323. package/src/pages/admin-dashboard/logs/logs.tsx +1 -10
  324. package/src/pages/admin-dashboard/publisher-admin.tsx +29 -11
  325. package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +10 -39
  326. package/src/pages/admin-dashboard/usage-stats/use-usage-stats.ts +70 -0
  327. package/src/pages/admin-dashboard/welcome.tsx +1 -1
  328. package/src/pages/extension-detail/extension-detail-overview.tsx +2 -2
  329. package/src/pages/extension-detail/extension-detail-routes.ts +35 -0
  330. package/src/pages/extension-detail/extension-detail.tsx +3 -23
  331. package/src/pages/extension-list/extension-list-container.tsx +1 -5
  332. package/src/pages/extension-list/extension-list-item.tsx +1 -1
  333. package/src/pages/extension-list/extension-list-routes.ts +18 -0
  334. package/src/pages/namespace-detail/namespace-detail-routes.ts +23 -0
  335. package/src/pages/namespace-detail/namespace-detail.tsx +0 -10
  336. package/src/pages/user/add-namespace-member-dialog.tsx +17 -116
  337. package/src/pages/user/add-user-dialog.tsx +141 -0
  338. package/src/pages/user/avatar.tsx +2 -2
  339. package/src/pages/user/generate-access-token-dialog.tsx +49 -0
  340. package/src/pages/user/user-namespace-extension-list-item.tsx +2 -2
  341. package/src/pages/user/user-setting-tabs.tsx +2 -1
  342. package/src/pages/user/user-settings-customer-detail.tsx +39 -0
  343. package/src/pages/user/user-settings-customers.tsx +120 -0
  344. package/src/pages/user/user-settings-delete-extension.tsx +1 -1
  345. package/src/pages/user/user-settings-namespace-detail.tsx +3 -1
  346. package/src/pages/user/user-settings-routes.ts +25 -0
  347. package/src/pages/user/user-settings-tokens.tsx +3 -10
  348. package/src/pages/user/user-settings.tsx +4 -12
  349. package/lib/components/copy-to-clipboard.d.ts +0 -21
  350. package/lib/components/copy-to-clipboard.d.ts.map +0 -1
  351. package/lib/components/copy-to-clipboard.js +0 -26
  352. package/lib/components/copy-to-clipboard.js.map +0 -1
  353. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +0 -1
  354. package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +0 -1
  355. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +0 -1
  356. package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +0 -1
  357. package/lib/pages/user/generate-token-dialog.d.ts.map +0 -1
  358. package/lib/pages/user/generate-token-dialog.js +0 -88
  359. package/lib/pages/user/generate-token-dialog.js.map +0 -1
  360. package/src/components/copy-to-clipboard.tsx +0 -50
  361. package/src/pages/user/generate-token-dialog.tsx +0 -157
@@ -15,7 +15,7 @@ import {
15
15
  LoginProviders, ScanResultJson, ScanCounts, ScanResultsResponse, ScanFilterOptions,
16
16
  FilesResponse, FileDecisionCountsJson, ScanDecisionRequest, ScanDecisionResponse,
17
17
  FileDecisionRequest, FileDecisionResponse, FileDecisionDeleteRequest, FileDecisionDeleteResponse,
18
- Tier, TierList, Customer, CustomerList, UsageStatsList, LogPageableList,
18
+ Tier, TierList, Customer, CustomerList, UsageStatsList, LogPageableList, CustomerMembershipList, RateLimitToken,
19
19
  } from './extension-registry-types';
20
20
  import { createAbsoluteURL, addQuery } from './utils';
21
21
  import { sendRequest, ErrorResponse } from './server-request';
@@ -28,7 +28,7 @@ export class ExtensionRegistryService {
28
28
  this.admin = new AdminConstructor(this);
29
29
  }
30
30
 
31
- getLoginProviders(abortController: AbortController): Promise<Readonly<LoginProviders|SuccessResult>> {
31
+ async getLoginProviders(abortController: AbortController): Promise<Readonly<LoginProviders|SuccessResult>> {
32
32
  const endpoint = createAbsoluteURL([this.serverUrl, 'login-providers']);
33
33
  return sendRequest({ abortController, endpoint });
34
34
  }
@@ -49,7 +49,7 @@ export class ExtensionRegistryService {
49
49
  return createAbsoluteURL(arr);
50
50
  }
51
51
 
52
- getNamespaceDetails(abortController: AbortController, name: string): Promise<Readonly<NamespaceDetails>> {
52
+ async getNamespaceDetails(abortController: AbortController, name: string): Promise<Readonly<NamespaceDetails>> {
53
53
  const endpoint = createAbsoluteURL([this.serverUrl, 'api', name, 'details']);
54
54
  return sendRequest({ abortController, endpoint });
55
55
  }
@@ -95,7 +95,7 @@ export class ExtensionRegistryService {
95
95
  });
96
96
  }
97
97
 
98
- search(abortController: AbortController, filter?: ExtensionFilter): Promise<Readonly<SearchResult | ErrorResult>> {
98
+ async search(abortController: AbortController, filter?: ExtensionFilter): Promise<Readonly<SearchResult | ErrorResult>> {
99
99
  const query: { key: string, value: string | number }[] = [];
100
100
  if (filter) {
101
101
  if (filter.query)
@@ -115,11 +115,11 @@ export class ExtensionRegistryService {
115
115
  return sendRequest({ abortController, endpoint });
116
116
  }
117
117
 
118
- getExtensionDetail(abortController: AbortController, extensionUrl: UrlString): Promise<Readonly<Extension | ErrorResult>> {
118
+ async getExtensionDetail(abortController: AbortController, extensionUrl: UrlString): Promise<Readonly<Extension | ErrorResult>> {
119
119
  return sendRequest({ abortController, endpoint: extensionUrl });
120
120
  }
121
121
 
122
- getExtensionReadme(abortController: AbortController, extension: Extension): Promise<string> {
122
+ async getExtensionReadme(abortController: AbortController, extension: Extension): Promise<string> {
123
123
  return sendRequest({
124
124
  abortController,
125
125
  endpoint: extension.files.readme,
@@ -128,7 +128,7 @@ export class ExtensionRegistryService {
128
128
  });
129
129
  }
130
130
 
131
- getExtensionChangelog(abortController: AbortController, extension: Extension): Promise<string> {
131
+ async getExtensionChangelog(abortController: AbortController, extension: Extension): Promise<string> {
132
132
  return sendRequest({
133
133
  abortController,
134
134
  endpoint: extension.files.changelog,
@@ -137,7 +137,7 @@ export class ExtensionRegistryService {
137
137
  });
138
138
  }
139
139
 
140
- getExtensionIcon(abortController: AbortController, extension: Extension | SearchEntry): Promise<string | undefined> {
140
+ async getExtensionIcon(abortController: AbortController, extension: Extension | SearchEntry): Promise<string | undefined> {
141
141
  if (!extension.files.icon) {
142
142
  return Promise.resolve(undefined);
143
143
  }
@@ -173,7 +173,7 @@ export class ExtensionRegistryService {
173
173
  ];
174
174
  }
175
175
 
176
- getExtensionReviews(abortController: AbortController, extension: Extension): Promise<Readonly<ExtensionReviewList>> {
176
+ async getExtensionReviews(abortController: AbortController, extension: Extension): Promise<Readonly<ExtensionReviewList>> {
177
177
  return sendRequest({ abortController, endpoint: extension.reviewsUrl });
178
178
  }
179
179
 
@@ -228,7 +228,7 @@ export class ExtensionRegistryService {
228
228
  });
229
229
  }
230
230
 
231
- getUser(abortController: AbortController): Promise<Readonly<UserData | ErrorResult>> {
231
+ async getUser(abortController: AbortController): Promise<Readonly<UserData | ErrorResult>> {
232
232
  return sendRequest({
233
233
  abortController,
234
234
  endpoint: createAbsoluteURL([this.serverUrl, 'user']),
@@ -236,7 +236,7 @@ export class ExtensionRegistryService {
236
236
  });
237
237
  }
238
238
 
239
- getUserAuthError(abortController: AbortController): Promise<Readonly<ErrorResponse>> {
239
+ async getUserAuthError(abortController: AbortController): Promise<Readonly<ErrorResponse>> {
240
240
  return sendRequest({
241
241
  abortController,
242
242
  endpoint: createAbsoluteURL([this.serverUrl, 'user', 'auth-error']),
@@ -244,7 +244,7 @@ export class ExtensionRegistryService {
244
244
  });
245
245
  }
246
246
 
247
- getUserByName(abortController: AbortController, name: string): Promise<Readonly<UserData>[]> {
247
+ async getUserByName(abortController: AbortController, name: string): Promise<Readonly<UserData>[]> {
248
248
  return sendRequest({
249
249
  abortController,
250
250
  endpoint: createAbsoluteURL([this.serverUrl, 'user', 'search', name]),
@@ -252,7 +252,7 @@ export class ExtensionRegistryService {
252
252
  });
253
253
  }
254
254
 
255
- getAccessTokens(abortController: AbortController, user: UserData): Promise<Readonly<PersonalAccessToken>[]> {
255
+ async getAccessTokens(abortController: AbortController, user: UserData): Promise<Readonly<PersonalAccessToken>[]> {
256
256
  return sendRequest({
257
257
  abortController,
258
258
  credentials: true,
@@ -310,7 +310,7 @@ export class ExtensionRegistryService {
310
310
  })));
311
311
  }
312
312
 
313
- getCsrfToken(abortController: AbortController): Promise<Readonly<CsrfTokenJson | ErrorResult>> {
313
+ async getCsrfToken(abortController: AbortController): Promise<Readonly<CsrfTokenJson | ErrorResult>> {
314
314
  return sendRequest({
315
315
  abortController,
316
316
  credentials: true,
@@ -318,7 +318,7 @@ export class ExtensionRegistryService {
318
318
  });
319
319
  }
320
320
 
321
- getNamespaces(abortController: AbortController): Promise<Readonly<Namespace>[]> {
321
+ async getNamespaces(abortController: AbortController): Promise<Readonly<Namespace>[]> {
322
322
  return sendRequest({
323
323
  abortController,
324
324
  credentials: true,
@@ -326,7 +326,26 @@ export class ExtensionRegistryService {
326
326
  });
327
327
  }
328
328
 
329
- getNamespaceMembers(abortController: AbortController, namespace: Namespace): Promise<Readonly<NamespaceMembershipList>> {
329
+ async getCustomers(abortController: AbortController): Promise<Readonly<Customer>[]> {
330
+ return sendRequest({
331
+ abortController,
332
+ credentials: true,
333
+ endpoint: createAbsoluteURL([this.serverUrl, 'user', 'customers'])
334
+ });
335
+ }
336
+
337
+ async getUsageStats(abortController: AbortController, customerName: string, date: Date): Promise<Readonly<UsageStatsList>> {
338
+ const query: { key: string, value: string | number }[] = [];
339
+ query.push({ key: 'date', value: date.toISOString() });
340
+
341
+ return sendRequest({
342
+ abortController,
343
+ endpoint: createAbsoluteURL([this.serverUrl, 'user', 'customers', customerName, 'usage'], query),
344
+ credentials: true
345
+ }, false);
346
+ }
347
+
348
+ async getNamespaceMembers(abortController: AbortController, namespace: Namespace): Promise<Readonly<NamespaceMembershipList>> {
330
349
  return sendRequest({
331
350
  abortController,
332
351
  credentials: true,
@@ -371,7 +390,7 @@ export class ExtensionRegistryService {
371
390
  });
372
391
  }
373
392
 
374
- getStaticContent(abortController: AbortController, url: string): Promise<string> {
393
+ async getStaticContent(abortController: AbortController, url: string): Promise<string> {
375
394
  return sendRequest({
376
395
  abortController,
377
396
  endpoint: url,
@@ -505,11 +524,18 @@ export interface AdminService {
505
524
  updateTier(abortController: AbortController, name: string, tier: Tier): Promise<Readonly<Tier>>;
506
525
  deleteTier(abortController: AbortController, name: string): Promise<Readonly<SuccessResult | ErrorResult>>;
507
526
  getCustomers(abortController: AbortController): Promise<Readonly<CustomerList>>;
527
+ getCustomer(abortController: AbortController, name: string): Promise<Readonly<Customer>>;
508
528
  createCustomer(abortController: AbortController, customer: Customer): Promise<Readonly<Customer>>;
509
529
  updateCustomer(abortController: AbortController, name: string, customer: Customer): Promise<Readonly<Customer>>;
510
530
  deleteCustomer(abortController: AbortController, name: string): Promise<Readonly<SuccessResult | ErrorResult>>;
531
+ getCustomerMembers(abortController: AbortController, name: string): Promise<Readonly<CustomerMembershipList>>;
532
+ addCustomerMember(abortController: AbortController, name: string, user: UserData): Promise<Readonly<SuccessResult | ErrorResult>>;
533
+ removeCustomerMember(abortController: AbortController, name: string, user: UserData): Promise<Readonly<SuccessResult | ErrorResult>>;
511
534
  getUsageStats(abortController: AbortController, customerName: string, date: Date): Promise<Readonly<UsageStatsList>>;
512
535
  getLogs(abortController: AbortController, page?: number, size?: number, period?: string): Promise<Readonly<LogPageableList>>;
536
+ getCustomerRateLimitTokens(abortController: AbortController, customerName: string): Promise<Readonly<RateLimitToken[]>>;
537
+ createCustomerRateLimitToken(abortController: AbortController, customerName: string, description: string): Promise<Readonly<RateLimitToken>>;
538
+ deleteCustomerRateLimitToken(abortController: AbortController, customerName: string, tokenId: number): Promise<Readonly<SuccessResult | ErrorResult>>;
513
539
  }
514
540
 
515
541
  export interface AdminServiceConstructor {
@@ -520,7 +546,7 @@ export class AdminServiceImpl implements AdminService {
520
546
 
521
547
  constructor(readonly registry: ExtensionRegistryService) {}
522
548
 
523
- getExtension(abortController: AbortController, namespace: string, extension: string): Promise<Readonly<Extension>> {
549
+ async getExtension(abortController: AbortController, namespace: string, extension: string): Promise<Readonly<Extension>> {
524
550
  return sendRequest({
525
551
  abortController,
526
552
  credentials: true,
@@ -548,7 +574,7 @@ export class AdminServiceImpl implements AdminService {
548
574
  });
549
575
  }
550
576
 
551
- getNamespace(abortController: AbortController, name: string): Promise<Readonly<Namespace>> {
577
+ async getNamespace(abortController: AbortController, name: string): Promise<Readonly<Namespace>> {
552
578
  return sendRequest({
553
579
  abortController,
554
580
  credentials: true,
@@ -634,7 +660,7 @@ export class AdminServiceImpl implements AdminService {
634
660
  });
635
661
  }
636
662
 
637
- getAllScans(abortController: AbortController, params?: { size?: number; offset?: number; status?: string | string[]; publisher?: string; namespace?: string; name?: string; validationType?: string[]; threatScannerName?: string[]; dateStartedFrom?: string; dateStartedTo?: string; enforcement?: 'enforced' | 'notEnforced' | 'all'; adminDecision?: string[] }): Promise<Readonly<ScanResultsResponse>> {
663
+ async getAllScans(abortController: AbortController, params?: { size?: number; offset?: number; status?: string | string[]; publisher?: string; namespace?: string; name?: string; validationType?: string[]; threatScannerName?: string[]; dateStartedFrom?: string; dateStartedTo?: string; enforcement?: 'enforced' | 'notEnforced' | 'all'; adminDecision?: string[] }): Promise<Readonly<ScanResultsResponse>> {
638
664
  const query: { key: string, value: string | number }[] = [];
639
665
  if (params) {
640
666
  if (params.size !== undefined)
@@ -672,7 +698,7 @@ export class AdminServiceImpl implements AdminService {
672
698
  });
673
699
  }
674
700
 
675
- getScan(abortController: AbortController, scanId: string): Promise<Readonly<ScanResultJson>> {
701
+ async getScan(abortController: AbortController, scanId: string): Promise<Readonly<ScanResultJson>> {
676
702
  return sendRequest({
677
703
  abortController,
678
704
  credentials: true,
@@ -680,7 +706,7 @@ export class AdminServiceImpl implements AdminService {
680
706
  });
681
707
  }
682
708
 
683
- getScanCounts(abortController: AbortController, params?: { dateStartedFrom?: string; dateStartedTo?: string; enforcement?: 'enforced' | 'notEnforced' | 'all'; threatScannerName?: string[]; validationType?: string[] }): Promise<Readonly<ScanCounts>> {
709
+ async getScanCounts(abortController: AbortController, params?: { dateStartedFrom?: string; dateStartedTo?: string; enforcement?: 'enforced' | 'notEnforced' | 'all'; threatScannerName?: string[]; validationType?: string[] }): Promise<Readonly<ScanCounts>> {
684
710
  const query: { key: string, value: string | number }[] = [];
685
711
  if (params) {
686
712
  if (params.dateStartedFrom)
@@ -704,7 +730,7 @@ export class AdminServiceImpl implements AdminService {
704
730
  });
705
731
  }
706
732
 
707
- getScanFilterOptions(abortController: AbortController): Promise<Readonly<ScanFilterOptions>> {
733
+ async getScanFilterOptions(abortController: AbortController): Promise<Readonly<ScanFilterOptions>> {
708
734
  return sendRequest({
709
735
  abortController,
710
736
  credentials: true,
@@ -712,7 +738,7 @@ export class AdminServiceImpl implements AdminService {
712
738
  });
713
739
  }
714
740
 
715
- getFiles(abortController: AbortController, params?: { size?: number; offset?: number; decision?: string; publisher?: string; namespace?: string; name?: string; dateDecidedFrom?: string; dateDecidedTo?: string; sortBy?: string; sortOrder?: 'asc' | 'desc' }): Promise<Readonly<FilesResponse>> {
741
+ async getFiles(abortController: AbortController, params?: { size?: number; offset?: number; decision?: string; publisher?: string; namespace?: string; name?: string; dateDecidedFrom?: string; dateDecidedTo?: string; sortBy?: string; sortOrder?: 'asc' | 'desc' }): Promise<Readonly<FilesResponse>> {
716
742
  const query: { key: string, value: string | number }[] = [];
717
743
  if (params) {
718
744
  if (params.size !== undefined)
@@ -744,7 +770,7 @@ export class AdminServiceImpl implements AdminService {
744
770
  });
745
771
  }
746
772
 
747
- getFileCounts(abortController: AbortController, params?: { dateDecidedFrom?: string; dateDecidedTo?: string }): Promise<Readonly<FileDecisionCountsJson>> {
773
+ async getFileCounts(abortController: AbortController, params?: { dateDecidedFrom?: string; dateDecidedTo?: string }): Promise<Readonly<FileDecisionCountsJson>> {
748
774
  const query: { key: string, value: string | number }[] = [];
749
775
  if (params) {
750
776
  if (params.dateDecidedFrom)
@@ -885,13 +911,21 @@ export class AdminServiceImpl implements AdminService {
885
911
  }
886
912
 
887
913
  async getCustomers(abortController: AbortController): Promise<Readonly<CustomerList>> {
888
- return sendRequest({
914
+ return await sendRequest({
889
915
  abortController,
890
916
  endpoint: createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers']),
891
917
  credentials: true
892
918
  }, false);
893
919
  }
894
920
 
921
+ async getCustomer(abortController: AbortController, name: string): Promise<Readonly<Customer>> {
922
+ return await sendRequest({
923
+ abortController,
924
+ endpoint: createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', name]),
925
+ credentials: true
926
+ }, false);
927
+ }
928
+
895
929
  async createCustomer(abortController: AbortController, customer: Customer): Promise<Readonly<Customer>> {
896
930
  const csrfResponse = await this.registry.getCsrfToken(abortController);
897
931
  const headers: Record<string, string> = {
@@ -948,6 +982,54 @@ export class AdminServiceImpl implements AdminService {
948
982
  }, false);
949
983
  }
950
984
 
985
+ async getCustomerMembers(abortController: AbortController, name: string): Promise<Readonly<CustomerMembershipList>> {
986
+ return sendRequest({
987
+ abortController,
988
+ credentials: true,
989
+ endpoint: createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', name, "members"]),
990
+ }, false);
991
+ }
992
+
993
+ async addCustomerMember(abortController: AbortController, name: string, user: UserData): Promise<Readonly<SuccessResult | ErrorResult>> {
994
+ const csrfResponse = await this.registry.getCsrfToken(abortController);
995
+ const headers: Record<string, string> = {};
996
+ if (!isError(csrfResponse)) {
997
+ const csrfToken = csrfResponse as CsrfTokenJson;
998
+ headers[csrfToken.header] = csrfToken.value;
999
+ }
1000
+ const query = [
1001
+ { key: 'user', value: user.loginName },
1002
+ { key: 'provider', value: user.provider },
1003
+ ];
1004
+ return sendRequest({
1005
+ abortController,
1006
+ headers,
1007
+ method: 'POST',
1008
+ credentials: true,
1009
+ endpoint: addQuery(createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', name, "add-member"]), query),
1010
+ }, false);
1011
+ }
1012
+
1013
+ async removeCustomerMember(abortController: AbortController, name: string, user: UserData): Promise<Readonly<SuccessResult | ErrorResult>> {
1014
+ const csrfResponse = await this.registry.getCsrfToken(abortController);
1015
+ const headers: Record<string, string> = {};
1016
+ if (!isError(csrfResponse)) {
1017
+ const csrfToken = csrfResponse as CsrfTokenJson;
1018
+ headers[csrfToken.header] = csrfToken.value;
1019
+ }
1020
+ const query = [
1021
+ { key: 'user', value: user.loginName },
1022
+ { key: 'provider', value: user.provider },
1023
+ ];
1024
+ return sendRequest({
1025
+ abortController,
1026
+ headers,
1027
+ method: 'POST',
1028
+ credentials: true,
1029
+ endpoint: addQuery(createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', name, "remove-member"]), query),
1030
+ }, false);
1031
+ }
1032
+
951
1033
  /**
952
1034
  * Get usage stats for a customer within an optional date range.
953
1035
  */
@@ -986,6 +1068,51 @@ export class AdminServiceImpl implements AdminService {
986
1068
  credentials: true
987
1069
  }, false);
988
1070
  }
1071
+
1072
+ async getCustomerRateLimitTokens(abortController: AbortController, customerName: string): Promise<Readonly<RateLimitToken[]>> {
1073
+ return sendRequest({
1074
+ abortController,
1075
+ credentials: true,
1076
+ endpoint: createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', customerName, 'tokens']),
1077
+ }, false);
1078
+ }
1079
+
1080
+ async createCustomerRateLimitToken(abortController: AbortController, customerName: string, description?: string): Promise<Readonly<RateLimitToken>> {
1081
+ const csrfResponse = await this.registry.getCsrfToken(abortController);
1082
+ const headers: Record<string, string> = {};
1083
+ if (!isError(csrfResponse)) {
1084
+ const csrfToken = csrfResponse as CsrfTokenJson;
1085
+ headers[csrfToken.header] = csrfToken.value;
1086
+ }
1087
+
1088
+ const url = createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', customerName, 'tokens']);
1089
+ const endpoint = description !== undefined ? addQuery(url, [{ key: 'description', value: description }]) : url;
1090
+ return sendRequest({
1091
+ abortController,
1092
+ method: 'POST',
1093
+ credentials: true,
1094
+ endpoint,
1095
+ headers
1096
+ }, false);
1097
+ }
1098
+
1099
+ async deleteCustomerRateLimitToken(abortController: AbortController, customerName: string, tokenId: number): Promise<Readonly<SuccessResult | ErrorResult>> {
1100
+ const csrfResponse = await this.registry.getCsrfToken(abortController);
1101
+ const headers: Record<string, string> = {
1102
+ 'Content-Type': 'application/json;charset=UTF-8'
1103
+ };
1104
+ if (!isError(csrfResponse)) {
1105
+ const csrfToken = csrfResponse as CsrfTokenJson;
1106
+ headers[csrfToken.header] = csrfToken.value;
1107
+ }
1108
+ return sendRequest({
1109
+ abortController,
1110
+ method: 'DELETE',
1111
+ credentials: true,
1112
+ endpoint: createAbsoluteURL([this.registry.serverUrl, 'admin', 'ratelimit', 'customers', customerName, 'tokens', `${tokenId}`]),
1113
+ headers
1114
+ }, false);
1115
+ }
989
1116
  }
990
1117
 
991
1118
  export interface ExtensionFilter {
@@ -458,6 +458,22 @@ export interface CustomerList {
458
458
  customers: Customer[];
459
459
  }
460
460
 
461
+ export interface CustomerMembership {
462
+ customer: string;
463
+ user: UserData;
464
+ }
465
+
466
+ export interface CustomerMembershipList {
467
+ customerMemberships: CustomerMembership[];
468
+ }
469
+
470
+ export interface RateLimitToken {
471
+ id: number;
472
+ value?: string;
473
+ description?: string;
474
+ createdTimestamp: TimestampString;
475
+ }
476
+
461
477
  export interface UsageStats {
462
478
  windowStart: number; // epoch seconds in UTC
463
479
  duration: number; // in seconds
package/src/main.tsx CHANGED
@@ -11,7 +11,8 @@
11
11
  import { FunctionComponent, ReactNode, useEffect, useState, useRef } from 'react';
12
12
  import { CssBaseline } from '@mui/material';
13
13
  import { Route, Routes } from 'react-router-dom';
14
- import { AdminDashboard, AdminDashboardRoutes } from './pages/admin-dashboard/admin-dashboard';
14
+ import { AdminDashboard } from './pages/admin-dashboard/admin-dashboard';
15
+ import { AdminDashboardRoutes } from './pages/admin-dashboard/admin-routes';
15
16
  import { ErrorDialog } from './components/error-dialog';
16
17
  import { handleError } from './utils';
17
18
  import { ExtensionRegistryService } from './extension-registry-service';
@@ -1,3 +1,16 @@
1
+ /******************************************************************************
2
+ * Copyright (c) 2026 Contributors to the Eclipse Foundation.
3
+ *
4
+ * See the NOTICE file(s) distributed with this work for additional
5
+ * information regarding copyright ownership.
6
+ *
7
+ * This program and the accompanying materials are made available under the
8
+ * terms of the Eclipse Public License 2.0 which is available at
9
+ * https://www.eclipse.org/legal/epl-2.0.
10
+ *
11
+ * SPDX-License-Identifier: EPL-2.0
12
+ *****************************************************************************/
13
+
1
14
  import { FunctionComponent, useContext, useEffect, useState } from 'react';
2
15
  import { Routes, Route } from 'react-router-dom';
3
16
  import { AppBar, Box, Toolbar } from '@mui/material';
@@ -5,10 +18,14 @@ import { styled, Theme } from '@mui/material/styles';
5
18
  import { Banner } from './components/banner';
6
19
  import { MainContext } from './context';
7
20
  import { HeaderMenu } from './header-menu';
8
- import { ExtensionListContainer, ExtensionListRoutes } from './pages/extension-list/extension-list-container';
9
- import { UserSettings, UserSettingsRoutes } from './pages/user/user-settings';
10
- import { NamespaceDetail, NamespaceDetailRoutes } from './pages/namespace-detail/namespace-detail';
11
- import { ExtensionDetail, ExtensionDetailRoutes } from './pages/extension-detail/extension-detail';
21
+ import { ExtensionListContainer } from './pages/extension-list/extension-list-container';
22
+ import { ExtensionListRoutes } from "./pages/extension-list/extension-list-routes";
23
+ import { UserSettings } from './pages/user/user-settings';
24
+ import { UserSettingsRoutes } from './pages/user/user-settings-routes';
25
+ import { NamespaceDetail } from './pages/namespace-detail/namespace-detail';
26
+ import { NamespaceDetailRoutes } from './pages/namespace-detail/namespace-detail-routes';
27
+ import { ExtensionDetail } from './pages/extension-detail/extension-detail';
28
+ import { ExtensionDetailRoutes } from './pages/extension-detail/extension-detail-routes';
12
29
  import { getCookieValueByKey, setCookie } from './utils';
13
30
  import { UserData } from './extension-registry-types';
14
31
  import { NotFound } from './not-found';