dashboard-shell-shell 3.0.2-test.20250913 → 3.0.5-logTest.2
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/assets/brand/csp/favicon.png +0 -0
- package/assets/data/aws-regions.json +3 -0
- package/assets/icons/demo.css:Zone.Identifier +0 -0
- package/assets/icons/demo_index.html:Zone.Identifier +0 -0
- package/assets/icons/iconfont.css +4 -1
- package/assets/icons/iconfont.css:Zone.Identifier +0 -0
- package/assets/icons/iconfont.js:Zone.Identifier +0 -0
- package/assets/icons/iconfont.json:Zone.Identifier +0 -0
- package/assets/icons/iconfont.ttf:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff2:Zone.Identifier +0 -0
- package/assets/icons/iconfont.woff:Zone.Identifier +0 -0
- package/assets/iconsNew/demo.css +539 -0
- package/assets/iconsNew/demo.css:Zone.Identifier +0 -0
- package/assets/iconsNew/demo_index.html +303 -0
- package/assets/iconsNew/demo_index.html:Zone.Identifier +0 -0
- package/assets/iconsNew/iconfont.css +43 -0
- package/assets/iconsNew/iconfont.css:Zone.Identifier +0 -0
- package/assets/iconsNew/iconfont.js +1 -0
- package/assets/iconsNew/iconfont.js:Zone.Identifier +0 -0
- package/assets/iconsNew/iconfont.json +44 -0
- package/assets/iconsNew/iconfont.json:Zone.Identifier +0 -0
- package/assets/iconsNew/iconfont.ttf +0 -0
- package/assets/iconsNew/iconfont.ttf:Zone.Identifier +0 -0
- package/assets/iconsNew/iconfont.woff +0 -0
- package/assets/iconsNew/iconfont.woff2 +0 -0
- package/assets/iconsNew/iconfont.woff2:Zone.Identifier +0 -0
- package/assets/iconsNew/iconfont.woff:Zone.Identifier +0 -0
- package/assets/images/icons/document.svg +3 -0
- package/assets/images/key.svg +17 -0
- package/assets/images/pl/dark/logo.png +0 -0
- package/assets/images/providers/sks.svg +1 -0
- package/assets/images/vendor/cognito.svg +1 -0
- package/assets/styles/all.scss +23 -3
- package/assets/styles/app.scss +4 -0
- package/assets/styles/base/_basic.scss +10 -0
- package/assets/styles/base/_helpers.scss +1 -1
- package/assets/styles/base/_spacing.scss +29 -0
- package/assets/styles/base/_variables.scss +21 -15
- package/assets/styles/fonts/_icons.scss +3 -2
- package/assets/styles/global/_button.scss +8 -8
- package/assets/styles/global/_form.scss +1 -0
- package/assets/styles/global/_labeled-input.scss +1 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/global/_select.scss +1 -1
- package/assets/styles/global/_tooltip.scss +9 -5
- package/assets/styles/themes/_dark.scss +30 -0
- package/assets/styles/themes/_light.scss +85 -5
- package/assets/styles/vendor/vue-select.scss +2 -1
- package/assets/translations/en-us.yaml +886 -105
- package/assets/translations/zh-hans.yaml +298 -25
- package/chart/__tests__/S3.test.ts +2 -1
- package/chart/monitoring/index.vue +1 -1
- package/cloud-credential/gcp.vue +9 -1
- package/components/ActionDropdown.vue +1 -1
- package/components/ActionMenuShell.vue +3 -7
- package/components/AppModal.vue +9 -28
- package/components/AsyncButton.vue +2 -0
- package/components/BrandImage.vue +0 -21
- package/components/ButtonDropdown.vue +3 -1
- package/components/Certificates.vue +5 -0
- package/components/ClusterIconMenu.vue +1 -1
- package/components/CodeMirror.vue +9 -7
- package/components/CommunityLinks.vue +3 -58
- package/components/ConfigMapSettings/Settings.vue +377 -0
- package/components/ConfigMapSettings/index.vue +354 -0
- package/components/ConsumptionGauge.vue +1 -1
- package/components/ContainerResourceLimit.vue +2 -2
- package/components/CopyToClipboard.vue +15 -0
- package/components/CruResource.vue +106 -18
- package/components/DetailText.vue +61 -11
- package/components/Drawer/Chrome.vue +115 -0
- package/components/Drawer/ResourceDetailDrawer/ConfigTab.vue +64 -0
- package/components/Drawer/ResourceDetailDrawer/YamlTab.vue +48 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/ConfigTab.test.ts +54 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/YamlTab.test.ts +80 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/composables.test.ts +106 -0
- package/components/Drawer/ResourceDetailDrawer/__tests__/helpers.test.ts +42 -0
- package/components/Drawer/ResourceDetailDrawer/composables.ts +53 -0
- package/components/Drawer/ResourceDetailDrawer/helpers.ts +10 -0
- package/components/Drawer/ResourceDetailDrawer/index.vue +124 -0
- package/components/ExplorerMembers.vue +28 -4
- package/components/ExplorerProjectsNamespaces.vue +46 -29
- package/components/FilterPanel.vue +156 -0
- package/components/FixedBanner.vue +19 -5
- package/components/{fleet/ForceDirectedTreeChart/index.vue → ForceDirectedTreeChart.vue} +47 -41
- package/components/GlobalRoleBindings.vue +69 -114
- package/components/GrowlManager.vue +16 -15
- package/components/IconOrSvg.vue +19 -35
- package/components/KeyValueView.vue +1 -1
- package/components/LandingPagePreference.vue +2 -0
- package/components/Loading.vue +1 -1
- package/components/LocaleSelector.vue +10 -2
- package/components/PaginatedResourceTable.vue +53 -1
- package/components/PodSecurityAdmission.vue +2 -2
- package/components/ProgressBarMulti.vue +1 -0
- package/components/PromptModal.vue +38 -7
- package/components/PromptRemove.vue +28 -2
- package/components/PromptRestore.vue +22 -44
- package/components/RelatedResources.vue +7 -12
- package/components/Resource/Detail/Additional.vue +46 -0
- package/components/Resource/Detail/Card/PodsCard/Bubble.vue +13 -0
- package/components/Resource/Detail/Card/PodsCard/composable.ts +30 -0
- package/components/Resource/Detail/Card/PodsCard/index.vue +118 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/composable.ts +51 -0
- package/components/Resource/Detail/Card/ResourceUsageCard/index.vue +79 -0
- package/components/Resource/Detail/Card/Scaler.vue +89 -0
- package/components/Resource/Detail/Card/StateCard/composables.ts +112 -0
- package/components/Resource/Detail/Card/StateCard/index.vue +39 -0
- package/components/Resource/Detail/Card/VerticalGap.vue +11 -0
- package/components/Resource/Detail/Card/__tests__/Card.test.ts +36 -0
- package/components/Resource/Detail/Card/__tests__/PodsCard.test.ts +84 -0
- package/components/Resource/Detail/Card/__tests__/ResourceUsageCard.test.ts +72 -0
- package/components/Resource/Detail/Card/__tests__/Scaler.test.ts +87 -0
- package/components/Resource/Detail/Card/__tests__/StateCard.test.ts +53 -0
- package/components/Resource/Detail/Card/__tests__/VerticalGap.test.ts +14 -0
- package/components/Resource/Detail/Card/__tests__/index.test.ts +36 -0
- package/components/Resource/Detail/Card/index.vue +56 -0
- package/components/Resource/Detail/Metadata/Annotations/__tests__/index.test.ts +19 -0
- package/components/Resource/Detail/Metadata/Annotations/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Annotations/index.vue +31 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/identifying-fields.test.ts +223 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/__tests__/index.test.ts +103 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/composable.ts +72 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/identifying-fields.ts +317 -0
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +138 -0
- package/components/Resource/Detail/Metadata/KeyValue.vue +144 -0
- package/components/Resource/Detail/Metadata/Labels/__tests__/index.test.ts +18 -0
- package/components/Resource/Detail/Metadata/Labels/composable.ts +12 -0
- package/components/Resource/Detail/Metadata/Labels/index.vue +31 -0
- package/components/Resource/Detail/Metadata/Rectangle.vue +34 -0
- package/components/Resource/Detail/Metadata/__tests__/KeyValue.test.ts +107 -0
- package/components/Resource/Detail/Metadata/__tests__/Rectangle.test.ts +24 -0
- package/components/Resource/Detail/Metadata/__tests__/composables.test.ts +75 -0
- package/components/Resource/Detail/Metadata/__tests__/index.test.ts +91 -0
- package/components/Resource/Detail/Metadata/composables.ts +81 -0
- package/components/Resource/Detail/Metadata/index.vue +90 -0
- package/components/Resource/Detail/Page.vue +37 -0
- package/components/Resource/Detail/PercentageBar.vue +40 -0
- package/components/Resource/Detail/ResourceRow.vue +138 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/composables.test.ts +29 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/__tests__/index.test.ts +48 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/composables.ts +31 -0
- package/components/Resource/Detail/ResourceTabs/ConfigMapDataTab/index.vue +50 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/__tests__/composables.test.ts +66 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/composables.ts +21 -0
- package/components/Resource/Detail/ResourceTabs/KnownHostsTab/index.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Basic.vue +45 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/BasicAuth.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Certificate.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Registry.vue +22 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/ServiceAccountToken.vue +31 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/Ssh.vue +32 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Basic.test.ts +40 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/BasicAuth.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Certificate.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Registry.test.ts +27 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/ServiceAccountToken.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/Ssh.test.ts +33 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/auth-types.test.ts +186 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/__tests__/composables.test.ts +102 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/auth-types.ts +109 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/composeables.ts +52 -0
- package/components/Resource/Detail/ResourceTabs/SecretDataTab/index.vue +71 -0
- package/components/Resource/Detail/SpacedRow.vue +14 -0
- package/components/Resource/Detail/StatusBar.vue +59 -0
- package/components/Resource/Detail/StatusRow.vue +61 -0
- package/components/Resource/Detail/TitleBar/Title.vue +15 -0
- package/components/Resource/Detail/TitleBar/Top.vue +16 -0
- package/components/Resource/Detail/TitleBar/__tests__/Title.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/Top.test.ts +17 -0
- package/components/Resource/Detail/TitleBar/__tests__/composables.test.ts +63 -0
- package/components/Resource/Detail/TitleBar/__tests__/index.test.ts +142 -0
- package/components/Resource/Detail/TitleBar/composables.ts +61 -0
- package/components/Resource/Detail/TitleBar/index.vue +302 -0
- package/components/Resource/Detail/Top/index.vue +34 -0
- package/components/Resource/Detail/__tests__/Page.test.ts +32 -0
- package/components/Resource/Detail/composables.ts +45 -0
- package/components/ResourceDetail/Masthead/__tests__/index.test.ts +70 -0
- package/components/ResourceDetail/{__tests__/Masthead.test.ts → Masthead/__tests__/legacy.test.ts} +3 -3
- package/components/ResourceDetail/Masthead/index.vue +65 -0
- package/components/ResourceDetail/Masthead/latest.vue +44 -0
- package/components/ResourceDetail/{Masthead.vue → Masthead/legacy.vue} +240 -169
- package/components/ResourceDetail/__tests__/index.test.ts +135 -0
- package/components/ResourceDetail/index.vue +75 -575
- package/components/ResourceDetail/legacy.vue +580 -0
- package/components/ResourceList/Masthead.vue +74 -29
- package/components/ResourceList/index.vue +3 -2
- package/components/ResourceTable.vue +75 -85
- package/components/ResourceYaml.vue +15 -2
- package/components/RichTranslation.vue +106 -0
- package/components/SideNav.vue +21 -21
- package/components/SingleClusterInfo.vue +2 -1
- package/components/SlideInPanelManager.vue +116 -14
- package/components/SortableTable/THead.vue +46 -1
- package/components/SortableTable/index.vue +66 -22
- package/components/SortableTable/paging.js +15 -16
- package/components/SortableTable/selection.js +22 -10
- package/components/StateDot/index.vue +28 -0
- package/components/StatusBadge.vue +6 -4
- package/components/SubtleLink.vue +25 -0
- package/components/Tabbed/index.vue +43 -22
- package/components/Wizard.vue +16 -3
- package/components/YamlEditor.vue +1 -2
- package/components/__tests__/AsyncButton.test.ts +39 -0
- package/components/__tests__/ConfigMapSettings.test.ts +376 -0
- package/components/__tests__/CruResource.test.ts +63 -0
- package/components/__tests__/FilterPanel.test.ts +81 -0
- package/components/__tests__/GrowlManager.test.ts +0 -25
- package/components/__tests__/PromptModal.test.ts +146 -0
- package/components/__tests__/PromptRestore.test.ts +1 -65
- package/components/__tests__/RichTranslation.test.ts +115 -0
- package/components/auth/AuthBanner.vue +15 -14
- package/components/auth/Principal.vue +50 -19
- package/components/auth/RoleDetailEdit.vue +55 -11
- package/components/auth/login/ldap.vue +2 -2
- package/components/auth/login/oidc.vue +6 -1
- package/components/breadcrumb/index.vue +119 -0
- package/components/fleet/FleetApplications.vue +174 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +66 -0
- package/components/fleet/FleetClusterTargets/index.vue +455 -0
- package/components/fleet/FleetClusters.vue +25 -6
- package/components/fleet/FleetGitRepoPaths.vue +476 -0
- package/components/fleet/FleetHelmOps.vue +123 -0
- package/components/fleet/FleetIntro.vue +58 -28
- package/components/fleet/FleetNoWorkspaces.vue +5 -1
- package/components/fleet/FleetOCIStorageSecret.vue +171 -0
- package/components/fleet/FleetRepos.vue +37 -80
- package/components/fleet/FleetResources.vue +69 -27
- package/components/fleet/FleetSummary.vue +26 -51
- package/components/fleet/FleetValuesFrom.vue +295 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +1224 -0
- package/components/fleet/__tests__/FleetGitRepoPaths.test.ts +265 -0
- package/components/fleet/__tests__/FleetOCIStorageSecret.test.ts +213 -0
- package/components/fleet/__tests__/FleetSummary.test.ts +39 -39
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +300 -0
- package/components/fleet/dashboard/Empty.vue +73 -0
- package/components/fleet/dashboard/ResourceCard.vue +184 -0
- package/components/fleet/dashboard/ResourceCardSummary.vue +195 -0
- package/components/fleet/dashboard/ResourceDetails.vue +194 -0
- package/components/fleet/dashboard/ResourcePanel.vue +384 -0
- package/components/form/ArrayList.vue +187 -142
- package/components/form/ArrayListGrouped.vue +5 -3
- package/components/form/BannerSettings.vue +117 -50
- package/components/form/ChangePassword.vue +4 -2
- package/components/form/ClusterAppearance.vue +4 -3
- package/components/form/ColorInput.vue +35 -6
- package/components/form/Command.vue +4 -5
- package/components/form/Conditions.vue +15 -1
- package/components/form/FileImageSelector.vue +1 -1
- package/components/form/Footer.vue +11 -4
- package/components/form/HealthCheck.vue +0 -2
- package/components/form/HookOption.vue +87 -58
- package/components/form/InputWithSelect.vue +8 -7
- package/components/form/KeyValue.vue +112 -53
- package/components/form/LabeledSelect.vue +76 -55
- package/components/form/Labels.vue +92 -22
- package/components/form/MatchExpressions.vue +59 -12
- package/components/form/Members/ClusterMembershipEditor.vue +1 -1
- package/components/form/Members/ClusterPermissionsEditor.vue +60 -41
- package/components/form/Members/MembershipEditor.vue +4 -4
- package/components/form/Members/ProjectMembershipEditor.vue +1 -1
- package/components/form/NameNsDescription.vue +15 -10
- package/components/form/Networking.vue +30 -28
- package/components/form/NodeAffinity.vue +29 -28
- package/components/form/NotificationSettings.vue +15 -1
- package/components/form/PodAffinity.vue +23 -23
- package/components/form/Probe.vue +15 -11
- package/components/form/ProjectMemberEditor.vue +66 -48
- package/components/form/ResourceLabeledSelect.vue +22 -8
- package/components/form/ResourceQuota/Namespace.vue +4 -4
- package/components/form/ResourceQuota/NamespaceRow.vue +11 -9
- package/components/form/ResourceQuota/Project.vue +4 -4
- package/components/form/ResourceQuota/ProjectRow.vue +36 -30
- package/components/form/ResourceSelector.vue +28 -24
- package/components/form/ResourceTabs/index.vue +7 -1
- package/components/form/SSHKnownHosts/index.vue +14 -11
- package/components/form/SecretSelector.vue +40 -23
- package/components/form/Security.vue +1 -3
- package/components/form/Select.vue +64 -27
- package/components/form/SelectOrCreateAuthSecret.vue +6 -3
- package/components/form/ServiceNameSelect.vue +2 -5
- package/components/form/ServicePorts.vue +149 -75
- package/components/form/SimpleSecretSelector.vue +17 -4
- package/components/form/Taints.vue +23 -3
- package/components/form/Tolerations.vue +13 -9
- package/components/form/UnitInput.vue +21 -0
- package/components/form/ValueFromResource.vue +136 -110
- package/components/form/WorkloadPorts.vue +143 -123
- package/components/form/__tests__/ArrayList.test.ts +32 -0
- package/components/form/__tests__/ColorInput.test.ts +35 -0
- package/components/form/__tests__/KeyValue.test.ts +36 -0
- package/components/form/__tests__/LabeledSelect.test.ts +79 -2
- package/components/form/__tests__/Labels.test.ts +360 -0
- package/components/form/__tests__/MatchExpressions.test.ts +16 -13
- package/components/form/__tests__/Networking.test.ts +116 -0
- package/components/form/__tests__/SSHKnownHosts.test.ts +11 -2
- package/components/form/__tests__/Select.test.ts +37 -1
- package/components/form/__tests__/UnitInput.test.ts +23 -1
- package/components/form/labeled-select-utils/labeled-select-pagination.ts +3 -38
- package/components/formatter/ClusterLink.vue +5 -8
- package/components/formatter/Description.vue +30 -0
- package/components/formatter/FleetApplicationClustersReady.vue +77 -0
- package/components/formatter/FleetApplicationSource.vue +79 -0
- package/components/formatter/FleetSummaryGraph.vue +7 -0
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +5 -4
- package/components/formatter/__tests__/ClusterLink.test.ts +2 -32
- package/components/formatter/__tests__/LiveDate.test.ts +10 -2
- package/components/google/AccountAccess.vue +209 -0
- package/components/google/types/gcp.d.ts +136 -0
- package/components/google/types/index.d.ts +101 -0
- package/components/google/util/__mocks__/gcp.ts +465 -0
- package/components/google/util/formatter.ts +82 -0
- package/components/google/util/gcp.ts +134 -0
- package/components/google/util/index.d.ts +11 -0
- package/components/nav/Favorite.vue +1 -1
- package/components/nav/Group.vue +13 -1
- package/components/nav/Header.vue +44 -179
- package/components/nav/NamespaceFilter.vue +126 -75
- package/components/nav/NotificationCenter/Notification.vue +484 -0
- package/components/nav/NotificationCenter/NotificationHeader.vue +112 -0
- package/components/nav/NotificationCenter/index.vue +148 -0
- package/components/nav/TopLevelMenu.helper.ts +55 -34
- package/components/nav/TopLevelMenu.vue +110 -125
- package/components/nav/Type.vue +15 -4
- package/components/nav/WindowManager/ContainerLogs.vue +87 -61
- package/components/nav/WindowManager/ContainerLogsActions.vue +76 -0
- package/components/nav/WindowManager/index.vue +3 -2
- package/components/templates/default.vue +0 -3
- package/components/templates/plain.vue +0 -3
- package/composables/drawer.ts +26 -0
- package/composables/focusTrap.ts +3 -3
- package/composables/resources.test.ts +63 -0
- package/composables/resources.ts +38 -0
- package/composables/useI18n.ts +12 -11
- package/composables/useIsNewDetailPageEnabled.ts +17 -0
- package/config/labels-annotations.js +22 -11
- package/config/menuRouteMap.js +10 -0
- package/config/pagination-table-headers.js +8 -1
- package/config/private-label.js +0 -1
- package/config/product/auth.js +20 -3
- package/config/product/{cis.js → compliance.js} +23 -26
- package/config/product/explorer.js +80 -26
- package/config/product/fleet.js +77 -17
- package/config/product/manager.js +29 -46
- package/config/product/settings.js +23 -11
- package/config/product/uiplugins.js +13 -10
- package/config/query-params.js +16 -1
- package/config/roles.ts +2 -1
- package/config/router/navigation-guards/authentication.js +51 -2
- package/config/router/navigation-guards/index.js +16 -20
- package/config/router/routes.js +65 -31
- package/config/secret.ts +15 -0
- package/config/settings.ts +33 -16
- package/config/store.js +2 -0
- package/config/system-namespaces.js +1 -1
- package/config/table-headers.js +91 -30
- package/config/types.js +18 -7
- package/config/version.js +1 -1
- package/core/plugin-helpers.ts +3 -2
- package/core/plugin.ts +32 -7
- package/core/types.ts +25 -7
- package/detail/catalog.cattle.io.app.vue +5 -1
- package/detail/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +22 -18
- package/detail/fleet.cattle.io.bundle.vue +70 -6
- package/detail/fleet.cattle.io.cluster.vue +28 -15
- package/detail/fleet.cattle.io.gitrepo.vue +11 -2
- package/detail/fleet.cattle.io.helmop.vue +157 -0
- package/detail/management.cattle.io.fleetworkspace.vue +18 -27
- package/detail/management.cattle.io.oidcclient.vue +369 -0
- package/detail/namespace.vue +0 -3
- package/detail/node.vue +48 -39
- package/detail/pod.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +16 -50
- package/detail/service.vue +10 -2
- package/detail/workload/index.vue +48 -39
- package/dialog/AddCustomBadgeDialog.vue +17 -10
- package/{pages/c/_cluster/uiplugins/AddExtensionRepos.vue → dialog/AddExtensionReposDialog.vue} +72 -42
- package/dialog/AddonConfigConfirmationDialog.vue +1 -1
- package/dialog/AssignToDialog.vue +176 -0
- package/dialog/ChangePasswordDialog.vue +106 -0
- package/{pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue → dialog/DeveloperLoadExtensionDialog.vue} +74 -71
- package/dialog/DisableAuthProviderDialog.vue +101 -0
- package/dialog/DrainNode.vue +1 -1
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue → dialog/ExtensionCatalogInstallDialog.vue} +100 -88
- package/{pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue → dialog/ExtensionCatalogUninstallDialog.vue} +87 -66
- package/dialog/FeatureFlagListDialog.vue +288 -0
- package/dialog/ForceMachineRemoveDialog.vue +1 -1
- package/dialog/GenericPrompt.vue +1 -1
- package/dialog/HelmOpForceUpdateDialog.vue +132 -0
- package/{components/Import.vue → dialog/ImportDialog.vue} +8 -13
- package/{pages/c/_cluster/uiplugins/InstallDialog.vue → dialog/InstallExtensionDialog.vue} +124 -106
- package/{components/form/SSHKnownHosts → dialog}/KnownHostsEditDialog.vue +52 -62
- package/dialog/MoveNamespaceDialog.vue +157 -0
- package/dialog/OidcClientSecretDialog.vue +117 -0
- package/dialog/RedeployWorkloadDialog.vue +164 -0
- package/dialog/RollbackWorkloadDialog.vue +1 -1
- package/dialog/RotateEncryptionKeyDialog.vue +10 -30
- package/dialog/ScalePoolDownDialog.vue +1 -1
- package/{components/nav/Jump.vue → dialog/SearchDialog.vue} +34 -14
- package/{pages/c/_cluster/uiplugins/UninstallDialog.vue → dialog/UninstallExtensionDialog.vue} +67 -58
- package/dialog/WechatDialog.vue +57 -0
- package/{components/form/SSHKnownHosts → dialog}/__tests__/KnownHostsEditDialog.test.ts +15 -34
- package/edit/__tests__/cis.cattle.io.clusterscan.test.ts +3 -3
- package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +60 -68
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/edit/__tests__/service.test.ts +2 -1
- package/edit/auth/ldap/__tests__/config.test.ts +14 -0
- package/edit/auth/ldap/config.vue +24 -0
- package/edit/auth/oidc.vue +159 -93
- package/edit/autoscaling.horizontalpodautoscaler/external-metric.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/hpa-scaling-rule.vue +9 -6
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +7 -2
- package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/metric-object-reference.vue +7 -5
- package/edit/autoscaling.horizontalpodautoscaler/metric-target.vue +5 -3
- package/edit/autoscaling.horizontalpodautoscaler/metrics-row.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/object-metric.vue +2 -2
- package/edit/autoscaling.horizontalpodautoscaler/pod-metric.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/resource-metric.vue +2 -2
- package/edit/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +30 -31
- package/edit/{cis.cattle.io.clusterscanbenchmark.vue → compliance.cattle.io.clusterscanbenchmark.vue} +4 -4
- package/edit/{cis.cattle.io.clusterscanprofile.vue → compliance.cattle.io.clusterscanprofile.vue} +5 -5
- package/edit/configmap.vue +12 -2
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +1 -0
- package/edit/fleet.cattle.io.gitrepo.vue +70 -256
- package/edit/fleet.cattle.io.helmop.vue +786 -0
- package/edit/helm.cattle.io.projecthelmchart.vue +1 -0
- package/edit/k8s.cni.cncf.io.networkattachmentdefinition.vue +1 -0
- package/edit/logging-flow/index.vue +2 -2
- package/edit/logging.banzaicloud.io.output/index.vue +2 -1
- package/edit/logging.banzaicloud.io.output/providers/awsElasticsearch.vue +8 -9
- package/edit/logging.banzaicloud.io.output/providers/azurestorage.vue +19 -19
- package/edit/logging.banzaicloud.io.output/providers/cloudwatch.vue +23 -23
- package/edit/logging.banzaicloud.io.output/providers/datadog.vue +19 -19
- package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +14 -14
- package/edit/logging.banzaicloud.io.output/providers/forward.vue +12 -12
- package/edit/logging.banzaicloud.io.output/providers/gcs.vue +23 -23
- package/edit/logging.banzaicloud.io.output/providers/gelf.vue +6 -6
- package/edit/logging.banzaicloud.io.output/providers/kafka.vue +10 -10
- package/edit/logging.banzaicloud.io.output/providers/kinesisStream.vue +8 -8
- package/edit/logging.banzaicloud.io.output/providers/logdna.vue +17 -17
- package/edit/logging.banzaicloud.io.output/providers/logz.vue +7 -7
- package/edit/logging.banzaicloud.io.output/providers/loki.vue +12 -12
- package/edit/logging.banzaicloud.io.output/providers/newrelic.vue +3 -3
- package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +14 -14
- package/edit/logging.banzaicloud.io.output/providers/redis.vue +6 -6
- package/edit/logging.banzaicloud.io.output/providers/s3.vue +23 -23
- package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +13 -13
- package/edit/logging.banzaicloud.io.output/providers/sumologic.vue +2 -2
- package/edit/logging.banzaicloud.io.output/providers/syslog.vue +54 -54
- package/edit/management.cattle.io.fleetworkspace.vue +44 -10
- package/edit/management.cattle.io.oidcclient.vue +162 -0
- package/edit/management.cattle.io.project.vue +4 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +5 -0
- package/edit/monitoring.coreos.com.prometheusrule/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/auth.vue +3 -3
- package/edit/monitoring.coreos.com.receiver/index.vue +1 -0
- package/edit/monitoring.coreos.com.receiver/types/email.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +1 -0
- package/edit/namespace.vue +2 -4
- package/edit/networking.istio.io.destinationrule/index.vue +4 -1
- package/edit/networking.k8s.io.ingress/Certificate.vue +25 -8
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
- package/edit/networking.k8s.io.ingress/Rule.vue +5 -11
- package/edit/networking.k8s.io.ingress/RulePath.vue +105 -96
- package/edit/networking.k8s.io.ingress/__tests__/Certificate.test.ts +37 -0
- package/edit/networking.k8s.io.ingress/index.vue +4 -1
- package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +6 -17
- package/edit/networking.k8s.io.networkpolicy/PolicyRulePort.vue +4 -2
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +69 -73
- package/edit/networking.k8s.io.networkpolicy/PolicyRules.vue +10 -16
- package/edit/networking.k8s.io.networkpolicy/__tests__/PolicyRuleTarget.test.ts +72 -41
- package/edit/networking.k8s.io.networkpolicy/__tests__/utils/mock.json +17 -1
- package/edit/networking.k8s.io.networkpolicy/index.vue +24 -32
- package/edit/node.vue +1 -0
- package/edit/persistentvolume/index.vue +7 -2
- package/edit/persistentvolumeclaim.vue +2 -0
- package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +26 -12
- package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +69 -2
- package/edit/provisioning.cattle.io.cluster/__tests__/utils/rke2-test-data.ts +58 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +21 -73
- package/edit/provisioning.cattle.io.cluster/rke2.vue +535 -428
- package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +49 -40
- package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +5 -3
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +5 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +2 -2
- package/edit/resources.cattle.io.restore.vue +1 -1
- package/edit/secret/basic.vue +1 -0
- package/edit/secret/index.vue +129 -17
- package/edit/service.vue +21 -30
- package/edit/serviceaccount.vue +4 -1
- package/edit/storage.k8s.io.storageclass/index.vue +14 -9
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/aws-ebs.vue +34 -27
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/gce-pd.vue +15 -13
- package/edit/storage.k8s.io.storageclass/provisioners/kubernetes.io/vsphere-volume.vue +41 -39
- package/edit/workload/Job.vue +31 -34
- package/edit/workload/Upgrading.vue +5 -5
- package/edit/workload/index.vue +32 -32
- package/edit/workload/mixins/workload.js +0 -2
- package/edit/workload/storage/Mount.vue +1 -0
- package/edit/workload/storage/awsElasticBlockStore.vue +9 -7
- package/edit/workload/storage/azureDisk.vue +14 -10
- package/edit/workload/storage/azureFile.vue +9 -7
- package/edit/workload/storage/csi/index.vue +6 -9
- package/edit/workload/storage/emptyDir.vue +7 -5
- package/edit/workload/storage/gcePersistentDisk.vue +9 -7
- package/edit/workload/storage/hostPath.vue +7 -5
- package/edit/workload/storage/nfs.vue +8 -6
- package/edit/workload/storage/persistentVolumeClaim/index.vue +12 -10
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +20 -15
- package/edit/workload/storage/secret.vue +9 -6
- package/edit/workload/storage/vsphereVolume.vue +11 -7
- package/initialize/app-extended.js +7 -1
- package/list/{cis.cattle.io.clusterscan.vue → compliance.cattle.io.clusterscan.vue} +2 -2
- package/list/fleet.cattle.io.gitrepo.vue +1 -1
- package/list/fleet.cattle.io.helmop.vue +108 -0
- package/list/harvesterhci.io.management.cluster.vue +0 -17
- package/list/management.cattle.io.feature.vue +4 -288
- package/list/management.cattle.io.oidcclient.vue +108 -0
- package/list/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +8 -6
- package/list/management.cattle.io.user.vue +13 -20
- package/list/namespace.vue +6 -2
- package/list/node.vue +2 -0
- package/list/projectsecret.vue +345 -0
- package/list/secret.vue +109 -0
- package/list/workload.vue +6 -2
- package/machine-config/__tests__/vmwarevsphere.test.ts +5 -7
- package/machine-config/amazonec2.vue +3 -24
- package/machine-config/components/GCEImage.vue +374 -0
- package/machine-config/google.vue +617 -0
- package/machine-config/vmwarevsphere.vue +7 -17
- package/mixins/__tests__/brand.spec.ts +170 -0
- package/mixins/auth-config.js +8 -1
- package/mixins/brand.js +16 -17
- package/mixins/create-edit-view/impl.js +20 -1
- package/mixins/create-edit-view/index.js +5 -0
- package/mixins/preset.js +100 -0
- package/mixins/resource-fetch-api-pagination.js +73 -44
- package/mixins/resource-fetch.js +18 -8
- package/mixins/resource-table-watch.js +45 -0
- package/mixins/vue-select-overrides.js +1 -4
- package/models/__tests__/chart.test.ts +296 -0
- package/models/__tests__/fleet.cattle.io.gitrepo.test.ts +1 -1
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +224 -0
- package/models/__tests__/node.test.ts +7 -63
- package/models/__tests__/workload.test.ts +1 -0
- package/models/chart.js +157 -2
- package/models/cluster/node.js +2 -1
- package/models/cluster.js +32 -2
- package/models/cluster.x-k8s.io.machinedeployment.js +11 -2
- package/models/{cis.cattle.io.clusterscan.js → compliance.cattle.io.clusterscan.js} +8 -8
- package/models/{cis.cattle.io.clusterscanbenchmark.js → compliance.cattle.io.clusterscanbenchmark.js} +1 -1
- package/models/{cis.cattle.io.clusterscanprofile.js → compliance.cattle.io.clusterscanprofile.js} +5 -5
- package/models/{cis.cattle.io.clusterscanreport.js → compliance.cattle.io.clusterscanreport.js} +1 -1
- package/models/fleet-application.js +297 -0
- package/models/fleet.cattle.io.bundle.js +9 -8
- package/models/fleet.cattle.io.cluster.js +21 -4
- package/models/fleet.cattle.io.gitrepo.js +46 -382
- package/models/fleet.cattle.io.helmop.js +202 -0
- package/models/management.cattle.io.authconfig.js +1 -0
- package/models/management.cattle.io.cluster.js +0 -20
- package/models/management.cattle.io.feature.js +7 -1
- package/models/management.cattle.io.fleetworkspace.js +14 -1
- package/models/management.cattle.io.node.js +7 -22
- package/models/management.cattle.io.nodepool.js +12 -0
- package/models/management.cattle.io.oidcclient.js +18 -0
- package/models/management.cattle.io.registration.js +3 -0
- package/models/management.cattle.io.setting.js +0 -1
- package/models/namespace.js +12 -1
- package/models/provisioning.cattle.io.cluster.js +79 -115
- package/models/secret.js +157 -2
- package/models/service.js +28 -9
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/workload.js +93 -53
- package/package.json +6 -5
- package/pages/about.vue +17 -61
- package/pages/account/index.vue +105 -116
- package/pages/auth/login.vue +2 -3
- package/pages/auth/setup.vue +36 -17
- package/pages/auth/verify.vue +13 -1
- package/pages/c/_cluster/apps/charts/AddRepoLink.vue +36 -0
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +80 -0
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +57 -0
- package/pages/c/_cluster/apps/charts/StatusLabel.vue +33 -0
- package/pages/c/_cluster/apps/charts/index.vue +501 -468
- package/pages/c/_cluster/apps/charts/install.vue +0 -1
- package/pages/c/_cluster/auth/roles/index.vue +72 -44
- package/pages/c/_cluster/auth/user.retention/index.vue +87 -78
- package/pages/c/_cluster/explorer/ConfigBadge.vue +1 -1
- package/pages/c/_cluster/explorer/EventsTable.vue +1 -1
- package/pages/c/_cluster/explorer/index.vue +16 -4
- package/pages/c/_cluster/explorer/projectsecret.vue +34 -0
- package/pages/c/_cluster/explorer/tools/index.vue +6 -6
- package/pages/c/_cluster/explorer/tools/pages/_page.vue +0 -1
- package/pages/c/_cluster/fleet/__tests__/index.test.ts +720 -0
- package/pages/c/_cluster/fleet/application/_resource/_id.vue +14 -0
- package/pages/c/_cluster/fleet/application/_resource/create.vue +14 -0
- package/pages/c/_cluster/fleet/application/create.vue +341 -0
- package/pages/c/_cluster/fleet/application/index.vue +139 -0
- package/pages/c/_cluster/fleet/graph/config.js +277 -0
- package/pages/c/_cluster/fleet/index.vue +866 -328
- package/pages/c/_cluster/fleet/settings/index.vue +229 -0
- package/pages/c/_cluster/longhorn/index.vue +5 -2
- package/pages/c/_cluster/settings/banners.vue +56 -2
- package/pages/c/_cluster/settings/brand.vue +2 -1
- package/pages/c/_cluster/settings/performance.vue +7 -26
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +16 -1
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +2 -2
- package/pages/c/_cluster/uiplugins/__tests__/AddExtensionRepos.test.ts +4 -7
- package/pages/c/_cluster/uiplugins/index.vue +98 -55
- package/pages/explorer/resource/detail/configmap.vue +42 -0
- package/pages/explorer/resource/detail/projectsecret.vue +9 -0
- package/pages/explorer/resource/detail/secret.vue +63 -0
- package/pages/home.vue +63 -117
- package/pages/prefs.vue +0 -1
- package/pages/support/index.vue +4 -6
- package/pkg/tsconfig.json +9 -9
- package/pkg/vue.config.js +1 -1
- package/plugins/clean-html.js +2 -0
- package/plugins/dashboard-store/__tests__/actions.test.ts +4 -1
- package/plugins/dashboard-store/__tests__/normalize.test.ts +223 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +191 -0
- package/plugins/dashboard-store/__tests__/utils/normalize-usecases.ts +1526 -0
- package/plugins/dashboard-store/actions.js +213 -56
- package/plugins/dashboard-store/getters.js +112 -24
- package/plugins/dashboard-store/mutations.js +61 -12
- package/plugins/dashboard-store/normalize.js +29 -19
- package/plugins/dashboard-store/resource-class.js +105 -21
- package/plugins/steve/__tests__/getters.test.ts +19 -12
- package/plugins/steve/__tests__/steve-class.test.ts +1 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +324 -1
- package/plugins/steve/actions.js +37 -24
- package/plugins/steve/getters.js +47 -12
- package/plugins/steve/resourceWatcher.js +10 -3
- package/plugins/steve/steve-class.js +5 -0
- package/plugins/steve/steve-pagination-utils.ts +225 -43
- package/plugins/steve/subscribe.js +418 -53
- package/plugins/steve/worker/web-worker.advanced.js +5 -1
- package/public/favicon.png +0 -0
- package/public/index.html +1 -1
- package/rancher-components/BadgeState/BadgeState.vue +33 -52
- package/rancher-components/Banner/Banner.test.ts +51 -3
- package/rancher-components/Banner/Banner.vue +53 -10
- package/rancher-components/Form/Checkbox/Checkbox.test.ts +59 -1
- package/rancher-components/Form/Checkbox/Checkbox.vue +27 -9
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +51 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +21 -3
- package/rancher-components/Form/Radio/RadioButton.test.ts +36 -1
- package/rancher-components/Form/Radio/RadioButton.vue +21 -5
- package/rancher-components/Form/Radio/RadioGroup.test.ts +60 -0
- package/rancher-components/Form/Radio/RadioGroup.vue +90 -39
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +4 -0
- package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +22 -1
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +32 -2
- package/rancher-components/RcButton/RcButton.vue +1 -1
- package/rancher-components/RcDropdown/RcDropdown.test.ts +98 -0
- package/rancher-components/RcDropdown/RcDropdown.vue +6 -0
- package/rancher-components/RcDropdown/RcDropdownItem.vue +8 -55
- package/rancher-components/RcDropdown/RcDropdownItemCheckbox.vue +69 -0
- package/rancher-components/RcDropdown/RcDropdownItemSelect.vue +93 -0
- package/rancher-components/RcDropdown/index.ts +2 -0
- package/rancher-components/RcDropdown/useDropdownContext.ts +21 -0
- package/rancher-components/RcDropdown/useDropdownItem.ts +92 -0
- package/rancher-components/RcItemCard/RcItemCard.test.ts +189 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +430 -0
- package/rancher-components/RcItemCard/RcItemCardAction.vue +24 -0
- package/rancher-components/RcItemCard/index.ts +2 -0
- package/rancher-components/StringList/StringList.vue +1 -1
- package/scripts/build-pkg.sh +18 -23
- package/scripts/extension/publish +1 -1
- package/scripts/publish-shell.sh +1 -1
- package/static/loading-indicator.html +1 -1
- package/store/action-menu.js +26 -56
- package/store/auth.js +3 -0
- package/store/catalog.js +85 -25
- package/store/features.js +0 -1
- package/store/growl.js +97 -8
- package/store/i18n.js +5 -1
- package/store/index.js +48 -18
- package/store/notifications.ts +426 -0
- package/store/prefs.js +2 -8
- package/store/slideInPanel.ts +6 -0
- package/store/type-map.js +35 -20
- package/store/type-map.utils.ts +49 -6
- package/store/uiplugins.ts +15 -1
- package/types/fleet.d.ts +60 -1
- package/types/kube/kube-api.ts +34 -0
- package/types/notifications/index.ts +74 -0
- package/types/resources/fleet.d.ts +43 -0
- package/types/resources/pod-security-admission.ts +36 -0
- package/types/resources/settings.d.ts +107 -0
- package/types/resources/userPreferences.d.ts +13 -0
- package/types/shell/index.d.ts +949 -741
- package/types/store/dashboard-store.types.ts +57 -4
- package/types/store/pagination.types.ts +41 -9
- package/types/store/subscribe.types.ts +50 -0
- package/utils/__mocks__/tabbable.js +13 -0
- package/utils/__tests__/back-off.test.ts +354 -0
- package/utils/__tests__/create-yaml.test.ts +235 -0
- package/utils/__tests__/fleet.test.ts +148 -0
- package/utils/__tests__/kontainer.test.ts +19 -0
- package/utils/__tests__/object.test.ts +54 -1
- package/utils/__tests__/string.test.ts +273 -1
- package/utils/__tests__/time.test.ts +31 -0
- package/utils/auth.js +41 -6
- package/utils/back-off.ts +176 -0
- package/utils/cluster.js +24 -20
- package/utils/create-yaml.js +103 -9
- package/utils/crypto/encryption.ts +103 -0
- package/utils/cspAdaptor.ts +51 -0
- package/utils/error.js +26 -9
- package/utils/errorTranslate.json +410 -6
- package/utils/errorTranslateNew.json +39 -0
- package/utils/fleet-types.ts +0 -0
- package/utils/fleet.ts +204 -74
- package/utils/grafana.js +1 -0
- package/utils/kontainer.ts +3 -5
- package/utils/object.js +36 -12
- package/utils/pagination-utils.ts +50 -3
- package/utils/pagination-wrapper.ts +132 -50
- package/utils/perf-setting.utils.ts +28 -0
- package/utils/release-notes.ts +48 -0
- package/utils/roleFiltering.js +33 -0
- package/utils/selector-typed.ts +210 -0
- package/utils/selector.js +29 -6
- package/utils/settings.ts +4 -1
- package/utils/string.js +24 -0
- package/utils/style.ts +39 -0
- package/utils/{time.js → time.ts} +25 -6
- package/utils/uiplugins.ts +41 -8
- package/utils/v-sphere.ts +5 -1
- package/utils/validators/formRules/__tests__/index.test.ts +76 -6
- package/utils/validators/formRules/index.ts +99 -4
- package/utils/window.js +11 -7
- package/vue.config.js +1 -1
- package/.DS_Store +0 -0
- package/components/AssignTo.vue +0 -199
- package/components/DisableAuthProviderModal.vue +0 -115
- package/components/MoveModal.vue +0 -167
- package/components/PromptChangePassword.vue +0 -123
- package/components/ResourceList/Masthead-btn.vue +0 -225
- package/components/__tests__/ApplicationCard.test.ts +0 -27
- package/components/cards/ApplicationCard.vue +0 -145
- package/components/fleet/FleetBundleResources.vue +0 -86
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +0 -17
- package/components/formatter/RKETemplateName.vue +0 -37
- package/config/product/legacy.js +0 -62
- package/config/secret.js +0 -14
- package/dialog/SaveAsRKETemplateDialog.vue +0 -139
- package/models/etcdbackup.js +0 -45
- package/pages/auth copy/login.vue +0 -595
- package/pages/auth copy/logout.vue +0 -47
- package/pages/auth copy/setup.vue +0 -523
- package/pages/auth copy/verify.vue +0 -203
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +0 -249
- package/pages/c/_cluster/legacy/pages/_page.vue +0 -29
- package/pages/c/_cluster/legacy/project/_page.vue +0 -57
- package/pages/c/_cluster/legacy/project/index.vue +0 -32
- package/pages/c/_cluster/legacy/project/pipelines.vue +0 -96
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { KubeLabelSelector } from '@shell/types/kube/kube-api';
|
|
2
|
+
import { PaginationArgs, StorePagination } from '@shell/types/store/pagination.types';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Properties on all findX actions
|
|
5
6
|
*/
|
|
6
7
|
export type ActionCoreFindArgs = {
|
|
8
|
+
url?: string,
|
|
7
9
|
force?: boolean,
|
|
8
10
|
}
|
|
9
11
|
|
|
@@ -13,7 +15,29 @@ export type ActionCoreFindArgs = {
|
|
|
13
15
|
export interface ActionFindAllArgs extends ActionCoreFindArgs {
|
|
14
16
|
watch?: boolean,
|
|
15
17
|
namespaced?: string[],
|
|
16
|
-
|
|
18
|
+
/**
|
|
19
|
+
* Should resources be fetched in increments?
|
|
20
|
+
*/
|
|
21
|
+
incremental?: {
|
|
22
|
+
/**
|
|
23
|
+
* load this amount of info first, to show something quickly
|
|
24
|
+
*
|
|
25
|
+
* helpful if resources per increments turns out to be large
|
|
26
|
+
*/
|
|
27
|
+
quickLoadCount: number,
|
|
28
|
+
/**
|
|
29
|
+
* Number of resources to fetch in each increment
|
|
30
|
+
*/
|
|
31
|
+
resourcesPerIncrement: number,
|
|
32
|
+
/**
|
|
33
|
+
* Number of increments to fetch
|
|
34
|
+
*/
|
|
35
|
+
increments: number,
|
|
36
|
+
/**
|
|
37
|
+
* Fetch increments by page size and number (instead of limit and next)
|
|
38
|
+
*/
|
|
39
|
+
pageByNumber: boolean,
|
|
40
|
+
},
|
|
17
41
|
hasManualRefresh?: boolean,
|
|
18
42
|
limit?: number,
|
|
19
43
|
/**
|
|
@@ -24,6 +48,11 @@ export interface ActionFindAllArgs extends ActionCoreFindArgs {
|
|
|
24
48
|
depaginate?: boolean,
|
|
25
49
|
}
|
|
26
50
|
|
|
51
|
+
export interface ActionFindPageTransientResult<T> {
|
|
52
|
+
pagination: StorePagination,
|
|
53
|
+
data: T[],
|
|
54
|
+
}
|
|
55
|
+
|
|
27
56
|
/**
|
|
28
57
|
* Args used for findPage action
|
|
29
58
|
*/
|
|
@@ -39,8 +68,32 @@ export interface ActionFindPageArgs extends ActionCoreFindArgs {
|
|
|
39
68
|
*/
|
|
40
69
|
namespaced?: string,
|
|
41
70
|
/**
|
|
42
|
-
*
|
|
71
|
+
* Watch for changes
|
|
72
|
+
*
|
|
73
|
+
* false = no, all other values = yes
|
|
74
|
+
*/
|
|
75
|
+
watch?: boolean,
|
|
76
|
+
/**
|
|
77
|
+
* Does this request stem from a list with manual refresh?
|
|
43
78
|
*/
|
|
44
|
-
transient?: boolean,
|
|
45
79
|
hasManualRefresh?: boolean,
|
|
80
|
+
/**
|
|
81
|
+
* If true don't persist the http response to the store, just pass it back
|
|
82
|
+
*/
|
|
83
|
+
transient?: boolean,
|
|
46
84
|
}
|
|
85
|
+
|
|
86
|
+
export type ActionFindPageResponse<T = any> = {
|
|
87
|
+
data: T[],
|
|
88
|
+
pagination?: StorePagination
|
|
89
|
+
} | T[];
|
|
90
|
+
|
|
91
|
+
export interface ActionFindMatchingArgs extends ActionCoreFindArgs {
|
|
92
|
+
labelSelector: KubeLabelSelector,
|
|
93
|
+
namespaced?: string,
|
|
94
|
+
depaginate?: boolean
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
export type ActionFindMatchingResponse<T = any> = ActionFindPageResponse<T>
|
|
98
|
+
|
|
99
|
+
export type ActionFindLabelSelectorArgs = ActionFindPageArgs | ActionFindMatchingArgs;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { NAMESPACE_FILTER_NS_FULL_PREFIX, NAMESPACE_FILTER_P_FULL_PREFIX } from '@shell/utils/namespace-filter';
|
|
2
|
+
import { KubeLabelSelector } from '@shell/types/kube/kube-api';
|
|
2
3
|
|
|
3
4
|
// Pagination Typing
|
|
4
5
|
// These structures are designed to offer both convenience and flexibility based on a common structure and are
|
|
@@ -63,12 +64,14 @@ export class PaginationFilterField {
|
|
|
63
64
|
field?: string;
|
|
64
65
|
/**
|
|
65
66
|
* Value of field within the object to filter by for example the y of x=y
|
|
67
|
+
*
|
|
68
|
+
* This can be empty if `exists` is true
|
|
66
69
|
*/
|
|
67
|
-
value
|
|
70
|
+
value?: string;
|
|
68
71
|
/**
|
|
69
72
|
* Equality field within the object to filter by for example the `=` or `!=` of x=y
|
|
70
73
|
*/
|
|
71
|
-
equals
|
|
74
|
+
equals?: boolean;
|
|
72
75
|
/**
|
|
73
76
|
* Match the field exactly. False for partial matches
|
|
74
77
|
*
|
|
@@ -76,18 +79,26 @@ export class PaginationFilterField {
|
|
|
76
79
|
* Exact: true. "p" no, "pod", no, "pod1" yes
|
|
77
80
|
* Exact: false. "p" yes, "pod", yes, "pod1" yes
|
|
78
81
|
*/
|
|
79
|
-
exact
|
|
82
|
+
exact?: boolean;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Check if the field/property exists, regardless of value
|
|
86
|
+
*
|
|
87
|
+
* If this is false it does not flip the expectation, just doesn't add the field
|
|
88
|
+
*/
|
|
89
|
+
exists?: boolean;
|
|
80
90
|
|
|
81
91
|
constructor(
|
|
82
92
|
{
|
|
83
|
-
field, value, equals = true, exact = true
|
|
93
|
+
field, value = '', equals = true, exact = true, exists = false
|
|
84
94
|
}:
|
|
85
|
-
{ field?: string; value
|
|
95
|
+
{ field?: string; value?: string; equals?: boolean; exact?: boolean; exists?:boolean;}
|
|
86
96
|
) {
|
|
87
97
|
this.field = field;
|
|
88
98
|
this.value = value;
|
|
89
99
|
this.equals = equals;
|
|
90
100
|
this.exact = exact;
|
|
101
|
+
this.exists = exists;
|
|
91
102
|
}
|
|
92
103
|
}
|
|
93
104
|
|
|
@@ -227,7 +238,7 @@ export class PaginationParamFilter extends PaginationParam {
|
|
|
227
238
|
/**
|
|
228
239
|
* Convenience method when you just want an instance of {@link PaginationParamFilter} with a simple `filter=x=y` param
|
|
229
240
|
*/
|
|
230
|
-
static createSingleField(field: { field?: string; value
|
|
241
|
+
static createSingleField(field: { field?: string; value?: string; equals?: boolean; exact?: boolean, exists?: boolean }): PaginationParam {
|
|
231
242
|
return new PaginationParamFilter({ fields: [new PaginationFilterField(field)] });
|
|
232
243
|
}
|
|
233
244
|
|
|
@@ -304,7 +315,7 @@ export class PaginationArgs {
|
|
|
304
315
|
*/
|
|
305
316
|
sort: PaginationSort[];
|
|
306
317
|
/**
|
|
307
|
-
* A collection of `filter` params
|
|
318
|
+
* A collection of traditional `filter` params covering logic such as x is y, x is like y, x is not y
|
|
308
319
|
*
|
|
309
320
|
* For more info see {@link PaginationParamFilter}
|
|
310
321
|
*/
|
|
@@ -316,6 +327,11 @@ export class PaginationArgs {
|
|
|
316
327
|
*/
|
|
317
328
|
projectsOrNamespaces: PaginationParamProjectOrNamespace[];
|
|
318
329
|
|
|
330
|
+
/**
|
|
331
|
+
* Traditional Kube labelSelector consisting of matchLabels and matchExpressions
|
|
332
|
+
*/
|
|
333
|
+
labelSelector?: KubeLabelSelector;
|
|
334
|
+
|
|
319
335
|
/**
|
|
320
336
|
* Creates an instance of PaginationArgs.
|
|
321
337
|
*
|
|
@@ -327,6 +343,7 @@ export class PaginationArgs {
|
|
|
327
343
|
sort = [],
|
|
328
344
|
filters = [],
|
|
329
345
|
projectsOrNamespaces = [],
|
|
346
|
+
labelSelector = undefined,
|
|
330
347
|
}:
|
|
331
348
|
// This would be neater as just Partial<PaginationArgs> but we lose all jsdoc
|
|
332
349
|
{
|
|
@@ -354,6 +371,10 @@ export class PaginationArgs {
|
|
|
354
371
|
* For definition see {@link PaginationArgs} `projectsOrNamespaces`
|
|
355
372
|
*/
|
|
356
373
|
projectsOrNamespaces?: PaginationParamProjectOrNamespace | PaginationParamProjectOrNamespace[],
|
|
374
|
+
/**
|
|
375
|
+
* Traditional Kube labelSelector consisting of matchLabels and matchExpressions
|
|
376
|
+
*/
|
|
377
|
+
labelSelector?: KubeLabelSelector,
|
|
357
378
|
}) {
|
|
358
379
|
this.page = page;
|
|
359
380
|
this.pageSize = pageSize;
|
|
@@ -368,6 +389,7 @@ export class PaginationArgs {
|
|
|
368
389
|
} else {
|
|
369
390
|
this.projectsOrNamespaces = [];
|
|
370
391
|
}
|
|
392
|
+
this.labelSelector = labelSelector;
|
|
371
393
|
}
|
|
372
394
|
}
|
|
373
395
|
|
|
@@ -386,6 +408,7 @@ export class FilterArgs extends PaginationArgs {
|
|
|
386
408
|
sort = [],
|
|
387
409
|
filters = [],
|
|
388
410
|
projectsOrNamespaces = [],
|
|
411
|
+
labelSelector = undefined,
|
|
389
412
|
}:
|
|
390
413
|
// This would be neater as just Partial<PaginationArgs> but we lose all jsdoc
|
|
391
414
|
{
|
|
@@ -405,9 +428,13 @@ export class FilterArgs extends PaginationArgs {
|
|
|
405
428
|
* For definition see {@link PaginationArgs} `projectsOrNamespaces`
|
|
406
429
|
*/
|
|
407
430
|
projectsOrNamespaces?: PaginationParamProjectOrNamespace | PaginationParamProjectOrNamespace[],
|
|
431
|
+
/**
|
|
432
|
+
* Traditional Kube labelSelector consisting of matchLabels and matchExpressions
|
|
433
|
+
*/
|
|
434
|
+
labelSelector?: KubeLabelSelector
|
|
408
435
|
}) {
|
|
409
436
|
super({
|
|
410
|
-
page: null, pageSize: null, sort, filters, projectsOrNamespaces
|
|
437
|
+
page: null, pageSize: null, sort, filters, projectsOrNamespaces, labelSelector
|
|
411
438
|
});
|
|
412
439
|
}
|
|
413
440
|
}
|
|
@@ -434,7 +461,12 @@ export interface StorePaginationRequest {
|
|
|
434
461
|
/**
|
|
435
462
|
* The set of pagination args used to create the request
|
|
436
463
|
*/
|
|
437
|
-
pagination: PaginationArgs
|
|
464
|
+
pagination: PaginationArgs,
|
|
465
|
+
|
|
466
|
+
/**
|
|
467
|
+
* Does this request stem from a list with manual refresh?
|
|
468
|
+
*/
|
|
469
|
+
hasManualRefresh?: boolean,
|
|
438
470
|
}
|
|
439
471
|
|
|
440
472
|
/**
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/* eslint-disable no-unused-vars */
|
|
2
|
+
export enum STEVE_WATCH_MODE {
|
|
3
|
+
DEFAULT = '',
|
|
4
|
+
RESOURCE_CHANGES = 'resource.changes'
|
|
5
|
+
}
|
|
6
|
+
/* eslint-enable no-unused-vars */
|
|
7
|
+
|
|
8
|
+
/* eslint-disable no-unused-vars */
|
|
9
|
+
export enum STEVE_WATCH_EVENT {
|
|
10
|
+
START = 'resource.start',
|
|
11
|
+
CREATE = 'resource.create',
|
|
12
|
+
CHANGE = 'resource.change',
|
|
13
|
+
CHANGES = 'resource.changes',
|
|
14
|
+
REMOVE = 'resource.resource.remove',
|
|
15
|
+
ERROR = 'resource.error',
|
|
16
|
+
STOP = 'resource.stop',
|
|
17
|
+
}
|
|
18
|
+
/* eslint-enable no-unused-vars */
|
|
19
|
+
|
|
20
|
+
export interface STEVE_WATCH_PARAMS {
|
|
21
|
+
type: string,
|
|
22
|
+
selector?: string,
|
|
23
|
+
id?: string,
|
|
24
|
+
revision?: string,
|
|
25
|
+
namespace?: string,
|
|
26
|
+
stop?: boolean,
|
|
27
|
+
force?: boolean,
|
|
28
|
+
mode?: STEVE_WATCH_MODE
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export type STEVE_WATCH_EVENT_LISTENER_CALLBACK = () => void
|
|
32
|
+
export interface STEVE_WATCH_EVENT_LISTENER {
|
|
33
|
+
params: STEVE_WATCH_PARAMS,
|
|
34
|
+
callbacks: { [id: string]: STEVE_WATCH_EVENT_LISTENER_CALLBACK},
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface STEVE_WATCH_EVENT_PARAMS_COMMON {
|
|
38
|
+
event: STEVE_WATCH_EVENT,
|
|
39
|
+
id: string,
|
|
40
|
+
/**
|
|
41
|
+
* of type @STEVE_WATCH_PARAMS
|
|
42
|
+
*/
|
|
43
|
+
params: STEVE_WATCH_PARAMS,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface STEVE_WATCH_EVENT_PARAMS extends STEVE_WATCH_EVENT_PARAMS_COMMON {
|
|
47
|
+
callback: STEVE_WATCH_EVENT_LISTENER_CALLBACK,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type STEVE_UNWATCH_EVENT_PARAMS = STEVE_WATCH_EVENT_PARAMS_COMMON
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// __mocks__/tabbable.js
|
|
2
|
+
|
|
3
|
+
const lib = jest.requireActual('tabbable');
|
|
4
|
+
|
|
5
|
+
const tabbable = {
|
|
6
|
+
...lib,
|
|
7
|
+
tabbable: (node, options) => lib.tabbable(node, { ...options, displayCheck: 'none' }),
|
|
8
|
+
focusable: (node, options) => lib.focusable(node, { ...options, displayCheck: 'none' }),
|
|
9
|
+
isFocusable: (node, options) => lib.isFocusable(node, { ...options, displayCheck: 'none' }),
|
|
10
|
+
isTabbable: (node, options) => lib.isTabbable(node, { ...options, displayCheck: 'none' }),
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
module.exports = tabbable;
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
// Import the BackOff instance from your code.
|
|
2
|
+
// Assuming the file is named `backoff.ts` and the default export is the BackOff instance.
|
|
3
|
+
import backOff from '../back-off';
|
|
4
|
+
|
|
5
|
+
describe('backOff', () => {
|
|
6
|
+
// Use Jest's fake timers to control `setTimeout`. This is crucial for testing delays.
|
|
7
|
+
jest.useFakeTimers();
|
|
8
|
+
|
|
9
|
+
// Mock console.log to prevent test logs from cluttering the console output.
|
|
10
|
+
let consoleLogMock: jest.SpyInstance;
|
|
11
|
+
let consoleErrorMock: jest.SpyInstance;
|
|
12
|
+
|
|
13
|
+
beforeEach(() => {
|
|
14
|
+
// Before each test, reset the BackOff state.
|
|
15
|
+
backOff.resetAll();
|
|
16
|
+
|
|
17
|
+
// Create new mocks for each test to ensure a clean slate.
|
|
18
|
+
consoleLogMock = jest.spyOn(console, 'log').mockImplementation(() => {});
|
|
19
|
+
consoleErrorMock = jest.spyOn(console, 'error').mockImplementation(() => {});
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
// Restore the original console functions after each test.
|
|
24
|
+
consoleLogMock.mockRestore();
|
|
25
|
+
consoleErrorMock.mockRestore();
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// --- Test Suite for `execute` method ---
|
|
29
|
+
|
|
30
|
+
it('should execute the function immediately the first time without a delay', async() => {
|
|
31
|
+
const delayedFn = jest.fn();
|
|
32
|
+
|
|
33
|
+
// Call the function for the first time.
|
|
34
|
+
await backOff.execute({
|
|
35
|
+
id: 'test1', description: 'Test 1', delayedFn
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// The function should have been called immediately, since the fake timer hasn't advanced.
|
|
39
|
+
expect(delayedFn).toHaveBeenCalledTimes(0);
|
|
40
|
+
expect(backOff.getBackOff('test1')).toBeDefined();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should back off and delay the second execution', async() => {
|
|
44
|
+
const delayedFn = jest.fn();
|
|
45
|
+
const id = 'backoff-test';
|
|
46
|
+
|
|
47
|
+
// First call, which should run immediately.
|
|
48
|
+
await backOff.execute({
|
|
49
|
+
id, description: 'Backoff Test', delayedFn,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
jest.advanceTimersByTime(1);
|
|
53
|
+
|
|
54
|
+
// Expect the first call to be immediate.
|
|
55
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
56
|
+
|
|
57
|
+
// Call it a second time. This should initiate a backoff delay.
|
|
58
|
+
await backOff.execute({
|
|
59
|
+
id, description: 'Backoff Test', delayedFn
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// The function should not have been called a second time yet.
|
|
63
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
64
|
+
|
|
65
|
+
// Advance the timer by less than the first backoff delay (250ms).
|
|
66
|
+
jest.advanceTimersByTime(200);
|
|
67
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
68
|
+
|
|
69
|
+
// Now, advance the timer by the required delay to trigger the second call.
|
|
70
|
+
jest.advanceTimersByTime(50);
|
|
71
|
+
|
|
72
|
+
// The function should have been called a second time.
|
|
73
|
+
await Promise.resolve();
|
|
74
|
+
expect(delayedFn).toHaveBeenCalledTimes(2);
|
|
75
|
+
|
|
76
|
+
// Verify the backoff entry was created correctly.
|
|
77
|
+
const backOffEntry = backOff.getBackOff(id);
|
|
78
|
+
|
|
79
|
+
expect(backOffEntry.try).toBe(2);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('should implement exponential backoff on subsequent calls', async() => {
|
|
83
|
+
const delayedFn = jest.fn();
|
|
84
|
+
const id = 'exp-backoff';
|
|
85
|
+
|
|
86
|
+
// First call (immediate)
|
|
87
|
+
await backOff.execute({
|
|
88
|
+
id, description: 'Exponential Backoff Test', delayedFn
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
jest.advanceTimersByTime(1);
|
|
92
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
93
|
+
|
|
94
|
+
// Second call (should have a delay of 1^2 * 250 = 250ms)
|
|
95
|
+
await backOff.execute({
|
|
96
|
+
id, description: 'Exponential Backoff Test', delayedFn
|
|
97
|
+
});
|
|
98
|
+
jest.advanceTimersByTime(250);
|
|
99
|
+
await Promise.resolve();
|
|
100
|
+
expect(delayedFn).toHaveBeenCalledTimes(2);
|
|
101
|
+
|
|
102
|
+
// Third call (should have a delay of 2^2 * 250 = 1000ms)
|
|
103
|
+
await backOff.execute({
|
|
104
|
+
id, description: 'Exponential Backoff Test', delayedFn
|
|
105
|
+
});
|
|
106
|
+
jest.advanceTimersByTime(1000);
|
|
107
|
+
await Promise.resolve();
|
|
108
|
+
expect(delayedFn).toHaveBeenCalledTimes(3);
|
|
109
|
+
|
|
110
|
+
// Fourth call (should have a delay of 3^2 * 250 = 2250ms)
|
|
111
|
+
await backOff.execute({
|
|
112
|
+
id, description: 'Exponential Backoff Test', delayedFn
|
|
113
|
+
});
|
|
114
|
+
jest.advanceTimersByTime(2250);
|
|
115
|
+
await Promise.resolve();
|
|
116
|
+
expect(delayedFn).toHaveBeenCalledTimes(4);
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
it('should skip execution if a previous backoff process is already running', async() => {
|
|
120
|
+
const delayedFn = jest.fn();
|
|
121
|
+
const id = 'skip-test';
|
|
122
|
+
|
|
123
|
+
await backOff.execute({
|
|
124
|
+
id, description: 'Skip Test', delayedFn
|
|
125
|
+
});
|
|
126
|
+
expect(delayedFn).toHaveBeenCalledTimes(0);
|
|
127
|
+
|
|
128
|
+
// Second call, will be ignored
|
|
129
|
+
await backOff.execute({
|
|
130
|
+
id, description: 'Skip Test', delayedFn
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
expect(delayedFn).toHaveBeenCalledTimes(0);
|
|
134
|
+
|
|
135
|
+
// We should only have 1 call so far.
|
|
136
|
+
jest.advanceTimersByTime(1);
|
|
137
|
+
await Promise.resolve();
|
|
138
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
139
|
+
|
|
140
|
+
// A third call while the first is still pending.
|
|
141
|
+
// This call should be ignored and the delayedFn should not be executed.
|
|
142
|
+
await backOff.execute({
|
|
143
|
+
id, description: 'Skip Test', delayedFn
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
147
|
+
|
|
148
|
+
jest.advanceTimersByTime(300);
|
|
149
|
+
await Promise.resolve();
|
|
150
|
+
expect(delayedFn).toHaveBeenCalledTimes(2);
|
|
151
|
+
|
|
152
|
+
// Advance timers to complete the pending second call.
|
|
153
|
+
jest.advanceTimersByTime(1000);
|
|
154
|
+
await Promise.resolve();
|
|
155
|
+
// Now there should be 2 calls, not 3.
|
|
156
|
+
expect(delayedFn).toHaveBeenCalledTimes(2);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('should not execute if the number of retries is exceeded', async() => {
|
|
160
|
+
const delayedFn = jest.fn();
|
|
161
|
+
const id = 'retries-test';
|
|
162
|
+
|
|
163
|
+
// Set retries to 2.
|
|
164
|
+
const retries = 2;
|
|
165
|
+
|
|
166
|
+
// Call 1 (immediate)
|
|
167
|
+
await backOff.execute({
|
|
168
|
+
id, description: 'Retries Test', retries, delayedFn
|
|
169
|
+
});
|
|
170
|
+
jest.advanceTimersByTime(1);
|
|
171
|
+
await Promise.resolve();
|
|
172
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
173
|
+
|
|
174
|
+
// Call 2 (after 250ms delay)
|
|
175
|
+
await backOff.execute({
|
|
176
|
+
id, description: 'Retries Test', retries, delayedFn
|
|
177
|
+
});
|
|
178
|
+
jest.advanceTimersByTime(250);
|
|
179
|
+
await Promise.resolve();
|
|
180
|
+
expect(delayedFn).toHaveBeenCalledTimes(2);
|
|
181
|
+
|
|
182
|
+
// Call 3 (should be ignored because it exceeds the `retries` limit of 2)
|
|
183
|
+
await backOff.execute({
|
|
184
|
+
id, description: 'Retries Test', retries, delayedFn
|
|
185
|
+
});
|
|
186
|
+
jest.advanceTimersByTime(250);
|
|
187
|
+
await Promise.resolve();
|
|
188
|
+
|
|
189
|
+
expect(delayedFn).toHaveBeenCalledTimes(2);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('should skip execution if `canFn` returns false', async() => {
|
|
193
|
+
const delayedFn = jest.fn();
|
|
194
|
+
const canFn = jest.fn().mockResolvedValue(false);
|
|
195
|
+
|
|
196
|
+
await backOff.execute({
|
|
197
|
+
id: 'canfn-test', description: 'canFn Test', canFn, delayedFn
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
jest.advanceTimersByTime(250);
|
|
201
|
+
await Promise.resolve();
|
|
202
|
+
|
|
203
|
+
expect(delayedFn).not.toHaveBeenCalled();
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it('should not clear backoff entry if the delayedFn throws an error', async() => {
|
|
207
|
+
const id = 'error-test';
|
|
208
|
+
const delayedFn = jest.fn().mockRejectedValue(new Error('Test Error'));
|
|
209
|
+
|
|
210
|
+
// Call the function for the first time.
|
|
211
|
+
await backOff.execute({
|
|
212
|
+
id, description: 'Error Test', delayedFn
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// Wait for the immediate call to finish.
|
|
216
|
+
jest.advanceTimersByTime(1);
|
|
217
|
+
await Promise.resolve();
|
|
218
|
+
await Promise.resolve();
|
|
219
|
+
await Promise.resolve();
|
|
220
|
+
|
|
221
|
+
// The entry should be removed after success/failure.
|
|
222
|
+
expect(backOff.getBackOff(id).timeoutId).toBeUndefined();
|
|
223
|
+
|
|
224
|
+
// Call again to trigger a backoff delay and an error.
|
|
225
|
+
await backOff.execute({
|
|
226
|
+
id, description: 'Error Test', delayedFn
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
// Advance timers to trigger the delayed function.
|
|
230
|
+
jest.advanceTimersByTime(250);
|
|
231
|
+
await Promise.resolve();
|
|
232
|
+
await Promise.resolve();
|
|
233
|
+
await Promise.resolve();
|
|
234
|
+
|
|
235
|
+
// The timeoutId should be cleared, but the `try` count should be preserved on the next call.
|
|
236
|
+
expect(backOff.getBackOff(id).timeoutId).toBeUndefined();
|
|
237
|
+
|
|
238
|
+
// Check if the next call will still back off.
|
|
239
|
+
const newDelayedFn = jest.fn();
|
|
240
|
+
|
|
241
|
+
await backOff.execute({
|
|
242
|
+
id, description: 'Error Test', delayedFn: newDelayedFn
|
|
243
|
+
});
|
|
244
|
+
expect(newDelayedFn).not.toHaveBeenCalled(); // The next call should still be delayed
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
it('should save metadata', async() => {
|
|
248
|
+
const delayedFn = jest.fn();
|
|
249
|
+
const id = 'exp-backoff';
|
|
250
|
+
const metadata = { a: true };
|
|
251
|
+
|
|
252
|
+
// First call (immediate)
|
|
253
|
+
await backOff.execute({
|
|
254
|
+
id, description: 'Exponential Backoff Test', delayedFn, metadata
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
expect(backOff.getBackOff(id)).toBeDefined();
|
|
258
|
+
expect(backOff.getBackOff(id).metadata).toStrictEqual(metadata);
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
// --- Test Suite for Reset methods ---
|
|
262
|
+
|
|
263
|
+
it('should reset a specific backoff process', async() => {
|
|
264
|
+
const delayedFn = jest.fn();
|
|
265
|
+
const id = 'reset-test';
|
|
266
|
+
|
|
267
|
+
// Start a backoff process.
|
|
268
|
+
await backOff.execute({
|
|
269
|
+
id, description: 'Reset Test', delayedFn
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
expect(backOff.getBackOff(id)).toBeDefined();
|
|
273
|
+
|
|
274
|
+
// Reset the process.
|
|
275
|
+
backOff.reset(id);
|
|
276
|
+
|
|
277
|
+
// The entry should be deleted from the map.
|
|
278
|
+
expect(backOff.getBackOff(id)).toBeUndefined();
|
|
279
|
+
|
|
280
|
+
// Now, a new execution should not be delayed.
|
|
281
|
+
await backOff.execute({
|
|
282
|
+
id, description: 'Reset Test', delayedFn
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
jest.advanceTimersByTime(250);
|
|
286
|
+
await Promise.resolve();
|
|
287
|
+
expect(delayedFn).toHaveBeenCalledTimes(1);
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('should reset all backoff processes', async() => {
|
|
291
|
+
const delayedFn1 = jest.fn();
|
|
292
|
+
const delayedFn2 = jest.fn();
|
|
293
|
+
|
|
294
|
+
await backOff.execute({
|
|
295
|
+
id: 'all-1', description: 'All 1', delayedFn: delayedFn1
|
|
296
|
+
});
|
|
297
|
+
await backOff.execute({
|
|
298
|
+
id: 'all-1', description: 'All 1', delayedFn: delayedFn1
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
await backOff.execute({
|
|
302
|
+
id: 'all-2', description: 'All 2', delayedFn: delayedFn2
|
|
303
|
+
});
|
|
304
|
+
await backOff.execute({
|
|
305
|
+
id: 'all-2', description: 'All 2', delayedFn: delayedFn2
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
expect(backOff.getBackOff('all-1')).toBeDefined();
|
|
309
|
+
expect(backOff.getBackOff('all-2')).toBeDefined();
|
|
310
|
+
|
|
311
|
+
// Reset all processes.
|
|
312
|
+
backOff.resetAll();
|
|
313
|
+
|
|
314
|
+
expect(backOff.getBackOff('all-1')).toBeUndefined();
|
|
315
|
+
expect(backOff.getBackOff('all-2')).toBeUndefined();
|
|
316
|
+
});
|
|
317
|
+
|
|
318
|
+
it('should reset only processes with a specific prefix', async() => {
|
|
319
|
+
const delayedFn = jest.fn();
|
|
320
|
+
|
|
321
|
+
await backOff.execute({
|
|
322
|
+
id: 'prefix-test-1', description: 'Prefix Test 1', delayedFn
|
|
323
|
+
});
|
|
324
|
+
await backOff.execute({
|
|
325
|
+
id: 'prefix-test-1', description: 'Prefix Test 1', delayedFn
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
await backOff.execute({
|
|
329
|
+
id: 'prefix-test-2', description: 'Prefix Test 2', delayedFn
|
|
330
|
+
});
|
|
331
|
+
await backOff.execute({
|
|
332
|
+
id: 'prefix-test-2', description: 'Prefix Test 2', delayedFn
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
await backOff.execute({
|
|
336
|
+
id: 'other-test-1', description: 'Other Test 1', delayedFn
|
|
337
|
+
});
|
|
338
|
+
await backOff.execute({
|
|
339
|
+
id: 'other-test-1', description: 'Other Test 1', delayedFn
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
expect(backOff.getBackOff('prefix-test-1')).toBeDefined();
|
|
343
|
+
expect(backOff.getBackOff('prefix-test-2')).toBeDefined();
|
|
344
|
+
expect(backOff.getBackOff('other-test-1')).toBeDefined();
|
|
345
|
+
|
|
346
|
+
// Reset only the "prefix-test" processes.
|
|
347
|
+
backOff.resetPrefix('prefix-test');
|
|
348
|
+
|
|
349
|
+
expect(backOff.getBackOff('prefix-test-1')).toBeUndefined();
|
|
350
|
+
expect(backOff.getBackOff('prefix-test-2')).toBeUndefined();
|
|
351
|
+
// The other process should still exist.
|
|
352
|
+
expect(backOff.getBackOff('other-test-1')).toBeDefined();
|
|
353
|
+
});
|
|
354
|
+
});
|