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.
- package/lib/components/banner.js +1 -2
- package/lib/components/banner.js.map +1 -1
- package/lib/components/delayed-load-indicator.js +2 -4
- package/lib/components/delayed-load-indicator.js.map +1 -1
- package/lib/components/generate-token-dialog.d.ts +22 -0
- package/lib/components/generate-token-dialog.d.ts.map +1 -0
- package/lib/components/generate-token-dialog.js +91 -0
- package/lib/components/generate-token-dialog.js.map +1 -0
- package/lib/components/rate-limiting/customer/general-details.d.ts +20 -0
- package/lib/components/rate-limiting/customer/general-details.d.ts.map +1 -0
- package/lib/components/rate-limiting/customer/general-details.js +8 -0
- package/lib/components/rate-limiting/customer/general-details.js.map +1 -0
- package/lib/components/rate-limiting/customer/index.d.ts +17 -0
- package/lib/components/rate-limiting/customer/index.d.ts.map +1 -0
- package/lib/components/rate-limiting/customer/index.js +15 -0
- package/lib/components/rate-limiting/customer/index.js.map +1 -0
- package/lib/components/rate-limiting/customer/usage-stats.d.ts +24 -0
- package/lib/components/rate-limiting/customer/usage-stats.d.ts.map +1 -0
- package/lib/components/rate-limiting/customer/usage-stats.js +6 -0
- package/lib/components/rate-limiting/customer/usage-stats.js.map +1 -0
- package/lib/{pages/admin-dashboard → components/rate-limiting}/usage-stats/usage-stats-chart.d.ts +5 -2
- package/lib/components/rate-limiting/usage-stats/usage-stats-chart.d.ts.map +1 -0
- package/lib/{pages/admin-dashboard → components/rate-limiting}/usage-stats/usage-stats-chart.js +32 -22
- package/lib/components/rate-limiting/usage-stats/usage-stats-chart.js.map +1 -0
- package/lib/components/rate-limiting/usage-stats/usage-stats-utils.d.ts +15 -0
- package/lib/components/rate-limiting/usage-stats/usage-stats-utils.d.ts.map +1 -0
- package/{src/pages/admin-dashboard/usage-stats/usage-stats-utils.ts → lib/components/rate-limiting/usage-stats/usage-stats-utils.js} +4 -3
- package/lib/components/rate-limiting/usage-stats/usage-stats-utils.js.map +1 -0
- package/lib/components/rate-limiting/usage-stats/use-usage-stats.d.ts +22 -0
- package/lib/components/rate-limiting/usage-stats/use-usage-stats.d.ts.map +1 -0
- package/lib/components/rate-limiting/usage-stats/use-usage-stats.js +58 -0
- package/lib/components/rate-limiting/usage-stats/use-usage-stats.js.map +1 -0
- package/lib/components/scan-admin/common/conditional-tooltip.js +4 -16
- package/lib/components/scan-admin/common/conditional-tooltip.js.map +1 -1
- package/lib/components/scan-admin/common/file-table.js +24 -13
- package/lib/components/scan-admin/common/file-table.js.map +1 -1
- package/lib/components/scan-admin/dialogs/quarantine-dialog.js +4 -8
- package/lib/components/scan-admin/dialogs/quarantine-dialog.js.map +1 -1
- package/lib/components/scan-admin/scan-card/scan-card-content.js +2 -2
- package/lib/components/scan-admin/scan-card/scan-card-content.js.map +1 -1
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js +21 -16
- package/lib/components/scan-admin/scan-card/scan-card-expand-strip-badges.js.map +1 -1
- package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js +1 -2
- package/lib/components/scan-admin/scan-card/scan-card-expanded-content.js.map +1 -1
- package/lib/components/scan-admin/scan-card/scan-card-header.js +10 -5
- package/lib/components/scan-admin/scan-card/scan-card-header.js.map +1 -1
- package/lib/components/scan-admin/scan-card/utils.js +1 -2
- package/lib/components/scan-admin/scan-card/utils.js.map +1 -1
- package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js +4 -6
- package/lib/components/scan-admin/tab-contents/quarantined-tab-content.js.map +1 -1
- package/lib/components/sidepanel/drawer-header.d.ts +14 -0
- package/lib/components/sidepanel/drawer-header.d.ts.map +1 -0
- package/lib/components/sidepanel/drawer-header.js +22 -0
- package/lib/components/sidepanel/drawer-header.js.map +1 -0
- package/lib/components/sidepanel/navigation-item.d.ts.map +1 -1
- package/lib/components/sidepanel/navigation-item.js +3 -3
- package/lib/components/sidepanel/navigation-item.js.map +1 -1
- package/lib/components/sidepanel/sidepanel.d.ts +7 -1
- package/lib/components/sidepanel/sidepanel.d.ts.map +1 -1
- package/lib/components/sidepanel/sidepanel.js +12 -13
- package/lib/components/sidepanel/sidepanel.js.map +1 -1
- package/lib/components/text-divider.js +1 -2
- package/lib/components/text-divider.js.map +1 -1
- package/lib/components/timestamp.js +2 -3
- package/lib/components/timestamp.js.map +1 -1
- package/lib/context/scan-admin/scan-api-actions.js +7 -16
- package/lib/context/scan-admin/scan-api-actions.js.map +1 -1
- package/lib/context/scan-admin/scan-api-effects.js +77 -93
- package/lib/context/scan-admin/scan-api-effects.js.map +1 -1
- package/lib/context/scan-admin/scan-context.d.ts.map +1 -1
- package/lib/context/scan-admin/scan-context.js +1 -0
- package/lib/context/scan-admin/scan-context.js.map +1 -1
- package/lib/context/scan-admin/scan-reducer.js +134 -53
- package/lib/context/scan-admin/scan-reducer.js.map +1 -1
- package/lib/default/default-app.d.ts +1 -1
- package/lib/default/default-app.d.ts.map +1 -1
- package/lib/default/default-app.js +11 -22
- package/lib/default/default-app.js.map +1 -1
- package/lib/default/menu-content.d.ts +1 -1
- package/lib/default/menu-content.d.ts.map +1 -1
- package/lib/default/menu-content.js +7 -3
- package/lib/default/menu-content.js.map +1 -1
- package/lib/default/page-settings.js +13 -18
- package/lib/default/page-settings.js.map +1 -1
- package/lib/extension-registry-service.d.ts +17 -1
- package/lib/extension-registry-service.d.ts.map +1 -1
- package/lib/extension-registry-service.js +659 -629
- package/lib/extension-registry-service.js.map +1 -1
- package/lib/extension-registry-types.d.ts +13 -0
- package/lib/extension-registry-types.d.ts.map +1 -1
- package/lib/hooks/scan-admin/use-auto-rejected-tab.js +5 -7
- package/lib/hooks/scan-admin/use-auto-rejected-tab.js.map +1 -1
- package/lib/hooks/scan-admin/use-quarantined-tab.js +5 -7
- package/lib/hooks/scan-admin/use-quarantined-tab.js.map +1 -1
- package/lib/main.d.ts.map +1 -1
- package/lib/main.js +8 -16
- package/lib/main.js.map +1 -1
- package/lib/other-pages.d.ts +12 -0
- package/lib/other-pages.d.ts.map +1 -1
- package/lib/other-pages.js +25 -12
- package/lib/other-pages.js.map +1 -1
- package/lib/pages/admin-dashboard/admin-dashboard.d.ts +0 -12
- package/lib/pages/admin-dashboard/admin-dashboard.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/admin-dashboard.js +126 -49
- package/lib/pages/admin-dashboard/admin-dashboard.js.map +1 -1
- package/lib/pages/admin-dashboard/admin-routes.d.ts +25 -0
- package/lib/pages/admin-dashboard/admin-routes.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/admin-routes.js +27 -0
- package/lib/pages/admin-dashboard/admin-routes.js.map +1 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts +1 -9
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js +17 -15
- package/lib/pages/admin-dashboard/components/data-grid-filter-operators.js.map +1 -1
- package/lib/pages/admin-dashboard/components/data-grid-filter.d.ts +22 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter.js +13 -0
- package/lib/pages/admin-dashboard/components/data-grid-filter.js.map +1 -0
- package/lib/pages/admin-dashboard/components/index.d.ts +2 -1
- package/lib/pages/admin-dashboard/components/index.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/components/index.js +2 -1
- package/lib/pages/admin-dashboard/components/index.js.map +1 -1
- package/lib/pages/admin-dashboard/{usage-stats/usage-stats-utils.d.ts → customers/customer-details.d.ts} +3 -2
- package/lib/pages/admin-dashboard/customers/customer-details.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-details.js +78 -0
- package/lib/pages/admin-dashboard/customers/customer-details.js.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts +1 -1
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.js +33 -34
- package/lib/pages/admin-dashboard/customers/customer-form-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/customers/customer-member-list.d.ts +19 -0
- package/lib/pages/admin-dashboard/customers/customer-member-list.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-member-list.js +88 -0
- package/lib/pages/admin-dashboard/customers/customer-member-list.js.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-token-list.d.ts +19 -0
- package/lib/pages/admin-dashboard/customers/customer-token-list.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/customers/customer-token-list.js +70 -0
- package/lib/pages/admin-dashboard/customers/customer-token-list.js.map +1 -0
- package/lib/pages/admin-dashboard/customers/customers.d.ts +1 -1
- package/lib/pages/admin-dashboard/customers/customers.js +20 -29
- package/lib/pages/admin-dashboard/customers/customers.js.map +1 -1
- package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js +4 -14
- package/lib/pages/admin-dashboard/customers/delete-customer-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/extension-admin.js +7 -16
- package/lib/pages/admin-dashboard/extension-admin.js.map +1 -1
- package/lib/pages/admin-dashboard/extension-remove-dialog.js +3 -12
- package/lib/pages/admin-dashboard/extension-remove-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/extension-version-container.js +3 -5
- package/lib/pages/admin-dashboard/extension-version-container.js.map +1 -1
- package/lib/pages/admin-dashboard/logs/logs.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/logs/logs.js +6 -24
- package/lib/pages/admin-dashboard/logs/logs.js.map +1 -1
- package/lib/pages/admin-dashboard/namespace-admin.js +7 -16
- package/lib/pages/admin-dashboard/namespace-admin.js.map +1 -1
- package/lib/pages/admin-dashboard/namespace-change-dialog.js +3 -12
- package/lib/pages/admin-dashboard/namespace-change-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/namespace-input.js +1 -1
- package/lib/pages/admin-dashboard/namespace-input.js.map +1 -1
- package/lib/pages/admin-dashboard/publisher-admin.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/publisher-admin.js +28 -22
- package/lib/pages/admin-dashboard/publisher-admin.js.map +1 -1
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.js +5 -15
- package/lib/pages/admin-dashboard/publisher-revoke-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js +3 -12
- package/lib/pages/admin-dashboard/publisher-revoke-tokens-button.js.map +1 -1
- package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js +4 -13
- package/lib/pages/admin-dashboard/tiers/delete-tier-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js +34 -23
- package/lib/pages/admin-dashboard/tiers/tier-form-dialog.js.map +1 -1
- package/lib/pages/admin-dashboard/tiers/tiers.js +12 -21
- package/lib/pages/admin-dashboard/tiers/tiers.js.map +1 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js +3 -14
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-search.js.map +1 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.d.ts.map +1 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.js +11 -45
- package/lib/pages/admin-dashboard/usage-stats/usage-stats.js.map +1 -1
- package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.d.ts +22 -0
- package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.d.ts.map +1 -0
- package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.js +58 -0
- package/lib/pages/admin-dashboard/usage-stats/use-usage-stats.js.map +1 -0
- package/lib/pages/admin-dashboard/welcome.js +1 -1
- package/lib/pages/admin-dashboard/welcome.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail-changes.js +3 -12
- package/lib/pages/extension-detail/extension-detail-changes.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail-overview.js +6 -16
- package/lib/pages/extension-detail/extension-detail-overview.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail-reviews.js +12 -24
- package/lib/pages/extension-detail/extension-detail-reviews.js.map +1 -1
- package/lib/pages/extension-detail/extension-detail-routes.d.ts +32 -0
- package/lib/pages/extension-detail/extension-detail-routes.d.ts.map +1 -0
- package/lib/pages/extension-detail/extension-detail-routes.js +35 -0
- package/lib/pages/extension-detail/extension-detail-routes.js.map +1 -0
- package/lib/pages/extension-detail/extension-detail.d.ts +0 -19
- package/lib/pages/extension-detail/extension-detail.d.ts.map +1 -1
- package/lib/pages/extension-detail/extension-detail.js +28 -50
- package/lib/pages/extension-detail/extension-detail.js.map +1 -1
- package/lib/pages/extension-detail/extension-rating-stars.js +1 -2
- package/lib/pages/extension-detail/extension-rating-stars.js.map +1 -1
- package/lib/pages/extension-detail/extension-review-dialog.js +4 -14
- package/lib/pages/extension-detail/extension-review-dialog.js.map +1 -1
- package/lib/pages/extension-list/extension-list-container.d.ts +0 -3
- package/lib/pages/extension-list/extension-list-container.d.ts.map +1 -1
- package/lib/pages/extension-list/extension-list-container.js +5 -10
- package/lib/pages/extension-list/extension-list-container.js.map +1 -1
- package/lib/pages/extension-list/extension-list-header.js +3 -6
- package/lib/pages/extension-list/extension-list-header.js.map +1 -1
- package/lib/pages/extension-list/extension-list-item.js +7 -17
- package/lib/pages/extension-list/extension-list-item.js.map +1 -1
- package/lib/pages/extension-list/extension-list-routes.d.ts +16 -0
- package/lib/pages/extension-list/extension-list-routes.d.ts.map +1 -0
- package/lib/pages/extension-list/extension-list-routes.js +18 -0
- package/lib/pages/extension-list/extension-list-routes.js.map +1 -0
- package/lib/pages/extension-list/extension-list-searchfield.js +4 -7
- package/lib/pages/extension-list/extension-list-searchfield.js.map +1 -1
- package/lib/pages/extension-list/extension-list.js +8 -19
- package/lib/pages/extension-list/extension-list.js.map +1 -1
- package/lib/pages/namespace-detail/namespace-detail-routes.d.ts +20 -0
- package/lib/pages/namespace-detail/namespace-detail-routes.d.ts.map +1 -0
- package/lib/pages/namespace-detail/namespace-detail-routes.js +23 -0
- package/lib/pages/namespace-detail/namespace-detail-routes.js.map +1 -0
- package/lib/pages/namespace-detail/namespace-detail.d.ts +0 -7
- package/lib/pages/namespace-detail/namespace-detail.d.ts.map +1 -1
- package/lib/pages/namespace-detail/namespace-detail.js +4 -24
- package/lib/pages/namespace-detail/namespace-detail.js.map +1 -1
- package/lib/pages/user/add-namespace-member-dialog.d.ts.map +1 -1
- package/lib/pages/user/add-namespace-member-dialog.js +8 -67
- package/lib/pages/user/add-namespace-member-dialog.js.map +1 -1
- package/lib/pages/user/add-user-dialog.d.ts +25 -0
- package/lib/pages/user/add-user-dialog.d.ts.map +1 -0
- package/lib/pages/user/add-user-dialog.js +66 -0
- package/lib/pages/user/add-user-dialog.js.map +1 -0
- package/lib/pages/user/avatar.js +3 -3
- package/lib/pages/user/avatar.js.map +1 -1
- package/lib/pages/user/create-namespace-dialog.js +3 -12
- package/lib/pages/user/create-namespace-dialog.js.map +1 -1
- package/lib/pages/user/{generate-token-dialog.d.ts → generate-access-token-dialog.d.ts} +2 -2
- package/lib/pages/user/generate-access-token-dialog.d.ts.map +1 -0
- package/lib/pages/user/generate-access-token-dialog.js +33 -0
- package/lib/pages/user/generate-access-token-dialog.js.map +1 -0
- package/lib/pages/user/logout.js +3 -12
- package/lib/pages/user/logout.js.map +1 -1
- package/lib/pages/user/publish-extension-dialog.js +12 -21
- package/lib/pages/user/publish-extension-dialog.js.map +1 -1
- package/lib/pages/user/user-namespace-details.js +29 -42
- package/lib/pages/user/user-namespace-details.js.map +1 -1
- package/lib/pages/user/user-namespace-extension-list-item.js +6 -8
- package/lib/pages/user/user-namespace-extension-list-item.js.map +1 -1
- package/lib/pages/user/user-namespace-extension-list.js +6 -15
- package/lib/pages/user/user-namespace-extension-list.js.map +1 -1
- package/lib/pages/user/user-namespace-member-component.js +1 -1
- package/lib/pages/user/user-namespace-member-component.js.map +1 -1
- package/lib/pages/user/user-namespace-member-list.js +9 -18
- package/lib/pages/user/user-namespace-member-list.js.map +1 -1
- package/lib/pages/user/user-publisher-agreement.js +8 -18
- package/lib/pages/user/user-publisher-agreement.js.map +1 -1
- package/lib/pages/user/user-setting-tabs.d.ts.map +1 -1
- package/lib/pages/user/user-setting-tabs.js +2 -2
- package/lib/pages/user/user-setting-tabs.js.map +1 -1
- package/lib/pages/user/user-settings-customer-detail.d.ts +19 -0
- package/lib/pages/user/user-settings-customer-detail.d.ts.map +1 -0
- package/lib/pages/user/user-settings-customer-detail.js +9 -0
- package/lib/pages/user/user-settings-customer-detail.js.map +1 -0
- package/lib/pages/user/user-settings-customers.d.ts +15 -0
- package/lib/pages/user/user-settings-customers.d.ts.map +1 -0
- package/lib/pages/user/user-settings-customers.js +66 -0
- package/lib/pages/user/user-settings-customers.js.map +1 -0
- package/lib/pages/user/user-settings-delete-extension.js +8 -17
- package/lib/pages/user/user-settings-delete-extension.js.map +1 -1
- package/lib/pages/user/user-settings-extensions.js +3 -12
- package/lib/pages/user/user-settings-extensions.js.map +1 -1
- package/lib/pages/user/user-settings-namespace-detail.d.ts.map +1 -1
- package/lib/pages/user/user-settings-namespace-detail.js +4 -12
- package/lib/pages/user/user-settings-namespace-detail.js.map +1 -1
- package/lib/pages/user/user-settings-namespaces.js +6 -15
- package/lib/pages/user/user-settings-namespaces.js.map +1 -1
- package/lib/pages/user/user-settings-profile.js +1 -2
- package/lib/pages/user/user-settings-profile.js.map +1 -1
- package/lib/pages/user/user-settings-routes.d.ts +23 -0
- package/lib/pages/user/user-settings-routes.d.ts.map +1 -0
- package/lib/pages/user/user-settings-routes.js +25 -0
- package/lib/pages/user/user-settings-routes.js.map +1 -0
- package/lib/pages/user/user-settings-tokens.d.ts +0 -7
- package/lib/pages/user/user-settings-tokens.d.ts.map +1 -1
- package/lib/pages/user/user-settings-tokens.js +15 -25
- package/lib/pages/user/user-settings-tokens.js.map +1 -1
- package/lib/pages/user/user-settings.d.ts +0 -9
- package/lib/pages/user/user-settings.d.ts.map +1 -1
- package/lib/pages/user/user-settings.js +4 -12
- package/lib/pages/user/user-settings.js.map +1 -1
- package/lib/server-request.js +64 -76
- package/lib/server-request.js.map +1 -1
- package/lib/utils.js +2 -4
- package/lib/utils.js.map +1 -1
- package/package.json +9 -7
- package/src/components/generate-token-dialog.tsx +167 -0
- package/src/components/rate-limiting/customer/general-details.tsx +106 -0
- package/src/components/rate-limiting/customer/index.ts +18 -0
- package/src/components/rate-limiting/customer/usage-stats.tsx +50 -0
- package/src/{pages/admin-dashboard → components/rate-limiting}/usage-stats/usage-stats-chart.tsx +57 -31
- package/{lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js → src/components/rate-limiting/usage-stats/usage-stats-utils.ts} +4 -2
- package/src/components/rate-limiting/usage-stats/use-usage-stats.ts +70 -0
- package/src/components/scan-admin/scan-card/scan-card-header.tsx +2 -2
- package/src/components/sidepanel/drawer-header.tsx +23 -0
- package/src/components/sidepanel/navigation-item.tsx +3 -2
- package/src/components/sidepanel/sidepanel.tsx +29 -17
- package/src/context/scan-admin/scan-context.tsx +1 -0
- package/src/default/default-app.tsx +1 -1
- package/src/default/menu-content.tsx +6 -2
- package/src/default/page-settings.tsx +1 -1
- package/src/extension-registry-service.ts +153 -26
- package/src/extension-registry-types.ts +16 -0
- package/src/main.tsx +2 -1
- package/src/other-pages.tsx +21 -4
- package/src/pages/admin-dashboard/admin-dashboard.tsx +250 -83
- package/src/pages/admin-dashboard/admin-routes.ts +27 -0
- package/src/pages/admin-dashboard/components/data-grid-filter-operators.tsx +1 -31
- package/src/pages/admin-dashboard/components/data-grid-filter.tsx +45 -0
- package/src/pages/admin-dashboard/components/index.ts +1 -1
- package/src/pages/admin-dashboard/customers/customer-details.tsx +133 -0
- package/src/pages/admin-dashboard/customers/customer-form-dialog.tsx +3 -4
- package/src/pages/admin-dashboard/customers/customer-member-list.tsx +174 -0
- package/src/pages/admin-dashboard/customers/customer-token-list.tsx +135 -0
- package/src/pages/admin-dashboard/customers/customers.tsx +8 -8
- package/src/pages/admin-dashboard/logs/logs.tsx +1 -10
- package/src/pages/admin-dashboard/publisher-admin.tsx +29 -11
- package/src/pages/admin-dashboard/usage-stats/usage-stats.tsx +10 -39
- package/src/pages/admin-dashboard/usage-stats/use-usage-stats.ts +70 -0
- package/src/pages/admin-dashboard/welcome.tsx +1 -1
- package/src/pages/extension-detail/extension-detail-overview.tsx +2 -2
- package/src/pages/extension-detail/extension-detail-routes.ts +35 -0
- package/src/pages/extension-detail/extension-detail.tsx +3 -23
- package/src/pages/extension-list/extension-list-container.tsx +1 -5
- package/src/pages/extension-list/extension-list-item.tsx +1 -1
- package/src/pages/extension-list/extension-list-routes.ts +18 -0
- package/src/pages/namespace-detail/namespace-detail-routes.ts +23 -0
- package/src/pages/namespace-detail/namespace-detail.tsx +0 -10
- package/src/pages/user/add-namespace-member-dialog.tsx +17 -116
- package/src/pages/user/add-user-dialog.tsx +141 -0
- package/src/pages/user/avatar.tsx +2 -2
- package/src/pages/user/generate-access-token-dialog.tsx +49 -0
- package/src/pages/user/user-namespace-extension-list-item.tsx +2 -2
- package/src/pages/user/user-setting-tabs.tsx +2 -1
- package/src/pages/user/user-settings-customer-detail.tsx +39 -0
- package/src/pages/user/user-settings-customers.tsx +120 -0
- package/src/pages/user/user-settings-delete-extension.tsx +1 -1
- package/src/pages/user/user-settings-namespace-detail.tsx +3 -1
- package/src/pages/user/user-settings-routes.ts +25 -0
- package/src/pages/user/user-settings-tokens.tsx +3 -10
- package/src/pages/user/user-settings.tsx +4 -12
- package/lib/components/copy-to-clipboard.d.ts +0 -21
- package/lib/components/copy-to-clipboard.d.ts.map +0 -1
- package/lib/components/copy-to-clipboard.js +0 -26
- package/lib/components/copy-to-clipboard.js.map +0 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.d.ts.map +0 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-chart.js.map +0 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.d.ts.map +0 -1
- package/lib/pages/admin-dashboard/usage-stats/usage-stats-utils.js.map +0 -1
- package/lib/pages/user/generate-token-dialog.d.ts.map +0 -1
- package/lib/pages/user/generate-token-dialog.js +0 -88
- package/lib/pages/user/generate-token-dialog.js.map +0 -1
- package/src/components/copy-to-clipboard.tsx +0 -50
- 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
|
-
|
|
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
|
|
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';
|
package/src/other-pages.tsx
CHANGED
|
@@ -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
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
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';
|