@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.
- package/assets/images/providers/nutanix.svg +1 -0
- package/assets/translations/en-us.yaml +89 -2
- package/chart/gatekeeper.vue +2 -2
- package/chart/monitoring/alerting/index.vue +3 -3
- package/chart/monitoring/index.vue +2 -2
- package/chart/monitoring/prometheus/index.vue +1 -1
- package/chart/rancher-backup/index.vue +2 -2
- package/cloud-credential/harvester.vue +2 -2
- package/components/AssignTo.vue +1 -1
- package/components/AwsComplianceBanner.vue +1 -1
- package/components/BackLink.vue +7 -0
- package/components/BrandImage.vue +3 -3
- package/components/ClusterProviderIcon.vue +1 -1
- package/components/CommunityLinks.vue +2 -2
- package/components/ConsumptionGauge.vue +17 -2
- package/components/CruResource.vue +2 -1
- package/components/DashboardMetrics.vue +8 -0
- package/components/DetailTop.vue +1 -1
- package/components/ExplorerMembers.vue +8 -8
- package/components/ExplorerProjectsNamespaces.vue +9 -9
- package/components/FixedBanner.vue +1 -1
- package/components/GlobalRoleBindings.vue +11 -11
- package/components/GrafanaDashboard.vue +7 -1
- package/components/GrowlManager.vue +1 -1
- package/components/HarvesterServiceAddOnConfig.vue +117 -2
- package/components/IconOrSvg.vue +10 -3
- package/components/LandingPagePreference.vue +2 -2
- package/components/MoveModal.vue +1 -1
- package/components/PodSecurityAdmission.vue +3 -3
- package/components/ProgressBarMulti.vue +2 -2
- package/components/PromptRemove.vue +52 -28
- package/components/PromptRestore.vue +3 -3
- package/components/Questions/index.vue +5 -5
- package/components/RelatedWorkloadsTable.vue +1 -1
- package/components/ResourceList/Masthead.vue +1 -1
- package/components/ResourceTable.vue +3 -3
- package/components/ResourceYaml.vue +1 -1
- package/components/RoleBindings.vue +2 -2
- package/components/SingleClusterInfo.vue +1 -1
- package/components/SortableTable/actions.js +3 -3
- package/components/SortableTable/advanced-filtering.js +7 -7
- package/components/SortableTable/filtering.js +1 -1
- package/components/SortableTable/index.vue +9 -9
- package/components/SortableTable/selection.js +5 -5
- package/components/SortableTable/sorting.js +5 -5
- package/components/Tabbed/index.vue +7 -7
- package/components/TableSparkLine.vue +1 -1
- package/components/Wizard.vue +11 -23
- package/components/__tests__/Collapse.spec.ts +1 -1
- package/components/__tests__/CruResource.test.ts +74 -0
- package/components/__tests__/SimpleBox.spec.ts +1 -1
- package/components/auth/RoleDetailEdit.vue +7 -3
- package/components/auth/SelectPrincipal.vue +3 -3
- package/components/fleet/FleetResources.vue +1 -1
- package/components/fleet/FleetStatus.vue +4 -4
- package/components/fleet/FleetSummary.vue +1 -1
- package/components/fleet/ForceDirectedTreeChart/chartIcons.js +1 -1
- package/components/fleet/ForceDirectedTreeChart/index.vue +1 -1
- package/components/form/ArrayList.vue +11 -3
- package/components/form/ArrayListSelect.vue +2 -2
- package/components/form/FileSelector.vue +6 -0
- package/components/form/GitPicker.vue +528 -0
- package/components/form/KeyValue.vue +82 -41
- package/components/form/LabeledSelect.vue +2 -2
- package/components/form/MatchExpressions.vue +2 -2
- package/components/form/Members/ClusterMembershipEditor.vue +1 -2
- package/components/form/Members/ClusterPermissionsEditor.vue +6 -5
- package/components/form/Members/MembershipEditor.vue +4 -4
- package/components/form/Members/ProjectMembershipEditor.vue +1 -2
- package/components/form/NameNsDescription.vue +13 -6
- package/components/form/Networking.vue +2 -2
- package/components/form/NodeScheduling.vue +1 -1
- package/components/form/PodAffinity.vue +1 -1
- package/components/form/ProjectMemberEditor.vue +4 -4
- package/components/form/ResourceQuota/Namespace.vue +2 -2
- package/components/form/ResourceQuota/NamespaceRow.vue +2 -2
- package/components/form/ResourceQuota/Project.vue +1 -1
- package/components/form/ResourceQuota/shared.js +2 -2
- package/components/form/ResourceSelector.vue +1 -1
- package/components/form/ResourceTabs/index.vue +1 -1
- package/components/form/RuleSelector.vue +1 -1
- package/components/form/SecretSelector.vue +4 -4
- package/components/form/Select.vue +2 -2
- package/components/form/SelectOrCreateAuthSecret.vue +3 -3
- package/components/form/ServiceNameSelect.vue +1 -1
- package/components/form/ServicePorts.vue +1 -1
- package/components/form/ShellInput.vue +1 -1
- package/components/form/SimpleSecretSelector.vue +4 -4
- package/components/form/Taints.vue +1 -1
- package/components/form/ValueFromResource.vue +3 -3
- package/components/form/WorkloadPorts.vue +8 -7
- package/components/form/__tests__/Error.test.ts +1 -1
- package/components/form/__tests__/KeyValue.test.ts +21 -0
- package/components/formatter/ClusterLink.vue +1 -1
- package/components/formatter/ClusterProvider.vue +13 -2
- package/components/formatter/Endpoints.vue +1 -1
- package/components/formatter/FleetSummaryGraph.vue +2 -2
- package/components/formatter/IngressTarget.vue +2 -2
- package/components/formatter/PodImages.vue +1 -1
- package/components/formatter/PrincipalGroupBindings.vue +1 -1
- package/components/formatter/ReceiverIcons.vue +3 -3
- package/components/formatter/ServiceType.vue +1 -1
- package/components/formatter/WorkloadDetailEndpoints.vue +1 -1
- package/components/formatter/WorkloadHealthScale.vue +1 -1
- package/components/formatter/__tests__/LiveDate.test.ts +1 -1
- package/components/graph/Bar.vue +1 -1
- package/components/graph/LinePlot.vue +3 -3
- package/components/nav/Group.vue +2 -2
- package/components/nav/Header.vue +5 -5
- package/components/nav/NamespaceFilter.vue +14 -14
- package/components/nav/TopLevelMenu.vue +76 -11
- package/components/nav/WindowManager/ContainerLogs.vue +2 -2
- package/components/nav/WindowManager/ContainerShell.vue +1 -1
- package/components/nav/WorkspaceSwitcher.vue +1 -1
- package/config/home-links.js +4 -4
- package/config/labels-annotations.js +8 -8
- package/config/pod-security-admission.ts +1 -1
- package/config/product/auth.js +4 -4
- package/config/product/explorer.js +14 -0
- package/config/router.js +5 -0
- package/config/store.js +2 -0
- package/config/table-headers.js +13 -13
- package/config/uiplugins.js +8 -1
- package/core/plugin-routes.ts +3 -2
- package/core/plugin.ts +3 -3
- package/core/plugins.js +7 -7
- package/creators/app/files/.gitignore +0 -3
- package/creators/pkg/files/index.ts +1 -1
- package/detail/cis.cattle.io.clusterscan.vue +3 -3
- package/detail/fleet.cattle.io.bundle.vue +1 -1
- package/detail/helm.cattle.io.projecthelmchart.vue +16 -29
- package/detail/management.cattle.io.user.vue +12 -12
- package/detail/namespace.vue +4 -4
- package/detail/networking.k8s.io.ingress.vue +3 -3
- package/detail/node.vue +2 -2
- package/detail/provisioning.cattle.io.cluster.vue +9 -10
- package/detail/service.vue +1 -1
- package/detail/workload/index.vue +3 -3
- package/dialog/AddProjectMemberDialog.vue +2 -2
- package/dialog/DrainNode.vue +1 -1
- package/dialog/GenericPrompt.vue +9 -5
- package/dialog/RotateEncryptionKeyDialog.vue +2 -2
- package/dialog/ScaleMachineDownDialog.vue +2 -2
- package/edit/auth/azuread.vue +3 -3
- package/edit/autoscaling.horizontalpodautoscaler/index.vue +5 -5
- package/edit/cis.cattle.io.clusterscan.vue +5 -5
- package/edit/cloudcredential.vue +4 -4
- package/edit/constraints.gatekeeper.sh.constraint/NamespaceList.vue +1 -1
- package/edit/constraints.gatekeeper.sh.constraint/index.vue +4 -4
- package/edit/fleet.cattle.io.gitrepo.vue +6 -6
- package/edit/helm.cattle.io.projecthelmchart.vue +3 -3
- package/edit/logging-flow/index.vue +4 -4
- package/edit/logging.banzaicloud.io.output/index.vue +3 -3
- package/edit/logging.banzaicloud.io.output/providers/elasticsearch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/forward.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/logz.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/opensearch.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/redis.vue +1 -1
- package/edit/logging.banzaicloud.io.output/providers/splunkHec.vue +1 -1
- package/edit/management.cattle.io.clusterroletemplatebinding.vue +1 -1
- package/edit/management.cattle.io.podsecurityadmissionconfigurationtemplate.vue +1 -1
- package/edit/management.cattle.io.project.vue +3 -3
- package/edit/management.cattle.io.projectroletemplatebinding.vue +2 -2
- package/edit/management.cattle.io.setting.vue +1 -1
- package/edit/management.cattle.io.user.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/auth.vue +2 -2
- package/edit/monitoring.coreos.com.alertmanagerconfig/index.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/receiverConfig.vue +1 -1
- package/edit/monitoring.coreos.com.alertmanagerconfig/types/opsgenie.vue +3 -3
- package/edit/monitoring.coreos.com.prometheusrule/GroupRules.vue +5 -5
- package/edit/monitoring.coreos.com.prometheusrule/duration.js +1 -1
- package/edit/monitoring.coreos.com.receiver/auth.vue +2 -2
- package/edit/monitoring.coreos.com.receiver/tls.vue +3 -4
- package/edit/monitoring.coreos.com.receiver/types/__tests__/email.test.ts +53 -0
- package/edit/monitoring.coreos.com.receiver/types/email.vue +2 -0
- package/edit/monitoring.coreos.com.receiver/types/opsgenie.vue +3 -3
- package/edit/monitoring.coreos.com.receiver/types/webhook.add.vue +1 -1
- package/edit/monitoring.coreos.com.route.vue +2 -2
- package/edit/namespace.vue +21 -13
- package/edit/networking.k8s.io.ingress/Certificate.vue +2 -2
- package/edit/networking.k8s.io.ingress/DefaultBackend.vue +2 -2
- package/edit/networking.k8s.io.ingress/RulePath.vue +2 -2
- package/edit/networking.k8s.io.ingress/Rules.vue +2 -2
- package/edit/networking.k8s.io.ingress/index.vue +4 -4
- package/edit/networking.k8s.io.networkpolicy/PolicyRuleTarget.vue +3 -3
- package/edit/networking.k8s.io.networkpolicy/index.vue +1 -1
- package/edit/persistentvolume/index.vue +4 -4
- package/edit/persistentvolumeclaim.vue +3 -3
- package/edit/provisioning.cattle.io.cluster/RegistryMirrors.vue +1 -1
- package/edit/provisioning.cattle.io.cluster/SelectCredential.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/import.vue +2 -2
- package/edit/provisioning.cattle.io.cluster/index.vue +7 -7
- package/edit/provisioning.cattle.io.cluster/rke2.vue +28 -29
- package/edit/resources.cattle.io.backup.vue +2 -2
- package/edit/resources.cattle.io.restore.vue +3 -3
- package/edit/secret/generic.vue +1 -1
- package/edit/secret/index.vue +3 -3
- package/edit/service.vue +3 -21
- package/edit/serviceaccount.vue +2 -2
- package/edit/storage.k8s.io.storageclass/index.vue +4 -4
- package/edit/storage.k8s.io.storageclass/provisioners/driver.harvesterhci.io.vue +1 -1
- package/edit/token.vue +5 -5
- package/edit/workload/index.vue +1 -1
- package/edit/workload/mixins/workload.js +8 -8
- package/edit/workload/storage/ContainerMountPaths.vue +9 -9
- package/edit/workload/storage/Mount.vue +2 -2
- package/edit/workload/storage/csi/index.vue +1 -1
- package/edit/workload/storage/ephemeralVolume/index.vue +1 -1
- package/edit/workload/storage/index.vue +6 -6
- package/edit/workload/storage/persistentVolumeClaim/persistentvolumeclaim.vue +2 -2
- package/initialize/client.js +8 -8
- package/initialize/index.js +1 -4
- package/layouts/default.vue +38 -11
- package/list/catalog.cattle.io.clusterrepo.vue +9 -1
- package/list/cis.cattle.io.clusterscan.vue +1 -1
- package/list/fleet.cattle.io.cluster.vue +2 -2
- package/list/group.principal.vue +1 -1
- package/list/helm.cattle.io.projecthelmchart.vue +2 -2
- package/list/management.cattle.io.cluster.vue +1 -1
- package/list/management.cattle.io.feature.vue +1 -1
- package/list/management.cattle.io.user.vue +2 -2
- package/list/node.vue +5 -5
- package/list/provisioning.cattle.io.cluster.vue +4 -5
- package/machine-config/amazonec2.vue +2 -2
- package/machine-config/digitalocean.vue +4 -4
- package/machine-config/linode.vue +4 -4
- package/machine-config/vmwarevsphere.vue +12 -12
- package/middleware/authenticated.js +7 -6
- package/mixins/brand.js +1 -1
- package/mixins/chart.js +6 -6
- package/mixins/fetch.client.js +2 -2
- package/mixins/form-validation.js +7 -7
- package/mixins/resource-fetch-namespaced.js +1 -1
- package/mixins/resource-fetch.js +2 -2
- package/models/apps.statefulset.js +2 -2
- package/models/batch.cronjob.js +1 -1
- package/models/catalog.cattle.io.app.js +4 -4
- package/models/cis.cattle.io.clusterscan.js +1 -1
- package/models/cis.cattle.io.clusterscanbenchmark.js +1 -1
- package/models/cis.cattle.io.clusterscanreport.js +1 -1
- package/models/cloudcredential.js +1 -1
- package/models/cluster/node.js +5 -5
- package/models/cluster.x-k8s.io.machinedeployment.js +2 -2
- package/models/fleet.cattle.io.gitrepo.js +3 -3
- package/models/group.principal.js +4 -4
- package/models/helm.cattle.io.projecthelmchart.js +2 -2
- package/models/logging.banzaicloud.io.clusterflow.js +2 -2
- package/models/logging.banzaicloud.io.flow.js +5 -5
- package/models/logging.banzaicloud.io.output.js +2 -2
- package/models/management.cattle.io.cluster.js +10 -14
- package/models/management.cattle.io.globalrole.js +4 -4
- package/models/management.cattle.io.node.js +2 -2
- package/models/management.cattle.io.nodepool.js +3 -3
- package/models/management.cattle.io.nodetemplate.js +4 -4
- package/models/management.cattle.io.project.js +2 -2
- package/models/management.cattle.io.roletemplate.js +1 -1
- package/models/management.cattle.io.setting.js +1 -1
- package/models/management.cattle.io.user.js +5 -5
- package/models/monitoring.coreos.com.receiver.js +9 -9
- package/models/namespace.js +1 -1
- package/models/networking.k8s.io.ingress.js +5 -5
- package/models/persistentvolume.js +3 -3
- package/models/pod.js +3 -3
- package/models/provisioning.cattle.io.cluster.js +39 -27
- package/models/rbac.authorization.k8s.io.clusterrole.js +2 -2
- package/models/rbac.authorization.k8s.io.role.js +3 -3
- package/models/secret.js +1 -1
- package/models/service.js +2 -2
- package/models/storage.k8s.io.storageclass.js +2 -2
- package/models/token.js +1 -1
- package/models/workload.js +6 -6
- package/models/workload.service.js +5 -21
- package/package.json +2 -1
- package/pages/about.vue +9 -9
- package/pages/account/index.vue +2 -2
- package/pages/auth/login.vue +15 -12
- package/pages/auth/verify.vue +6 -0
- package/pages/c/_cluster/apps/charts/index.vue +4 -4
- package/pages/c/_cluster/apps/charts/install.vue +28 -20
- package/pages/c/_cluster/auth/roles/index.vue +9 -9
- package/pages/c/_cluster/explorer/index.vue +41 -16
- package/pages/c/_cluster/explorer/tools/index.vue +8 -8
- package/pages/c/_cluster/fleet/GitRepoGraphConfig.js +1 -1
- package/pages/c/_cluster/fleet/index.vue +11 -11
- package/pages/c/_cluster/monitoring/index.vue +1 -1
- package/pages/c/_cluster/settings/links.vue +3 -3
- package/pages/c/_cluster/settings/performance.vue +1 -1
- package/pages/c/_cluster/uiplugins/CatalogList/CatalogLoadDialog.vue +6 -6
- package/pages/c/_cluster/uiplugins/CatalogList/index.vue +3 -3
- package/pages/c/_cluster/uiplugins/InstallDialog.vue +3 -3
- package/pages/c/_cluster/uiplugins/PluginInfoPanel.vue +1 -1
- package/pages/c/_cluster/uiplugins/RemoveUIPlugins.vue +3 -3
- package/pages/c/_cluster/uiplugins/SetupUIPlugins.vue +6 -6
- package/pages/c/_cluster/uiplugins/UninstallDialog.vue +4 -4
- package/pages/c/_cluster/uiplugins/index.vue +22 -19
- package/pages/diagnostic.vue +6 -6
- package/pages/home.vue +3 -3
- package/pages/prefs.vue +2 -2
- package/pages/rio/mesh.vue +3 -3
- package/pages/support/index.vue +10 -1
- package/pkg/auto-import.js +1 -1
- package/pkg/tsconfig.json +1 -0
- package/pkg/vue.config.js +1 -1
- package/plugins/axios.js +1 -1
- package/plugins/clean-html-directive.js +1 -1
- package/plugins/dashboard-store/__tests__/mutations.spec.js +4 -4
- package/plugins/dashboard-store/actions.js +4 -4
- package/plugins/dashboard-store/getters.js +1 -1
- package/plugins/dashboard-store/index.js +1 -1
- package/plugins/dashboard-store/mutations.js +2 -2
- package/plugins/dashboard-store/resource-class.js +8 -8
- package/plugins/i18n.js +1 -1
- package/plugins/plugin.js +5 -1
- package/plugins/steve/actions.js +3 -3
- package/plugins/steve/getters.js +3 -3
- package/plugins/steve/hybrid-class.js +1 -1
- package/plugins/steve/mutations.js +1 -1
- package/plugins/steve/performanceTesting.js +1 -1
- package/plugins/steve/resourceWatcher.js +1 -1
- package/plugins/steve/subscribe.js +6 -6
- package/plugins/steve/worker/web-worker.basic.js +1 -1
- package/promptRemove/management.cattle.io.project.vue +3 -3
- package/promptRemove/mixin/roleDeletionCheck.js +4 -4
- package/promptRemove/pod.vue +1 -1
- package/rancher-components/StringList/StringList.test.ts +80 -0
- package/rancher-components/StringList/StringList.vue +577 -0
- package/rancher-components/StringList/index.ts +1 -0
- package/rancher-components/components/Form/Checkbox/Checkbox.test.ts +2 -2
- package/rancher-components/components/Form/Checkbox/Checkbox.vue +1 -1
- package/rancher-components/components/Form/Radio/RadioButton.test.ts +1 -1
- package/rancher-components/components/Form/Radio/RadioButton.vue +2 -2
- package/rancher-components/components/Form/Radio/RadioGroup.vue +2 -2
- package/rancher-components/components/Form/TextArea/TextAreaAutoGrow.vue +1 -0
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.test.ts +1 -1
- package/rancher-components/components/Form/ToggleSwitch/ToggleSwitch.vue +7 -7
- package/rancher-components/components/StringList/StringList.test.ts +10 -9
- package/rancher-components/components/StringList/StringList.vue +5 -5
- package/scripts/extension/helm/charts/ui-plugin-server/Chart.yaml +1 -1
- package/store/action-menu.js +4 -4
- package/store/auth.js +40 -7
- package/store/aws.js +1 -1
- package/store/catalog.js +12 -11
- package/store/digitalocean.js +4 -4
- package/store/features.js +1 -0
- package/store/github.js +70 -213
- package/store/gitlab.js +159 -0
- package/store/growl.js +1 -1
- package/store/i18n.js +7 -7
- package/store/index.js +63 -22
- package/store/linode.js +1 -1
- package/store/plugins.js +5 -5
- package/store/pnap.js +1 -1
- package/store/prefs.js +6 -6
- package/store/resource-fetch.js +3 -3
- package/store/type-map.js +61 -42
- package/store/uiplugins.ts +2 -1
- package/store/wm.js +5 -4
- package/tsconfig.default.json +10 -0
- package/tsconfig.json +2 -9
- package/types/shell/index.d.ts +12 -4
- package/utils/__tests__/version.test.ts +28 -0
- package/utils/alertmanagerconfig.js +4 -4
- package/utils/array.ts +4 -4
- package/utils/async.ts +1 -1
- package/utils/auth.js +3 -3
- package/utils/axios.js +5 -5
- package/utils/cluster.js +4 -3
- package/utils/color.js +10 -0
- package/utils/create-yaml.js +4 -4
- package/utils/crypto/browserHashUtils.js +1 -1
- package/utils/crypto/browserMd5.js +1 -1
- package/utils/crypto/browserSha1.js +1 -1
- package/utils/crypto/browserSha256.js +1 -1
- package/utils/crypto/index.js +3 -3
- package/utils/favicon.js +2 -3
- package/utils/gatekeeper/util.js +3 -3
- package/utils/gc/gc.ts +2 -2
- package/utils/git.ts +92 -0
- package/utils/grafana.js +4 -4
- package/utils/monitoring.js +2 -2
- package/utils/nuxt.js +2 -2
- package/utils/object.js +5 -5
- package/utils/pod-security-admission.ts +1 -1
- package/utils/projectAndNamespaceFiltering.utils.ts +1 -1
- package/utils/select.js +2 -2
- package/utils/selector.js +2 -2
- package/utils/settings.ts +17 -2
- package/utils/socket.js +30 -6
- package/utils/sort.js +1 -1
- package/utils/string.js +1 -1
- package/utils/url.ts +1 -1
- package/utils/validators/formRules/index.ts +3 -3
- package/utils/validators/role-template.js +4 -4
- package/utils/version.js +14 -1
- package/vue.config.js +19 -13
- package/components/form/GithubPicker.vue +0 -390
package/store/github.js
CHANGED
|
@@ -1,252 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
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
|
|
4
|
+
const fetchGithubAPI = async(endpoint) => {
|
|
5
|
+
const response = await fetch(`${ GITHUB_BASE_API }/${ endpoint }`);
|
|
7
6
|
|
|
8
|
-
|
|
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
|
-
|
|
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
|
-
|
|
42
|
-
|
|
43
|
-
return false;
|
|
14
|
+
if (!response.ok) {
|
|
15
|
+
throw response;
|
|
44
16
|
}
|
|
45
17
|
|
|
46
|
-
|
|
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(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
-
|
|
128
|
-
return res;
|
|
32
|
+
case 'repo': {
|
|
33
|
+
return await fetchGithubAPI(`repos/${ username }/${ repo }`);
|
|
129
34
|
}
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
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
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
forgetCache() {
|
|
148
|
-
forgetCache();
|
|
149
|
-
},
|
|
46
|
+
return [response];
|
|
47
|
+
}
|
|
150
48
|
|
|
151
|
-
|
|
152
|
-
|
|
49
|
+
// Fetch for repos
|
|
50
|
+
const response = await fetchGithubAPI(`search/repositories?q=repo:${ username }/${ repo }`);
|
|
153
51
|
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
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
|
|
178
|
-
|
|
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
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
|
201
|
-
|
|
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
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
};
|
package/store/gitlab.js
ADDED
|
@@ -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
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;
|