@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
package/vue.config.js CHANGED
@@ -1,16 +1,18 @@
1
1
  const fs = require('fs');
2
2
  const path = require('path');
3
- const serveStatic = require('serve-static');
4
3
  const webpack = require('webpack');
5
4
  const { generateDynamicTypeImport } = require('./pkg/auto-import');
6
5
  const CopyWebpackPlugin = require('copy-webpack-plugin');
7
6
  const serverMiddlewares = require('./server/server-middleware.js');
8
7
  const configHelper = require('./vue-config-helper.js');
8
+ const har = require('./server/har-file');
9
+ const VirtualModulesPlugin = require('webpack-virtual-modules');
9
10
 
10
11
  // Suppress info level logging messages from http-proxy-middleware
11
12
  // This hides all of the "[HPM Proxy created] ..." messages
12
13
  const oldInfoLogger = console.info; // eslint-disable-line no-console
13
14
 
15
+ // TODO: Add explanation of this logic
14
16
  console.info = () => {}; // eslint-disable-line no-console
15
17
 
16
18
  const { createProxyMiddleware } = require('http-proxy-middleware');
@@ -20,29 +22,16 @@ console.info = oldInfoLogger; // eslint-disable-line no-console
20
22
  // This is currently hardcoded to avoid importing the TS
21
23
  // const { STANDARD } = require('./config/private-label');
22
24
  const STANDARD = 1;
23
-
24
- const dev = configHelper.dev;
25
- const devPorts = configHelper.devPorts;
26
-
27
- // human readable version used on rancher dashboard about page
28
- const dashboardVersion = process.env.DASHBOARD_VERSION;
29
-
25
+ const { dev, devPorts, api } = configHelper;
26
+ const dashboardVersion = process.env.DASHBOARD_VERSION; // semver rancher dashboard in about page
30
27
  const pl = process.env.PL || STANDARD;
31
28
  const commit = process.env.COMMIT || 'head';
32
29
  const perfTest = (process.env.PERF_TEST === 'true'); // Enable performance testing when in dev
33
- const instrumentCode = (process.env.TEST_INSTRUMENT === 'true'); // Instrument code for code coverage in e2e tests
34
30
 
35
- const api = configHelper.api;
36
- // ===============================================================================================
37
- // Nuxt configuration
38
- // ===============================================================================================
39
-
40
- // Expose a function that can be used by an app to provide a nuxt configuration for building an application
41
- // This takes the directory of the application as tehfirst argument so that we can derive folder locations
42
- // from it, rather than from the location of this file
43
- module.exports = function(dir, _appConfig) {
44
- // Paths to the shell folder when it is included as a node dependency
45
- let SHELL = 'node_modules/@rancher/shell';
31
+ /**
32
+ * Paths to the shell folder when it is included as a node dependency
33
+ */
34
+ const getShellPaths = (dir) => {
46
35
  let SHELL_ABS = path.join(dir, 'node_modules/@rancher/shell');
47
36
  let COMPONENTS_DIR = path.join(SHELL_ABS, 'rancher-components');
48
37
 
@@ -60,15 +49,66 @@ module.exports = function(dir, _appConfig) {
60
49
  // If we have a local folder named 'shell' then use that rather than the one in node_modules
61
50
  // This will be the case in the main dashboard repository.
62
51
  if (fs.existsSync(path.join(dir, 'shell'))) {
63
- SHELL = './shell';
64
52
  SHELL_ABS = path.join(dir, 'shell');
65
53
  COMPONENTS_DIR = path.join(dir, 'pkg', 'rancher-components', 'src', 'components');
66
54
  }
67
55
 
56
+ return { SHELL_ABS, COMPONENTS_DIR };
57
+ };
58
+
59
+ const getProxyConfig = (proxyConfig) => ({
60
+ ...proxyConfig,
61
+ '/k8s': configHelper.proxyWsOpts(api), // Straight to a remote cluster (/k8s/clusters/<id>/)
62
+ '/pp': configHelper.proxyWsOpts(api), // For (epinio) standalone API
63
+ '/api': configHelper.proxyWsOpts(api), // Management k8s API
64
+ '/apis': configHelper.proxyWsOpts(api), // Management k8s API
65
+ '/v1': configHelper.proxyWsOpts(api), // Management Steve API
66
+ '/v3': configHelper.proxyWsOpts(api), // Rancher API
67
+ '/v3-public': configHelper.proxyOpts(api), // Rancher Unauthed API
68
+ '/api-ui': configHelper.proxyOpts(api), // Browser API UI
69
+ '/meta': configHelper.proxyMetaOpts(api), // Browser API UI
70
+ '/v1-*': configHelper.proxyOpts(api), // SAML, KDM, etc
71
+ '/rancherversion': configHelper.proxyPrimeOpts(api), // Rancher version endpoint
72
+ // These are for Ember embedding
73
+ '/c/*/edit': configHelper.proxyOpts('https://127.0.0.1:8000'), // Can't proxy all of /c because that's used by Vue too
74
+ '/k/': configHelper.proxyOpts('https://127.0.0.1:8000'),
75
+ '/g/': configHelper.proxyOpts('https://127.0.0.1:8000'),
76
+ '/n/': configHelper.proxyOpts('https://127.0.0.1:8000'),
77
+ '/p/': configHelper.proxyOpts('https://127.0.0.1:8000'),
78
+ '/assets': configHelper.proxyOpts('https://127.0.0.1:8000'),
79
+ '/translations': configHelper.proxyOpts('https://127.0.0.1:8000'),
80
+ '/engines-dist': configHelper.proxyOpts('https://127.0.0.1:8000'),
81
+ });
82
+
83
+ /**
84
+ * @pkg imports must be resolved to the package that it importing them - this allows a package to use @pkg as an alias
85
+ * to the root of that particular package
86
+ */
87
+ const getPackageImport = (dir) => new webpack.NormalModuleReplacementPlugin(/^@pkg/, (resource) => {
88
+ const ctx = resource.context.split('/');
89
+ // Find 'pkg' folder in the context
90
+ const index = ctx.findIndex((s) => s === 'pkg');
91
+
92
+ if (index !== -1 && (index + 1) < ctx.length) {
93
+ const pkg = ctx[index + 1];
94
+ let p = path.resolve(dir, 'pkg', pkg, resource.request.substr(5));
95
+
96
+ if (resource.request.startsWith(`@pkg/${ pkg }`)) {
97
+ p = path.resolve(dir, 'pkg', resource.request.substr(5));
98
+ }
99
+
100
+ resource.request = p;
101
+ }
102
+ });
103
+
104
+ const getLoaders = (SHELL_ABS) => {
105
+ const instrumentCode = (process.env.TEST_INSTRUMENT === 'true'); // Instrument code for code coverage in e2e tests
106
+ // Instrument code for tests
68
107
  const babelPlugins = [
69
- // TODO: Browser support
108
+ // TODO: Browser support; also add explanation to this TODO
70
109
  // ['@babel/plugin-transform-modules-commonjs'],
71
- ['@babel/plugin-proposal-private-property-in-object', { loose: true }]
110
+ ['@babel/plugin-proposal-private-property-in-object', { loose: true }],
111
+ ['@babel/plugin-proposal-class-properties', { loose: true }]
72
112
  ];
73
113
 
74
114
  if (instrumentCode) {
@@ -79,271 +119,368 @@ module.exports = function(dir, _appConfig) {
79
119
  console.warn('Instrumenting code for coverage'); // eslint-disable-line no-console
80
120
  }
81
121
 
82
- // ===============================================================================================
83
- // Functions for the UI Pluginas
84
- // ===============================================================================================
85
-
86
- const appConfig = _appConfig || {};
87
- const excludes = appConfig.excludes || [];
88
-
89
- const serverMiddleware = [];
90
- const watcherIgnores = [
91
- /.shell/,
92
- /dist-pkg/,
93
- /scripts\/standalone/
122
+ return [
123
+ // Ensure there is a fallback for browsers that don't support web workers
124
+ {
125
+ test: /web-worker.[a-z-]+.js/i,
126
+ loader: 'worker-loader',
127
+ options: { inline: 'fallback' },
128
+ },
129
+ // Handler for csv files (e.g. ec2 instance data)
130
+ {
131
+ test: /\.csv$/i,
132
+ loader: 'csv-loader',
133
+ options: {
134
+ dynamicTyping: true,
135
+ header: true,
136
+ skipEmptyLines: true
137
+ },
138
+ },
139
+ // Handler for yaml files (used for i18n files, for example)
140
+ {
141
+ test: /\.ya?ml$/i,
142
+ loader: 'js-yaml-loader',
143
+ options: { name: '[path][name].[ext]' },
144
+ },
145
+ {
146
+ test: /\.m?[tj]sx?$/,
147
+ // This excludes no modules except for node_modules/@rancher/... so that plugins can properly compile
148
+ // when referencing @rancher/shell
149
+ exclude: /node_modules\/(?!(@rancher)\/).*/,
150
+ use: [
151
+ {
152
+ loader: 'cache-loader',
153
+ options: {
154
+ cacheDirectory: 'node_modules/.cache/babel-loader',
155
+ cacheIdentifier: 'e93f32da'
156
+ }
157
+ },
158
+ {
159
+ loader: 'babel-loader',
160
+ options: {
161
+ presets: [
162
+ [
163
+ require.resolve('@nuxt/babel-preset-app'),
164
+ {
165
+ corejs: { version: 3 },
166
+ targets: { browsers: ['last 2 versions'] },
167
+ modern: true
168
+ }
169
+ ],
170
+ '@babel/preset-typescript',
171
+ ],
172
+ plugins: babelPlugins
173
+ }
174
+ }
175
+ ]
176
+ },
177
+ {
178
+ test: /\.tsx?$/,
179
+ use: [
180
+ {
181
+ loader: 'cache-loader',
182
+ options: {
183
+ cacheDirectory: 'node_modules/.cache/ts-loader',
184
+ cacheIdentifier: '3596741e'
185
+ }
186
+ },
187
+ {
188
+ loader: 'ts-loader',
189
+ options: {
190
+ transpileOnly: true,
191
+ happyPackMode: false,
192
+ appendTsxSuffixTo: [
193
+ '\\.vue$'
194
+ ],
195
+ configFile: path.join(SHELL_ABS, 'tsconfig.json')
196
+ }
197
+ }
198
+ ]
199
+ },
200
+ // Prevent warning in log with the md files in the content folder
201
+ {
202
+ test: /\.md$/,
203
+ use: [
204
+ {
205
+ loader: 'frontmatter-markdown-loader',
206
+ options: { mode: ['body'] }
207
+ }
208
+ ]
209
+ },
94
210
  ];
211
+ };
95
212
 
96
- // Find any UI packages in node_modules
97
- const NM = path.join(dir, 'node_modules');
98
- const pkg = require(path.join(dir, 'package.json'));
99
- const nmPackages = {};
213
+ const getDevServerConfig = (proxy) => {
214
+ const harFile = process.env.HAR_FILE;
215
+ // HAR File support - load network responses from the specified .har file and use those rather than communicating to the Rancher server
216
+ const harData = harFile ? har.loadFile(harFile, devPorts ? 8005 : 80, '') : undefined;
217
+
218
+ return {
219
+ https: (devPorts ? {
220
+ key: fs.readFileSync(path.resolve(__dirname, 'server/server.key')),
221
+ cert: fs.readFileSync(path.resolve(__dirname, 'server/server.crt'))
222
+ } : null),
223
+ port: (devPorts ? 8005 : 80),
224
+ host: '0.0.0.0',
225
+ public: `https://0.0.0.0:${ devPorts ? 8005 : 80 }`,
226
+ before(app, server) {
227
+ const socketProxies = {};
228
+
229
+ // Close down quickly in response to CTRL + C
230
+ process.once('SIGINT', () => {
231
+ server.close();
232
+ console.log('\n'); // eslint-disable-line no-console
233
+ process.exit(1);
234
+ });
100
235
 
101
- if (pkg && pkg.dependencies) {
102
- Object.keys(pkg.dependencies).forEach((pkg) => {
103
- const f = require(path.join(NM, pkg, 'package.json'));
236
+ app.use(serverMiddlewares);
104
237
 
105
- // The package.json must have the 'rancher' property to mark it as a UI package
106
- if (f.rancher) {
107
- const id = `${ f.name }-${ f.version }`;
238
+ if (harData) {
239
+ console.log('Installing HAR file middleware'); // eslint-disable-line no-console
240
+ app.use(har.harProxy(harData, process.env.HAR_DIR));
108
241
 
109
- nmPackages[id] = f.main;
242
+ server.websocketProxies.push({
243
+ upgrade(req, socket, head) {
244
+ const responseHeaders = ['HTTP/1.1 101 Web Socket Protocol Handshake', 'Upgrade: WebSocket', 'Connection: Upgrade'];
110
245
 
111
- // Add server middleware to serve up the files for this UI package
112
- serverMiddleware.push({
113
- path: `/pkg/${ id }`,
114
- handler: serveStatic(path.join(NM, pkg))
246
+ socket.write(`${ responseHeaders.join('\r\n') }\r\n\r\n`);
247
+ }
115
248
  });
116
249
  }
117
- });
118
- }
119
-
120
- serverMiddleware.push({
121
- path: '/uiplugins-catalog',
122
- handler: (req, res, next) => {
123
- const p = req.url.split('?');
124
250
 
125
- try {
126
- const proxy = createProxyMiddleware({
127
- target: p[1],
128
- pathRewrite: { '^.*': p[0] }
251
+ Object.keys(proxy).forEach((p) => {
252
+ const px = createProxyMiddleware({
253
+ ...proxy[p],
254
+ ws: false // We will handle the web socket upgrade
129
255
  });
130
256
 
131
- return proxy(req, res, next);
132
- } catch (e) {
133
- console.error(e); // eslint-disable-line no-console
134
- }
135
- }
136
- });
257
+ if (proxy[p].ws) {
258
+ socketProxies[p] = px;
259
+ }
260
+ app.use(p, px);
261
+ });
137
262
 
138
- function includePkg(name) {
139
- if (name.startsWith('.') || name === 'node_modules') {
140
- return false;
141
- }
263
+ server.websocketProxies.push({
264
+ upgrade(req, socket, head) {
265
+ const path = Object.keys(socketProxies).find((path) => req.url.startsWith(path));
142
266
 
143
- return !excludes || (excludes && !excludes.includes(name));
144
- }
267
+ if (path) {
268
+ const proxy = socketProxies[path];
145
269
 
146
- excludes.forEach((e) => {
147
- watcherIgnores.push(new RegExp(`/pkg.${ e }`));
148
- });
270
+ if (proxy.upgrade) {
271
+ proxy.upgrade(req, socket, head);
272
+ } else {
273
+ console.log(`Upgrade for Proxy is not defined. Cannot upgrade Web socket for ${ req.url }`); // eslint-disable-line no-console
274
+ }
275
+ } else {
276
+ console.log(`Unknown Web socket upgrade request for ${ req.url }`); // eslint-disable-line no-console
277
+ }
278
+ }
279
+ });
280
+ },
281
+ };
282
+ };
149
283
 
150
- // For each package in the pkg folder that is being compiled into the application,
151
- // Add in the code to automatically import the types from that package
152
- // This imports models, edit, detail, list etc
153
- // When built as a UI package, shell/pkg/vue.config.js does the same thing
154
- const autoImportTypes = {};
155
- const VirtualModulesPlugin = require('webpack-virtual-modules');
156
- let reqs = '';
157
- const pkgFolder = path.relative(dir, './pkg');
284
+ /**
285
+ * Generate a virtual module '@rancher/dynamic.js` which imports all of the packages that should be built into the application
286
+ * This is imported in 'shell/extensions/extension-loader.js` which ensures the all code for plugins to be included is imported in the application
287
+ */
288
+ const getVirtualModules = (dir, includePkg) => {
289
+ // Find any UI packages in node_modules
290
+ const modulePaths = path.join(dir, 'node_modules');
291
+ const requiredPackages = require(path.join(dir, 'package.json'));
292
+ const librariesIndex = {};
158
293
 
159
- if (fs.existsSync(pkgFolder)) {
160
- const items = fs.readdirSync(path.relative(dir, './pkg'));
294
+ if (requiredPackages && requiredPackages.dependencies) {
295
+ Object.keys(requiredPackages.dependencies).forEach((requiredPackage) => {
296
+ const library = require(path.join(modulePaths, requiredPackage, 'package.json'));
161
297
 
162
- // Ignore hidden folders
163
- items.filter((name) => !name.startsWith('.')).forEach((name) => {
164
- const f = require(path.join(dir, 'pkg', name, 'package.json'));
298
+ // The package.json must have the 'rancher' property to mark it as a UI package
299
+ if (library.rancher) {
300
+ const id = `${ library.name }-${ library.version }`;
165
301
 
166
- // Package file must have rancher field to be a plugin
167
- if (includePkg(name) && f.rancher) {
168
- reqs += `$plugin.initPlugin('${ name }', require(\'~/pkg/${ name }\')); `;
302
+ librariesIndex[id] = library.main;
169
303
  }
170
-
171
- // // Serve the code for the UI package in case its used for dynamic loading (but not if the same package was provided in node_modules)
172
- // if (!nmPackages[name]) {
173
- // const pkgPackageFile = require(path.join(dir, 'pkg', name, 'package.json'));
174
- // const pkgRef = `${ name }-${ pkgPackageFile.version }`;
175
-
176
- // serverMiddleware.push({ path: `/pkg/${ pkgRef }`, handler: serveStatic(`${ dir }/dist-pkg/${ pkgRef }`) });
177
- // }
178
- autoImportTypes[`node_modules/@rancher/auto-import/${ name }`] = generateDynamicTypeImport(`@pkg/${ name }`, path.join(dir, `pkg/${ name }`));
179
304
  });
180
305
  }
181
306
 
182
- Object.keys(nmPackages).forEach((m) => {
183
- reqs += `$plugin.loadAsync('${ m }', '/pkg/${ m }/${ nmPackages[m] }');`;
184
- });
307
+ let reqs = '';
308
+ const pkgFolder = path.relative(dir, './pkg');
185
309
 
186
- // Generate a virtual module '@rancher/dyanmic.js` which imports all of the packages that should be built into the application
187
- // This is imported in 'shell/extensions/extension-loader.js` which ensures the all code for plugins to be included is imported in the application
188
- const virtualModules = new VirtualModulesPlugin({ 'node_modules/@rancher/dynamic.js': `export default function ($plugin) { ${ reqs } };` });
189
- const autoImport = new webpack.NormalModuleReplacementPlugin(/^@rancher\/auto-import$/, (resource) => {
190
- const ctx = resource.context.split('/');
191
- const pkg = ctx[ctx.length - 1];
310
+ if (fs.existsSync(pkgFolder)) {
311
+ fs.readdirSync(pkgFolder)
312
+ .filter((name) => !name.startsWith('.')) // Ignore hidden folders
313
+ .forEach((name) => {
314
+ const library = require(path.join(dir, 'pkg', name, 'package.json'));
315
+
316
+ // Package file must have rancher field to be a plugin
317
+ if (includePkg(name) && library.rancher) {
318
+ reqs += `$plugin.initPlugin('${ name }', require(\'~/pkg/${ name }\')); `;
319
+ }
320
+ });
321
+ }
192
322
 
193
- resource.request = `@rancher/auto-import/${ pkg }`;
323
+ Object.keys(librariesIndex).forEach((i) => {
324
+ reqs += `$plugin.loadAsync('${ i }', '/pkg/${ i }/${ librariesIndex[i] }');`;
194
325
  });
195
326
 
196
- // @pkg imports must be resolved to the package that it importing them - this allows a package to use @pkg as an alis
197
- // to the root of that particular package
198
- const pkgImport = new webpack.NormalModuleReplacementPlugin(/^@pkg/, (resource) => {
199
- const ctx = resource.context.split('/');
200
- // Find 'pkg' folder in the contxt
201
- const index = ctx.findIndex((s) => s === 'pkg');
202
-
203
- if (index !== -1 && (index + 1) < ctx.length) {
204
- const pkg = ctx[index + 1];
205
- let p = path.resolve(dir, 'pkg', pkg, resource.request.substr(5));
206
-
207
- if (resource.request.startsWith(`@pkg/${ pkg }`)) {
208
- p = path.resolve(dir, 'pkg', resource.request.substr(5));
209
- }
210
-
211
- resource.request = p;
212
- }
213
- });
327
+ return new VirtualModulesPlugin({ 'node_modules/@rancher/dynamic.js': `export default function ($plugin) { ${ reqs } };` });
328
+ };
214
329
 
215
- // Serve up the dist-pkg folder under /pkg
216
- serverMiddleware.push({ path: `/pkg/`, handler: serveStatic(`${ dir }/dist-pkg/`) });
217
- // Endpoint to download and unpack a tgz from the local verdaccio rgistry (dev)
218
- serverMiddleware.push(path.resolve(dir, SHELL, 'server', 'verdaccio-middleware'));
330
+ const getAutoImport = () => new webpack.NormalModuleReplacementPlugin(/^@rancher\/auto-import$/, (resource) => {
331
+ const ctx = resource.context.split('/');
332
+ const pkg = ctx[ctx.length - 1];
219
333
 
220
- // ===============================================================================================
221
- // Dashboard nuxt configuration
222
- // ===============================================================================================
334
+ resource.request = `@rancher/auto-import/${ pkg }`;
335
+ });
223
336
 
224
- require('events').EventEmitter.defaultMaxListeners = 20;
225
- require('dotenv').config();
226
-
227
- let routerBasePath = '/';
228
- let resourceBase = '';
229
- let outputDir = 'dist';
337
+ /**
338
+ * For each package in the pkg folder that is being compiled into the application,
339
+ * Add in the code to automatically import the types from that package
340
+ * This imports models, edit, detail, list etc
341
+ * When built as a UI package, shell/pkg/vue.config.js does the same thing
342
+ */
343
+ const getVirtualModulesAutoImport = (dir) => {
344
+ const autoImportTypes = {};
345
+ const pkgFolder = path.relative(dir, './pkg');
230
346
 
231
- if ( typeof process.env.ROUTER_BASE !== 'undefined' ) {
232
- routerBasePath = process.env.ROUTER_BASE;
347
+ if (fs.existsSync(pkgFolder)) {
348
+ fs.readdirSync(pkgFolder)
349
+ .filter((name) => !name.startsWith('.')) // Ignore hidden folders
350
+ .forEach((name) => {
351
+ autoImportTypes[`node_modules/@rancher/auto-import/${ name }`] = generateDynamicTypeImport(`@pkg/${ name }`, path.join(dir, `pkg/${ name }`));
352
+ });
233
353
  }
234
354
 
235
- if ( typeof process.env.RESOURCE_BASE !== 'undefined' ) {
236
- resourceBase = process.env.RESOURCE_BASE;
237
- }
355
+ return new VirtualModulesPlugin(autoImportTypes);
356
+ };
238
357
 
239
- if ( typeof process.env.OUTPUT_DIR !== 'undefined' ) {
240
- outputDir = process.env.OUTPUT_DIR;
241
- }
358
+ // Get current shell version
359
+ const shellPkgRawData = fs.readFileSync(path.join(__dirname, 'package.json'));
360
+ const shellPkgData = JSON.parse(shellPkgRawData);
361
+
362
+ /**
363
+ * DefinePlugin does string replacement within our code. We may want to consider replacing it with something else. In code we'll see something like
364
+ * process.env.commit even though process and env aren't even defined objects. This could cause people to be mislead.
365
+ */
366
+ const createEnvVariablesPlugin = (routerBasePath, rancherEnv) => new webpack.DefinePlugin({
367
+ 'process.env.UI_EXTENSIONS_API_VERSION': JSON.stringify(shellPkgData.version),
368
+ 'process.env.commit': JSON.stringify(commit),
369
+ 'process.env.version': JSON.stringify(dashboardVersion),
370
+ 'process.env.dev': JSON.stringify(dev),
371
+ 'process.env.pl': JSON.stringify(pl),
372
+ 'process.env.perfTest': JSON.stringify(perfTest),
373
+ 'process.env.loginLocaleSelector': JSON.stringify(process.env.LOGIN_LOCALE_SELECTOR || 'true'),
374
+ 'process.env.excludeOperatorPkg': JSON.stringify(process.env.EXCLUDE_OPERATOR_PKG || 'false'),
375
+ 'process.env.rancherEnv': JSON.stringify(rancherEnv),
376
+ 'process.env.harvesterPkgUrl': JSON.stringify(process.env.HARVESTER_PKG_URL),
377
+ 'process.env.api': JSON.stringify(api),
378
+ // Store the Router Base as env variable that we can use in `shell/config/router.js`
379
+ 'process.env.routerBase': JSON.stringify(routerBasePath),
380
+ });
381
+
382
+ /**
383
+ * Ensure we process files in the @rancher/shell folder
384
+ */
385
+ const processShellFiles = (config, SHELL_ABS) => {
386
+ config.module.rules.forEach((r) => {
387
+ if ('test.js'.match(r.test)) {
388
+ if (r.exclude) {
389
+ const orig = r.exclude;
390
+
391
+ r.exclude = function(modulePath) {
392
+ if (modulePath.indexOf(SHELL_ABS) === 0 || typeof orig !== 'function') {
393
+ return false;
394
+ }
242
395
 
243
- if ( resourceBase && !resourceBase.endsWith('/') ) {
244
- resourceBase += '/';
245
- }
396
+ return orig(modulePath);
397
+ };
398
+ }
399
+ }
400
+ });
401
+ };
402
+
403
+ /**
404
+ * Update vue-loader to set whitespace to 'preserve'
405
+ * This was the setting with nuxt, but is not the default with vue cli
406
+ * Need to find the vue loader in the webpack config and update the setting
407
+ */
408
+ const preserveWhitespace = (config) => {
409
+ config.module.rules.forEach((loader) => {
410
+ if (loader.use) {
411
+ loader.use.forEach((use) => {
412
+ if (use.loader.includes('vue-loader')) {
413
+ use.options.compilerOptions.whitespace = 'preserve';
414
+ }
415
+ });
416
+ }
417
+ });
418
+ };
246
419
 
420
+ const printLogs = (dev, dashboardVersion, resourceBase, routerBasePath, pl, rancherEnv) => {
247
421
  console.log(`Build: ${ dev ? 'Development' : 'Production' }`); // eslint-disable-line no-console
248
422
 
249
- if ( !dev ) {
423
+ if (!dev) {
250
424
  console.log(`Version: ${ dashboardVersion }`); // eslint-disable-line no-console
251
425
  }
252
426
 
253
- if ( resourceBase ) {
427
+ if (resourceBase) {
254
428
  console.log(`Resource Base URL: ${ resourceBase }`); // eslint-disable-line no-console
255
429
  }
256
430
 
257
- if ( routerBasePath !== '/' ) {
431
+ if (routerBasePath !== '/') {
258
432
  console.log(`Router Base Path: ${ routerBasePath }`); // eslint-disable-line no-console
259
433
  }
260
434
 
261
- if ( pl !== STANDARD ) {
435
+ if (pl !== STANDARD) {
262
436
  console.log(`PL: ${ pl }`); // eslint-disable-line no-console
263
437
  }
264
- const rancherEnv = process.env.RANCHER_ENV || 'web';
265
-
266
- const loginLocaleSelector = process.env.LOGIN_LOCALE_SELECTOR || 'true';
267
- const excludeOperatorPkg = process.env.EXCLUDE_OPERATOR_PKG || 'false';
268
438
 
269
439
  console.log(`API: '${ api }'. Env: '${ rancherEnv }'`); // eslint-disable-line no-console
270
- const proxy = {
271
- ...appConfig.proxies,
272
- '/k8s': configHelper.proxyWsOpts(api), // Straight to a remote cluster (/k8s/clusters/<id>/)
273
- '/pp': configHelper.proxyWsOpts(api), // For (epinio) standalone API
274
- '/api': configHelper.proxyWsOpts(api), // Management k8s API
275
- '/apis': configHelper.proxyWsOpts(api), // Management k8s API
276
- '/v1': configHelper.proxyWsOpts(api), // Management Steve API
277
- '/v3': configHelper.proxyWsOpts(api), // Rancher API
278
- '/v3-public': configHelper.proxyOpts(api), // Rancher Unauthed API
279
- '/api-ui': configHelper.proxyOpts(api), // Browser API UI
280
- '/meta': configHelper.proxyMetaOpts(api), // Browser API UI
281
- '/v1-*': configHelper.proxyOpts(api), // SAML, KDM, etc
282
- '/rancherversion': configHelper.proxyPrimeOpts(api), // Rancher version endpoint
283
- // These are for Ember embedding
284
- '/c/*/edit': configHelper.proxyOpts('https://127.0.0.1:8000'), // Can't proxy all of /c because that's used by Vue too
285
- '/k/': configHelper.proxyOpts('https://127.0.0.1:8000'),
286
- '/g/': configHelper.proxyOpts('https://127.0.0.1:8000'),
287
- '/n/': configHelper.proxyOpts('https://127.0.0.1:8000'),
288
- '/p/': configHelper.proxyOpts('https://127.0.0.1:8000'),
289
- '/assets': configHelper.proxyOpts('https://127.0.0.1:8000'),
290
- '/translations': configHelper.proxyOpts('https://127.0.0.1:8000'),
291
- '/engines-dist': configHelper.proxyOpts('https://127.0.0.1:8000'),
292
- };
440
+ };
293
441
 
294
- const config = {
295
- // Vue server
296
- devServer: {
297
- https: (devPorts ? {
298
- key: fs.readFileSync(path.resolve(__dirname, 'server/server.key')),
299
- cert: fs.readFileSync(path.resolve(__dirname, 'server/server.crt'))
300
- } : null),
301
- port: (devPorts ? 8005 : 80),
302
- host: '0.0.0.0',
303
- public: `https://0.0.0.0:${ devPorts ? 8005 : 80 }`,
304
- before(app, server) {
305
- const socketProxies = {};
306
-
307
- // Close down quickly in response to CTRL + C
308
- process.once('SIGINT', () => {
309
- server.close();
310
- console.log('\n'); // eslint-disable-line no-console
311
- process.exit(1);
312
- });
442
+ /**
443
+ * Expose a function that can be used by an app to provide a nuxt configuration for building an application
444
+ * This takes the directory of the application as the first argument so that we can derive folder locations
445
+ * from it, rather than from the location of this file
446
+ */
447
+ module.exports = function(dir, _appConfig) {
448
+ require('events').EventEmitter.defaultMaxListeners = 20;
449
+ require('dotenv').config();
313
450
 
314
- app.use(serverMiddlewares);
451
+ const { SHELL_ABS, COMPONENTS_DIR } = getShellPaths(dir);
452
+ const appConfig = _appConfig || {};
453
+ const excludes = appConfig.excludes || [];
454
+ const watcherIgnores = [
455
+ /.shell/,
456
+ /dist-pkg/,
457
+ /scripts\/standalone/,
458
+ ...excludes.map((e) => new RegExp(`/pkg.${ e }`))
459
+ ];
315
460
 
316
- Object.keys(proxy).forEach((p) => {
317
- const px = createProxyMiddleware({
318
- ...proxy[p],
319
- ws: false // We will handle the web socket upgrade
320
- });
461
+ const includePkg = (name) => {
462
+ if (name.startsWith('.') || name === 'node_modules') {
463
+ return false;
464
+ }
321
465
 
322
- if (proxy[p].ws) {
323
- socketProxies[p] = px;
324
- }
325
- app.use(p, px);
326
- });
466
+ return !excludes || (excludes && !excludes.includes(name));
467
+ };
327
468
 
328
- server.websocketProxies.push({
329
- upgrade(req, socket, head) {
330
- const path = Object.keys(socketProxies).find((path) => req.url.startsWith(path));
469
+ const routerBasePath = process.env.ROUTER_BASE ?? '/';
470
+ let resourceBase = process.env.RESOURCE_BASE ?? '';
471
+ const outputDir = process.env.OUTPUT_DIR ?? 'dist';
472
+ const rancherEnv = process.env.RANCHER_ENV || 'web';
331
473
 
332
- if (path) {
333
- const proxy = socketProxies[path];
474
+ if ( resourceBase && !resourceBase.endsWith('/') ) {
475
+ resourceBase += '/';
476
+ }
334
477
 
335
- if (proxy.upgrade) {
336
- proxy.upgrade(req, socket, head);
337
- } else {
338
- console.log(`Upgrade for Proxy is not defined. Cannot upgrade Web socket for ${ req.url }`); // eslint-disable-line no-console
339
- }
340
- } else {
341
- console.log(`Unknown Web socket upgrade request for ${ req.url }`); // eslint-disable-line no-console
342
- }
343
- }
344
- });
345
- },
346
- },
478
+ printLogs(dev, dashboardVersion, resourceBase, routerBasePath, pl, rancherEnv);
479
+
480
+ const proxy = getProxyConfig(appConfig.proxy);
481
+ const config = {
482
+ // Vue server
483
+ devServer: getDevServerConfig(proxy),
347
484
  publicPath: resourceBase || undefined,
348
485
  css: {
349
486
  extract: false, // inline css styles instead of including with `<links`
@@ -359,16 +496,13 @@ module.exports = function(dir, _appConfig) {
359
496
  }
360
497
  }
361
498
  },
362
-
363
499
  outputDir,
364
-
365
500
  pages: {
366
501
  index: {
367
- entry: path.join(SHELL_ABS, '/initialize/client.js'),
502
+ entry: path.join(SHELL_ABS, '/initialize/entry.js'),
368
503
  template: path.join(SHELL_ABS, '/public/index.html')
369
504
  }
370
505
  },
371
-
372
506
  configureWebpack(config) {
373
507
  config.resolve.alias['~'] = dir;
374
508
  config.resolve.alias['@'] = dir;
@@ -380,34 +514,11 @@ module.exports = function(dir, _appConfig) {
380
514
  config.resolve.alias['@components'] = COMPONENTS_DIR;
381
515
  config.resolve.alias['vue$'] = path.resolve(process.cwd(), 'node_modules', 'vue', 'dist', dev ? 'vue.js' : 'vue.min.js');
382
516
  config.resolve.modules.push(__dirname);
383
- config.plugins.push(virtualModules);
384
- config.plugins.push(autoImport);
385
- config.plugins.push(new VirtualModulesPlugin(autoImportTypes));
386
- config.plugins.push(pkgImport);
387
- // DefinePlugin does string replacement within our code. We may want to consider replacing it with something else. In code we'll see something like
388
- // process.env.commit even though process and env aren't even defined objects. This could cause people to be mislead.
389
- config.plugins.push(new webpack.DefinePlugin({
390
- 'process.client': JSON.stringify(true),
391
- 'process.env.commit': JSON.stringify(commit),
392
- 'process.env.version': JSON.stringify(dashboardVersion),
393
- 'process.env.dev': JSON.stringify(dev),
394
- 'process.env.pl': JSON.stringify(pl),
395
- 'process.env.perfTest': JSON.stringify(perfTest),
396
- 'process.env.loginLocaleSelector': JSON.stringify(loginLocaleSelector),
397
- 'process.env.excludeOperatorPkg': JSON.stringify(excludeOperatorPkg),
398
- 'process.env.rancherEnv': JSON.stringify(rancherEnv),
399
- 'process.env.harvesterPkgUrl': JSON.stringify(process.env.HARVESTER_PKG_URL),
400
- 'process.env.api': JSON.stringify(api),
401
- // Store the Router Base as env variable that we can use in `shell/config/router.js`
402
- 'process.env.routerBase': JSON.stringify(routerBasePath),
403
-
404
- // This is a replacement of the nuxt publicRuntimeConfig
405
- 'nuxt.publicRuntimeConfig': JSON.stringify({
406
- rancherEnv,
407
- dashboardVersion
408
- }),
409
-
410
- }));
517
+ config.plugins.push(getVirtualModules(dir, includePkg));
518
+ config.plugins.push(getAutoImport());
519
+ config.plugins.push(getVirtualModulesAutoImport(dir));
520
+ config.plugins.push(getPackageImport(dir));
521
+ config.plugins.push(createEnvVariablesPlugin(routerBasePath, rancherEnv));
411
522
 
412
523
  // The static assets need to be in the built assets directory in order to get served (primarily the favicon)
413
524
  config.plugins.push(new CopyWebpackPlugin([{ from: path.join(SHELL_ABS, 'static'), to: '.' }]));
@@ -423,144 +534,9 @@ module.exports = function(dir, _appConfig) {
423
534
  }
424
535
 
425
536
  config.resolve.symlinks = false;
426
-
427
- // Ensure we process files in the @rancher/shell folder
428
- config.module.rules.forEach((r) => {
429
- if ('test.js'.match(r.test)) {
430
- if (r.exclude) {
431
- const orig = r.exclude;
432
-
433
- r.exclude = function(modulePath) {
434
- if (modulePath.indexOf(SHELL_ABS) === 0 || typeof orig !== 'function') {
435
- return false;
436
- }
437
-
438
- return orig(modulePath);
439
- };
440
- }
441
- }
442
- });
443
-
444
- // Instrument code for tests
445
- const babelPlugins = [
446
- // TODO: Browser support
447
- // ['@babel/plugin-transform-modules-commonjs'],
448
- ['@babel/plugin-proposal-private-property-in-object', { loose: true }],
449
- ['@babel/plugin-proposal-class-properties', { loose: true }]
450
- ];
451
-
452
- if (instrumentCode) {
453
- babelPlugins.push([
454
- 'babel-plugin-istanbul', { extension: ['.js', '.vue'] }, 'add-vue'
455
- ]);
456
-
457
- console.warn('Instrumenting code for coverage'); // eslint-disable-line no-console
458
- }
459
-
460
- const loaders = [
461
- // Ensure there is a fallback for browsers that don't support web workers
462
- {
463
- test: /web-worker.[a-z-]+.js/i,
464
- loader: 'worker-loader',
465
- options: { inline: 'fallback' },
466
- },
467
- // Handler for csv files (e.g. ec2 instance data)
468
- {
469
- test: /\.csv$/i,
470
- loader: 'csv-loader',
471
- options: {
472
- dynamicTyping: true,
473
- header: true,
474
- skipEmptyLines: true
475
- },
476
- },
477
- // Handler for yaml files (used for i18n files, for example)
478
- {
479
- test: /\.ya?ml$/i,
480
- loader: 'js-yaml-loader',
481
- options: { name: '[path][name].[ext]' },
482
- },
483
- {
484
- test: /\.m?[tj]sx?$/,
485
- // This excludes no modules except for node_modules/@rancher/... so that plugins can properly compile
486
- // when referencing @rancher/shell
487
- exclude: /node_modules\/(?!(@rancher)\/).*/,
488
- use: [
489
- {
490
- loader: 'cache-loader',
491
- options: {
492
- cacheDirectory: 'node_modules/.cache/babel-loader',
493
- cacheIdentifier: 'e93f32da'
494
- }
495
- },
496
- {
497
- loader: 'babel-loader',
498
- options: {
499
- presets: [
500
- [
501
- require.resolve('@nuxt/babel-preset-app'),
502
- {
503
- corejs: { version: 3 },
504
- targets: { browsers: ['last 2 versions'] },
505
- modern: true
506
- }
507
- ],
508
- '@babel/preset-typescript',
509
- ],
510
- plugins: babelPlugins
511
- }
512
- }
513
- ]
514
- },
515
- {
516
- test: /\.tsx?$/,
517
- use: [
518
- {
519
- loader: 'cache-loader',
520
- options: {
521
- cacheDirectory: 'node_modules/.cache/ts-loader',
522
- cacheIdentifier: '3596741e'
523
- }
524
- },
525
- {
526
- loader: 'ts-loader',
527
- options: {
528
- transpileOnly: true,
529
- happyPackMode: false,
530
- appendTsxSuffixTo: [
531
- '\\.vue$'
532
- ],
533
- configFile: path.join(SHELL_ABS, 'tsconfig.json')
534
- }
535
- }
536
- ]
537
- },
538
- // Prevent warning in log with the md files in the content folder
539
- {
540
- test: /\.md$/,
541
- use: [
542
- {
543
- loader: 'frontmatter-markdown-loader',
544
- options: { mode: ['body'] }
545
- }
546
- ]
547
- }
548
- ];
549
-
550
- config.module.rules.push(...loaders);
551
-
552
- // Update vue-loader to set whitespace to 'preserve'
553
- // This was the setting with nuxt, but is not the default with vue cli
554
- // Need to find the vue loader in the webpack config and update the setting
555
- config.module.rules.forEach((loader) => {
556
- if (loader.use) {
557
- loader.use.forEach((use) => {
558
- if (use.loader.includes('vue-loader')) {
559
- use.options.compilerOptions.whitespace = 'preserve';
560
- }
561
- });
562
- }
563
- });
537
+ processShellFiles(config, SHELL_ABS);
538
+ config.module.rules.push(...getLoaders(SHELL_ABS));
539
+ preserveWhitespace(config);
564
540
  },
565
541
  };
566
542