@rancher/shell 0.5.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
package/vue.config.js CHANGED
@@ -1,17 +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');
9
8
  const har = require('./server/har-file');
9
+ const VirtualModulesPlugin = require('webpack-virtual-modules');
10
10
 
11
11
  // Suppress info level logging messages from http-proxy-middleware
12
12
  // This hides all of the "[HPM Proxy created] ..." messages
13
13
  const oldInfoLogger = console.info; // eslint-disable-line no-console
14
14
 
15
+ // TODO: Add explanation of this logic
15
16
  console.info = () => {}; // eslint-disable-line no-console
16
17
 
17
18
  const { createProxyMiddleware } = require('http-proxy-middleware');
@@ -21,29 +22,16 @@ console.info = oldInfoLogger; // eslint-disable-line no-console
21
22
  // This is currently hardcoded to avoid importing the TS
22
23
  // const { STANDARD } = require('./config/private-label');
23
24
  const STANDARD = 1;
24
-
25
- const dev = configHelper.dev;
26
- const devPorts = configHelper.devPorts;
27
-
28
- // human readable version used on rancher dashboard about page
29
- const dashboardVersion = process.env.DASHBOARD_VERSION;
30
-
25
+ const { dev, devPorts, api } = configHelper;
26
+ const dashboardVersion = process.env.DASHBOARD_VERSION; // semver rancher dashboard in about page
31
27
  const pl = process.env.PL || STANDARD;
32
28
  const commit = process.env.COMMIT || 'head';
33
29
  const perfTest = (process.env.PERF_TEST === 'true'); // Enable performance testing when in dev
34
- const instrumentCode = (process.env.TEST_INSTRUMENT === 'true'); // Instrument code for code coverage in e2e tests
35
-
36
- const api = configHelper.api;
37
- // ===============================================================================================
38
- // Nuxt configuration
39
- // ===============================================================================================
40
30
 
41
- // Expose a function that can be used by an app to provide a nuxt configuration for building an application
42
- // This takes the directory of the application as tehfirst argument so that we can derive folder locations
43
- // from it, rather than from the location of this file
44
- module.exports = function(dir, _appConfig) {
45
- // Paths to the shell folder when it is included as a node dependency
46
- 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) => {
47
35
  let SHELL_ABS = path.join(dir, 'node_modules/@rancher/shell');
48
36
  let COMPONENTS_DIR = path.join(SHELL_ABS, 'rancher-components');
49
37
 
@@ -61,15 +49,66 @@ module.exports = function(dir, _appConfig) {
61
49
  // If we have a local folder named 'shell' then use that rather than the one in node_modules
62
50
  // This will be the case in the main dashboard repository.
63
51
  if (fs.existsSync(path.join(dir, 'shell'))) {
64
- SHELL = './shell';
65
52
  SHELL_ABS = path.join(dir, 'shell');
66
53
  COMPONENTS_DIR = path.join(dir, 'pkg', 'rancher-components', 'src', 'components');
67
54
  }
68
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
69
107
  const babelPlugins = [
70
- // TODO: Browser support
108
+ // TODO: Browser support; also add explanation to this TODO
71
109
  // ['@babel/plugin-transform-modules-commonjs'],
72
- ['@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 }]
73
112
  ];
74
113
 
75
114
  if (instrumentCode) {
@@ -80,292 +119,368 @@ module.exports = function(dir, _appConfig) {
80
119
  console.warn('Instrumenting code for coverage'); // eslint-disable-line no-console
81
120
  }
82
121
 
83
- // ===============================================================================================
84
- // Functions for the UI Pluginas
85
- // ===============================================================================================
86
-
87
- const appConfig = _appConfig || {};
88
- const excludes = appConfig.excludes || [];
89
-
90
- const serverMiddleware = [];
91
- const watcherIgnores = [
92
- /.shell/,
93
- /dist-pkg/,
94
- /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
+ },
95
210
  ];
211
+ };
96
212
 
97
- // Find any UI packages in node_modules
98
- const NM = path.join(dir, 'node_modules');
99
- const pkg = require(path.join(dir, 'package.json'));
100
- 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
+ });
101
235
 
102
- if (pkg && pkg.dependencies) {
103
- Object.keys(pkg.dependencies).forEach((pkg) => {
104
- const f = require(path.join(NM, pkg, 'package.json'));
236
+ app.use(serverMiddlewares);
105
237
 
106
- // The package.json must have the 'rancher' property to mark it as a UI package
107
- if (f.rancher) {
108
- 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));
109
241
 
110
- 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'];
111
245
 
112
- // Add server middleware to serve up the files for this UI package
113
- serverMiddleware.push({
114
- path: `/pkg/${ id }`,
115
- handler: serveStatic(path.join(NM, pkg))
246
+ socket.write(`${ responseHeaders.join('\r\n') }\r\n\r\n`);
247
+ }
116
248
  });
117
249
  }
118
- });
119
- }
120
250
 
121
- serverMiddleware.push({
122
- path: '/uiplugins-catalog',
123
- handler: (req, res, next) => {
124
- const p = req.url.split('?');
125
-
126
- try {
127
- const proxy = createProxyMiddleware({
128
- target: p[1],
129
- 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
130
255
  });
131
256
 
132
- return proxy(req, res, next);
133
- } catch (e) {
134
- console.error(e); // eslint-disable-line no-console
135
- }
136
- }
137
- });
257
+ if (proxy[p].ws) {
258
+ socketProxies[p] = px;
259
+ }
260
+ app.use(p, px);
261
+ });
138
262
 
139
- function includePkg(name) {
140
- if (name.startsWith('.') || name === 'node_modules') {
141
- return false;
142
- }
263
+ server.websocketProxies.push({
264
+ upgrade(req, socket, head) {
265
+ const path = Object.keys(socketProxies).find((path) => req.url.startsWith(path));
143
266
 
144
- return !excludes || (excludes && !excludes.includes(name));
145
- }
267
+ if (path) {
268
+ const proxy = socketProxies[path];
146
269
 
147
- excludes.forEach((e) => {
148
- watcherIgnores.push(new RegExp(`/pkg.${ e }`));
149
- });
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
+ };
150
283
 
151
- // For each package in the pkg folder that is being compiled into the application,
152
- // Add in the code to automatically import the types from that package
153
- // This imports models, edit, detail, list etc
154
- // When built as a UI package, shell/pkg/vue.config.js does the same thing
155
- const autoImportTypes = {};
156
- const VirtualModulesPlugin = require('webpack-virtual-modules');
157
- let reqs = '';
158
- 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 = {};
159
293
 
160
- if (fs.existsSync(pkgFolder)) {
161
- 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'));
162
297
 
163
- // Ignore hidden folders
164
- items.filter((name) => !name.startsWith('.')).forEach((name) => {
165
- 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 }`;
166
301
 
167
- // Package file must have rancher field to be a plugin
168
- if (includePkg(name) && f.rancher) {
169
- reqs += `$plugin.initPlugin('${ name }', require(\'~/pkg/${ name }\')); `;
302
+ librariesIndex[id] = library.main;
170
303
  }
171
-
172
- // // 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)
173
- // if (!nmPackages[name]) {
174
- // const pkgPackageFile = require(path.join(dir, 'pkg', name, 'package.json'));
175
- // const pkgRef = `${ name }-${ pkgPackageFile.version }`;
176
-
177
- // serverMiddleware.push({ path: `/pkg/${ pkgRef }`, handler: serveStatic(`${ dir }/dist-pkg/${ pkgRef }`) });
178
- // }
179
- autoImportTypes[`node_modules/@rancher/auto-import/${ name }`] = generateDynamicTypeImport(`@pkg/${ name }`, path.join(dir, `pkg/${ name }`));
180
304
  });
181
305
  }
182
306
 
183
- Object.keys(nmPackages).forEach((m) => {
184
- reqs += `$plugin.loadAsync('${ m }', '/pkg/${ m }/${ nmPackages[m] }');`;
185
- });
186
-
187
- // Generate a virtual module '@rancher/dyanmic.js` which imports all of the packages that should be built into the application
188
- // This is imported in 'shell/extensions/extension-loader.js` which ensures the all code for plugins to be included is imported in the application
189
- const virtualModules = new VirtualModulesPlugin({ 'node_modules/@rancher/dynamic.js': `export default function ($plugin) { ${ reqs } };` });
190
- const autoImport = new webpack.NormalModuleReplacementPlugin(/^@rancher\/auto-import$/, (resource) => {
191
- const ctx = resource.context.split('/');
192
- const pkg = ctx[ctx.length - 1];
193
-
194
- resource.request = `@rancher/auto-import/${ pkg }`;
195
- });
196
-
197
- // @pkg imports must be resolved to the package that it importing them - this allows a package to use @pkg as an alis
198
- // to the root of that particular package
199
- const pkgImport = new webpack.NormalModuleReplacementPlugin(/^@pkg/, (resource) => {
200
- const ctx = resource.context.split('/');
201
- // Find 'pkg' folder in the contxt
202
- const index = ctx.findIndex((s) => s === 'pkg');
203
-
204
- if (index !== -1 && (index + 1) < ctx.length) {
205
- const pkg = ctx[index + 1];
206
- let p = path.resolve(dir, 'pkg', pkg, resource.request.substr(5));
307
+ let reqs = '';
308
+ const pkgFolder = path.relative(dir, './pkg');
207
309
 
208
- if (resource.request.startsWith(`@pkg/${ pkg }`)) {
209
- p = path.resolve(dir, 'pkg', resource.request.substr(5));
210
- }
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
+ }
211
322
 
212
- resource.request = p;
213
- }
323
+ Object.keys(librariesIndex).forEach((i) => {
324
+ reqs += `$plugin.loadAsync('${ i }', '/pkg/${ i }/${ librariesIndex[i] }');`;
214
325
  });
215
326
 
216
- // Serve up the dist-pkg folder under /pkg
217
- serverMiddleware.push({ path: `/pkg/`, handler: serveStatic(`${ dir }/dist-pkg/`) });
218
- // Endpoint to download and unpack a tgz from the local verdaccio rgistry (dev)
219
- serverMiddleware.push(path.resolve(dir, SHELL, 'server', 'verdaccio-middleware'));
327
+ return new VirtualModulesPlugin({ 'node_modules/@rancher/dynamic.js': `export default function ($plugin) { ${ reqs } };` });
328
+ };
220
329
 
221
- // ===============================================================================================
222
- // Dashboard nuxt configuration
223
- // ===============================================================================================
330
+ const getAutoImport = () => new webpack.NormalModuleReplacementPlugin(/^@rancher\/auto-import$/, (resource) => {
331
+ const ctx = resource.context.split('/');
332
+ const pkg = ctx[ctx.length - 1];
224
333
 
225
- require('events').EventEmitter.defaultMaxListeners = 20;
226
- require('dotenv').config();
334
+ resource.request = `@rancher/auto-import/${ pkg }`;
335
+ });
227
336
 
228
- let routerBasePath = '/';
229
- let resourceBase = '';
230
- 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');
231
346
 
232
- if ( typeof process.env.ROUTER_BASE !== 'undefined' ) {
233
- 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
+ });
234
353
  }
235
354
 
236
- if ( typeof process.env.RESOURCE_BASE !== 'undefined' ) {
237
- resourceBase = process.env.RESOURCE_BASE;
238
- }
355
+ return new VirtualModulesPlugin(autoImportTypes);
356
+ };
239
357
 
240
- if ( typeof process.env.OUTPUT_DIR !== 'undefined' ) {
241
- outputDir = process.env.OUTPUT_DIR;
242
- }
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
+ }
243
395
 
244
- if ( resourceBase && !resourceBase.endsWith('/') ) {
245
- resourceBase += '/';
246
- }
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
+ };
247
419
 
420
+ const printLogs = (dev, dashboardVersion, resourceBase, routerBasePath, pl, rancherEnv) => {
248
421
  console.log(`Build: ${ dev ? 'Development' : 'Production' }`); // eslint-disable-line no-console
249
422
 
250
- if ( !dev ) {
423
+ if (!dev) {
251
424
  console.log(`Version: ${ dashboardVersion }`); // eslint-disable-line no-console
252
425
  }
253
426
 
254
- if ( resourceBase ) {
427
+ if (resourceBase) {
255
428
  console.log(`Resource Base URL: ${ resourceBase }`); // eslint-disable-line no-console
256
429
  }
257
430
 
258
- if ( routerBasePath !== '/' ) {
431
+ if (routerBasePath !== '/') {
259
432
  console.log(`Router Base Path: ${ routerBasePath }`); // eslint-disable-line no-console
260
433
  }
261
434
 
262
- if ( pl !== STANDARD ) {
435
+ if (pl !== STANDARD) {
263
436
  console.log(`PL: ${ pl }`); // eslint-disable-line no-console
264
437
  }
265
- const rancherEnv = process.env.RANCHER_ENV || 'web';
266
-
267
- const loginLocaleSelector = process.env.LOGIN_LOCALE_SELECTOR || 'true';
268
- const excludeOperatorPkg = process.env.EXCLUDE_OPERATOR_PKG || 'false';
269
438
 
270
439
  console.log(`API: '${ api }'. Env: '${ rancherEnv }'`); // eslint-disable-line no-console
271
- const proxy = {
272
- ...appConfig.proxies,
273
- '/k8s': configHelper.proxyWsOpts(api), // Straight to a remote cluster (/k8s/clusters/<id>/)
274
- '/pp': configHelper.proxyWsOpts(api), // For (epinio) standalone API
275
- '/api': configHelper.proxyWsOpts(api), // Management k8s API
276
- '/apis': configHelper.proxyWsOpts(api), // Management k8s API
277
- '/v1': configHelper.proxyWsOpts(api), // Management Steve API
278
- '/v3': configHelper.proxyWsOpts(api), // Rancher API
279
- '/v3-public': configHelper.proxyOpts(api), // Rancher Unauthed API
280
- '/api-ui': configHelper.proxyOpts(api), // Browser API UI
281
- '/meta': configHelper.proxyMetaOpts(api), // Browser API UI
282
- '/v1-*': configHelper.proxyOpts(api), // SAML, KDM, etc
283
- '/rancherversion': configHelper.proxyPrimeOpts(api), // Rancher version endpoint
284
- // These are for Ember embedding
285
- '/c/*/edit': configHelper.proxyOpts('https://127.0.0.1:8000'), // Can't proxy all of /c because that's used by Vue too
286
- '/k/': configHelper.proxyOpts('https://127.0.0.1:8000'),
287
- '/g/': configHelper.proxyOpts('https://127.0.0.1:8000'),
288
- '/n/': configHelper.proxyOpts('https://127.0.0.1:8000'),
289
- '/p/': configHelper.proxyOpts('https://127.0.0.1:8000'),
290
- '/assets': configHelper.proxyOpts('https://127.0.0.1:8000'),
291
- '/translations': configHelper.proxyOpts('https://127.0.0.1:8000'),
292
- '/engines-dist': configHelper.proxyOpts('https://127.0.0.1:8000'),
293
- };
294
-
295
- // HAR File support - load network responses from the specified .har file and use those rather than communicating to the Rancher server
296
- const harFile = process.env.HAR_FILE;
297
- let harData;
298
-
299
- if (harFile) {
300
- harData = har.loadFile(harFile, devPorts ? 8005 : 80, ''); // eslint-disable-line no-console
301
- }
302
-
303
- const config = {
304
- // Vue server
305
- devServer: {
306
- https: (devPorts ? {
307
- key: fs.readFileSync(path.resolve(__dirname, 'server/server.key')),
308
- cert: fs.readFileSync(path.resolve(__dirname, 'server/server.crt'))
309
- } : null),
310
- port: (devPorts ? 8005 : 80),
311
- host: '0.0.0.0',
312
- public: `https://0.0.0.0:${ devPorts ? 8005 : 80 }`,
313
- before(app, server) {
314
- const socketProxies = {};
315
-
316
- // Close down quickly in response to CTRL + C
317
- process.once('SIGINT', () => {
318
- server.close();
319
- console.log('\n'); // eslint-disable-line no-console
320
- process.exit(1);
321
- });
322
-
323
- app.use(serverMiddlewares);
440
+ };
324
441
 
325
- if (harData) {
326
- console.log('Installing HAR file middleware'); // eslint-disable-line no-console
327
- app.use(har.harProxy(harData, process.env.HAR_DIR));
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();
328
450
 
329
- server.websocketProxies.push({
330
- upgrade(req, socket, head) {
331
- const responseHeaders = ['HTTP/1.1 101 Web Socket Protocol Handshake', 'Upgrade: WebSocket', 'Connection: Upgrade'];
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
+ ];
332
460
 
333
- socket.write(`${ responseHeaders.join('\r\n') }\r\n\r\n`);
334
- }
335
- });
336
- }
461
+ const includePkg = (name) => {
462
+ if (name.startsWith('.') || name === 'node_modules') {
463
+ return false;
464
+ }
337
465
 
338
- Object.keys(proxy).forEach((p) => {
339
- const px = createProxyMiddleware({
340
- ...proxy[p],
341
- ws: false // We will handle the web socket upgrade
342
- });
466
+ return !excludes || (excludes && !excludes.includes(name));
467
+ };
343
468
 
344
- if (proxy[p].ws) {
345
- socketProxies[p] = px;
346
- }
347
- app.use(p, px);
348
- });
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';
349
473
 
350
- server.websocketProxies.push({
351
- upgrade(req, socket, head) {
352
- const path = Object.keys(socketProxies).find((path) => req.url.startsWith(path));
474
+ if ( resourceBase && !resourceBase.endsWith('/') ) {
475
+ resourceBase += '/';
476
+ }
353
477
 
354
- if (path) {
355
- const proxy = socketProxies[path];
478
+ printLogs(dev, dashboardVersion, resourceBase, routerBasePath, pl, rancherEnv);
356
479
 
357
- if (proxy.upgrade) {
358
- proxy.upgrade(req, socket, head);
359
- } else {
360
- console.log(`Upgrade for Proxy is not defined. Cannot upgrade Web socket for ${ req.url }`); // eslint-disable-line no-console
361
- }
362
- } else {
363
- console.log(`Unknown Web socket upgrade request for ${ req.url }`); // eslint-disable-line no-console
364
- }
365
- }
366
- });
367
- },
368
- },
480
+ const proxy = getProxyConfig(appConfig.proxy);
481
+ const config = {
482
+ // Vue server
483
+ devServer: getDevServerConfig(proxy),
369
484
  publicPath: resourceBase || undefined,
370
485
  css: {
371
486
  extract: false, // inline css styles instead of including with `<links`
@@ -381,16 +496,13 @@ module.exports = function(dir, _appConfig) {
381
496
  }
382
497
  }
383
498
  },
384
-
385
499
  outputDir,
386
-
387
500
  pages: {
388
501
  index: {
389
- entry: path.join(SHELL_ABS, '/initialize/client.js'),
502
+ entry: path.join(SHELL_ABS, '/initialize/entry.js'),
390
503
  template: path.join(SHELL_ABS, '/public/index.html')
391
504
  }
392
505
  },
393
-
394
506
  configureWebpack(config) {
395
507
  config.resolve.alias['~'] = dir;
396
508
  config.resolve.alias['@'] = dir;
@@ -400,35 +512,13 @@ module.exports = function(dir, _appConfig) {
400
512
  config.resolve.alias['@pkg'] = path.join(dir, 'pkg');
401
513
  config.resolve.alias['./node_modules'] = path.join(dir, 'node_modules');
402
514
  config.resolve.alias['@components'] = COMPONENTS_DIR;
403
- config.resolve.alias['vue$'] = dev ? path.resolve(process.cwd(), 'node_modules', 'vue') : 'vue';
515
+ config.resolve.alias['vue$'] = path.resolve(process.cwd(), 'node_modules', 'vue', 'dist', dev ? 'vue.js' : 'vue.min.js');
404
516
  config.resolve.modules.push(__dirname);
405
- config.plugins.push(virtualModules);
406
- config.plugins.push(autoImport);
407
- config.plugins.push(new VirtualModulesPlugin(autoImportTypes));
408
- config.plugins.push(pkgImport);
409
- // DefinePlugin does string replacement within our code. We may want to consider replacing it with something else. In code we'll see something like
410
- // process.env.commit even though process and env aren't even defined objects. This could cause people to be mislead.
411
- config.plugins.push(new webpack.DefinePlugin({
412
- 'process.env.commit': JSON.stringify(commit),
413
- 'process.env.version': JSON.stringify(dashboardVersion),
414
- 'process.env.dev': JSON.stringify(dev),
415
- 'process.env.pl': JSON.stringify(pl),
416
- 'process.env.perfTest': JSON.stringify(perfTest),
417
- 'process.env.loginLocaleSelector': JSON.stringify(loginLocaleSelector),
418
- 'process.env.excludeOperatorPkg': JSON.stringify(excludeOperatorPkg),
419
- 'process.env.rancherEnv': JSON.stringify(rancherEnv),
420
- 'process.env.harvesterPkgUrl': JSON.stringify(process.env.HARVESTER_PKG_URL),
421
- 'process.env.api': JSON.stringify(api),
422
- // Store the Router Base as env variable that we can use in `shell/config/router.js`
423
- 'process.env.routerBase': JSON.stringify(routerBasePath),
424
-
425
- // This is a replacement of the nuxt publicRuntimeConfig
426
- 'nuxt.publicRuntimeConfig': JSON.stringify({
427
- rancherEnv,
428
- dashboardVersion
429
- }),
430
-
431
- }));
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));
432
522
 
433
523
  // The static assets need to be in the built assets directory in order to get served (primarily the favicon)
434
524
  config.plugins.push(new CopyWebpackPlugin([{ from: path.join(SHELL_ABS, 'static'), to: '.' }]));
@@ -444,144 +534,9 @@ module.exports = function(dir, _appConfig) {
444
534
  }
445
535
 
446
536
  config.resolve.symlinks = false;
447
-
448
- // Ensure we process files in the @rancher/shell folder
449
- config.module.rules.forEach((r) => {
450
- if ('test.js'.match(r.test)) {
451
- if (r.exclude) {
452
- const orig = r.exclude;
453
-
454
- r.exclude = function(modulePath) {
455
- if (modulePath.indexOf(SHELL_ABS) === 0 || typeof orig !== 'function') {
456
- return false;
457
- }
458
-
459
- return orig(modulePath);
460
- };
461
- }
462
- }
463
- });
464
-
465
- // Instrument code for tests
466
- const babelPlugins = [
467
- // TODO: Browser support
468
- // ['@babel/plugin-transform-modules-commonjs'],
469
- ['@babel/plugin-proposal-private-property-in-object', { loose: true }],
470
- ['@babel/plugin-proposal-class-properties', { loose: true }]
471
- ];
472
-
473
- if (instrumentCode) {
474
- babelPlugins.push([
475
- 'babel-plugin-istanbul', { extension: ['.js', '.vue'] }, 'add-vue'
476
- ]);
477
-
478
- console.warn('Instrumenting code for coverage'); // eslint-disable-line no-console
479
- }
480
-
481
- const loaders = [
482
- // Ensure there is a fallback for browsers that don't support web workers
483
- {
484
- test: /web-worker.[a-z-]+.js/i,
485
- loader: 'worker-loader',
486
- options: { inline: 'fallback' },
487
- },
488
- // Handler for csv files (e.g. ec2 instance data)
489
- {
490
- test: /\.csv$/i,
491
- loader: 'csv-loader',
492
- options: {
493
- dynamicTyping: true,
494
- header: true,
495
- skipEmptyLines: true
496
- },
497
- },
498
- // Handler for yaml files (used for i18n files, for example)
499
- {
500
- test: /\.ya?ml$/i,
501
- loader: 'js-yaml-loader',
502
- options: { name: '[path][name].[ext]' },
503
- },
504
- {
505
- test: /\.m?[tj]sx?$/,
506
- // This excludes no modules except for node_modules/@rancher/... so that plugins can properly compile
507
- // when referencing @rancher/shell
508
- exclude: /node_modules\/(?!(@rancher)\/).*/,
509
- use: [
510
- {
511
- loader: 'cache-loader',
512
- options: {
513
- cacheDirectory: 'node_modules/.cache/babel-loader',
514
- cacheIdentifier: 'e93f32da'
515
- }
516
- },
517
- {
518
- loader: 'babel-loader',
519
- options: {
520
- presets: [
521
- [
522
- require.resolve('@nuxt/babel-preset-app'),
523
- {
524
- corejs: { version: 3 },
525
- targets: { browsers: ['last 2 versions'] },
526
- modern: true
527
- }
528
- ],
529
- '@babel/preset-typescript',
530
- ],
531
- plugins: babelPlugins
532
- }
533
- }
534
- ]
535
- },
536
- {
537
- test: /\.tsx?$/,
538
- use: [
539
- {
540
- loader: 'cache-loader',
541
- options: {
542
- cacheDirectory: 'node_modules/.cache/ts-loader',
543
- cacheIdentifier: '3596741e'
544
- }
545
- },
546
- {
547
- loader: 'ts-loader',
548
- options: {
549
- transpileOnly: true,
550
- happyPackMode: false,
551
- appendTsxSuffixTo: [
552
- '\\.vue$'
553
- ],
554
- configFile: path.join(SHELL_ABS, 'tsconfig.json')
555
- }
556
- }
557
- ]
558
- },
559
- // Prevent warning in log with the md files in the content folder
560
- {
561
- test: /\.md$/,
562
- use: [
563
- {
564
- loader: 'frontmatter-markdown-loader',
565
- options: { mode: ['body'] }
566
- }
567
- ]
568
- },
569
- ];
570
-
571
- config.module.rules.push(...loaders);
572
-
573
- // Update vue-loader to set whitespace to 'preserve'
574
- // This was the setting with nuxt, but is not the default with vue cli
575
- // Need to find the vue loader in the webpack config and update the setting
576
- config.module.rules.forEach((loader) => {
577
- if (loader.use) {
578
- loader.use.forEach((use) => {
579
- if (use.loader.includes('vue-loader')) {
580
- use.options.compilerOptions.whitespace = 'preserve';
581
- }
582
- });
583
- }
584
- });
537
+ processShellFiles(config, SHELL_ABS);
538
+ config.module.rules.push(...getLoaders(SHELL_ABS));
539
+ preserveWhitespace(config);
585
540
  },
586
541
  };
587
542