@rancher/shell 1.2.3 → 2.0.1

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 (699) 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 +1 -0
  7. package/assets/styles/global/_layout.scss +99 -0
  8. package/assets/styles/themes/_csp.scss +2 -2
  9. package/assets/styles/themes/_dark.scss +8 -2
  10. package/assets/styles/themes/_light.scss +2 -1
  11. package/assets/styles/themes/_suse.scss +1 -1
  12. package/assets/styles/vendor/vue-select.scss +5 -0
  13. package/assets/translations/en-us.yaml +315 -64
  14. package/assets/translations/zh-hans.yaml +7 -31
  15. package/babel.config.js +8 -2
  16. package/chart/__tests__/S3.test.ts +9 -2
  17. package/chart/gatekeeper.vue +2 -11
  18. package/chart/istio.vue +1 -10
  19. package/chart/logging/index.vue +2 -11
  20. package/chart/monitoring/alerting/index.vue +7 -21
  21. package/chart/monitoring/grafana/index.vue +61 -2
  22. package/chart/monitoring/index.vue +52 -26
  23. package/chart/monitoring/prometheus/index.vue +39 -45
  24. package/chart/rancher-backup/S3.vue +11 -9
  25. package/chart/rancher-backup/index.vue +18 -15
  26. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  27. package/cloud-credential/azure.vue +4 -17
  28. package/cloud-credential/generic.vue +18 -9
  29. package/cloud-credential/harvester.vue +11 -3
  30. package/components/AlertTable.vue +17 -7
  31. package/components/AppModal.vue +167 -0
  32. package/components/AssignTo.vue +7 -4
  33. package/components/AsyncButton.vue +27 -5
  34. package/components/BackLink.vue +4 -4
  35. package/components/BannerGraphic.vue +1 -0
  36. package/components/BrandImage.vue +47 -1
  37. package/components/Carousel.vue +15 -8
  38. package/components/Certificates.vue +161 -0
  39. package/components/ClusterBadge.vue +12 -3
  40. package/components/ClusterIconMenu.vue +55 -12
  41. package/components/ClusterProviderIcon.vue +14 -3
  42. package/components/CodeMirror.vue +111 -17
  43. package/components/CommunityLinks.vue +12 -8
  44. package/components/CopyCode.vue +6 -2
  45. package/components/CopyToClipboard.vue +2 -1
  46. package/components/CopyToClipboardText.vue +14 -9
  47. package/components/CreateDriver.vue +81 -0
  48. package/components/CruResource.vue +52 -27
  49. package/components/DetailTop.vue +2 -2
  50. package/components/Dialog.vue +6 -5
  51. package/components/DisableAuthProviderModal.vue +14 -8
  52. package/components/DraggableZone.vue +2 -2
  53. package/components/EtcdInfoBanner.vue +5 -5
  54. package/components/ExplorerMembers.vue +3 -3
  55. package/components/ExplorerProjectsNamespaces.vue +31 -7
  56. package/components/FixedBanner.vue +48 -36
  57. package/components/GlobalRoleBindings.vue +26 -0
  58. package/components/GrafanaDashboard.vue +6 -4
  59. package/components/IconOrSvg.vue +1 -1
  60. package/components/Import.vue +10 -6
  61. package/components/Inactivity.vue +1 -5
  62. package/components/KeyValueView.vue +14 -10
  63. package/components/Markdown.vue +16 -12
  64. package/components/MessageLink.vue +2 -2
  65. package/components/ModalWithCard.vue +5 -8
  66. package/components/MoveModal.vue +35 -33
  67. package/components/PodSecurityAdmission.vue +3 -3
  68. package/components/PromptChangePassword.vue +33 -33
  69. package/components/PromptModal.vue +11 -21
  70. package/components/PromptRemove.vue +12 -17
  71. package/components/PromptRestore.vue +18 -16
  72. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  73. package/components/Questions/__tests__/Float.test.ts +9 -19
  74. package/components/Questions/__tests__/Int.test.ts +9 -19
  75. package/components/Questions/__tests__/String.test.ts +9 -19
  76. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  77. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  78. package/components/Questions/index.vue +19 -3
  79. package/components/ResourceCancelModal.vue +34 -29
  80. package/components/ResourceDetail/Masthead.vue +48 -16
  81. package/components/ResourceDetail/index.vue +6 -4
  82. package/components/ResourceList/Masthead.vue +10 -9
  83. package/components/ResourceList/index.vue +65 -14
  84. package/components/ResourceTable.vue +87 -21
  85. package/components/ResourceYaml.vue +35 -5
  86. package/components/SelectIconGrid.vue +3 -3
  87. package/components/SideNav.vue +50 -94
  88. package/components/SingleClusterInfo.vue +4 -4
  89. package/components/SortableTable/THead.vue +33 -21
  90. package/components/SortableTable/filtering.js +9 -1
  91. package/components/SortableTable/grouping.js +8 -1
  92. package/components/SortableTable/index.vue +143 -44
  93. package/components/SortableTable/paging.js +36 -7
  94. package/components/SortableTable/selection.js +2 -1
  95. package/components/SortableTable/sorting.js +24 -7
  96. package/components/StatusTable.vue +5 -1
  97. package/components/Tabbed/index.vue +18 -1
  98. package/components/TableDataUserIcon.vue +47 -0
  99. package/components/TypeDescription.vue +1 -0
  100. package/components/Wizard.vue +1 -0
  101. package/components/YamlEditor.vue +1 -0
  102. package/components/__tests__/AppModal.test.ts +98 -0
  103. package/components/__tests__/AsyncButton.test.ts +1 -3
  104. package/components/__tests__/BackLink.test.ts +1 -1
  105. package/components/__tests__/ButtonGroup.test.ts +3 -6
  106. package/components/__tests__/Carousel.test.ts +43 -0
  107. package/components/__tests__/Certificates.test.ts +29 -0
  108. package/components/__tests__/CodeMirror.test.ts +87 -0
  109. package/components/__tests__/CopyCode.test.ts +5 -4
  110. package/components/__tests__/CruResource.test.ts +10 -9
  111. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  112. package/components/__tests__/FixedBanner.test.ts +5 -20
  113. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  114. package/components/__tests__/TabTitle.test.ts +129 -0
  115. package/components/auth/AzureWarning.vue +2 -2
  116. package/components/auth/RoleDetailEdit.vue +10 -0
  117. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  118. package/components/auth/login/oidc.vue +7 -1
  119. package/components/fleet/FleetBundles.vue +5 -11
  120. package/components/fleet/FleetClusters.vue +9 -9
  121. package/components/fleet/FleetIntro.vue +11 -17
  122. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  123. package/components/fleet/FleetRepos.vue +63 -27
  124. package/components/fleet/FleetResources.vue +6 -1
  125. package/components/fleet/FleetStatus.vue +3 -3
  126. package/components/fleet/FleetSummary.vue +35 -30
  127. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  128. package/components/fleet/__tests__/FleetSummary.test.ts +316 -0
  129. package/components/form/ArrayList.vue +22 -18
  130. package/components/form/ArrayListSelect.vue +5 -0
  131. package/components/form/BannerSettings.vue +3 -0
  132. package/components/form/ClusterAppearance.vue +132 -0
  133. package/components/form/ColorInput.vue +1 -0
  134. package/components/form/Error.vue +3 -3
  135. package/components/form/FileSelector.vue +1 -0
  136. package/components/form/Footer.vue +2 -2
  137. package/components/form/GitPicker.vue +83 -38
  138. package/components/form/KeyValue.vue +70 -48
  139. package/components/form/LabeledSelect.vue +145 -41
  140. package/components/form/Labels.vue +3 -1
  141. package/components/form/NameNsDescription.vue +26 -9
  142. package/components/form/Password.vue +3 -1
  143. package/components/form/ResourceLabeledSelect.vue +187 -0
  144. package/components/form/ResourceTabs/index.vue +31 -15
  145. package/components/form/SecretSelector.vue +93 -18
  146. package/components/form/SelectOrCreateAuthSecret.vue +132 -59
  147. package/components/form/SimpleSecretSelector.vue +88 -28
  148. package/components/form/Taints.vue +13 -7
  149. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  150. package/components/form/__tests__/KeyValue.test.ts +120 -11
  151. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  152. package/components/form/__tests__/{NameNsDescription.ts → NameNsDescription.test.ts} +25 -15
  153. package/components/form/__tests__/Taints.test.ts +70 -0
  154. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  155. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  156. package/components/formatter/AppSummaryGraph.vue +2 -2
  157. package/components/formatter/Checked.vue +11 -3
  158. package/components/formatter/CloudCredPublicData.vue +30 -0
  159. package/components/formatter/ClusterLink.vue +2 -2
  160. package/components/formatter/ClusterProvider.vue +1 -18
  161. package/components/formatter/FleetClusterSummaryGraph.vue +27 -0
  162. package/components/formatter/FleetSummaryGraph.vue +25 -12
  163. package/components/formatter/ImagePercentageBar.vue +0 -4
  164. package/components/formatter/IngressTarget.vue +18 -7
  165. package/components/formatter/Link.vue +2 -2
  166. package/components/formatter/LinkDetail.vue +2 -2
  167. package/components/formatter/LinkDetailImage.vue +2 -2
  168. package/components/formatter/LinkName.vue +2 -2
  169. package/components/formatter/LiveDuration.vue +1 -1
  170. package/components/formatter/PercentageBar.vue +1 -1
  171. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  172. package/components/formatter/SecretType.vue +2 -2
  173. package/components/formatter/VirtualServiceGateways.vue +2 -2
  174. package/components/formatter/WorkloadDetailEndpoints.vue +12 -22
  175. package/components/formatter/__tests__/Checked.test.ts +19 -0
  176. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  177. package/components/formatter/__tests__/WorkloadDetailEndpoints.test.ts +81 -0
  178. package/components/nav/Group.vue +9 -7
  179. package/components/nav/Header.vue +85 -46
  180. package/components/nav/Jump.vue +19 -9
  181. package/components/nav/NamespaceFilter.vue +8 -1
  182. package/components/nav/TopLevelMenu.vue +392 -136
  183. package/components/nav/Type.vue +71 -106
  184. package/components/nav/WindowManager/ContainerLogs.vue +120 -19
  185. package/components/nav/WindowManager/ContainerShell.vue +6 -1
  186. package/components/nav/WindowManager/__tests__/ContainerLogs.test.ts +186 -0
  187. package/components/nav/WindowManager/index.vue +11 -10
  188. package/components/nav/__tests__/TopLevelMenu.test.ts +400 -6
  189. package/components/nav/__tests__/Type.test.ts +322 -97
  190. package/components/nuxt/nuxt-child.js +9 -78
  191. package/components/nuxt/nuxt-error.vue +1 -1
  192. package/components/nuxt/nuxt-link.client.js +13 -95
  193. package/{layouts → components/templates}/blank.vue +1 -1
  194. package/{layouts → components/templates}/default.vue +11 -101
  195. package/{layouts → components/templates}/error.vue +13 -26
  196. package/{layouts → components/templates}/home.vue +4 -1
  197. package/{layouts → components/templates}/plain.vue +4 -1
  198. package/{layouts → components/templates}/standalone.vue +1 -5
  199. package/{layouts → components/templates}/unauthenticated.vue +2 -3
  200. package/composables/useCompactInput.test.ts +36 -0
  201. package/composables/useCompactInput.ts +20 -0
  202. package/composables/useLabeledFormElement.test.ts +135 -0
  203. package/composables/useLabeledFormElement.ts +138 -0
  204. package/config/harvester-manager-types.js +2 -0
  205. package/config/home-links.js +2 -1
  206. package/config/labels-annotations.js +2 -1
  207. package/config/middleware.js +0 -6
  208. package/config/pagination-table-headers.js +57 -0
  209. package/config/pod-security-admission.ts +1 -1
  210. package/config/private-label.js +21 -1
  211. package/config/product/auth.js +1 -0
  212. package/config/product/explorer.js +166 -45
  213. package/config/product/fleet.js +6 -1
  214. package/config/product/legacy.js +2 -11
  215. package/config/product/manager.js +51 -25
  216. package/config/query-params.js +2 -0
  217. package/config/roles.ts +23 -0
  218. package/config/router/index.js +23 -0
  219. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  220. package/config/router/navigation-guards/authentication.js +63 -0
  221. package/config/router/navigation-guards/i18n.js +13 -0
  222. package/config/router/navigation-guards/index.js +16 -0
  223. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  224. package/config/router/routes.js +487 -0
  225. package/config/settings.ts +31 -2
  226. package/config/store.js +8 -4
  227. package/config/system-namespaces.js +3 -0
  228. package/config/table-headers.js +66 -1
  229. package/config/types.js +35 -20
  230. package/config/uiplugins.js +10 -5
  231. package/core/plugin-helpers.js +4 -6
  232. package/core/plugin-routes.ts +56 -114
  233. package/core/plugin.ts +18 -11
  234. package/core/plugins-loader.js +7 -9
  235. package/core/plugins.js +289 -285
  236. package/core/types-provisioning.ts +7 -0
  237. package/creators/app/app.package.json +2 -1
  238. package/creators/app/files/.eslintignore +0 -2
  239. package/creators/app/files/.gitlab-ci.yml +14 -0
  240. package/creators/app/files/.vscode/settings.json +0 -1
  241. package/creators/app/init +19 -0
  242. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  243. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  244. package/creators/pkg/init +32 -0
  245. package/detail/__tests__/provisioning.cattle.io.cluster.test.ts +119 -0
  246. package/detail/__tests__/service.test.ts +62 -0
  247. package/detail/catalog.cattle.io.app.vue +1 -1
  248. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  249. package/detail/fleet.cattle.io.bundle.vue +1 -1
  250. package/detail/fleet.cattle.io.cluster.vue +11 -1
  251. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  252. package/detail/namespace.vue +2 -2
  253. package/detail/networking.k8s.io.ingress.vue +52 -19
  254. package/detail/node.vue +22 -3
  255. package/detail/provisioning.cattle.io.cluster.vue +31 -13
  256. package/detail/service.vue +1 -1
  257. package/detail/workload/index.vue +1 -0
  258. package/dialog/AddCustomBadgeDialog.vue +318 -161
  259. package/dialog/DeactivateDriverDialog.vue +137 -0
  260. package/dialog/RollbackWorkloadDialog.vue +2 -2
  261. package/dialog/RotateCertificatesDialog.vue +0 -21
  262. package/dialog/ScaleMachineDownDialog.vue +34 -17
  263. package/directives/clean-html.js +15 -0
  264. package/directives/clean-tooltip.js +32 -0
  265. package/directives/focus.js +41 -0
  266. package/directives/int-number.js +21 -0
  267. package/directives/positive-int-number.js +19 -0
  268. package/directives/trim-whitespace.js +19 -0
  269. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  270. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  271. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  272. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  273. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  274. package/edit/__tests__/nodeDriver.test.ts +107 -0
  275. package/edit/__tests__/service.test.ts +85 -0
  276. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  277. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  278. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  279. package/edit/auth/__tests__/azuread.test.ts +241 -0
  280. package/edit/auth/__tests__/oidc.test.ts +137 -0
  281. package/edit/auth/azuread.vue +133 -31
  282. package/edit/auth/github.vue +5 -17
  283. package/edit/auth/googleoauth.vue +6 -23
  284. package/edit/auth/ldap/index.vue +5 -17
  285. package/edit/auth/oidc.vue +143 -42
  286. package/edit/auth/saml.vue +5 -14
  287. package/edit/catalog.cattle.io.clusterrepo.vue +177 -9
  288. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  289. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  290. package/edit/cloudcredential.vue +28 -4
  291. package/edit/configmap.vue +10 -4
  292. package/edit/fleet.cattle.io.gitrepo.vue +3 -1
  293. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  294. package/edit/kontainerDriver.vue +65 -0
  295. package/edit/logging-flow/Match.vue +10 -9
  296. package/edit/logging-flow/index.vue +4 -19
  297. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  298. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  299. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  300. package/edit/management.cattle.io.project.vue +3 -53
  301. package/edit/management.cattle.io.setting.vue +52 -2
  302. package/edit/management.cattle.io.user.vue +2 -1
  303. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  304. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  305. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +1 -1
  306. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +2 -2
  307. package/edit/monitoring.coreos.com.alertmanagerconfig/types/slack.vue +1 -1
  308. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +15 -3
  309. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +4 -1
  310. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  311. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  312. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  313. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  314. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  315. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  316. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +46 -7
  317. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/{selectors.ts → selectors.test.ts} +1 -1
  318. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  319. package/edit/nodeDriver.vue +65 -0
  320. package/edit/persistentvolume/index.vue +2 -2
  321. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +33 -16
  322. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +276 -0
  323. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +473 -0
  324. package/edit/provisioning.cattle.io.cluster/__tests__/{CustomCommand.tests.ts → CustomCommand.test.ts} +3 -0
  325. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  326. package/edit/provisioning.cattle.io.cluster/__tests__/DrainOptions.test.ts +1 -1
  327. package/edit/provisioning.cattle.io.cluster/__tests__/index.test.ts +73 -0
  328. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +77 -13
  329. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +391 -0
  330. package/edit/provisioning.cattle.io.cluster/import.vue +4 -4
  331. package/edit/provisioning.cattle.io.cluster/index.vue +126 -51
  332. package/edit/provisioning.cattle.io.cluster/rke2.vue +325 -791
  333. package/edit/provisioning.cattle.io.cluster/tabs/AddOnConfig.vue +137 -0
  334. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +217 -0
  335. package/edit/provisioning.cattle.io.cluster/{Basics.vue → tabs/Basics.vue} +123 -129
  336. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  337. package/edit/provisioning.cattle.io.cluster/{MachinePool.vue → tabs/MachinePool.vue} +1 -0
  338. package/edit/provisioning.cattle.io.cluster/{S3Config.vue → tabs/etcd/S3Config.vue} +1 -0
  339. package/edit/provisioning.cattle.io.cluster/tabs/etcd/index.vue +135 -0
  340. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +190 -0
  341. package/edit/provisioning.cattle.io.cluster/{RegistryConfigs.vue → tabs/registries/RegistryConfigs.vue} +3 -0
  342. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +148 -0
  343. package/edit/provisioning.cattle.io.cluster/tabs/upgrade/index.vue +76 -0
  344. package/edit/resources.cattle.io.backup.vue +139 -124
  345. package/edit/resources.cattle.io.restore.vue +146 -126
  346. package/edit/service.vue +13 -0
  347. package/edit/serviceaccount.vue +46 -4
  348. package/edit/token.vue +3 -1
  349. package/edit/workload/Upgrading.vue +3 -2
  350. package/edit/workload/__tests__/Job.test.ts +1 -3
  351. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  352. package/edit/workload/index.vue +2 -1
  353. package/edit/workload/mixins/workload.js +35 -2
  354. package/edit/workload/storage/emptyDir.vue +2 -2
  355. package/initialize/App.vue +75 -0
  356. package/initialize/app-extended.js +128 -0
  357. package/initialize/entry-helpers.js +546 -0
  358. package/initialize/entry.js +32 -0
  359. package/initialize/install-components.js +23 -0
  360. package/initialize/install-directives.js +59 -0
  361. package/initialize/install-plugins.js +123 -0
  362. package/list/__tests__/workload.test.ts +1 -1
  363. package/list/catalog.cattle.io.app.vue +1 -0
  364. package/list/cis.cattle.io.clusterscan.vue +16 -10
  365. package/list/group.principal.vue +2 -2
  366. package/list/management.cattle.io.feature.vue +16 -16
  367. package/list/management.cattle.io.setting.vue +1 -0
  368. package/list/management.cattle.io.user.vue +13 -4
  369. package/list/networking.k8s.io.ingress.vue +36 -0
  370. package/list/node.vue +212 -73
  371. package/list/provisioning.cattle.io.cluster.vue +17 -4
  372. package/list/ui.cattle.io.navlink.vue +2 -2
  373. package/list/workload.vue +22 -0
  374. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  375. package/machine-config/__tests__/vmwarevsphere.test.ts +1 -3
  376. package/machine-config/amazonec2.vue +1 -1
  377. package/machine-config/azure.vue +2 -1
  378. package/machine-config/generic.vue +11 -15
  379. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  380. package/machine-config/vmwarevsphere.vue +31 -27
  381. package/middleware/authenticated.js +23 -399
  382. package/mixins/__tests__/chart.test.ts +48 -6
  383. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  384. package/mixins/auth-config.js +5 -9
  385. package/mixins/brand.js +102 -96
  386. package/mixins/chart.js +27 -13
  387. package/mixins/create-edit-view/index.js +2 -2
  388. package/mixins/fetch.client.js +42 -48
  389. package/mixins/labeled-form-element.ts +27 -2
  390. package/mixins/page-actions.js +7 -5
  391. package/mixins/resource-fetch-api-pagination.js +304 -0
  392. package/mixins/resource-fetch-namespaced.js +1 -1
  393. package/mixins/resource-fetch.js +46 -5
  394. package/models/__tests__/cluster.test.ts +44 -0
  395. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  396. package/models/__tests__/management.cattle.io.cluster.test.ts +23 -0
  397. package/models/__tests__/management.cattle.io.node.ts +85 -0
  398. package/models/__tests__/management.cattle.io.nodepool.ts +83 -0
  399. package/models/__tests__/namespace.test.ts +49 -9
  400. package/models/__tests__/provisioning.cattle.io.cluster.test.ts +241 -0
  401. package/models/__tests__/schema.tests.ts +24 -0
  402. package/models/__tests__/secret.test.ts +37 -0
  403. package/models/__tests__/steve-schema.test.ts +73 -0
  404. package/models/__tests__/storage.k8s.io.storageclass.test.ts +22 -0
  405. package/models/__tests__/workload.test.ts +91 -0
  406. package/models/catalog.cattle.io.app.js +8 -0
  407. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  408. package/models/catalog.cattle.io.uiplugin.js +7 -8
  409. package/models/cis.cattle.io.clusterscan.js +29 -8
  410. package/models/cloudcredential.js +9 -1
  411. package/models/cluster/node.js +8 -4
  412. package/models/cluster/schema.js +6 -0
  413. package/models/cluster.js +33 -0
  414. package/models/cluster.x-k8s.io.machine.js +1 -1
  415. package/models/cluster.x-k8s.io.machinedeployment.js +14 -0
  416. package/models/driver.js +63 -0
  417. package/models/fleet.cattle.io.cluster.js +27 -11
  418. package/models/fleet.cattle.io.gitrepo.js +66 -13
  419. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  420. package/models/kontainerdriver.js +85 -0
  421. package/models/management/schema.js +6 -0
  422. package/models/management.cattle.io.authconfig.js +3 -2
  423. package/models/management.cattle.io.cluster.js +16 -7
  424. package/models/management.cattle.io.globalrole.js +2 -0
  425. package/models/management.cattle.io.kontainerdriver.js +1 -0
  426. package/models/management.cattle.io.node.js +18 -14
  427. package/models/management.cattle.io.nodepool.js +17 -0
  428. package/models/management.cattle.io.project.js +0 -36
  429. package/models/management.cattle.io.setting.js +11 -7
  430. package/models/management.cattle.io.user.js +2 -2
  431. package/models/monitoring.coreos.com.receiver.js +3 -1
  432. package/models/monitoring.coreos.com.route.js +1 -1
  433. package/models/namespace.js +1 -1
  434. package/models/networking.k8s.io.ingress.js +2 -1
  435. package/models/nodedriver.js +85 -0
  436. package/models/pod.js +20 -0
  437. package/models/provisioning.cattle.io.cluster.js +125 -10
  438. package/models/schema.js +28 -7
  439. package/models/secret.js +126 -18
  440. package/models/service.js +2 -0
  441. package/models/steve-schema.ts +254 -0
  442. package/models/storage.k8s.io.storageclass.js +1 -1
  443. package/models/workload.js +17 -0
  444. package/models/workload.service.js +18 -0
  445. package/package.json +18 -14
  446. package/pages/about.vue +12 -6
  447. package/pages/account/create-key.vue +0 -1
  448. package/pages/account/index.vue +7 -3
  449. package/pages/auth/login.vue +106 -103
  450. package/pages/auth/logout.vue +2 -4
  451. package/pages/auth/setup.vue +92 -66
  452. package/pages/auth/verify.vue +30 -24
  453. package/pages/c/_cluster/apps/charts/__tests__/install.helper.test.ts +2 -17
  454. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  455. package/pages/c/_cluster/apps/charts/index.vue +99 -69
  456. package/pages/c/_cluster/apps/charts/install.helpers.js +2 -13
  457. package/pages/c/_cluster/apps/charts/install.vue +12 -11
  458. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  459. package/pages/c/_cluster/auth/config/index.vue +15 -9
  460. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  461. package/pages/c/_cluster/ecm/index.vue +0 -2
  462. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  463. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  464. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  465. package/pages/c/_cluster/explorer/index.vue +253 -91
  466. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  467. package/pages/c/_cluster/explorer/tools/index.vue +10 -6
  468. package/pages/c/_cluster/fleet/index.vue +89 -94
  469. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  470. package/pages/c/_cluster/longhorn/index.vue +52 -17
  471. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  472. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  473. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  474. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +91 -0
  475. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  476. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  477. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +60 -0
  478. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  479. package/pages/c/_cluster/manager/pages/_page.vue +4 -5
  480. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  481. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  482. package/pages/c/_cluster/neuvector/index.vue +1 -0
  483. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  484. package/pages/c/_cluster/settings/banners.vue +86 -10
  485. package/pages/c/_cluster/settings/brand.vue +261 -38
  486. package/pages/c/_cluster/settings/index.vue +4 -6
  487. package/pages/c/_cluster/settings/links.vue +3 -2
  488. package/pages/c/_cluster/settings/performance.vue +71 -3
  489. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  490. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +12 -8
  491. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  492. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +10 -46
  493. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  494. package/pages/c/_cluster/uiplugins/InstallDialog.vue +55 -19
  495. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  496. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  497. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  498. package/pages/c/_cluster/uiplugins/index.vue +38 -54
  499. package/pages/diagnostic.vue +2 -2
  500. package/pages/fail-whale.vue +103 -42
  501. package/pages/home.vue +81 -24
  502. package/pages/prefs.vue +8 -4
  503. package/pages/support/index.vue +14 -10
  504. package/pkg/auto-import.js +1 -1
  505. package/plugins/axios.js +0 -36
  506. package/plugins/back-button.js +3 -5
  507. package/plugins/clean-html-directive.js +5 -30
  508. package/plugins/clean-html.js +53 -0
  509. package/plugins/clean-tooltip-directive.js +6 -31
  510. package/plugins/codemirror-loader.js +1 -1
  511. package/plugins/codemirror.js +41 -9
  512. package/plugins/dashboard-store/__tests__/mutations.test.ts +389 -0
  513. package/plugins/dashboard-store/__tests__/resource-class.test.ts +49 -0
  514. package/plugins/dashboard-store/__tests__/utils/store-mocks.ts +7 -0
  515. package/plugins/dashboard-store/actions.js +132 -25
  516. package/plugins/dashboard-store/classify.js +1 -18
  517. package/plugins/dashboard-store/getters.js +154 -44
  518. package/plugins/dashboard-store/index.js +0 -111
  519. package/plugins/dashboard-store/mutations.js +150 -52
  520. package/plugins/dashboard-store/resource-class.js +77 -127
  521. package/plugins/directives.js +6 -39
  522. package/plugins/ember-cookie.js +13 -0
  523. package/plugins/global-formatters.js +26 -5
  524. package/plugins/i18n.js +89 -55
  525. package/plugins/int-number.js +6 -20
  526. package/plugins/plugin.js +3 -3
  527. package/plugins/positive-int-number.js +6 -17
  528. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +81 -10
  529. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  530. package/plugins/steve/__tests__/resource-utils.test.ts +159 -0
  531. package/plugins/steve/__tests__/steve-class.test.ts +59 -0
  532. package/plugins/steve/__tests__/subscribe.spec.ts +4 -1
  533. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  534. package/plugins/steve/__tests__/utils/steve-mocks.ts +31 -0
  535. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  536. package/plugins/steve/actions.js +3 -38
  537. package/plugins/steve/getters.js +164 -61
  538. package/plugins/steve/hybrid-class.js +5 -1
  539. package/plugins/steve/mutations.js +24 -3
  540. package/plugins/steve/norman-class.js +142 -2
  541. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  542. package/plugins/steve/resource-utils.ts +38 -0
  543. package/plugins/steve/schema.d.ts +22 -0
  544. package/plugins/steve/steve-class.js +22 -0
  545. package/plugins/steve/steve-pagination-utils.ts +368 -0
  546. package/plugins/steve/subscribe.js +17 -76
  547. package/plugins/trim-whitespace.js +6 -34
  548. package/plugins/vue-js-modal.js +1 -1
  549. package/promptRemove/pod.vue +15 -7
  550. package/public/index.html +1 -0
  551. package/rancher-components/Accordion/Accordion.test.ts +45 -0
  552. package/rancher-components/Accordion/Accordion.vue +86 -0
  553. package/rancher-components/Accordion/index.ts +1 -0
  554. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  555. package/rancher-components/Banner/Banner.test.ts +1 -5
  556. package/rancher-components/Banner/Banner.vue +2 -2
  557. package/rancher-components/Card/Card.vue +4 -4
  558. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  559. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +18 -1
  560. package/rancher-components/Form/LabeledInput/LabeledInput.vue +57 -24
  561. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  562. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  563. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  564. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +6 -4
  565. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  566. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  567. package/rancher-components/StringList/StringList.test.ts +270 -0
  568. package/rancher-components/StringList/StringList.vue +65 -26
  569. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +69 -0
  570. package/scripts/clean +1 -1
  571. package/scripts/extension/bundle +19 -7
  572. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  573. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  574. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  575. package/scripts/extension/helm/package/Dockerfile +1 -1
  576. package/scripts/extension/helm/scripts/package +11 -3
  577. package/scripts/extension/helm/scripts/patch +27 -0
  578. package/scripts/extension/parse-tag-name +4 -4
  579. package/scripts/extension/publish +25 -14
  580. package/scripts/publish-shell.sh +11 -1
  581. package/scripts/serve-pkgs +0 -2
  582. package/scripts/test-plugins-build.sh +87 -11
  583. package/scripts/vue-migrate.js +683 -0
  584. package/server/har-file.js +183 -0
  585. package/store/__tests__/catalog.test.ts +224 -0
  586. package/store/__tests__/type-map.test.ts +1122 -0
  587. package/store/auth.js +23 -4
  588. package/store/aws.js +53 -6
  589. package/store/catalog.js +22 -6
  590. package/store/cru-resource.ts +26 -0
  591. package/store/customisation.js +35 -0
  592. package/store/features.js +7 -4
  593. package/store/i18n.js +11 -0
  594. package/store/index.js +140 -49
  595. package/store/plugins.js +8 -4
  596. package/store/prefs.js +33 -38
  597. package/store/type-map.js +288 -213
  598. package/store/type-map.utils.ts +226 -0
  599. package/tsconfig.json +34 -9
  600. package/tsconfig.paths.json +21 -0
  601. package/types/components/labeledSelect.ts +50 -0
  602. package/types/resources/settings.d.ts +32 -0
  603. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  604. package/types/shell/index.d.ts +1045 -770
  605. package/types/store/dashboard-store.types.ts +42 -0
  606. package/types/store/pagination.types.ts +457 -0
  607. package/types/store/type-map.ts +30 -0
  608. package/types/store/vuex.d.ts +9 -0
  609. package/types/vue-shim.d.ts +51 -0
  610. package/utils/__tests__/cluster.test.ts +20 -18
  611. package/utils/__tests__/create-yaml.test.ts +359 -2
  612. package/utils/__tests__/kontainer.test.ts +180 -0
  613. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  614. package/utils/alertmanagerconfig.js +19 -0
  615. package/utils/array.ts +40 -1
  616. package/utils/async.ts +2 -0
  617. package/utils/auth.js +152 -4
  618. package/utils/axios.js +2 -21
  619. package/utils/azure.js +24 -0
  620. package/utils/banners.js +103 -0
  621. package/utils/clipboard.js +5 -0
  622. package/utils/cluster.js +1 -1
  623. package/utils/config.js +4 -0
  624. package/utils/create-yaml.js +59 -28
  625. package/utils/custom-validators.js +0 -2
  626. package/utils/error.js +41 -1
  627. package/utils/formatter.js +5 -3
  628. package/utils/git.ts +1 -1
  629. package/utils/install-redirect.js +1 -1
  630. package/utils/kontainer.ts +190 -0
  631. package/utils/object.js +24 -0
  632. package/utils/pagination-utils.ts +154 -0
  633. package/utils/pod-security-admission.ts +1 -1
  634. package/utils/router.js +86 -0
  635. package/utils/settings.ts +46 -0
  636. package/utils/time.js +2 -1
  637. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  638. package/utils/url.ts +1 -1
  639. package/utils/validators/formRules/__tests__/index.test.ts +70 -4
  640. package/utils/validators/formRules/index.ts +15 -9
  641. package/utils/validators/index.js +1 -0
  642. package/utils/validators/setting.js +6 -10
  643. package/utils/version.js +2 -1
  644. package/vue.config.js +377 -401
  645. package/.DS_Store +0 -0
  646. package/assets/images/providers/aks-black.svg +0 -28
  647. package/assets/images/providers/aks.svg +0 -31
  648. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  649. package/components/ChartPsp.vue +0 -76
  650. package/components/EventsTable.vue +0 -67
  651. package/components/TabbedLinks/index.vue +0 -94
  652. package/components/__tests__/ChartPsp.test.ts +0 -75
  653. package/components/formatter/__tests__/ClusterProvider.test.ts +0 -28
  654. package/components/nuxt/nuxt-link.server.js +0 -16
  655. package/components/nuxt/nuxt.js +0 -101
  656. package/config/router.js +0 -408
  657. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.tests.ts +0 -237
  658. package/initialize/App.js +0 -198
  659. package/initialize/client.js +0 -875
  660. package/initialize/index.js +0 -364
  661. package/initialize/layouts.ts +0 -26
  662. package/middleware/i18n.js +0 -10
  663. package/middleware/unauthenticated.js +0 -22
  664. package/mixins/fetch.server.js +0 -73
  665. package/pages/c/_cluster/apps/index.vue +0 -17
  666. package/pages/c/_cluster/auth/index.vue +0 -19
  667. package/pages/c/_cluster/index.vue +0 -17
  668. package/pages/c/_cluster/legacy/index.vue +0 -22
  669. package/pages/c/_cluster/manager/index.vue +0 -22
  670. package/pages/c/_cluster/mcapps/index.vue +0 -21
  671. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  672. package/pages/c/index.vue +0 -9
  673. package/pages/rio/mesh.vue +0 -508
  674. package/plugins/dashboard-store/__tests__/mutations.spec.ts +0 -406
  675. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  676. package/plugins/portal-vue.js +0 -4
  677. package/plugins/portal.js +0 -4
  678. package/plugins/resize.js +0 -5
  679. package/plugins/shortkey.js +0 -4
  680. package/plugins/tooltip.js +0 -4
  681. package/plugins/transitions.js +0 -4
  682. package/plugins/v-select.js +0 -4
  683. package/plugins/vue-clipboard2.js +0 -4
  684. package/tsconfig.default.json +0 -46
  685. package/utils/group.js +0 -70
  686. package/utils/nuxt.js +0 -659
  687. package/utils/router.scrollBehavior.js +0 -80
  688. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  689. /package/edit/provisioning.cattle.io.cluster/{AgentConfiguration.vue → tabs/AgentConfiguration.vue} +0 -0
  690. /package/edit/provisioning.cattle.io.cluster/{MemberRoles.vue → tabs/MemberRoles.vue} +0 -0
  691. /package/edit/provisioning.cattle.io.cluster/{ACE.vue → tabs/networking/ACE.vue} +0 -0
  692. /package/edit/provisioning.cattle.io.cluster/{RegistryMirrors.vue → tabs/registries/RegistryMirrors.vue} +0 -0
  693. /package/edit/provisioning.cattle.io.cluster/{DrainOptions.vue → tabs/upgrade/DrainOptions.vue} +0 -0
  694. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  695. /package/plugins/dashboard-store/__tests__/{actions.spec.ts → actions.test.ts} +0 -0
  696. /package/plugins/dashboard-store/__tests__/{getters.spec.ts → getters.test.ts} +0 -0
  697. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  698. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  699. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -1,875 +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, NuxtError } 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
- // Load error layout
96
- let layout = (NuxtError.options || NuxtError).layout;
97
-
98
- if (typeof layout === 'function') {
99
- layout = layout(currentApp.context);
100
- }
101
- if (layout) {
102
- await currentApp.loadLayout(layout).catch(() => {});
103
- }
104
- currentApp.setLayout(layout);
105
-
106
- currentApp.error(err);
107
- }
108
- }
109
-
110
- if (typeof defaultErrorHandler === 'function') {
111
- return handled;
112
- }
113
-
114
- // Log to console
115
- if (process.env.NODE_ENV !== 'production') {
116
- console.error(err); // eslint-disable-line no-console
117
- } else {
118
- console.error(err.message || err); // eslint-disable-line no-console
119
- }
120
- };
121
- Vue.config.$nuxt = {};
122
- }
123
- Vue.config.$nuxt.$nuxt = true;
124
- }
125
-
126
- const errorHandler = Vue.config.errorHandler || console.error; // eslint-disable-line no-console
127
-
128
- // Create and mount App
129
- createApp(null, nuxt.publicRuntimeConfig).then(mountApp).catch(errorHandler); // eslint-disable-line no-undef
130
-
131
- function componentOption(component, key, ...args) {
132
- if (!component || !component.options || !component.options[key]) {
133
- return {};
134
- }
135
- const option = component.options[key];
136
-
137
- if (typeof option === 'function') {
138
- return option(...args);
139
- }
140
-
141
- return option;
142
- }
143
-
144
- function mapTransitions(toComponents, to, from) {
145
- const componentTransitions = (component) => {
146
- const transition = componentOption(component, 'transition', to, from) || {};
147
-
148
- return (typeof transition === 'string' ? { name: transition } : transition);
149
- };
150
-
151
- const fromComponents = from ? getMatchedComponents(from) : [];
152
- const maxDepth = Math.max(toComponents.length, fromComponents.length);
153
-
154
- const mergedTransitions = [];
155
-
156
- for (let i = 0; i < maxDepth; i++) {
157
- // Clone original objects to prevent overrides
158
- const toTransitions = Object.assign({}, componentTransitions(toComponents[i]));
159
- const transitions = Object.assign({}, componentTransitions(fromComponents[i]));
160
-
161
- // Combine transitions & prefer `leave` properties of "from" route
162
- Object.keys(toTransitions)
163
- .filter((key) => typeof toTransitions[key] !== 'undefined' && !key.toLowerCase().includes('leave'))
164
- .forEach((key) => {
165
- transitions[key] = toTransitions[key];
166
- });
167
-
168
- mergedTransitions.push(transitions);
169
- }
170
-
171
- return mergedTransitions;
172
- }
173
-
174
- async function loadAsyncComponents(to, from, next) {
175
- // Check if route changed (this._routeChanged), only if the page is not an error (for validate())
176
- this._routeChanged = Boolean(app.nuxt.err) || from.name !== to.name;
177
- this._paramChanged = !this._routeChanged && from.path !== to.path;
178
- this._queryChanged = !this._paramChanged && from.fullPath !== to.fullPath;
179
- this._diffQuery = (this._queryChanged ? getQueryDiff(to.query, from.query) : []);
180
-
181
- if ((this._routeChanged || this._paramChanged) && this.$loading.start && !this.$loading.manual) {
182
- this.$loading.start();
183
- }
184
-
185
- try {
186
- if (this._queryChanged) {
187
- const Components = await resolveRouteComponents(
188
- to,
189
- (Component, instance) => ({ Component, instance })
190
- );
191
- // Add a marker on each component that it needs to refresh or not
192
- const startLoader = Components.some(({ Component, instance }) => {
193
- const watchQuery = Component.options.watchQuery;
194
-
195
- if (watchQuery === true) {
196
- return true;
197
- }
198
- if (Array.isArray(watchQuery)) {
199
- return watchQuery.some((key) => this._diffQuery[key]);
200
- }
201
- if (typeof watchQuery === 'function') {
202
- return watchQuery.apply(instance, [to.query, from.query]);
203
- }
204
-
205
- return false;
206
- });
207
-
208
- if (startLoader && this.$loading.start && !this.$loading.manual) {
209
- this.$loading.start();
210
- }
211
- }
212
- // Call next()
213
- next();
214
- } catch (error) {
215
- const err = error || {};
216
- const statusCode = err.statusCode || err.status || (err.response && err.response.status) || 500;
217
- const message = err.message || '';
218
-
219
- // Handle chunk loading errors
220
- // This may be due to a new deployment or a network problem
221
- if (/^Loading( CSS)? chunk (\d)+ failed\./.test(message)) {
222
- window.location.reload(true /* skip cache */);
223
-
224
- return; // prevent error page blinking for user
225
- }
226
-
227
- this.error({ statusCode, message });
228
- this.$nuxt.$emit('routeChanged', to, from, err);
229
- next();
230
- }
231
- }
232
-
233
- function applySSRData(Component, ssrData) {
234
- if (NUXT.serverRendered && ssrData) {
235
- applyAsyncData(Component, ssrData);
236
- }
237
-
238
- Component._Ctor = Component;
239
-
240
- return Component;
241
- }
242
-
243
- // Get matched components
244
- function resolveComponents(route) {
245
- return flatMapComponents(route, async(Component, _, match, key, index) => {
246
- // If component is not resolved yet, resolve it
247
- if (typeof Component === 'function' && !Component.options) {
248
- Component = await Component();
249
- }
250
- // Sanitize it and save it
251
- const _Component = applySSRData(sanitizeComponent(Component), NUXT.data ? NUXT.data[index] : null);
252
-
253
- match.components[key] = _Component;
254
-
255
- return _Component;
256
- });
257
- }
258
-
259
- function callMiddleware(Components, context, layout) {
260
- let midd = ['i18n'];
261
- let unknownMiddleware = false;
262
-
263
- // If layout is undefined, only call global middleware
264
- if (typeof layout !== 'undefined') {
265
- midd = []; // Exclude global middleware if layout defined (already called before)
266
- layout = sanitizeComponent(layout);
267
- if (layout.options.middleware) {
268
- midd = midd.concat(layout.options.middleware);
269
- }
270
- Components.forEach((Component) => {
271
- if (Component.options.middleware) {
272
- midd = midd.concat(Component.options.middleware);
273
- }
274
- });
275
- }
276
-
277
- midd = midd.map((name) => {
278
- if (typeof name === 'function') {
279
- return name;
280
- }
281
- if (typeof middleware[name] !== 'function') {
282
- unknownMiddleware = true;
283
- this.error({ statusCode: 500, message: `Unknown middleware ${ name }` });
284
- }
285
-
286
- return middleware[name];
287
- });
288
-
289
- if (unknownMiddleware) {
290
- return;
291
- }
292
-
293
- return middlewareSeries(midd, context);
294
- }
295
-
296
- async function render(to, from, next) {
297
- if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
298
- return next();
299
- }
300
-
301
- if (to === from) {
302
- _lastPaths = [];
303
- } else {
304
- const fromMatches = [];
305
-
306
- _lastPaths = getMatchedComponents(from, fromMatches).map((Component, i) => {
307
- return compile(from.matched[fromMatches[i]].path)(from.params);
308
- });
309
- }
310
-
311
- // nextCalled is true when redirected
312
- let nextCalled = false;
313
- const _next = (path) => {
314
- if (from.path === path.path && this.$loading.finish) {
315
- this.$loading.finish();
316
- }
317
-
318
- if (from.path !== path.path && this.$loading.pause) {
319
- this.$loading.pause();
320
- }
321
-
322
- if (nextCalled) {
323
- return;
324
- }
325
-
326
- nextCalled = true;
327
- next(path);
328
- };
329
-
330
- // Update context
331
- await setContext(app, {
332
- route: to,
333
- from,
334
- next: _next.bind(this)
335
- });
336
- this._dateLastError = app.nuxt.dateErr;
337
- this._hadError = Boolean(app.nuxt.err);
338
-
339
- // Get route's matched components
340
- const matches = [];
341
- const Components = getMatchedComponents(to, matches);
342
-
343
- // If no Components matched, generate 404
344
- if (!Components.length) {
345
- // Default layout
346
- await callMiddleware.call(this, Components, app.context);
347
- if (nextCalled) {
348
- return;
349
- }
350
-
351
- // Load layout for error page
352
- const errorLayout = (NuxtError.options || NuxtError).layout;
353
- const layout = await this.loadLayout(
354
- typeof errorLayout === 'function' ? errorLayout.call(NuxtError, app.context) : errorLayout
355
- );
356
-
357
- await callMiddleware.call(this, Components, app.context, layout);
358
- if (nextCalled) {
359
- return;
360
- }
361
-
362
- // Show error page
363
- app.context.error({ statusCode: 404, message: 'This page could not be found' });
364
-
365
- return next();
366
- }
367
-
368
- // Update ._data and other properties if hot reloaded
369
- Components.forEach((Component) => {
370
- if (Component._Ctor && Component._Ctor.options) {
371
- Component.options.asyncData = Component._Ctor.options.asyncData;
372
- Component.options.fetch = Component._Ctor.options.fetch;
373
- }
374
- });
375
-
376
- // Apply transitions
377
- this.setTransitions(mapTransitions(Components, to, from));
378
-
379
- try {
380
- // Call middleware
381
- await callMiddleware.call(this, Components, app.context);
382
- if (nextCalled) {
383
- return;
384
- }
385
- if (app.context._errored) {
386
- return next();
387
- }
388
-
389
- // Set layout
390
- let layout = Components[0].options.layout;
391
-
392
- if (typeof layout === 'function') {
393
- layout = layout(app.context);
394
- }
395
- layout = await this.loadLayout(layout);
396
-
397
- // Call middleware for layout
398
- await callMiddleware.call(this, Components, app.context, layout);
399
- if (nextCalled) {
400
- return;
401
- }
402
- if (app.context._errored) {
403
- return next();
404
- }
405
-
406
- // Call .validate()
407
- let isValid = true;
408
-
409
- try {
410
- for (const Component of Components) {
411
- if (typeof Component.options.validate !== 'function') {
412
- continue;
413
- }
414
-
415
- isValid = await Component.options.validate(app.context);
416
-
417
- if (!isValid) {
418
- break;
419
- }
420
- }
421
- } catch (validationError) {
422
- // ...If .validate() threw an error
423
- this.error({
424
- statusCode: validationError.statusCode || '500',
425
- message: validationError.message
426
- });
427
-
428
- return next();
429
- }
430
-
431
- // ...If .validate() returned false
432
- if (!isValid) {
433
- this.error({ statusCode: 404, message: 'This page could not be found' });
434
-
435
- return next();
436
- }
437
-
438
- let instances;
439
-
440
- // Call asyncData & fetch hooks on components matched by the route.
441
- await Promise.all(Components.map((Component, i) => {
442
- // Check if only children route changed
443
- Component._path = compile(to.matched[matches[i]].path)(to.params);
444
- Component._dataRefresh = false;
445
- const childPathChanged = Component._path !== _lastPaths[i];
446
-
447
- // Refresh component (call asyncData & fetch) when:
448
- // Route path changed part includes current component
449
- // Or route param changed part includes current component and watchParam is not `false`
450
- // Or route query is changed and watchQuery returns `true`
451
- if (this._routeChanged && childPathChanged) {
452
- Component._dataRefresh = true;
453
- } else if (this._paramChanged && childPathChanged) {
454
- const watchParam = Component.options.watchParam;
455
-
456
- Component._dataRefresh = watchParam !== false;
457
- } else if (this._queryChanged) {
458
- const watchQuery = Component.options.watchQuery;
459
-
460
- if (watchQuery === true) {
461
- Component._dataRefresh = true;
462
- } else if (Array.isArray(watchQuery)) {
463
- Component._dataRefresh = watchQuery.some((key) => this._diffQuery[key]);
464
- } else if (typeof watchQuery === 'function') {
465
- if (!instances) {
466
- instances = getMatchedComponentsInstances(to);
467
- }
468
- Component._dataRefresh = watchQuery.apply(instances[i], [to.query, from.query]);
469
- }
470
- }
471
- if (!this._hadError && this._isMounted && !Component._dataRefresh) {
472
- return;
473
- }
474
-
475
- const promises = [];
476
-
477
- const hasAsyncData = (
478
- Component.options.asyncData &&
479
- typeof Component.options.asyncData === 'function'
480
- );
481
-
482
- const hasFetch = Boolean(Component.options.fetch) && Component.options.fetch.length;
483
-
484
- const loadingIncrease = (hasAsyncData && hasFetch) ? 30 : 45;
485
-
486
- // Call asyncData(context)
487
- if (hasAsyncData) {
488
- const promise = promisify(Component.options.asyncData, app.context);
489
-
490
- promise.then((asyncDataResult) => {
491
- applyAsyncData(Component, asyncDataResult);
492
-
493
- if (this.$loading.increase) {
494
- this.$loading.increase(loadingIncrease);
495
- }
496
- });
497
- promises.push(promise);
498
- }
499
-
500
- // Check disabled page loading
501
- this.$loading.manual = Component.options.loading === false;
502
-
503
- // Call fetch(context)
504
- if (hasFetch) {
505
- let p = Component.options.fetch(app.context);
506
-
507
- if (!p || (!(p instanceof Promise) && (typeof p.then !== 'function'))) {
508
- p = Promise.resolve(p);
509
- }
510
- p.then((fetchResult) => {
511
- if (this.$loading.increase) {
512
- this.$loading.increase(loadingIncrease);
513
- }
514
- });
515
- promises.push(p);
516
- }
517
-
518
- return Promise.all(promises);
519
- }));
520
-
521
- // If not redirected
522
- if (!nextCalled) {
523
- if (this.$loading.finish && !this.$loading.manual) {
524
- this.$loading.finish();
525
- }
526
-
527
- next();
528
- }
529
- } catch (err) {
530
- const error = err || {};
531
-
532
- if (error.message === 'ERR_REDIRECT') {
533
- return this.$nuxt.$emit('routeChanged', to, from, error);
534
- }
535
- _lastPaths = [];
536
-
537
- globalHandleError(error);
538
-
539
- // Load error layout
540
- let layout = (NuxtError.options || NuxtError).layout;
541
-
542
- if (typeof layout === 'function') {
543
- layout = layout(app.context);
544
- }
545
- await this.loadLayout(layout);
546
-
547
- this.error(error);
548
- this.$nuxt.$emit('routeChanged', to, from, error);
549
- next();
550
- }
551
- }
552
-
553
- // Fix components format in matched, it's due to code-splitting of vue-router
554
- function normalizeComponents(to, ___) {
555
- flatMapComponents(to, (Component, _, match, key) => {
556
- if (typeof Component === 'object' && !Component.options) {
557
- // Updated via vue-router resolveAsyncComponents()
558
- Component = Vue.extend(Component);
559
- Component._Ctor = Component;
560
- match.components[key] = Component;
561
- }
562
-
563
- return Component;
564
- });
565
- }
566
-
567
- function setLayoutForNextPage(to) {
568
- // Set layout
569
- let hasError = Boolean(this.$options.nuxt.err);
570
-
571
- if (this._hadError && this._dateLastError === this.$options.nuxt.dateErr) {
572
- hasError = false;
573
- }
574
- let layout = hasError ? (NuxtError.options || NuxtError).layout : to.matched[0].components.default.options.layout;
575
-
576
- if (typeof layout === 'function') {
577
- layout = layout(app.context);
578
- }
579
-
580
- this.setLayout(layout);
581
- }
582
-
583
- function checkForErrors(app) {
584
- // Hide error component if no error
585
- if (app._hadError && app._dateLastError === app.$options.nuxt.dateErr) {
586
- app.error();
587
- }
588
- }
589
-
590
- // When navigating on a different route but the same component is used, Vue.js
591
- // Will not update the instance data, so we have to update $data ourselves
592
- function fixPrepatch(to, ___) {
593
- if (this._routeChanged === false && this._paramChanged === false && this._queryChanged === false) {
594
- return;
595
- }
596
-
597
- const instances = getMatchedComponentsInstances(to);
598
- const Components = getMatchedComponents(to);
599
-
600
- let triggerScroll = false;
601
-
602
- Vue.nextTick(() => {
603
- instances.forEach((instance, i) => {
604
- if (!instance || instance._isDestroyed) {
605
- return;
606
- }
607
-
608
- if (
609
- instance.constructor._dataRefresh &&
610
- Components[i] === instance.constructor &&
611
- instance.$vnode.data.keepAlive !== true &&
612
- typeof instance.constructor.options.data === 'function'
613
- ) {
614
- const newData = instance.constructor.options.data.call(instance);
615
-
616
- for (const key in newData) {
617
- Vue.set(instance.$data, key, newData[key]);
618
- }
619
-
620
- triggerScroll = true;
621
- }
622
- });
623
-
624
- if (triggerScroll) {
625
- // Ensure to trigger scroll event after calling scrollBehavior
626
- window.$nuxt.$nextTick(() => {
627
- window.$nuxt.$emit('triggerScroll');
628
- });
629
- }
630
-
631
- checkForErrors(this);
632
-
633
- // Hot reloading
634
- if (isDev) {
635
- setTimeout(() => hotReloadAPI(this), 100);
636
- }
637
- });
638
- }
639
-
640
- function nuxtReady(_app) {
641
- window.onNuxtReadyCbs.forEach((cb) => {
642
- if (typeof cb === 'function') {
643
- cb(_app);
644
- }
645
- });
646
- // Special JSDOM
647
- if (typeof window._onNuxtLoaded === 'function') {
648
- window._onNuxtLoaded(_app);
649
- }
650
- // Add router hooks
651
- router.afterEach((to, from) => {
652
- // Wait for fixPrepatch + $data updates
653
- Vue.nextTick(() => _app.$nuxt.$emit('routeChanged', to, from));
654
- });
655
- }
656
-
657
- const noopData = () => {
658
- return {};
659
- };
660
- const noopFetch = () => {};
661
-
662
- // Special hot reload with asyncData(context)
663
- function getNuxtChildComponents($parent, $components = []) {
664
- $parent.$children.forEach(($child) => {
665
- if ($child.$vnode && $child.$vnode.data.nuxtChild && !$components.find((c) => (c.$options.__file === $child.$options.__file))) {
666
- $components.push($child);
667
- }
668
- if ($child.$children && $child.$children.length) {
669
- getNuxtChildComponents($child, $components);
670
- }
671
- });
672
-
673
- return $components;
674
- }
675
-
676
- function hotReloadAPI(_app) {
677
- if (!module.hot) {
678
- return;
679
- }
680
-
681
- const $components = getNuxtChildComponents(_app.$nuxt, []);
682
-
683
- $components.forEach(addHotReload.bind(_app));
684
- }
685
-
686
- function addHotReload($component, depth) {
687
- if ($component.$vnode.data._hasHotReload) {
688
- return;
689
- }
690
- $component.$vnode.data._hasHotReload = true;
691
-
692
- const _forceUpdate = $component.$forceUpdate.bind($component.$parent);
693
-
694
- $component.$vnode.context.$forceUpdate = async() => {
695
- const Components = getMatchedComponents(router.currentRoute);
696
- let Component = Components[depth];
697
-
698
- if (!Component) {
699
- return _forceUpdate();
700
- }
701
- if (typeof Component === 'object' && !Component.options) {
702
- // Updated via vue-router resolveAsyncComponents()
703
- Component = Vue.extend(Component);
704
- Component._Ctor = Component;
705
- }
706
- this.error();
707
- const promises = [];
708
- const next = function(path) {
709
- this.$loading.finish && this.$loading.finish();
710
- router.push(path);
711
- };
712
-
713
- await setContext(app, {
714
- route: router.currentRoute,
715
- isHMR: true,
716
- next: next.bind(this)
717
- });
718
- const context = app.context;
719
-
720
- if (this.$loading.start && !this.$loading.manual) {
721
- this.$loading.start();
722
- }
723
-
724
- callMiddleware.call(this, Components, context)
725
- .then(() => {
726
- // If layout changed
727
- if (depth !== 0) {
728
- return;
729
- }
730
-
731
- let layout = Component.options.layout || 'default';
732
-
733
- if (typeof layout === 'function') {
734
- layout = layout(context);
735
- }
736
- if (this.layoutName === layout) {
737
- return;
738
- }
739
- const promise = this.loadLayout(layout);
740
-
741
- promise.then(() => {
742
- this.setLayout(layout);
743
- Vue.nextTick(() => hotReloadAPI(this));
744
- });
745
-
746
- return promise;
747
- })
748
-
749
- .then(() => {
750
- return callMiddleware.call(this, Components, context, this.layout);
751
- })
752
-
753
- .then(() => {
754
- // Call asyncData(context)
755
- const pAsyncData = promisify(Component.options.asyncData || noopData, context);
756
-
757
- pAsyncData.then((asyncDataResult) => {
758
- applyAsyncData(Component, asyncDataResult);
759
- this.$loading.increase && this.$loading.increase(30);
760
- });
761
- promises.push(pAsyncData);
762
-
763
- // Call fetch()
764
- Component.options.fetch = Component.options.fetch || noopFetch;
765
- let pFetch = Component.options.fetch.length && Component.options.fetch(context);
766
-
767
- if (!pFetch || (!(pFetch instanceof Promise) && (typeof pFetch.then !== 'function'))) {
768
- pFetch = Promise.resolve(pFetch);
769
- }
770
- pFetch.then(() => this.$loading.increase && this.$loading.increase(30));
771
- promises.push(pFetch);
772
-
773
- return Promise.all(promises);
774
- })
775
- .then(() => {
776
- this.$loading.finish && this.$loading.finish();
777
- _forceUpdate();
778
- setTimeout(() => hotReloadAPI(this), 100);
779
- });
780
- };
781
- }
782
-
783
- async function mountApp(__app) {
784
- // Set global variables
785
- app = __app.app;
786
- router = __app.router;
787
-
788
- // Create Vue instance
789
- const _app = new Vue(app);
790
-
791
- // Mounts Vue app to DOM element
792
- const mount = () => {
793
- _app.$mount('#app');
794
-
795
- // Add afterEach router hooks
796
- router.afterEach(normalizeComponents);
797
-
798
- router.afterEach(setLayoutForNextPage.bind(_app));
799
-
800
- router.afterEach(fixPrepatch.bind(_app));
801
-
802
- // Listen for first Vue update
803
- Vue.nextTick(() => {
804
- // Call window.{{globals.readyCallback}} callbacks
805
- nuxtReady(_app);
806
-
807
- if (isDev) {
808
- // Enable hot reloading
809
- hotReloadAPI(_app);
810
- }
811
- });
812
- };
813
-
814
- // Resolve route components
815
- const Components = await Promise.all(resolveComponents(app.context.route));
816
-
817
- // Enable transitions
818
- _app.setTransitions = _app.$options.nuxt.setTransitions.bind(_app);
819
- if (Components.length) {
820
- _app.setTransitions(mapTransitions(Components, router.currentRoute));
821
- _lastPaths = router.currentRoute.matched.map((route) => compile(route.path)(router.currentRoute.params));
822
- }
823
-
824
- // Initialize error handler
825
- _app.$loading = {}; // To avoid error while _app.$nuxt does not exist
826
- if (NUXT.error) {
827
- _app.error(NUXT.error);
828
- }
829
-
830
- // Add beforeEach router hooks
831
- router.beforeEach(loadAsyncComponents.bind(_app));
832
- router.beforeEach(render.bind(_app));
833
-
834
- // Fix in static: remove trailing slash to force hydration
835
- // Full static, if server-rendered: hydrate, to allow custom redirect to generated page
836
-
837
- // Fix in static: remove trailing slash to force hydration
838
- if (NUXT.serverRendered && isSamePath(NUXT.routePath, _app.context.route.path)) {
839
- return mount();
840
- }
841
-
842
- // First render on client-side
843
- const clientFirstMount = () => {
844
- normalizeComponents(router.currentRoute, router.currentRoute);
845
- setLayoutForNextPage.call(_app, router.currentRoute);
846
- checkForErrors(_app);
847
- // Don't call fixPrepatch.call(_app, router.currentRoute, router.currentRoute) since it's first render
848
- mount();
849
- };
850
-
851
- // fix: force next tick to avoid having same timestamp when an error happen on spa fallback
852
- await new Promise((resolve) => setTimeout(resolve, 0));
853
- render.call(_app, router.currentRoute, router.currentRoute, (path) => {
854
- // If not redirected
855
- if (!path) {
856
- clientFirstMount();
857
-
858
- return;
859
- }
860
-
861
- // Add a one-time afterEach hook to
862
- // mount the app wait for redirect and route gets resolved
863
- const unregisterHook = router.afterEach((to, from) => {
864
- unregisterHook();
865
- clientFirstMount();
866
- });
867
-
868
- // Push the path and let route to be resolved
869
- router.push(path, undefined, (err) => {
870
- if (err) {
871
- errorHandler(err);
872
- }
873
- });
874
- });
875
- }