diff --git a/.eslint_todo/vue-no-unused-properties.mjs b/.eslint_todo/vue-no-unused-properties.mjs
index 48b6d32b0b2..7419aafde70 100644
--- a/.eslint_todo/vue-no-unused-properties.mjs
+++ b/.eslint_todo/vue-no-unused-properties.mjs
@@ -609,7 +609,6 @@ export default {
'ee/app/assets/javascripts/work_items/components/work_item_links/work_item_rolled_up_health_status.vue',
'ee/app/assets/javascripts/work_items/components/work_item_progress.vue',
'ee/app/assets/javascripts/work_items/components/work_item_rolledup_dates.vue',
- 'ee/app/assets/javascripts/work_items/components/work_item_weight.vue',
'ee/app/assets/javascripts/workspaces/common/components/workspaces_list/workspaces_table.vue',
'ee/app/assets/javascripts/workspaces/dropdown_group/components/workspace_dropdown_item.vue',
'ee/app/assets/javascripts/workspaces/user/pages/list.vue',
diff --git a/GITALY_SERVER_VERSION b/GITALY_SERVER_VERSION
index 67dad5b678c..30754fe562d 100644
--- a/GITALY_SERVER_VERSION
+++ b/GITALY_SERVER_VERSION
@@ -1 +1 @@
-8ee24aca568eff50b309b6555a96545d71b77979
+5ba826bb0ae2842ea51fbfb42d6cdb5a0fd12f2f
diff --git a/app/assets/javascripts/graphql_shared/possible_types.json b/app/assets/javascripts/graphql_shared/possible_types.json
index eb34e3ee0d8..6b6d1cb39d9 100644
--- a/app/assets/javascripts/graphql_shared/possible_types.json
+++ b/app/assets/javascripts/graphql_shared/possible_types.json
@@ -68,6 +68,17 @@
"Submodule",
"TreeEntry"
],
+ "EventTargetType": [
+ "Design",
+ "Issue",
+ "MergeRequest",
+ "Milestone",
+ "Note",
+ "Project",
+ "Snippet",
+ "UserCore",
+ "WikiPage"
+ ],
"Eventable": [
"BoardEpic",
"Epic"
diff --git a/app/assets/javascripts/projects/pipelines/charts/components/app.vue b/app/assets/javascripts/projects/pipelines/charts/components/app.vue
index b48c6d71030..3233eecc2f9 100644
--- a/app/assets/javascripts/projects/pipelines/charts/components/app.vue
+++ b/app/assets/javascripts/projects/pipelines/charts/components/app.vue
@@ -21,7 +21,7 @@ export default {
import('ee_component/dora/components/change_failure_rate_charts.vue'),
ProjectQualitySummary: () => import('ee_component/project_quality_summary/app.vue'),
},
- piplelinesTabEvent: 'p_analytics_ci_cd_pipelines',
+ pipelinesTabEvent: 'p_analytics_ci_cd_pipelines',
deploymentFrequencyTabEvent: 'p_analytics_ci_cd_deployment_frequency',
leadTimeTabEvent: 'p_analytics_ci_cd_lead_time',
timeToRestoreServiceTabEvent: 'visit_ci_cd_time_to_restore_service_tab',
@@ -94,7 +94,7 @@ export default {
+
+
Enter details about your cluster.
-
My Description
', + }, + }); + + expect(wrapper.find('p').text()).toContain('My Description'); + }); +}); diff --git a/spec/frontend/projects/settings/branch_rules/components/view/protection_spec.js b/spec/frontend/projects/settings/branch_rules/components/view/protection_spec.js index eb5f707a4a2..f71b855510d 100644 --- a/spec/frontend/projects/settings/branch_rules/components/view/protection_spec.js +++ b/spec/frontend/projects/settings/branch_rules/components/view/protection_spec.js @@ -108,15 +108,34 @@ describe('Branch rule protection', () => { }); describe('When `edit_branch_rules` FF is disabled', () => { - beforeEach(() => createComponent({ editBranchRules: false })); - it('does not render `Edit` button', () => { + createComponent({ editBranchRules: false }); + expect(findEditButton().exists()).toBe(false); }); - it('renders link to manage branch protections', () => { - expect(findLink().text()).toBe(protectionPropsMock.headerLinkTitle); - expect(findLink().attributes('href')).toBe(protectionPropsMock.headerLinkHref); + describe('when headerLinkHref and headerLinkTitle are set', () => { + beforeEach(() => { + createComponent({ editBranchRules: false }); + }); + + it('renders link to manage branch protections', () => { + expect(findLink().text()).toBe(protectionPropsMock.headerLinkTitle); + expect(findLink().attributes('href')).toBe(protectionPropsMock.headerLinkHref); + }); + }); + + describe('when headerLinkHref and headerLinkTitle are not set', () => { + beforeEach(() => { + createComponent( + { editBranchRules: false }, + { headerLinkHref: null, headerLinkTitle: null }, + ); + }); + + it('does not render link to manage branch protections', () => { + expect(findLink().exists()).toBe(false); + }); }); it('renders a protection row for status checks', () => { diff --git a/spec/frontend/work_items/components/shared/work_item_sidebar_widget_spec.js b/spec/frontend/work_items/components/shared/work_item_sidebar_widget_spec.js index 68794022a1a..78ec7608aa5 100644 --- a/spec/frontend/work_items/components/shared/work_item_sidebar_widget_spec.js +++ b/spec/frontend/work_items/components/shared/work_item_sidebar_widget_spec.js @@ -1,3 +1,4 @@ +import { GlLoadingIcon } from '@gitlab/ui'; import { nextTick } from 'vue'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import { Mousetrap } from '~/lib/mousetrap'; @@ -111,11 +112,17 @@ describe('WorkItemSidebarWidget component', () => { }); describe('when updating', () => { - it('renders Edit button as disabled', () => { + beforeEach(() => { createComponent({ canUpdate: true, isUpdating: true }); + }); + it('renders Edit button as disabled', () => { expect(findEditButton().props('disabled')).toBe(true); }); + + it('shows loading icon', () => { + expect(wrapper.findComponent(GlLoadingIcon).exists()).toBe(true); + }); }); }); diff --git a/spec/graphql/types/event_type_spec.rb b/spec/graphql/types/event_type_spec.rb index 10c3b5e18ca..f4d36e7ef0e 100644 --- a/spec/graphql/types/event_type_spec.rb +++ b/spec/graphql/types/event_type_spec.rb @@ -7,5 +7,7 @@ RSpec.describe Types::EventType do specify { expect(described_class).to require_graphql_authorizations(:read_event) } - specify { expect(described_class).to have_graphql_fields(:id, :author, :action, :created_at, :updated_at) } + specify do + expect(described_class).to have_graphql_fields(:id, :author, :action, :project, :target, :created_at, :updated_at) + end end diff --git a/spec/graphql/types/users/activity_stream_type_spec.rb b/spec/graphql/types/users/activity_stream_type_spec.rb new file mode 100644 index 00000000000..e71792dfe0d --- /dev/null +++ b/spec/graphql/types/users/activity_stream_type_spec.rb @@ -0,0 +1,48 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['ActivityStream'], feature_category: :user_profile do + include GraphqlHelpers + + let_it_be(:current_user) { create(:user) } + let_it_be(:project) { create(:project, :public) } + + before_all do + project.add_developer(current_user) + end + + specify { expect(described_class.graphql_name).to eq('ActivityStream') } + + specify { expect(described_class).to require_graphql_authorizations(:read_user_profile) } + + it 'exposes the expected fields' do + expected_fields = %i[followed_users_activity] + + expect(described_class).to have_graphql_fields(*expected_fields) + end + + describe "#followed_users_activity" do + let_it_be(:followed_user) { create(:user) } + let_it_be(:joined_project_event) { create(:event, :joined, project: project, author: followed_user) } + let_it_be(:issue) { create(:issue, project: project) } + let_it_be(:closed_issue_event) { create(:event, :closed, author: followed_user, project: project, target: issue) } + let(:scope) { current_user.followees } + let(:filter) { EventFilter.new('ALL') } + let(:params) { { limit: 20 } } + let(:field) { resolve_field(:followed_users_activity, current_user, ctx: { current_user: current_user }) } + + before do + current_user.follow(followed_user) + end + + it 'calls UserRecentEventsFinder' do + expect_next_instance_of(UserRecentEventsFinder, current_user, scope, filter, params) do |finder| + expect(finder).to receive(:execute).and_call_original + end + expect(field.items.length).to be(2) + expect(field.items.first.action).to eq "closed" + expect(field.items.second.action).to eq "joined" + end + end +end diff --git a/spec/graphql/types/users/event_target_enum_spec.rb b/spec/graphql/types/users/event_target_enum_spec.rb new file mode 100644 index 00000000000..5045dd17401 --- /dev/null +++ b/spec/graphql/types/users/event_target_enum_spec.rb @@ -0,0 +1,12 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe GitlabSchema.types['EventTarget'], feature_category: :user_profile do + specify { expect(described_class.graphql_name).to eq('EventTarget') } + + it 'exposes all the existing event target types' do + expected = EventFilter.new('').filters.map(&:upcase) # varies between foss/ee + expect(described_class.values.keys).to match_array(expected) + end +end diff --git a/spec/graphql/types/users/event_target_type_spec.rb b/spec/graphql/types/users/event_target_type_spec.rb new file mode 100644 index 00000000000..955cfbe96d2 --- /dev/null +++ b/spec/graphql/types/users/event_target_type_spec.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Types::Users::EventTargetType, feature_category: :user_profile do + it 'returns possible types' do + expect(described_class.possible_types).to include(Types::IssueType, Types::MilestoneType, + Types::MergeRequestType, Types::ProjectType, + Types::SnippetType, Types::UserType, Types::Wikis::WikiPageType, + Types::DesignManagement::DesignType, Types::Notes::NoteType) + end + + describe '.resolve_type' do + using RSpec::Parameterized::TableSyntax + + where(:factory, :graphql_type) do + :issue | Types::IssueType + :milestone | Types::MilestoneType + :merge_request | Types::MergeRequestType + :note | Types::Notes::NoteType + :project | Types::ProjectType + :project_snippet | Types::SnippetType + :user | Types::UserType + :wiki_page_meta | Types::Wikis::WikiPageType + :design | Types::DesignManagement::DesignType + end + + with_them do + it 'correctly maps type in object to GraphQL type' do + expect(described_class.resolve_type(build(factory), {})).to eq(graphql_type) + end + end + + it 'raises an error if the type is not supported' do + expect do + described_class.resolve_type(build(:group), {}) + end.to raise_error(RuntimeError, /Unsupported event target type/) + end + end +end diff --git a/spec/keeps/overdue_finalize_background_migration_spec.rb b/spec/keeps/overdue_finalize_background_migration_spec.rb index 1025ee18331..bab19213410 100644 --- a/spec/keeps/overdue_finalize_background_migration_spec.rb +++ b/spec/keeps/overdue_finalize_background_migration_spec.rb @@ -120,11 +120,17 @@ RSpec.describe Keeps::OverdueFinalizeBackgroundMigration, feature_category: :too end end - context 'when schema is gitlab_ci' do - let(:gitlab_schema) { 'gitlab_ci' } + context 'when using multiple databases' do + before do + skip_if_shared_database(:ci) + end - it 'returns the database name' do - expect(database_name).to eq(database_exists?(:ci) ? 'ci' : 'main') + context 'when schema is gitlab_ci' do + let(:gitlab_schema) { 'gitlab_ci' } + + it 'returns the database name' do + expect(database_name).to eq('ci') + end end end end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index c892da72ba1..fdbacb39a43 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -6453,16 +6453,6 @@ RSpec.describe Project, factory_default: :keep, feature_category: :groups_and_pr it_behaves_like 'webhook is added to execution list' end - context 'when feature flag is disabled' do - let(:data) { { interval: :thirty_days } } - - before do - stub_feature_flags(extended_expiry_webhook_execution_setting: false) - end - - it_behaves_like 'webhook is added to execution list' - end - context 'when setting extended_prat_expiry_webhooks_execute is disabled' do before do project.update!(extended_prat_expiry_webhooks_execute: false) diff --git a/spec/requests/api/graphql/users/activity_stream_type_spec.rb b/spec/requests/api/graphql/users/activity_stream_type_spec.rb new file mode 100644 index 00000000000..01d53b988b1 --- /dev/null +++ b/spec/requests/api/graphql/users/activity_stream_type_spec.rb @@ -0,0 +1,123 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe 'ActivityStream GraphQL Query', feature_category: :user_profile do + include GraphqlHelpers + + let_it_be(:user) { create(:user) } + let_it_be(:followed_user_1) { create(:user) } + let_it_be(:followed_user_2) { create(:user) } + let_it_be(:project) { create(:project, :public) } + let(:graphql_response) { post_graphql(query, current_user: user) } + let(:activity_stream) { graphql_data_at(:current_user, :activity, :followed_users_activity, :nodes) } + let(:query) do + <<~GRAPHQL + query UserActivity { + currentUser { + activity { + followedUsersActivity { + nodes { + author { + name + } + action + project { + name + } + target { + ... on Design { + id + } + ... on Issue { + title + } + ... on Note { + id + } + ... on MergeRequest { + title + } + ... on Milestone { + title + } + ... on Project { + fullPath + } + ... on Snippet { + title + } + ... on UserCore { + username + } + ... on WikiPage { + title + } + } + } + } + } + } + } + GRAPHQL + end + + before do + user.follow(followed_user_1) + user.follow(followed_user_2) + end + + context 'when there are no events in the activity stream' do + it 'returns empty nodes array' do + graphql_response + + expect(activity_stream).to eq([]) + end + end + + context 'when there are events in the activity stream' do + let_it_be(:joined_project_event) { create(:event, :joined, project: project, author: followed_user_1) } + let_it_be(:issue) { create(:issue, project: project) } + let_it_be(:closed_issue_event) { create(:event, :closed, author: followed_user_1, project: project, target: issue) } + let_it_be(:left_event) { create(:event, :left, author: followed_user_2, target: project) } + + it 'returns followed user\'s activity' do + graphql_response + + expect(activity_stream).to eq( + [ + { + "action" => "LEFT", + "author" => { "name" => followed_user_2.name }, + "project" => nil, + "target" => { "fullPath" => project.full_path } + }, + { + "action" => "CLOSED", + "author" => { "name" => followed_user_1.name }, + "project" => { "name" => project.name }, + "target" => { "title" => issue.title } + }, + { + "action" => "JOINED", + "author" => { "name" => followed_user_1.name }, + "project" => { "name" => project.name }, + "target" => nil + } + ] + ) + end + end + + context 'when the activity_stream_graphql feature flag is disabled' do + before do + stub_feature_flags(activity_stream_graphql: false) + end + + it 'returns `nil`' do + graphql_response + + expect(activity_stream).to be_nil + end + end +end diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb index 2eb1aeae9e8..757ee4d4961 100644 --- a/spec/services/quick_actions/interpret_service_spec.rb +++ b/spec/services/quick_actions/interpret_service_spec.rb @@ -3316,7 +3316,7 @@ RSpec.describe QuickActions::InterpretService, feature_category: :text_editors d let_it_be(:parent_ref) { parent.to_reference(project) } context 'on a work item' do - context 'when the parent reference is valid' do + context 'with a valid parent reference' do let(:content) { "/set_parent #{parent_ref}" } it 'returns success message' do @@ -3342,11 +3342,54 @@ RSpec.describe QuickActions::InterpretService, feature_category: :text_editors d expect(updates).to be_empty expect(message).to eq("This parent does not exist or you don't have sufficient permission.") + expect(task_work_item.reload.work_item_parent).to be_nil + end + end + + context 'when the parent is already set to the same work item' do + let_it_be(:task_work_item_with_parent) do + create(:work_item, :task, project: project, work_item_parent: parent) + end + + it 'does not assign the parent and returns an appropriate error' do + _, updates, message = service.execute(content, task_work_item_with_parent) + + expect(updates).to be_empty + expect(message).to eq("Work item #{task_work_item_with_parent.to_reference} has already been added to " \ + "parent #{parent.to_reference}.") + expect(task_work_item_with_parent.reload.work_item_parent).to eq parent + end + end + + context 'when the child is not confidential but the parent is confidential' do + let_it_be(:confidential_parent) { create(:work_item, :issue, :confidential, project: project) } + let(:content) { "/set_parent #{confidential_parent.to_reference(project)}" } + + it 'does not assign the parent and returns an appropriate error' do + _, updates, message = service.execute(content, task_work_item) + + expect(updates).to be_empty + expect(message).to eq("Cannot assign a confidential parent to a non-confidential work item. Make the " \ + "work item confidential and try again") + expect(task_work_item.reload.work_item_parent).to be_nil + end + end + + context 'when the child and parent are incompatible types' do + let(:other_task_work_item) { create(:work_item, :task, project: project) } + let(:content) { "/set_parent #{other_task_work_item.to_reference(project)}" } + + it 'does not assign the parent and returns an appropriate error' do + _, updates, message = service.execute(content, task_work_item) + + expect(updates).to be_empty + expect(message).to eq("Cannot assign this work item type to parent type") + expect(task_work_item.reload.work_item_parent).to be_nil end end end - context 'when the parent reference is invalid' do + context 'with an invalid parent reference' do let(:content) { "/set_parent not_a_valid_parent" } it 'does not assign the parent and returns an appropriate error' do diff --git a/spec/services/users/auto_ban_service_spec.rb b/spec/services/users/auto_ban_service_spec.rb index e40f28eabeb..52409a6f522 100644 --- a/spec/services/users/auto_ban_service_spec.rb +++ b/spec/services/users/auto_ban_service_spec.rb @@ -51,7 +51,7 @@ RSpec.describe Users::AutoBanService, feature_category: :instance_resiliency do response = execute expect(response[:status]).to eq(:error) - expect(response[:message]).to match('State cannot transition via "ban"') + expect(response[:message]).to match('You cannot ban blocked users.') end it 'does not modify the BannedUser record or user state' do @@ -76,7 +76,7 @@ RSpec.describe Users::AutoBanService, feature_category: :instance_resiliency do end it 'raises an error and does not ban the user', :aggregate_failures do - expect { execute! }.to raise_error(StateMachines::InvalidTransition) + expect { execute! }.to raise_error(described_class::Error) .and not_change { Users::BannedUser.count } .and not_change { user.state } end diff --git a/spec/support/shared_examples/quick_actions/work_item/hierarchy_quick_actions_shared_examples.rb b/spec/support/shared_examples/quick_actions/work_item/hierarchy_quick_actions_shared_examples.rb index a5d35b4ea63..16fbbe15243 100644 --- a/spec/support/shared_examples/quick_actions/work_item/hierarchy_quick_actions_shared_examples.rb +++ b/spec/support/shared_examples/quick_actions/work_item/hierarchy_quick_actions_shared_examples.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true RSpec.shared_examples 'sets work item parent' do + after do + noteable.reload + end + it 'leaves the note empty' do expect(execute(note)).to be_empty end diff --git a/spec/workers/pages/deactivate_expired_deployments_cron_worker_spec.rb b/spec/workers/pages/deactivate_expired_deployments_cron_worker_spec.rb index 0da97133621..cd289f951be 100644 --- a/spec/workers/pages/deactivate_expired_deployments_cron_worker_spec.rb +++ b/spec/workers/pages/deactivate_expired_deployments_cron_worker_spec.rb @@ -5,9 +5,9 @@ require 'spec_helper' RSpec.describe Pages::DeactivateExpiredDeploymentsCronWorker, feature_category: :pages do subject(:worker) { described_class.new } - let(:expired_pages_deployment) { create(:pages_deployment, expires_at: 3.minutes.ago) } - let(:not_yet_expired_pages_deployment) { create(:pages_deployment, expires_at: 1.hour.from_now) } - let(:never_expire_pages_deployment) { create(:pages_deployment, expires_at: nil) } + let!(:expired_pages_deployment) { create(:pages_deployment, expires_at: 3.minutes.ago) } + let!(:not_yet_expired_pages_deployment) { create(:pages_deployment, expires_at: 1.hour.from_now) } + let!(:never_expire_pages_deployment) { create(:pages_deployment, expires_at: nil) } it 'deactivates all expired pages deployments' do expect { worker.perform } @@ -15,4 +15,34 @@ RSpec.describe Pages::DeactivateExpiredDeploymentsCronWorker, feature_category: .and not_change { not_yet_expired_pages_deployment.reload.active? } .and not_change { never_expire_pages_deployment.reload.active? } end + + it 'logs extra metadata on done' do + expect(worker).to receive(:log_extra_metadata_on_done).with(:deactivate_expired_pages_deployments, { + deactivated_deployments: 1, + duration: be > 0 + }) + + worker.perform + end + + it 'uses the expected values for batching and limiting' do + expect(Pages::DeactivateExpiredDeploymentsCronWorker::MAX_NUM_DELETIONS).to be(10000) + expect(Pages::DeactivateExpiredDeploymentsCronWorker::BATCH_SIZE).to be(1000) + end + + describe 'batching and limiting' do + before do + stub_const('Pages::DeactivateExpiredDeploymentsCronWorker::MAX_NUM_DELETIONS', 9) + stub_const('Pages::DeactivateExpiredDeploymentsCronWorker::BATCH_SIZE', 5) + + 11.times do # we already have 1 deployment from the outer scope + create(:pages_deployment, expires_at: 3.minutes.ago) + end + end + + it 'processes a maximum number of deletions, but will complete the last batch of deletions' do + expect { worker.perform } + .to change { PagesDeployment.active.expired.count }.from(12).to(2) + end + end end diff --git a/spec/workers/personal_access_tokens/expiring_worker_spec.rb b/spec/workers/personal_access_tokens/expiring_worker_spec.rb index e4fc6204fb6..647c9e01e54 100644 --- a/spec/workers/personal_access_tokens/expiring_worker_spec.rb +++ b/spec/workers/personal_access_tokens/expiring_worker_spec.rb @@ -266,29 +266,6 @@ RSpec.describe PersonalAccessTokens::ExpiringWorker, type: :worker, feature_cate worker.perform end - context 'when feature flag extended_expiry_webhook_execution_setting is disabled' do - before do - stub_feature_flags(extended_expiry_webhook_execution_setting: false) - end - - it "does not call execute_web_hooks for interval 30 days" do - expiring_token.update!(expires_at: 30.days.from_now) - project_hook = create(:project_hook, project: project, resource_access_token_events: true) - - expect(Gitlab::DataBuilder::ResourceAccessTokenPayload).not_to receive(:build) - expect(WebHookService) - .not_to receive(:new) - .with( - project_hook, - {}, - 'resource_access_token_hooks', - idempotency_key: anything - ) { fake_wh_service } - - worker.perform - end - end - context 'with multiple batches of tokens' do let_it_be(:expiring_tokens) { create_list(:resource_access_token, 4, expires_at: 6.days.from_now) } diff --git a/yarn.lock b/yarn.lock index 55e64491ca0..49bc28e6ec4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1417,7 +1417,8 @@ resolved "https://registry.yarnpkg.com/@gitlab/fonts/-/fonts-1.3.0.tgz#df89c1bb6714e4a8a5d3272568aa4de7fb337267" integrity sha512-DoMUIN3DqjEn7wvcxBg/b7Ite5fTdF5EmuOZoBRo2j0UBGweDXmNBi+9HrTZs4cBU660dOxcf1hATFcG3npbPg== -"@gitlab/noop@^1.0.1": +"@gitlab/noop@^1.0.1", jackspeak@^3.1.2, "jackspeak@npm:@gitlab/noop@1.0.1": + name jackspeak version "1.0.1" resolved "https://registry.yarnpkg.com/@gitlab/noop/-/noop-1.0.1.tgz#71a831146ee02732b4a61d2d3c11204564753454" integrity sha512-s++4wjMYeDvBp9IO59DBrWjy8SE/gFkjTDO5ck2W0S6Vv7OlqgErwL7pHngAnrSmTJAzyUG8wHGqo0ViS4jn5Q== @@ -1441,10 +1442,10 @@ resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-3.123.0.tgz#1fa3b1a709755ff7c8ef67e18c0442101655ebf0" integrity sha512-yjVn+utOTIKk8d9JlvGo6EgJ4TQ+CKpe3RddflAqtsQqQuL/2MlVdtaUePybxYzWIaumFuh5LouQ6BrWyw1niQ== -"@gitlab/ui@110.1.0": - version "110.1.0" - resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-110.1.0.tgz#5a38aafb92d67b589318c39f72b5ba622fa89b83" - integrity sha512-tCezdqWgSNKuksfvVfm8TWBSIbkuK0jhCoffFFKl3HzBf9FWnCqS5+XEHLU3nPttZBTi5T761BTNqqHx8SZUAg== +"@gitlab/ui@111.0.0": + version "111.0.0" + resolved "https://registry.yarnpkg.com/@gitlab/ui/-/ui-111.0.0.tgz#b827f61df673074d1cb0d3d074314635bcb74aff" + integrity sha512-AynSxduL6i5xIMSysKZWhXaSXYkJGZlmCpPz2gWCBy0+IX0r8giXwHfhGqNJ/VYaZCpkTVYeY1gTiFguPlCsbg== dependencies: "@floating-ui/dom" "1.4.3" echarts "^5.3.2" @@ -9487,11 +9488,6 @@ iterall@^1.2.1: resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea" integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== -jackspeak@^3.1.2, "jackspeak@npm:@gitlab/noop@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@gitlab/noop/-/noop-1.0.1.tgz#71a831146ee02732b4a61d2d3c11204564753454" - integrity sha512-s++4wjMYeDvBp9IO59DBrWjy8SE/gFkjTDO5ck2W0S6Vv7OlqgErwL7pHngAnrSmTJAzyUG8wHGqo0ViS4jn5Q== - jed@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/jed/-/jed-1.1.1.tgz#7a549bbd9ffe1585b0cd0a191e203055bee574b4"