@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
@@ -1,734 +0,0 @@
1
- // Taken from @nuxt/vue-app/template/client.js
2
-
3
- import Vue from 'vue';
4
- import fetch from 'unfetch';
5
- import middleware from '../config/middleware.js';
6
- import {
7
- applyAsyncData,
8
- promisify,
9
- middlewareSeries,
10
- sanitizeComponent,
11
- resolveRouteComponents,
12
- getMatchedComponents,
13
- getMatchedComponentsInstances,
14
- flatMapComponents,
15
- setContext,
16
- compile,
17
- getQueryDiff,
18
- globalHandleError,
19
- isSamePath,
20
- urlJoin
21
- } from '../utils/nuxt.js';
22
- import { createApp } from './index.js';
23
- import fetchMixin from '../mixins/fetch.client';
24
- import NuxtLink from '../components/nuxt/nuxt-link.client.js'; // should be included after ./index.js
25
-
26
- // Mimic old @nuxt/vue-app/template/client.js
27
- const isDev = process.env.dev;
28
- const debug = isDev;
29
-
30
- // Fetch mixin
31
- if (!Vue.__nuxt__fetch__mixin__) {
32
- Vue.mixin(fetchMixin);
33
- Vue.__nuxt__fetch__mixin__ = true;
34
- }
35
-
36
- // Component: <NuxtLink>
37
- Vue.component(NuxtLink.name, NuxtLink);
38
- Vue.component('NLink', NuxtLink);
39
-
40
- if (!global.fetch) {
41
- global.fetch = fetch;
42
- }
43
-
44
- // Global shared references
45
- let _lastPaths = [];
46
- let app;
47
- let router;
48
-
49
- // Try to rehydrate SSR data from window
50
- const NUXT = window.__NUXT__ || {};
51
-
52
- const $config = nuxt.publicRuntimeConfig || {}; // eslint-disable-line no-undef
53
-
54
- if ($config._app) {
55
- __webpack_public_path__ = urlJoin($config._app.cdnURL, $config._app.assetsPath); // eslint-disable-line camelcase, no-undef
56
- }
57
-
58
- Object.assign(Vue.config, { silent: false, performance: true });
59
-
60
- if (debug) {
61
- const logs = NUXT.logs || [];
62
-
63
- if (logs.length > 0) {
64
- const ssrLogStyle = 'background: #2E495E;border-radius: 0.5em;color: white;font-weight: bold;padding: 2px 0.5em;';
65
-
66
- console.group && console.group('%cNuxt SSR', ssrLogStyle); // eslint-disable-line no-console
67
- logs.forEach((logObj) => (console[logObj.type] || console.log)(...logObj.args)); // eslint-disable-line no-console
68
- delete NUXT.logs;
69
- console.groupEnd && console.groupEnd(); // eslint-disable-line no-console
70
- }
71
-
72
- // Setup global Vue error handler
73
- if (!Vue.config.$nuxt) {
74
- const defaultErrorHandler = Vue.config.errorHandler;
75
-
76
- Vue.config.errorHandler = async(err, vm, info, ...rest) => {
77
- // Call other handler if exist
78
- let handled = null;
79
-
80
- if (typeof defaultErrorHandler === 'function') {
81
- handled = defaultErrorHandler(err, vm, info, ...rest);
82
- }
83
- if (handled === true) {
84
- return handled;
85
- }
86
-
87
- if (vm && vm.$root) {
88
- const nuxtApp = Object.keys(Vue.config.$nuxt)
89
- .find((nuxtInstance) => vm.$root[nuxtInstance]);
90
-
91
- // Show Nuxt Error Page
92
- if (nuxtApp && vm.$root[nuxtApp].error && info !== 'render function') {
93
- const currentApp = vm.$root[nuxtApp];
94
-
95
- currentApp.error(err);
96
- }
97
- }
98
-
99
- if (typeof defaultErrorHandler === 'function') {
100
- return handled;
101
- }
102
-
103
- // Log to console
104
- if (process.env.NODE_ENV !== 'production') {
105
- console.error(err); // eslint-disable-line no-console
106
- } else {
107
- console.error(err.message || err); // eslint-disable-line no-console
108
- }
109
- };
110
- Vue.config.$nuxt = {};
111
- }
112
- Vue.config.$nuxt.$nuxt = true;
113
- }
114
-
115
- const errorHandler = Vue.config.errorHandler || console.error; // eslint-disable-line no-console
116
-
117
- // Create and mount App
118
- createApp(nuxt.publicRuntimeConfig).then(mountApp).catch(errorHandler); // eslint-disable-line no-undef
119
-
120
- async function loadAsyncComponents(to, from, next) {
121
- // Check if route changed (this._routeChanged), only if the page is not an error (for validate())
122
- this._routeChanged = Boolean(app.nuxt.err) || from.name !== to.name;
123
- this._paramChanged = !this._routeChanged && from.path !== to.path;
124
- this._queryChanged = !this._paramChanged && from.fullPath !== to.fullPath;
125
- this._diffQuery = (this._queryChanged ? getQueryDiff(to.query, from.query) : []);
126
-
127
- if ((this._routeChanged || this._paramChanged) && this.$loading.start && !this.$loading.manual) {
128
- this.$loading.start();
129
- }
130
-
131
- try {
132
- if (this._queryChanged) {
133
- const Components = await resolveRouteComponents(
134
- to,
135
- (Component, instance) => ({ Component, instance })
136
- );
137
- // Add a marker on each component that it needs to refresh or not
138
- const startLoader = Components.some(({ Component, instance }) => {
139
- const watchQuery = Component.options.watchQuery;
140
-
141
- if (watchQuery === true) {
142
- return true;
143
- }
144
- if (Array.isArray(watchQuery)) {
145
- return watchQuery.some((key) => this._diffQuery[key]);
146
- }
147
- if (typeof watchQuery === 'function') {
148
- return watchQuery.apply(instance, [to.query, from.query]);
149
- }
150
-
151
- return false;
152
- });
153
-
154
- if (startLoader && this.$loading.start && !this.$loading.manual) {
155
- this.$loading.start();
156
- }
157
- }
158
- // Call next()
159
- next();
160
- } catch (error) {
161
- const err = error || {};
162
- const statusCode = err.statusCode || err.status || (err.response && err.response.status) || 500;
163
- const message = err.message || '';
164
-
165
- // Handle chunk loading errors
166
- // This may be due to a new deployment or a network problem
167
- if (/^Loading( CSS)? chunk (\d)+ failed\./.test(message)) {
168
- window.location.reload(true /* skip cache */);
169
-
170
- return; // prevent error page blinking for user
171
- }
172
-
173
- this.error({ statusCode, message });
174
- this.$nuxt.$emit('routeChanged', to, from, err);
175
- next();
176
- }
177
- }
178
-
179
- // Get matched components
180
- function resolveComponents(route) {
181
- return flatMapComponents(route, async(Component, _, match, key, index) => {
182
- // If component is not resolved yet, resolve it
183
- if (typeof Component === 'function' && !Component.options) {
184
- Component = await Component();
185
- }
186
-
187
- // Sanitize it and save it
188
- Component._Ctor = sanitizeComponent(Component);
189
-
190
- match.components[key] = Component;
191
-
192
- return Component;
193
- });
194
- }
195
-
196
- function callMiddleware(Components, context) {
197
- let midd = ['i18n'];
198
- let unknownMiddleware = false;
199
-
200
- Components.forEach((Component) => {
201
- if (Component.options.middleware) {
202
- midd = midd.concat(Component.options.middleware);
203
- }
204
- });
205
-
206
- midd = midd.map((name) => {
207
- if (typeof name === 'function') {
208
- return name;
209
- }
210
- if (typeof middleware[name] !== 'function') {
211
- unknownMiddleware = true;
212
- this.error({ statusCode: 500, message: `Unknown middleware ${ name }` });
213
- }
214
-
215
- return middleware[name];
216
- });
217
-
218
- if (unknownMiddleware) {
219
- return;
220
- }
221
-
222
- return middlewareSeries(midd, context);
223
- }
224
-
225
- async function render(to, from, next) {
226
- if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
227
- return next();
228
- }
229
-
230
- if (to === from) {
231
- _lastPaths = [];
232
- } else {
233
- const fromMatches = [];
234
-
235
- _lastPaths = getMatchedComponents(from, fromMatches).map((Component, i) => {
236
- return compile(from.matched[fromMatches[i]].path)(from.params);
237
- });
238
- }
239
-
240
- // nextCalled is true when redirected
241
- let nextCalled = false;
242
- const _next = (path) => {
243
- if (from.path === path.path && this.$loading.finish) {
244
- this.$loading.finish();
245
- }
246
-
247
- if (from.path !== path.path && this.$loading.pause) {
248
- this.$loading.pause();
249
- }
250
-
251
- if (nextCalled) {
252
- return;
253
- }
254
-
255
- nextCalled = true;
256
- next(path);
257
- };
258
-
259
- // Update context
260
- await setContext(app, {
261
- route: to,
262
- from,
263
- next: _next.bind(this)
264
- });
265
- this._dateLastError = app.nuxt.dateErr;
266
- this._hadError = Boolean(app.nuxt.err);
267
-
268
- // Get route's matched components
269
- const matches = [];
270
- const Components = getMatchedComponents(to, matches);
271
-
272
- // If no Components matched, generate 404
273
- if (!Components.length) {
274
- // Call the authenticated middleware. This used to attempt to load the error layout but because it was missing it would:
275
- // 1. load the default layout instead
276
- // 2. then call the authenticated middleware
277
- // 3. Authenticated middleware would then load plugins and check to see if there was a valid route and navigate to that if it existed
278
- // 4. This would allow harvester cluster pages to load on page reload
279
- // We should really make authenticated middleware do less...
280
- await callMiddleware.call(this, [{ options: { middleware: ['authenticated'] } }], app.context);
281
-
282
- if (nextCalled) {
283
- return;
284
- }
285
-
286
- // Show error page
287
- this.error({ statusCode: 404, message: 'This page could not be found' });
288
-
289
- return next();
290
- }
291
-
292
- // Update ._data and other properties if hot reloaded
293
- Components.forEach((Component) => {
294
- if (Component._Ctor && Component._Ctor.options) {
295
- Component.options.asyncData = Component._Ctor.options.asyncData;
296
- Component.options.fetch = Component._Ctor.options.fetch;
297
- }
298
- });
299
-
300
- try {
301
- // Call middleware
302
- await callMiddleware.call(this, Components, app.context);
303
- if (nextCalled) {
304
- return;
305
- }
306
- if (app.context._errored) {
307
- return next();
308
- }
309
-
310
- // Call middleware for layout
311
- await callMiddleware.call(this, Components, app.context);
312
- if (nextCalled) {
313
- return;
314
- }
315
- if (app.context._errored) {
316
- return next();
317
- }
318
-
319
- // Call .validate()
320
- let isValid = true;
321
-
322
- try {
323
- for (const Component of Components) {
324
- if (typeof Component.options.validate !== 'function') {
325
- continue;
326
- }
327
-
328
- isValid = await Component.options.validate(app.context);
329
-
330
- if (!isValid) {
331
- break;
332
- }
333
- }
334
- } catch (validationError) {
335
- // ...If .validate() threw an error
336
- this.error({
337
- statusCode: validationError.statusCode || '500',
338
- message: validationError.message
339
- });
340
-
341
- return next();
342
- }
343
-
344
- // ...If .validate() returned false
345
- if (!isValid) {
346
- this.error({ statusCode: 404, message: 'This page could not be found' });
347
-
348
- return next();
349
- }
350
-
351
- let instances;
352
-
353
- // Call asyncData & fetch hooks on components matched by the route.
354
- await Promise.all(Components.map((Component, i) => {
355
- // Check if only children route changed
356
- Component._path = compile(to.matched[matches[i]].path)(to.params);
357
- Component._dataRefresh = false;
358
- const childPathChanged = Component._path !== _lastPaths[i];
359
-
360
- // Refresh component (call asyncData & fetch) when:
361
- // Route path changed part includes current component
362
- // Or route param changed part includes current component and watchParam is not `false`
363
- // Or route query is changed and watchQuery returns `true`
364
- if (this._routeChanged && childPathChanged) {
365
- Component._dataRefresh = true;
366
- } else if (this._paramChanged && childPathChanged) {
367
- const watchParam = Component.options.watchParam;
368
-
369
- Component._dataRefresh = watchParam !== false;
370
- } else if (this._queryChanged) {
371
- const watchQuery = Component.options.watchQuery;
372
-
373
- if (watchQuery === true) {
374
- Component._dataRefresh = true;
375
- } else if (Array.isArray(watchQuery)) {
376
- Component._dataRefresh = watchQuery.some((key) => this._diffQuery[key]);
377
- } else if (typeof watchQuery === 'function') {
378
- if (!instances) {
379
- instances = getMatchedComponentsInstances(to);
380
- }
381
- Component._dataRefresh = watchQuery.apply(instances[i], [to.query, from.query]);
382
- }
383
- }
384
- if (!this._hadError && this._isMounted && !Component._dataRefresh) {
385
- return;
386
- }
387
-
388
- const promises = [];
389
-
390
- const hasAsyncData = (
391
- Component.options.asyncData &&
392
- typeof Component.options.asyncData === 'function'
393
- );
394
-
395
- const hasFetch = Boolean(Component.options.fetch) && Component.options.fetch.length;
396
-
397
- const loadingIncrease = (hasAsyncData && hasFetch) ? 30 : 45;
398
-
399
- // Call asyncData(context)
400
- if (hasAsyncData) {
401
- const promise = promisify(Component.options.asyncData, app.context);
402
-
403
- promise.then((asyncDataResult) => {
404
- applyAsyncData(Component, asyncDataResult);
405
-
406
- if (this.$loading.increase) {
407
- this.$loading.increase(loadingIncrease);
408
- }
409
- });
410
- promises.push(promise);
411
- }
412
-
413
- // Check disabled page loading
414
- this.$loading.manual = Component.options.loading === false;
415
-
416
- // Call fetch(context)
417
- if (hasFetch) {
418
- let p = Component.options.fetch(app.context);
419
-
420
- if (!p || (!(p instanceof Promise) && (typeof p.then !== 'function'))) {
421
- p = Promise.resolve(p);
422
- }
423
- p.then((fetchResult) => {
424
- if (this.$loading.increase) {
425
- this.$loading.increase(loadingIncrease);
426
- }
427
- });
428
- promises.push(p);
429
- }
430
-
431
- return Promise.all(promises);
432
- }));
433
-
434
- // If not redirected
435
- if (!nextCalled) {
436
- if (this.$loading.finish && !this.$loading.manual) {
437
- this.$loading.finish();
438
- }
439
-
440
- next();
441
- }
442
- } catch (err) {
443
- const error = err || {};
444
-
445
- if (error.message === 'ERR_REDIRECT') {
446
- return this.$nuxt.$emit('routeChanged', to, from, error);
447
- }
448
- _lastPaths = [];
449
-
450
- globalHandleError(error);
451
-
452
- this.error(error);
453
- this.$nuxt.$emit('routeChanged', to, from, error);
454
- next();
455
- }
456
- }
457
-
458
- // Fix components format in matched, it's due to code-splitting of vue-router
459
- function normalizeComponents(to, ___) {
460
- flatMapComponents(to, (Component, _, match, key) => {
461
- if (typeof Component === 'object' && !Component.options) {
462
- // Updated via vue-router resolveAsyncComponents()
463
- Component = Vue.extend(Component);
464
- Component._Ctor = Component;
465
- match.components[key] = Component;
466
- }
467
-
468
- return Component;
469
- });
470
- }
471
-
472
- function checkForErrors(app) {
473
- // Hide error component if no error
474
- if (app._hadError && app._dateLastError === app.$options.nuxt.dateErr) {
475
- app.error();
476
- }
477
- }
478
-
479
- // When navigating on a different route but the same component is used, Vue.js
480
- // Will not update the instance data, so we have to update $data ourselves
481
- function fixPrepatch(to, ___) {
482
- if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
483
- return;
484
- }
485
-
486
- const instances = getMatchedComponentsInstances(to);
487
- const Components = getMatchedComponents(to);
488
-
489
- let triggerScroll = false;
490
-
491
- Vue.nextTick(() => {
492
- instances.forEach((instance, i) => {
493
- if (!instance || instance._isDestroyed) {
494
- return;
495
- }
496
-
497
- if (
498
- instance.constructor._dataRefresh &&
499
- Components[i] === instance.constructor &&
500
- instance.$vnode.data.keepAlive !== true &&
501
- typeof instance.constructor.options.data === 'function'
502
- ) {
503
- const newData = instance.constructor.options.data.call(instance);
504
-
505
- for (const key in newData) {
506
- Vue.set(instance.$data, key, newData[key]);
507
- }
508
-
509
- triggerScroll = true;
510
- }
511
- });
512
-
513
- if (triggerScroll) {
514
- // Ensure to trigger scroll event after calling scrollBehavior
515
- window.$nuxt.$nextTick(() => {
516
- window.$nuxt.$emit('triggerScroll');
517
- });
518
- }
519
-
520
- checkForErrors(this);
521
-
522
- // Hot reloading
523
- if (isDev) {
524
- setTimeout(() => hotReloadAPI(this), 100);
525
- }
526
- });
527
- }
528
-
529
- function nuxtReady(_app) {
530
- window.onNuxtReadyCbs.forEach((cb) => {
531
- if (typeof cb === 'function') {
532
- cb(_app);
533
- }
534
- });
535
- // Special JSDOM
536
- if (typeof window._onNuxtLoaded === 'function') {
537
- window._onNuxtLoaded(_app);
538
- }
539
- // Add router hooks
540
- router.afterEach((to, from) => {
541
- // Wait for fixPrepatch + $data updates
542
- Vue.nextTick(() => _app.$nuxt.$emit('routeChanged', to, from));
543
- });
544
- }
545
-
546
- const noopData = () => {
547
- return {};
548
- };
549
- const noopFetch = () => {};
550
-
551
- // Special hot reload with asyncData(context)
552
- function getNuxtChildComponents($parent, $components = []) {
553
- $parent.$children.forEach(($child) => {
554
- if ($child.$vnode && $child.$vnode.data.nuxtChild && !$components.find((c) => (c.$options.__file === $child.$options.__file))) {
555
- $components.push($child);
556
- }
557
- if ($child.$children && $child.$children.length) {
558
- getNuxtChildComponents($child, $components);
559
- }
560
- });
561
-
562
- return $components;
563
- }
564
-
565
- function hotReloadAPI(_app) {
566
- if (!module.hot) {
567
- return;
568
- }
569
-
570
- const $components = getNuxtChildComponents(_app.$nuxt, []);
571
-
572
- $components.forEach(addHotReload.bind(_app));
573
- }
574
-
575
- function addHotReload($component, depth) {
576
- if ($component.$vnode.data._hasHotReload) {
577
- return;
578
- }
579
- $component.$vnode.data._hasHotReload = true;
580
-
581
- const _forceUpdate = $component.$forceUpdate.bind($component.$parent);
582
-
583
- $component.$vnode.context.$forceUpdate = async() => {
584
- const Components = getMatchedComponents(router.currentRoute);
585
- let Component = Components[depth];
586
-
587
- if (!Component) {
588
- return _forceUpdate();
589
- }
590
- if (typeof Component === 'object' && !Component.options) {
591
- // Updated via vue-router resolveAsyncComponents()
592
- Component = Vue.extend(Component);
593
- Component._Ctor = Component;
594
- }
595
- this.error();
596
- const promises = [];
597
- const next = function(path) {
598
- this.$loading.finish && this.$loading.finish();
599
- router.push(path);
600
- };
601
-
602
- await setContext(app, {
603
- route: router.currentRoute,
604
- isHMR: true,
605
- next: next.bind(this)
606
- });
607
- const context = app.context;
608
-
609
- if (this.$loading.start && !this.$loading.manual) {
610
- this.$loading.start();
611
- }
612
-
613
- callMiddleware.call(this, Components, context)
614
- .then(() => {
615
- return callMiddleware.call(this, Components, context);
616
- })
617
-
618
- .then(() => {
619
- // Call asyncData(context)
620
- const pAsyncData = promisify(Component.options.asyncData || noopData, context);
621
-
622
- pAsyncData.then((asyncDataResult) => {
623
- applyAsyncData(Component, asyncDataResult);
624
- this.$loading.increase && this.$loading.increase(30);
625
- });
626
- promises.push(pAsyncData);
627
-
628
- // Call fetch()
629
- Component.options.fetch = Component.options.fetch || noopFetch;
630
- let pFetch = Component.options.fetch.length && Component.options.fetch(context);
631
-
632
- if (!pFetch || (!(pFetch instanceof Promise) && (typeof pFetch.then !== 'function'))) {
633
- pFetch = Promise.resolve(pFetch);
634
- }
635
- pFetch.then(() => this.$loading.increase && this.$loading.increase(30));
636
- promises.push(pFetch);
637
-
638
- return Promise.all(promises);
639
- })
640
- .then(() => {
641
- this.$loading.finish && this.$loading.finish();
642
- _forceUpdate();
643
- setTimeout(() => hotReloadAPI(this), 100);
644
- });
645
- };
646
- }
647
-
648
- async function mountApp(__app) {
649
- // Set global variables
650
- app = __app.app;
651
- router = __app.router;
652
-
653
- // Create Vue instance
654
- const _app = new Vue(app);
655
-
656
- // Mounts Vue app to DOM element
657
- const mount = () => {
658
- _app.$mount('#app');
659
-
660
- // Add afterEach router hooks
661
- router.afterEach(normalizeComponents);
662
-
663
- router.afterEach(fixPrepatch.bind(_app));
664
-
665
- // Listen for first Vue update
666
- Vue.nextTick(() => {
667
- // Call window.{{globals.readyCallback}} callbacks
668
- nuxtReady(_app);
669
-
670
- if (isDev) {
671
- // Enable hot reloading
672
- hotReloadAPI(_app);
673
- }
674
- });
675
- };
676
-
677
- // Resolve route components
678
- const Components = await Promise.all(resolveComponents(app.context.route));
679
-
680
- if (Components.length) {
681
- _lastPaths = router.currentRoute.matched.map((route) => compile(route.path)(router.currentRoute.params));
682
- }
683
-
684
- // Initialize error handler
685
- _app.$loading = {}; // To avoid error while _app.$nuxt does not exist
686
- if (NUXT.error) {
687
- _app.error(NUXT.error);
688
- }
689
-
690
- // Add beforeEach router hooks
691
- router.beforeEach(loadAsyncComponents.bind(_app));
692
- router.beforeEach(render.bind(_app));
693
-
694
- // Fix in static: remove trailing slash to force hydration
695
- // Full static, if server-rendered: hydrate, to allow custom redirect to generated page
696
-
697
- // Fix in static: remove trailing slash to force hydration
698
- if (NUXT.serverRendered && isSamePath(NUXT.routePath, _app.context.route.path)) {
699
- return mount();
700
- }
701
-
702
- // First render on client-side
703
- const clientFirstMount = () => {
704
- normalizeComponents(router.currentRoute, router.currentRoute);
705
- checkForErrors(_app);
706
- // Don't call fixPrepatch.call(_app, router.currentRoute, router.currentRoute) since it's first render
707
- mount();
708
- };
709
-
710
- // fix: force next tick to avoid having same timestamp when an error happen on spa fallback
711
- await new Promise((resolve) => setTimeout(resolve, 0));
712
- render.call(_app, router.currentRoute, router.currentRoute, (path) => {
713
- // If not redirected
714
- if (!path) {
715
- clientFirstMount();
716
-
717
- return;
718
- }
719
-
720
- // Add a one-time afterEach hook to
721
- // mount the app wait for redirect and route gets resolved
722
- const unregisterHook = router.afterEach((to, from) => {
723
- unregisterHook();
724
- clientFirstMount();
725
- });
726
-
727
- // Push the path and let route to be resolved
728
- router.push(path, undefined, (err) => {
729
- if (err) {
730
- errorHandler(err);
731
- }
732
- });
733
- });
734
- }