@rancher/shell 3.0.12-rc.2 → 3.0.12-rc.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/apis/impl/apis.ts +6 -0
  2. package/apis/index.ts +26 -0
  3. package/apis/intf/resources-api/cluster-api.ts +18 -0
  4. package/apis/intf/resources-api/mgmt-api.ts +15 -0
  5. package/apis/intf/resources-api/resource-base.ts +107 -0
  6. package/apis/intf/resources-api/resource-constants.ts +147 -0
  7. package/apis/intf/resources-api/resources-api.ts +143 -0
  8. package/apis/intf/resources.ts +49 -0
  9. package/apis/intf/{modal.ts → shell-api/modal.ts} +21 -26
  10. package/apis/intf/shell-api/proxy.ts +216 -0
  11. package/apis/intf/{slide-in.ts → shell-api/slide-in.ts} +4 -3
  12. package/apis/intf/{system.ts → shell-api/system.ts} +4 -1
  13. package/apis/intf/shell.ts +12 -6
  14. package/apis/resources/__tests__/resources-api-class.test.ts +550 -0
  15. package/apis/resources/index.ts +22 -0
  16. package/apis/resources/resources-api-class.ts +187 -0
  17. package/apis/shell/__tests__/proxy.test.ts +369 -0
  18. package/apis/shell/index.ts +8 -1
  19. package/apis/shell/modal.ts +4 -1
  20. package/apis/shell/notifications.ts +9 -6
  21. package/apis/shell/proxy.ts +256 -0
  22. package/apis/shell/slide-in.ts +4 -1
  23. package/apis/vue-shim.d.ts +2 -1
  24. package/assets/data/aws-regions.json +4 -0
  25. package/assets/fonts/lato/LatoLatin-Black.woff +0 -0
  26. package/assets/fonts/lato/LatoLatin-Black.woff2 +0 -0
  27. package/assets/fonts/lato/LatoLatin-BlackItalic.woff +0 -0
  28. package/assets/fonts/lato/LatoLatin-BlackItalic.woff2 +0 -0
  29. package/assets/fonts/lato/LatoLatin-Bold.woff +0 -0
  30. package/assets/fonts/lato/LatoLatin-Bold.woff2 +0 -0
  31. package/assets/fonts/lato/LatoLatin-BoldItalic.woff +0 -0
  32. package/assets/fonts/lato/LatoLatin-BoldItalic.woff2 +0 -0
  33. package/assets/fonts/lato/LatoLatin-Heavy.woff +0 -0
  34. package/assets/fonts/lato/LatoLatin-Heavy.woff2 +0 -0
  35. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff +0 -0
  36. package/assets/fonts/lato/LatoLatin-HeavyItalic.woff2 +0 -0
  37. package/assets/fonts/lato/LatoLatin-Italic.woff +0 -0
  38. package/assets/fonts/lato/LatoLatin-Italic.woff2 +0 -0
  39. package/assets/fonts/lato/LatoLatin-Light.woff +0 -0
  40. package/assets/fonts/lato/LatoLatin-Light.woff2 +0 -0
  41. package/assets/fonts/lato/LatoLatin-LightItalic.woff +0 -0
  42. package/assets/fonts/lato/LatoLatin-LightItalic.woff2 +0 -0
  43. package/assets/fonts/lato/LatoLatin-Medium.woff +0 -0
  44. package/assets/fonts/lato/LatoLatin-Medium.woff2 +0 -0
  45. package/assets/fonts/lato/LatoLatin-MediumItalic.woff +0 -0
  46. package/assets/fonts/lato/LatoLatin-MediumItalic.woff2 +0 -0
  47. package/assets/fonts/lato/LatoLatin-Regular.woff +0 -0
  48. package/assets/fonts/lato/LatoLatin-Regular.woff2 +0 -0
  49. package/assets/fonts/lato/LatoLatin-Semibold.woff +0 -0
  50. package/assets/fonts/lato/LatoLatin-Semibold.woff2 +0 -0
  51. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff +0 -0
  52. package/assets/fonts/lato/LatoLatin-SemiboldItalic.woff2 +0 -0
  53. package/assets/styles/base/_variables.scss +2 -0
  54. package/assets/styles/fonts/_fontstack.scss +132 -8
  55. package/assets/translations/en-us.yaml +22 -5
  56. package/chart/monitoring/index.vue +10 -1
  57. package/components/ActionDropdownShell.vue +2 -1
  58. package/components/CruResourceFooter.vue +9 -5
  59. package/components/ExplorerProjectsNamespaces.vue +1 -1
  60. package/components/InstallHelmCharts.vue +2 -2
  61. package/components/LandingPagePreference.vue +14 -5
  62. package/components/Resource/Detail/Metadata/IdentifyingInformation/index.vue +15 -1
  63. package/components/Resource/Detail/Metadata/index.vue +6 -0
  64. package/components/Resource/Detail/ResourcePopover/index.vue +12 -1
  65. package/components/Resource/Detail/SpacedRow.vue +3 -1
  66. package/components/Resource/Detail/TitleBar/index.vue +10 -11
  67. package/components/ResourceList/Masthead.vue +12 -8
  68. package/components/SelectIconGrid.vue +0 -10
  69. package/components/SingleClusterInfo.vue +1 -0
  70. package/components/SortableTable/__tests__/sorting.test.ts +126 -0
  71. package/components/SortableTable/index.vue +6 -9
  72. package/components/SortableTable/selection.js +23 -5
  73. package/components/SortableTable/sorting.js +6 -3
  74. package/components/Wizard.vue +14 -13
  75. package/components/fleet/FleetBundles.vue +100 -12
  76. package/components/fleet/FleetClusterTargets/index.vue +37 -15
  77. package/components/fleet/__tests__/FleetClusterTargets.test.ts +149 -115
  78. package/components/fleet/__tests__/FleetClusters.test.ts +12 -12
  79. package/components/form/LabeledSelect.vue +20 -3
  80. package/components/form/NameNsDescription.vue +11 -0
  81. package/components/form/Security.vue +6 -2
  82. package/components/form/WorkloadPorts.vue +2 -7
  83. package/components/form/__tests__/Security.test.ts +76 -0
  84. package/components/formatter/Autoscaler.vue +4 -4
  85. package/components/formatter/ClusterKubeVersion.vue +27 -0
  86. package/components/formatter/ClusterLink.vue +1 -7
  87. package/components/formatter/ClusterProvider.vue +6 -10
  88. package/components/formatter/FleetSummaryGraph.vue +0 -3
  89. package/components/formatter/MachineSummaryGraph.vue +1 -1
  90. package/components/formatter/PodsUsage.vue +2 -2
  91. package/components/formatter/__tests__/Autoscaler.test.ts +19 -22
  92. package/components/formatter/__tests__/FleetSummaryGraph.test.ts +216 -0
  93. package/components/formatter/__tests__/PodsUsage.test.ts +6 -10
  94. package/components/nav/NamespaceFilter.vue +2 -2
  95. package/components/nav/TopLevelMenu.helper.ts +15 -3
  96. package/components/nav/TopLevelMenu.vue +16 -5
  97. package/components/nav/__tests__/TopLevelMenu.test.ts +145 -21
  98. package/components/templates/home.vue +18 -0
  99. package/components/templates/plain.vue +18 -0
  100. package/components/templates/standalone.vue +17 -0
  101. package/composables/useFormValidation.ts +93 -0
  102. package/composables/useVeeValidateField.test.ts +159 -0
  103. package/composables/useVeeValidateField.ts +67 -0
  104. package/config/pagination-table-headers.js +18 -1
  105. package/config/product/manager.js +82 -21
  106. package/config/router/routes.js +6 -0
  107. package/config/table-headers.js +20 -1
  108. package/config/types.js +2 -1
  109. package/core/__tests__/plugin-products.test.ts +904 -20
  110. package/core/plugin-products-base.ts +107 -7
  111. package/core/plugin-products.ts +4 -0
  112. package/core/plugin-types.ts +111 -1
  113. package/core/plugin.ts +15 -7
  114. package/core/productDebugger.js +9 -4
  115. package/core/types-provisioning.ts +43 -30
  116. package/core/types.ts +57 -20
  117. package/detail/__tests__/pod.test.ts +41 -0
  118. package/detail/harvesterhci.io.management.cluster.vue +6 -2
  119. package/detail/pod.vue +1 -1
  120. package/detail/provisioning.cattle.io.cluster.vue +4 -10
  121. package/edit/auth/__tests__/azuread.test.ts +217 -34
  122. package/edit/auth/azuread.vue +122 -14
  123. package/edit/auth/oidc.vue +2 -2
  124. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +13 -4
  125. package/edit/networking.k8s.io.ingress/RulePath.vue +8 -4
  126. package/edit/networking.k8s.io.ingress/index.vue +75 -20
  127. package/edit/provisioning.cattle.io.cluster/__tests__/MachinePool.test.ts +104 -0
  128. package/edit/provisioning.cattle.io.cluster/index.vue +11 -7
  129. package/edit/provisioning.cattle.io.cluster/rke2.vue +8 -4
  130. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +11 -0
  131. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +37 -4
  132. package/edit/provisioning.cattle.io.cluster/tabs/registries/__tests__/RegistryConfigs.test.ts +132 -7
  133. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +2 -1
  134. package/edit/secret/__tests__/ssh.test.ts +5 -6
  135. package/edit/secret/basic.vue +31 -0
  136. package/edit/secret/index.vue +68 -17
  137. package/edit/secret/registry.vue +38 -0
  138. package/edit/secret/ssh.vue +29 -0
  139. package/edit/secret/tls.vue +30 -0
  140. package/edit/service.vue +4 -4
  141. package/edit/workload/Upgrading.vue +3 -3
  142. package/edit/workload/__tests__/Upgrading.test.ts +6 -9
  143. package/edit/workload/mixins/workload.js +2 -1
  144. package/list/fleet.cattle.io.bundle.vue +7 -104
  145. package/list/fleet.cattle.io.clusterregistrationtoken.vue +20 -0
  146. package/list/provisioning.cattle.io.cluster.vue +262 -180
  147. package/list/utils/management.cattle.io.cluster.utils.ts +128 -0
  148. package/mixins/__tests__/chart.test.ts +112 -0
  149. package/mixins/brand.js +2 -1
  150. package/mixins/chart.js +12 -8
  151. package/mixins/resource-fetch-api-pagination.js +41 -5
  152. package/models/__tests__/ext.cattle.io.kubeconfig.test.ts +67 -67
  153. package/models/__tests__/management.cattle.io.cluster.test.ts +1 -1
  154. package/models/__tests__/management.cattle.io.node.ts +6 -5
  155. package/models/__tests__/management.cattle.io.nodepool.ts +5 -4
  156. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +32 -11
  157. package/models/base-cluster.x-k8s.io.js +26 -0
  158. package/models/cluster.js +1 -1
  159. package/models/cluster.x-k8s.io.machine.js +4 -22
  160. package/models/cluster.x-k8s.io.machinedeployment.js +2 -20
  161. package/models/cluster.x-k8s.io.machineset.js +2 -20
  162. package/models/compliance.cattle.io.clusterscan.js +130 -2
  163. package/models/ext.cattle.io.kubeconfig.ts +4 -7
  164. package/models/fleet-application.js +3 -1
  165. package/models/management.cattle.io.cluster.js +417 -40
  166. package/models/management.cattle.io.node.js +6 -4
  167. package/models/management.cattle.io.nodepool.js +1 -1
  168. package/models/networking.k8s.io.ingress.js +12 -4
  169. package/models/provisioning.cattle.io.cluster.js +47 -330
  170. package/models/rke.cattle.io.etcdsnapshot.js +1 -2
  171. package/package.json +11 -29
  172. package/pages/__tests__/readme.test.ts +49 -0
  173. package/pages/auth/setup.vue +2 -3
  174. package/pages/c/_cluster/apps/charts/__tests__/chart.test.ts +76 -0
  175. package/pages/c/_cluster/apps/charts/chart.vue +60 -8
  176. package/pages/c/_cluster/apps/charts/install.vue +10 -7
  177. package/pages/c/_cluster/explorer/__tests__/index.test.ts +23 -25
  178. package/pages/c/_cluster/explorer/index.vue +5 -49
  179. package/pages/c/_cluster/istio/__tests__/istio.index.test.ts +194 -0
  180. package/pages/c/_cluster/istio/index.vue +21 -6
  181. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -0
  182. package/pages/c/_cluster/uiplugins/__tests__/index.test.ts +719 -2
  183. package/pages/c/_cluster/uiplugins/index.vue +203 -197
  184. package/pages/diagnostic.vue +13 -17
  185. package/pages/fail-whale.vue +18 -0
  186. package/pages/home.vue +77 -260
  187. package/pages/readme.vue +88 -0
  188. package/plugins/dashboard-store/__tests__/resource-class.test.ts +88 -0
  189. package/plugins/dashboard-store/actions.js +40 -18
  190. package/plugins/dashboard-store/resource-class.js +5 -2
  191. package/plugins/steve/__tests__/subscribe.spec.ts +6 -3
  192. package/plugins/steve/steve-pagination-utils.ts +11 -3
  193. package/plugins/steve/subscribe.js +35 -5
  194. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +10 -4
  195. package/rancher-components/Form/LabeledInput/LabeledInput.vue +7 -52
  196. package/rancher-components/RcButton/RcButton.test.ts +37 -1
  197. package/rancher-components/RcButton/RcButton.vue +38 -8
  198. package/rancher-components/RcDropdown/RcDropdownTrigger.vue +10 -8
  199. package/store/__tests__/catalog.test.ts +115 -1
  200. package/store/__tests__/type-map.test.ts +556 -1
  201. package/store/action-menu.js +8 -3
  202. package/store/auth.js +1 -1
  203. package/store/aws.js +27 -16
  204. package/store/catalog.js +27 -3
  205. package/store/digitalocean.js +20 -38
  206. package/store/index.js +2 -0
  207. package/store/linode.js +25 -40
  208. package/store/pnap.js +1 -0
  209. package/store/type-map.js +111 -29
  210. package/tsconfig.paths.json +8 -8
  211. package/types/kube/kube-api.ts +14 -1
  212. package/types/rancher/steve.api.ts +12 -12
  213. package/types/resources/settings.d.ts +2 -1
  214. package/types/shell/index.d.ts +102 -2
  215. package/types/store/dashboard-store.types.ts +108 -11
  216. package/types/store/pagination.types.ts +6 -3
  217. package/utils/__tests__/alertmanagerconfig.test.ts +117 -0
  218. package/utils/__tests__/async.test.ts +87 -0
  219. package/utils/__tests__/aws.test.ts +140 -0
  220. package/utils/__tests__/banners.test.ts +176 -0
  221. package/utils/__tests__/chart.test.ts +64 -1
  222. package/utils/__tests__/color.test.ts +226 -0
  223. package/utils/__tests__/duration.test.ts +140 -0
  224. package/utils/__tests__/fleet.test.ts +340 -0
  225. package/utils/__tests__/ingress.test.ts +553 -0
  226. package/utils/__tests__/kube.test.ts +68 -0
  227. package/utils/__tests__/namespace-filter.test.ts +109 -0
  228. package/utils/__tests__/pagination-utils.test.ts +361 -0
  229. package/utils/__tests__/parse-externalid.test.ts +137 -0
  230. package/utils/__tests__/perf-setting.utils.test.ts +98 -0
  231. package/utils/__tests__/poller-sequential.test.ts +177 -0
  232. package/utils/__tests__/poller.test.ts +170 -0
  233. package/utils/__tests__/promise.test.ts +346 -0
  234. package/utils/__tests__/settings.test.ts +140 -0
  235. package/utils/__tests__/sort-utils.test.ts +301 -0
  236. package/utils/__tests__/string-utils.test.ts +798 -0
  237. package/utils/__tests__/string.test.ts +23 -1
  238. package/utils/__tests__/style.test.ts +154 -0
  239. package/utils/__tests__/svg-filter.test.ts +184 -0
  240. package/utils/__tests__/units.test.ts +417 -0
  241. package/utils/__tests__/versions.test.ts +128 -0
  242. package/utils/__tests__/xccdf.test.ts +391 -0
  243. package/utils/chart.js +36 -0
  244. package/utils/fleet.ts +13 -3
  245. package/utils/gatekeeper/__tests__/util.test.ts +174 -0
  246. package/utils/gc/__tests__/gc-interval.test.ts +119 -0
  247. package/utils/gc/__tests__/gc-root-store.test.ts +225 -0
  248. package/utils/gc/__tests__/gc-route-changed.test.ts +96 -0
  249. package/utils/gc/__tests__/gc.test.ts +487 -0
  250. package/utils/ingress.ts +9 -1
  251. package/utils/pagination-utils.ts +2 -1
  252. package/utils/string.js +25 -2
  253. package/utils/uiplugins.ts +5 -5
  254. package/utils/validators/__tests__/cluster-name.test.ts +110 -0
  255. package/utils/validators/__tests__/cron-schedule.test.ts +79 -0
  256. package/utils/validators/__tests__/index.test.ts +481 -0
  257. package/utils/validators/__tests__/kubernetes-name.test.ts +163 -0
  258. package/utils/validators/__tests__/misc-validators.test.ts +246 -0
  259. package/utils/validators/__tests__/pod-affinity.test.ts +382 -0
  260. package/utils/validators/__tests__/prometheusrule.test.ts +211 -0
  261. package/utils/validators/__tests__/role-template.test.ts +149 -0
  262. package/utils/validators/__tests__/service.test.ts +283 -0
  263. package/utils/validators/__tests__/setting.test.js +32 -0
  264. package/utils/validators/formRules/__tests__/index.test.ts +50 -0
  265. package/utils/validators/formRules/index.ts +5 -5
  266. package/utils/validators/machine-pool.ts +1 -1
  267. package/utils/validators/setting.js +18 -3
  268. package/utils/xccdf.ts +418 -0
  269. package/assets/fonts/lato/lato-v17-latin-700.woff +0 -0
  270. package/assets/fonts/lato/lato-v17-latin-700.woff2 +0 -0
  271. package/assets/fonts/lato/lato-v17-latin-regular.woff +0 -0
  272. package/assets/fonts/lato/lato-v17-latin-regular.woff2 +0 -0
@@ -2511,6 +2511,35 @@ export namespace AUTOSCALER_ENABLED {
2511
2511
  let formatter_72: string;
2512
2512
  export { formatter_72 as formatter };
2513
2513
  }
2514
+ export namespace MGMT_CLUSTER_PROVIDER {
2515
+ let name_128: string;
2516
+ export { name_128 as name };
2517
+ let labelKey_125: string;
2518
+ export { labelKey_125 as labelKey };
2519
+ export let subLabel: string;
2520
+ let value_126: string;
2521
+ export { value_126 as value };
2522
+ let sort_116: string[];
2523
+ export { sort_116 as sort };
2524
+ let search_20: string[];
2525
+ export { search_20 as search };
2526
+ let formatter_73: string;
2527
+ export { formatter_73 as formatter };
2528
+ }
2529
+ export namespace MGMT_CLUSTER_KUBE_VERSION {
2530
+ let name_129: string;
2531
+ export { name_129 as name };
2532
+ let labelKey_126: string;
2533
+ export { labelKey_126 as labelKey };
2534
+ let subLabel_1: string;
2535
+ export { subLabel_1 as subLabel };
2536
+ let sort_117: string;
2537
+ export { sort_117 as sort };
2538
+ let search_21: string;
2539
+ export { search_21 as search };
2540
+ let formatter_74: string;
2541
+ export { formatter_74 as formatter };
2542
+ }
2514
2543
  }
2515
2544
 
2516
2545
  // @shell/config/table-headers.js
@@ -4281,6 +4310,35 @@ export namespace AUTOSCALER_ENABLED {
4281
4310
  let formatter_72: string;
4282
4311
  export { formatter_72 as formatter };
4283
4312
  }
4313
+ export namespace MGMT_CLUSTER_PROVIDER {
4314
+ let name_128: string;
4315
+ export { name_128 as name };
4316
+ let labelKey_125: string;
4317
+ export { labelKey_125 as labelKey };
4318
+ export let subLabel: string;
4319
+ let value_126: string;
4320
+ export { value_126 as value };
4321
+ let sort_116: string[];
4322
+ export { sort_116 as sort };
4323
+ let search_20: string[];
4324
+ export { search_20 as search };
4325
+ let formatter_73: string;
4326
+ export { formatter_73 as formatter };
4327
+ }
4328
+ export namespace MGMT_CLUSTER_KUBE_VERSION {
4329
+ let name_129: string;
4330
+ export { name_129 as name };
4331
+ let labelKey_126: string;
4332
+ export { labelKey_126 as labelKey };
4333
+ let subLabel_1: string;
4334
+ export { subLabel_1 as subLabel };
4335
+ let sort_117: string;
4336
+ export { sort_117 as sort };
4337
+ let search_21: string;
4338
+ export { search_21 as search };
4339
+ let formatter_74: string;
4340
+ export { formatter_74 as formatter };
4341
+ }
4284
4342
  }
4285
4343
 
4286
4344
  // @shell/config/types
@@ -4497,6 +4555,7 @@ export namespace MANAGEMENT {
4497
4555
  export let RKE_TEMPLATE_REVISION: string;
4498
4556
  export let CLUSTER_PROXY_CONFIG: string;
4499
4557
  export let OIDC_CLIENT: string;
4558
+ export let PROXY_ENDPOINT: string;
4500
4559
  }
4501
4560
  export namespace BRAND {
4502
4561
  let SUSE: string;
@@ -4872,6 +4931,7 @@ export namespace MANAGEMENT {
4872
4931
  export let RKE_TEMPLATE_REVISION: string;
4873
4932
  export let CLUSTER_PROXY_CONFIG: string;
4874
4933
  export let OIDC_CLIENT: string;
4934
+ export let PROXY_ENDPOINT: string;
4875
4935
  }
4876
4936
  export namespace BRAND {
4877
4937
  let SUSE: string;
@@ -6040,6 +6100,7 @@ export default class Ingress {
6040
6100
  get useNestedBackendField(): any;
6041
6101
  get serviceNamePath(): "service.name" | "serviceName";
6042
6102
  get servicePortPath(): "service.port.number" | "servicePort";
6103
+ get servicePortNamePath(): "servicePort" | "service.port.name";
6043
6104
  get defaultBackendPath(): "defaultBackend" | "backend";
6044
6105
  get hasDefaultBackend(): boolean;
6045
6106
  get details(): any;
@@ -6103,6 +6164,7 @@ export default class Ingress {
6103
6164
  get useNestedBackendField(): any;
6104
6165
  get serviceNamePath(): "service.name" | "serviceName";
6105
6166
  get servicePortPath(): "service.port.number" | "servicePort";
6167
+ get servicePortNamePath(): "servicePort" | "service.port.name";
6106
6168
  get defaultBackendPath(): "defaultBackend" | "backend";
6107
6169
  get hasDefaultBackend(): boolean;
6108
6170
  get details(): any;
@@ -6223,7 +6285,7 @@ declare namespace _default {
6223
6285
  commit: any;
6224
6286
  dispatch: any;
6225
6287
  state: any;
6226
- }, type: any, compareWatches: any): void;
6288
+ }, payload: any): void;
6227
6289
  export function promptRemove({ commit, state }: {
6228
6290
  commit: any;
6229
6291
  state: any;
@@ -6393,7 +6455,7 @@ declare namespace _default {
6393
6455
  commit: any;
6394
6456
  dispatch: any;
6395
6457
  state: any;
6396
- }, type: any, compareWatches: any): void;
6458
+ }, payload: any): void;
6397
6459
  export function promptRemove({ commit, state }: {
6398
6460
  commit: any;
6399
6461
  state: any;
@@ -8378,6 +8440,16 @@ export function compareChartVersions(v1: string, v2: string): number;
8378
8440
  * @returns {Object} The latest compatible chart version object.
8379
8441
  */
8380
8442
  export function getLatestCompatibleVersion(chart: any, workerOSs: Array<string>, showPrerelease: boolean): any;
8443
+ /**
8444
+ * Builds the route URL for the standalone chart readme page.
8445
+ *
8446
+ * The helper maps chart context into query params so the readme page can fetch
8447
+ * version info directly (instead of relying on local/session storage transfer).
8448
+ */
8449
+ export function getStandaloneReadmeUrl(router: any, { cluster, repoType, repoName, chartName, versionName, deprecated, showAppReadme, hideReadmeFirstTitle, }?: {
8450
+ showAppReadme?: boolean;
8451
+ hideReadmeFirstTitle?: boolean;
8452
+ }): any;
8381
8453
  }
8382
8454
 
8383
8455
  // @shell/utils/chart.js
@@ -8405,6 +8477,16 @@ export function compareChartVersions(v1: string, v2: string): number;
8405
8477
  * @returns {Object} The latest compatible chart version object.
8406
8478
  */
8407
8479
  export function getLatestCompatibleVersion(chart: any, workerOSs: Array<string>, showPrerelease: boolean): any;
8480
+ /**
8481
+ * Builds the route URL for the standalone chart readme page.
8482
+ *
8483
+ * The helper maps chart context into query params so the readme page can fetch
8484
+ * version info directly (instead of relying on local/session storage transfer).
8485
+ */
8486
+ export function getStandaloneReadmeUrl(router: any, { cluster, repoType, repoName, chartName, versionName, deprecated, showAppReadme, hideReadmeFirstTitle, }?: {
8487
+ showAppReadme?: boolean;
8488
+ hideReadmeFirstTitle?: boolean;
8489
+ }): any;
8408
8490
  }
8409
8491
 
8410
8492
  // @shell/utils/clipboard
@@ -10460,6 +10542,14 @@ export function sanitizeIP(v: any): any;
10460
10542
  */
10461
10543
  export function xOfy(x: any, y: any): string;
10462
10544
  export function isBase64(value: any): boolean;
10545
+ /**
10546
+ * Checks if a value is a valid base64-encoded CA bundle.
10547
+ * Unlike isBase64, this handles multiline base64 (e.g. openssl wraps at 76 chars)
10548
+ * and rejects short strings that could be false positives.
10549
+ * @param {string} value
10550
+ * @returns {boolean}
10551
+ */
10552
+ export function isBase64EncodedCert(value: string): boolean;
10463
10553
  export function generateRandomAlphaString(length: any): string;
10464
10554
  /**
10465
10555
  * Generate a key-value nested object from a list of paths that represents a directory tree.
@@ -10526,6 +10616,14 @@ export function sanitizeIP(v: any): any;
10526
10616
  */
10527
10617
  export function xOfy(x: any, y: any): string;
10528
10618
  export function isBase64(value: any): boolean;
10619
+ /**
10620
+ * Checks if a value is a valid base64-encoded CA bundle.
10621
+ * Unlike isBase64, this handles multiline base64 (e.g. openssl wraps at 76 chars)
10622
+ * and rejects short strings that could be false positives.
10623
+ * @param {string} value
10624
+ * @returns {boolean}
10625
+ */
10626
+ export function isBase64EncodedCert(value: string): boolean;
10529
10627
  export function generateRandomAlphaString(length: any): string;
10530
10628
  /**
10531
10629
  * Generate a key-value nested object from a list of paths that represents a directory tree.
@@ -10960,6 +11058,7 @@ export function isServerUrl(value: any): boolean;
10960
11058
  export function isHttps(value: any): any;
10961
11059
  export function isDomainWithoutProtocol(value: any): boolean;
10962
11060
  export function isLocalhost(value: any): boolean;
11061
+ export function isValidUrl(value: any): boolean;
10963
11062
  export function hasTrailingForwardSlash(value: any): any;
10964
11063
  }
10965
11064
 
@@ -10970,6 +11069,7 @@ export function isServerUrl(value: any): boolean;
10970
11069
  export function isHttps(value: any): any;
10971
11070
  export function isDomainWithoutProtocol(value: any): boolean;
10972
11071
  export function isLocalhost(value: any): boolean;
11072
+ export function isValidUrl(value: any): boolean;
10973
11073
  export function hasTrailingForwardSlash(value: any): any;
10974
11074
  }
10975
11075
 
@@ -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
- * Properties on all findX actions
5
+ * @internal
6
+ * Core properties on all findX actions
6
7
  */
7
- export type ActionCoreFindArgs = {
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 ActionCoreFindArgs {
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
- * Should resources be fetched in increments?
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
- * Iterate over all pages and return all resources.
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 ActionCoreFindArgs {
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 findPage action
186
+ * Args used for findMatching action
118
187
  */
119
- export interface ActionFindMatchingArgs extends ActionCoreFindArgs {
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 <field><equality><value>
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
+ });