Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2024-01-09 00:10:18 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2024-01-09 00:10:18 +0300
commit5b5ff31460fc5572abbd8b7ee35f303a6f1df196 (patch)
tree87ca6063a62677ae52d85641d15e9a63c98a15b7
parentfdeb53bebfb91f7cc7182c783310ee7d7bac8550 (diff)
Add latest changes from gitlab-org/gitlab@master
-rw-r--r--.gitlab/ci/qa-common/main.gitlab-ci.yml2
-rw-r--r--Gemfile.checksum4
-rw-r--r--Gemfile.lock2
-rw-r--r--app/assets/javascripts/ci/catalog/components/list/catalog_tabs.vue67
-rw-r--r--app/assets/javascripts/ci/catalog/components/pages/ci_resources_page.vue75
-rw-r--r--app/assets/javascripts/ci/catalog/constants.js6
-rw-r--r--app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources.query.graphql3
-rw-r--r--app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources_count.query.graphql8
-rw-r--r--app/assets/javascripts/ci/catalog/graphql/settings.js2
-rw-r--r--app/assets/javascripts/projects/commit/components/commit_comments_button.vue42
-rw-r--r--app/assets/javascripts/projects/commit/index.js2
-rw-r--r--app/assets/javascripts/projects/commit/init_commit_comments_button.js18
-rw-r--r--app/controllers/projects/commit_controller.rb1
-rw-r--r--app/views/projects/commit/_commit_box.html.haml1
-rw-r--r--config/dependency_decisions.yml11
-rw-r--r--doc/user/project/releases/release_fields.md3
-rw-r--r--doc/user/project/repository/index.md5
-rw-r--r--doc/user/project/repository/mirror/troubleshooting.md10
-rw-r--r--lib/sidebars/projects/menus/packages_registries_menu.rb9
-rw-r--r--locale/gitlab.pot17
-rw-r--r--package.json70
-rw-r--r--spec/frontend/ci/catalog/components/list/catalog_tabs_spec.js71
-rw-r--r--spec/frontend/ci/catalog/components/list/ci_resources_list_spec.js97
-rw-r--r--spec/frontend/ci/catalog/components/pages/ci_resources_page_spec.js68
-rw-r--r--spec/frontend/ci/catalog/mock.js18
-rw-r--r--spec/frontend/projects/commit/components/commit_comments_button_spec.js42
-rw-r--r--spec/support/helpers/dns_helpers.rb11
-rw-r--r--spec/support/helpers/navbar_structure_helper.rb8
-rw-r--r--yarn.lock352
29 files changed, 608 insertions, 417 deletions
diff --git a/.gitlab/ci/qa-common/main.gitlab-ci.yml b/.gitlab/ci/qa-common/main.gitlab-ci.yml
index 98bfa38d1fc..6ce47a62b00 100644
--- a/.gitlab/ci/qa-common/main.gitlab-ci.yml
+++ b/.gitlab/ci/qa-common/main.gitlab-ci.yml
@@ -15,7 +15,7 @@ include:
gitlab_auth_token_variable_name: "PROJECT_TOKEN_FOR_CI_SCRIPTS_API_USAGE"
allure_job_name: "${QA_RUN_TYPE}"
- project: gitlab-org/quality/pipeline-common
- ref: 8.3.2
+ ref: 8.4.0
file:
- /ci/base.gitlab-ci.yml
- /ci/knapsack-report.yml
diff --git a/Gemfile.checksum b/Gemfile.checksum
index b6ba3e816c4..2fcb5cbde20 100644
--- a/Gemfile.checksum
+++ b/Gemfile.checksum
@@ -393,8 +393,8 @@
{"name":"net-smtp","version":"0.3.3","platform":"ruby","checksum":"3d51dcaa981b74aff2d89cbe89de4503bc2d682365ea5176366e950a0d68d5b0"},
{"name":"net-ssh","version":"7.2.0","platform":"ruby","checksum":"2a28f177173d1f6bef77471fa927c73959cda36cd03772e117f2fec48f34d2cb"},
{"name":"netrc","version":"0.11.0","platform":"ruby","checksum":"de1ce33da8c99ab1d97871726cba75151113f117146becbe45aa85cb3dabee3f"},
-{"name":"nio4r","version":"2.5.8","platform":"java","checksum":"b2b1800f6bf7ce4b797ca8b639ad278a99c9c904fb087a91d944f38e4bd71401"},
-{"name":"nio4r","version":"2.5.8","platform":"ruby","checksum":"3becb4ad95ab8ac0a9bd2e1b16466869402be62848082bf6329ae9091f276676"},
+{"name":"nio4r","version":"2.7.0","platform":"java","checksum":"3f2e515e928ceeef7668e1f64fc3bfef1417a5ec0908d8e69f2c6d486284e04d"},
+{"name":"nio4r","version":"2.7.0","platform":"ruby","checksum":"9586a685eca8246d6406e712a525e705d15bb88f709d78fc3f141e864df97276"},
{"name":"no_proxy_fix","version":"0.1.2","platform":"ruby","checksum":"4e9b4c31bb146de7fcf347dc1087bb13ac2039b56d50aa019e61036256abcd00"},
{"name":"nokogiri","version":"1.16.0","platform":"aarch64-linux","checksum":"8cd981dfd4bea4f519ceebb885cf3b422b71c059d841c039d327e73b19247f53"},
{"name":"nokogiri","version":"1.16.0","platform":"arm-linux","checksum":"c68d861155c40777eee3eb4efbb375d665c8c889cebd5cd1ba32f30a8aac6c21"},
diff --git a/Gemfile.lock b/Gemfile.lock
index 3e4455ee08f..3adb90d0616 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1106,7 +1106,7 @@ GEM
net-protocol
net-ssh (7.2.0)
netrc (0.11.0)
- nio4r (2.5.8)
+ nio4r (2.7.0)
no_proxy_fix (0.1.2)
nokogiri (1.16.0)
mini_portile2 (~> 2.8.2)
diff --git a/app/assets/javascripts/ci/catalog/components/list/catalog_tabs.vue b/app/assets/javascripts/ci/catalog/components/list/catalog_tabs.vue
new file mode 100644
index 00000000000..f43255ab76b
--- /dev/null
+++ b/app/assets/javascripts/ci/catalog/components/list/catalog_tabs.vue
@@ -0,0 +1,67 @@
+<script>
+import { GlBadge, GlTab, GlTabs, GlLoadingIcon } from '@gitlab/ui';
+import { s__ } from '~/locale';
+import { SCOPE } from '../../constants';
+
+export default {
+ components: {
+ GlBadge,
+ GlTab,
+ GlTabs,
+ GlLoadingIcon,
+ },
+ props: {
+ isLoading: {
+ type: Boolean,
+ required: true,
+ },
+ resourceCounts: {
+ type: Object,
+ required: true,
+ },
+ },
+ computed: {
+ tabs() {
+ return [
+ {
+ text: s__('CiCatalog|All'),
+ scope: SCOPE.all,
+ testId: 'resources-all-tab',
+ count: this.resourceCounts.all,
+ },
+ {
+ text: s__('CiCatalog|Your resources'),
+ scope: SCOPE.namespaces,
+ testId: 'resources-your-tab',
+ count: this.resourceCounts.namespaces,
+ },
+ ];
+ },
+ showLoadingIcon() {
+ return this.isLoading;
+ },
+ },
+};
+</script>
+
+<template>
+ <div class="gl-display-flex align-items-lg-center">
+ <gl-tabs content-class="gl-py-0" class="gl-w-full">
+ <gl-tab
+ v-for="tab in tabs"
+ :key="tab.text"
+ :data-testid="tab.testId"
+ @click="$emit('setScope', tab.scope)"
+ >
+ <template #title>
+ <span>{{ tab.text }}</span>
+ <gl-loading-icon v-if="showLoadingIcon" class="gl-ml-3" />
+
+ <gl-badge v-else size="sm" class="gl-tab-counter-badge">
+ {{ tab.count }}
+ </gl-badge>
+ </template>
+ </gl-tab>
+ </gl-tabs>
+ </div>
+</template>
diff --git a/app/assets/javascripts/ci/catalog/components/pages/ci_resources_page.vue b/app/assets/javascripts/ci/catalog/components/pages/ci_resources_page.vue
index e1c86f38d7e..08500d3093c 100644
--- a/app/assets/javascripts/ci/catalog/components/pages/ci_resources_page.vue
+++ b/app/assets/javascripts/ci/catalog/components/pages/ci_resources_page.vue
@@ -3,6 +3,7 @@ import { createAlert } from '~/alert';
import { s__ } from '~/locale';
import { ciCatalogResourcesItemsCount } from '~/ci/catalog/graphql/settings';
import CatalogSearch from '../list/catalog_search.vue';
+import CatalogTabs from '../list/catalog_tabs.vue';
import CiResourcesList from '../list/ci_resources_list.vue';
import CatalogListSkeletonLoader from '../list/catalog_list_skeleton_loader.vue';
import CatalogHeader from '../list/catalog_header.vue';
@@ -10,29 +11,60 @@ import EmptyState from '../list/empty_state.vue';
import getCatalogResources from '../../graphql/queries/get_ci_catalog_resources.query.graphql';
import getCurrentPage from '../../graphql/queries/client/get_current_page.query.graphql';
import updateCurrentPageMutation from '../../graphql/mutations/client/update_current_page.mutation.graphql';
+import getCatalogResourcesCount from '../../graphql/queries/get_ci_catalog_resources_count.query.graphql';
+import { DEFAULT_SORT_VALUE, SCOPE } from '../../constants';
export default {
+ i18n: {
+ fetchError: s__('CiCatalog|There was an error fetching CI/CD Catalog resources.'),
+ countFetchError: s__('CiCatalog|There was an error fetching the CI/CD Catalog resource count.'),
+ },
components: {
CatalogHeader,
CatalogListSkeletonLoader,
CatalogSearch,
+ CatalogTabs,
CiResourcesList,
EmptyState,
},
data() {
return {
catalogResources: [],
+ catalogResourcesCount: { all: 0, namespaces: 0 },
currentPage: 1,
pageInfo: {},
- searchTerm: '',
- totalCount: 0,
+ scope: SCOPE.all,
+ searchTerm: null,
+ sortValue: DEFAULT_SORT_VALUE,
};
},
apollo: {
+ catalogResourcesCount: {
+ query: getCatalogResourcesCount,
+ variables() {
+ return {
+ searchTerm: this.searchTerm,
+ };
+ },
+ update({ namespaces, all }) {
+ return {
+ namespaces: namespaces.count,
+ all: all.count,
+ };
+ },
+ error(e) {
+ createAlert({
+ message: e.message || this.$options.i18n.countFetchError,
+ });
+ },
+ },
catalogResources: {
query: getCatalogResources,
variables() {
return {
+ scope: this.scope,
+ searchTerm: this.searchTerm,
+ sortValue: this.sortValue,
first: ciCatalogResourcesItemsCount,
};
},
@@ -42,10 +74,9 @@ export default {
result({ data }) {
const { pageInfo } = data?.ciCatalogResources || {};
this.pageInfo = pageInfo;
- this.totalCount = data?.ciCatalogResources?.count || 0;
},
error(e) {
- createAlert({ message: e.message || this.$options.i18n.fetchError, variant: 'danger' });
+ createAlert({ message: e.message || this.$options.i18n.fetchError });
},
},
currentPage: {
@@ -62,11 +93,14 @@ export default {
isLoading() {
return this.$apollo.queries.catalogResources.loading;
},
- isSearching() {
- return this.searchTerm?.length > 0;
+ isLoadingCounts() {
+ return this.$apollo.queries.catalogResourcesCount.loading;
+ },
+ namespacesCount() {
+ return this.catalogResourcesCount.namespaces;
},
- showEmptyState() {
- return !this.hasResources && !this.isSearching;
+ currentTabTotalCount() {
+ return this.catalogResourcesCount[this.scope.toLowerCase()];
},
},
methods: {
@@ -103,6 +137,11 @@ export default {
createAlert({ message: e?.message || this.$options.i18n.fetchError, variant: 'danger' });
}
},
+ handleSetScope(scope) {
+ if (this.scope === scope) return;
+
+ this.scope = scope;
+ },
updatePageCount(pageNumber) {
this.$apollo.mutate({
mutation: updateCurrentPageMutation,
@@ -120,30 +159,28 @@ export default {
onUpdateSearchTerm(searchTerm) {
this.searchTerm = !searchTerm.length ? null : searchTerm;
this.resetPageCount();
- this.$apollo.queries.catalogResources.refetch({
- searchTerm: this.searchTerm,
- });
},
onUpdateSorting(sortValue) {
+ this.sortValue = sortValue;
this.resetPageCount();
- this.$apollo.queries.catalogResources.refetch({
- sortValue,
- });
},
resetPageCount() {
this.updatePageCount(1);
},
},
- i18n: {
- fetchError: s__('CiCatalog|There was an error fetching CI/CD Catalog resources.'),
- },
};
</script>
<template>
<div>
<catalog-header />
+ <catalog-tabs
+ :is-loading="isLoadingCounts"
+ :resource-counts="catalogResourcesCount"
+ class="gl-mb-3"
+ @setScope="handleSetScope"
+ />
<catalog-search
- class="gl-py-4 gl-border-b-1 gl-border-gray-100 gl-border-b-solid gl-border-t-1 gl-border-t-solid"
+ class="gl-py-2"
@update-search-term="onUpdateSearchTerm"
@update-sorting="onUpdateSorting"
/>
@@ -156,7 +193,7 @@ export default {
:prev-text="__('Prev')"
:next-text="__('Next')"
:resources="catalogResources"
- :total-count="totalCount"
+ :total-count="currentTabTotalCount"
@onPrevPage="handlePrevPage"
@onNextPage="handleNextPage"
/>
diff --git a/app/assets/javascripts/ci/catalog/constants.js b/app/assets/javascripts/ci/catalog/constants.js
index 34c0ac797c1..a180aa84344 100644
--- a/app/assets/javascripts/ci/catalog/constants.js
+++ b/app/assets/javascripts/ci/catalog/constants.js
@@ -2,8 +2,14 @@ import { helpPagePath } from '~/helpers/help_page_helper';
export const CATALOG_FEEDBACK_DISMISSED_KEY = 'catalog_feedback_dismissed';
+export const SCOPE = {
+ all: 'ALL',
+ namespaces: 'NAMESPACES',
+};
+
export const SORT_OPTION_CREATED = 'CREATED';
export const SORT_ASC = 'ASC';
export const SORT_DESC = 'DESC';
+export const DEFAULT_SORT_VALUE = `${SORT_OPTION_CREATED}_${SORT_DESC}`;
export const COMPONENTS_DOCS_URL = helpPagePath('ci/components/index');
diff --git a/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources.query.graphql b/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources.query.graphql
index 1cf213dec63..24789e9c4ed 100644
--- a/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources.query.graphql
+++ b/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources.query.graphql
@@ -1,6 +1,7 @@
#import "~/ci/catalog/graphql/fragments/catalog_resource.fragment.graphql"
query getCatalogResources(
+ $scope: CiCatalogResourceScope
$searchTerm: String
$sortValue: CiCatalogResourceSort
$after: String
@@ -9,6 +10,7 @@ query getCatalogResources(
$last: Int
) {
ciCatalogResources(
+ scope: $scope
search: $searchTerm
sort: $sortValue
after: $after
@@ -22,7 +24,6 @@ query getCatalogResources(
hasNextPage
hasPreviousPage
}
- count
nodes {
...CatalogResourceFields
}
diff --git a/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources_count.query.graphql b/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources_count.query.graphql
new file mode 100644
index 00000000000..d4a298e7e09
--- /dev/null
+++ b/app/assets/javascripts/ci/catalog/graphql/queries/get_ci_catalog_resources_count.query.graphql
@@ -0,0 +1,8 @@
+query getCatalogResourcesCount($searchTerm: String) {
+ all: ciCatalogResources(scope: ALL, search: $searchTerm) {
+ count
+ }
+ namespaces: ciCatalogResources(scope: NAMESPACES, search: $searchTerm) {
+ count
+ }
+}
diff --git a/app/assets/javascripts/ci/catalog/graphql/settings.js b/app/assets/javascripts/ci/catalog/graphql/settings.js
index 4038188a7ce..abc95592b14 100644
--- a/app/assets/javascripts/ci/catalog/graphql/settings.js
+++ b/app/assets/javascripts/ci/catalog/graphql/settings.js
@@ -15,7 +15,7 @@ export const cacheConfig = {
});
},
ciCatalogResources: {
- keyArgs: false,
+ keyArgs: ['scope', 'search', 'sort'],
},
},
},
diff --git a/app/assets/javascripts/projects/commit/components/commit_comments_button.vue b/app/assets/javascripts/projects/commit/components/commit_comments_button.vue
deleted file mode 100644
index 67b5e1e512c..00000000000
--- a/app/assets/javascripts/projects/commit/components/commit_comments_button.vue
+++ /dev/null
@@ -1,42 +0,0 @@
-<script>
-import { GlButton, GlTooltipDirective } from '@gitlab/ui';
-import { n__ } from '~/locale';
-
-export default {
- directives: {
- GlTooltip: GlTooltipDirective,
- },
- components: {
- GlButton,
- },
- props: {
- commentsCount: {
- type: Number,
- required: true,
- },
- },
- computed: {
- tooltipText() {
- return n__('%d comment on this commit', '%d comments on this commit', this.commentsCount);
- },
- showCommentButton() {
- return this.commentsCount > 0;
- },
- },
-};
-</script>
-
-<template>
- <span
- v-if="showCommentButton"
- v-gl-tooltip
- class="gl-display-none gl-sm-display-inline-block"
- tabindex="0"
- :title="tooltipText"
- data-testid="comment-button-wrapper"
- >
- <gl-button icon="comment" class="gl-mr-3" disabled>
- {{ commentsCount }}
- </gl-button>
- </span>
-</template>
diff --git a/app/assets/javascripts/projects/commit/index.js b/app/assets/javascripts/projects/commit/index.js
index d8d30c4332c..4eb51d566c5 100644
--- a/app/assets/javascripts/projects/commit/index.js
+++ b/app/assets/javascripts/projects/commit/index.js
@@ -1,11 +1,9 @@
import initCherryPickCommitModal from './init_cherry_pick_commit_modal';
-import initCommitCommentsButton from './init_commit_comments_button';
import initCommitOptionsDropdown from './init_commit_options_dropdown';
import initRevertCommitModal from './init_revert_commit_modal';
export default () => {
initRevertCommitModal();
initCherryPickCommitModal();
- initCommitCommentsButton();
initCommitOptionsDropdown();
};
diff --git a/app/assets/javascripts/projects/commit/init_commit_comments_button.js b/app/assets/javascripts/projects/commit/init_commit_comments_button.js
deleted file mode 100644
index d70f7cb65f3..00000000000
--- a/app/assets/javascripts/projects/commit/init_commit_comments_button.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import Vue from 'vue';
-import CommitCommentsButton from './components/commit_comments_button.vue';
-
-export default function initCommitCommentsButton() {
- const el = document.querySelector('#js-commit-comments-button');
-
- if (!el) {
- return false;
- }
-
- const { commentsCount } = el.dataset;
-
- return new Vue({
- el,
- render: (createElement) =>
- createElement(CommitCommentsButton, { props: { commentsCount: Number(commentsCount) } }),
- });
-}
diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb
index 88e9113188a..c36742e8bb9 100644
--- a/app/controllers/projects/commit_controller.rb
+++ b/app/controllers/projects/commit_controller.rb
@@ -186,7 +186,6 @@ class Projects::CommitController < Projects::ApplicationController
opts[:use_extra_viewer_as_main] = false
@diffs = commit.diffs(opts)
- @notes_count = commit.notes.count
@environment = ::Environments::EnvironmentsByDeploymentsFinder.new(@project, current_user, commit: @commit, find_latest: true).execute.last
end
diff --git a/app/views/projects/commit/_commit_box.html.haml b/app/views/projects/commit/_commit_box.html.haml
index adaebf90b4b..fc9104f9f27 100644
--- a/app/views/projects/commit/_commit_box.html.haml
+++ b/app/views/projects/commit/_commit_box.html.haml
@@ -18,7 +18,6 @@
= commit_committer_link(@commit, avatar: true, size: 24)
#{time_ago_with_tooltip(@commit.committed_date)}
- #js-commit-comments-button{ data: { comments_count: @notes_count.to_i } }
= link_button_to _('Browse files'), project_tree_path(@project, @commit), class: 'gl-mr-3 gl-w-full gl-sm-w-auto gl-mb-3 gl-sm-mb-0'
#js-commit-options-dropdown{ data: commit_options_dropdown_data(@project, @commit) }
diff --git a/config/dependency_decisions.yml b/config/dependency_decisions.yml
index e74e9367304..a293ae97490 100644
--- a/config/dependency_decisions.yml
+++ b/config/dependency_decisions.yml
@@ -379,5 +379,12 @@
- elkjs
- :who: John T Skarbek
:why: https://gitlab.com/gitlab-com/legal-and-compliance/-/issues/1505
- :versions: ["0.8.2"]
- :when: 2023-04-07 09:15:33.00004000 Z
+ :versions:
+ - 0.8.2
+ :when: 2023-04-07 09:15:33.000040000 Z
+- - :permit
+ - MIT AND (BSD-2-Clause OR GPL-2.0-or-later)
+ - :who: Stan Hu
+ :why: Used by nio4r gem. MIT license.
+ :versions: []
+ :when: 2024-01-08 09:05:34.528980000 Z
diff --git a/doc/user/project/releases/release_fields.md b/doc/user/project/releases/release_fields.md
index c74ebaab89d..7c45a510877 100644
--- a/doc/user/project/releases/release_fields.md
+++ b/doc/user/project/releases/release_fields.md
@@ -50,7 +50,8 @@ A release contains the following types of assets:
### Source code
GitLab automatically generates `zip`, `tar.gz`, `tar.bz2`, and `tar`
-archived source code from the given Git tag. These are read-only assets.
+archived source code from the given Git tag. These assets are read-only,
+and [can be downloaded](../repository/index.md#download-the-code-in-a-repository).
### Links
diff --git a/doc/user/project/repository/index.md b/doc/user/project/repository/index.md
index 39c28ab95ca..550ff25e0b1 100644
--- a/doc/user/project/repository/index.md
+++ b/doc/user/project/repository/index.md
@@ -126,11 +126,10 @@ To do this:
## Download the code in a repository
-> Support for [including Git LFS blobs](../../../topics/git/lfs#lfs-objects-in-project-archives) was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/15079) in GitLab 13.5.
-
You can download the source code that's stored in a repository.
-1. Above the file list, select the download icon (**{download}**).
+1. On the left sidebar, select **Search or go to** and find your project.
+1. Above the file list, select **Code**.
1. From the options, select the files you want to download.
- **Source code:**
diff --git a/doc/user/project/repository/mirror/troubleshooting.md b/doc/user/project/repository/mirror/troubleshooting.md
index 57a9351e85d..f252c047072 100644
--- a/doc/user/project/repository/mirror/troubleshooting.md
+++ b/doc/user/project/repository/mirror/troubleshooting.md
@@ -215,3 +215,13 @@ Project.where(mirror: true).each do |project|
project.save
end
```
+
+## `The requested URL returned error: 301`
+
+When mirroring using the `http://` or `https://` protocols, be sure to specify the exact URL to the repository: `https://gitlab.example.com/group/project.git`
+
+HTTP redirects are not followed and omitting `.git` can result in a 301 error:
+
+```plaintext
+13:fetch remote: "fatal: unable to access 'https://gitlab.com/group/project': The requested URL returned error: 301\n": exit status 128.
+```
diff --git a/lib/sidebars/projects/menus/packages_registries_menu.rb b/lib/sidebars/projects/menus/packages_registries_menu.rb
index 2d12bfbd6bb..0826349f6d3 100644
--- a/lib/sidebars/projects/menus/packages_registries_menu.rb
+++ b/lib/sidebars/projects/menus/packages_registries_menu.rb
@@ -48,7 +48,7 @@ module Sidebars
end
def container_registry_menu_item
- if !::Gitlab.config.registry.enabled || !can?(context.current_user, :read_container_image, context.project)
+ if container_registry_unavailable?
return ::Sidebars::NilMenuItem.new(item_id: :container_registry)
end
@@ -122,7 +122,14 @@ module Sidebars
!::Gitlab.config.packages.enabled ||
!can?(context.current_user, :read_package, context.project&.packages_policy_subject)
end
+
+ def container_registry_unavailable?
+ !::Gitlab.config.registry.enabled ||
+ !can?(context.current_user, :read_container_image, context.project)
+ end
end
end
end
end
+
+Sidebars::Projects::Menus::PackagesRegistriesMenu.prepend_mod_with('Sidebars::Projects::Menus::PackagesRegistriesMenu')
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 5a6bcaa237a..0a499c9e9a8 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -197,11 +197,6 @@ msgid_plural "%d comments"
msgstr[0] ""
msgstr[1] ""
-msgid "%d comment on this commit"
-msgid_plural "%d comments on this commit"
-msgstr[0] ""
-msgstr[1] ""
-
msgid "%d commenter"
msgid_plural "%d commenters"
msgstr[0] ""
@@ -10449,6 +10444,9 @@ msgstr ""
msgid "CiCatalogComponent|This tab displays auto-collected information about the components in the repository, but no information was found."
msgstr ""
+msgid "CiCatalog|All"
+msgstr ""
+
msgid "CiCatalog|Back to the CI/CD Catalog"
msgstr ""
@@ -10530,6 +10528,9 @@ msgstr ""
msgid "CiCatalog|There was an error fetching CI/CD Catalog resources."
msgstr ""
+msgid "CiCatalog|There was an error fetching the CI/CD Catalog resource count."
+msgstr ""
+
msgid "CiCatalog|This project is no longer a CI/CD Catalog resource."
msgstr ""
@@ -10548,6 +10549,9 @@ msgstr ""
msgid "CiCatalog|We want to help you create and manage pipeline component repositories, while also making it easier to reuse pipeline configurations. Let us know how we're doing!"
msgstr ""
+msgid "CiCatalog|Your resources"
+msgstr ""
+
msgid "CiCdAnalytics|Date range: %{range}"
msgstr ""
@@ -22981,6 +22985,9 @@ msgstr ""
msgid "Go to your snippets"
msgstr ""
+msgid "Google Artifact Registry"
+msgstr ""
+
msgid "Google Cloud"
msgstr ""
diff --git a/package.json b/package.json
index cf7f6a3fd03..1b279793f27 100644
--- a/package.json
+++ b/package.json
@@ -74,41 +74,41 @@
"@snowplow/browser-plugin-timezone": "^3.9.0",
"@snowplow/browser-tracker": "^3.9.0",
"@sourcegraph/code-host-integration": "0.0.95",
- "@tiptap/core": "^2.1.13",
- "@tiptap/extension-blockquote": "^2.1.13",
- "@tiptap/extension-bold": "^2.1.13",
- "@tiptap/extension-bubble-menu": "^2.1.13",
- "@tiptap/extension-bullet-list": "^2.1.13",
- "@tiptap/extension-code": "^2.1.13",
- "@tiptap/extension-code-block": "^2.1.13",
- "@tiptap/extension-code-block-lowlight": "^2.1.13",
- "@tiptap/extension-document": "^2.1.13",
- "@tiptap/extension-dropcursor": "^2.1.13",
- "@tiptap/extension-gapcursor": "^2.1.13",
- "@tiptap/extension-hard-break": "^2.1.13",
- "@tiptap/extension-heading": "^2.1.13",
- "@tiptap/extension-highlight": "^2.1.13",
- "@tiptap/extension-history": "^2.1.13",
- "@tiptap/extension-horizontal-rule": "^2.1.13",
- "@tiptap/extension-image": "^2.1.13",
- "@tiptap/extension-italic": "^2.1.13",
- "@tiptap/extension-link": "^2.1.13",
- "@tiptap/extension-list-item": "^2.1.13",
- "@tiptap/extension-ordered-list": "^2.1.13",
- "@tiptap/extension-paragraph": "^2.1.13",
- "@tiptap/extension-strike": "^2.1.13",
- "@tiptap/extension-subscript": "^2.1.13",
- "@tiptap/extension-superscript": "^2.1.13",
- "@tiptap/extension-table": "^2.1.13",
- "@tiptap/extension-table-cell": "^2.1.13",
- "@tiptap/extension-table-header": "^2.1.13",
- "@tiptap/extension-table-row": "^2.1.13",
- "@tiptap/extension-task-item": "^2.1.13",
- "@tiptap/extension-task-list": "^2.1.13",
- "@tiptap/extension-text": "^2.1.13",
- "@tiptap/pm": "^2.1.13",
- "@tiptap/suggestion": "^2.1.13",
- "@tiptap/vue-2": "^2.1.13",
+ "@tiptap/core": "^2.1.14",
+ "@tiptap/extension-blockquote": "^2.1.14",
+ "@tiptap/extension-bold": "^2.1.14",
+ "@tiptap/extension-bubble-menu": "^2.1.14",
+ "@tiptap/extension-bullet-list": "^2.1.14",
+ "@tiptap/extension-code": "^2.1.14",
+ "@tiptap/extension-code-block": "^2.1.14",
+ "@tiptap/extension-code-block-lowlight": "^2.1.14",
+ "@tiptap/extension-document": "^2.1.14",
+ "@tiptap/extension-dropcursor": "^2.1.14",
+ "@tiptap/extension-gapcursor": "^2.1.14",
+ "@tiptap/extension-hard-break": "^2.1.14",
+ "@tiptap/extension-heading": "^2.1.14",
+ "@tiptap/extension-highlight": "^2.1.14",
+ "@tiptap/extension-history": "^2.1.14",
+ "@tiptap/extension-horizontal-rule": "^2.1.14",
+ "@tiptap/extension-image": "^2.1.14",
+ "@tiptap/extension-italic": "^2.1.14",
+ "@tiptap/extension-link": "^2.1.14",
+ "@tiptap/extension-list-item": "^2.1.14",
+ "@tiptap/extension-ordered-list": "^2.1.14",
+ "@tiptap/extension-paragraph": "^2.1.14",
+ "@tiptap/extension-strike": "^2.1.14",
+ "@tiptap/extension-subscript": "^2.1.14",
+ "@tiptap/extension-superscript": "^2.1.14",
+ "@tiptap/extension-table": "^2.1.14",
+ "@tiptap/extension-table-cell": "^2.1.14",
+ "@tiptap/extension-table-header": "^2.1.14",
+ "@tiptap/extension-table-row": "^2.1.14",
+ "@tiptap/extension-task-item": "^2.1.14",
+ "@tiptap/extension-task-list": "^2.1.14",
+ "@tiptap/extension-text": "^2.1.14",
+ "@tiptap/pm": "^2.1.14",
+ "@tiptap/suggestion": "^2.1.14",
+ "@tiptap/vue-2": "^2.1.14",
"@vue/apollo-components": "^4.0.0-beta.4",
"@vue/apollo-option": "^4.0.0-beta.4",
"apollo-upload-client": "15.0.0",
diff --git a/spec/frontend/ci/catalog/components/list/catalog_tabs_spec.js b/spec/frontend/ci/catalog/components/list/catalog_tabs_spec.js
new file mode 100644
index 00000000000..ea216300017
--- /dev/null
+++ b/spec/frontend/ci/catalog/components/list/catalog_tabs_spec.js
@@ -0,0 +1,71 @@
+import { GlTab, GlTabs, GlLoadingIcon } from '@gitlab/ui';
+import { shallowMount } from '@vue/test-utils';
+import { extendedWrapper } from 'helpers/vue_test_utils_helper';
+import { trimText } from 'helpers/text_helper';
+import CatalogTabs from '~/ci/catalog/components/list/catalog_tabs.vue';
+import { SCOPE } from '~/ci/catalog/constants';
+
+describe('Catalog Tabs', () => {
+ let wrapper;
+
+ const defaultProps = {
+ isLoading: false,
+ resourceCounts: {
+ all: 11,
+ namespaces: 4,
+ },
+ };
+
+ const findAllTab = () => wrapper.findByTestId('resources-all-tab');
+ const findYourResourcesTab = () => wrapper.findByTestId('resources-your-tab');
+ const findLoadingIcons = () => wrapper.findAllComponents(GlLoadingIcon);
+
+ const triggerTabChange = (index) => wrapper.findAllComponents(GlTab).at(index).vm.$emit('click');
+
+ const createComponent = (props = defaultProps) => {
+ wrapper = extendedWrapper(
+ shallowMount(CatalogTabs, {
+ propsData: {
+ ...props,
+ },
+ stubs: { GlTabs },
+ }),
+ );
+ };
+
+ describe('When count queries are loading', () => {
+ beforeEach(() => {
+ createComponent({ ...defaultProps, isLoading: true });
+ });
+
+ it('renders loading icons', () => {
+ expect(findLoadingIcons()).toHaveLength(2);
+ });
+ });
+
+ describe('When both tabs have resources', () => {
+ beforeEach(() => {
+ createComponent();
+ });
+
+ it('renders All tab with count', () => {
+ expect(trimText(findAllTab().text())).toBe(`All ${defaultProps.resourceCounts.all}`);
+ });
+
+ it('renders your resources tab with count', () => {
+ expect(trimText(findYourResourcesTab().text())).toBe(
+ `Your resources ${defaultProps.resourceCounts.namespaces}`,
+ );
+ });
+
+ it.each`
+ tabIndex | expectedScope
+ ${0} | ${SCOPE.all}
+ ${1} | ${SCOPE.namespaces}
+ `('emits setScope with $expectedScope on tab change', ({ tabIndex, expectedScope }) => {
+ triggerTabChange(tabIndex);
+
+ expect(wrapper.emitted()).toEqual({ setScope: [[expectedScope]] });
+ });
+ });
+});
diff --git a/spec/frontend/ci/catalog/components/list/ci_resources_list_spec.js b/spec/frontend/ci/catalog/components/list/ci_resources_list_spec.js
index aca20a83979..41c6ccdd112 100644
--- a/spec/frontend/ci/catalog/components/list/ci_resources_list_spec.js
+++ b/spec/frontend/ci/catalog/components/list/ci_resources_list_spec.js
@@ -3,20 +3,19 @@ import { GlKeysetPagination } from '@gitlab/ui';
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
import CiResourcesList from '~/ci/catalog/components/list/ci_resources_list.vue';
import CiResourcesListItem from '~/ci/catalog/components/list/ci_resources_list_item.vue';
-import { ciCatalogResourcesItemsCount } from '~/ci/catalog/graphql/settings';
import { catalogResponseBody, catalogSinglePageResponse } from '../../mock';
describe('CiResourcesList', () => {
let wrapper;
const createComponent = ({ props = {} } = {}) => {
- const { nodes, pageInfo, count } = catalogResponseBody.data.ciCatalogResources;
+ const { nodes, pageInfo } = catalogResponseBody.data.ciCatalogResources;
const defaultProps = {
currentPage: 1,
resources: nodes,
pageInfo,
- totalCount: count,
+ totalCount: 20,
};
wrapper = shallowMountExtended(CiResourcesList, {
@@ -36,11 +35,11 @@ describe('CiResourcesList', () => {
const findNextBtn = () => wrapper.findByTestId('nextButton');
describe('contains only one page', () => {
- const { nodes, pageInfo, count } = catalogSinglePageResponse.data.ciCatalogResources;
+ const { nodes, pageInfo } = catalogSinglePageResponse.data.ciCatalogResources;
beforeEach(async () => {
await createComponent({
- props: { currentPage: 1, resources: nodes, pageInfo, totalCount: count },
+ props: { currentPage: 1, resources: nodes, pageInfo, totalCount: nodes.length },
});
});
@@ -62,58 +61,56 @@ describe('CiResourcesList', () => {
});
describe.each`
- hasPreviousPage | hasNextPage | pageText | expectedTotal | currentPage
- ${false} | ${true} | ${'1 of 3'} | ${ciCatalogResourcesItemsCount} | ${1}
- ${true} | ${true} | ${'2 of 3'} | ${ciCatalogResourcesItemsCount} | ${2}
- ${true} | ${false} | ${'3 of 3'} | ${ciCatalogResourcesItemsCount} | ${3}
- `(
- 'when on page $pageText',
- ({ currentPage, expectedTotal, pageText, hasPreviousPage, hasNextPage }) => {
- const { nodes, pageInfo, count } = catalogResponseBody.data.ciCatalogResources;
-
- const previousPageState = hasPreviousPage ? 'enabled' : 'disabled';
- const nextPageState = hasNextPage ? 'enabled' : 'disabled';
-
- beforeEach(async () => {
- await createComponent({
- props: {
- currentPage,
- resources: nodes,
- pageInfo: { ...pageInfo, hasPreviousPage, hasNextPage },
- totalCount: count,
- },
- });
- });
+ hasPreviousPage | hasNextPage | pageText | currentPage
+ ${false} | ${true} | ${'1 of 3'} | ${1}
+ ${true} | ${true} | ${'2 of 3'} | ${2}
+ ${true} | ${false} | ${'3 of 3'} | ${3}
+ `('when on page $pageText', ({ currentPage, pageText, hasPreviousPage, hasNextPage }) => {
+ const { nodes, pageInfo } = catalogResponseBody.data.ciCatalogResources;
+ const count = 50; // We want 3 pages of data to test. There are 20 items per page.
+
+ const previousPageState = hasPreviousPage ? 'enabled' : 'disabled';
+ const nextPageState = hasNextPage ? 'enabled' : 'disabled';
- it('shows the right number of items', () => {
- expect(findResourcesListItems()).toHaveLength(expectedTotal);
+ beforeEach(async () => {
+ await createComponent({
+ props: {
+ currentPage,
+ resources: nodes,
+ pageInfo: { ...pageInfo, hasPreviousPage, hasNextPage },
+ totalCount: count,
+ },
});
+ });
- it(`shows the keyset control for previous page as ${previousPageState}`, () => {
- const disableAttr = findPrevBtn().attributes('disabled');
+ it('shows the right number of items', () => {
+ expect(findResourcesListItems()).toHaveLength(20);
+ });
- if (previousPageState === 'disabled') {
- expect(disableAttr).toBeDefined();
- } else {
- expect(disableAttr).toBeUndefined();
- }
- });
+ it(`shows the keyset control for previous page as ${previousPageState}`, () => {
+ const disableAttr = findPrevBtn().attributes('disabled');
- it(`shows the keyset control for next page as ${nextPageState}`, () => {
- const disableAttr = findNextBtn().attributes('disabled');
+ if (previousPageState === 'disabled') {
+ expect(disableAttr).toBeDefined();
+ } else {
+ expect(disableAttr).toBeUndefined();
+ }
+ });
- if (nextPageState === 'disabled') {
- expect(disableAttr).toBeDefined();
- } else {
- expect(disableAttr).toBeUndefined();
- }
- });
+ it(`shows the keyset control for next page as ${nextPageState}`, () => {
+ const disableAttr = findNextBtn().attributes('disabled');
- it('shows the correct count of current page', () => {
- expect(findPageCount().text()).toContain(pageText);
- });
- },
- );
+ if (nextPageState === 'disabled') {
+ expect(disableAttr).toBeDefined();
+ } else {
+ expect(disableAttr).toBeUndefined();
+ }
+ });
+
+ it('shows the correct count of current page', () => {
+ expect(findPageCount().text()).toContain(pageText);
+ });
+ });
describe('when there is an error getting the page count', () => {
beforeEach(() => {
diff --git a/spec/frontend/ci/catalog/components/pages/ci_resources_page_spec.js b/spec/frontend/ci/catalog/components/pages/ci_resources_page_spec.js
index e6fbd63f307..6fb5eed0d93 100644
--- a/spec/frontend/ci/catalog/components/pages/ci_resources_page_spec.js
+++ b/spec/frontend/ci/catalog/components/pages/ci_resources_page_spec.js
@@ -7,17 +7,25 @@ import createMockApollo from 'helpers/mock_apollo_helper';
import { createAlert } from '~/alert';
import CatalogHeader from '~/ci/catalog/components/list/catalog_header.vue';
-import CatalogSearch from '~/ci/catalog/components/list/catalog_search.vue';
import CiResourcesList from '~/ci/catalog/components/list/ci_resources_list.vue';
+import CiResourcesPage from '~/ci/catalog/components/pages/ci_resources_page.vue';
+import CatalogSearch from '~/ci/catalog/components/list/catalog_search.vue';
+import CatalogTabs from '~/ci/catalog/components/list/catalog_tabs.vue';
import CatalogListSkeletonLoader from '~/ci/catalog/components/list/catalog_list_skeleton_loader.vue';
import EmptyState from '~/ci/catalog/components/list/empty_state.vue';
+
import { cacheConfig, resolvers } from '~/ci/catalog/graphql/settings';
+import { DEFAULT_SORT_VALUE, SCOPE } from '~/ci/catalog/constants';
import typeDefs from '~/ci/catalog/graphql/typedefs.graphql';
-import ciResourcesPage from '~/ci/catalog/components/pages/ci_resources_page.vue';
import getCatalogResources from '~/ci/catalog/graphql/queries/get_ci_catalog_resources.query.graphql';
+import getCatalogResourcesCount from '~/ci/catalog/graphql/queries/get_ci_catalog_resources_count.query.graphql';
-import { emptyCatalogResponseBody, catalogResponseBody } from '../../mock';
+import {
+ emptyCatalogResponseBody,
+ catalogResponseBody,
+ catalogResourcesCountResponseBody,
+} from '../../mock';
Vue.use(VueApollo);
jest.mock('~/alert');
@@ -25,14 +33,23 @@ jest.mock('~/alert');
describe('CiResourcesPage', () => {
let wrapper;
let catalogResourcesResponse;
+ let catalogResourcesCountResponse;
- const defaultQueryVariables = { first: 20 };
+ const defaultQueryVariables = {
+ first: 20,
+ scope: SCOPE.all,
+ searchTerm: null,
+ sortValue: DEFAULT_SORT_VALUE,
+ };
const createComponent = () => {
- const handlers = [[getCatalogResources, catalogResourcesResponse]];
+ const handlers = [
+ [getCatalogResources, catalogResourcesResponse],
+ [getCatalogResourcesCount, catalogResourcesCountResponse],
+ ];
const mockApollo = createMockApollo(handlers, resolvers, { cacheConfig, typeDefs });
- wrapper = shallowMountExtended(ciResourcesPage, {
+ wrapper = shallowMountExtended(CiResourcesPage, {
apolloProvider: mockApollo,
});
@@ -41,12 +58,15 @@ describe('CiResourcesPage', () => {
const findCatalogHeader = () => wrapper.findComponent(CatalogHeader);
const findCatalogSearch = () => wrapper.findComponent(CatalogSearch);
+ const findCatalogTabs = () => wrapper.findComponent(CatalogTabs);
const findCiResourcesList = () => wrapper.findComponent(CiResourcesList);
const findLoadingState = () => wrapper.findComponent(CatalogListSkeletonLoader);
const findEmptyState = () => wrapper.findComponent(EmptyState);
beforeEach(() => {
catalogResourcesResponse = jest.fn();
+ catalogResourcesCountResponse = jest.fn();
+ catalogResourcesCountResponse.mockResolvedValue(catalogResourcesCountResponseBody);
});
describe('when initial queries are loading', () => {
@@ -83,31 +103,56 @@ describe('CiResourcesPage', () => {
expect(findCatalogSearch().exists()).toBe(true);
});
+ it('renders the tabs', () => {
+ expect(findCatalogTabs().exists()).toBe(true);
+ });
+
it('does not render the list', () => {
expect(findCiResourcesList().exists()).toBe(false);
});
});
describe('and there are resources', () => {
- const { nodes, pageInfo, count } = catalogResponseBody.data.ciCatalogResources;
+ const { nodes, pageInfo } = catalogResponseBody.data.ciCatalogResources;
beforeEach(async () => {
catalogResourcesResponse.mockResolvedValue(catalogResponseBody);
await createComponent();
});
+
it('renders the resources list', () => {
expect(findLoadingState().exists()).toBe(false);
expect(findEmptyState().exists()).toBe(false);
expect(findCiResourcesList().exists()).toBe(true);
});
+ it('renders the catalog tabs', () => {
+ expect(findCatalogTabs().exists()).toBe(true);
+ });
+
+ it('updates the scope after switching tabs', async () => {
+ await findCatalogTabs().vm.$emit('setScope', SCOPE.namespaces);
+
+ expect(catalogResourcesResponse).toHaveBeenCalledWith({
+ ...defaultQueryVariables,
+ scope: SCOPE.namespaces,
+ });
+
+ await findCatalogTabs().vm.$emit('setScope', SCOPE.all);
+
+ expect(catalogResourcesResponse).toHaveBeenCalledWith({
+ ...defaultQueryVariables,
+ scope: SCOPE.all,
+ });
+ });
+
it('passes down props to the resources list', () => {
expect(findCiResourcesList().props()).toMatchObject({
currentPage: 1,
resources: nodes,
pageInfo,
- totalCount: count,
+ totalCount: 0,
});
});
@@ -145,6 +190,7 @@ describe('CiResourcesPage', () => {
before: pageInfo.startCursor,
last: 20,
first: null,
+ scope: SCOPE.all,
});
}
});
@@ -190,10 +236,12 @@ describe('CiResourcesPage', () => {
beforeEach(async () => {
catalogResourcesResponse.mockResolvedValue(emptyCatalogResponseBody);
await createComponent();
- await findCatalogSearch().vm.$emit('update-search-term', newSearch);
});
- it('renders the empty state and passes down the search query', () => {
+ it('renders the empty state and passes down the search query', async () => {
+ await findCatalogSearch().vm.$emit('update-search-term', newSearch);
+ await waitForPromises();
+
expect(findEmptyState().exists()).toBe(true);
expect(findEmptyState().props().searchTerm).toBe(newSearch);
});
diff --git a/spec/frontend/ci/catalog/mock.js b/spec/frontend/ci/catalog/mock.js
index 9ca35943ae5..47e3a3bbfe7 100644
--- a/spec/frontend/ci/catalog/mock.js
+++ b/spec/frontend/ci/catalog/mock.js
@@ -10,12 +10,26 @@ export const emptyCatalogResponseBody = {
hasPreviousPage: false,
__typename: 'PageInfo',
},
- count: 0,
nodes: [],
},
},
};
+export const catalogResourcesCountResponseBody = {
+ data: {
+ ciCatalogResources: {
+ all: {
+ count: 1,
+ __typename: 'CiCatalogResourceConnection',
+ },
+ namespaces: {
+ count: 7,
+ __typename: 'CiCatalogResourceConnection',
+ },
+ },
+ },
+};
+
export const catalogResponseBody = {
data: {
ciCatalogResources: {
@@ -28,7 +42,6 @@ export const catalogResponseBody = {
hasPreviousPage: false,
__typename: 'PageInfo',
},
- count: 41,
nodes: [
{
id: 'gid://gitlab/Ci::Catalog::Resource/129',
@@ -248,7 +261,6 @@ export const catalogSinglePageResponse = {
hasPreviousPage: false,
__typename: 'PageInfo',
},
- count: 3,
nodes: [
{
id: 'gid://gitlab/Ci::Catalog::Resource/132',
diff --git a/spec/frontend/projects/commit/components/commit_comments_button_spec.js b/spec/frontend/projects/commit/components/commit_comments_button_spec.js
deleted file mode 100644
index 873270c5be1..00000000000
--- a/spec/frontend/projects/commit/components/commit_comments_button_spec.js
+++ /dev/null
@@ -1,42 +0,0 @@
-import { shallowMount } from '@vue/test-utils';
-import { extendedWrapper } from 'helpers/vue_test_utils_helper';
-import CommitCommentsButton from '~/projects/commit/components/commit_comments_button.vue';
-
-describe('CommitCommentsButton', () => {
- let wrapper;
-
- const createComponent = (props = {}) => {
- wrapper = extendedWrapper(
- shallowMount(CommitCommentsButton, {
- propsData: {
- commentsCount: 1,
- ...props,
- },
- }),
- );
- };
-
- const tooltip = () => wrapper.findByTestId('comment-button-wrapper');
-
- describe('Comment Button', () => {
- it('has proper tooltip and button attributes for 1 comment', () => {
- createComponent();
-
- expect(tooltip().attributes('title')).toBe('1 comment on this commit');
- expect(tooltip().text()).toBe('1');
- });
-
- it('has proper tooltip and button attributes for multiple comments', () => {
- createComponent({ commentsCount: 2 });
-
- expect(tooltip().attributes('title')).toBe('2 comments on this commit');
- expect(tooltip().text()).toBe('2');
- });
-
- it('does not show when there are no comments', () => {
- createComponent({ commentsCount: 0 });
-
- expect(tooltip().exists()).toBe(false);
- });
- });
-});
diff --git a/spec/support/helpers/dns_helpers.rb b/spec/support/helpers/dns_helpers.rb
index e673e36adbd..0250e432609 100644
--- a/spec/support/helpers/dns_helpers.rb
+++ b/spec/support/helpers/dns_helpers.rb
@@ -1,12 +1,15 @@
# frozen_string_literal: true
module DnsHelpers
+ include ViteHelper
+
def block_dns!
stub_all_dns!
stub_invalid_dns!
permit_local_dns!
permit_postgresql!
permit_redis!
+ permit_vite!
end
def permit_dns!
@@ -66,6 +69,14 @@ module DnsHelpers
end
end
+ def permit_vite!
+ # https://github.com/ElMassimo/vite_ruby/blob/7d2f558c9760802e5d763bfa40efe87607eb166a/vite_ruby/lib/vite_ruby.rb#L91
+ # uses Socket.tcp to connect to vite dev server - this won't necessarily be localhost
+ return unless vite_enabled?
+
+ allow(Addrinfo).to receive(:getaddrinfo).with(ViteRuby.instance.config.host, ViteRuby.instance.config.port, nil, :STREAM, anything, anything, any_args).and_call_original
+ end
+
def stub_resolver(stubbed_lookups = {})
resolver = instance_double('Resolv::DNS')
allow(resolver).to receive(:timeouts=)
diff --git a/spec/support/helpers/navbar_structure_helper.rb b/spec/support/helpers/navbar_structure_helper.rb
index 49a9508b1ff..2d3f7a1b8a9 100644
--- a/spec/support/helpers/navbar_structure_helper.rb
+++ b/spec/support/helpers/navbar_structure_helper.rb
@@ -76,6 +76,14 @@ module NavbarStructureHelper
)
end
+ def insert_google_artifact_registry_nav
+ insert_after_sub_nav_item(
+ _('Container Registry'),
+ within: _('Deploy'),
+ new_sub_nav_item_name: _('Google Artifact Registry')
+ )
+ end
+
def insert_dependency_proxy_nav
insert_before_sub_nav_item(
_('Kubernetes'),
diff --git a/yarn.lock b/yarn.lock
index d912ac03258..7ea0b5e25d9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2208,181 +2208,181 @@
dom-accessibility-api "^0.5.1"
pretty-format "^26.4.2"
-"@tiptap/core@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.1.13.tgz#e21f566e81688c826c6f26d2940886734189e193"
- integrity sha512-cMC8bgTN63dj1Mv82iDeeLl6sa9kY0Pug8LSalxVEptRmyFVsVxGgu2/6Y3T+9aCYScxfS06EkA8SdzFMAwYTQ==
-
-"@tiptap/extension-blockquote@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.1.13.tgz#abf01e3a00d72434b08be7f3d7e318c7320db486"
- integrity sha512-oe6wSQACmODugoP9XH3Ouffjy4BsOBWfTC+dETHNCG6ZED6ShHN3CB9Vr7EwwRgmm2WLaKAjMO1sVumwH+Z1rg==
-
-"@tiptap/extension-bold@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.1.13.tgz#fb0c8916269be61269e4aef9d1da417daf52b7f1"
- integrity sha512-6cHsQTh/rUiG4jkbJer3vk7g60I5tBwEBSGpdxmEHh83RsvevD8+n92PjA24hYYte5RNlATB011E1wu8PVhSvw==
-
-"@tiptap/extension-bubble-menu@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.13.tgz#884cd2e4e0c9586998baac3d0a14621b177f1859"
- integrity sha512-Hm7e1GX3AI6lfaUmr6WqsS9MMyXIzCkhh+VQi6K8jj4Q4s8kY4KPoAyD/c3v9pZ/dieUtm2TfqrOCkbHzsJQBg==
+"@tiptap/core@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.1.14.tgz#c30d2227891554c0ad1038d84b0f0c44deebf77b"
+ integrity sha512-X8FWXWhxrOklNEdhDkSa4PekF3BwGjDfhq7Es95OrdJ3vZ1a5lkbCdx4jXErsX1C4TaIs7cI3tqdflTXhqjLmg==
+
+"@tiptap/extension-blockquote@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-blockquote/-/extension-blockquote-2.1.14.tgz#3c5decf6316ea1d299330f33e77d36047aa8ec54"
+ integrity sha512-hslTfGzlC52lq3EGaxl1V8tGFsnjGLIlYr5SGJzPYwQcr2WHU/WJZli66HB+8N2o+ox5Cp4gQRNDUd9XsfxChg==
+
+"@tiptap/extension-bold@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.1.14.tgz#9a0d0274bd0569d5ed37720554264f2a7d3d8bac"
+ integrity sha512-LeIRHjc6LsZ4JVuvbrb2U18IHvaYwP4+O6lIG2riTmvuqhc1UL2dKeG8X13xfk7OttA89Vkkb/XdjzQvcT1I0Q==
+
+"@tiptap/extension-bubble-menu@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.1.14.tgz#6a23066934969fc89d2cd8b3b3932e1364712ee9"
+ integrity sha512-9+KsP2rCVymlSKXx7BhPF9xy7dj2/G7auu7qZ4AJzEbsLj1PMS8/pSjPUabCIN6z+9IeifOa2VKmXCnVfcpazw==
dependencies:
tippy.js "^6.3.7"
-"@tiptap/extension-bullet-list@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.13.tgz#0a26731ebf98ddfd268884ff1712f7189be7b63c"
- integrity sha512-NkWlQ5bLPUlcROj6G/d4oqAxMf3j3wfndGOPp0z8OoXJtVbVoXl/aMSlLbVgE6n8r6CS8MYxKhXNxrb7Ll2foA==
-
-"@tiptap/extension-code-block-lowlight@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.1.13.tgz#91110f44d6cc8a12d95ac92aee0c848fdedefb0d"
- integrity sha512-PlU0lzAEbUGqPykl7fYqlAiY7/zFRtQExsbrpi2kctSIzxC+jgMM4vEpWxLS4jZEXl7jVHvBRH6lRNINDHWmQA==
-
-"@tiptap/extension-code-block@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.1.13.tgz#3e441d171d3ed821e67291dbf4cbad7e2ea29809"
- integrity sha512-E3tweNExPOV+t1ODKX0MDVsS0aeHGWc1ECt+uyp6XwzsN0bdF2A5+pttQqM7sTcMnQkVACGFbn9wDeLRRcfyQg==
-
-"@tiptap/extension-code@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.1.13.tgz#27a5ca5705e59ca97390fad4d6631bf431690480"
- integrity sha512-f5fLYlSgliVVa44vd7lQGvo49+peC+Z2H0Fn84TKNCH7tkNZzouoJsHYn0/enLaQ9Sq+24YPfqulfiwlxyiT8w==
-
-"@tiptap/extension-document@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.1.13.tgz#5b68fa08e8a79eebd41f1360982db2ddd28ad010"
- integrity sha512-wLwiTWsVmZTGIE5duTcHRmW4ulVxNW4nmgfpk95+mPn1iKyNGtrVhGWleLhBlTj+DWXDtcfNWZgqZkZNzhkqYQ==
-
-"@tiptap/extension-dropcursor@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.13.tgz#2e8908f2dec9e8e997a2f216a11d3b915fe062df"
- integrity sha512-NAyJi4BJxH7vl/2LNS1X0ndwFKjEtX+cRgshXCnMyh7qNpIRW6Plczapc/W1OiMncOEhZJfpZfkRSfwG01FWFg==
-
-"@tiptap/extension-floating-menu@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.13.tgz#e12e6e73ee095319d4a723a9b46b8f7b1a9f4b1a"
- integrity sha512-9Oz7pk1Nts2+EyY+rYfnREGbLzQ5UFazAvRhF6zAJdvyuDmAYm0Jp6s0GoTrpV0/dJEISoFaNpPdMJOb9EBNRw==
+"@tiptap/extension-bullet-list@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-bullet-list/-/extension-bullet-list-2.1.14.tgz#0e7f07c0f8f51de8378fdea49e7c9626ebb1ffcd"
+ integrity sha512-dbnYDGNkbtFaCQIqNsOD9cc2JewN4Ref3Qq0NrVoh+MbbX2oJN2vA8rrKmEv1GhxDjtvaj2RiH1ki5XW3P98UQ==
+
+"@tiptap/extension-code-block-lowlight@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block-lowlight/-/extension-code-block-lowlight-2.1.14.tgz#f7b9bd0b6a2d6bbbfd2a10d2192831584e132d41"
+ integrity sha512-FSO8LRt2Ja8d/WQ340z1gW4AUKBECJHxw08ADV0mJpjY+6NnfOID1lqL02Gy15CjO/amccE1DqPHGlcC39WU+Q==
+
+"@tiptap/extension-code-block@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code-block/-/extension-code-block-2.1.14.tgz#5220bd76d0e957e59898ef145142394dbfd58124"
+ integrity sha512-D+F+bGrmbXzIkZuKUaM5fhJHVoUmDyTdWCqOMOzG5t53GgMDdLQF7LTzOGC2iAVu0CtAxhUEsoIlzPBdV2FKrA==
+
+"@tiptap/extension-code@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-code/-/extension-code-2.1.14.tgz#1e62e5e138981b26675a1e2a7d6f446b99727a82"
+ integrity sha512-7fuDW0+nyzxTlGEdkkrGMkz5b90xAvZq7EPnta13Px7FsSy771dpbWer7xMbpWGh7VYxOG6qpWJouLLrx2FKyQ==
+
+"@tiptap/extension-document@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-document/-/extension-document-2.1.14.tgz#9b5234a7881f8ef222924a67ef771a2bfff8a75e"
+ integrity sha512-plOcTQBCysUyz8AXrkBhhAqa+ALyeGJPOku0L3lS6MCSAPM2/KRW/H4KXcrfW0G1lHKiJ4OkP8oHksxa6Id5zg==
+
+"@tiptap/extension-dropcursor@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-dropcursor/-/extension-dropcursor-2.1.14.tgz#a6f2df2a36a5457a3afff3c933b5328147be8f80"
+ integrity sha512-ZupJ/3ukcuFK/HhWbD7vuEKt10RC1/Jbk8O+HHcAWftAghsXNAnCsKWhJhAs/MvvoBFQEkmVOdPXvQsDXbbCMw==
+
+"@tiptap/extension-floating-menu@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.1.14.tgz#13f9e6cf62bfc3bec5e05e2bac0f6a1f66a909bf"
+ integrity sha512-o/yNaZ+ntMBCjFL95JyX6LoVb8fsrx0IsnlNtnGUVr8mpOg2JyeN2ZJpUhPo2aR7QuyfdR1XsGG4TRHJBp3fGg==
dependencies:
tippy.js "^6.3.7"
-"@tiptap/extension-gapcursor@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.13.tgz#994a54e1d4106dfaede0acce184c48457ab34450"
- integrity sha512-Cl5apsoTcyPPCgE3ThufxQxZ1wyqqh+9uxUN9VF9AbeTkid6oPZvKXwaILf6AFnkSy+SuKrb9kZD2iaezxpzXw==
-
-"@tiptap/extension-hard-break@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.1.13.tgz#fc84d0ff7e2fe861bf421bc8000194ecc26979b0"
- integrity sha512-TGkMzMQayuKg+vN4du0x1ahEItBLcCT1jdWeRsjdM8gHfzbPLdo4PQhVsvm1I0xaZmbJZelhnVsUwRZcIu1WNA==
-
-"@tiptap/extension-heading@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.1.13.tgz#94a6219448d97ffed0915fa1bf411074c39f4103"
- integrity sha512-PEmc19QLmlVUTiHWoF0hpgNTNPNU0nlaFmMKskzO+cx5Df4xvHmv/UqoIwp7/UFbPMkfVJT1ozQU7oD1IWn9Hg==
-
-"@tiptap/extension-highlight@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.1.13.tgz#d30221c178569264ab76327f87a0d81605493fcc"
- integrity sha512-ZivjJma5WwPYcG0rpnynVDGis32OGdtpTwETEb+2OOjZBCBlyYQ4tcRk5gS3nzBAjLl/Qu84VVbawLhHXB6few==
-
-"@tiptap/extension-history@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.1.13.tgz#50478c602143fa77bb3b45c9c9cae4ddb743e0ed"
- integrity sha512-1ouitThGTBUObqw250aDwGLMNESBH5PRXIGybsCFO1bktdmWtEw7m72WY41EuX2BH8iKJpcYPerl3HfY1vmCNw==
-
-"@tiptap/extension-horizontal-rule@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.13.tgz#4884dbf912c8dabbbc69e041ff5529d6337e638e"
- integrity sha512-7OgjgNqZXvBejgULNdMSma2M1nzv4bbZG+FT5XMFZmEOxR9IB1x/RzChjPdeicff2ZK2sfhMBc4Y9femF5XkUg==
-
-"@tiptap/extension-image@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.1.13.tgz#835fc6759b2c1184fb54d3704c538029d523dbf6"
- integrity sha512-7oVAos+BU4KR/zQsfltrd8hgIxKxyxZ19dhwb1BJI2Nt3Mnx+yFPRlRSehID6RT9dYqgW4UW5d6vh/3HQcYYYw==
-
-"@tiptap/extension-italic@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.1.13.tgz#1e9521dea002c8d6de833d9fd928d4617623eab8"
- integrity sha512-HyDJfuDn5hzwGKZiANcvgz6wcum6bEgb4wmJnfej8XanTMJatNVv63TVxCJ10dSc9KGpPVcIkg6W8/joNXIEbw==
-
-"@tiptap/extension-link@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.1.13.tgz#ae4abd7c43292e3a1841488bfc7a687b2f014249"
- integrity sha512-wuGMf3zRtMHhMrKm9l6Tft5M2N21Z0UP1dZ5t1IlOAvOeYV2QZ5UynwFryxGKLO0NslCBLF/4b/HAdNXbfXWUA==
+"@tiptap/extension-gapcursor@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-gapcursor/-/extension-gapcursor-2.1.14.tgz#fe36282b66f3652c5f7c2d5031b651b2db2a8898"
+ integrity sha512-wTT8k3msIUBIj3k28ZB8IUdI4zjnkiYGTqzNXud01hLsPuQWkPerW/LqqiyKfsGKSIJa/l8x4ZzUgJv3ciO9YQ==
+
+"@tiptap/extension-hard-break@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-hard-break/-/extension-hard-break-2.1.14.tgz#47eea3742a879bf7849377ffdb3549fddffa4474"
+ integrity sha512-Nv6JS1dmPiiWDJAcdb6nGns7vD65Gqbqxh/RQeT172G2yXu5TD8EJa0OiEhd1sMcEg7OXbHMLtkDzx57mEuZ7Q==
+
+"@tiptap/extension-heading@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-heading/-/extension-heading-2.1.14.tgz#868dd4eff41480d31c0cbab04d6d14a682318259"
+ integrity sha512-x/AMzMANLvgbuwx4qe848WxF5W1Yq4bUjsduSu/5jonpH2sR5AFsH5VbWS8lfT34OdOI0Gs7p+k2NNuykWDPQA==
+
+"@tiptap/extension-highlight@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-highlight/-/extension-highlight-2.1.14.tgz#ce427a031561e8e89436db0dec969cc9ea1c02af"
+ integrity sha512-TU12/Hw5FBZuk1/j06UqNVx91Hms0XEEgtz3tOwyWrxbOe4hXILNedzrz3aNoTcLJoqOVefw+VBQLcsK0Ztw/Q==
+
+"@tiptap/extension-history@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-history/-/extension-history-2.1.14.tgz#06863c38511d39d309003f8cc187d38fa800dbe5"
+ integrity sha512-DN9QeiEv/Y3cCOHVH+/0M18btg7Gebhw7ooT0afanyHS/a5aV/IsgDnw6YRHaMfLUgDD7toOSSbjgGYWZX307w==
+
+"@tiptap/extension-horizontal-rule@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.1.14.tgz#23c4ffad88b8554e280344d70592bcd6702215fd"
+ integrity sha512-n5vNE4rTA3zfLhe0p3k38IJGtEWfvr2QIp5lQuw4/i5TcOrnpfryJwA9tLDTgAdcyvTTGJH5jAXWw9ENxBexQg==
+
+"@tiptap/extension-image@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-image/-/extension-image-2.1.14.tgz#5e5b662afd35d6a41ce9fb1fee72da8e3318e2d9"
+ integrity sha512-EDwbvBIpyJJDAtIlNNBDPtIIAi0GKEAOcqyB7G0tomyho6QUaO2yFtB37t7OAbM+CQiTBtO2AuJhOYr3354V4A==
+
+"@tiptap/extension-italic@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.1.14.tgz#2542ee68202307ed01bd5e10b65650e99b6efa4f"
+ integrity sha512-K+n2ts26HNatX3FZ2pYJTFDuMypDyMP4jQ3T11cU908lUT8gHXHBcgh0OW83SX92asbWxUj8xEdDZczi7Qqbew==
+
+"@tiptap/extension-link@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.1.14.tgz#aa850dddfaec14afe99bd3ba6695d515eecadc92"
+ integrity sha512-lfZIBaGGWJaX9tZIsAq5WuWk1cIQVM3takU4F5485eN8aM7Nnw/+Se8uSPZeh3rCbiNg5EeGi/eLEZv/L/TLGQ==
dependencies:
linkifyjs "^4.1.0"
-"@tiptap/extension-list-item@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.1.13.tgz#3c62127df97974f3196866ec00ee397f4c9acdc4"
- integrity sha512-6e8iiCWXOiJTl1XOwVW2tc0YG18h70HUtEHFCx2m5HspOGFKsFEaSS3qYxOheM9HxlmQeDt8mTtqftRjEFRxPQ==
-
-"@tiptap/extension-ordered-list@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.13.tgz#31f4b3a21fbcc2f605c48662e08b5253a304c8c7"
- integrity sha512-UO4ZAL5Vrr1WwER5VjgmeNIWHpqy9cnIRo1En07gZ0OWTjs1eITPcu+4TCn1ZG6DhoFvAQzE5DTxxdhIotg+qw==
-
-"@tiptap/extension-paragraph@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.1.13.tgz#30f8ae3f8833c606b339f3554b9ffdbe1e604463"
- integrity sha512-cEoZBJrsQn69FPpUMePXG/ltGXtqKISgypj70PEHXt5meKDjpmMVSY4/8cXvFYEYsI9GvIwyAK0OrfAHiSoROA==
-
-"@tiptap/extension-strike@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.1.13.tgz#6605792fa98f0e36861be4c7ed4d4125de8c77aa"
- integrity sha512-VN6zlaCNCbyJUCDyBFxavw19XmQ4LkCh8n20M8huNqW77lDGXA2A7UcWLHaNBpqAijBRu9mWI8l4Bftyf2fcAw==
-
-"@tiptap/extension-subscript@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-subscript/-/extension-subscript-2.1.13.tgz#4363473b760ba3805d6e5e4bd45e63dcc7099f56"
- integrity sha512-+kqK0P669Dsl/7IPSQNM/bN35Er45MKtHn8eQmudcLpFmBTsL6DlxG/080/Lqr49a6OLcefQfLaENz+QQVfBag==
-
-"@tiptap/extension-superscript@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-superscript/-/extension-superscript-2.1.13.tgz#c508ef30340457f362b9d179a5aa65f619df134a"
- integrity sha512-wZr9Ls7YYvzbVInBqqpQkn+/YwG3b78Rg3U1TldCcbg0IprwFyPsFHvu0NZnqYEG4MHhaF3F1sZRtPdZ0hDy8g==
-
-"@tiptap/extension-table-cell@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.1.13.tgz#28efbc99480d53346200dcbf50cfb32bade180d1"
- integrity sha512-30pyVt2PxGAk8jmsXKxDheql8K/xIRA9FiDo++kS2Kr6Y7I42/kNPQttJ2W+Q1JdRJvedNfQtziQfKWDRLLCNA==
-
-"@tiptap/extension-table-header@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.1.13.tgz#8d64a0e5a6a5ea128708b866e56a0e04e34d7a5b"
- integrity sha512-FwIV5iso5kmpu01QyvrPCjJqZfqxRTjtjMsDyut2uIgx9v5TXk0V5XvMWobx435ANIDJoGTYCMRlIqcgtyqwAQ==
-
-"@tiptap/extension-table-row@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.1.13.tgz#ef75d6de9c7695bbb90f745aabd72d327f161ac3"
- integrity sha512-27Mb9/oYbiLd+/BUFMhQzRIqMd2Z5j1BZMYsktwtDG8vGdYVlaW257UVaoNR9TmiXyIzd3Dh1mOil8G35+HRHg==
-
-"@tiptap/extension-table@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.1.13.tgz#cfe3fc2665d12d2c946fc83b2cce9d1485ff29a0"
- integrity sha512-yMWt2LqotOsWJhLwFNo8fyTwJNLPtnk+eCUxKLlMXP23mJ/lpF+jvTihhHVVic5GqV9vLYZFU2Tn+5k/Vd5P1w==
-
-"@tiptap/extension-task-item@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.1.13.tgz#f049b774f8151b9568d7afbbb5b8fbcb30f35755"
- integrity sha512-0E1woY0BXpv0SBOGPl5Cmo2RuH+Zchn7dYcTILtOsqHu6onJ4eP0N76+jGFLGV3T0PnPf7JDuwsO/B6pC7yMSg==
-
-"@tiptap/extension-task-list@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.1.13.tgz#1a1c40f5886111a1a74386637e7bd0c4ca4158d9"
- integrity sha512-WfTo4KN0PqpmZxx23rak08M7flfBhv9IcPVpuJ4JthZOlexYdOZxaE/Yd4vlqZhq6cibG7CFljp8VzkfTUa1Ew==
-
-"@tiptap/extension-text@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.1.13.tgz#ac17a0220aef1bae1bbd646a91491353e57bb5d1"
- integrity sha512-zzsTTvu5U67a8WjImi6DrmpX2Q/onLSaj+LRWPh36A1Pz2WaxW5asZgaS+xWCnR+UrozlCALWa01r7uv69jq0w==
-
-"@tiptap/pm@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.1.13.tgz#857753691580be760da13629fab2712c52750741"
- integrity sha512-zNbA7muWsHuVg12GrTgN/j119rLePPq5M8dZgkKxUwdw8VmU3eUyBp1SihPEXJ2U0MGdZhNhFX7Y74g11u66sg==
+"@tiptap/extension-list-item@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.1.14.tgz#f17c3b9cff2a710c3307c0298261c81f2a5d7cdd"
+ integrity sha512-MpOCf0QnbW0qxW4dB7JRMX7qGortjY8QRl1WBmUGBBN54Q712nfgmUmNJmzNYfRU91PN0afdBVibUSchB4LP3Q==
+
+"@tiptap/extension-ordered-list@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-ordered-list/-/extension-ordered-list-2.1.14.tgz#61d198f146d9c71b3809398263b4093616b2e545"
+ integrity sha512-XwARMGQbTbBOOvG62T4yH2g8OeoLYVaNTKRbiuhIzYekAN/elnydQahcjjE9/Y2Zq54g0nPdgh0LvsjWNWxr8Q==
+
+"@tiptap/extension-paragraph@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-paragraph/-/extension-paragraph-2.1.14.tgz#ec993235ac4ceca5026c0e821d2d72e9d5e3c4f9"
+ integrity sha512-iWD1nfMvADrx2pwxlQXu2PDnNghhU2EvAOmNOzGOEzkTaELkPR4CDyr/wEi1ewS9dNhhO8EpP8IYVXzd01r8JA==
+
+"@tiptap/extension-strike@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-strike/-/extension-strike-2.1.14.tgz#8a94de5ec6bf726ff0ef73f998bad9d863d3a65d"
+ integrity sha512-AcFiyUc2eiL3TM5flvExIi+LjukaGzSKGGuLH1Q9e7T4GkfZu7FaSzjP1+2kvgwGAMJxgm5Ybzvugcf9rrNosA==
+
+"@tiptap/extension-subscript@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-subscript/-/extension-subscript-2.1.14.tgz#c6796abbb9d1654e8ab12c1b97354aac85754695"
+ integrity sha512-HYKqCkP4ncbHJFXxqafZUUHdL8raKqaw/DJ8Ogmk8luOqaFjgOGcgFRhtWyXCbv/BJCL42/0IGeoM5D4aRo/gg==
+
+"@tiptap/extension-superscript@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-superscript/-/extension-superscript-2.1.14.tgz#1ce5646d5c5a2bbf009c563de14cdf879156811a"
+ integrity sha512-L44OToFzSULAM+8wfbDa2oW7fekNvsZXn081x2EcF8lTjJXDfK+3nViNfoSY7OAoZKEIF6HTYOPwFmiDM+ZZXg==
+
+"@tiptap/extension-table-cell@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-cell/-/extension-table-cell-2.1.14.tgz#fddcb425485e9b28ffa9873e79e27dde5ce0bf44"
+ integrity sha512-4cnT35wA/O33H/UTOJUiZJFe0QjHfz8vOVjvkbeYOxcuo5Ww0Ro1D6RWU70fdAdkFccFJZ5UtqG9RcZi+JkNWA==
+
+"@tiptap/extension-table-header@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-header/-/extension-table-header-2.1.14.tgz#540cc2a7312f5bd6b13076eea11be608555dfacc"
+ integrity sha512-hg57IePDTGcr9GEFY5g201DreuXv3MZYp6TjqDGF/O48Yy2v22X+Baaa/SyW9WKPLPInAXBp2f8/2YSBKTuwLg==
+
+"@tiptap/extension-table-row@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table-row/-/extension-table-row-2.1.14.tgz#42968b0eca9f45f646d5c922818590d1365271b2"
+ integrity sha512-TE1qLztFerqKbm+ZkR+4tN24ZI6EFB99bYQ7QUaw5v1ioyL4QfDny2vSePKmjNObmgmFNl8I4hBqpuzYq9CzhQ==
+
+"@tiptap/extension-table@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-table/-/extension-table-2.1.14.tgz#c50e403c43fa5623088cf5a2cdf11adf180c63d8"
+ integrity sha512-e/idEukzXSThGKyRHxIaK3zqwLCaZMvm0Xcv2D8X2rnQTRIWr4ZR1+zCgwysFAUT26aDYfMUfmx2kAmuNNdLsg==
+
+"@tiptap/extension-task-item@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-item/-/extension-task-item-2.1.14.tgz#6e30bf3e02885e3fa978a94d83c92c80d47d1dc2"
+ integrity sha512-P5/Z1cARREnvpFa3gGvFMUm++OJ4RBS/9NVfwKmfg4Y71/0ZbLpaYrq4TKSa8Zg/lR1Ybx7Y1T9agmDu5D5S1g==
+
+"@tiptap/extension-task-list@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-task-list/-/extension-task-list-2.1.14.tgz#4c6d12c9d45673bc0dd4e32031b4afa1fe041049"
+ integrity sha512-yI5vd6L0UC0aJvujjmzCnYfx9K8FExI/kVHd/+AlxGQwG90+XAfj6Tw93GyIu7DhGRq/Goek1Mt+RC09sw4AHQ==
+
+"@tiptap/extension-text@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/extension-text/-/extension-text-2.1.14.tgz#a781c68fe348bdd08730e727f2380295dc190260"
+ integrity sha512-Z5g+SlWqnK2loIwqkg2LzsVKVCiMyUfDD8IhNJsny0BRbWKFs4SKPCkAcyCxLK2h8Jm/BG6PyfGHsF/2wx7I3Q==
+
+"@tiptap/pm@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/pm/-/pm-2.1.14.tgz#b504120adfa428e4eb0526d5ea2b4ba5ed55400b"
+ integrity sha512-UuHqLDFPEPVLk4iopdHFpnn9KPNmbwQ8M0lnDRK1a9ZBheQpdTj6mQYFteYGKdqJpfcbhLHvmYl8nthfzlXGYw==
dependencies:
prosemirror-changeset "^2.2.0"
prosemirror-collab "^1.3.0"
@@ -2403,18 +2403,18 @@
prosemirror-transform "^1.7.0"
prosemirror-view "^1.28.2"
-"@tiptap/suggestion@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.1.13.tgz#0a8317260baed764a523a09099c0889a0e5b507e"
- integrity sha512-Y05TsiXTFAJ5SrfoV+21MAxig5UNbY0AVa03lQlh/yicTRPpIc6hgZzblB0uxDSYoj6+kaHE4MIZvPvhUD8BJQ==
+"@tiptap/suggestion@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.1.14.tgz#baae04da4cb1cb9431f85cc90456185851d5b167"
+ integrity sha512-8jx+RYY4cZ3ZFmHDm4fPhHN6N8fwIgFnB6iBTbEh5Ra+0Bvh1q+Ek21+Ni92ORjmYz9Vy1e5xxJMyGNywRS5dw==
-"@tiptap/vue-2@^2.1.13":
- version "2.1.13"
- resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.1.13.tgz#e84c144fa36f79c36db3cf6913aef197002bd298"
- integrity sha512-OsCINarPGyT3sDIXDrhVyaoH0I0VxeDDm+NgS5P0fPbBCnsHZ8csvxD9UB9/KZ/UoxYDfJ1zLplKQn1AIlnRzg==
+"@tiptap/vue-2@^2.1.14":
+ version "2.1.14"
+ resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.1.14.tgz#59acb020a0ace9946d6f78572ae8a7629826b934"
+ integrity sha512-7kisS73LLnFlmRe0T7o/FBlZghaBsZDty1qfAuS+TrhgW1o5wvCtm8Ogoomai2ExWK6Lh8k7E3nc2lDS03s/aw==
dependencies:
- "@tiptap/extension-bubble-menu" "^2.1.13"
- "@tiptap/extension-floating-menu" "^2.1.13"
+ "@tiptap/extension-bubble-menu" "^2.1.14"
+ "@tiptap/extension-floating-menu" "^2.1.14"
vue-ts-types "^1.6.0"
"@tootallnate/once@2":