@rancher/shell 0.5.3 → 2.0.0

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 (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -0,0 +1,549 @@
1
+ import Vue from 'vue';
2
+ import { updatePageTitle } from '@shell/utils/title';
3
+ import { getVendor } from '@shell/config/private-label';
4
+ import middleware from '@shell/config/middleware.js';
5
+ import { withQuery } from 'ufo';
6
+
7
+ // Global variable used on mount, updated on route change and used in the render function
8
+ let app;
9
+
10
+ /**
11
+ * Add error handler debugging capabilities
12
+ * @param {*} vueApp Vue instance
13
+ */
14
+ export const loadDebugger = (vueApp) => {
15
+ const debug = process.env.dev;
16
+
17
+ if (debug) {
18
+ const defaultErrorHandler = vueApp.config.errorHandler;
19
+
20
+ vueApp.config.errorHandler = async(err, vm, info, ...rest) => {
21
+ // Call other handler if exist
22
+ let handled = null;
23
+
24
+ if (typeof defaultErrorHandler === 'function') {
25
+ handled = defaultErrorHandler(err, vm, info, ...rest);
26
+ }
27
+ if (handled === true) {
28
+ return handled;
29
+ }
30
+
31
+ if (vm && vm.$root) {
32
+ const globalApp = Object.keys(window.$globalApp)
33
+ .find((instance) => vm.$root[instance]);
34
+
35
+ // Show Nuxt Error Page
36
+ if (globalApp && vm.$root[globalApp].error && info !== 'render function') {
37
+ const vueApp = vm.$root[globalApp];
38
+
39
+ vueApp.error(err);
40
+ }
41
+ }
42
+
43
+ if (typeof defaultErrorHandler === 'function') {
44
+ return handled;
45
+ }
46
+
47
+ // Log to console
48
+ if (process.env.NODE_ENV !== 'production') {
49
+ console.error(err); // eslint-disable-line no-console
50
+ } else {
51
+ console.error(err.message || err); // eslint-disable-line no-console
52
+ }
53
+ };
54
+ }
55
+ };
56
+
57
+ /**
58
+ * Handle errors with a redirect
59
+ * @param {*} context
60
+ * @param {*} message
61
+ */
62
+ const errorRedirect = (context, message) => {
63
+ context.$store.commit('setError', { error: new Error(message) });
64
+ context.$router.replace('/fail-whale');
65
+ };
66
+
67
+ /**
68
+ * TODO: Define this logic use case
69
+ * @param {*} fn
70
+ * @param {*} context
71
+ * @returns
72
+ */
73
+ export const promisify = (fn, context) => {
74
+ let promise;
75
+
76
+ if (fn.length === 2) {
77
+ console.warn('Callback-based fetch or middleware calls are deprecated. Please switch to promises or async/await syntax'); // eslint-disable-line no-console
78
+
79
+ // fn(context, callback)
80
+ promise = new Promise((resolve) => {
81
+ fn(context, (err, data) => {
82
+ if (err) {
83
+ context.error(err);
84
+ }
85
+ data = data || {};
86
+ resolve(data);
87
+ });
88
+ });
89
+ } else {
90
+ promise = fn(context);
91
+ }
92
+
93
+ if (promise && promise instanceof Promise && typeof promise.then === 'function') {
94
+ return promise;
95
+ }
96
+
97
+ return Promise.resolve(promise);
98
+ };
99
+
100
+ /**
101
+ * TODO: Define this logic use case
102
+ * @param {*} promises
103
+ * @param {*} appContext
104
+ * @returns
105
+ */
106
+ export const middlewareSeries = (promises, appContext) => {
107
+ if (!promises.length || appContext._redirected || appContext._errored) {
108
+ return Promise.resolve();
109
+ }
110
+
111
+ return promisify(promises[0], appContext)
112
+ .then(() => {
113
+ return middlewareSeries(promises.slice(1), appContext);
114
+ });
115
+ };
116
+
117
+ /**
118
+ * Add middleware to the Vue instance
119
+ * @param {*} Components List of Vue components
120
+ * @param {*} context App context
121
+ * @returns
122
+ */
123
+ function callMiddleware(Components, context) {
124
+ let midd = [];
125
+ let unknownMiddleware = false;
126
+
127
+ Components.forEach((Component) => {
128
+ if (Component.options.middleware) {
129
+ midd = midd.concat(Component.options.middleware);
130
+ }
131
+ });
132
+
133
+ midd = midd.map((name) => {
134
+ if (typeof name === 'function') {
135
+ return name;
136
+ }
137
+ if (typeof middleware[name] !== 'function') {
138
+ unknownMiddleware = true;
139
+ errorRedirect(this, new Error(`500: Unknown middleware ${ name }`));
140
+ }
141
+
142
+ return middleware[name];
143
+ });
144
+
145
+ if (unknownMiddleware) {
146
+ return;
147
+ }
148
+
149
+ return middlewareSeries(midd, context);
150
+ }
151
+
152
+ export const globalHandleError = (error) => Vue.config.errorHandler && Vue.config.errorHandler(error);
153
+
154
+ /**
155
+ * Render function used by the router guards
156
+ * @param {*} to Route
157
+ * @param {*} from Route
158
+ * @param {*} next callback
159
+ * @param {*} app
160
+ * @returns
161
+ */
162
+ async function render(to, from, next) {
163
+ if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
164
+ return next();
165
+ }
166
+
167
+ // nextCalled is true when redirected
168
+ let nextCalled = false;
169
+ const _next = (path) => {
170
+ if (from.path === path.path && this.$loading.finish) {
171
+ this.$loading.finish();
172
+ }
173
+
174
+ if (from.path !== path.path && this.$loading.pause) {
175
+ this.$loading.pause();
176
+ }
177
+
178
+ if (nextCalled) {
179
+ return;
180
+ }
181
+
182
+ nextCalled = true;
183
+ next(path);
184
+ };
185
+
186
+ // Update context
187
+ await setContext(app, {
188
+ route: to,
189
+ from,
190
+ next: _next.bind(this)
191
+ });
192
+
193
+ // Get route's matched components
194
+ const matches = [];
195
+ const Components = getMatchedComponents(to, matches);
196
+
197
+ // If no Components matched, generate 404
198
+ if (!Components.length) {
199
+ // Call the authenticated middleware. This used to attempt to load the error layout but because it was missing it would:
200
+ // 1. load the default layout instead
201
+ // 2. then call the authenticated middleware
202
+ // 3. Authenticated middleware would then load plugins and check to see if there was a valid route and navigate to that if it existed
203
+ // 4. This would allow harvester cluster pages to load on page reload
204
+ // We should really make authenticated middleware do less...
205
+ await callMiddleware.call(this, [{ options: { middleware: ['authenticated'] } }], app.context);
206
+
207
+ // We used to have i18n middleware which was called each time we called middleware. This is also needed to support harvester because of the way harvester loads as outlined in the comment above
208
+ await this.$store.dispatch('i18n/init');
209
+
210
+ if (nextCalled) {
211
+ return;
212
+ }
213
+
214
+ // Show error page
215
+ // this.error({ statusCode: 404, message: 'This page could not be found' });
216
+ errorRedirect(this, new Error('404: This page could not be found'));
217
+
218
+ return next();
219
+ }
220
+
221
+ try {
222
+ // Call middleware
223
+ await callMiddleware.call(this, Components, app.context);
224
+ if (nextCalled) {
225
+ return;
226
+ }
227
+ if (app.context._errored) {
228
+ return next();
229
+ }
230
+
231
+ // Call middleware for layout
232
+ await callMiddleware.call(this, Components, app.context);
233
+ if (nextCalled) {
234
+ return;
235
+ }
236
+ if (app.context._errored) {
237
+ return next();
238
+ }
239
+
240
+ // Call .validate()
241
+ let isValid = true;
242
+
243
+ try {
244
+ for (const Component of Components) {
245
+ if (typeof Component.options.validate !== 'function') {
246
+ continue;
247
+ }
248
+
249
+ isValid = await Component.options.validate(app.context);
250
+
251
+ if (!isValid) {
252
+ break;
253
+ }
254
+ }
255
+ } catch (validationError) {
256
+ // ...If .validate() threw an error
257
+ errorRedirect(this, new Error(`${ validationError.statusCode || '500' }: ${ validationError.message }`));
258
+
259
+ return next();
260
+ }
261
+
262
+ // ...If .validate() returned false
263
+ if (!isValid) {
264
+ errorRedirect(this, new Error('404: This page could not be found'));
265
+
266
+ return next();
267
+ }
268
+
269
+ // If not redirected
270
+ if (!nextCalled) {
271
+ if (this.$loading.finish && !this.$loading.manual) {
272
+ this.$loading.finish();
273
+ }
274
+
275
+ next();
276
+ }
277
+ } catch (err) {
278
+ const error = err || {};
279
+
280
+ globalHandleError(error);
281
+
282
+ next();
283
+ }
284
+ }
285
+
286
+ /**
287
+ * Mounts the Vue app to the DOM element
288
+ * @param {Object} appPartials - App view partials
289
+ * @param {Object} VueClass - Vue instance
290
+ */
291
+ export async function mountApp(appPartials, VueClass) {
292
+ // Set global variables
293
+ app = appPartials.app;
294
+ const router = appPartials.router;
295
+
296
+ // Create Vue instance
297
+ const vueApp = new VueClass(app);
298
+
299
+ // Mounts Vue app to DOM element
300
+ const mount = () => {
301
+ vueApp.$mount('#app');
302
+ };
303
+
304
+ // Initialize error handler
305
+ vueApp.$loading = {}; // To avoid error while vueApp.$nuxt does not exist
306
+
307
+ // Add beforeEach router hooks
308
+ router.beforeEach(render.bind(vueApp));
309
+ router.afterEach((from, to) => {
310
+ if (from?.name !== to?.name) {
311
+ updatePageTitle(getVendor());
312
+ }
313
+ });
314
+
315
+ // First render on client-side
316
+ const clientFirstMount = () => {
317
+ mount();
318
+ };
319
+
320
+ // fix: force next tick to avoid having same timestamp when an error happen on spa fallback
321
+ await new Promise((resolve) => setTimeout(resolve, 0));
322
+ render.call(vueApp, router.currentRoute, router.currentRoute, (path) => {
323
+ // If not redirected
324
+ if (!path) {
325
+ clientFirstMount();
326
+
327
+ return;
328
+ }
329
+
330
+ // Add a one-time afterEach hook to
331
+ // mount the app wait for redirect and route gets resolved
332
+ const unregisterHook = router.afterEach((to, from) => {
333
+ unregisterHook();
334
+ clientFirstMount();
335
+ });
336
+
337
+ // Push the path and let route to be resolved
338
+ router.push(path, undefined, (err) => {
339
+ if (err) {
340
+ const errorHandler = vueApp?.config?.errorHandler || console.error; // eslint-disable-line no-console
341
+
342
+ errorHandler(err);
343
+ }
344
+ });
345
+ });
346
+ }
347
+
348
+ /**
349
+ * Extend component properties
350
+ * @param {*} Component
351
+ * @returns
352
+ */
353
+ const patchComponent = (Component) => {
354
+ // If Component already sanitized
355
+ if (Component.options && Component._Ctor === Component) {
356
+ return Component;
357
+ }
358
+ if (!Component.options) {
359
+ Component = Vue.extend(Component); // fix issue #6
360
+ Component._Ctor = Component;
361
+ } else {
362
+ Component._Ctor = Component;
363
+ Component.extendOptions = Component.options;
364
+ }
365
+ // If no component name defined, set file path as name, (also fixes #5703)
366
+ if (!Component.options.name && Component.options.__file) {
367
+ Component.options.name = Component.options.__file;
368
+ }
369
+
370
+ return Component;
371
+ };
372
+
373
+ export const getMatchedComponents = (route, matches = false, prop = 'components') => {
374
+ return Array.prototype.concat.apply([], route.matched.map((match, index) => {
375
+ return Object.keys(match[prop]).map((key) => {
376
+ matches && matches.push(index);
377
+
378
+ return match[prop][key];
379
+ });
380
+ }));
381
+ };
382
+
383
+ const getComponent = async(unknownComponent) => {
384
+ let componentView;
385
+
386
+ // If component is a function, resolve it
387
+ if (typeof unknownComponent === 'function' && !unknownComponent.options) {
388
+ try {
389
+ componentView = await unknownComponent();
390
+ } catch (error) {
391
+ // Handle webpack chunk loading errors
392
+ // This may be due to a new deployment or a network problem
393
+ if (
394
+ error &&
395
+ error.name === 'ChunkLoadError' &&
396
+ typeof window !== 'undefined' &&
397
+ window.sessionStorage
398
+ ) {
399
+ const timeNow = Date.now();
400
+ const previousReloadTime = parseInt(window.sessionStorage.getItem('nuxt-reload'));
401
+
402
+ // check for previous reload time not to reload infinitely
403
+ if (!previousReloadTime || previousReloadTime + 60000 < timeNow) {
404
+ window.sessionStorage.setItem('nuxt-reload', timeNow);
405
+ window.location.reload(true /* skip cache */);
406
+ }
407
+ }
408
+
409
+ throw error;
410
+ }
411
+ }
412
+
413
+ return componentView || unknownComponent;
414
+ };
415
+
416
+ /**
417
+ * Patch all the matched components of a given route
418
+ * @param {*} route
419
+ * @returns
420
+ */
421
+ const patchMatchedComponents = (route) => Array.prototype.concat.apply(
422
+ [],
423
+ route.matched.map(
424
+ (match, index) => Object
425
+ .keys(match.components)
426
+ .reduce(async(acc, key) => {
427
+ if (match.components[key]) {
428
+ const component = await getComponent(match.components[key], match.instances[key], match, key, index);
429
+ const patchedComponent = patchComponent(component);
430
+
431
+ match.components[key] = patchedComponent;
432
+ acc.push(patchedComponent);
433
+ } else {
434
+ delete match.components[key];
435
+ }
436
+
437
+ return acc;
438
+ }, [])
439
+ )
440
+ );
441
+
442
+ /**
443
+ * Merge route meta with component meta and update matched components
444
+ * @param {*} route
445
+ * @returns
446
+ */
447
+ export const getRouteData = async(route) => {
448
+ if (!route) {
449
+ return;
450
+ }
451
+ // Make sure the components are resolved (code-splitting)
452
+ await Promise.all(patchMatchedComponents(route));
453
+ const meta = getMatchedComponents(route).map(
454
+ (matchedComponent, index) => ({ ...matchedComponent.options.meta, ...(route.matched[index] || {}).meta })
455
+ );
456
+
457
+ // Send back a copy of route with meta based on Component definition
458
+ return {
459
+ ...route,
460
+ meta
461
+ };
462
+ };
463
+
464
+ /**
465
+ * Add missing context for the Vue instance
466
+ * @param {*} app
467
+ * @param {*} context
468
+ */
469
+ export const setContext = async(app, context) => {
470
+ // If context not defined, create it
471
+ if (!app.context) {
472
+ app.context = {
473
+ isDev: true,
474
+ isHMR: false,
475
+ app,
476
+ store: app.store,
477
+ payload: context.payload,
478
+ error: context.error,
479
+ base: app.router.options.base,
480
+ env: {
481
+ commit: 'head', version: '0.1.2', dev: true, pl: 1, perfTest: false, rancherEnv: 'web', api: 'http://localhost:8989'
482
+ }
483
+ };
484
+ // Only set once
485
+
486
+ if (context.req) {
487
+ app.context.req = context.req;
488
+ }
489
+ if (context.res) {
490
+ app.context.res = context.res;
491
+ }
492
+
493
+ app.context.redirect = (status, path, query) => {
494
+ if (!status) {
495
+ return;
496
+ }
497
+ app.context._redirected = true;
498
+ // if only 1 or 2 arguments: redirect('/') or redirect('/', { foo: 'bar' })
499
+ let pathType = typeof path;
500
+
501
+ if (typeof status !== 'number' && (pathType === 'undefined' || pathType === 'object')) {
502
+ query = path || {};
503
+ path = status;
504
+ pathType = typeof path;
505
+ status = 302;
506
+ }
507
+ if (pathType === 'object') {
508
+ path = app.router.resolve(path).route.fullPath;
509
+ }
510
+ // "/absolute/route", "./relative/route" or "../relative/route"
511
+ if (/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path)) {
512
+ app.context.next({
513
+ path,
514
+ query,
515
+ status
516
+ });
517
+ } else {
518
+ path = withQuery(path, query);
519
+
520
+ // https://developer.mozilla.org/en-US/docs/Web/API/Location/replace
521
+ window.location.replace(path);
522
+
523
+ // Throw a redirect error
524
+ throw new Error('ERR_REDIRECT');
525
+ }
526
+ };
527
+ }
528
+
529
+ // Dynamic keys
530
+ const [currentRouteData, fromRouteData] = await Promise.all([
531
+ getRouteData(context.route),
532
+ getRouteData(context.from)
533
+ ]);
534
+
535
+ if (context.route) {
536
+ app.context.route = currentRouteData;
537
+ }
538
+
539
+ if (context.from) {
540
+ app.context.from = fromRouteData;
541
+ }
542
+
543
+ app.context.next = context.next;
544
+ app.context._redirected = false;
545
+ app.context._errored = false;
546
+ app.context.isHMR = Boolean(context.isHMR);
547
+ app.context.params = app.context.route.params || {};
548
+ app.context.query = app.context.route.query || {};
549
+ };
@@ -0,0 +1,32 @@
1
+ // Taken from @nuxt/vue-app/template/client.js
2
+
3
+ import Vue from 'vue';
4
+ import fetch from 'unfetch';
5
+ import { extendApp } from './app-extended.js';
6
+ import fetchMixin from '@shell/mixins/fetch.client.js';
7
+ import { loadDebugger, mountApp } from '@shell/initialize/entry-helpers';
8
+ import { installDirectives } from '@shell/initialize/install-directives.js';
9
+ import { installComponents } from '@shell/initialize/install-components.js';
10
+ import { installPlugins } from '@shell/initialize/install-plugins.js';
11
+
12
+ // Fetch mixin
13
+ Vue.mixin(fetchMixin);
14
+
15
+ // Bulk install components
16
+ installComponents(Vue);
17
+
18
+ // Bulk install directives
19
+ installDirectives(Vue);
20
+
21
+ // Bulk install Plugins. Note: Some are added within the App itself
22
+ installPlugins(Vue);
23
+
24
+ if (!global.fetch) {
25
+ global.fetch = fetch;
26
+ }
27
+
28
+ loadDebugger(Vue);
29
+ const errorHandler = Vue.config.errorHandler || console.error; // eslint-disable-line no-console
30
+
31
+ // Create and mount App
32
+ extendApp(Vue).then((appPartials) => mountApp(appPartials, Vue)).catch(errorHandler); // eslint-disable-line no-undef
@@ -0,0 +1,23 @@
1
+
2
+ import NuxtChild from '@shell/components/nuxt/nuxt-child.js';
3
+ import { nuxtLinkAlias } from '@shell/components/nuxt/nuxt-link.client.js'; // should be included after ./index.js
4
+ import vSelect from 'vue-select';
5
+
6
+ /**
7
+ * Add components to the Vue instance
8
+ * @param {*} vueApp Vue instance
9
+ * TODO: #11070 - Remove Nuxt residuals
10
+ */
11
+ export const installComponents = (vueApp) => {
12
+ // Component: <NuxtLink>
13
+ // TODO: #9541 Remove for Vue 3 migration
14
+ vueApp.component('NuxtLink', nuxtLinkAlias('NuxtLink'));
15
+ vueApp.component('NLink', nuxtLinkAlias('NLink'));
16
+
17
+ // Component: <NuxtChild>
18
+ vueApp.component(NuxtChild.name, NuxtChild);
19
+ vueApp.component('NChild', NuxtChild);
20
+
21
+ // Vendor components
22
+ vueApp.component('v-select', vSelect);
23
+ };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Load the directives
3
+ *
4
+ * These are included in a function that can be explictly called, so that we can be sure
5
+ * of the execution order, rather than importing them at the top of a file.
6
+ */
7
+ import focusDirective from '@shell/directives/focus';
8
+ import cleanHtmlDirective from '@shell/directives/clean-html';
9
+ import cleanTooltipDirective from '@shell/directives/clean-tooltip';
10
+ import positiveIntNumberDirective from '@shell/directives/positive-int-number.js';
11
+ import trimWhitespaceDirective from '@shell/directives/trim-whitespace';
12
+ import intNumberDirective from '@shell/directives/int-number';
13
+
14
+ /**
15
+ * Prevent extensions from overriding existing directives
16
+ * Hook into vueApp.directive and keep track of the directive names that have been added
17
+ * and prevent an existing directive from being overwritten
18
+ * @param {*} vueApp Vue instance
19
+ */
20
+ const storeDirectives = (vueApp) => {
21
+ const directiveNames = {};
22
+ const vueDirective = vueApp.directive;
23
+
24
+ vueApp.directive = function(name) {
25
+ if (directiveNames[name]) {
26
+ console.log(`Can not override directive: ${ name }`); // eslint-disable-line no-console
27
+
28
+ return;
29
+ }
30
+
31
+ directiveNames[name] = true;
32
+
33
+ vueDirective.apply(vueApp, arguments);
34
+ };
35
+ };
36
+
37
+ /**
38
+ * Load the directives from the plugins - we do this with a function so we know
39
+ * these are initialized here, after the code above which keeps track of them and
40
+ * prevents over-writes
41
+ * @param {*} vueApp Vue instance
42
+ */
43
+ function addDirectives(vueApp) {
44
+ vueApp.directive('trim-whitespace', trimWhitespaceDirective);
45
+ vueApp.directive('clean-html', cleanHtmlDirective);
46
+ vueApp.directive('clean-tooltip', cleanTooltipDirective);
47
+ vueApp.directive('focus', focusDirective);
48
+ vueApp.directive('intNumber', intNumberDirective);
49
+ vueApp.directive('positiveIntNumber', positiveIntNumberDirective);
50
+ }
51
+
52
+ /**
53
+ * Install directives in bulks. It will store existing ones
54
+ * @param {*} vueApp Vue instance
55
+ */
56
+ export const installDirectives = (vueApp) => {
57
+ storeDirectives(vueApp);
58
+ addDirectives(vueApp);
59
+ };