@rancher/shell 0.5.3 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (581) hide show
  1. package/assets/data/aws-regions.json +9 -0
  2. package/assets/images/vendor/openid.svg +18 -0
  3. package/assets/styles/app.scss +1 -2
  4. package/assets/styles/fonts/_icons.scss +3 -3
  5. package/assets/styles/global/_columns.scss +1 -1
  6. package/assets/styles/global/_labeled-input.scss +2 -0
  7. package/assets/styles/themes/_csp.scss +2 -2
  8. package/assets/styles/themes/_dark.scss +8 -2
  9. package/assets/styles/themes/_light.scss +2 -1
  10. package/assets/styles/themes/_suse.scss +1 -1
  11. package/assets/styles/vendor/vue-select.scss +5 -0
  12. package/assets/translations/en-us.yaml +296 -58
  13. package/assets/translations/zh-hans.yaml +5 -27
  14. package/babel.config.js +1 -1
  15. package/chart/__tests__/S3.test.ts +9 -2
  16. package/chart/monitoring/grafana/index.vue +6 -2
  17. package/chart/monitoring/prometheus/index.vue +2 -2
  18. package/chart/rancher-backup/S3.vue +11 -9
  19. package/chart/rancher-backup/index.vue +15 -5
  20. package/cloud-credential/__tests__/harvester.test.ts +18 -0
  21. package/cloud-credential/generic.vue +18 -9
  22. package/cloud-credential/harvester.vue +11 -3
  23. package/components/AppModal.vue +167 -0
  24. package/components/AssignTo.vue +7 -4
  25. package/components/AsyncButton.vue +18 -5
  26. package/components/BackLink.vue +4 -4
  27. package/components/BannerGraphic.vue +1 -0
  28. package/components/BrandImage.vue +47 -1
  29. package/components/Carousel.vue +14 -8
  30. package/components/Certificates.vue +8 -11
  31. package/components/ClusterBadge.vue +12 -3
  32. package/components/ClusterIconMenu.vue +44 -16
  33. package/components/ClusterProviderIcon.vue +14 -3
  34. package/components/CodeMirror.vue +73 -38
  35. package/components/CommunityLinks.vue +12 -8
  36. package/components/CreateDriver.vue +81 -0
  37. package/components/CruResource.vue +51 -27
  38. package/components/DetailTop.vue +2 -2
  39. package/components/Dialog.vue +6 -5
  40. package/components/DisableAuthProviderModal.vue +14 -8
  41. package/components/DraggableZone.vue +2 -2
  42. package/components/ExplorerMembers.vue +3 -3
  43. package/components/ExplorerProjectsNamespaces.vue +6 -6
  44. package/components/FixedBanner.vue +47 -36
  45. package/components/GlobalRoleBindings.vue +26 -0
  46. package/components/Import.vue +10 -6
  47. package/components/Inactivity.vue +1 -5
  48. package/components/KeyValueView.vue +14 -10
  49. package/components/MessageLink.vue +2 -2
  50. package/components/ModalWithCard.vue +5 -8
  51. package/components/MoveModal.vue +35 -33
  52. package/components/PodSecurityAdmission.vue +3 -3
  53. package/components/PromptChangePassword.vue +33 -33
  54. package/components/PromptModal.vue +11 -21
  55. package/components/PromptRemove.vue +11 -17
  56. package/components/PromptRestore.vue +18 -16
  57. package/components/Questions/__tests__/Boolean.test.ts +9 -19
  58. package/components/Questions/__tests__/Float.test.ts +9 -19
  59. package/components/Questions/__tests__/Int.test.ts +9 -19
  60. package/components/Questions/__tests__/String.test.ts +9 -19
  61. package/components/Questions/__tests__/Yaml.test.ts +9 -20
  62. package/components/Questions/__tests__/utils/questions-defaults.ts +20 -0
  63. package/components/Questions/index.vue +18 -2
  64. package/components/ResourceCancelModal.vue +34 -29
  65. package/components/ResourceDetail/Masthead.vue +23 -7
  66. package/components/ResourceDetail/index.vue +5 -0
  67. package/components/ResourceList/Masthead.vue +28 -10
  68. package/components/ResourceList/index.vue +65 -14
  69. package/components/ResourceTable.vue +73 -19
  70. package/components/ResourceYaml.vue +1 -0
  71. package/components/SelectIconGrid.vue +3 -3
  72. package/components/SideNav.vue +15 -37
  73. package/components/SingleClusterInfo.vue +4 -4
  74. package/components/SortableTable/THead.vue +26 -12
  75. package/components/SortableTable/filtering.js +9 -1
  76. package/components/SortableTable/grouping.js +8 -1
  77. package/components/SortableTable/index.vue +142 -42
  78. package/components/SortableTable/paging.js +36 -7
  79. package/components/SortableTable/selection.js +2 -1
  80. package/components/SortableTable/sorting.js +24 -7
  81. package/components/TabTitle.vue +84 -0
  82. package/components/Tabbed/index.vue +6 -1
  83. package/components/TableDataUserIcon.vue +47 -0
  84. package/components/TypeDescription.vue +1 -0
  85. package/components/Wizard.vue +1 -0
  86. package/components/__tests__/AppModal.test.ts +98 -0
  87. package/components/__tests__/AsyncButton.test.ts +1 -3
  88. package/components/__tests__/BackLink.test.ts +1 -1
  89. package/components/__tests__/ButtonGroup.test.ts +3 -6
  90. package/components/__tests__/Carousel.test.ts +43 -0
  91. package/components/__tests__/Certificates.test.ts +29 -0
  92. package/components/__tests__/{CodeMirror.spec.ts → CodeMirror.test.ts} +5 -17
  93. package/components/__tests__/CruResource.test.ts +10 -9
  94. package/components/__tests__/EtcdInfoBanner.test.ts +37 -0
  95. package/components/__tests__/FixedBanner.test.ts +5 -20
  96. package/components/__tests__/NamespaceFilter.test.ts +9 -18
  97. package/components/__tests__/TabTitle.test.ts +129 -0
  98. package/components/auth/AzureWarning.vue +2 -2
  99. package/components/auth/RoleDetailEdit.vue +10 -0
  100. package/components/auth/__tests__/RoleDetailEdit.test.ts +3 -2
  101. package/components/auth/login/oidc.vue +7 -1
  102. package/components/fleet/FleetClusters.vue +9 -9
  103. package/components/fleet/FleetIntro.vue +11 -17
  104. package/components/fleet/FleetNoWorkspaces.vue +2 -2
  105. package/components/fleet/FleetRepos.vue +1 -0
  106. package/components/fleet/ForceDirectedTreeChart/index.vue +9 -3
  107. package/components/form/ArrayList.vue +30 -19
  108. package/components/form/ArrayListSelect.vue +9 -4
  109. package/components/form/ClusterAppearance.vue +132 -0
  110. package/components/form/ColorInput.vue +1 -0
  111. package/components/form/Error.vue +3 -3
  112. package/components/form/Footer.vue +2 -2
  113. package/components/form/GitPicker.vue +83 -38
  114. package/components/form/KeyValue.vue +67 -48
  115. package/components/form/LabeledSelect.vue +143 -43
  116. package/components/form/Labels.vue +3 -1
  117. package/components/form/NameNsDescription.vue +26 -9
  118. package/components/form/ResourceLabeledSelect.vue +187 -0
  119. package/components/form/ResourceTabs/index.vue +31 -15
  120. package/components/form/SecretSelector.vue +93 -18
  121. package/components/form/Select.vue +1 -1
  122. package/components/form/SelectOrCreateAuthSecret.vue +135 -62
  123. package/components/form/SimpleSecretSelector.vue +88 -28
  124. package/components/form/__tests__/BannerSettings.test.ts +53 -0
  125. package/components/form/__tests__/KeyValue.test.ts +121 -12
  126. package/components/form/__tests__/LabeledSelect.test.ts +0 -18
  127. package/components/form/__tests__/NameNsDescription.test.ts +25 -15
  128. package/components/form/labeled-select-utils/labeled-select-pagination.ts +151 -0
  129. package/components/form/labeled-select-utils/labeled-select.utils.ts +122 -0
  130. package/components/formatter/AppSummaryGraph.vue +2 -2
  131. package/components/formatter/CloudCredPublicData.vue +30 -0
  132. package/components/formatter/ClusterLink.vue +2 -2
  133. package/components/formatter/FleetSummaryGraph.vue +2 -1
  134. package/components/formatter/ImagePercentageBar.vue +0 -4
  135. package/components/formatter/IngressTarget.vue +18 -7
  136. package/components/formatter/Link.vue +2 -2
  137. package/components/formatter/LinkDetail.vue +2 -2
  138. package/components/formatter/LinkDetailImage.vue +2 -2
  139. package/components/formatter/LinkName.vue +2 -2
  140. package/components/formatter/LiveDate.vue +16 -0
  141. package/components/formatter/PrincipalGroupBindings.vue +2 -2
  142. package/components/formatter/SecretType.vue +2 -2
  143. package/components/formatter/VirtualServiceGateways.vue +2 -2
  144. package/components/formatter/__tests__/LinkDetail.test.ts +5 -5
  145. package/components/nav/Group.vue +7 -5
  146. package/components/nav/Header.vue +82 -43
  147. package/components/nav/NamespaceFilter.vue +8 -1
  148. package/components/nav/TopLevelMenu.vue +336 -125
  149. package/components/nav/Type.vue +58 -102
  150. package/components/nav/__tests__/TopLevelMenu.test.ts +370 -9
  151. package/components/nav/__tests__/Type.test.ts +321 -126
  152. package/components/nuxt/nuxt-child.js +0 -5
  153. package/components/nuxt/nuxt-error.vue +1 -1
  154. package/components/nuxt/nuxt-link.client.js +13 -95
  155. package/components/templates/default.vue +3 -3
  156. package/components/templates/error.vue +6 -10
  157. package/components/templates/standalone.vue +0 -4
  158. package/components/templates/unauthenticated.vue +1 -2
  159. package/components/user.retention/user-retention-header.vue +34 -0
  160. package/composables/useCompactInput.test.ts +36 -0
  161. package/composables/useCompactInput.ts +2 -2
  162. package/composables/useI18n.ts +26 -0
  163. package/composables/useLabeledFormElement.test.ts +135 -0
  164. package/composables/useStore.ts +16 -0
  165. package/config/home-links.js +32 -1
  166. package/config/labels-annotations.js +2 -1
  167. package/config/middleware.js +0 -6
  168. package/config/pagination-table-headers.js +57 -0
  169. package/config/pod-security-admission.ts +1 -1
  170. package/config/private-label.js +1 -3
  171. package/config/product/auth.js +1 -0
  172. package/config/product/explorer.js +167 -46
  173. package/config/product/legacy.js +3 -95
  174. package/config/product/manager.js +44 -11
  175. package/config/query-params.js +1 -0
  176. package/config/roles.ts +23 -0
  177. package/config/router/index.js +23 -0
  178. package/config/router/navigation-guards/attempt-first-login.js +73 -0
  179. package/config/router/navigation-guards/authentication.js +63 -0
  180. package/config/router/navigation-guards/index.js +15 -0
  181. package/config/router/navigation-guards/load-initial-settings.js +15 -0
  182. package/config/router/routes.js +487 -0
  183. package/config/settings.ts +38 -2
  184. package/config/store.js +7 -3
  185. package/config/table-headers.js +46 -1
  186. package/config/types.js +36 -16
  187. package/config/uiplugins.js +10 -5
  188. package/core/plugin-helpers.js +1 -1
  189. package/core/plugin.ts +2 -1
  190. package/core/plugins.js +289 -282
  191. package/creators/app/files/.eslintignore +0 -2
  192. package/creators/app/files/.vscode/settings.json +0 -1
  193. package/creators/pkg/files/.github/workflows/build-extension-catalog.yml +2 -6
  194. package/creators/pkg/files/.github/workflows/build-extension-charts.yml +2 -6
  195. package/creators/pkg/init +32 -0
  196. package/detail/__tests__/service.test.ts +62 -0
  197. package/detail/catalog.cattle.io.app.vue +1 -1
  198. package/detail/cis.cattle.io.clusterscan.vue +14 -3
  199. package/detail/fleet.cattle.io.gitrepo.vue +15 -9
  200. package/detail/namespace.vue +2 -2
  201. package/detail/networking.k8s.io.ingress.vue +52 -19
  202. package/detail/node.vue +20 -43
  203. package/detail/pod.vue +1 -68
  204. package/detail/provisioning.cattle.io.cluster.vue +2 -1
  205. package/detail/service.vue +1 -1
  206. package/detail/workload/index.vue +2 -15
  207. package/dialog/AddCustomBadgeDialog.vue +318 -161
  208. package/dialog/DeactivateDriverDialog.vue +118 -0
  209. package/dialog/RollbackWorkloadDialog.vue +2 -2
  210. package/dialog/RotateCertificatesDialog.vue +0 -21
  211. package/directives/clean-html.js +15 -0
  212. package/directives/clean-tooltip.js +32 -0
  213. package/directives/focus.js +41 -0
  214. package/directives/int-number.js +21 -0
  215. package/directives/positive-int-number.js +19 -0
  216. package/directives/trim-whitespace.js +19 -0
  217. package/edit/__tests__/fleet.cattle.io.gitrepo.test.ts +3 -2
  218. package/edit/__tests__/kontainerDriver.test.ts +107 -0
  219. package/edit/__tests__/management.cattle.io.clusterroletemplatebinding.test.ts +12 -1
  220. package/edit/__tests__/management.cattle.io.setting.test.ts +2 -1
  221. package/edit/__tests__/monitoring.coreos.com.prometheusrule.test.ts +2 -3
  222. package/edit/__tests__/nodeDriver.test.ts +107 -0
  223. package/edit/__tests__/service.test.ts +1 -5
  224. package/edit/__tests__/ui.cattle.io.navlink.test.ts +3 -1
  225. package/edit/auth/AuthProviderWarningBanners.vue +34 -0
  226. package/edit/auth/__tests__/AuthProviderWarningBanners.test.ts +19 -0
  227. package/edit/auth/__tests__/azuread.test.ts +241 -0
  228. package/edit/auth/__tests__/oidc.test.ts +137 -0
  229. package/edit/auth/azuread.vue +133 -31
  230. package/edit/auth/github.vue +5 -17
  231. package/edit/auth/googleoauth.vue +5 -18
  232. package/edit/auth/ldap/index.vue +5 -17
  233. package/edit/auth/oidc.vue +143 -42
  234. package/edit/auth/saml.vue +5 -14
  235. package/edit/catalog.cattle.io.clusterrepo.vue +175 -20
  236. package/edit/cis.cattle.io.clusterscan.vue +5 -2
  237. package/edit/cis.cattle.io.clusterscanbenchmark.vue +41 -9
  238. package/edit/cloudcredential.vue +26 -4
  239. package/edit/configmap.vue +10 -4
  240. package/edit/fleet.cattle.io.gitrepo.vue +7 -4
  241. package/edit/helm.cattle.io.projecthelmchart.vue +29 -19
  242. package/edit/kontainerDriver.vue +65 -0
  243. package/edit/logging-flow/Match.vue +10 -9
  244. package/edit/logging-flow/index.vue +4 -19
  245. package/edit/logging.banzaicloud.io.output/__tests__/logging.banzaicloud.io.output.test.ts +232 -2
  246. package/edit/logging.banzaicloud.io.output/index.vue +43 -26
  247. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +3 -3
  248. package/edit/management.cattle.io.project.vue +2 -1
  249. package/edit/management.cattle.io.setting.vue +20 -0
  250. package/edit/management.cattle.io.user.vue +2 -1
  251. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +10 -7
  252. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +21 -16
  253. package/edit/monitoring.coreos.com.alertmanagerconfig/types/pagerduty.vue +1 -0
  254. package/edit/monitoring.coreos.com.prometheusrule/AlertingRule.vue +3 -0
  255. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +2 -0
  256. package/edit/monitoring.coreos.com.prometheusrule/RecordingRule.vue +2 -0
  257. package/edit/monitoring.coreos.com.prometheusrule/index.vue +2 -0
  258. package/edit/networking.k8s.io.ingress/Rules.vue +8 -3
  259. package/edit/networking.k8s.io.ingress/index.vue +64 -8
  260. package/edit/networking.k8s.io.networkpolicy/PolicyRule.vue +1 -0
  261. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +6 -2
  262. package/edit/networking.k8s.io.networkpolicy/__tests__/{PolicyRuleTarget.spec.ts → PolicyRuleTarget.test.ts} +45 -6
  263. package/edit/networking.k8s.io.networkpolicy/__tests__/utils/selectors.test.ts +1 -1
  264. package/edit/networking.k8s.io.networkpolicy/index.vue +2 -0
  265. package/edit/nodeDriver.vue +65 -0
  266. package/edit/persistentvolume/index.vue +2 -2
  267. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +18 -9
  268. package/edit/provisioning.cattle.io.cluster/__tests__/Advanced.test.ts +165 -1
  269. package/edit/provisioning.cattle.io.cluster/__tests__/Basics.test.ts +1 -1
  270. package/edit/provisioning.cattle.io.cluster/__tests__/CustomCommand.test.ts +0 -3
  271. package/edit/provisioning.cattle.io.cluster/__tests__/DirectoryConfig.test.ts +228 -0
  272. package/edit/provisioning.cattle.io.cluster/__tests__/rke2.test.ts +70 -12
  273. package/edit/provisioning.cattle.io.cluster/__tests__/utils/cluster.ts +5 -0
  274. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  275. package/edit/provisioning.cattle.io.cluster/index.vue +21 -15
  276. package/edit/provisioning.cattle.io.cluster/rke2.vue +185 -114
  277. package/edit/provisioning.cattle.io.cluster/tabs/Advanced.vue +67 -7
  278. package/edit/provisioning.cattle.io.cluster/tabs/Basics.vue +19 -6
  279. package/edit/provisioning.cattle.io.cluster/tabs/DirectoryConfig.vue +132 -0
  280. package/edit/provisioning.cattle.io.cluster/tabs/MachinePool.vue +7 -0
  281. package/edit/provisioning.cattle.io.cluster/tabs/etcd/S3Config.vue +1 -0
  282. package/edit/provisioning.cattle.io.cluster/tabs/networking/index.vue +1 -0
  283. package/edit/provisioning.cattle.io.cluster/tabs/registries/RegistryConfigs.vue +3 -0
  284. package/edit/provisioning.cattle.io.cluster/tabs/registries/index.vue +1 -0
  285. package/edit/resources.cattle.io.backup.vue +139 -124
  286. package/edit/resources.cattle.io.restore.vue +146 -126
  287. package/edit/service.vue +1 -0
  288. package/edit/serviceaccount.vue +46 -4
  289. package/edit/workload/__tests__/Job.test.ts +1 -3
  290. package/edit/workload/__tests__/Upgrading.test.ts +2 -2
  291. package/edit/workload/mixins/workload.js +34 -1
  292. package/edit/workload/storage/emptyDir.vue +2 -2
  293. package/initialize/App.vue +75 -0
  294. package/initialize/app-extended.js +128 -0
  295. package/initialize/entry-helpers.js +549 -0
  296. package/initialize/entry.js +32 -0
  297. package/initialize/install-components.js +23 -0
  298. package/initialize/install-directives.js +59 -0
  299. package/initialize/install-plugins.js +123 -0
  300. package/list/__tests__/workload.test.ts +1 -1
  301. package/list/cis.cattle.io.clusterscan.vue +16 -10
  302. package/list/group.principal.vue +2 -2
  303. package/list/management.cattle.io.feature.vue +11 -7
  304. package/list/management.cattle.io.user.vue +36 -3
  305. package/list/networking.k8s.io.ingress.vue +36 -0
  306. package/list/node.vue +211 -73
  307. package/list/provisioning.cattle.io.cluster.vue +17 -4
  308. package/list/ui.cattle.io.navlink.vue +2 -2
  309. package/list/workload.vue +22 -0
  310. package/machine-config/__tests__/vmwarevsphere-pool-config-merge.test.ts +30 -0
  311. package/machine-config/__tests__/vmwarevsphere.test.ts +162 -59
  312. package/machine-config/amazonec2.vue +1 -1
  313. package/machine-config/azure.vue +38 -21
  314. package/machine-config/generic.vue +11 -15
  315. package/machine-config/vmwarevsphere-pool-config-merge.ts +25 -0
  316. package/machine-config/vmwarevsphere.vue +20 -11
  317. package/middleware/authenticated.js +9 -361
  318. package/mixins/__tests__/chart.test.ts +48 -6
  319. package/mixins/__tests__/create-edit-view.test.ts +2 -3
  320. package/mixins/auth-config.js +3 -2
  321. package/mixins/brand.js +75 -57
  322. package/mixins/chart.js +27 -13
  323. package/mixins/create-edit-view/index.js +2 -2
  324. package/mixins/fetch.client.js +42 -48
  325. package/mixins/labeled-form-element.ts +21 -1
  326. package/mixins/page-actions.js +7 -5
  327. package/mixins/resource-fetch-api-pagination.js +304 -0
  328. package/mixins/resource-fetch-namespaced.js +1 -1
  329. package/mixins/resource-fetch.js +46 -5
  330. package/models/__tests__/cluster.test.ts +44 -0
  331. package/models/__tests__/fleet.cattle.io.cluster.test.ts +36 -0
  332. package/models/__tests__/schema.tests.ts +24 -0
  333. package/models/__tests__/steve-schema.test.ts +73 -0
  334. package/models/__tests__/workload.test.ts +1 -1
  335. package/models/catalog.cattle.io.app.js +8 -0
  336. package/models/catalog.cattle.io.clusterrepo.js +9 -1
  337. package/models/catalog.cattle.io.uiplugin.js +7 -8
  338. package/models/cis.cattle.io.clusterscan.js +29 -8
  339. package/models/cloudcredential.js +9 -1
  340. package/models/cluster/node.js +4 -0
  341. package/models/cluster/schema.js +6 -0
  342. package/models/cluster.js +33 -0
  343. package/models/driver.js +62 -0
  344. package/models/fleet.cattle.io.cluster.js +23 -11
  345. package/models/fleet.cattle.io.gitrepo.js +10 -0
  346. package/models/helm.cattle.io.projecthelmchart.js +1 -1
  347. package/models/kontainerdriver.js +68 -0
  348. package/models/management/schema.js +6 -0
  349. package/models/management.cattle.io.authconfig.js +3 -2
  350. package/models/management.cattle.io.cluster.js +5 -4
  351. package/models/management.cattle.io.globalrole.js +2 -0
  352. package/models/management.cattle.io.user.js +67 -2
  353. package/models/monitoring.coreos.com.receiver.js +3 -1
  354. package/models/monitoring.coreos.com.route.js +1 -1
  355. package/models/networking.k8s.io.ingress.js +2 -1
  356. package/models/nodedriver.js +68 -0
  357. package/models/provisioning.cattle.io.cluster.js +34 -1
  358. package/models/schema.js +28 -7
  359. package/models/service.js +2 -0
  360. package/models/steve-schema.ts +254 -0
  361. package/models/workload.js +1 -0
  362. package/package.json +6 -5
  363. package/pages/about.vue +12 -5
  364. package/pages/account/index.vue +7 -2
  365. package/pages/auth/login.vue +106 -102
  366. package/pages/auth/logout.vue +2 -2
  367. package/pages/auth/setup.vue +57 -64
  368. package/pages/auth/verify.vue +17 -17
  369. package/pages/c/_cluster/apps/charts/chart.vue +54 -9
  370. package/pages/c/_cluster/apps/charts/index.vue +37 -13
  371. package/pages/c/_cluster/apps/charts/install.vue +4 -4
  372. package/pages/c/_cluster/auth/config/_id.vue +0 -6
  373. package/pages/c/_cluster/auth/config/index.vue +15 -9
  374. package/pages/c/_cluster/auth/roles/index.vue +8 -10
  375. package/pages/c/_cluster/auth/user.retention/index.vue +384 -0
  376. package/pages/c/_cluster/explorer/ConfigBadge.vue +13 -8
  377. package/pages/c/_cluster/explorer/EventsTable.vue +18 -0
  378. package/pages/c/_cluster/explorer/__tests__/index.test.ts +181 -0
  379. package/pages/c/_cluster/explorer/index.vue +231 -72
  380. package/pages/c/_cluster/explorer/tools/__tests__/index.test.ts +69 -0
  381. package/pages/c/_cluster/explorer/tools/index.vue +12 -176
  382. package/pages/c/_cluster/fleet/index.vue +88 -93
  383. package/pages/c/_cluster/longhorn/__tests__/longhorn.index.test.ts +89 -0
  384. package/pages/c/_cluster/longhorn/index.vue +52 -17
  385. package/pages/c/_cluster/manager/cloudCredential/index.vue +18 -25
  386. package/pages/c/_cluster/manager/drivers/kontainerDriver/_id.vue +12 -0
  387. package/pages/c/_cluster/manager/drivers/kontainerDriver/create.vue +15 -0
  388. package/pages/c/_cluster/manager/drivers/kontainerDriver/index.vue +94 -0
  389. package/pages/c/_cluster/manager/drivers/nodeDriver/_id.vue +12 -0
  390. package/pages/c/_cluster/manager/drivers/nodeDriver/create.vue +15 -0
  391. package/pages/c/_cluster/manager/drivers/nodeDriver/index.vue +63 -0
  392. package/pages/c/_cluster/manager/jwt.authentication/index.vue +235 -0
  393. package/pages/c/_cluster/monitoring/alertmanagerconfig/_alertmanagerconfigid/receiver.vue +4 -0
  394. package/pages/c/_cluster/monitoring/index.vue +1 -17
  395. package/pages/c/_cluster/monitoring/route-receiver/index.vue +2 -2
  396. package/pages/c/_cluster/neuvector/index.vue +1 -0
  397. package/pages/c/_cluster/settings/DefaultLinksEditor.vue +1 -0
  398. package/pages/c/_cluster/settings/banners.vue +86 -8
  399. package/pages/c/_cluster/settings/brand.vue +258 -36
  400. package/pages/c/_cluster/settings/index.vue +4 -4
  401. package/pages/c/_cluster/settings/links.vue +5 -3
  402. package/pages/c/_cluster/settings/performance.vue +71 -2
  403. package/pages/c/_cluster/uiplugins/AddExtensionRepos.vue +5 -2
  404. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +10 -7
  405. package/pages/c/_cluster/uiplugins/CatalogList/CatalogUninstallDialog.vue +9 -6
  406. package/pages/c/_cluster/uiplugins/DeveloperInstallDialog.vue +11 -5
  407. package/pages/c/_cluster/uiplugins/InstallDialog.vue +53 -18
  408. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +36 -301
  409. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +14 -6
  410. package/pages/c/_cluster/uiplugins/__tests__/SetupUIPlugins.test.ts +52 -106
  411. package/pages/c/_cluster/uiplugins/index.vue +38 -52
  412. package/pages/diagnostic.vue +1 -0
  413. package/pages/fail-whale.vue +103 -41
  414. package/pages/home.vue +81 -24
  415. package/pages/prefs.vue +8 -3
  416. package/pages/support/index.vue +12 -2
  417. package/plugins/clean-html-directive.js +5 -12
  418. package/plugins/clean-tooltip-directive.js +6 -31
  419. package/plugins/codemirror.js +0 -9
  420. package/plugins/dashboard-store/__tests__/mutations.test.ts +296 -313
  421. package/plugins/dashboard-store/actions.js +140 -32
  422. package/plugins/dashboard-store/getters.js +86 -39
  423. package/plugins/dashboard-store/index.js +0 -99
  424. package/plugins/dashboard-store/mutations.js +150 -48
  425. package/plugins/dashboard-store/resource-class.js +14 -109
  426. package/plugins/directives.js +6 -39
  427. package/plugins/ember-cookie.js +13 -0
  428. package/plugins/global-formatters.js +26 -5
  429. package/plugins/i18n.js +90 -56
  430. package/plugins/int-number.js +6 -20
  431. package/plugins/plugin.js +3 -3
  432. package/plugins/positive-int-number.js +6 -17
  433. package/plugins/steve/__tests__/{getters.spec.ts → getters.test.ts} +124 -31
  434. package/plugins/steve/__tests__/mutations.test.ts +49 -0
  435. package/plugins/steve/__tests__/subscribe.spec.ts +109 -0
  436. package/plugins/steve/__tests__/utils/mutation.test.helpers.ts +105 -0
  437. package/plugins/steve/accept-or-reject-socket-message.ts +103 -0
  438. package/plugins/steve/actions.js +0 -1
  439. package/plugins/steve/getters.js +183 -63
  440. package/plugins/steve/hybrid-class.js +5 -1
  441. package/plugins/steve/mutations.js +29 -5
  442. package/plugins/steve/norman-class.js +123 -2
  443. package/{utils → plugins/steve}/projectAndNamespaceFiltering.utils.ts +28 -10
  444. package/plugins/steve/schema.d.ts +22 -0
  445. package/plugins/steve/steve-pagination-utils.ts +368 -0
  446. package/plugins/steve/subscribe.js +37 -75
  447. package/plugins/trim-whitespace.js +6 -34
  448. package/plugins/vue-js-modal.js +1 -1
  449. package/public/index.html +1 -0
  450. package/rancher-components/Accordion/Accordion.vue +3 -2
  451. package/rancher-components/BadgeState/BadgeState.vue +3 -3
  452. package/rancher-components/Banner/Banner.test.ts +1 -5
  453. package/rancher-components/Banner/Banner.vue +2 -2
  454. package/rancher-components/Card/Card.vue +4 -4
  455. package/rancher-components/Form/Checkbox/Checkbox.vue +4 -3
  456. package/rancher-components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  457. package/rancher-components/Form/LabeledInput/LabeledInput.vue +66 -30
  458. package/rancher-components/Form/Radio/RadioButton.test.ts +1 -3
  459. package/rancher-components/Form/Radio/RadioButton.vue +13 -7
  460. package/rancher-components/Form/Radio/RadioGroup.vue +4 -3
  461. package/rancher-components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  462. package/rancher-components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  463. package/rancher-components/LabeledTooltip/LabeledTooltip.vue +9 -4
  464. package/rancher-components/StringList/StringList.vue +8 -8
  465. package/rancher-components/components/Accordion/Accordion.vue +3 -2
  466. package/rancher-components/components/BadgeState/BadgeState.vue +3 -3
  467. package/rancher-components/components/Banner/Banner.test.ts +1 -5
  468. package/rancher-components/components/Banner/Banner.vue +2 -2
  469. package/rancher-components/components/Card/Card.vue +4 -4
  470. package/rancher-components/components/Form/Checkbox/Checkbox.vue +4 -3
  471. package/rancher-components/components/Form/LabeledInput/LabeledInput.test.ts +1 -1
  472. package/rancher-components/components/Form/LabeledInput/LabeledInput.vue +66 -30
  473. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -3
  474. package/rancher-components/components/Form/Radio/RadioButton.vue +13 -7
  475. package/rancher-components/components/Form/Radio/RadioGroup.vue +4 -3
  476. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +7 -5
  477. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -4
  478. package/rancher-components/components/LabeledTooltip/LabeledTooltip.vue +9 -4
  479. package/rancher-components/components/StringList/StringList.vue +8 -8
  480. package/scripts/.gitlab/workflows/build-extension-catalog.gitlab-ci.yml +27 -8
  481. package/scripts/clean +1 -1
  482. package/scripts/extension/helm/charts/ui-plugin-server/templates/_helpers.tpl +11 -0
  483. package/scripts/extension/helm/charts/ui-plugin-server/templates/cr.yaml +2 -0
  484. package/scripts/extension/helm/charts/ui-plugin-server/values.yaml +2 -0
  485. package/scripts/extension/helm/package/Dockerfile +1 -1
  486. package/scripts/extension/helm/scripts/patch +27 -0
  487. package/scripts/extension/publish +6 -6
  488. package/scripts/serve-pkgs +0 -2
  489. package/scripts/test-plugins-build.sh +6 -6
  490. package/scripts/vue-migrate.js +683 -0
  491. package/store/__tests__/catalog.test.ts +224 -0
  492. package/store/auth.js +23 -4
  493. package/store/aws.js +53 -6
  494. package/store/catalog.js +21 -5
  495. package/store/cru-resource.ts +26 -0
  496. package/store/customisation.js +35 -0
  497. package/store/features.js +6 -4
  498. package/store/index.js +132 -39
  499. package/store/plugins.js +8 -4
  500. package/store/type-map.js +143 -143
  501. package/store/type-map.utils.ts +226 -0
  502. package/tsconfig.json +0 -1
  503. package/tsconfig.paths.json +4 -1
  504. package/types/components/labeledSelect.ts +50 -0
  505. package/types/resources/settings.d.ts +32 -0
  506. package/types/{userPreferences.d.ts → resources/userPreferences.d.ts} +0 -1
  507. package/types/shell/index.d.ts +996 -782
  508. package/types/store/dashboard-store.types.ts +42 -0
  509. package/types/store/pagination.types.ts +457 -0
  510. package/types/store/type-map.ts +30 -0
  511. package/types/store/vuex.d.ts +9 -0
  512. package/types/vue-shim.d.ts +51 -0
  513. package/utils/__tests__/cluster.test.ts +20 -18
  514. package/utils/__tests__/create-yaml.test.ts +359 -2
  515. package/utils/__tests__/kontainer.test.ts +92 -0
  516. package/utils/__tests__/pod-security-admission.test.ts +1 -1
  517. package/utils/alertmanagerconfig.js +19 -0
  518. package/utils/array.ts +40 -1
  519. package/utils/async.ts +2 -0
  520. package/utils/auth.js +152 -4
  521. package/utils/axios.js +2 -2
  522. package/utils/banners.js +103 -0
  523. package/utils/cluster.js +1 -1
  524. package/utils/config.js +4 -0
  525. package/utils/create-yaml.js +54 -27
  526. package/utils/error.js +25 -0
  527. package/utils/formatter.js +5 -3
  528. package/utils/git.ts +1 -1
  529. package/utils/install-redirect.js +1 -1
  530. package/utils/kontainer.ts +186 -0
  531. package/utils/monitoring.js +2 -37
  532. package/utils/pagination-utils.ts +154 -0
  533. package/utils/pod-security-admission.ts +1 -1
  534. package/utils/router.js +86 -0
  535. package/utils/settings.ts +46 -0
  536. package/utils/socket.js +1 -0
  537. package/utils/time.js +1 -0
  538. package/utils/title.ts +3 -0
  539. package/utils/unit-tests/ChildRenderingRouterLinkStub.ts +36 -0
  540. package/utils/validators/formRules/__tests__/index.test.ts +21 -0
  541. package/utils/validators/formRules/index.ts +3 -0
  542. package/utils/validators/index.js +1 -0
  543. package/vue.config.js +376 -421
  544. package/assets/styles/vendor/vue-js-modal.scss +0 -16
  545. package/chart/monitoring/steps/uninstall-v1.vue +0 -135
  546. package/components/EventsTable.vue +0 -67
  547. package/components/TabbedLinks/index.vue +0 -94
  548. package/components/nuxt/nuxt-link.server.js +0 -16
  549. package/components/nuxt/nuxt.js +0 -101
  550. package/config/router.js +0 -425
  551. package/initialize/App.js +0 -152
  552. package/initialize/client.js +0 -734
  553. package/initialize/index.js +0 -287
  554. package/middleware/i18n.js +0 -10
  555. package/middleware/unauthenticated.js +0 -22
  556. package/mixins/v1-workload-metrics.js +0 -43
  557. package/pages/c/_cluster/apps/index.vue +0 -15
  558. package/pages/c/_cluster/auth/index.vue +0 -17
  559. package/pages/c/_cluster/index.vue +0 -15
  560. package/pages/c/_cluster/legacy/index.vue +0 -22
  561. package/pages/c/_cluster/manager/index.vue +0 -22
  562. package/pages/c/_cluster/mcapps/index.vue +0 -21
  563. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +0 -232
  564. package/plugins/dashboard-store/rehydrate-all.js +0 -44
  565. package/plugins/index.js +0 -11
  566. package/plugins/portal-vue.js +0 -4
  567. package/plugins/portal.js +0 -4
  568. package/plugins/resize.js +0 -5
  569. package/plugins/shortkey.js +0 -4
  570. package/plugins/tooltip.js +0 -4
  571. package/plugins/v-select.js +0 -4
  572. package/utils/group.js +0 -70
  573. package/utils/nuxt.js +0 -638
  574. package/utils/router.scrollBehavior.js +0 -78
  575. /package/components/__tests__/{Collapse.spec.ts → Collapse.test.ts} +0 -0
  576. /package/models/__tests__/{node.ts → node.test.ts} +0 -0
  577. /package/plugins/steve/__tests__/{header-warnings.spec.ts → header-warnings.test.ts} +0 -0
  578. /package/plugins/steve/__tests__/{steve-class.spec.ts → steve-class.test.ts} +0 -0
  579. /package/rancher-components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  580. /package/rancher-components/components/BadgeState/{BadgeState.spec.ts → BadgeState.test.ts} +0 -0
  581. /package/types/{pod-security-admission.ts → resources/pod-security-admission.ts} +0 -0
@@ -0,0 +1,683 @@
1
+ #!/usr/bin/node
2
+ /* eslint-disable no-console */
3
+
4
+ const fs = require('fs');
5
+ const glob = require('glob');
6
+ const semver = require('semver');
7
+ const path = require('path');
8
+ /**
9
+ * Init logger
10
+ */
11
+ const stats = {
12
+ libraries: [],
13
+ node: [],
14
+ githubActions: [],
15
+ nvmrc: [],
16
+ webpack: [],
17
+ jest: [],
18
+ router: [],
19
+ resolution: [],
20
+ eslint: [],
21
+ vueSyntax: [],
22
+ style: [],
23
+ total: [],
24
+ };
25
+ const ignore = [
26
+ '**/node_modules/**',
27
+ '**/dist/**',
28
+ '**/scripts/vue-migrate.js',
29
+ 'docusaurus/**',
30
+ 'storybook-static/**',
31
+ 'storybook/**',
32
+ ];
33
+ const nodeRequirement = '20.0.0';
34
+ const isDry = process.argv.includes('--dry');
35
+ const isVerbose = process.argv.includes('--verbose');
36
+ const removePlaceholder = 'REMOVE';
37
+ const params = { paths: null };
38
+
39
+ /**
40
+ * Package updates
41
+ * Files: package.json
42
+ */
43
+ const packageUpdates = () => {
44
+ const files = glob.sync(params.paths || '**/package.json', { ignore });
45
+
46
+ files.forEach((file) => {
47
+ let content = fs.readFileSync(file, 'utf8');
48
+ const toReplaceNode = false;
49
+
50
+ // TODO: Refactor and loop?
51
+ const [librariesContent, replaceLibraries] = packageUpdatesLibraries(file, content);
52
+
53
+ if (replaceLibraries.length) {
54
+ content = librariesContent;
55
+ printContent(file, `Updating`, replaceLibraries);
56
+ stats.libraries.push(file);
57
+ }
58
+
59
+ const [nodeContent, replaceNode] = packageUpdatesEngine(file, content);
60
+
61
+ if (replaceNode.length) {
62
+ printContent(file, `Updating node`, replaceNode);
63
+ content = nodeContent;
64
+ stats.node.push(file);
65
+ }
66
+
67
+ const [resolutionContent, replaceResolution] = packageUpdatesResolution(file, content);
68
+
69
+ if (replaceResolution.length) {
70
+ printContent(file, `Updating resolution`, replaceResolution);
71
+ content = resolutionContent;
72
+ stats.libraries.push(file);
73
+ }
74
+
75
+ if (replaceLibraries || toReplaceNode || replaceResolution) {
76
+ stats.total.push(file);
77
+ }
78
+ });
79
+ };
80
+
81
+ /**
82
+ * Verify package vue related libraries versions
83
+ */
84
+ const packageUpdatesLibraries = (file, oldContent) => {
85
+ let content = oldContent;
86
+ let parsedJson = JSON.parse(content);
87
+ const replaceLibraries = [];
88
+ const types = ['dependencies', 'devDependencies', 'peerDependencies'];
89
+ // [Library name, new version or new library, new library version]
90
+ const librariesUpdates = [
91
+ ['@nuxt/babel-preset-app', removePlaceholder],
92
+ ['@types/jest', '^29.5.2'],
93
+ ['@typescript-eslint/eslint-plugin', '~5.4.0'],
94
+ ['@typescript-eslint/parser', '~5.4.0'],
95
+ ['@vue/cli-plugin-babel', '~5.0.0'],
96
+ ['@vue/cli-plugin-e2e-cypress', '~5.0.0'],
97
+ ['@vue/cli-plugin-eslint', '~5.0.0'],
98
+ ['@vue/cli-plugin-router', '~5.0.0'],
99
+ ['@vue/cli-plugin-typescript', '~5.0.0'],
100
+ ['@vue/cli-plugin-unit-jest', '~5.0.0'],
101
+ ['@vue/cli-plugin-vuex', '~5.0.0'],
102
+ ['@vue/cli-service', '~5.0.0'],
103
+ ['@vue/eslint-config-typescript', '~9.1.0'],
104
+ ['@vue/vue2-jest', '@vue/vue3-jest', '^27.0.0-alpha.1'],
105
+ ['@vue/test-utils', '~2.0.0-0'],
106
+ ['core-js', '3.25.3'],
107
+ ['cache-loader', '^4.1.0'],
108
+ ['node-polyfill-webpack-plugin', '^3.0.0'],
109
+ ['portal-vue', '~3.0.0'],
110
+ ['require-extension-hooks-babel', '1.0.0'],
111
+ ['require-extension-hooks-vue', '3.0.0'],
112
+ ['require-extension-hooks', '0.3.3'],
113
+ ['sass-loader', '~12.0.0'],
114
+ ['typescript', '~4.5.5'],
115
+ ['vue-router', '~4.0.3'],
116
+ ['vue-virtual-scroll-list', 'vue3-virtual-scroll-list', '0.2.1'],
117
+ ['vue', '~3.2.13'],
118
+ ['vuex', '~4.0.0'],
119
+ ['xterm', '5.2.1'],
120
+ ];
121
+
122
+ // Loop through each type of dependencies since many often not correctly placed or hard to track
123
+ types.forEach((type) => {
124
+ if (parsedJson[type]) {
125
+ librariesUpdates.forEach(([library, newVersion, newLibraryVersion]) => {
126
+ if (parsedJson[type][library]) {
127
+ const version = semver.coerce(parsedJson[type][library]);
128
+
129
+ if (newVersion === removePlaceholder) {
130
+ // Remove library
131
+ replaceLibraries.push([library, [parsedJson[type][library], removePlaceholder]]);
132
+ delete parsedJson[type][library];
133
+ content = JSON.stringify(parsedJson, null, 2);
134
+ writeContent(file, content);
135
+ } else if (newLibraryVersion) {
136
+ // Replace with a new library if present, due breaking changes in Vue3
137
+ replaceLibraries.push([library, [parsedJson[type][library], newVersion, newLibraryVersion]]);
138
+ content = content.replaceAll(`"${ library }": "${ parsedJson[type][library] }"`, `"${ newVersion }": "${ newLibraryVersion }"`);
139
+ parsedJson = JSON.parse(content);
140
+ writeContent(file, content);
141
+ } else if (version && semver.lt(version, semver.coerce(newVersion))) {
142
+ // Update library version if outdated
143
+ replaceLibraries.push([library, [parsedJson[type][library], newVersion]]);
144
+ content = content.replaceAll(`"${ library }": "${ parsedJson[type][library] }"`, `"${ library }": "${ newVersion }"`);
145
+ parsedJson = JSON.parse(content);
146
+ writeContent(file, content);
147
+ }
148
+ }
149
+ });
150
+ }
151
+ });
152
+
153
+ return [content, replaceLibraries];
154
+ };
155
+
156
+ /**
157
+ * Verify package engines node to latest
158
+ */
159
+ const packageUpdatesEngine = (file, oldContent) => {
160
+ let content = oldContent;
161
+ let parsedJson = JSON.parse(content);
162
+ const replaceNode = [];
163
+
164
+ // Verify package engines node to latest
165
+ if (parsedJson.engines) {
166
+ const outdated = semver.lt(semver.coerce(parsedJson.engines.node), semver.coerce(nodeRequirement));
167
+
168
+ if (outdated) {
169
+ replaceNode.push([parsedJson.engines.node, nodeRequirement]);
170
+ content = content.replaceAll(`"node": "${ parsedJson.engines.node }"`, `"node": ">=${ nodeRequirement }"`);
171
+ parsedJson = JSON.parse(content);
172
+ writeContent(file, content);
173
+ }
174
+ }
175
+
176
+ return [content, replaceNode];
177
+ };
178
+
179
+ /**
180
+ * Add resolutions for VueCLI
181
+ */
182
+ const packageUpdatesResolution = (file, oldContent) => {
183
+ let content = oldContent;
184
+ let parsedJson = JSON.parse(content);
185
+ const replaceResolution = [];
186
+ const resolutions = [
187
+ ['@vue/cli-service/html-webpack-plugin', '^5.0.0'],
188
+ ['**/webpack', removePlaceholder],
189
+ ];
190
+
191
+ // Verify package engines node to latest
192
+ if (parsedJson.resolutions) {
193
+ resolutions.forEach(([library, newVersion]) => {
194
+ if (newVersion === removePlaceholder) {
195
+ delete parsedJson.resolutions[library];
196
+ content = JSON.stringify(parsedJson, null, 2);
197
+ parsedJson = JSON.parse(content);
198
+ writeContent(file, content);
199
+ } else if (!parsedJson.resolutions[library]) {
200
+ // Add resolution if not present
201
+ parsedJson.resolutions[library] = newVersion;
202
+ content = JSON.stringify(parsedJson, null, 2);
203
+ parsedJson = JSON.parse(content);
204
+ writeContent(file, content);
205
+ } else {
206
+ // Ensure resolution version is up to date
207
+ const outdated = semver.lt(semver.coerce(parsedJson.resolutions[library]), semver.coerce(newVersion));
208
+
209
+ if (outdated) {
210
+ replaceResolution.push([parsedJson.engines.node, nodeRequirement]);
211
+ content = content.replaceAll(`"${ library }": "${ parsedJson.resolutions[library] }"`, `"${ library }": "${ newVersion }"`);
212
+ parsedJson = JSON.parse(content);
213
+ writeContent(file, content);
214
+ }
215
+ }
216
+ });
217
+ }
218
+
219
+ return [content, replaceResolution];
220
+ };
221
+
222
+ /**
223
+ * GitHub Actions updates
224
+ * Files: .github/workflows/**.yml
225
+ *
226
+ * Verify GitHub Actions use of current node version, e.g. node-version: '<18'
227
+ */
228
+ const gitHubActionsUpdates = () => {
229
+ const files = glob.sync(params.paths || '.github/workflows/**.{yml,yaml}', { ignore });
230
+
231
+ files.forEach((file) => {
232
+ let content = fs.readFileSync(file, 'utf8');
233
+ const nodeVersionMatches = content.matchAll(/node-version: \'([0-9.x]+)\'/g);
234
+ const toReplace = [];
235
+
236
+ // Check all the node occurrences within the test file
237
+ if (nodeVersionMatches) {
238
+ for (const matches of nodeVersionMatches) {
239
+ for (const match of matches) {
240
+ const nodeVersion = semver.coerce(match);
241
+
242
+ if (nodeVersion && semver.lt(nodeVersion, semver.coerce(nodeRequirement))) {
243
+ content = content.replaceAll(`node-version: '${ match }'`, `node-version: '20.x'`);
244
+
245
+ writeContent(file, content);
246
+ toReplace.push([match, nodeRequirement]);
247
+ }
248
+ }
249
+ }
250
+
251
+ if (toReplace.length) {
252
+ printContent(file, `Updating node`, toReplace);
253
+ stats.githubActions.push(file);
254
+ stats.total.push(file);
255
+ }
256
+ }
257
+ });
258
+ };
259
+
260
+ /**
261
+ * NVM updates
262
+ * Files: .nvmrc
263
+ *
264
+ * Verify presence of .nvmrc, create one if none, update if any
265
+ */
266
+ const nvmUpdates = () => {
267
+ const files = glob.sync(params.paths || '**/.nvmrc', { ignore });
268
+ const nvmRequirement = 20;
269
+
270
+ files.forEach((file) => {
271
+ if (file) {
272
+ let content = fs.readFileSync(file, 'utf8');
273
+ const nodeVersionMatch = content.match(/([0-9.x]+)/g);
274
+ const nodeVersion = semver.coerce(nodeVersionMatch[0]);
275
+
276
+ // Ensure node version is up to date
277
+ if (nodeVersion && semver.lt(nodeVersion, semver.coerce(nodeRequirement))) {
278
+ printContent(file, `Updating node ${ [nodeVersionMatch[0], nvmRequirement] }`);
279
+ content = content.replaceAll(nodeVersionMatch[0], nvmRequirement);
280
+
281
+ writeContent(file, content);
282
+ stats.nvmrc.push(file);
283
+ stats.total.push(file);
284
+ }
285
+ } else {
286
+ writeContent('.nvmrc', nvmRequirement);
287
+ }
288
+ });
289
+ };
290
+
291
+ /**
292
+ * Vue config update
293
+ * Files: vue.config.js
294
+ *
295
+ * Verify vue.config presence of deprecated Webpack5 options
296
+ * - devServer.public: 'path' -> client: { webSocketURL: 'path' }
297
+ */
298
+ const vueConfigUpdates = () => {
299
+ const files = glob.sync(params.paths || 'vue.config**.js', { ignore });
300
+
301
+ files.forEach((file) => {
302
+ const content = fs.readFileSync(file, 'utf8');
303
+
304
+ // Verify vue.config presence of deprecated Webpack5 options
305
+ if (content.includes('devServer.public: \'path\'')) {
306
+ stats.webpack.push(file);
307
+ stats.total.push(file);
308
+ // TODO: Add replacement
309
+ }
310
+ });
311
+ };
312
+
313
+ /**
314
+ * Vue syntax update (to do not mix with tests)
315
+ * Files: .vue, .js, .ts (not .spec.ts, not .test.ts)
316
+ */
317
+ const vueSyntaxUpdates = () => {
318
+ const files = glob.sync(params.paths || '**/*.{vue,js,ts}', { ignore: [...ignore, '**/*.spec.ts', '**/__tests__/**', '**/*.test.ts', 'jest.setup.js', '**/*.d.ts', '**/vue-shim.ts'] });
319
+ const replacementCases = [
320
+ // Prioritize set and delete to be converted since removed in Vue3
321
+ [/\=\> Vue\.set\((.*?),\s*(.*?),\s*(.*?)\)/g, (_, obj, prop, val) => `=> (${ obj.trim() }[${ prop.trim() }] = ${ val.trim() })`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
322
+ [/\=\> Vue\.set\((.*?),\s*'([^']*?)',\s*\{([\s\S]*?)\}\)/g, (_, obj, prop, val) => `=> (${ obj.trim() }['${ prop }'] = {${ val.trim() }})`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
323
+ [/\=\> Vue\.set\((.*?),\s*'([^']*?)',\s*(.*?)\)/g, (_, obj, prop, val) => `=> (${ obj.trim() }.${ prop } = ${ val.trim() })`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
324
+
325
+ [/Vue\.set\((.*?),\s*(.*?),\s*(.*?)\)/g, (_, obj, prop, val) => `${ obj.trim() }[${ prop.trim() }] = ${ val.trim() }`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
326
+ [/Vue\.set\((.*?),\s*'([^']*?)',\s*\{([\s\S]*?)\}\)/g, (_, obj, prop, val) => `${ obj.trim() }['${ prop }'] = {${ val.trim() }}`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
327
+ [/Vue\.set\((.*?),\s*'([^']*?)',\s*(.*?)\)/g, (_, obj, prop, val) => `${ obj.trim() }.${ prop } = ${ val.trim() }`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
328
+ [/Vue\.delete\((.*?),\s*(.*?)\)/g, (_, obj, prop) => `delete ${ obj.trim() }[${ prop.trim() }]`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
329
+
330
+ [/\=\> this\.\$set\((.*?),\s*(.*?),\s*(.*?)\)/g, (_, obj, prop, val) => `=> (${ obj.trim() }[${ prop.trim() }] = ${ val.trim() })`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
331
+ [/\=\> this\.\$set\((.*?),\s*'([^']*?)',\s*\{([\s\S]*?)\}\)/g, (_, obj, prop, val) => `=> (${ obj.trim() }['${ prop }'] = {${ val.trim() }})`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
332
+ [/\=\> this\.\$set\((.*?),\s*'([^']*?)',\s*(.*?)\)/g, (_, obj, prop, val) => `=> (${ obj.trim() }.${ prop } = ${ val.trim() })`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
333
+
334
+ [/this.\$set\((.*?),\s*'([^']*?)',\s*(.*?)\)/g, (_, obj, prop, val) => obj.trim() === 'this' ? `this['${ prop }'] = ${ val }` : `${ obj.trim() }['${ prop }'] = ${ val }`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
335
+
336
+ [/this\.\$set\((.*?),\s*(.*?),\s*(.*?)\)/g, (_, obj, prop, val) => `${ obj.trim() }[${ prop.trim() }] = ${ val.trim() }`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
337
+ [/this\.\$set\((.*?),\s*'([^']*?)',\s*\{([\s\S]*?)\}\)/g, (_, obj, prop, val) => `${ obj.trim() }['${ prop }'] = {${ val.trim() }}`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
338
+ [/this\.\$set\((.*?),\s*'([^']*?)',\s*(.*?)\)/g, (_, obj, prop, val) => `${ obj.trim() }.${ prop } = ${ val.trim() }`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
339
+ [/this\.\$delete\((.*?),\s*(.*?)\)/g, (_, obj, prop) => `delete ${ obj.trim() }[${ prop.trim() }]`, 'removed and unnecessary due new reactivity https://vuejs.org/guide/extras/reactivity-in-depth.html'],
340
+
341
+ // Replace imports for all the cases where createApp is needed, before the rest of the replacements
342
+ [/import Vue from 'vue';?/g, `import { createApp } from \'vue\';\nconst vueApp = createApp({});`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
343
+ [`new Vue(`, `createApp(`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
344
+ [`Vue.config`, `vueApp.config`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
345
+ [`Vue.directive`, `vueApp.directive`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
346
+ [`Vue.filter(`, `vueApp.filter(`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
347
+ [`Vue.mixin(`, `vueApp.mixin(`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
348
+ [`Vue.component(`, `vueApp.component(`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
349
+ [`Vue.use(`, `vueApp.use(`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
350
+ [`Vue.prototype`, `vueApp.config.globalProperties`, `https://v3-migration.vuejs.org/breaking-changes/global-api.html#a-new-global-api-createapp`],
351
+ ['Vue.util', '', 'Vue.util is private and no longer available https://v3-migration.vuejs.org/migration-build.html#partially-compatible-with-caveats'],
352
+ // [`Vue.extend`, removePlaceholder, 'https://v3-migration.vuejs.org/breaking-changes/global-api.html#vue-extend-removed'],
353
+ // [`Vue.extend`, `createApp({})`], // (mixins)
354
+
355
+ [`vue-virtual-scroll-list`, `vue3-virtual-scroll-list`, 'library update'],
356
+
357
+ [`Vue.nextTick`, `nextTick`, 'https://v3-migration.vuejs.org/breaking-changes/global-api-treeshaking.html#global-api-treeshaking'],
358
+ [`this.nextTick`, `nextTick`, 'https://v3-migration.vuejs.org/breaking-changes/global-api-treeshaking.html#global-api-treeshaking'],
359
+ // TODO: Add missing import
360
+
361
+ [/( {4,}default)\(\)\s*\{([\s\S]*?)this\.([\s\S]*?\}\s*\})/g, (_, before, middle, after) => `${ before }(props) {${ middle }props.${ after }`, 'https://v3-migration.vuejs.org/breaking-changes/props-default-this.html'],
362
+ [`value=`, `modelValue=`],
363
+ [`@input=`, `@update:modelValue=`],
364
+ // [`v-bind.sync=`, `:modelValue=`, `https://v3-migration.vuejs.org/breaking-changes/v-model.html#using-v-bind-sync`],
365
+ // ['v-model=', ':modelValue=', ''],
366
+ [/:([a-z-0-9]+)\.sync/g, (_, propName) => `v-model:${ propName }`, `https://v3-migration.vuejs.org/breaking-changes/v-model.html#migration-strategy`],
367
+ [`click.native`, `click`, `https://v3-migration.vuejs.org/breaking-changes/v-model.html#using-v-bind-sync`],
368
+ [`v-on="$listeners"`, removePlaceholder, `removed and integrated with $attrs https://v3-migration.vuejs.org/breaking-changes/listeners-removed.html`],
369
+ [`:listeners="$listeners"`, `:v-bind="$attrs"`, `removed and integrated with $attrs https://v3-migration.vuejs.org/breaking-changes/listeners-removed.html`],
370
+
371
+ [/this\.\$scopedSlots\[(\w+)\]|this\.\$scopedSlots\.(\w+)/, (match, key1, key2) => `this.$slots.${ key1 || key2 }()`, `(many components loop through them) https://v3-migration.vuejs.org/breaking-changes/slots-unification.html`],
372
+ [` $scopedSlots`, ` $slots`, `(many components loop through them) https://v3-migration.vuejs.org/breaking-changes/slots-unification.html`],
373
+ [/slot="(\w+:\w+)"\s+slot-scope="(\w+)"/g, `$1="$2"`, `not mentioned in migration https://vuejs.org/guide/components/slots.html#scoped-slots`],
374
+ [/this\.\$slots\['([^']+)'\]/g, `this.$slots[\'$1\']()`, `not mentioned in migration https://vuejs.org/guide/components/slots.html#scoped-slots`],
375
+ // [/this\.\$slots\.([^']+)'/g, `this.$slots.$1()`, `not mentioned in migration https://vuejs.org/guide/components/slots.html#scoped-slots`],
376
+ // [/this\.\$slots(?!\s*\(\))(\b|\?|['"\[])/g, `this.$slots()$1`, `https://eslint.vuejs.org/rules/require-slots-as-functions.html`], // TODO: Add exception for existing brackets
377
+
378
+ // Portals are now Vue3 Teleports
379
+ [/<portal|<portal-target|<\/portal|<\/portal-target/g, '', `https://v3.vuejs.org/guide/teleport.html`],
380
+
381
+ // TODO: probably requires JSDom
382
+ // [/<template v-for="([\s\S]*?)">\s*<([\s\S]*?)\s*([\s\S]*?):key="([\s\S]*?)"([\s\S]*?)<\/([\s\S]*?)>\s*<\/template>/gs, '<template v-for="$1" :key="$4"><$3 $5>$6</$7>\n</template>', `https://v3-migration.vuejs.org/breaking-changes/key-attribute.html#with-template-v-for`],
383
+ // [/(<\w+(?!.*?v-for=)[^>]*?)\s*:key="[^"]*"\s*([^>]*>)/g, '$1$2', `https://v3-migration.vuejs.org/breaking-changes/key-attribute.html#with-template-v-for`],
384
+ [/(<\w+[^>v\-for]*?):key="[^"]*"\s*([^>]*>)/g, '$1$2', `https://v3-migration.vuejs.org/breaking-changes/key-attribute.html#with-template-v-for`],
385
+ [/(\<\w+\s+(?:[^>]*?\s+)?v-for="\(.*?,\s*(\w+)\s*\).*?")(?:\s*:key=".*"\s*)?([^>]*>)/g, '$1 :key="$2"$3', `https://v3-migration.vuejs.org/breaking-changes/key-attribute.html#with-template-v-for`],
386
+ [/(\<\w+\s+(?:[^>]*?\s+)?)v-for="(?!\*?\s+.*?\s+.*?)([^,]+?)\s+in\s+([^"]+?)"(?:\s*:key=".*"\s*)?([^>]*>)/g, '$1 v-for="($2, i) in $3" :key="i" $4', `https://v3-migration.vuejs.org/breaking-changes/key-attribute.html#with-template-v-for`],
387
+
388
+ // TODO: except for <components /> elements, probably requires JSDom
389
+ // [' is=', ``, `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html#customized-built-in-elements`],
390
+ // [' :is=', ``, `https://v3-migration.vuejs.org/breaking-changes/custom-elements-interop.html#customized-built-in-elements`],
391
+
392
+ // Directive updates
393
+ // [`bind(`, '', `beforeMount( but there's too many bind cases https://v3-migration.vuejs.org/breaking-changes/custom-directives.html`], // TODO: Restrict to directives and context
394
+ // [`update(`, '', `removed, also common term https://v3-migration.vuejs.org/breaking-changes/custom-directives.html`], // TODO: Restrict to directives and context
395
+ [`inserted(`, `mounted(`, 'https://v3-migration.vuejs.org/breaking-changes/custom-directives.html'],
396
+ [`componentUpdated(`, `updated(`, 'https://v3-migration.vuejs.org/breaking-changes/custom-directives.html'],
397
+ [`unbind`, `unmounted`, 'https://v3-migration.vuejs.org/breaking-changes/custom-directives.html'],
398
+
399
+ // [`propsData (app creation)`, ``, `use second argument of createApp({}) https://v3-migration.vuejs.org/breaking-changes/props-data.html`],
400
+ [`@hook:lifecycleHook`, `@vue:lifecycleHook`, `https://v3-migration.vuejs.org/breaking-changes/vnode-lifecycle-events.html`],
401
+
402
+ // Nuxt and initalize case only
403
+ // TODO: Use eventbus replacement as temporary solution?
404
+ [`$on('event', callback)`, '', `no migration, existing lib, https://v3-migration.vuejs.org/breaking-changes/events-api.html`],
405
+ [`$off('event', callback)`, '', `no migration, existing lib, https://v3-migration.vuejs.org/breaking-changes/events-api.html`],
406
+ [`$once('event', callback)`, '', `no migration, existing lib, https://v3-migration.vuejs.org/breaking-changes/events-api.html`],
407
+
408
+ // [`$children`, ``, `no migration, $refs are suggested as communication https://v3-migration.vuejs.org/breaking-changes/children.html`],
409
+
410
+ // Vuex
411
+ [`new Vuex.Store(`, `createStore(`, 'To install Vuex to a Vue instance, pass the store instead of Vuex https://vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html#installation-process'],
412
+ [`import Vuex from 'vuex'`, `import { createStore } from 'vuex'`, 'To install Vuex to a Vue instance, pass the store instead of Vuex https://vuex.vuejs.org/guide/migrating-to-4-0-from-3-x.html#installation-process'],
413
+
414
+ // Extra cases TBD (it seems like we already use the suggested way for arrays)
415
+ // watch option used on arrays not triggered by mutations https://v3-migration.vuejs.org/breaking-changes/watch.html
416
+ ];
417
+
418
+ replaceCases('vueSyntax', files, replacementCases, `Updating Vue syntax`);
419
+ };
420
+
421
+ /**
422
+ * Vue Router
423
+ * Files: .vue, .js, .ts
424
+ */
425
+ const routerUpdates = () => {
426
+ const files = glob.sync(params.paths || '**/*.{vue,js,ts}', { ignore });
427
+ const replacementCases = [
428
+ [`import Router from 'vue-router'`, `import { createRouter } from 'vue-router'`],
429
+ [`Vue.use(Router)`, `const router = createRouter({})`],
430
+ // [`currentRoute`, '', 'The currentRoute property is now a ref() https://router.vuejs.org/guide/migration/#The-currentRoute-property-is-now-a-ref-'],
431
+ [/import\s*\{([^}]*)\s* RouteConfig\s*([^}]*)\}\s*from\s*'vue-router'/g, (match, before, after) => `import {${ before.trim() } RouteRecordRaw ${ after.trim() }} from 'vue-router'`],
432
+ [/import\s*\{([^}]*)\s* Location\s*([^}]*)\}\s*from\s*'vue-router'/g, (match, before, after) => `import {${ before.trim() } RouteLocation ${ after.trim() }} from 'vue-router'`],
433
+ ['imported Router', ''],
434
+ ['router.name', '', 'now string | Symbol'],
435
+ [`mode: \'history\'`, 'history: createWebHistory()'],
436
+ // ['getMatchedComponents', '', 'https://router.vuejs.org/guide/migration/#Removal-of-router-getMatchedComponents-'],
437
+ ];
438
+
439
+ replaceCases('router', files, replacementCases, `Updating Vue Router`);
440
+ };
441
+
442
+ /**
443
+ * Jest update
444
+ * https://test-utils.vuejs.org/migration
445
+ * Files: .spec.js, .spec.ts, .test.js, .test.ts
446
+ */
447
+ // eslint-disable-next-line no-unused-vars
448
+ const jestUpdates = () => {
449
+ const files = glob.sync(params.paths || '**/*.{test.js,test.ts}', { ignore });
450
+
451
+ const cases = [
452
+ ['config.mocks.$myGlobal', '', ''],
453
+ ['createLocalVue', '', 'https://test-utils.vuejs.org/migration/#No-more-createLocalVue'],
454
+ ['new Vuex.Store', '', ''],
455
+ ['store', '', ''],
456
+ ['propsData', 'props', 'https://test-utils.vuejs.org/migration/#propsData-is-now-props'],
457
+ ['localVue.extend({})', '', ''],
458
+ ['Vue.nextTick', '', ''],
459
+ ['$destroy', '$unmount', 'https://test-utils.vuejs.org/migration/#destroy-is-now-unmount-to-match-Vue-3'],
460
+ ['mocks', '', 'https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global'],
461
+ ['stubs', '', 'https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global'],
462
+ ['mixins', '', 'https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global'],
463
+ ['plugins', '', 'https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global'],
464
+ ['component', '', 'https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global'],
465
+ ['directives', '', 'https://test-utils.vuejs.org/migration/#mocks-and-stubs-are-now-in-global'],
466
+ ['slots', '', 'slots‘s scope is now exposed as params https://test-utils.vuejs.org/migration/#slots-s-scope-is-now-exposed-as-params'],
467
+ ['scopedSlots', '', 'scopedSlots is now merged with slots https://test-utils.vuejs.org/migration/#scopedSlots-is-now-merged-with-slots'],
468
+ ['parentComponent', '', 'deprecated '],
469
+ ['contains', 'find', 'deprecated '],
470
+ ['config.global.renderStubDefaultSlot = false', '', ''],
471
+ ['findAll().at(0)', '', '']
472
+ ];
473
+
474
+ replaceCases('jest', files, cases, `Updating Jest`);
475
+ };
476
+
477
+ /**
478
+ * Jest config updates
479
+ * Files: jest.config.js, .json, .ts
480
+ *
481
+ * /node_modules/@vue/vue2-jest --> reference needs new library version
482
+ */
483
+ const jestConfigUpdates = () => {
484
+ const files = glob.sync(params.paths || '**/jest.config.{js,ts,json}', { ignore });
485
+ const cases = [
486
+ ['/node_modules/@vue/vue2-jest', '/node_modules/@vue/vue3-jest']
487
+ ];
488
+
489
+ replaceCases('jest', files, cases, `Updating Jest config`);
490
+ };
491
+
492
+ /**
493
+ * ESLint Updates
494
+ * Files: .eslintrc.js, .eslintrc.json, .eslintrc.yml
495
+ */
496
+ const eslintUpdates = () => {
497
+ const files = glob.sync(params.paths || '**/.eslintrc.*{js,json,yml}', { ignore });
498
+ // Add cases introduced with new recommended settings
499
+ const replacePlugins = [
500
+ ['plugin:vue/essential', 'plugin:vue/vue3-essential'],
501
+ ['plugin:vue/strongly-recommended', 'plugin:vue/vue3-strongly-recommended'],
502
+ ['plugin:vue/recommended', 'plugin:vue/vue3-recommended']
503
+ ];
504
+ const newRules = {
505
+ 'vue/one-component-per-file': 'off',
506
+ 'vue/no-deprecated-slot-attribute': 'off',
507
+ 'vue/require-explicit-emits': 'off',
508
+ 'vue/v-on-event-hyphenation': 'off',
509
+ };
510
+
511
+ files.forEach((file) => {
512
+ let content = fs.readFileSync(file, 'utf8');
513
+ const matchedCases = [];
514
+
515
+ replacePlugins.forEach(([text, replacement]) => {
516
+ const isCase = content.includes(text);
517
+
518
+ if (isCase) {
519
+ content = content.replaceAll(text, replacement);
520
+ matchedCases.push([text, replacement]);
521
+
522
+ writeContent(file, content);
523
+ }
524
+ });
525
+
526
+ // Add the new rules if they don't exist
527
+ const eslintConfigPath = path.join(__dirname, `../${ file }`);
528
+ const eslintConfig = require(eslintConfigPath);
529
+
530
+ Object.keys(newRules).forEach((rule) => {
531
+ if (!eslintConfig.rules[rule]) {
532
+ eslintConfig.rules[rule] = newRules[rule];
533
+ matchedCases.push(rule);
534
+ }
535
+ });
536
+ writeContent(eslintConfigPath, `module.exports = ${ JSON.stringify(eslintConfig, null, 2) }`);
537
+
538
+ if (matchedCases.length) {
539
+ printContent(file, `Updating ESLint`, matchedCases);
540
+ stats.eslint.push(file);
541
+ stats.total.push(file);
542
+ }
543
+ });
544
+ };
545
+
546
+ /**
547
+ * TS Updates
548
+ * Files: tsconfig*.json
549
+ *
550
+ * Add information about TS issues, recommend @ts-nocheck as temporary solution
551
+ */
552
+ const tsUpdates = () => {
553
+ console.warn('TS checks are stricter and may require to be fixed manually.',
554
+ 'Use @ts-nocheck to give you time to fix them.',
555
+ 'Add exception to your ESLint config to avoid linting errors.');
556
+ // TODO: Add case
557
+ };
558
+
559
+ /**
560
+ * Styles updates
561
+ */
562
+ const stylesUpdates = () => {
563
+ const files = glob.sync(params.paths || '**/*.{vue, scss}', { ignore });
564
+ const cases = [
565
+ ['::v-deep', ':deep()'],
566
+ ];
567
+
568
+ replaceCases('style', files, cases, `Updating styles`);
569
+ };
570
+
571
+ /**
572
+ * Hook to write content
573
+ */
574
+ const writeContent = (...args) => {
575
+ if (!isDry) {
576
+ fs.writeFileSync(...args);
577
+ }
578
+ };
579
+
580
+ /**
581
+ * Hook to print content
582
+ */
583
+ const printContent = (...args) => {
584
+ if (isVerbose) {
585
+ console.log(...args);
586
+ }
587
+ };
588
+
589
+ /**
590
+ * Replace all cases for the provided files
591
+ */
592
+ const replaceCases = (fileType, files, replacementCases, printText) => {
593
+ files.forEach((file) => {
594
+ const matchedCases = [];
595
+ let content = fs.readFileSync(file, 'utf8');
596
+
597
+ replacementCases.forEach(([text, replacement, notes]) => {
598
+ // Simple text
599
+ if (typeof text === 'string') {
600
+ if (content.includes(text)) {
601
+ // Exclude cases without replacement
602
+ if (replacement) {
603
+ // Remove discontinued functionalities which do not break
604
+ content = content.replaceAll(text, replacement === removePlaceholder ? '' : replacement);
605
+ }
606
+ if (!matchedCases.includes(`${ text }, ${ replacement }, ${ notes }`)) {
607
+ matchedCases.push(`${ text }, ${ replacement }, ${ notes }`);
608
+ }
609
+ }
610
+ } else {
611
+ // Regex case
612
+ // TODO: Fix issue not replacing all
613
+ if (text.test(content) && replacement) {
614
+ content = content.replace(new RegExp(text, 'g'), replacement);
615
+ if (!matchedCases.includes(`${ text }, ${ replacement }, ${ notes }`)) {
616
+ matchedCases.push(`${ text }, ${ replacement }, ${ notes }`);
617
+ }
618
+ }
619
+ }
620
+ });
621
+
622
+ if (matchedCases.length) {
623
+ writeContent(file, content);
624
+ printContent(file, printText, matchedCases);
625
+ stats[fileType].push(file);
626
+ stats.total.push(file);
627
+ }
628
+ });
629
+ };
630
+
631
+ /**
632
+ * Print log
633
+ */
634
+ const printLog = () => {
635
+ if (process.argv.includes('--files')) {
636
+ console.dir(stats, { compact: true });
637
+ }
638
+
639
+ const statsCount = Object.entries(stats).reduce((acc, [key, value]) => ({
640
+ ...acc,
641
+ [key]: value.length
642
+ }), {});
643
+
644
+ console.table(statsCount);
645
+
646
+ if (process.argv.includes('--log')) {
647
+ fs.writeFileSync('stats.json', JSON.stringify(stats, null, 2));
648
+ }
649
+ };
650
+
651
+ const setParams = () => {
652
+ const args = process.argv.slice(2);
653
+ const paramKeys = ['paths'];
654
+
655
+ args.forEach((val) => {
656
+ paramKeys.forEach((key) => {
657
+ if (val.startsWith(`--${ key }=`)) {
658
+ params[key] = val.split('=')[1];
659
+ }
660
+ });
661
+ });
662
+ };
663
+
664
+ /**
665
+ * Init application
666
+ */
667
+ (function() {
668
+ setParams();
669
+
670
+ packageUpdates();
671
+ gitHubActionsUpdates();
672
+ nvmUpdates();
673
+ vueConfigUpdates();
674
+ vueSyntaxUpdates();
675
+ routerUpdates();
676
+ // jestUpdates();
677
+ jestConfigUpdates();
678
+ eslintUpdates();
679
+ tsUpdates();
680
+ stylesUpdates();
681
+
682
+ printLog();
683
+ })();