dashboard-shell-shell 1.0.122 → 1.0.1000000082
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/.DS_Store +0 -0
- package/assets/brand/harvester/favicon.png +0 -0
- package/assets/brand/suse/favicon.png +0 -0
- package/assets/icons/iconfont.css +19 -3
- package/assets/icons/iconfont.js +1 -1
- package/assets/icons/iconfont.json +28 -0
- package/assets/icons/iconfont.ttf +0 -0
- package/assets/icons/iconfont.woff +0 -0
- package/assets/icons/iconfont.woff2 +0 -0
- package/assets/images/pl/half-logo.svg +2 -23
- package/assets/styles/base/_functions.scss +0 -0
- package/assets/styles/base/_mixins.scss +0 -0
- package/assets/styles/base/_variables.scss +1 -1
- package/assets/styles/global/_labeled-input.scss +0 -1
- package/assets/styles/global/_layout.scss +1 -1
- package/assets/styles/global/_select.scss +4 -2
- package/assets/styles/global/_table.scss +5 -0
- package/assets/styles/vendor/vue-select.scss +2 -1
- package/assets/translations/en-us.yaml +1 -1
- package/assets/translations/zh-hans.yaml +25 -15
- package/chart/monitoring/index.vue +3 -1
- package/chart/monitoring/prometheus/index.vue +13 -10
- package/cloud-credential/aws.vue +2 -0
- package/components/ActionDropdown.vue +1 -1
- package/components/ActionDropdownShell.vue +71 -0
- package/components/ActionMenu.vue +2 -2
- package/components/ActionMenuShell.vue +3 -0
- package/components/AppModal.vue +84 -8
- package/components/AssignTo.vue +25 -11
- package/components/AsyncButton.vue +24 -7
- package/components/BannerGraphic.vue +1 -0
- package/components/ButtonDropdown.vue +26 -4
- package/components/ButtonGroup.vue +4 -0
- package/components/ButtonMultiAction.vue +1 -0
- package/components/CodeMirror.vue +19 -6
- package/components/CommunityLinks.vue +3 -3
- package/components/ConsumptionGauge.vue +24 -5
- package/components/CopyToClipboardText.vue +2 -1
- package/components/CruResource.vue +13 -7
- package/components/CruResourceFooter.vue +2 -2
- package/components/DashboardOptions.vue +29 -17
- package/components/DetailText.vue +5 -0
- package/components/DisableAuthProviderModal.vue +1 -0
- package/components/DotState.vue +84 -0
- package/components/ExplorerMembers.vue +1 -1
- package/components/ExplorerProjectsNamespaces.vue +88 -16
- package/components/FixedBanner.vue +19 -12
- package/components/GlobalRoleBindings.vue +5 -1
- package/components/GrafanaDashboard.vue +4 -4
- package/components/GrowlManager.vue +4 -1
- package/components/HardwareResourceGauge.vue +39 -3
- package/components/InfoBox.vue +3 -3
- package/components/InputOrDisplay.vue +28 -2
- package/components/LabelValue.vue +20 -1
- package/components/LandingPagePreference.vue +5 -3
- package/components/LocaleSelector.vue +39 -93
- package/components/ModalManager.vue +55 -0
- package/components/ModalWithCard.vue +13 -3
- package/components/MoveModal.vue +1 -0
- package/components/PodSecurityAdmission.vue +1 -1
- package/components/PromptChangePassword.vue +1 -1
- package/components/PromptModal.vue +16 -3
- package/components/PromptRemove.vue +29 -9
- package/components/PromptRestore.vue +1 -0
- package/components/ResourceCancelModal.vue +1 -0
- package/components/ResourceDetail/Masthead.vue +52 -17
- package/components/ResourceDetail/__tests__/Masthead.test.ts +5 -1
- package/components/ResourceDetail/index.vue +54 -16
- package/components/ResourceList/Masthead.vue +26 -4
- package/components/ResourceList/index.vue +4 -3
- package/components/ResourceTable.vue +1 -0
- package/components/SideNav.vue +20 -15
- package/components/SlideInPanelManager.vue +126 -0
- package/components/SortableTable/THead.vue +10 -4
- package/components/SortableTable/actions.js +1 -1
- package/components/SortableTable/index.vue +542 -553
- package/components/SortableTable/selection.js +2 -13
- package/components/StatusBadge.vue +77 -0
- package/components/Tabbed/Tab.vue +3 -3
- package/components/Tabbed/index.vue +47 -29
- package/components/Wizard.vue +2 -2
- package/components/YamlEditor.vue +1 -1
- package/components/__tests__/AsyncButton.test.ts +2 -2
- package/components/__tests__/FixedBanner.test.ts +3 -3
- package/components/__tests__/ModalManager.spec.ts +176 -0
- package/components/__tests__/SlideInPanelManager.spec.ts +166 -0
- package/components/auth/Principal.vue +10 -3
- package/components/auth/RoleDetailEdit.vue +1 -1
- package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
- package/components/form/ArrayList.vue +123 -85
- package/components/form/ArrayListGrouped.vue +10 -2
- package/components/form/ArrayListSelect.vue +1 -1
- package/components/form/Command.vue +6 -15
- package/components/form/EnvVars.vue +16 -8
- package/components/form/Footer.vue +10 -7
- package/components/form/HealthCheck.vue +3 -3
- package/components/form/HookOption.vue +11 -16
- package/components/form/InputWithSelect.vue +6 -5
- package/components/form/KeyValue.vue +39 -10
- package/components/form/LabeledSelect.vue +73 -77
- package/components/form/Labels.vue +6 -3
- package/components/form/LifecycleHooks.vue +3 -3
- package/components/form/MatchExpressions.vue +42 -17
- package/components/form/NameNsDescription.vue +163 -116
- package/components/form/Networking.vue +20 -12
- package/components/form/NodeAffinity.vue +31 -23
- package/components/form/NodeScheduling.vue +13 -3
- package/components/form/Password.vue +11 -5
- package/components/form/PodAffinity.vue +47 -48
- package/components/form/Probe.vue +68 -66
- package/components/form/ResourceQuota/Namespace.vue +4 -4
- package/components/form/ResourceQuota/NamespaceRow.vue +5 -7
- package/components/form/ResourceQuota/Project.vue +9 -5
- package/components/form/ResourceQuota/ProjectRow.vue +4 -6
- package/components/form/ResourceSelector.vue +7 -9
- package/components/form/SSHKnownHosts/KnownHostsEditDialog.vue +6 -3
- package/components/form/SSHKnownHosts/__tests__/KnownHostsEditDialog.test.ts +12 -1
- package/components/form/SSHKnownHosts/index.vue +16 -2
- package/components/form/Security.vue +54 -56
- package/components/form/Select.vue +44 -7
- package/components/form/ShellInput.vue +5 -1
- package/components/form/SimpleSecretSelector.vue +29 -9
- package/components/form/Tolerations.vue +5 -1
- package/components/form/UnitInput.vue +10 -5
- package/components/form/ValueFromResource.vue +134 -121
- package/components/form/WorkloadPorts.vue +18 -18
- package/components/form/__tests__/ArrayList.test.ts +5 -2
- package/components/form/__tests__/MatchExpressions.test.ts +12 -12
- package/components/form/__tests__/NameNsDescription.test.ts +115 -14
- package/components/form/__tests__/Probe.test.ts +12 -8
- package/components/form/__tests__/SSHKnownHosts.test.ts +11 -0
- package/components/form/__tests__/Select.test.ts +37 -0
- package/components/form/__tests__/UnitInput.test.ts +4 -5
- package/components/formatter/BadgeStateFormatter.vue +8 -5
- package/components/formatter/InternalExternalIP.vue +2 -0
- package/components/formatter/LiveDate.vue +3 -3
- package/components/formatter/SecretData.vue +20 -7
- package/components/nav/Favorite.vue +5 -1
- package/components/nav/Group.vue +18 -4
- package/components/nav/Header.vue +39 -13
- package/components/nav/Jump.vue +7 -0
- package/components/nav/NamespaceFilter.vue +21 -11
- package/components/nav/Pinned.vue +1 -1
- package/components/nav/TopLevelMenu.vue +5 -17
- package/components/nav/Type.vue +30 -33
- package/components/nav/__tests__/TopLevelMenu.test.ts +0 -40
- package/components/rancherResourceDetail/Masthead.vue +769 -0
- package/components/rancherResourceDetail/__tests__/Masthead.test.ts +65 -0
- package/components/rancherResourceDetail/index.vue +591 -0
- package/components/rancherResourceList/Masthead-btn.vue +225 -0
- package/components/rancherResourceList/Masthead.vue +375 -0
- package/components/rancherResourceList/ResourceLoadingIndicator.vue +140 -0
- package/components/rancherResourceList/index.vue +307 -0
- package/components/rancherResourceList/resource-list.config.js +7 -0
- package/components/rancherResourceTable.vue +783 -0
- package/components/rancherSortableTable/THead.vue +561 -0
- package/components/rancherSortableTable/actions.js +153 -0
- package/components/rancherSortableTable/advanced-filtering.js +272 -0
- package/components/rancherSortableTable/debug.js +117 -0
- package/components/rancherSortableTable/filtering.js +290 -0
- package/components/rancherSortableTable/grouping.js +48 -0
- package/components/rancherSortableTable/index.vue +2712 -0
- package/components/rancherSortableTable/paging.js +155 -0
- package/components/rancherSortableTable/selection.js +629 -0
- package/components/rancherSortableTable/sortable-config.ts +4 -0
- package/components/rancherSortableTable/sorting.js +129 -0
- package/components/templates/blank.vue +4 -1
- package/components/templates/default.vue +8 -0
- package/components/templates/home.vue +10 -1
- package/components/templates/plain.vue +10 -1
- package/composables/focusTrap.ts +11 -3
- package/composables/useRuntimeFlag.ts +29 -0
- package/config/private-label.js +15 -10
- package/config/router/routes.js +21 -13
- package/config/store.js +4 -0
- package/config/table-headers.js +3 -2
- package/config/uiplugins.js +5 -1
- package/core/plugin-routes.ts +5 -115
- package/core/plugins.js +1 -1
- package/core/types.ts +23 -2
- package/detail/__tests__/autoscaling.horizontalpodautoscaler.test.ts +84 -23
- package/detail/autoscaling.horizontalpodautoscaler/index.vue +13 -3
- package/detail/provisioning.cattle.io.cluster.vue +72 -6
- package/dialog/AddCustomBadgeDialog.vue +1 -0
- package/dialog/DeactivateDriverDialog.vue +5 -4
- package/dialog/ForceMachineRemoveDialog.vue +6 -3
- package/dialog/GitRepoForceUpdateDialog.vue +1 -1
- package/dialog/ScalePoolDownDialog.vue +2 -2
- package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +16 -3
- package/edit/auth/__tests__/oidc.test.ts +162 -88
- package/edit/auth/azuread.vue +2 -1
- package/edit/auth/github.vue +1 -1
- package/edit/auth/googleoauth.vue +5 -1
- package/edit/auth/ldap/__tests__/config.test.ts +0 -14
- package/edit/auth/ldap/config.vue +0 -24
- package/edit/auth/ldap/index.vue +1 -1
- package/edit/auth/oidc.vue +39 -6
- package/edit/auth/saml.vue +1 -1
- package/edit/autoscaling.horizontalpodautoscaler/metric-identifier.vue +5 -2
- package/edit/cloudcredential.vue +24 -9
- package/edit/fleet.cattle.io.clustergroup.vue +5 -3
- package/edit/fleet.cattle.io.gitrepo.vue +2 -0
- package/edit/logging-flow/Match.vue +1 -1
- package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +40 -9
- package/edit/management.cattle.io.user.vue +28 -3
- package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +19 -19
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +31 -31
- package/edit/monitoring.coreos.com.alertmanagerconfig/routeConfig.vue +36 -12
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/email.vue +6 -6
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +10 -10
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +4 -4
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +4 -4
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/webhook.vue +1 -1
- package/edit/monitoring.coreos.com.receiver/auth.vue +29 -29
- package/edit/monitoring.coreos.com.receiver/types/email.vue +6 -6
- package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +10 -10
- package/edit/monitoring.coreos.com.receiver/types/pagerduty.vue +5 -5
- package/edit/monitoring.coreos.com.receiver/types/slack.vue +4 -4
- package/edit/namespace.vue +1 -2
- package/edit/networking.k8s.io.ingress/IngressClass.vue +7 -3
- package/edit/networking.k8s.io.ingress/RulePath.vue +1 -1
- package/edit/networking.k8s.io.ingress/__tests__/IngressClass.test.ts +58 -0
- package/edit/persistentvolume/__tests__/persistentvolume.test.ts +14 -2
- package/edit/provisioning.cattle.io.cluster/CustomCommand.vue +4 -1
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +26 -9
- package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +8 -10
- package/edit/provisioning.cattle.io.cluster/rke2.vue +31 -40
- package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +5 -2
- package/edit/provisioning.cattle.io.cluster/tabs/AgentConfiguration.vue +6 -1
- package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +33 -2
- package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +3 -3
- package/edit/service.vue +0 -3
- package/edit/token.vue +32 -11
- package/edit/workload/Job.vue +6 -6
- package/edit/workload/__tests__/Job.test.ts +0 -1
- package/edit/workload/index.vue +1 -0
- package/edit/workload/mixins/workload.js +3 -3
- package/initialize/install-plugins.js +2 -1
- package/list/harvesterhci.io.management.cluster.vue +4 -1
- package/list/management.cattle.io.feature.vue +1 -0
- package/list/namespace.vue +3 -1
- package/list/provisioning.cattle.io.cluster.vue +20 -12
- package/list/workload.vue +7 -6
- package/machine-config/__tests__/vmwarevsphere.test.ts +48 -3
- package/machine-config/azure.vue +16 -4
- package/machine-config/vmwarevsphere.vue +16 -0
- package/mixins/resource-fetch.js +2 -1
- package/models/__tests__/logging.banzaicloud.io.flow.test.ts +88 -0
- package/models/__tests__/namespace.test.ts +25 -1
- package/models/cloudcredential.js +5 -0
- package/models/kontainerdriver.js +6 -3
- package/models/logging.banzaicloud.io.flow.js +2 -1
- package/models/management.cattle.io.node.js +3 -3
- package/models/management.cattle.io.setting.js +2 -1
- package/models/namespace.js +4 -5
- package/models/nodedriver.js +6 -3
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/workload.js +4 -1
- package/package.json +1 -1
- package/pages/about.vue +16 -8
- package/pages/account/index.vue +80 -24
- package/pages/account/pri.vue +229 -0
- package/pages/auth/login.vue +195 -44
- package/pages/auth/logout.vue +4 -1
- package/pages/auth/setup.vue +144 -19
- package/pages/auth/verify.vue +13 -8
- package/pages/auth copy/login.vue +595 -0
- package/pages/auth copy/logout.vue +47 -0
- package/pages/auth copy/setup.vue +523 -0
- package/pages/auth copy/verify.vue +203 -0
- package/pages/c/_cluster/_product/namespaces.vue +5 -5
- package/pages/c/_cluster/apps/charts/chart.vue +1 -1
- package/pages/c/_cluster/apps/charts/install.vue +26 -26
- package/pages/c/_cluster/auth/config/index.vue +10 -12
- package/pages/c/_cluster/explorer/EventsTable.vue +38 -33
- package/pages/c/_cluster/explorer/index.vue +17 -15
- package/pages/c/_cluster/istio/index.vue +2 -2
- package/pages/c/_cluster/longhorn/index.vue +1 -1
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/monitoring/monitor/_namespace/_id.vue +4 -2
- package/pages/c/_cluster/monitoring/monitor/create.vue +4 -2
- package/pages/c/_cluster/monitoring/monitor/index.vue +2 -2
- package/pages/c/_cluster/monitoring/route-receiver/_id.vue +4 -2
- package/pages/c/_cluster/monitoring/route-receiver/create.vue +5 -2
- package/pages/c/_cluster/neuvector/index.vue +1 -1
- package/pages/c/_cluster/settings/brand.vue +3 -3
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +8 -10
- package/pages/diagnostic.vue +59 -11
- package/pages/fail-whale.vue +14 -8
- package/pages/home.vue +24 -18
- package/pages/prefs.vue +9 -7
- package/pages/support/index.vue +4 -1
- package/pkg/tsconfig.json +9 -9
- package/pkg/vue.config.js +1 -1
- package/plugins/dashboard-store/normalize.js +3 -1
- package/plugins/dashboard-store/resource-class.js +31 -29
- package/plugins/internal-api/index.ts +37 -0
- package/plugins/internal-api/shared/base-api.ts +13 -0
- package/plugins/internal-api/shell/shell.api.ts +108 -0
- package/promptRemove/management.cattle.io.fleetworkspace.vue +1 -1
- package/promptRemove/management.cattle.io.globalrole.vue +1 -1
- package/promptRemove/management.cattle.io.project.vue +2 -2
- package/promptRemove/management.cattle.io.roletemplate.vue +1 -1
- package/promptRemove/pod.vue +1 -1
- package/public/index.html +2 -1
- package/rancher-components/BadgeState/BadgeState.vue +5 -1
- package/rancher-components/Banner/Banner.vue +8 -2
- package/rancher-components/Card/Card.vue +3 -6
- package/rancher-components/Form/Checkbox/Checkbox.vue +4 -0
- package/rancher-components/Form/LabeledInput/LabeledInput.vue +5 -2
- package/rancher-components/Form/Radio/RadioButton.vue +3 -3
- package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +1 -5
- package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
- package/rancher-components/RcDropdown/RcDropdownItem.vue +1 -2
- package/rancher-components/RcDropdown/RcDropdownMenu.vue +7 -3
- package/rancher-components/RcDropdown/types.ts +1 -0
- package/scripts/clean +0 -0
- package/scripts/extension/bundle +20 -0
- package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +2 -2
- package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -1
- package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
- package/scripts/extension/helm/scripts/package +0 -0
- package/scripts/extension/helm/scripts/patch +0 -0
- package/scripts/extension/helm/scripts/version +0 -0
- package/scripts/extension/helmpatch +44 -31
- package/scripts/extension/parse-tag-name +0 -0
- package/scripts/extension/publish +12 -12
- package/scripts/publish-shell.sh +18 -23
- package/scripts/serve-pkgs +0 -0
- package/scripts/sync-shell-deps +0 -0
- package/scripts/test-plugins-build.sh +4 -6
- package/scripts/typegen.sh +28 -46
- package/server/har-file.js +25 -3
- package/static/favicon.ico +0 -0
- package/static/favicon.png +0 -0
- package/static/loading-indicator.html +2 -2
- package/store/aws.js +9 -2
- package/store/features.js +2 -1
- package/store/i18n.js +3 -3
- package/store/modal.ts +71 -0
- package/store/slideInPanel.ts +47 -0
- package/store/type-map.js +9 -1
- package/types/cloud-shell/index.d.ts +11020 -0
- package/types/global-vue.d.ts +5 -0
- package/types/internal-api/shell/growl.d.ts +25 -0
- package/types/internal-api/shell/modal.d.ts +77 -0
- package/types/internal-api/shell/slideIn.d.ts +15 -0
- package/types/shell/index.d.ts +118 -128
- package/types/vue-shim.d.ts +4 -1
- package/utils/__tests__/object.test.ts +38 -4
- package/utils/__tests__/string.test.ts +2 -2
- package/utils/auth.js +1 -0
- package/utils/banners.js +0 -45
- package/utils/cluster.js +35 -0
- package/utils/color.js +9 -8
- package/utils/error.js +61 -3
- package/utils/errorTranslate.json +450 -30
- package/utils/object.js +46 -6
- package/utils/router.js +22 -1
- package/utils/select.js +26 -3
- package/utils/string.js +9 -8
- package/utils/title.ts +1 -1
- package/utils/validators/machine-pool.ts +20 -0
- package/vue.config.js +7 -2
- package/components/formatter/ExtensionCache.vue +0 -74
- package/components/formatter/Port.vue +0 -24
- package/components/formatter/SecretType.vue +0 -41
- package/types/resources/fleet.d.ts +0 -57
- package/types/resources/pod-security-admission.ts +0 -36
- package/types/resources/settings.d.ts +0 -93
- package/types/resources/userPreferences.d.ts +0 -13
- package/types/vue-shim.d +0 -20
package/utils/router.js
CHANGED
|
@@ -1,5 +1,26 @@
|
|
|
1
1
|
import { INSTALL_REDIRECT_META_KEY } from '@shell/config/router/navigation-guards/install-redirect';
|
|
2
2
|
|
|
3
|
+
export function harvesterhci2cloud(str) {
|
|
4
|
+
return str?.replace('harvesterhci.io', 'cloudhci.io')
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function cloud2harvesterhci(str) {
|
|
8
|
+
// console.log('00099', str)
|
|
9
|
+
// const regex = /[a-z]+cloud.io.(.+)/;
|
|
10
|
+
// if (str?.match(regex)) {
|
|
11
|
+
// return str;
|
|
12
|
+
// }
|
|
13
|
+
return str?.replace('cloudhci.io', 'harvesterhci.io')
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function harvester2cloud(str) {
|
|
17
|
+
return str?.replace('harvester', 'cloud')
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function cloud2harvester(str) {
|
|
21
|
+
return str?.replace('cloud', 'harvester')
|
|
22
|
+
}
|
|
23
|
+
|
|
3
24
|
export function queryParamsFor(current, qp, defaults = {}) {
|
|
4
25
|
const query = Object.assign({}, current || {});
|
|
5
26
|
|
|
@@ -68,7 +89,7 @@ export const getPackageFromRoute = (route) => {
|
|
|
68
89
|
};
|
|
69
90
|
|
|
70
91
|
export const getResourceFromRoute = (to) => {
|
|
71
|
-
let resource = to.params?.resource;
|
|
92
|
+
let resource = cloud2harvesterhci(to.params?.resource);
|
|
72
93
|
|
|
73
94
|
if (!resource) {
|
|
74
95
|
resource = findMeta(to, 'resource');
|
package/utils/select.js
CHANGED
|
@@ -26,8 +26,19 @@ export function onClickOption(option, e) {
|
|
|
26
26
|
// This is a simpler positionner for the dropdown for a select control
|
|
27
27
|
// We used to use popper for these, but it does not suppotr fractional pixel placements which
|
|
28
28
|
// means the dropdown does not appear aligned to the control when placed in a column-based layout
|
|
29
|
-
export function calculatePosition(dropdownList, component, width, placement) {
|
|
29
|
+
export function calculatePosition(dropdownList, component, width, placement, type, isLabel,leftWidth) {
|
|
30
30
|
const selectEl = component.$parent.$el;
|
|
31
|
+
|
|
32
|
+
const labeledContainer = selectEl.querySelector('.labeled-container');
|
|
33
|
+
let labelWidth=0
|
|
34
|
+
if (labeledContainer) {
|
|
35
|
+
labelWidth= labeledContainer.offsetWidth;
|
|
36
|
+
} else {
|
|
37
|
+
console.warn("未找到类名为 labeled-container 的元素");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
31
42
|
const r = selectEl.getBoundingClientRect();
|
|
32
43
|
const p = placement || 'bottom-start';
|
|
33
44
|
const docHeight = document.body.offsetHeight;
|
|
@@ -59,7 +70,19 @@ export function calculatePosition(dropdownList, component, width, placement) {
|
|
|
59
70
|
selectEl.classList.remove('vs__dropdown-up');
|
|
60
71
|
}
|
|
61
72
|
|
|
62
|
-
dropdownList.style.left = `${ r.x }px`;
|
|
73
|
+
// dropdownList.style.left = `${ r.x }px`;
|
|
63
74
|
dropdownList.style.width = 'min-content';
|
|
64
|
-
|
|
75
|
+
// const s = type === 'label'? `${ r.x }px` :`${ r.x + Number(type.split("px")[0]) }px`
|
|
76
|
+
dropdownList.style.left = ((type === 'label') && (!isLabel)) ? `${ (r.x) + labelWidth }px` : `${ r.x + (typeof type === 'string' ? parseFloat(type) : 0) }px`;
|
|
77
|
+
// dropdownList.style.minWidth = type === 'label' ? `${ (r.width) - 160 }px` : `${ r.width }px`;
|
|
78
|
+
console.log(type);
|
|
79
|
+
console.log( r.width);
|
|
80
|
+
if(leftWidth!=='') {
|
|
81
|
+
dropdownList.style.left = leftWidth
|
|
82
|
+
}
|
|
83
|
+
const SelectContainer = selectEl.querySelector('.labeled-select');
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
// dropdownList.style.width = type === 'label' ? '400px' : `${ r.width }px`;
|
|
87
|
+
dropdownList.style.width = type === 'label' ? `${SelectContainer.offsetWidth}px` : `${ r.width- (typeof type === 'string' ? parseFloat(type) : 0) }px`;
|
|
65
88
|
}
|
package/utils/string.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { translateError } from "@shell/utils/error";
|
|
2
|
+
|
|
1
3
|
export function camelToTitle(str) {
|
|
2
4
|
return dasherize((str || '')).split('-').map((str) => {
|
|
3
5
|
return ucFirst(str);
|
|
@@ -151,11 +153,9 @@ export function pluralize(str) {
|
|
|
151
153
|
}
|
|
152
154
|
}
|
|
153
155
|
|
|
154
|
-
export function resourceNames(names, t,
|
|
156
|
+
export function resourceNames(names, plusMore, t, endString) {
|
|
155
157
|
const MAX_NAMES_COUNT = 5;
|
|
156
158
|
|
|
157
|
-
let { plusMore, endString } = options;
|
|
158
|
-
|
|
159
159
|
// plusMore default value
|
|
160
160
|
if (!plusMore) {
|
|
161
161
|
plusMore = t('promptRemove.andOthers', { count: names.length > MAX_NAMES_COUNT ? names.length - MAX_NAMES_COUNT : 0 });
|
|
@@ -163,19 +163,19 @@ export function resourceNames(names, t, options = {}) {
|
|
|
163
163
|
|
|
164
164
|
// endString default value
|
|
165
165
|
if (!endString) {
|
|
166
|
-
endString = endString === false ? ' ' : '
|
|
166
|
+
endString = endString === false ? ' ' : '?';
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
return names.reduce((res, name, i) => {
|
|
170
170
|
if (i < MAX_NAMES_COUNT) {
|
|
171
|
-
res += `<
|
|
171
|
+
res += `<span>${ escapeHtml( name ) }</span>`;
|
|
172
172
|
|
|
173
173
|
if (i === names.length - 1) {
|
|
174
174
|
res += endString;
|
|
175
175
|
} else if (i === names.length - 2) {
|
|
176
|
-
res += names.length <= 5 ?
|
|
176
|
+
res += names.length <= 5 ? ' 和 ' : '';
|
|
177
177
|
} else {
|
|
178
|
-
res += i < MAX_NAMES_COUNT - 1 ?
|
|
178
|
+
res += i < MAX_NAMES_COUNT - 1 ? ' , ' : '';
|
|
179
179
|
}
|
|
180
180
|
}
|
|
181
181
|
|
|
@@ -284,7 +284,8 @@ export function ensureRegex(strOrRegex, exact = true) {
|
|
|
284
284
|
}
|
|
285
285
|
|
|
286
286
|
export function nlToBr(value) {
|
|
287
|
-
|
|
287
|
+
|
|
288
|
+
return translateError(escapeHtml(value || '').replace(/(\r\n|\r|\n)/g, '<br/>\n'));
|
|
288
289
|
}
|
|
289
290
|
|
|
290
291
|
const quotedMatch = /[^."']+|"([^"]*)"|'([^']*)'/g;
|
package/utils/title.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export function updatePageTitle(...breadcrumb: (string | null | undefined | false)[]): void {
|
|
2
|
-
document.title = breadcrumb.filter((s) => s).join(' - ');
|
|
2
|
+
document.title = breadcrumb.filter((s) => s).join(' - ').replace(/<i[^>]*>|<\/i>/g, '').replace('Harvester', 'HCI');
|
|
3
3
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
const FIELDS = {
|
|
2
|
+
NAME: 'pool.name',
|
|
3
|
+
QUANTITY: 'pool.quantity'
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
const RULESETS = [
|
|
7
|
+
{
|
|
8
|
+
path: FIELDS.QUANTITY,
|
|
9
|
+
rules: ['requiredInt', 'isPositive'],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
path: FIELDS.NAME,
|
|
13
|
+
rules: ['required'],
|
|
14
|
+
}
|
|
15
|
+
];
|
|
16
|
+
|
|
17
|
+
export const MACHINE_POOL_VALIDATION = {
|
|
18
|
+
FIELDS,
|
|
19
|
+
RULESETS
|
|
20
|
+
};
|
package/vue.config.js
CHANGED
|
@@ -58,6 +58,11 @@ const getShellPaths = (dir) => {
|
|
|
58
58
|
COMPONENTS_DIR = path.join(dir, 'pkg', 'rancher-components', 'src', 'components');
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
if (fs.existsSync(path.join(dir, 'cloud-shell'))) {
|
|
62
|
+
SHELL_ABS = path.join(dir, 'cloud-shell');
|
|
63
|
+
COMPONENTS_DIR = path.join(dir, 'pkg', 'rancher-components', 'src', 'components');
|
|
64
|
+
}
|
|
65
|
+
|
|
61
66
|
return { SHELL_ABS, COMPONENTS_DIR };
|
|
62
67
|
};
|
|
63
68
|
|
|
@@ -157,7 +162,7 @@ const getLoaders = (SHELL_ABS) => [
|
|
|
157
162
|
test: /\.m?[tj]sx?$/,
|
|
158
163
|
// This excludes no modules except for node_modules/@rancher/... so that plugins can properly compile
|
|
159
164
|
// when referencing @rancher/shell
|
|
160
|
-
exclude: /node_modules\/(?!(
|
|
165
|
+
exclude: /node_modules\/(?!(dashboard-shell-shell)\/).*/,
|
|
161
166
|
use: [
|
|
162
167
|
{
|
|
163
168
|
loader: 'cache-loader',
|
|
@@ -574,4 +579,4 @@ module.exports = function(dir, appConfig = {}) {
|
|
|
574
579
|
};
|
|
575
580
|
|
|
576
581
|
return config;
|
|
577
|
-
};
|
|
582
|
+
};
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { BadgeState } from '@components/BadgeState';
|
|
3
|
-
import { stateDisplay } from '@shell/plugins/dashboard-store/resource-class';
|
|
4
|
-
|
|
5
|
-
export default {
|
|
6
|
-
props: {
|
|
7
|
-
value: {
|
|
8
|
-
type: String,
|
|
9
|
-
default: ''
|
|
10
|
-
}
|
|
11
|
-
},
|
|
12
|
-
|
|
13
|
-
components: { BadgeState },
|
|
14
|
-
|
|
15
|
-
data() {
|
|
16
|
-
const STATES = {
|
|
17
|
-
cached: {
|
|
18
|
-
color: 'info', icon: 'dot-open', label: 'Cached', compoundIcon: 'checkmark'
|
|
19
|
-
},
|
|
20
|
-
pending: {
|
|
21
|
-
color: 'warning', icon: 'tag', label: 'In Progress', compoundIcon: 'info'
|
|
22
|
-
},
|
|
23
|
-
disabled: {
|
|
24
|
-
color: 'error', icon: 'dot-half', label: 'Cache Disabled', compoundIcon: 'info'
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
|
|
28
|
-
return {
|
|
29
|
-
STATES,
|
|
30
|
-
stateDisplay: '',
|
|
31
|
-
stateBackground: ''
|
|
32
|
-
};
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
watch: {
|
|
36
|
-
value: {
|
|
37
|
-
handler() {
|
|
38
|
-
const out = this.value || 'pending';
|
|
39
|
-
const color = this.colorForState(out);
|
|
40
|
-
|
|
41
|
-
this.stateDisplay = stateDisplay(out);
|
|
42
|
-
this.stateBackground = color.replace('text-', 'bg-');
|
|
43
|
-
},
|
|
44
|
-
immediate: true
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
|
|
48
|
-
methods: {
|
|
49
|
-
colorForState(state) {
|
|
50
|
-
const key = (state).toLowerCase();
|
|
51
|
-
let color;
|
|
52
|
-
|
|
53
|
-
if ( this.STATES[key] && this.STATES[key].color ) {
|
|
54
|
-
color = this.STATES[key].color;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if ( !color ) {
|
|
58
|
-
color = 'info';
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
return `text-${ color }`;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
</script>
|
|
66
|
-
|
|
67
|
-
<template>
|
|
68
|
-
<div>
|
|
69
|
-
<BadgeState
|
|
70
|
-
:color="stateBackground"
|
|
71
|
-
:label="stateDisplay"
|
|
72
|
-
/>
|
|
73
|
-
</div>
|
|
74
|
-
</template>
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
export default {
|
|
3
|
-
props: {
|
|
4
|
-
value: {
|
|
5
|
-
type: Array,
|
|
6
|
-
default: () => []
|
|
7
|
-
}
|
|
8
|
-
},
|
|
9
|
-
data() {
|
|
10
|
-
const { hostPort = '', protocol = '' } = this.value[0] || {};
|
|
11
|
-
|
|
12
|
-
return { hostPort, protocol };
|
|
13
|
-
}
|
|
14
|
-
};
|
|
15
|
-
</script>
|
|
16
|
-
|
|
17
|
-
<template>
|
|
18
|
-
<div v-if="hostPort">
|
|
19
|
-
{{ hostPort+'/'+protocol }}
|
|
20
|
-
</div>
|
|
21
|
-
<div v-else>
|
|
22
|
-
—
|
|
23
|
-
</div>
|
|
24
|
-
</template>
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
import { SERVICE_ACCOUNT } from '@shell/config/types';
|
|
3
|
-
export default {
|
|
4
|
-
props: {
|
|
5
|
-
value: {
|
|
6
|
-
type: [String, Object],
|
|
7
|
-
default: 'Opaque'
|
|
8
|
-
}
|
|
9
|
-
},
|
|
10
|
-
data() {
|
|
11
|
-
if (this.value.typeDisplay) {
|
|
12
|
-
this.findServiceAccount();
|
|
13
|
-
|
|
14
|
-
return { typeDisplay: this.value.typeDisplay, serviceAccountLink: null };
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return { typeDisplay: this.value, serviceAccountLink: null };
|
|
18
|
-
},
|
|
19
|
-
methods: {
|
|
20
|
-
async findServiceAccount() {
|
|
21
|
-
const serviceAccount = await this.$store.dispatch('cluster/find', { type: SERVICE_ACCOUNT, id: this.value.serviceAccountID });
|
|
22
|
-
|
|
23
|
-
if (serviceAccount) {
|
|
24
|
-
this.serviceAccountLink = serviceAccount.detailLocation;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
</script>>
|
|
30
|
-
|
|
31
|
-
<template>
|
|
32
|
-
<router-link
|
|
33
|
-
v-if="serviceAccountLink"
|
|
34
|
-
:to="serviceAccountLink"
|
|
35
|
-
>
|
|
36
|
-
{{ typeDisplay }}
|
|
37
|
-
</router-link>
|
|
38
|
-
<div v-else>
|
|
39
|
-
{{ typeDisplay }}
|
|
40
|
-
</div>
|
|
41
|
-
</template>
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
export interface BundleResourceKey {
|
|
2
|
-
kind: string,
|
|
3
|
-
apiVersion: string,
|
|
4
|
-
namespace?: string,
|
|
5
|
-
name: string,
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export interface BundleDeploymentResource extends BundleResourceKey {
|
|
9
|
-
createdAt?: string,
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export interface BundleModifiedResource extends BundleResourceKey {
|
|
13
|
-
missing?: boolean,
|
|
14
|
-
delete?: boolean,
|
|
15
|
-
patch: string,
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface BundleNonReadyResource extends BundleResourceKey {
|
|
19
|
-
summary: { [state: string]: string }
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export interface BundleNonReadyBundle {
|
|
23
|
-
modifiedStatus: BundleModifiedResource[],
|
|
24
|
-
nonReadyStatus: BundleNonReadyResource[],
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface Condition {
|
|
28
|
-
status: string,
|
|
29
|
-
type: string,
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export interface BundleDeploymentStatus {
|
|
33
|
-
resources?: BundleDeploymentResource[],
|
|
34
|
-
modifiedStatus?: BundleModifiedResource[],
|
|
35
|
-
nonReadyStatus?: BundleNonReadyResource[],
|
|
36
|
-
appliedDeploymentId?: string,
|
|
37
|
-
ready: boolean
|
|
38
|
-
nonModified: boolean
|
|
39
|
-
conditions: Condition[],
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export interface BundleStatusSummary {
|
|
43
|
-
nonReadyResources?: BundleNonReadyBundle[],
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface BundleStatus {
|
|
47
|
-
resourceKey?: BundleResourceKey[],
|
|
48
|
-
summary?: BundleStatusSummary,
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export interface BundleDeployment {
|
|
52
|
-
spec: {
|
|
53
|
-
deploymentId: string,
|
|
54
|
-
stagedDeploymentId: string,
|
|
55
|
-
}
|
|
56
|
-
status?: BundleDeploymentStatus
|
|
57
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Mode Description
|
|
3
|
-
* - 'enforce': Policy violations will cause the pod to be rejected.
|
|
4
|
-
* - 'audit': Policy violations will trigger the addition of an audit annotation to the event recorded in the audit log, but are otherwise allowed.
|
|
5
|
-
* - 'warn': Policy violations will trigger a user-facing warning, but are otherwise allowed.
|
|
6
|
-
*/
|
|
7
|
-
export type PSAMode = 'enforce' | 'audit' | 'warn';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Pod Security admission places requirements on a Pod's Security Context and other related fields according to the three levels defined by the Pod Security Standards:
|
|
11
|
-
* privileged, baseline, and restricted.
|
|
12
|
-
* Refer to the Pod Security Standards page for an in-depth look at those requirements.
|
|
13
|
-
*/
|
|
14
|
-
export type PSALevel = 'privileged' | 'baseline' | 'restricted';
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Usernames: requests from users with an exempt authenticated (or impersonated) username are ignored.
|
|
18
|
-
* RuntimeClassNames: pods and workload resources specifying an exempt runtime class name are ignored.
|
|
19
|
-
* Namespaces: pods and workload resources in an exempt namespace are ignored.
|
|
20
|
-
*/
|
|
21
|
-
export type PSADimension = 'usernames' | 'runtimeClasses' | 'namespaces'
|
|
22
|
-
|
|
23
|
-
export type PSADefaults = Record<PSAMode, PSALevel>
|
|
24
|
-
export type PSAExemptions = Record<PSADimension, string[]>
|
|
25
|
-
|
|
26
|
-
export interface PSAConfig {
|
|
27
|
-
defaults: PSADefaults,
|
|
28
|
-
exemptions: PSAExemptions
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface PSA {
|
|
32
|
-
configuration: PSAConfig,
|
|
33
|
-
metadata: {
|
|
34
|
-
labels: Record<string, string>
|
|
35
|
-
}
|
|
36
|
-
}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
export interface PaginationSettingsStore {
|
|
3
|
-
[name: string]: {
|
|
4
|
-
resources: {
|
|
5
|
-
/**
|
|
6
|
-
* Enable for all resources in this store
|
|
7
|
-
*/
|
|
8
|
-
enableAll: boolean,
|
|
9
|
-
enableSome: {
|
|
10
|
-
/**
|
|
11
|
-
* Specific resource type to enable
|
|
12
|
-
*/
|
|
13
|
-
enabled: (string | { resource: string, context: string[]})[],
|
|
14
|
-
/**
|
|
15
|
-
* There's no hardcoded headers or custom list for the resource type, headers will be generated from schema attributes.columns
|
|
16
|
-
*/
|
|
17
|
-
generic: boolean,
|
|
18
|
-
},
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Settings to handle server side pagination
|
|
25
|
-
*/
|
|
26
|
-
export interface PaginationSettings {
|
|
27
|
-
/**
|
|
28
|
-
* Global setting to enable or disable
|
|
29
|
-
*/
|
|
30
|
-
enabled: boolean,
|
|
31
|
-
/**
|
|
32
|
-
* Override `stores` and apply pagination to a set of default resource types that can change between versions
|
|
33
|
-
*/
|
|
34
|
-
useDefaultStores: boolean,
|
|
35
|
-
/**
|
|
36
|
-
* Should pagination be enabled for resources in a store
|
|
37
|
-
*/
|
|
38
|
-
stores: PaginationSettingsStore | undefined
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
type Links = {
|
|
42
|
-
remove: string;
|
|
43
|
-
self: string;
|
|
44
|
-
update: string;
|
|
45
|
-
view: string;
|
|
46
|
-
};
|
|
47
|
-
|
|
48
|
-
type FieldsV1 = {
|
|
49
|
-
'f:customized': {};
|
|
50
|
-
'f:default': {};
|
|
51
|
-
'f:source': {};
|
|
52
|
-
'f:value': {};
|
|
53
|
-
};
|
|
54
|
-
|
|
55
|
-
type ManagedFields = {
|
|
56
|
-
apiVersion: string;
|
|
57
|
-
fieldsType: string;
|
|
58
|
-
fieldsV1: FieldsV1;
|
|
59
|
-
manager: string;
|
|
60
|
-
operation: string;
|
|
61
|
-
time: string;
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
type Metadata = {
|
|
65
|
-
creationTimestamp: string;
|
|
66
|
-
fields: string[];
|
|
67
|
-
generation: number;
|
|
68
|
-
managedFields: ManagedFields[];
|
|
69
|
-
name: string;
|
|
70
|
-
relationships: null;
|
|
71
|
-
resourceVersion: string;
|
|
72
|
-
state: {
|
|
73
|
-
error: boolean;
|
|
74
|
-
message: string;
|
|
75
|
-
name: string;
|
|
76
|
-
transitioning: boolean;
|
|
77
|
-
};
|
|
78
|
-
uid: string;
|
|
79
|
-
};
|
|
80
|
-
|
|
81
|
-
export type Setting = {
|
|
82
|
-
id: string;
|
|
83
|
-
type: string;
|
|
84
|
-
links: Links;
|
|
85
|
-
apiVersion: string;
|
|
86
|
-
customized: boolean;
|
|
87
|
-
default: string;
|
|
88
|
-
kind: string;
|
|
89
|
-
metadata: Metadata;
|
|
90
|
-
source: string;
|
|
91
|
-
value: string | null;
|
|
92
|
-
save: () => void;
|
|
93
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export interface UserPreferences {
|
|
2
|
-
'after-login-route': string,
|
|
3
|
-
cluster: string,
|
|
4
|
-
'group-by': string,
|
|
5
|
-
'home-page-cards': string,
|
|
6
|
-
'last-namespace': string,
|
|
7
|
-
'last-visited': string,
|
|
8
|
-
'ns-by-cluster': string,
|
|
9
|
-
provisioner: string,
|
|
10
|
-
'read-whatsnew': string,
|
|
11
|
-
'seen-whatsnew': string,
|
|
12
|
-
theme: string,
|
|
13
|
-
}
|
package/types/vue-shim.d
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
declare module '*.vue' {
|
|
2
|
-
import Vue from 'vue';
|
|
3
|
-
export default Vue;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
// This is required to keep typescript from complaining. It is required for
|
|
7
|
-
// our i18n plugin. For more info see:
|
|
8
|
-
// https://v2.vuejs.org/v2/guide/typescript.html?redirect=true#Augmenting-Types-for-Use-with-Plugins
|
|
9
|
-
declare module 'vue/types/vue' {
|
|
10
|
-
// eslint-disable-next-line no-unused-vars
|
|
11
|
-
interface Vue {
|
|
12
|
-
/**
|
|
13
|
-
* Lookup a given string with the given arguments
|
|
14
|
-
* @param raw if set, do not do HTML escaping.
|
|
15
|
-
*/
|
|
16
|
-
t: (key: string, args?: Record<string, any>, raw?: boolean) => string,
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
declare module 'js-yaml';
|