@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.4
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/apis/impl/apis.ts +6 -0
- package/apis/index.ts +26 -0
- package/apis/intf/resources-api/cluster-api.ts +18 -0
- package/apis/intf/resources-api/mgmt-api.ts +15 -0
- package/apis/intf/resources-api/resource-base.ts +107 -0
- package/apis/intf/resources-api/resource-constants.ts +147 -0
- package/apis/intf/resources-api/resources-api.ts +143 -0
- package/apis/intf/resources.ts +49 -0
- package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
- package/apis/intf/shell-api/proxy.ts +216 -0
- package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
- package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
- package/apis/intf/shell.ts +12 -6
- package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
- package/apis/resources/index.ts +22 -0
- package/apis/resources/resources-api-class.ts +187 -0
- package/apis/shell/__tests__/proxy.test.ts +369 -0
- package/apis/shell/index.ts +8 -1
- package/apis/shell/modal.ts +4 -1
- package/apis/shell/notifications.ts +9 -6
- package/apis/shell/proxy.ts +256 -0
- package/apis/shell/slide-in.ts +4 -1
- package/apis/vue-shim.d.ts +2 -1
- package/assets/data/aws-regions.json +4 -0
- package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
- package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
- package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
- package/assets/styles/base/_variables.scss +2 -0
- package/assets/styles/fonts/_fontstack.scss +132 -8
- package/assets/styles/global/_layout.scss +4 -0
- package/assets/translations/en-us.yaml +165 -45
- package/assets/translations/zh-hans.yaml +1 -7
- package/chart/monitoring/ClusterSelector.vue +0 -21
- package/chart/monitoring/index.vue +10 -1
- package/chart/monitoring/prometheus/index.vue +6 -3
- package/components/ActionDropdownShell.vue +2 -1
- package/components/CruResource.vue +161 -14
- package/components/CruResourceFooter.vue +9 -5
- package/components/ExplorerMembers.vue +8 -4
- package/components/ExplorerProjectsNamespaces.vue +11 -7
- package/components/GrowlManager.vue +4 -0
- package/components/InstallHelmCharts.vue +2 -2
- package/components/LandingPagePreference.vue +14 -5
- package/components/MgmtNodeList.vue +184 -0
- package/components/Resource/Detail/Card/StateCard/__tests__/composables.test.ts +90 -1
- package/components/Resource/Detail/Card/StateCard/composables.ts +57 -87
- package/components/Resource/Detail/Card/StatusCard/__tests__/StatusCard.test.ts +61 -0
- package/components/Resource/Detail/Card/StatusCard/index.vue +61 -15
- package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +17 -1
- package/components/Resource/Detail/Metadata/KeyValue.vue +5 -2
- package/components/Resource/Detail/Metadata/KeyValueRow.vue +2 -6
- package/components/Resource/Detail/Metadata/index.vue +6 -0
- package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
- package/components/Resource/Detail/SpacedRow.vue +3 -1
- package/components/Resource/Detail/TitleBar/index.vue +10 -11
- package/components/ResourceDetail/index.vue +1 -1
- package/components/ResourceList/Masthead.vue +19 -9
- package/components/ResourceList/index.vue +82 -1
- package/components/RichTranslation.vue +5 -2
- package/components/SelectIconGrid.vue +0 -10
- package/components/Setting.vue +1 -0
- package/components/SingleClusterInfo.vue +1 -0
- package/components/SortableTable/__tests__/sorting.test.ts +126 -0
- package/components/SortableTable/index.vue +6 -9
- package/components/SortableTable/selection.js +23 -5
- package/components/SortableTable/sorting.js +6 -3
- package/components/SubtleLink.vue +31 -6
- package/components/Tabbed/Tab.vue +29 -3
- package/components/Tabbed/index.vue +25 -3
- package/components/TableOfContents/TableOfContents.vue +109 -0
- package/components/TableOfContents/composables.ts +258 -0
- package/components/Window/ContainerShell.vue +21 -11
- package/components/Window/__tests__/ContainerShell.test.ts +107 -37
- package/components/Wizard.vue +23 -17
- package/components/fleet/AppCoChartGrid.vue +401 -0
- package/components/fleet/AppCoEmptyState.vue +127 -0
- package/components/fleet/AppCoPageHeader.vue +119 -0
- package/components/fleet/AppCoVersionSelect.vue +70 -0
- package/components/fleet/FleetBundles.vue +100 -12
- package/components/fleet/FleetClusterTargets/ClusterSelectionFields.vue +217 -0
- package/components/fleet/FleetClusterTargets/TargetsList.vue +123 -35
- package/components/fleet/FleetClusterTargets/index.vue +226 -161
- package/components/fleet/FleetIntro.vue +7 -3
- package/components/fleet/FleetNoWorkspaces.vue +7 -3
- package/components/fleet/FleetSecretSelector.vue +5 -3
- package/components/fleet/FleetValuesFrom.vue +8 -2
- package/components/fleet/GitRepoTargetTab.vue +0 -2
- package/components/fleet/HelmOpAdvancedTab.vue +19 -53
- package/components/fleet/HelmOpAppCoConfigTab.vue +593 -0
- package/components/fleet/HelmOpAppCoResourcesSection.vue +162 -0
- package/components/fleet/HelmOpResourcesSection.vue +82 -0
- package/components/fleet/HelmOpTargetOptionsSection.vue +89 -0
- package/components/fleet/HelmOpTargetTab.vue +64 -60
- package/components/fleet/HelmOpValuesTab.vue +129 -105
- package/components/fleet/__tests__/AppCoEmptyState.test.ts +71 -0
- package/components/fleet/__tests__/AppCoVersionSelect.test.ts +36 -0
- package/components/fleet/__tests__/ClusterSelectionFields.test.ts +62 -0
- package/components/fleet/__tests__/FleetClusterTargets.test.ts +402 -115
- package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
- package/components/fleet/__tests__/FleetSecretSelector.test.ts +16 -0
- package/components/fleet/__tests__/FleetValuesFrom.test.ts +44 -0
- package/components/fleet/__tests__/HelmOpAppCoConfigTab.test.ts +59 -0
- package/components/fleet/__tests__/HelmOpAppCoResourcesSection.test.ts +62 -0
- package/components/fleet/__tests__/HelmOpResourcesSection.test.ts +43 -0
- package/components/fleet/__tests__/HelmOpTargetOptionsSection.test.ts +34 -0
- package/components/fleet/__tests__/HelmOpValuesTab.test.ts +39 -0
- package/components/fleet/__tests__/__snapshots__/AppCoEmptyState.test.ts.snap +97 -0
- package/components/fleet/__tests__/__snapshots__/AppCoVersionSelect.test.ts.snap +30 -0
- package/components/fleet/__tests__/__snapshots__/ClusterSelectionFields.test.ts.snap +209 -0
- package/components/fleet/__tests__/__snapshots__/HelmOpTargetOptionsSection.test.ts.snap +140 -0
- package/components/fleet/dashboard/Empty.vue +8 -4
- package/components/fleet/dashboard/ResourceCard.vue +28 -0
- package/components/fleet/dashboard/ResourceDetails.vue +28 -0
- package/components/fleet/dashboard/__tests__/ResourceCard.test.ts +87 -0
- package/components/form/ArrayList.vue +61 -4
- package/components/form/KeyValue.vue +23 -2
- package/components/form/LabeledSelect.vue +59 -4
- package/components/form/Labels.vue +22 -3
- package/components/form/NameNsDescription.vue +24 -5
- package/components/form/ResourceTabs/index.vue +1 -0
- package/components/form/Security.vue +6 -2
- package/components/form/WorkloadPorts.vue +2 -7
- package/components/form/__tests__/NameNsDescription.test.ts +75 -0
- package/components/form/__tests__/Security.test.ts +76 -0
- package/components/formatter/Autoscaler.vue +4 -4
- package/components/formatter/ClusterKubeVersion.vue +27 -0
- package/components/formatter/ClusterLink.vue +1 -7
- package/components/formatter/ClusterProvider.vue +6 -10
- package/components/formatter/FleetSummaryGraph.vue +0 -3
- package/components/formatter/InternalExternalIP.vue +10 -4
- package/components/formatter/MachineSummaryGraph.vue +1 -1
- package/components/formatter/PodsUsage.vue +2 -2
- package/components/formatter/ServiceTargets.vue +26 -7
- package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
- package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
- package/components/formatter/__tests__/InternalExternalIP.test.ts +132 -0
- package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
- package/components/formatter/__tests__/ServiceTargets.test.ts +412 -0
- package/components/nav/Header.vue +4 -0
- package/components/nav/NamespaceFilter.vue +2 -2
- package/components/nav/TopLevelMenu.helper.ts +15 -3
- package/components/nav/TopLevelMenu.vue +22 -6
- package/components/nav/__tests__/Header.test.ts +15 -0
- package/components/nav/__tests__/TopLevelMenu.test.ts +263 -21
- package/components/templates/default.vue +9 -4
- package/components/templates/home.vue +23 -0
- package/components/templates/plain.vue +23 -0
- package/components/templates/standalone.vue +17 -0
- package/composables/useFormValidation.ts +93 -0
- package/composables/useHelmOpResources.test.ts +56 -0
- package/composables/useHelmOpResources.ts +32 -0
- package/composables/useStateColor.test.ts +325 -0
- package/composables/useStateColor.ts +128 -0
- package/composables/useVeeValidateField.test.ts +159 -0
- package/composables/useVeeValidateField.ts +67 -0
- package/config/home-links.js +1 -1
- package/config/labels-annotations.js +1 -0
- package/config/pagination-table-headers.js +18 -1
- package/config/product/explorer.js +17 -4
- package/config/product/manager.js +84 -21
- package/config/router/index.js +16 -0
- package/config/router/navigation-guards/__tests__/authentication.test.ts +130 -0
- package/config/router/navigation-guards/authentication.js +10 -4
- package/config/router/routes.js +26 -6
- package/config/settings.ts +0 -2
- package/config/table-headers.js +23 -5
- package/config/types.js +11 -1
- package/core/__tests__/plugin-products.test.ts +904 -20
- package/core/plugin-products-base.ts +110 -10
- package/core/plugin-products.ts +4 -0
- package/core/plugin-types.ts +194 -31
- package/core/plugin.ts +18 -7
- package/core/productDebugger.js +9 -4
- package/core/types-provisioning.ts +77 -31
- package/core/types.ts +72 -22
- package/detail/__tests__/pod.test.ts +41 -0
- package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +114 -0
- package/detail/__tests__/workload.test.ts +3 -152
- package/detail/catalog.cattle.io.clusterrepo.vue +1 -1
- package/detail/harvesterhci.io.management.cluster.vue +6 -2
- package/detail/pod.vue +1 -1
- package/detail/provisioning.cattle.io.cluster.vue +34 -14
- package/detail/workload/index.vue +12 -55
- package/edit/__tests__/catalog.cattle.io.clusterrepo.test.ts +248 -0
- package/edit/__tests__/fleet.cattle.io.helmop.test.ts +105 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/General.test.ts.snap +6 -0
- package/edit/auditlog.cattle.io.auditpolicy/__tests__/__snapshots__/index.test.ts.snap +1 -0
- package/edit/auth/__tests__/azuread.test.ts +247 -39
- package/edit/auth/__tests__/github.test.ts +234 -0
- package/edit/auth/__tests__/oidc.test.ts +26 -6
- package/edit/auth/__tests__/saml.test.ts +196 -0
- package/edit/auth/azuread.vue +197 -56
- package/edit/auth/github.vue +72 -13
- package/edit/auth/ldap/__tests__/index.test.ts +206 -0
- package/edit/auth/ldap/config.vue +8 -0
- package/edit/auth/ldap/index.vue +75 -1
- package/edit/auth/oidc.vue +119 -73
- package/edit/auth/saml.vue +76 -12
- package/edit/catalog.cattle.io.clusterrepo.vue +140 -32
- package/edit/fleet.cattle.io.helmop.vue +491 -136
- package/edit/management.cattle.io.user.vue +5 -2
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
- package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
- package/edit/networking.k8s.io.ingress/index.vue +75 -20
- package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
- package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +92 -14
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +22 -0
- package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
- package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
- package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
- package/edit/secret/__tests__/ssh.test.ts +5 -6
- package/edit/secret/basic.vue +31 -0
- package/edit/secret/index.vue +68 -17
- package/edit/secret/registry.vue +38 -0
- package/edit/secret/ssh.vue +29 -0
- package/edit/secret/tls.vue +30 -0
- package/edit/service.vue +4 -4
- package/edit/workload/Upgrading.vue +3 -3
- package/edit/workload/__tests__/Upgrading.test.ts +6 -9
- package/edit/workload/mixins/workload.js +2 -1
- package/list/fleet.cattle.io.bundle.vue +7 -104
- package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
- package/list/group.principal.vue +5 -4
- package/list/harvesterhci.io.management.cluster.vue +8 -9
- package/list/management.cattle.io.user.vue +12 -9
- package/list/provisioning.cattle.io.cluster.vue +268 -180
- package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
- package/mixins/__tests__/auth-config.test.ts +90 -0
- package/mixins/__tests__/chart.test.ts +206 -0
- package/mixins/__tests__/resource-fetch-api-pagination.test.ts +48 -0
- package/mixins/auth-config.js +7 -0
- package/mixins/brand.js +2 -1
- package/mixins/chart.js +22 -9
- package/mixins/child-hook.js +12 -6
- package/mixins/create-edit-view/impl.js +5 -3
- package/mixins/resource-fetch-api-pagination.js +62 -6
- package/models/__tests__/catalog.cattle.io.clusterrepo.test.ts +57 -0
- package/models/__tests__/compliance.cattle.io.clusterscan.test.ts +144 -0
- package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
- package/models/__tests__/fleet-application.test.ts +175 -0
- package/models/__tests__/fleet.cattle.io.bundle.test.ts +169 -0
- package/models/__tests__/fleet.cattle.io.helmop.test.ts +84 -0
- package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
- package/models/__tests__/management.cattle.io.node.ts +28 -5
- package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
- package/models/__tests__/namespace.test.ts +36 -0
- package/models/__tests__/provisioning.cattle.io.cluster.test.ts +81 -11
- package/models/__tests__/workload.test.ts +401 -26
- package/models/base-cluster.x-k8s.io.js +26 -0
- package/models/catalog.cattle.io.clusterrepo.js +28 -4
- package/models/cluster.js +1 -1
- package/models/cluster.x-k8s.io.machine.js +4 -22
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
- package/models/cluster.x-k8s.io.machineset.js +2 -20
- package/models/compliance.cattle.io.clusterscan.js +165 -2
- package/models/ext.cattle.io.kubeconfig.ts +4 -7
- package/models/fleet-application.js +7 -1
- package/models/fleet.cattle.io.helmop.js +20 -1
- package/models/management.cattle.io.cluster.js +434 -41
- package/models/management.cattle.io.node.js +50 -7
- package/models/management.cattle.io.nodepool.js +1 -1
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +12 -4
- package/models/pod.js +33 -1
- package/models/provisioning.cattle.io.cluster.js +51 -334
- package/models/rke.cattle.io.etcdsnapshot.js +1 -2
- package/models/workload.js +108 -13
- package/models/workload.service.js +5 -0
- package/package.json +22 -39
- package/pages/__tests__/readme.test.ts +49 -0
- package/pages/about.vue +5 -6
- package/pages/auth/login.vue +0 -35
- package/pages/auth/setup.vue +13 -3
- package/pages/c/_cluster/apps/charts/AppChartCardFooter.vue +2 -2
- package/pages/c/_cluster/apps/charts/AppChartCardSubHeader.vue +10 -1
- package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
- package/pages/c/_cluster/apps/charts/__tests__/index.test.ts +93 -0
- package/pages/c/_cluster/apps/charts/chart.vue +62 -9
- package/pages/c/_cluster/apps/charts/index.vue +48 -10
- package/pages/c/_cluster/apps/charts/install.vue +122 -113
- package/pages/c/_cluster/auth/roles/index.vue +5 -4
- package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
- package/pages/c/_cluster/explorer/index.vue +5 -49
- package/pages/c/_cluster/explorer/workload-dashboard/ByNamespaceSection.vue +31 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByStateSection.vue +138 -0
- package/pages/c/_cluster/explorer/workload-dashboard/ByTypeSection.vue +30 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadCard.vue +155 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadNamespaceCard.vue +142 -0
- package/pages/c/_cluster/explorer/workload-dashboard/WorkloadTypeCard.vue +159 -0
- package/pages/c/_cluster/explorer/workload-dashboard/__tests__/composable.test.ts +561 -0
- package/pages/c/_cluster/explorer/workload-dashboard/composable.ts +440 -0
- package/pages/c/_cluster/explorer/workload-dashboard/index.vue +187 -0
- package/pages/c/_cluster/explorer/workload-dashboard/types.ts +80 -0
- package/pages/c/_cluster/fleet/application/create.vue +187 -136
- package/pages/c/_cluster/fleet/application/index.vue +5 -3
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailBody.vue +338 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/ChartDetailHeader.vue +121 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/chart.vue +369 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/charts.vue +248 -0
- package/pages/c/_cluster/fleet/application/suse-app-collection/credentials.vue +310 -0
- package/pages/c/_cluster/fleet/index.vue +2 -2
- package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
- package/pages/c/_cluster/istio/index.vue +21 -6
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
- package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +815 -2
- package/pages/c/_cluster/uiplugins/index.vue +218 -197
- package/pages/diagnostic.vue +13 -17
- package/pages/fail-whale.vue +30 -7
- package/pages/home.vue +93 -306
- package/pages/readme.vue +88 -0
- package/plugins/clean-html.d.ts +9 -0
- package/plugins/dashboard-store/__tests__/resource-class.test.ts +181 -0
- package/plugins/dashboard-store/actions.js +40 -18
- package/plugins/dashboard-store/resource-class.js +67 -9
- package/plugins/steve/__tests__/actions.test.ts +212 -0
- package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
- package/plugins/steve/actions.js +96 -0
- package/plugins/steve/steve-pagination-utils.ts +12 -4
- package/plugins/steve/subscribe.js +35 -5
- package/rancher-components/Accordion/Accordion.vue +53 -9
- package/rancher-components/Form/Checkbox/Checkbox.vue +14 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
- package/rancher-components/Form/Radio/RadioButton.vue +17 -1
- package/rancher-components/Form/Radio/RadioGroup.vue +10 -0
- package/rancher-components/Pill/RcTag/RcTag.vue +3 -2
- package/rancher-components/RcButton/RcButton.test.ts +140 -1
- package/rancher-components/RcButton/RcButton.vue +126 -17
- package/rancher-components/RcButton/types.ts +3 -0
- package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
- package/rancher-components/RcItemCard/RcItemCard.test.ts +18 -0
- package/rancher-components/RcItemCard/RcItemCard.vue +2 -2
- package/rancher-components/RcSection/RcSection.vue +28 -3
- package/scripts/extension/helm/package/Dockerfile +1 -1
- package/scripts/test-plugins-build.sh +2 -1
- package/store/__tests__/catalog.test.ts +115 -1
- package/store/__tests__/notifications.test.ts +434 -0
- package/store/__tests__/type-map.test.ts +556 -1
- package/store/action-menu.js +8 -3
- package/store/auth.js +1 -1
- package/store/aws.js +27 -16
- package/store/catalog.js +84 -3
- package/store/digitalocean.js +20 -38
- package/store/index.js +2 -0
- package/store/linode.js +25 -40
- package/store/plugins.js +7 -4
- package/store/pnap.js +1 -0
- package/store/type-map.js +111 -29
- package/tsconfig.paths.json +8 -8
- package/types/components/buttonGroup.ts +5 -0
- package/types/kube/kube-api.ts +14 -1
- package/types/rancher/steve.api.ts +12 -12
- package/types/resources/settings.d.ts +2 -1
- package/types/shell/index.d.ts +206 -72
- package/types/store/dashboard-store.types.ts +108 -11
- package/types/store/pagination.types.ts +6 -3
- package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
- package/utils/__tests__/async.test.ts +87 -0
- package/utils/__tests__/auth.test.ts +273 -0
- package/utils/__tests__/aws.test.ts +140 -0
- package/utils/__tests__/banners.test.ts +176 -0
- package/utils/__tests__/chart.test.ts +64 -1
- package/utils/__tests__/color.test.ts +226 -0
- package/utils/__tests__/computed.test.ts +193 -0
- package/utils/__tests__/cspAdaptor.test.ts +163 -0
- package/utils/__tests__/dom.test.ts +81 -0
- package/utils/__tests__/duration.test.ts +176 -0
- package/utils/__tests__/dynamic-importer.test.ts +102 -0
- package/utils/__tests__/fleet-appco.test.ts +312 -0
- package/utils/__tests__/fleet.test.ts +340 -0
- package/utils/__tests__/ingress.test.ts +553 -0
- package/utils/__tests__/kube.test.ts +68 -0
- package/utils/__tests__/monitoring.test.ts +130 -0
- package/utils/__tests__/namespace-filter.test.ts +109 -0
- package/utils/__tests__/object.test.ts +22 -0
- package/utils/__tests__/pagination-utils.test.ts +361 -0
- package/utils/__tests__/parse-externalid.test.ts +137 -0
- package/utils/__tests__/perf-setting.utils.test.ts +98 -0
- package/utils/__tests__/platform.test.ts +91 -0
- package/utils/__tests__/poller-sequential.test.ts +177 -0
- package/utils/__tests__/poller.test.ts +170 -0
- package/utils/__tests__/position.test.ts +237 -0
- package/utils/__tests__/promise.test.ts +346 -0
- package/utils/__tests__/provider.test.ts +51 -1
- package/utils/__tests__/queue.test.ts +232 -0
- package/utils/__tests__/release-notes.test.ts +221 -0
- package/utils/__tests__/router.test.js +254 -1
- package/utils/__tests__/select.test.ts +208 -0
- package/utils/__tests__/settings.test.ts +140 -0
- package/utils/__tests__/sort-utils.test.ts +301 -0
- package/utils/__tests__/string-utils.test.ts +798 -0
- package/utils/__tests__/string.test.ts +23 -1
- package/utils/__tests__/style.test.ts +154 -0
- package/utils/__tests__/svg-filter.test.ts +184 -0
- package/utils/__tests__/time.test.ts +265 -1
- package/utils/__tests__/title.test.ts +47 -0
- package/utils/__tests__/units.test.ts +417 -0
- package/utils/__tests__/versions.test.ts +128 -0
- package/utils/__tests__/width.test.ts +53 -0
- package/utils/__tests__/window.test.ts +158 -0
- package/utils/__tests__/xccdf.test.ts +511 -0
- package/utils/chart.js +36 -0
- package/utils/crypto/__tests__/browserHashUtils.test.ts +98 -0
- package/utils/crypto/__tests__/index.test.ts +144 -0
- package/utils/duration.ts +104 -0
- package/utils/dynamic-content/__tests__/notification-handler.test.ts +196 -0
- package/utils/dynamic-content/info.ts +2 -1
- package/utils/error.js +13 -0
- package/utils/fleet-appco.ts +323 -0
- package/utils/fleet.ts +13 -3
- package/utils/gatekeeper/__tests__/util.test.ts +174 -0
- package/utils/gc/__tests__/gc-interval.test.ts +119 -0
- package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
- package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
- package/utils/gc/__tests__/gc.test.ts +487 -0
- package/utils/ingress.ts +9 -1
- package/utils/object.js +22 -2
- package/utils/pagination-utils.ts +2 -1
- package/utils/provider.ts +12 -0
- package/utils/string.js +25 -2
- package/utils/uiplugins.ts +5 -5
- package/utils/validators/__tests__/cluster-name.test.ts +110 -0
- package/utils/validators/__tests__/container-images.test.ts +104 -0
- package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
- package/utils/validators/__tests__/flow-output.test.ts +91 -0
- package/utils/validators/__tests__/index.test.ts +481 -0
- package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
- package/utils/validators/__tests__/logging-outputs.test.ts +58 -0
- package/utils/validators/__tests__/misc-validators.test.ts +246 -0
- package/utils/validators/__tests__/monitoring-route.test.ts +119 -0
- package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
- package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
- package/utils/validators/__tests__/role-template.test.ts +149 -0
- package/utils/validators/__tests__/service.test.ts +283 -0
- package/utils/validators/__tests__/setting.test.js +32 -0
- package/utils/validators/formRules/__tests__/index.test.ts +50 -0
- package/utils/validators/formRules/index.ts +5 -5
- package/utils/validators/machine-pool.ts +1 -1
- package/utils/validators/setting.js +18 -3
- package/utils/xccdf.ts +415 -0
- package/vue.config.js +1 -1
- package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
- package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
- package/pages/support/index.vue +0 -264
- package/utils/duration.js +0 -43
|
@@ -2,21 +2,68 @@ import { KubeLabelSelector } from '@shell/types/kube/kube-api';
|
|
|
2
2
|
import { PaginationArgs, StorePagination } from '@shell/types/store/pagination.types';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
5
|
+
* @internal
|
|
6
|
+
* Core properties on all findX actions
|
|
6
7
|
*/
|
|
7
|
-
export type
|
|
8
|
+
export type ActionCoreFindOptions = {
|
|
9
|
+
/**
|
|
10
|
+
* Use this to override URL instead of looking up the URL for the type/id
|
|
11
|
+
*/
|
|
8
12
|
url?: string,
|
|
13
|
+
/**
|
|
14
|
+
* Force the request to go to the server instead of checking for a cached value first
|
|
15
|
+
*/
|
|
9
16
|
force?: boolean,
|
|
10
17
|
}
|
|
11
18
|
|
|
12
19
|
/**
|
|
20
|
+
* @internal
|
|
21
|
+
* Args used for find action
|
|
22
|
+
*/
|
|
23
|
+
export interface ActionFindArgs extends ActionCoreFindOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Watch for changes
|
|
26
|
+
*
|
|
27
|
+
* false = no, all other values = yes
|
|
28
|
+
*/
|
|
29
|
+
watch?: boolean,
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
* Whether to invalidate the page cache (default: false)
|
|
33
|
+
*/
|
|
34
|
+
invalidatePageCache?: boolean,
|
|
35
|
+
/**
|
|
36
|
+
* XHR request verbs `get`, `post`, `put`, `delete` (default: get)
|
|
37
|
+
*/
|
|
38
|
+
method?: string,
|
|
39
|
+
/**
|
|
40
|
+
* Used if we want to specify custom headers for the request
|
|
41
|
+
*/
|
|
42
|
+
headers?: object,
|
|
43
|
+
/**
|
|
44
|
+
* Use this to override URL instead of looking up the URL for the type/id
|
|
45
|
+
*/
|
|
46
|
+
url?: string,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* @internal
|
|
13
51
|
* Args used for findAll action
|
|
14
52
|
*/
|
|
15
|
-
export interface ActionFindAllArgs extends
|
|
53
|
+
export interface ActionFindAllArgs extends ActionCoreFindOptions {
|
|
54
|
+
/**
|
|
55
|
+
* Watch for changes
|
|
56
|
+
*
|
|
57
|
+
* false = no, all other values = yes
|
|
58
|
+
*/
|
|
16
59
|
watch?: boolean,
|
|
60
|
+
/**
|
|
61
|
+
* Array of namespaces to filter by (used in url path, not part of pagination params)
|
|
62
|
+
*/
|
|
17
63
|
namespaced?: string[],
|
|
18
64
|
/**
|
|
19
|
-
*
|
|
65
|
+
* @internal
|
|
66
|
+
* Properties that determine and control if resources should be fetched in increments
|
|
20
67
|
*/
|
|
21
68
|
incremental?: {
|
|
22
69
|
/**
|
|
@@ -38,24 +85,32 @@ export interface ActionFindAllArgs extends ActionCoreFindArgs {
|
|
|
38
85
|
*/
|
|
39
86
|
pageByNumber: boolean,
|
|
40
87
|
},
|
|
88
|
+
/**
|
|
89
|
+
* @internal
|
|
90
|
+
* Flag to indicate if this request is coming from a list with manual refresh, which may require different handling in the store
|
|
91
|
+
*/
|
|
41
92
|
hasManualRefresh?: boolean,
|
|
93
|
+
/**
|
|
94
|
+
* Number of records to return per page
|
|
95
|
+
*/
|
|
42
96
|
limit?: number,
|
|
43
97
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
* This is done via the native kube pagination api, not steve
|
|
98
|
+
* @internal
|
|
99
|
+
* Iterate over all pages and return all resources. This is done via the native kube pagination api, not Steve
|
|
47
100
|
*/
|
|
48
101
|
depaginate?: boolean,
|
|
49
102
|
/**
|
|
103
|
+
* @internal
|
|
50
104
|
* Specifies the name to use if we should save the count returned in the paginated request
|
|
51
105
|
*/
|
|
52
106
|
saveCountAs?: string,
|
|
53
107
|
}
|
|
54
108
|
|
|
55
109
|
/**
|
|
110
|
+
* @internal
|
|
56
111
|
* Args used for findPage action
|
|
57
112
|
*/
|
|
58
|
-
export interface ActionFindPageArgs extends
|
|
113
|
+
export interface ActionFindPageArgs extends ActionCoreFindOptions {
|
|
59
114
|
/**
|
|
60
115
|
* Set of pagination settings that creates the url.
|
|
61
116
|
*
|
|
@@ -73,6 +128,7 @@ export interface ActionFindPageArgs extends ActionCoreFindArgs {
|
|
|
73
128
|
*/
|
|
74
129
|
watch?: boolean,
|
|
75
130
|
/**
|
|
131
|
+
* @internal
|
|
76
132
|
* Does this request stem from a list with manual refresh?
|
|
77
133
|
*/
|
|
78
134
|
hasManualRefresh?: boolean,
|
|
@@ -81,6 +137,10 @@ export interface ActionFindPageArgs extends ActionCoreFindArgs {
|
|
|
81
137
|
*/
|
|
82
138
|
transient?: boolean,
|
|
83
139
|
|
|
140
|
+
/**
|
|
141
|
+
* @internal
|
|
142
|
+
* Specifies the name to use if we should save the count returned in the paginated request
|
|
143
|
+
*/
|
|
84
144
|
saveCountAs?: string,
|
|
85
145
|
|
|
86
146
|
/**
|
|
@@ -97,6 +157,14 @@ export interface ActionFindPageArgs extends ActionCoreFindArgs {
|
|
|
97
157
|
}
|
|
98
158
|
|
|
99
159
|
/**
|
|
160
|
+
* @internal
|
|
161
|
+
* Response to the find action
|
|
162
|
+
* resource object returned by the API, or null if not found
|
|
163
|
+
*/
|
|
164
|
+
export type ActionFindResponse<T = any> = T;
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* @internal
|
|
100
168
|
* Response to a transient (not stored in cache) findPage action
|
|
101
169
|
*/
|
|
102
170
|
export type ActionFindPageTransientResponse<T = any> = {
|
|
@@ -105,6 +173,7 @@ export type ActionFindPageTransientResponse<T = any> = {
|
|
|
105
173
|
};
|
|
106
174
|
|
|
107
175
|
/**
|
|
176
|
+
* @internal
|
|
108
177
|
* Response to the findPage action
|
|
109
178
|
*
|
|
110
179
|
* If the request was transient (not stored in cache) this will be an object contain all the details of the request
|
|
@@ -114,20 +183,48 @@ export type ActionFindPageTransientResponse<T = any> = {
|
|
|
114
183
|
export type ActionFindPageResponse<T = any> = ActionFindPageTransientResponse | T[];
|
|
115
184
|
|
|
116
185
|
/**
|
|
117
|
-
* Args used for
|
|
186
|
+
* Args used for findMatching action
|
|
118
187
|
*/
|
|
119
|
-
export interface ActionFindMatchingArgs extends
|
|
188
|
+
export interface ActionFindMatchingArgs extends ActionCoreFindOptions {
|
|
189
|
+
/**
|
|
190
|
+
* Represents the label selector to filter by
|
|
191
|
+
* @example
|
|
192
|
+
* ```
|
|
193
|
+
* {
|
|
194
|
+
* matchLabels: {
|
|
195
|
+
* app: 'my-app',
|
|
196
|
+
* tier: 'frontend'
|
|
197
|
+
* },
|
|
198
|
+
* matchExpressions: [
|
|
199
|
+
* {
|
|
200
|
+
* key: 'environment',
|
|
201
|
+
* operator: 'In',
|
|
202
|
+
* values: ['production', 'staging']
|
|
203
|
+
* }
|
|
204
|
+
* ]
|
|
205
|
+
* }
|
|
206
|
+
* ```
|
|
207
|
+
*/
|
|
120
208
|
labelSelector: KubeLabelSelector,
|
|
209
|
+
/**
|
|
210
|
+
* The single namespace to filter by (used in url path, not part of pagination params)
|
|
211
|
+
*/
|
|
121
212
|
namespaced?: string,
|
|
213
|
+
/**
|
|
214
|
+
* @internal
|
|
215
|
+
* Iterate over all pages and return all resources.
|
|
216
|
+
*/
|
|
122
217
|
depaginate?: boolean
|
|
123
218
|
}
|
|
124
219
|
|
|
125
220
|
/**
|
|
221
|
+
* @internal
|
|
126
222
|
* Response to the findMatching action
|
|
127
223
|
*/
|
|
128
224
|
export type ActionFindMatchingResponse<T = any> = ActionFindPageResponse<T>
|
|
129
225
|
|
|
130
226
|
/**
|
|
227
|
+
* @internal
|
|
131
228
|
* Args used for findLabelSelector action
|
|
132
229
|
*/
|
|
133
|
-
export type ActionFindLabelSelectorArgs = ActionFindPageArgs | ActionFindMatchingArgs;
|
|
230
|
+
export type ActionFindLabelSelectorArgs = Omit<ActionFindPageArgs, 'pagination' | 'namespace'> | ActionFindMatchingArgs;
|
|
@@ -44,13 +44,16 @@ export interface PaginationSort {
|
|
|
44
44
|
* Name of field within the object to sort by
|
|
45
45
|
*/
|
|
46
46
|
field: string,
|
|
47
|
+
/**
|
|
48
|
+
* Sort direction. `true` for ascending, `false` for descending
|
|
49
|
+
*/
|
|
47
50
|
asc: boolean
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
/**
|
|
51
54
|
* Equalities that can be used with a `filter` query param
|
|
52
55
|
*
|
|
53
|
-
* filter=<field><equality><values
|
|
56
|
+
* `filter=<field><equality><values>`
|
|
54
57
|
*
|
|
55
58
|
* For example
|
|
56
59
|
* - filter=a=b
|
|
@@ -143,14 +146,14 @@ type FilterFieldCtorArgs = {
|
|
|
143
146
|
/**
|
|
144
147
|
* Filter the pagination result by these specific fields
|
|
145
148
|
*
|
|
146
|
-
* In format of
|
|
149
|
+
* In format of `<field><equality><value>`
|
|
147
150
|
*
|
|
148
151
|
* For example
|
|
149
152
|
*
|
|
150
153
|
* - metadata.name=test
|
|
151
154
|
* - metadata.namespace!=system
|
|
152
155
|
*
|
|
153
|
-
* These are sub items for @PaginationParam, for example filter=<PaginationFilterField
|
|
156
|
+
* These are sub items for {@link PaginationParam}, for example `filter=<PaginationFilterField>`
|
|
154
157
|
*
|
|
155
158
|
* For more information regarding the API see https://github.com/rancher/steve?tab=readme-ov-file#query-parameters
|
|
156
159
|
*/
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Buffer } from 'buffer';
|
|
2
|
+
import { areRoutesSupportedFormat, canCreate, createDefaultRouteName } from '@shell/utils/alertmanagerconfig';
|
|
3
|
+
|
|
4
|
+
function makeSecret(yaml: string | null): { data: Record<string, string> } {
|
|
5
|
+
if (yaml === null) {
|
|
6
|
+
return { data: {} };
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
return { data: { 'alertmanager.yaml': Buffer.from(yaml).toString('base64') } };
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
describe('alertmanagerconfig utils', () => {
|
|
13
|
+
describe('createDefaultRouteName', () => {
|
|
14
|
+
it.each([
|
|
15
|
+
{
|
|
16
|
+
desc: 'index 0',
|
|
17
|
+
index: 0,
|
|
18
|
+
expected: 'route-0',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
desc: 'index 1',
|
|
22
|
+
index: 1,
|
|
23
|
+
expected: 'route-1',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
desc: 'index 99',
|
|
27
|
+
index: 99,
|
|
28
|
+
expected: 'route-99',
|
|
29
|
+
},
|
|
30
|
+
])('returns $expected for $desc', ({ index, expected }) => {
|
|
31
|
+
expect(createDefaultRouteName(index)).toStrictEqual(expected);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
describe('areRoutesSupportedFormat', () => {
|
|
36
|
+
it('returns true when secret has no data', () => {
|
|
37
|
+
const secret = makeSecret(null);
|
|
38
|
+
|
|
39
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(true);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it('returns true when config has no routes', () => {
|
|
43
|
+
const secret = makeSecret('receivers: []\nroute: {}');
|
|
44
|
+
|
|
45
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(true);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('returns true when all routes are non-empty', () => {
|
|
49
|
+
const yaml = `
|
|
50
|
+
receivers: []
|
|
51
|
+
route:
|
|
52
|
+
routes:
|
|
53
|
+
- receiver: team-a
|
|
54
|
+
match:
|
|
55
|
+
severity: critical
|
|
56
|
+
`;
|
|
57
|
+
const secret = makeSecret(yaml);
|
|
58
|
+
|
|
59
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(true);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
it('returns false when any route is an empty object', () => {
|
|
63
|
+
const yaml = `
|
|
64
|
+
receivers: []
|
|
65
|
+
route:
|
|
66
|
+
routes:
|
|
67
|
+
- {}
|
|
68
|
+
`;
|
|
69
|
+
const secret = makeSecret(yaml);
|
|
70
|
+
|
|
71
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(false);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('returns false when the yaml is invalid', () => {
|
|
75
|
+
const secret = { data: { 'alertmanager.yaml': Buffer.from(': invalid: yaml: {').toString('base64') } };
|
|
76
|
+
|
|
77
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(false);
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it('returns true when routes array is empty', () => {
|
|
81
|
+
const yaml = `
|
|
82
|
+
route:
|
|
83
|
+
routes: []
|
|
84
|
+
`;
|
|
85
|
+
const secret = makeSecret(yaml);
|
|
86
|
+
|
|
87
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('returns false when one of multiple routes is empty', () => {
|
|
91
|
+
const yaml = `
|
|
92
|
+
receivers: []
|
|
93
|
+
route:
|
|
94
|
+
routes:
|
|
95
|
+
- receiver: team-a
|
|
96
|
+
- {}
|
|
97
|
+
`;
|
|
98
|
+
const secret = makeSecret(yaml);
|
|
99
|
+
|
|
100
|
+
expect(areRoutesSupportedFormat(secret)).toStrictEqual(false);
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
describe('canCreate', () => {
|
|
105
|
+
it('returns true when secret type is creatable', () => {
|
|
106
|
+
const rootGetters = { 'type-map/optionsFor': () => ({ isCreatable: true }) };
|
|
107
|
+
|
|
108
|
+
expect(canCreate(rootGetters)).toStrictEqual(true);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('returns false when secret type is not creatable', () => {
|
|
112
|
+
const rootGetters = { 'type-map/optionsFor': () => ({ isCreatable: false }) };
|
|
113
|
+
|
|
114
|
+
expect(canCreate(rootGetters)).toStrictEqual(false);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { waitFor, wait } from '@shell/utils/async';
|
|
2
|
+
|
|
3
|
+
describe('wait', () => {
|
|
4
|
+
it('resolves after the specified delay', async() => {
|
|
5
|
+
jest.useFakeTimers();
|
|
6
|
+
|
|
7
|
+
const p = wait(1000);
|
|
8
|
+
|
|
9
|
+
jest.advanceTimersByTime(1000);
|
|
10
|
+
await expect(p).resolves.toBeUndefined();
|
|
11
|
+
|
|
12
|
+
jest.useRealTimers();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('does not resolve before the delay elapses', async() => {
|
|
16
|
+
jest.useFakeTimers();
|
|
17
|
+
|
|
18
|
+
let resolved = false;
|
|
19
|
+
const p = wait(500).then(() => {
|
|
20
|
+
resolved = true;
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
jest.advanceTimersByTime(499);
|
|
24
|
+
expect(resolved).toBe(false);
|
|
25
|
+
|
|
26
|
+
jest.advanceTimersByTime(1);
|
|
27
|
+
await p;
|
|
28
|
+
expect(resolved).toBe(true);
|
|
29
|
+
|
|
30
|
+
jest.useRealTimers();
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe('waitFor', () => {
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
jest.useRealTimers();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('resolves immediately when testFn returns true on first call', async() => {
|
|
40
|
+
jest.useFakeTimers();
|
|
41
|
+
const testFn = jest.fn().mockReturnValue(true);
|
|
42
|
+
|
|
43
|
+
const p = waitFor(testFn, 'ready');
|
|
44
|
+
|
|
45
|
+
await expect(p).resolves.toBeDefined();
|
|
46
|
+
expect(testFn).toHaveBeenCalledTimes(1);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it('resolves after testFn eventually returns true', async() => {
|
|
50
|
+
jest.useFakeTimers();
|
|
51
|
+
let count = 0;
|
|
52
|
+
const testFn = jest.fn().mockImplementation(() => {
|
|
53
|
+
count++;
|
|
54
|
+
|
|
55
|
+
return count >= 3;
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const p = waitFor(testFn, 'ready', 10000, 500);
|
|
59
|
+
|
|
60
|
+
// first call returns false (immediate check), then intervals fire
|
|
61
|
+
jest.advanceTimersByTime(500); // interval 1 → count=2, false
|
|
62
|
+
jest.advanceTimersByTime(500); // interval 2 → count=3, true
|
|
63
|
+
await p;
|
|
64
|
+
|
|
65
|
+
expect(testFn).toHaveBeenCalledTimes(3);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('rejects with msg when timeout elapses', async() => {
|
|
69
|
+
jest.useFakeTimers();
|
|
70
|
+
const testFn = jest.fn().mockReturnValue(false);
|
|
71
|
+
|
|
72
|
+
const p = waitFor(testFn, 'some condition', 1000, 500);
|
|
73
|
+
|
|
74
|
+
jest.advanceTimersByTime(1001);
|
|
75
|
+
await expect(p).rejects.toThrow('Failed waiting for: some condition');
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it('rejects with generic message when no msg provided and timeout elapses', async() => {
|
|
79
|
+
jest.useFakeTimers();
|
|
80
|
+
const testFn = jest.fn().mockReturnValue(false);
|
|
81
|
+
|
|
82
|
+
const p = waitFor(testFn, '', 2000, 500);
|
|
83
|
+
|
|
84
|
+
jest.advanceTimersByTime(2001);
|
|
85
|
+
await expect(p).rejects.toThrow('waitFor timed out after 2 seconds');
|
|
86
|
+
});
|
|
87
|
+
});
|