diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-09 00:10:18 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2024-01-09 00:10:18 +0300 |
commit | 5b5ff31460fc5572abbd8b7ee35f303a6f1df196 (patch) | |
tree | 87ca6063a62677ae52d85641d15e9a63c98a15b7 | |
parent | fdeb53bebfb91f7cc7182c783310ee7d7bac8550 (diff) |
Add latest changes from gitlab-org/gitlab@master
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": |