@rancher/shell 0.3.13 → 0.3.15

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 (396) hide show
  1. package/assets/images/providers/nutanix.svg +1 -0
  2. package/assets/translations/en-us.yaml +89 -2
  3. package/chart/gatekeeper.vue +2 -2
  4. package/chart/monitoring/alerting/index.vue +3 -3
  5. package/chart/monitoring/index.vue +2 -2
  6. package/chart/monitoring/prometheus/index.vue +1 -1
  7. package/chart/rancher-backup/index.vue +2 -2
  8. package/cloud-credential/harvester.vue +2 -2
  9. package/components/AssignTo.vue +1 -1
  10. package/components/AwsComplianceBanner.vue +1 -1
  11. package/components/BackLink.vue +7 -0
  12. package/components/BrandImage.vue +3 -3
  13. package/components/ClusterProviderIcon.vue +1 -1
  14. package/components/CommunityLinks.vue +2 -2
  15. package/components/ConsumptionGauge.vue +17 -2
  16. package/components/CruResource.vue +2 -1
  17. package/components/DashboardMetrics.vue +8 -0
  18. package/components/DetailTop.vue +1 -1
  19. package/components/ExplorerMembers.vue +8 -8
  20. package/components/ExplorerProjectsNamespaces.vue +9 -9
  21. package/components/FixedBanner.vue +1 -1
  22. package/components/GlobalRoleBindings.vue +11 -11
  23. package/components/GrafanaDashboard.vue +7 -1
  24. package/components/GrowlManager.vue +1 -1
  25. package/components/HarvesterServiceAddOnConfig.vue +117 -2
  26. package/components/IconOrSvg.vue +10 -3
  27. package/components/LandingPagePreference.vue +2 -2
  28. package/components/MoveModal.vue +1 -1
  29. package/components/PodSecurityAdmission.vue +3 -3
  30. package/components/ProgressBarMulti.vue +2 -2
  31. package/components/PromptRemove.vue +52 -28
  32. package/components/PromptRestore.vue +3 -3
  33. package/components/Questions/index.vue +5 -5
  34. package/components/RelatedWorkloadsTable.vue +1 -1
  35. package/components/ResourceList/Masthead.vue +1 -1
  36. package/components/ResourceTable.vue +3 -3
  37. package/components/ResourceYaml.vue +1 -1
  38. package/components/RoleBindings.vue +2 -2
  39. package/components/SingleClusterInfo.vue +1 -1
  40. package/components/SortableTable/actions.js +3 -3
  41. package/components/SortableTable/advanced-filtering.js +7 -7
  42. package/components/SortableTable/filtering.js +1 -1
  43. package/components/SortableTable/index.vue +9 -9
  44. package/components/SortableTable/selection.js +5 -5
  45. package/components/SortableTable/sorting.js +5 -5
  46. package/components/Tabbed/index.vue +7 -7
  47. package/components/TableSparkLine.vue +1 -1
  48. package/components/Wizard.vue +11 -23
  49. package/components/__tests__/Collapse.spec.ts +1 -1
  50. package/components/__tests__/CruResource.test.ts +74 -0
  51. package/components/__tests__/SimpleBox.spec.ts +1 -1
  52. package/components/auth/RoleDetailEdit.vue +7 -3
  53. package/components/auth/SelectPrincipal.vue +3 -3
  54. package/components/fleet/FleetResources.vue +1 -1
  55. package/components/fleet/FleetStatus.vue +4 -4
  56. package/components/fleet/FleetSummary.vue +1 -1
  57. package/components/fleet/ForceDirectedTreeChart/chartIcons.js +1 -1
  58. package/components/fleet/ForceDirectedTreeChart/index.vue +1 -1
  59. package/components/form/ArrayList.vue +11 -3
  60. package/components/form/ArrayListSelect.vue +2 -2
  61. package/components/form/FileSelector.vue +6 -0
  62. package/components/form/GitPicker.vue +528 -0
  63. package/components/form/KeyValue.vue +82 -41
  64. package/components/form/LabeledSelect.vue +2 -2
  65. package/components/form/MatchExpressions.vue +2 -2
  66. package/components/form/Members/ClusterMembershipEditor.vue +1 -2
  67. package/components/form/Members/ClusterPermissionsEditor.vue +6 -5
  68. package/components/form/Members/MembershipEditor.vue +4 -4
  69. package/components/form/Members/ProjectMembershipEditor.vue +1 -2
  70. package/components/form/NameNsDescription.vue +13 -6
  71. package/components/form/Networking.vue +2 -2
  72. package/components/form/NodeScheduling.vue +1 -1
  73. package/components/form/PodAffinity.vue +1 -1
  74. package/components/form/ProjectMemberEditor.vue +4 -4
  75. package/components/form/ResourceQuota/Namespace.vue +2 -2
  76. package/components/form/ResourceQuota/NamespaceRow.vue +2 -2
  77. package/components/form/ResourceQuota/Project.vue +1 -1
  78. package/components/form/ResourceQuota/shared.js +2 -2
  79. package/components/form/ResourceSelector.vue +1 -1
  80. package/components/form/ResourceTabs/index.vue +1 -1
  81. package/components/form/RuleSelector.vue +1 -1
  82. package/components/form/SecretSelector.vue +4 -4
  83. package/components/form/Select.vue +2 -2
  84. package/components/form/SelectOrCreateAuthSecret.vue +3 -3
  85. package/components/form/ServiceNameSelect.vue +1 -1
  86. package/components/form/ServicePorts.vue +1 -1
  87. package/components/form/ShellInput.vue +1 -1
  88. package/components/form/SimpleSecretSelector.vue +4 -4
  89. package/components/form/Taints.vue +1 -1
  90. package/components/form/ValueFromResource.vue +3 -3
  91. package/components/form/WorkloadPorts.vue +8 -7
  92. package/components/form/__tests__/Error.test.ts +1 -1
  93. package/components/form/__tests__/KeyValue.test.ts +21 -0
  94. package/components/formatter/ClusterLink.vue +1 -1
  95. package/components/formatter/ClusterProvider.vue +13 -2
  96. package/components/formatter/Endpoints.vue +1 -1
  97. package/components/formatter/FleetSummaryGraph.vue +2 -2
  98. package/components/formatter/IngressTarget.vue +2 -2
  99. package/components/formatter/PodImages.vue +1 -1
  100. package/components/formatter/PrincipalGroupBindings.vue +1 -1
  101. package/components/formatter/ReceiverIcons.vue +3 -3
  102. package/components/formatter/ServiceType.vue +1 -1
  103. package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
  104. package/components/formatter/WorkloadHealthScale.vue +1 -1
  105. package/components/formatter/__tests__/LiveDate.test.ts +1 -1
  106. package/components/graph/Bar.vue +1 -1
  107. package/components/graph/LinePlot.vue +3 -3
  108. package/components/nav/Group.vue +2 -2
  109. package/components/nav/Header.vue +5 -5
  110. package/components/nav/NamespaceFilter.vue +14 -14
  111. package/components/nav/TopLevelMenu.vue +76 -11
  112. package/components/nav/WindowManager/ContainerLogs.vue +2 -2
  113. package/components/nav/WindowManager/ContainerShell.vue +1 -1
  114. package/components/nav/WorkspaceSwitcher.vue +1 -1
  115. package/config/home-links.js +4 -4
  116. package/config/labels-annotations.js +8 -8
  117. package/config/pod-security-admission.ts +1 -1
  118. package/config/product/auth.js +4 -4
  119. package/config/product/explorer.js +14 -0
  120. package/config/router.js +5 -0
  121. package/config/store.js +2 -0
  122. package/config/table-headers.js +13 -13
  123. package/config/uiplugins.js +8 -1
  124. package/core/plugin-routes.ts +3 -2
  125. package/core/plugin.ts +3 -3
  126. package/core/plugins.js +7 -7
  127. package/creators/app/files/.gitignore +0 -3
  128. package/creators/pkg/files/index.ts +1 -1
  129. package/detail/cis.cattle.io.clusterscan.vue +3 -3
  130. package/detail/fleet.cattle.io.bundle.vue +1 -1
  131. package/detail/helm.cattle.io.projecthelmchart.vue +16 -29
  132. package/detail/management.cattle.io.user.vue +12 -12
  133. package/detail/namespace.vue +4 -4
  134. package/detail/networking.k8s.io.ingress.vue +3 -3
  135. package/detail/node.vue +2 -2
  136. package/detail/provisioning.cattle.io.cluster.vue +9 -10
  137. package/detail/service.vue +1 -1
  138. package/detail/workload/index.vue +3 -3
  139. package/dialog/AddProjectMemberDialog.vue +2 -2
  140. package/dialog/DrainNode.vue +1 -1
  141. package/dialog/GenericPrompt.vue +9 -5
  142. package/dialog/RotateEncryptionKeyDialog.vue +2 -2
  143. package/dialog/ScaleMachineDownDialog.vue +2 -2
  144. package/edit/auth/azuread.vue +3 -3
  145. package/edit/autoscaling.horizontalpodautoscaler/index.vue +5 -5
  146. package/edit/cis.cattle.io.clusterscan.vue +5 -5
  147. package/edit/cloudcredential.vue +4 -4
  148. package/edit/constraints.gatekeeper.sh.constraint/NamespaceList.vue +1 -1
  149. package/edit/constraints.gatekeeper.sh.constraint/index.vue +4 -4
  150. package/edit/fleet.cattle.io.gitrepo.vue +6 -6
  151. package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
  152. package/edit/logging-flow/index.vue +4 -4
  153. package/edit/logging.banzaicloud.io.output/index.vue +3 -3
  154. package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
  155. package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
  156. package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
  157. package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +1 -1
  158. package/edit/logging.banzaicloud.io.output/providers/redis.vue +1 -1
  159. package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
  160. package/edit/management.cattle.io.clusterroletemplatebinding.vue +1 -1
  161. package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +1 -1
  162. package/edit/management.cattle.io.project.vue +3 -3
  163. package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -2
  164. package/edit/management.cattle.io.setting.vue +1 -1
  165. package/edit/management.cattle.io.user.vue +2 -2
  166. package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +2 -2
  167. package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
  168. package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +1 -1
  169. package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +3 -3
  170. package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +5 -5
  171. package/edit/monitoring.coreos.com.prometheusrule/duration.js +1 -1
  172. package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
  173. package/edit/monitoring.coreos.com.receiver/tls.vue +3 -4
  174. package/edit/monitoring.coreos.com.receiver/types/__tests__/email.test.ts +53 -0
  175. package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -0
  176. package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +3 -3
  177. package/edit/monitoring.coreos.com.receiver/types/webhook.add.vue +1 -1
  178. package/edit/monitoring.coreos.com.route.vue +2 -2
  179. package/edit/namespace.vue +21 -13
  180. package/edit/networking.k8s.io.ingress/Certificate.vue +2 -2
  181. package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
  182. package/edit/networking.k8s.io.ingress/RulePath.vue +2 -2
  183. package/edit/networking.k8s.io.ingress/Rules.vue +2 -2
  184. package/edit/networking.k8s.io.ingress/index.vue +4 -4
  185. package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
  186. package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
  187. package/edit/persistentvolume/index.vue +4 -4
  188. package/edit/persistentvolumeclaim.vue +3 -3
  189. package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +1 -1
  190. package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +2 -2
  191. package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
  192. package/edit/provisioning.cattle.io.cluster/index.vue +7 -7
  193. package/edit/provisioning.cattle.io.cluster/rke2.vue +28 -29
  194. package/edit/resources.cattle.io.backup.vue +2 -2
  195. package/edit/resources.cattle.io.restore.vue +3 -3
  196. package/edit/secret/generic.vue +1 -1
  197. package/edit/secret/index.vue +3 -3
  198. package/edit/service.vue +3 -21
  199. package/edit/serviceaccount.vue +2 -2
  200. package/edit/storage.k8s.io.storageclass/index.vue +4 -4
  201. package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +1 -1
  202. package/edit/token.vue +5 -5
  203. package/edit/workload/index.vue +1 -1
  204. package/edit/workload/mixins/workload.js +8 -8
  205. package/edit/workload/storage/ContainerMountPaths.vue +9 -9
  206. package/edit/workload/storage/Mount.vue +2 -2
  207. package/edit/workload/storage/csi/index.vue +1 -1
  208. package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
  209. package/edit/workload/storage/index.vue +6 -6
  210. package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -2
  211. package/initialize/client.js +8 -8
  212. package/initialize/index.js +1 -4
  213. package/layouts/default.vue +38 -11
  214. package/list/catalog.cattle.io.clusterrepo.vue +9 -1
  215. package/list/cis.cattle.io.clusterscan.vue +1 -1
  216. package/list/fleet.cattle.io.cluster.vue +2 -2
  217. package/list/group.principal.vue +1 -1
  218. package/list/helm.cattle.io.projecthelmchart.vue +2 -2
  219. package/list/management.cattle.io.cluster.vue +1 -1
  220. package/list/management.cattle.io.feature.vue +1 -1
  221. package/list/management.cattle.io.user.vue +2 -2
  222. package/list/node.vue +5 -5
  223. package/list/provisioning.cattle.io.cluster.vue +4 -5
  224. package/machine-config/amazonec2.vue +2 -2
  225. package/machine-config/digitalocean.vue +4 -4
  226. package/machine-config/linode.vue +4 -4
  227. package/machine-config/vmwarevsphere.vue +12 -12
  228. package/middleware/authenticated.js +7 -6
  229. package/mixins/brand.js +1 -1
  230. package/mixins/chart.js +6 -6
  231. package/mixins/fetch.client.js +2 -2
  232. package/mixins/form-validation.js +7 -7
  233. package/mixins/resource-fetch-namespaced.js +1 -1
  234. package/mixins/resource-fetch.js +2 -2
  235. package/models/apps.statefulset.js +2 -2
  236. package/models/batch.cronjob.js +1 -1
  237. package/models/catalog.cattle.io.app.js +4 -4
  238. package/models/cis.cattle.io.clusterscan.js +1 -1
  239. package/models/cis.cattle.io.clusterscanbenchmark.js +1 -1
  240. package/models/cis.cattle.io.clusterscanreport.js +1 -1
  241. package/models/cloudcredential.js +1 -1
  242. package/models/cluster/node.js +5 -5
  243. package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
  244. package/models/fleet.cattle.io.gitrepo.js +3 -3
  245. package/models/group.principal.js +4 -4
  246. package/models/helm.cattle.io.projecthelmchart.js +2 -2
  247. package/models/logging.banzaicloud.io.clusterflow.js +2 -2
  248. package/models/logging.banzaicloud.io.flow.js +5 -5
  249. package/models/logging.banzaicloud.io.output.js +2 -2
  250. package/models/management.cattle.io.cluster.js +10 -14
  251. package/models/management.cattle.io.globalrole.js +4 -4
  252. package/models/management.cattle.io.node.js +2 -2
  253. package/models/management.cattle.io.nodepool.js +3 -3
  254. package/models/management.cattle.io.nodetemplate.js +4 -4
  255. package/models/management.cattle.io.project.js +2 -2
  256. package/models/management.cattle.io.roletemplate.js +1 -1
  257. package/models/management.cattle.io.setting.js +1 -1
  258. package/models/management.cattle.io.user.js +5 -5
  259. package/models/monitoring.coreos.com.receiver.js +9 -9
  260. package/models/namespace.js +1 -1
  261. package/models/networking.k8s.io.ingress.js +5 -5
  262. package/models/persistentvolume.js +3 -3
  263. package/models/pod.js +3 -3
  264. package/models/provisioning.cattle.io.cluster.js +39 -27
  265. package/models/rbac.authorization.k8s.io.clusterrole.js +2 -2
  266. package/models/rbac.authorization.k8s.io.role.js +3 -3
  267. package/models/secret.js +1 -1
  268. package/models/service.js +2 -2
  269. package/models/storage.k8s.io.storageclass.js +2 -2
  270. package/models/token.js +1 -1
  271. package/models/workload.js +6 -6
  272. package/models/workload.service.js +5 -21
  273. package/package.json +2 -1
  274. package/pages/about.vue +9 -9
  275. package/pages/account/index.vue +2 -2
  276. package/pages/auth/login.vue +15 -12
  277. package/pages/auth/verify.vue +6 -0
  278. package/pages/c/_cluster/apps/charts/index.vue +4 -4
  279. package/pages/c/_cluster/apps/charts/install.vue +28 -20
  280. package/pages/c/_cluster/auth/roles/index.vue +9 -9
  281. package/pages/c/_cluster/explorer/index.vue +41 -16
  282. package/pages/c/_cluster/explorer/tools/index.vue +8 -8
  283. package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +1 -1
  284. package/pages/c/_cluster/fleet/index.vue +11 -11
  285. package/pages/c/_cluster/monitoring/index.vue +1 -1
  286. package/pages/c/_cluster/settings/links.vue +3 -3
  287. package/pages/c/_cluster/settings/performance.vue +1 -1
  288. package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +6 -6
  289. package/pages/c/_cluster/uiplugins/CatalogList/index.vue +3 -3
  290. package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -3
  291. package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -1
  292. package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +3 -3
  293. package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +6 -6
  294. package/pages/c/_cluster/uiplugins/UninstallDialog.vue +4 -4
  295. package/pages/c/_cluster/uiplugins/index.vue +22 -19
  296. package/pages/diagnostic.vue +6 -6
  297. package/pages/home.vue +3 -3
  298. package/pages/prefs.vue +2 -2
  299. package/pages/rio/mesh.vue +3 -3
  300. package/pages/support/index.vue +10 -1
  301. package/pkg/auto-import.js +1 -1
  302. package/pkg/tsconfig.json +1 -0
  303. package/pkg/vue.config.js +1 -1
  304. package/plugins/axios.js +1 -1
  305. package/plugins/clean-html-directive.js +1 -1
  306. package/plugins/dashboard-store/__tests__/mutations.spec.js +4 -4
  307. package/plugins/dashboard-store/actions.js +4 -4
  308. package/plugins/dashboard-store/getters.js +1 -1
  309. package/plugins/dashboard-store/index.js +1 -1
  310. package/plugins/dashboard-store/mutations.js +2 -2
  311. package/plugins/dashboard-store/resource-class.js +8 -8
  312. package/plugins/i18n.js +1 -1
  313. package/plugins/plugin.js +5 -1
  314. package/plugins/steve/actions.js +3 -3
  315. package/plugins/steve/getters.js +3 -3
  316. package/plugins/steve/hybrid-class.js +1 -1
  317. package/plugins/steve/mutations.js +1 -1
  318. package/plugins/steve/performanceTesting.js +1 -1
  319. package/plugins/steve/resourceWatcher.js +1 -1
  320. package/plugins/steve/subscribe.js +6 -6
  321. package/plugins/steve/worker/web-worker.basic.js +1 -1
  322. package/promptRemove/management.cattle.io.project.vue +3 -3
  323. package/promptRemove/mixin/roleDeletionCheck.js +4 -4
  324. package/promptRemove/pod.vue +1 -1
  325. package/rancher-components/StringList/StringList.test.ts +80 -0
  326. package/rancher-components/StringList/StringList.vue +577 -0
  327. package/rancher-components/StringList/index.ts +1 -0
  328. package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +2 -2
  329. package/rancher-components/components/Form/Checkbox/Checkbox.vue +1 -1
  330. package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -1
  331. package/rancher-components/components/Form/Radio/RadioButton.vue +2 -2
  332. package/rancher-components/components/Form/Radio/RadioGroup.vue +2 -2
  333. package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
  334. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +1 -1
  335. package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -7
  336. package/rancher-components/components/StringList/StringList.test.ts +10 -9
  337. package/rancher-components/components/StringList/StringList.vue +5 -5
  338. package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
  339. package/store/action-menu.js +4 -4
  340. package/store/auth.js +40 -7
  341. package/store/aws.js +1 -1
  342. package/store/catalog.js +12 -11
  343. package/store/digitalocean.js +4 -4
  344. package/store/features.js +1 -0
  345. package/store/github.js +70 -213
  346. package/store/gitlab.js +159 -0
  347. package/store/growl.js +1 -1
  348. package/store/i18n.js +7 -7
  349. package/store/index.js +63 -22
  350. package/store/linode.js +1 -1
  351. package/store/plugins.js +5 -5
  352. package/store/pnap.js +1 -1
  353. package/store/prefs.js +6 -6
  354. package/store/resource-fetch.js +3 -3
  355. package/store/type-map.js +61 -42
  356. package/store/uiplugins.ts +2 -1
  357. package/store/wm.js +5 -4
  358. package/tsconfig.default.json +10 -0
  359. package/tsconfig.json +2 -9
  360. package/types/shell/index.d.ts +12 -4
  361. package/utils/__tests__/version.test.ts +28 -0
  362. package/utils/alertmanagerconfig.js +4 -4
  363. package/utils/array.ts +4 -4
  364. package/utils/async.ts +1 -1
  365. package/utils/auth.js +3 -3
  366. package/utils/axios.js +5 -5
  367. package/utils/cluster.js +4 -3
  368. package/utils/color.js +10 -0
  369. package/utils/create-yaml.js +4 -4
  370. package/utils/crypto/browserHashUtils.js +1 -1
  371. package/utils/crypto/browserMd5.js +1 -1
  372. package/utils/crypto/browserSha1.js +1 -1
  373. package/utils/crypto/browserSha256.js +1 -1
  374. package/utils/crypto/index.js +3 -3
  375. package/utils/favicon.js +2 -3
  376. package/utils/gatekeeper/util.js +3 -3
  377. package/utils/gc/gc.ts +2 -2
  378. package/utils/git.ts +92 -0
  379. package/utils/grafana.js +4 -4
  380. package/utils/monitoring.js +2 -2
  381. package/utils/nuxt.js +2 -2
  382. package/utils/object.js +5 -5
  383. package/utils/pod-security-admission.ts +1 -1
  384. package/utils/projectAndNamespaceFiltering.utils.ts +1 -1
  385. package/utils/select.js +2 -2
  386. package/utils/selector.js +2 -2
  387. package/utils/settings.ts +17 -2
  388. package/utils/socket.js +30 -6
  389. package/utils/sort.js +1 -1
  390. package/utils/string.js +1 -1
  391. package/utils/url.ts +1 -1
  392. package/utils/validators/formRules/index.ts +3 -3
  393. package/utils/validators/role-template.js +4 -4
  394. package/utils/version.js +14 -1
  395. package/vue.config.js +19 -13
  396. package/components/form/GithubPicker.vue +0 -390
package/store/github.js CHANGED
@@ -1,252 +1,109 @@
1
- import dayjs from 'dayjs';
2
- import { addParam, parseLinkHeader } from '@shell/utils/url';
3
- import { addObjects, isArray } from '@shell/utils/array';
4
- import { GITHUB_REPOS, GITHUB_SCOPES, _DATE } from '@shell/config/local-storage';
1
+ const GITHUB_BASE_API = 'https://api.github.com';
2
+ const MAX_RESULTS = 100; // max number of results is 100
5
3
 
6
- const API_BASE = 'https://api.github.com/';
4
+ const fetchGithubAPI = async(endpoint) => {
5
+ const response = await fetch(`${ GITHUB_BASE_API }/${ endpoint }`);
7
6
 
8
- export const EXTENDED_SCOPES = ['repo'];
7
+ // If rate-limit is exceeded, we should wait until the rate limit is reset
8
+ if (response.status === 403) {
9
+ const resetTime = new Date(response.headers.get('X-RateLimit-Reset') * 1000);
9
10
 
10
- export const DOCKERFILE = /^Dockerfile(\..*)?$/i;
11
- export const YAML_FILE = /^.*\.ya?ml$/i;
12
-
13
- function getFromStorage(key) {
14
- if ( process.server ) {
15
- return null;
16
- }
17
-
18
- const cached = window.localStorage.getItem(key);
19
-
20
- if ( cached ) {
21
- try {
22
- const parsed = JSON.parse(cached);
23
-
24
- return parsed;
25
- } catch (e) {}
11
+ throw new Error(`Rate limit exceeded. Try again at ${ resetTime }`);
26
12
  }
27
- }
28
-
29
- function getCachedRepos() {
30
- const cached = getFromStorage(GITHUB_REPOS);
31
-
32
- return cached || [];
33
- }
34
-
35
- function getCachedScopes() {
36
- const cached = getFromStorage(GITHUB_SCOPES);
37
-
38
- return cached;
39
- }
40
13
 
41
- function hasCached() {
42
- if ( process.server ) {
43
- return false;
14
+ if (!response.ok) {
15
+ throw response;
44
16
  }
45
17
 
46
- const cached = window.localStorage.getItem(GITHUB_REPOS);
47
-
48
- return !!cached;
49
- }
50
-
51
- function cacheExpired() {
52
- if ( process.server ) {
53
- return false;
54
- }
55
-
56
- const updated = window.localStorage.getItem(GITHUB_REPOS + _DATE);
57
-
58
- if ( updated && dayjs().diff(updated) <= 60 * 60 * 1000 ) {
59
- return false;
60
- }
61
-
62
- return true;
63
- }
64
-
65
- function setCache(repos, scopes) {
66
- if ( repos ) {
67
- window.localStorage.setItem(GITHUB_REPOS, JSON.stringify(repos));
68
- window.localStorage.setItem(GITHUB_REPOS + _DATE, (new Date()).toISOString());
69
- }
70
-
71
- if ( scopes ) {
72
- window.localStorage.setItem(GITHUB_SCOPES, JSON.stringify(scopes));
73
- }
74
- }
75
-
76
- function forgetCache() {
77
- window.localStorage.removeItem(GITHUB_REPOS);
78
- window.localStorage.removeItem(GITHUB_REPOS + _DATE);
79
- window.localStorage.removeItem(GITHUB_SCOPES);
80
- }
81
-
82
- function proxifyUrl(url) {
83
- // Strip off absolute links to github API
84
- if ( url.startsWith(API_BASE) ) {
85
- url = url.substr(API_BASE.length);
86
- }
87
-
88
- // Add our proxy prefix
89
- url = `/v1/github/${ url.replace(/^\/+/, '') }`;
90
-
91
- // Less pages please
92
- addParam(url, 'per_page', 100);
93
-
94
- return url;
95
- }
96
-
97
- export const state = function() {
98
- return {
99
- repos: [],
100
- scopes: []
101
- };
18
+ return await response.json();
102
19
  };
103
20
 
21
+ export const getters = {};
22
+
104
23
  export const actions = {
105
- async apiList({ commit, dispatch }, {
106
- url = null,
107
- single = false,
108
- depaginate = true,
109
- onPageFn = null,
110
- objectKey = 'items',
111
- } = {}) {
112
- const out = [];
113
-
114
- url = proxifyUrl(url);
115
-
116
- while ( true ) {
117
- console.log('Github Request:', url); // eslint-disable-line no-console
118
- const res = await dispatch('rancher/request', { url }, { root: true });
119
- const links = parseLinkHeader(res._headers['link']);
120
-
121
- const scopes = res._headers['x-oauth-scopes'];
122
-
123
- if ( scopes ) {
124
- commit('setScopes', scopes.split(/\s*,\s*/));
24
+ async apiList(ctx, {
25
+ username, endpoint, repo, branch
26
+ }) {
27
+ try {
28
+ switch (endpoint) {
29
+ case 'branches': {
30
+ return await fetchGithubAPI(`repos/${ username }/${ repo }/branches?per_page=${ MAX_RESULTS }`);
125
31
  }
126
-
127
- if ( single ) {
128
- return res;
32
+ case 'repo': {
33
+ return await fetchGithubAPI(`repos/${ username }/${ repo }`);
129
34
  }
130
-
131
- addObjects(out, isArray(res) ? res : res[objectKey]);
132
-
133
- if ( onPageFn ) {
134
- onPageFn(out);
35
+ case 'commits': {
36
+ return await fetchGithubAPI(`repos/${ username }/${ repo }/commits?sha=${ branch }&sort=updated&per_page=${ MAX_RESULTS }`);
135
37
  }
136
-
137
- if ( depaginate && links.next ) {
138
- url = proxifyUrl(links.next);
139
- } else {
140
- break;
38
+ case 'recentRepos': {
39
+ return await fetchGithubAPI(`users/${ username }/repos?per_page=${ MAX_RESULTS }`);
141
40
  }
142
- }
41
+ case 'search': {
42
+ // Fetch for a specific branches
43
+ if (username && repo && branch) {
44
+ const response = await fetchGithubAPI(`repos/${ username }/${ repo }/branches/${ branch }`);
143
45
 
144
- return out;
145
- },
146
-
147
- forgetCache() {
148
- forgetCache();
149
- },
46
+ return [response];
47
+ }
150
48
 
151
- async fetchRecentRepos({ commit, dispatch }, { allowCache = true } = {}) {
152
- const cachedScopes = getCachedScopes();
49
+ // Fetch for repos
50
+ const response = await fetchGithubAPI(`search/repositories?q=repo:${ username }/${ repo }`);
153
51
 
154
- if ( cachedScopes ) {
155
- commit('setScopes', cachedScopes);
156
- }
157
-
158
- if ( allowCache && hasCached() ) {
159
- const cached = getCachedRepos();
160
-
161
- if ( cacheExpired() ) {
162
- dispatch('fetchRecentRepos', { allowCache: false });
52
+ if (response) {
53
+ return response.items;
54
+ }
163
55
  }
164
-
165
- return cached;
56
+ }
57
+ } catch (error) {
58
+ throw await error.json() ?? Error(`Error fetching ${ endpoint }`);
166
59
  }
167
-
168
- const res = await dispatch('apiList', { url: '/user/repos?sort=updated', depaginate: false });
169
- const more = await dispatch('apiList', { url: '/user/repos?affiliation=owner,collaborator' });
170
- const out = [...res, ...more];
171
-
172
- commit('setRepos', out);
173
-
174
- return out;
175
60
  },
176
61
 
177
- async searchRepos({ state, dispatch }, { search }) {
178
- if ( !search ) {
179
- return state.repos.slice();
180
- }
181
-
182
- const res = await dispatch('apiList', {
183
- url: `/search/repositories?q=${ escape(search) }`,
184
- depaginate: false
185
- });
62
+ async fetchRecentRepos({ commit, dispatch }, { username } = {}) {
63
+ const res = await dispatch('apiList', { username, endpoint: 'recentRepos' });
186
64
 
187
65
  return res;
188
66
  },
189
67
 
190
- async fetchRepoByUrl({ dispatch }, url) {
191
- url = url.replace(/.git$/i, '');
192
- url = url.replace(/https:\/\/github.com\//, '');
193
- url = `/repos/${ url }`;
194
- const res = await dispatch('apiList', { url, single: true });
68
+ async fetchRepoDetails({ commit, dispatch }, { username, repo } = {}) {
69
+ const res = await dispatch('apiList', {
70
+ username, endpoint: 'repo', repo: repo.name
71
+ });
195
72
 
196
73
  return res;
197
74
  },
198
75
 
199
- async fetchBranches({ dispatch }, { repo }) {
200
- const url = repo.branches_url.replace('{/branch}', '');
201
- const res = await dispatch('apiList', { url });
76
+ async fetchBranches({ commit, dispatch }, { repo, username }) {
77
+ const res = await dispatch('apiList', {
78
+ username, endpoint: 'branches', repo: repo.name
79
+ });
202
80
 
203
81
  return res;
204
82
  },
205
83
 
206
- async fetchBranch({ dispatch }, { repo, name }) {
207
- name = name || 'master';
208
-
209
- const url = repo.branches_url.replace('{/branch}', `/${ name }`);
210
- const res = await dispatch('apiList', { url, single: true });
84
+ async fetchCommits(ctx, { repo, username, branch }) {
85
+ const { dispatch } = ctx;
86
+ const res = await dispatch('apiList', {
87
+ username, endpoint: 'commits', repo: repo.name, branch: branch.name
88
+ });
211
89
 
212
90
  return res;
213
91
  },
214
-
215
- async fetchFiles({ dispatch }, { repo, branch, pattern = null }) {
216
- let url = repo.trees_url.replace('{/sha}', `/${ branch.commit.sha }`);
217
-
218
- url = addParam(url, 'recursive', 1);
219
-
220
- const res = await dispatch('apiList', { url, objectKey: 'tree' });
221
-
222
- if ( !pattern ) {
223
- return res;
92
+ async search({ dispatch }, { repo, username, branch }) {
93
+ try {
94
+ const res = await dispatch('apiList', {
95
+ username, endpoint: 'search', repo: repo?.name, branch: branch?.name
96
+ });
97
+
98
+ return {
99
+ ...res,
100
+ hasError: false,
101
+ };
102
+ } catch (error) {
103
+ return {
104
+ message: error.message,
105
+ hasError: true
106
+ };
224
107
  }
225
-
226
- const out = res.filter(file => file.type === 'blob' && file.path.match(pattern));
227
-
228
- return out;
229
- },
230
-
231
- async fetchFile({ dispatch }, { repo, branch, file }) {
232
- let url = repo.contents_url.replace('{+path}', file);
233
-
234
- url = addParam(url, 'ref', branch.commit.sha);
235
-
236
- const res = await dispatch('apiList', { url, single: true });
237
-
238
- return res;
239
- },
240
- };
241
-
242
- export const mutations = {
243
- setScopes(state, scopes) {
244
- state.scopes = scopes;
245
- setCache(null, scopes);
246
- },
247
-
248
- setRepos(state, repos) {
249
- state.repos = repos;
250
- setCache(repos);
251
108
  },
252
109
  };
@@ -0,0 +1,159 @@
1
+ import { isArray } from '@shell/utils/array';
2
+
3
+ const API_VERSION = 'v4';
4
+ const GITLAB_BASE_API = 'https://gitlab.com/api';
5
+ const TOKEN = '';
6
+ const MAX_RESULTS = 100; // max number of results is 100
7
+
8
+ const getResponse = (endpoint) => fetch(`${ GITLAB_BASE_API }/${ API_VERSION }/${ endpoint }${ TOKEN }`);
9
+
10
+ function fetchUserOrOrganization(endpoint) {
11
+ return Promise.all([
12
+ getResponse(`users/${ endpoint }`),
13
+ getResponse(`groups/${ endpoint }`),
14
+ ]).then((responses) => {
15
+ const found = responses.find((r) => r.ok);
16
+
17
+ if (!found) {
18
+ throw responses[0];
19
+ }
20
+
21
+ return found.json();
22
+ });
23
+ }
24
+
25
+ const fetchGitLabAPI = async(endpoint) => {
26
+ const response = await getResponse(endpoint);
27
+
28
+ // If rate-limit is exceeded, we should wait until the rate limit is reset
29
+ if (response.status === 403) {
30
+ const resetTime = new Date(response.headers.get('X-RateLimit-Reset') * 1000);
31
+
32
+ throw new Error(`Rate limit exceeded. Try again at ${ resetTime }`);
33
+ }
34
+
35
+ if (!response.ok) {
36
+ throw response;
37
+ }
38
+
39
+ return await response.json();
40
+ };
41
+
42
+ export const getters = {};
43
+
44
+ export const actions = {
45
+ async apiList(ctx, {
46
+ username, email, endpoint, repo, branch
47
+ }) {
48
+ try {
49
+ switch (endpoint) {
50
+ case 'branches': {
51
+ return await fetchGitLabAPI(`projects/${ username }%2F${ repo }/repository/branches?per_page=${ MAX_RESULTS }`);
52
+ }
53
+ case 'repo': {
54
+ return await fetchGitLabAPI(`projects/${ username }%2F${ repo }`);
55
+ }
56
+ case 'commits': {
57
+ return await fetchGitLabAPI(`projects/${ username }%2F${ repo }/repository/commits?ref_name=${ branch }&order_by=updated_at&per_page=${ MAX_RESULTS }`);
58
+ }
59
+ case 'recentRepos': {
60
+ return await fetchUserOrOrganization(`${ username }/projects?order_by=name&sort=asc&per_page=${ MAX_RESULTS }`);
61
+ }
62
+ case 'avatar': {
63
+ return await fetchGitLabAPI(`avatar?email=${ email }`);
64
+ }
65
+ case 'search': {
66
+ // Fetch for a specific branches
67
+ if (username && repo && branch) {
68
+ const response = await fetchGitLabAPI(`projects/${ repo }/repository/branches/${ branch }`);
69
+
70
+ return [response];
71
+ }
72
+
73
+ // Fetch for repos
74
+ const response = await fetchGitLabAPI(`search/repositories?q=repo:${ username }/${ repo }`);
75
+
76
+ if (response) {
77
+ return response.items;
78
+ }
79
+ }
80
+ }
81
+ } catch (error) {
82
+ throw await error.json() ?? Error(`Error fetching ${ endpoint }`);
83
+ }
84
+ },
85
+
86
+ async fetchRecentRepos({ commit, dispatch }, { username } = {}) {
87
+ const res = await dispatch('apiList', { username, endpoint: 'recentRepos' });
88
+
89
+ return res;
90
+ },
91
+
92
+ async fetchRepoDetails({ commit, dispatch }, { username, repo } = {}) {
93
+ const res = await dispatch('apiList', {
94
+ username, endpoint: 'repo', repo: repo.name
95
+ });
96
+
97
+ return res;
98
+ },
99
+
100
+ async fetchBranches({ commit, dispatch }, { repo, username }) {
101
+ const res = await dispatch('apiList', {
102
+ username, endpoint: 'branches', repo: repo.name
103
+ });
104
+
105
+ return res;
106
+ },
107
+
108
+ async fetchCommits(ctx, { repo, username, branch }) {
109
+ const { dispatch } = ctx;
110
+
111
+ const res = await dispatch('apiList', {
112
+ username, endpoint: 'commits', repo: repo.name, branch: branch.name
113
+ });
114
+
115
+ let commits = [];
116
+
117
+ // Get and cache Avatar URLs
118
+ if (res) {
119
+ commits = isArray(res) ? res : [res];
120
+
121
+ const avatars = {};
122
+
123
+ for (const c of commits) {
124
+ const found = avatars[c.author_email];
125
+
126
+ if (found) {
127
+ c.avatar_url = found;
128
+ } else {
129
+ const newAvatar = await dispatch('apiList', {
130
+ username, endpoint: 'avatar', email: c.author_email
131
+ });
132
+
133
+ c.avatar_url = newAvatar?.avatar_url;
134
+ avatars[c.author_email] = c.avatar_url;
135
+ }
136
+ }
137
+ }
138
+
139
+ return commits;
140
+ },
141
+
142
+ async search({ dispatch }, { repo, username, branch }) {
143
+ try {
144
+ const res = await dispatch('apiList', {
145
+ username, endpoint: 'search', repo: repo?.id, branch: branch?.name
146
+ });
147
+
148
+ return {
149
+ ...res,
150
+ hasError: false,
151
+ };
152
+ } catch (error) {
153
+ return {
154
+ message: error.message,
155
+ hasError: true
156
+ };
157
+ }
158
+ }
159
+ };
package/store/growl.js CHANGED
@@ -11,7 +11,7 @@ export const state = function() {
11
11
  };
12
12
 
13
13
  export const getters = {
14
- find: state => ({ key, val }) => {
14
+ find: (state) => ({ key, val }) => {
15
15
  return findBy(state.stack, key, val);
16
16
  }
17
17
  };
package/store/i18n.js CHANGED
@@ -58,7 +58,7 @@ export const getters = {
58
58
  return out;
59
59
  },
60
60
 
61
- t: state => (key, args, language) => {
61
+ t: (state) => (key, args, language) => {
62
62
  if (state.selected === NONE && !language) {
63
63
  return `%${ key }%`;
64
64
  }
@@ -110,7 +110,7 @@ export const getters = {
110
110
  }
111
111
  },
112
112
 
113
- exists: state => (key, language) => {
113
+ exists: (state) => (key, language) => {
114
114
  const locale = language || state.selected;
115
115
  const cacheKey = `${ locale }/${ key }`;
116
116
 
@@ -131,11 +131,11 @@ export const getters = {
131
131
  return false;
132
132
  },
133
133
 
134
- current: state => () => {
134
+ current: (state) => () => {
135
135
  return state.selected;
136
136
  },
137
137
 
138
- default: state => () => {
138
+ default: (state) => () => {
139
139
  return state.default;
140
140
  },
141
141
 
@@ -191,7 +191,7 @@ export const mutations = {
191
191
 
192
192
  // Add a locale to the list of available locales
193
193
  addLocale(state, { locale, label }) {
194
- const hasLocale = state.available.find(l => l === locale);
194
+ const hasLocale = state.available.find((l) => l === locale);
195
195
 
196
196
  if (!hasLocale) {
197
197
  state.available.push(locale);
@@ -203,7 +203,7 @@ export const mutations = {
203
203
 
204
204
  // Remove locale
205
205
  removeLocale(state, locale) {
206
- const index = state.available.findIndex(l => l === locale);
206
+ const index = state.available.findIndex((l) => l === locale);
207
207
 
208
208
  if (index !== -1) {
209
209
  state.available.splice(index, 1);
@@ -222,7 +222,7 @@ export const actions = {
222
222
  let selected = rootGetters['prefs/get']('locale');
223
223
 
224
224
  // We might be using a locale that is loaded by a plugin that is no longer loaded
225
- const exists = !!state.available.find(loc => loc === selected);
225
+ const exists = !!state.available.find((loc) => loc === selected);
226
226
 
227
227
  if ( !selected || !exists) {
228
228
  selected = state.default;