From f133142aee6fa935fc92c82c456c205054294378 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 5 Sep 2024 09:11:57 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .gitlab/ci/docs.gitlab-ci.yml | 1 + .gitlab/ci/test-on-omnibus/main.gitlab-ci.yml | 45 ++ .../rspec/before_all_role_assignment.yml | 1 - .../style/inline_disable_annotation.yml | 1 - .../ci_environments_dropdown.vue | 22 +- .../projects/planning_hierarchy/index.js | 3 - .../shared/work_item_link_child_contents.vue | 1 + .../work_items_hierarchy/components/app.vue | 101 --- .../components/hierarchy.vue | 119 --- .../work_items_hierarchy/constants.js | 62 -- .../work_items_hierarchy/hierarchy_util.js | 11 - .../work_items_hierarchy/static_response.js | 142 ---- .../work_items_hierarchy_bundle.js | 26 - .../stylesheets/_page_specific_files.scss | 1 - app/assets/stylesheets/pages/hierarchy.scss | 15 - .../concerns/planning_hierarchy.rb | 15 - app/controllers/projects_controller.rb | 2 - app/controllers/sessions_controller.rb | 4 +- app/policies/project_policy.rb | 2 - app/services/ml/create_model_service.rb | 13 + app/services/ml/destroy_model_service.rb | 14 + ...obtain_lets_encrypt_certificate_service.rb | 24 +- app/views/shared/planning_hierarchy.html.haml | 5 - .../audit_events/types/ml_model_created.yml | 9 + .../audit_events/types/ml_model_destroyed.yml | 9 + .../new_broadcast_message_dismissal.yml | 9 - config/routes/project.rb | 2 - .../index.md | 322 +------- doc/ci/secrets/hashicorp_vault.md | 355 +++++++++ doc/ci/secrets/index.md | 8 +- doc/subscriptions/self_managed/index.md | 2 +- doc/topics/plan_and_track.md | 3 +- .../policies/pipeline_execution_policies.md | 6 +- doc/user/compliance/audit_event_types.md | 2 + doc/user/group/epics/index.md | 2 - .../epic-view-ancestors-in-sidebar_v14_6.png | Bin 5010 -> 0 bytes .../img/hierarchy_with_multi_level_epics.png | Bin 9342 -> 0 bytes ...ssue-view-parent-epic-in-sidebar_v14_6.png | Bin 4994 -> 0 bytes doc/user/group/planning_hierarchy/index.md | 81 +- lib/gitlab/search/sort_options.rb | 4 +- locale/gitlab.pot | 46 +- package.json | 4 +- spec/controllers/sessions_controller_spec.rb | 55 +- .../ci_environments_dropdown_spec.js | 31 +- .../components/app_spec.js | 57 -- .../components/hierarchy_spec.js | 113 --- .../hierarchy_util_spec.js | 16 - .../concerns/planning_hierarchy_spec.rb | 22 - spec/services/ml/create_model_service_spec.rb | 37 +- .../services/ml/destroy_model_service_spec.rb | 22 +- ...n_lets_encrypt_certificate_service_spec.rb | 11 + spec/support/rspec_order_todo.yml | 1 - .../policies/project_policy_shared_context.rb | 2 +- .../project_search_results_shared_examples.rb | 8 +- yarn.lock | 694 ++++++++++-------- 55 files changed, 992 insertions(+), 1571 deletions(-) delete mode 100644 app/assets/javascripts/pages/projects/planning_hierarchy/index.js delete mode 100644 app/assets/javascripts/work_items_hierarchy/components/app.vue delete mode 100644 app/assets/javascripts/work_items_hierarchy/components/hierarchy.vue delete mode 100644 app/assets/javascripts/work_items_hierarchy/constants.js delete mode 100644 app/assets/javascripts/work_items_hierarchy/hierarchy_util.js delete mode 100644 app/assets/javascripts/work_items_hierarchy/static_response.js delete mode 100644 app/assets/javascripts/work_items_hierarchy/work_items_hierarchy_bundle.js delete mode 100644 app/assets/stylesheets/pages/hierarchy.scss delete mode 100644 app/controllers/concerns/planning_hierarchy.rb delete mode 100644 app/views/shared/planning_hierarchy.html.haml create mode 100644 config/audit_events/types/ml_model_created.yml create mode 100644 config/audit_events/types/ml_model_destroyed.yml delete mode 100644 config/feature_flags/gitlab_com_derisk/new_broadcast_message_dismissal.yml create mode 100644 doc/ci/secrets/hashicorp_vault.md delete mode 100644 doc/user/group/planning_hierarchy/img/epic-view-ancestors-in-sidebar_v14_6.png delete mode 100644 doc/user/group/planning_hierarchy/img/hierarchy_with_multi_level_epics.png delete mode 100644 doc/user/group/planning_hierarchy/img/issue-view-parent-epic-in-sidebar_v14_6.png delete mode 100644 spec/frontend/work_items_hierarchy/components/app_spec.js delete mode 100644 spec/frontend/work_items_hierarchy/components/hierarchy_spec.js delete mode 100644 spec/frontend/work_items_hierarchy/hierarchy_util_spec.js delete mode 100644 spec/requests/concerns/planning_hierarchy_spec.rb diff --git a/.gitlab/ci/docs.gitlab-ci.yml b/.gitlab/ci/docs.gitlab-ci.yml index edd3b2d849f..10d4a17c045 100644 --- a/.gitlab/ci/docs.gitlab-ci.yml +++ b/.gitlab/ci/docs.gitlab-ci.yml @@ -52,6 +52,7 @@ docs-lint markdown: stage: lint needs: [] script: + - apk add libuuid - source ./scripts/utils.sh - yarn_install_script - install_gitlab_gem diff --git a/.gitlab/ci/test-on-omnibus/main.gitlab-ci.yml b/.gitlab/ci/test-on-omnibus/main.gitlab-ci.yml index fbb7b86dafb..24131207924 100644 --- a/.gitlab/ci/test-on-omnibus/main.gitlab-ci.yml +++ b/.gitlab/ci/test-on-omnibus/main.gitlab-ci.yml @@ -185,6 +185,51 @@ gitaly-transactions-selective-parallel: variables: QA_TESTS: "" +# ========== gitaly reftables backend =========== +# Verifies that E2E tests that interact with the gitaly backend work when the reftables backend is in use +# https://about.gitlab.com/blog/2024/05/30/a-beginners-guide-to-the-git-reftable-format/ +# https://gitlab.com/groups/gitlab-org/-/epics/14946 +gitaly-reftables-backend: + extends: + - .parallel + - .qa + parallel: 2 + variables: + QA_SCENARIO: Test::Integration::Praefect + QA_CAN_TEST_PRAEFECT: "true" + KNAPSACK_TEST_FILE_PATTERN: "qa/specs/features/**/3_create/**/*_spec.rb" + QA_FEATURE_FLAGS: "gitaly_new_repo_reftable_backend=enabled" + rules: + - !reference [.rules:test:qa-parallel, rules] + - if: $QA_SUITES =~ /Test::Instance::All/ + +gitaly-reftables-backend-selective: + extends: .qa + variables: + QA_SCENARIO: Test::Integration::Praefect + QA_CAN_TEST_PRAEFECT: "true" + QA_FEATURE_FLAGS: "gitaly_new_repo_reftable_backend=enabled" + rules: + - !reference [.rules:test:qa-selective, rules] + - if: $QA_SUITES =~ /Test::Instance::All/ + +gitaly-reftables-enabled-backend-parallel: + extends: + - .qa + - .parallel + parallel: 2 + variables: + QA_SCENARIO: Test::Integration::Praefect + QA_CAN_TEST_PRAEFECT: "true" + QA_GIT_DEFAULT_REF_FORMAT: 'reftable' + KNAPSACK_TEST_FILE_PATTERN: "qa/specs/features/**/3_create/**/*_spec.rb" + QA_FEATURE_FLAGS: "gitaly_new_repo_reftable_backend=enabled" + rules: + - !reference [.rules:test:qa-selective-parallel, rules] + - if: $QA_SUITES =~ /Test::Instance::All/ + variables: + QA_TESTS: "" + # ========== git sha256 enabled =========== git-sha256-repositories: when: manual diff --git a/.rubocop_todo/rspec/before_all_role_assignment.yml b/.rubocop_todo/rspec/before_all_role_assignment.yml index 5232f2e12cc..118ca600071 100644 --- a/.rubocop_todo/rspec/before_all_role_assignment.yml +++ b/.rubocop_todo/rspec/before_all_role_assignment.yml @@ -1173,7 +1173,6 @@ RSpec/BeforeAllRoleAssignment: - 'spec/requests/api/rubygem_packages_spec.rb' - 'spec/requests/api/search_spec.rb' - 'spec/requests/api/wikis_spec.rb' - - 'spec/requests/concerns/planning_hierarchy_spec.rb' - 'spec/requests/groups/deploy_tokens_controller_spec.rb' - 'spec/requests/groups/settings/access_tokens_controller_spec.rb' - 'spec/requests/groups/settings/applications_controller_spec.rb' diff --git a/.rubocop_todo/style/inline_disable_annotation.yml b/.rubocop_todo/style/inline_disable_annotation.yml index 7d607cd90c6..3cd42f2a66a 100644 --- a/.rubocop_todo/style/inline_disable_annotation.yml +++ b/.rubocop_todo/style/inline_disable_annotation.yml @@ -41,7 +41,6 @@ Style/InlineDisableAnnotation: - 'app/controllers/concerns/membership_actions.rb' - 'app/controllers/concerns/milestone_actions.rb' - 'app/controllers/concerns/notes_actions.rb' - - 'app/controllers/concerns/planning_hierarchy.rb' - 'app/controllers/concerns/preferred_language_switcher.rb' - 'app/controllers/concerns/preview_markdown.rb' - 'app/controllers/concerns/registry/connection_errors_handler.rb' diff --git a/app/assets/javascripts/ci/ci_environments_dropdown/ci_environments_dropdown.vue b/app/assets/javascripts/ci/ci_environments_dropdown/ci_environments_dropdown.vue index ab0c6cec34e..0b2d8ad986c 100644 --- a/app/assets/javascripts/ci/ci_environments_dropdown/ci_environments_dropdown.vue +++ b/app/assets/javascripts/ci/ci_environments_dropdown/ci_environments_dropdown.vue @@ -1,6 +1,6 @@ - - diff --git a/app/assets/javascripts/work_items_hierarchy/components/hierarchy.vue b/app/assets/javascripts/work_items_hierarchy/components/hierarchy.vue deleted file mode 100644 index 72769951274..00000000000 --- a/app/assets/javascripts/work_items_hierarchy/components/hierarchy.vue +++ /dev/null @@ -1,119 +0,0 @@ - - - diff --git a/app/assets/javascripts/work_items_hierarchy/constants.js b/app/assets/javascripts/work_items_hierarchy/constants.js deleted file mode 100644 index b4dcd2fd24b..00000000000 --- a/app/assets/javascripts/work_items_hierarchy/constants.js +++ /dev/null @@ -1,62 +0,0 @@ -import { __ } from '~/locale'; - -export const WORK_ITEMS_SURVEY_COOKIE_NAME = 'hide_work_items_hierarchy_survey'; - -/** - * Hard-coded strings since we're rendering hierarchy - * items from mock responses. Remove this when we - * have a real hierarchy endpoint. - */ -export const LICENSE_PLAN = { - FREE: 'free', - PREMIUM: 'premium', - ULTIMATE: 'ultimate', -}; - -export const workItemTypes = { - EPIC: { - title: __('Epic'), - icon: 'epic', - color: '#694CC0', - backgroundColor: '#E1D8F9', - }, - ISSUE: { - title: __('Issue'), - icon: 'issues', - color: '#1068BF', - backgroundColor: '#CBE2F9', - }, - TASK: { - title: __('Task'), - icon: 'todo-done', - color: '#217645', - backgroundColor: '#C3E6CD', - isWorkItem: true, - }, - INCIDENT: { - title: __('Incident'), - icon: 'issue-type-incident', - backgroundColor: '#db2a0f', - color: '#FDD4CD', - iconSize: 16, - }, - SUB_EPIC: { - title: __('Child epic'), - icon: 'epic', - color: '#AB6100', - backgroundColor: '#F5D9A8', - }, - REQUIREMENT: { - title: __('Requirement'), - icon: 'requirements', - color: '#0068c5', - backgroundColor: '#c5e3fb', - }, - TEST_CASE: { - title: __('Test case'), - icon: 'issue-type-test-case', - backgroundColor: '#007a3f', - color: '#bae8cb', - iconSize: 16, - }, -}; diff --git a/app/assets/javascripts/work_items_hierarchy/hierarchy_util.js b/app/assets/javascripts/work_items_hierarchy/hierarchy_util.js deleted file mode 100644 index 57f4783955c..00000000000 --- a/app/assets/javascripts/work_items_hierarchy/hierarchy_util.js +++ /dev/null @@ -1,11 +0,0 @@ -import { LICENSE_PLAN } from './constants'; - -export function inferLicensePlan({ hasSubEpics, hasEpics }) { - if (hasSubEpics) { - return LICENSE_PLAN.ULTIMATE; - } - if (hasEpics) { - return LICENSE_PLAN.PREMIUM; - } - return LICENSE_PLAN.FREE; -} diff --git a/app/assets/javascripts/work_items_hierarchy/static_response.js b/app/assets/javascripts/work_items_hierarchy/static_response.js deleted file mode 100644 index d1e2e486082..00000000000 --- a/app/assets/javascripts/work_items_hierarchy/static_response.js +++ /dev/null @@ -1,142 +0,0 @@ -const FREE_TIER = 'free'; -const ULTIMATE_TIER = 'ultimate'; -const PREMIUM_TIER = 'premium'; - -const RESPONSE = { - [FREE_TIER]: [ - { - id: '1', - type: 'ISSUE', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '2', - type: 'TASK', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '3', - type: 'INCIDENT', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '4', - type: 'EPIC', - available: false, - license: 'Premium', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - { - id: '5', - type: 'SUB_EPIC', - available: false, - license: 'Ultimate', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - { - id: '6', - type: 'REQUIREMENT', - available: false, - license: 'Ultimate', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - { - id: '7', - type: 'TEST_CASE', - available: false, - license: 'Ultimate', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - ], - - [PREMIUM_TIER]: [ - { - id: '1', - type: 'EPIC', - available: true, - license: null, - nestedTypes: ['ISSUE'], - }, - { - id: '2', - type: 'TASK', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '3', - type: 'INCIDENT', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '5', - type: 'SUB_EPIC', - available: false, - license: 'Ultimate', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - { - id: '6', - type: 'REQUIREMENT', - available: false, - license: 'Ultimate', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - { - id: '7', - type: 'TEST_CASE', - available: false, - license: 'Ultimate', // eslint-disable-line @gitlab/require-i18n-strings - nestedTypes: null, - }, - ], - - [ULTIMATE_TIER]: [ - { - id: '1', - type: 'EPIC', - available: true, - license: null, - nestedTypes: ['SUB_EPIC', 'ISSUE'], - }, - { - id: '2', - type: 'TASK', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '3', - type: 'INCIDENT', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '6', - type: 'REQUIREMENT', - available: true, - license: null, - nestedTypes: null, - }, - { - id: '7', - type: 'TEST_CASE', - available: true, - license: null, - nestedTypes: null, - }, - ], -}; - -export default RESPONSE; diff --git a/app/assets/javascripts/work_items_hierarchy/work_items_hierarchy_bundle.js b/app/assets/javascripts/work_items_hierarchy/work_items_hierarchy_bundle.js deleted file mode 100644 index 2258c725301..00000000000 --- a/app/assets/javascripts/work_items_hierarchy/work_items_hierarchy_bundle.js +++ /dev/null @@ -1,26 +0,0 @@ -import Vue from 'vue'; -import { parseBoolean } from '~/lib/utils/common_utils'; -import App from './components/app.vue'; -import { inferLicensePlan } from './hierarchy_util'; - -export const initWorkItemsHierarchy = () => { - const el = document.querySelector('#js-work-items-hierarchy'); - - const { illustrationPath, hasEpics, hasSubEpics } = el.dataset; - - const licensePlan = inferLicensePlan({ - hasEpics: parseBoolean(hasEpics), - hasSubEpics: parseBoolean(hasSubEpics), - }); - - return new Vue({ - el, - provide: { - illustrationPath, - licensePlan, - }, - render(createElement) { - return createElement(App); - }, - }); -}; diff --git a/app/assets/stylesheets/_page_specific_files.scss b/app/assets/stylesheets/_page_specific_files.scss index 0a1cc2f90a4..41013a59a52 100644 --- a/app/assets/stylesheets/_page_specific_files.scss +++ b/app/assets/stylesheets/_page_specific_files.scss @@ -2,7 +2,6 @@ @import './pages/commits'; @import './pages/events'; @import './pages/groups'; -@import './pages/hierarchy'; @import './pages/issues'; @import './pages/note_form'; @import './pages/notes'; diff --git a/app/assets/stylesheets/pages/hierarchy.scss b/app/assets/stylesheets/pages/hierarchy.scss deleted file mode 100644 index 0812e4cc41e..00000000000 --- a/app/assets/stylesheets/pages/hierarchy.scss +++ /dev/null @@ -1,15 +0,0 @@ -.hierarchy-rounded-arrow-tail { - position: absolute; - top: 4px; - left: 5px; - height: calc(100% - 20px); -} - -.hierarchy-icon-wrapper { - height: $default-icon-size; - width: $default-icon-size; -} - -.hierarchy-rounded-arrow { - transform: scale(1, -1) rotate(90deg); -} diff --git a/app/controllers/concerns/planning_hierarchy.rb b/app/controllers/concerns/planning_hierarchy.rb deleted file mode 100644 index 51999a87e26..00000000000 --- a/app/controllers/concerns/planning_hierarchy.rb +++ /dev/null @@ -1,15 +0,0 @@ -# frozen_string_literal: true - -module PlanningHierarchy - extend ActiveSupport::Concern - - # rubocop:disable Gitlab/ModuleWithInstanceVariables - def planning_hierarchy - return access_denied! unless can?(current_user, :read_planning_hierarchy, @project) - - route_not_found - end - # rubocop:enable Gitlab/ModuleWithInstanceVariables -end - -PlanningHierarchy.prepend_mod_with('PlanningHierarchy') diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 7943101058d..6b839cb8156 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -9,7 +9,6 @@ class ProjectsController < Projects::ApplicationController include ImportUrlParams include FiltersEvents include SourcegraphDecorator - include PlanningHierarchy REFS_LIMIT = 100 @@ -66,7 +65,6 @@ class ProjectsController < Projects::ApplicationController feature_category :team_planning, [:preview_markdown, :new_issuable_address] feature_category :importers, [:export, :remove_export, :generate_new_export, :download_export] feature_category :code_review_workflow, [:unfoldered_environment_names] - feature_category :portfolio_management, [:planning_hierarchy] urgency :low, [:export, :remove_export, :generate_new_export, :download_export] urgency :low, [:preview_markdown, :new_issuable_address] diff --git a/app/controllers/sessions_controller.rb b/app/controllers/sessions_controller.rb index b28b8360bd6..73a2882b3e7 100644 --- a/app/controllers/sessions_controller.rb +++ b/app/controllers/sessions_controller.rb @@ -80,9 +80,7 @@ class SessionsController < Devise::SessionsController accept_pending_invitations - if Feature.enabled?(:new_broadcast_message_dismissal, current_user, type: :gitlab_com_derisk) - synchronize_broadcast_message_dismissals - end + synchronize_broadcast_message_dismissals log_audit_event(current_user, resource, with: authentication_method) log_user_activity(current_user) diff --git a/app/policies/project_policy.rb b/app/policies/project_policy.rb index 74f00e02f38..1d335092d25 100644 --- a/app/policies/project_policy.rb +++ b/app/policies/project_policy.rb @@ -362,7 +362,6 @@ class ProjectPolicy < BasePolicy enable :read_wiki enable :read_issue enable :read_label - enable :read_planning_hierarchy enable :read_milestone enable :read_snippet enable :read_project_member @@ -791,7 +790,6 @@ class ProjectPolicy < BasePolicy enable :read_issue_board_list enable :read_wiki enable :read_label - enable :read_planning_hierarchy enable :read_milestone enable :read_snippet enable :read_project_member diff --git a/app/services/ml/create_model_service.rb b/app/services/ml/create_model_service.rb index 46035194a12..331441e5105 100644 --- a/app/services/ml/create_model_service.rb +++ b/app/services/ml/create_model_service.rb @@ -35,6 +35,7 @@ module Ml ) add_metadata(model, @metadata) + audit_creation_event(model) success(model) end @@ -69,5 +70,17 @@ module Ml def experiment_name Ml::Model.prefixed_experiment(@name) end + + def audit_creation_event(model) + audit_context = { + name: 'ml_model_created', + author: @user, + scope: @project, + target: model, + message: "MlModel #{model.name} created" + } + + ::Gitlab::Audit::Auditor.audit(audit_context) + end end end diff --git a/app/services/ml/destroy_model_service.rb b/app/services/ml/destroy_model_service.rb index f2a33d58cd8..1ff9e08e6b1 100644 --- a/app/services/ml/destroy_model_service.rb +++ b/app/services/ml/destroy_model_service.rb @@ -17,6 +17,8 @@ module Ml return error unless @model.destroy + audit_destroy_event(@model) + success end @@ -37,5 +39,17 @@ module Ml def payload { model: @model } end + + def audit_destroy_event(model) + audit_context = { + name: 'ml_model_destroyed', + author: @user, + scope: model.project, + target: model, + message: "MlModel #{model.name} destroyed" + } + + ::Gitlab::Audit::Auditor.audit(audit_context) + end end end diff --git a/app/services/pages_domains/obtain_lets_encrypt_certificate_service.rb b/app/services/pages_domains/obtain_lets_encrypt_certificate_service.rb index 46dc463fa69..02221805b01 100644 --- a/app/services/pages_domains/obtain_lets_encrypt_certificate_service.rb +++ b/app/services/pages_domains/obtain_lets_encrypt_certificate_service.rb @@ -33,16 +33,20 @@ module PagesDomains api_order = ::Gitlab::LetsEncrypt::Client.new.load_order(acme_order.url) - # https://www.rfc-editor.org/rfc/rfc8555#section-7.1.6 - statuses diagram - case api_order.status - when 'ready' - api_order.request_certificate(private_key: acme_order.private_key, domain: pages_domain.domain) - PagesDomainSslRenewalWorker.perform_in(CERTIFICATE_PROCESSING_DELAY, pages_domain.id) - when 'valid' - save_certificate(acme_order.private_key, api_order) - acme_order.destroy! - when 'invalid' - save_order_error(acme_order, get_challenge_error(api_order)) + begin + # https://www.rfc-editor.org/rfc/rfc8555#section-7.1.6 - statuses diagram + case api_order.status + when 'ready' + api_order.request_certificate(private_key: acme_order.private_key, domain: pages_domain.domain) + PagesDomainSslRenewalWorker.perform_in(CERTIFICATE_PROCESSING_DELAY, pages_domain.id) + when 'valid' + save_certificate(acme_order.private_key, api_order) + acme_order.destroy! + when 'invalid' + save_order_error(acme_order, get_challenge_error(api_order)) + end + rescue Acme::Client::Error => e + save_order_error(acme_order, e.message) end end diff --git a/app/views/shared/planning_hierarchy.html.haml b/app/views/shared/planning_hierarchy.html.haml deleted file mode 100644 index 7ab5347b33d..00000000000 --- a/app/views/shared/planning_hierarchy.html.haml +++ /dev/null @@ -1,5 +0,0 @@ -- page_title _("Planning hierarchy") -- has_sub_epics = @project&.licensed_feature_available?(:subepics) -- has_epics = @project&.licensed_feature_available?(:epics) - -#js-work-items-hierarchy{ data: { has_sub_epics: has_sub_epics.to_s, has_epics: has_epics.to_s, illustration_path: image_path('illustrations/rocket-launch-md.svg') } } diff --git a/config/audit_events/types/ml_model_created.yml b/config/audit_events/types/ml_model_created.yml new file mode 100644 index 00000000000..c455c96bc03 --- /dev/null +++ b/config/audit_events/types/ml_model_created.yml @@ -0,0 +1,9 @@ +name: ml_model_created +description: ML model is created +introduced_by_issue: https://gitlab.com/gitlab-org/gitlab/-/issues/463215 +introduced_by_mr: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165011 +feature_category: mlops +milestone: '17.4' +saved_to_database: true +scope: [Project] +streamed: true diff --git a/config/audit_events/types/ml_model_destroyed.yml b/config/audit_events/types/ml_model_destroyed.yml new file mode 100644 index 00000000000..fb750103cf8 --- /dev/null +++ b/config/audit_events/types/ml_model_destroyed.yml @@ -0,0 +1,9 @@ +name: ml_model_destroyed +description: ML model destroyed +introduced_by_issue: https://gitlab.com/gitlab-org/gitlab/-/issues/463215 +introduced_by_mr: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165011 +feature_category: mlops +milestone: '17.4' +saved_to_database: true +scope: [Project] +streamed: true diff --git a/config/feature_flags/gitlab_com_derisk/new_broadcast_message_dismissal.yml b/config/feature_flags/gitlab_com_derisk/new_broadcast_message_dismissal.yml deleted file mode 100644 index 5868f07da68..00000000000 --- a/config/feature_flags/gitlab_com_derisk/new_broadcast_message_dismissal.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- -name: new_broadcast_message_dismissal -feature_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/438595 -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/151056 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/461564 -milestone: '17.1' -type: gitlab_com_derisk -group: group::activation -default_enabled: false diff --git a/config/routes/project.rb b/config/routes/project.rb index 7f1c6f6a237..21a647bc9e4 100644 --- a/config/routes/project.rb +++ b/config/routes/project.rb @@ -459,8 +459,6 @@ constraints(::Constraints::ProjectUrlConstrainer.new) do end end - get :planning_hierarchy - resources :badges, only: [] do collection do constraints format: /svg/ do diff --git a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md index 9bed4392938..a59d0f8e14f 100644 --- a/doc/ci/examples/authenticating-with-hashicorp-vault/index.md +++ b/doc/ci/examples/authenticating-with-hashicorp-vault/index.md @@ -1,319 +1,11 @@ --- -stage: Verify -group: Pipeline Security -info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments +redirect_to: '../../secrets/hashicorp_vault.md' +remove_date: '2024-12-05' --- -# Authenticating and reading secrets with HashiCorp Vault +This document was moved to [another location](../../secrets/hashicorp_vault.md). -DETAILS: -**Tier:** Premium, Ultimate -**Offering:** GitLab.com, Self-managed, GitLab Dedicated - -WARNING: -Authenticating with `CI_JOB_JWT` was [deprecated in GitLab 15.9](../../../update/deprecations.md#old-versions-of-json-web-tokens-are-deprecated) -and the token is scheduled to be removed in GitLab 17.0. Use -[ID tokens to authenticate with HashiCorp Vault](../../secrets/id_token_authentication.md#automatic-id-token-authentication-with-hashicorp-vault) -instead, as demonstrated on this page. - -NOTE: -Starting in Vault 1.17, [JWT auth login requires bound audiences on the role](https://developer.hashicorp.com/vault/docs/upgrading/upgrade-to-1.17.x#jwt-auth-login-requires-bound-audiences-on-the-role) -when the JWT contains an `aud` claim. The `aud` claim can be a single string or a list of strings. - -This tutorial demonstrates how to authenticate, configure, and read secrets with HashiCorp's Vault from GitLab CI/CD. - -## Prerequisites - -This tutorial assumes you are familiar with GitLab CI/CD and Vault. - -To follow along, you must have: - -- An account on GitLab. -- Access to a running Vault server (at least v1.2.0) to configure authentication and to create roles and policies. For HashiCorp Vaults, this can be the Open Source or Enterprise version. - -NOTE: -You must replace the `vault.example.com` URL below with the URL of your Vault server, and `gitlab.example.com` with the URL of your GitLab instance. - -## How it works - -ID tokens are JSON Web Tokens (JWTs) used for OIDC authentication with third-party services. If a job has at least one ID token defined, the `secrets` keyword automatically uses that token to authenticate with Vault. - -The following fields are included in the JWT: - -| Field | When | Description | -|-------------------------|------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `jti` | Always | Unique identifier for this token | -| `iss` | Always | Issuer, the domain of your GitLab instance | -| `iat` | Always | Issued at | -| `nbf` | Always | Not valid before | -| `exp` | Always | Expires at | -| `sub` | Always | Subject (job ID) | -| `namespace_id` | Always | Use this to scope to group or user level namespace by ID | -| `namespace_path` | Always | Use this to scope to group or user level namespace by path | -| `project_id` | Always | Use this to scope to project by ID | -| `project_path` | Always | Use this to scope to project by path | -| `user_id` | Always | ID of the user executing the job | -| `user_login` | Always | Username of the user executing the job | -| `user_email` | Always | Email of the user executing the job | -| `pipeline_id` | Always | ID of this pipeline | -| `pipeline_source` | Always | [Pipeline source](../../jobs/job_rules.md#common-if-clauses-with-predefined-variables) | -| `job_id` | Always | ID of this job | -| `ref` | Always | Git ref for this job | -| `ref_type` | Always | Git ref type, either `branch` or `tag` | -| `ref_path` | Always | Fully qualified ref for the job. For example, `refs/heads/main`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119075) in GitLab 16.0. | -| `ref_protected` | Always | `true` if this Git ref is protected, `false` otherwise | -| `environment` | Job specifies an environment | Environment this job specifies | -| `groups_direct` | User is a direct member of 0 to 200 groups | The paths of the user's direct membership groups. Omitted if the user is a direct member of more than 200 groups. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/435848) in GitLab 16.11). | -| `environment_protected` | Job specifies an environment | `true` if specified environment is protected, `false` otherwise | -| `deployment_tier` | Job specifies an environment | [Deployment tier](../../environments/index.md#deployment-tier-of-environments) of environment this job specifies ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363590) in GitLab 15.2) | -| `environment_action` | Job specifies an environment | [Environment action (`environment:action`)](../../environments/index.md) specified in the job. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/) in GitLab 16.5) | - -Example JWT payload: - -```json -{ - "jti": "c82eeb0c-5c6f-4a33-abf5-4c474b92b558", - "iss": "gitlab.example.com", - "iat": 1585710286, - "nbf": 1585798372, - "exp": 1585713886, - "sub": "job_1212", - "namespace_id": "1", - "namespace_path": "mygroup", - "project_id": "22", - "project_path": "mygroup/myproject", - "user_id": "42", - "user_login": "myuser", - "user_email": "myuser@example.com", - "pipeline_id": "1212", - "pipeline_source": "web", - "job_id": "1212", - "ref": "auto-deploy-2020-04-01", - "ref_type": "branch", - "ref_path": "refs/heads/auto-deploy-2020-04-01", - "ref_protected": "true", - "groups_direct": ["mygroup/mysubgroup", "myothergroup/myothersubgroup"], - "environment": "production", - "environment_protected": "true", - "environment_action": "start" -} -``` - -The JWT is encoded by using RS256 and signed with a dedicated private key. The expire time for the token is set to job's timeout, if specified, or 5 minutes if it is not. The key used to sign this token may change without any notice. In such case retrying the job generates new JWT using the current signing key. - -You can use this JWT for authentication with a Vault server that is configured to allow -the JWT authentication method. Provide your GitLab instance's base URL -(for example `https://gitlab.example.com`) to your Vault server as the `oidc_discovery_url`. -The server can then retrieve the keys for validating the token from your instance. - -When configuring roles in Vault, you can use [bound claims](https://developer.hashicorp.com/vault/docs/auth/jwt#bound-claims) to match against the JWT claims and restrict which secrets each CI/CD job has access to. - -To communicate with Vault, you can use either its CLI client or perform API requests (using `curl` or another client). - -## Example - -WARNING: -JWTs are credentials, which can grant access to resources. Be careful where you paste them! - -Let's say you have the passwords for your staging and production databases stored in a Vault server that is running on `http://vault.example.com:8200`. Your staging password is `pa$$w0rd` and your production password is `real-pa$$w0rd`. - -```shell -$ vault kv get -field=password secret/myproject/staging/db -pa$$w0rd - -$ vault kv get -field=password secret/myproject/production/db -real-pa$$w0rd -``` - -To configure your Vault server, start by enabling the [JWT Auth](https://developer.hashicorp.com/vault/docs/auth/jwt) method: - -```shell -$ vault auth enable jwt -Success! Enabled jwt auth method at: jwt/ -``` - -Then create policies that allow you to read these secrets (one for each secret): - -```shell -$ vault policy write myproject-staging - <. --> + + + diff --git a/doc/ci/secrets/hashicorp_vault.md b/doc/ci/secrets/hashicorp_vault.md new file mode 100644 index 00000000000..7b99d1c865e --- /dev/null +++ b/doc/ci/secrets/hashicorp_vault.md @@ -0,0 +1,355 @@ +--- +stage: Verify +group: Pipeline Security +info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments +--- + +# Use HashiCorp Vault secrets in GitLab CI/CD + +DETAILS: +**Tier:** Premium, Ultimate +**Offering:** GitLab.com, Self-managed, GitLab Dedicated + +WARNING: +Authenticating with `CI_JOB_JWT` was [deprecated in GitLab 15.9](../../update/deprecations.md#old-versions-of-json-web-tokens-are-deprecated) +and the token is scheduled to be removed in GitLab 18.0. Use +[ID tokens to authenticate with HashiCorp Vault](id_token_authentication.md#automatic-id-token-authentication-with-hashicorp-vault) +instead, as demonstrated on this page. + +NOTE: +Starting in Vault 1.17, [JWT auth login requires bound audiences on the role](https://developer.hashicorp.com/vault/docs/upgrading/upgrade-to-1.17.x#jwt-auth-login-requires-bound-audiences-on-the-role) +when the JWT contains an `aud` claim. The `aud` claim can be a single string or a list of strings. + +This tutorial demonstrates how to authenticate, configure, and read secrets with HashiCorp's Vault from GitLab CI/CD. + +## Prerequisites + +This tutorial assumes you are familiar with GitLab CI/CD and Vault. + +To follow along, you must have: + +- An account on GitLab. +- Access to a running Vault server (at least v1.2.0) to configure authentication and to create roles and policies. + For HashiCorp Vaults, this can be the Open Source or Enterprise version. + +NOTE: +You must replace the `vault.example.com` URL below with the URL of your Vault server, +and `gitlab.example.com` with the URL of your GitLab instance. + +## How it works + +ID tokens are JSON Web Tokens (JWTs) used for OIDC authentication with third-party services. +If a job has at least one ID token defined, the `secrets` keyword automatically uses that token +to authenticate with Vault. + +The following fields are included in the JWT: + +| Field | When | Description | +|-------------------------|--------------------------------------------|-------------| +| `jti` | Always | Unique identifier for this token | +| `iss` | Always | Issuer, the domain of your GitLab instance | +| `iat` | Always | Issued at | +| `nbf` | Always | Not valid before | +| `exp` | Always | Expires at | +| `sub` | Always | Subject (job ID) | +| `namespace_id` | Always | Use this to scope to group or user level namespace by ID | +| `namespace_path` | Always | Use this to scope to group or user level namespace by path | +| `project_id` | Always | Use this to scope to project by ID | +| `project_path` | Always | Use this to scope to project by path | +| `user_id` | Always | ID of the user executing the job | +| `user_login` | Always | Username of the user executing the job | +| `user_email` | Always | Email of the user executing the job | +| `pipeline_id` | Always | ID of this pipeline | +| `pipeline_source` | Always | [Pipeline source](../jobs/job_rules.md#common-if-clauses-with-predefined-variables) | +| `job_id` | Always | ID of this job | +| `ref` | Always | Git ref for this job | +| `ref_type` | Always | Git ref type, either `branch` or `tag` | +| `ref_path` | Always | Fully qualified ref for the job. For example, `refs/heads/main`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/119075) in GitLab 16.0. | +| `ref_protected` | Always | `true` if this Git ref is protected, `false` otherwise | +| `environment` | Job specifies an environment | Environment this job specifies | +| `groups_direct` | User is a direct member of 0 to 200 groups | The paths of the user's direct membership groups. Omitted if the user is a direct member of more than 200 groups. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/435848) in GitLab 16.11). | +| `environment_protected` | Job specifies an environment | `true` if specified environment is protected, `false` otherwise | +| `deployment_tier` | Job specifies an environment | [Deployment tier](../environments/index.md#deployment-tier-of-environments) of environment this job specifies ([introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/363590) in GitLab 15.2) | +| `environment_action` | Job specifies an environment | [Environment action (`environment:action`)](../environments/index.md) specified in the job. ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/) in GitLab 16.5) | + +Example JWT payload: + +```json +{ + "jti": "c82eeb0c-5c6f-4a33-abf5-4c474b92b558", + "iss": "gitlab.example.com", + "iat": 1585710286, + "nbf": 1585798372, + "exp": 1585713886, + "sub": "job_1212", + "namespace_id": "1", + "namespace_path": "mygroup", + "project_id": "22", + "project_path": "mygroup/myproject", + "user_id": "42", + "user_login": "myuser", + "user_email": "myuser@example.com", + "pipeline_id": "1212", + "pipeline_source": "web", + "job_id": "1212", + "ref": "auto-deploy-2020-04-01", + "ref_type": "branch", + "ref_path": "refs/heads/auto-deploy-2020-04-01", + "ref_protected": "true", + "groups_direct": ["mygroup/mysubgroup", "myothergroup/myothersubgroup"], + "environment": "production", + "environment_protected": "true", + "environment_action": "start" +} +``` + +The JWT is encoded by using RS256 and signed with a dedicated private key. The expire time +for the token is set to job's timeout, if specified, or 5 minutes if it is not. +The key used to sign this token may change without any notice. In such case retrying the job +generates new JWT using the current signing key. + +You can use this JWT for authentication with a Vault server that is configured to allow +the JWT authentication method. Provide your GitLab instance's base URL +(for example `https://gitlab.example.com`) to your Vault server as the `oidc_discovery_url`. +The server can then retrieve the keys for validating the token from your instance. + +When configuring roles in Vault, you can use [bound claims](https://developer.hashicorp.com/vault/docs/auth/jwt#bound-claims) +to match against the JWT claims and restrict which secrets each CI/CD job has access to. + +To communicate with Vault, you can use either its CLI client or perform API requests (using `curl` or another client). + +## Example + +WARNING: +JWTs are credentials, which can grant access to resources. Be careful where you paste them! + +Let's say you have the passwords for your staging and production databases stored in a Vault server +that is running on `http://vault.example.com:8200`. Your staging password is `pa$$w0rd` +and your production password is `real-pa$$w0rd`. + +```shell +$ vault kv get -field=password secret/myproject/staging/db +pa$$w0rd + +$ vault kv get -field=password secret/myproject/production/db +real-pa$$w0rd +``` + +To configure your Vault server, start by enabling the [JWT Auth](https://developer.hashicorp.com/vault/docs/auth/jwt) method: + +```shell +$ vault auth enable jwt +Success! Enabled jwt auth method at: jwt/ +``` + +Then create policies that allow you to read these secrets (one for each secret): + +```shell +$ vault policy write myproject-staging - <Tasks, bug reports, feature requests, tracking. | [**Issue boards**](../user/project/issue_board.md)
Visualization, workflow, Kanban, prioritization. | [**Comments and threads**](../user/discussions/index.md)
Mentions, locked discussions, internal notes, thread resolution. | | [**Tasks**](../user/tasks.md)
Task labels, confidential tasks, linked items, task weights. | [**Requirements**](../user/project/requirements/index.md)
Acceptance criteria, requirements test reports, CSV import. | [**Time tracking**](../user/project/time_tracking.md)
Estimates, time spent, reporting. | | [**CRM**](../user/crm/index.md)
Customer management, organizations, contacts, permissions. | [**Wikis**](../user/project/wiki/index.md)
Documentation, external wikis, wiki events, history. | [**Epics**](../user/group/epics/index.md)
Roadmaps, hierarchies, planning, issue progress. | -| [**Roadmaps**](../user/group/roadmap/index.md)
Epic progress, timelines, milestones, goals. | [**Planning hierarchies**](../user/group/planning_hierarchy/index.md)
Organization, structure, multi-level epics, nesting. | [**Objectives and key results**](../user/okrs.md)
Goal setting, performance tracking, child objectives, health status. | +| [**Roadmaps**](../user/group/roadmap/index.md)
Epic progress, timelines, milestones, goals. | [**Objectives and key results**](../user/okrs.md)
Goal setting, performance tracking, child objectives, health status. | [**To-Do List**](../user/todos.md)
Task management, actions, access changes. | | [**Keyboard shortcuts**](../user/shortcuts.md)
Global shortcuts, navigation, quick access. | [**Quick actions**](../user/project/quick_actions.md)
Commands, shortcuts, inline actions. | [**Markdown**](../user/markdown.md)
Formatting, inline HTML, GitLab-specific references, diagrams and flowcharts. | -| [**To-Do List**](../user/todos.md)
Task management, actions, access changes. | | | diff --git a/doc/user/application_security/policies/pipeline_execution_policies.md b/doc/user/application_security/policies/pipeline_execution_policies.md index 1dc8135638e..98c005f89fc 100644 --- a/doc/user/application_security/policies/pipeline_execution_policies.md +++ b/doc/user/application_security/policies/pipeline_execution_policies.md @@ -65,7 +65,11 @@ Note the following: ### Job naming best practice -> - Naming conflict handling was introduced in GitLab 17.4 with a flag named `pipeline_execution_policy_suffix`. Disabled by default. +> - Naming conflict handling [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/473189) in GitLab 17.4 with a flag named `pipeline_execution_policy_suffix`. Disabled by default. + +FLAG: +The availability of job naming conflict handling is controlled by a feature flag. +For more information, see the history. There is no visible indicator for jobs coming from a security policy. Adding a unique prefix or suffix to job names makes it easier to identify them and avoid job name collisions. diff --git a/doc/user/compliance/audit_event_types.md b/doc/user/compliance/audit_event_types.md index fe2e20c830f..42ca0fcd07b 100644 --- a/doc/user/compliance/audit_event_types.md +++ b/doc/user/compliance/audit_event_types.md @@ -379,6 +379,8 @@ Audit event types belong to the following product categories. | Name | Description | Saved to database | Streamed | Introduced in | Scope | |:------------|:------------|:------------------|:---------|:--------------|:--------------| | [`project_feature_model_experiments_access_level_updated`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/121027) | Model experiments access level was updated | **{check-circle}** Yes | **{check-circle}** Yes | GitLab [16.1](https://gitlab.com/gitlab-org/gitlab/-/issues/412384) | Project | +| [`ml_model_created`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165011) | ML model is created | **{check-circle}** Yes | **{check-circle}** Yes | GitLab [17.4](https://gitlab.com/gitlab-org/gitlab/-/issues/463215) | Project | +| [`ml_model_destroyed`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/165011) | ML model destroyed | **{check-circle}** Yes | **{check-circle}** Yes | GitLab [17.4](https://gitlab.com/gitlab-org/gitlab/-/issues/463215) | Project | | [`project_feature_model_registry_access_level_updated`](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/138399) | Model registry access level was updated | **{check-circle}** Yes | **{check-circle}** Yes | GitLab [16.7](https://gitlab.com/gitlab-org/gitlab/-/issues/412734) | Project | ### Not categorized diff --git a/doc/user/group/epics/index.md b/doc/user/group/epics/index.md index 460edbae905..7b13fe25c68 100644 --- a/doc/user/group/epics/index.md +++ b/doc/user/group/epics/index.md @@ -64,8 +64,6 @@ accDescr: How issues and child epics relate to parent epics Child_epic --> Issue2 ``` -Also, read more about possible [planning hierarchies](../planning_hierarchy/index.md). - ### Child issues from different group hierarchies > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/371081) in GitLab 15.5 [with a flag](../../../administration/feature_flags.md) named `epic_issues_from_different_hierarchies`. Disabled by default. diff --git a/doc/user/group/planning_hierarchy/img/epic-view-ancestors-in-sidebar_v14_6.png b/doc/user/group/planning_hierarchy/img/epic-view-ancestors-in-sidebar_v14_6.png deleted file mode 100644 index d4ba8acf9b9220d348abbb59ae8ec05e7a064efc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5010 zcmaJ_cTm$!w+>RJgGjF`ihzQOf;0gIlqS+b2~9vsKsu2sU5X%GqyZQ9Q%_w51Pt)5knozWmVxTg(UGjIEOW$D zO-;?;zkg3nO(`oYpDUe{iln6E`ue(>n%c<7$l>8(VPRo>eEh+|fw8f1XlQ6aK!A&j z%lPC;9)YSd`{pX*(Tc!u1n)6Ie zO@o4hBqStqb8|5m%+}V{z`($tKYzY||6Wi~(AL(ry}cb05@KUx>E-x?7 z&d$Q&@SL2Sva&KKC#S~7#-5&@&d$z=hzJM-;^*hr+uJ)iIqBu)m7JVBH#aviF;QAt zibNuDI2;;{?&#%*KYr}%>&wc@YG`P{F@8Ko}R9)tzBPV9~Bj4VPR2GQQ_$5 zSX*1Gudo09{d;e3Z<|Fq(%E2n^6ZJS!JEmo=|A90J?x;lsUIW6X>r@D;jc9FlM?D3qDoTLNdZxjM|@)fnI7M@J=onqe(=@h`9cIwoJ)D9PG5D+0V= zW5uCOXT#m(F$WZ=Br%j;f*46q{wwTQhPiB|+5dW7TDEsOS#tX=N6*PLUc<)y3-kLm z6V?GiCbSQ2-yHgGr6W*tIVzpLF>_88+j5!r1vp8V_zLOE)g01)RAT>VbFFrN&HYsI z`+QBk2jLO{t^*=g%I zi4x2geC#hFu@zeS!rg9Su)5+_ykRAjShjY&3NX6lZ9i%y9>6Q-(OZ^6;+`gVl=0x4LxqIOcE2J5~ zF;61J`d$-QuY3d}xSOY`C-9S;XAOZ@PAD+At80g85^sI6cjZg5)!lc!aw#{3nwp-UH96cVX3Ojw~Zf>XRBaKhFK{<5$>bQ67y$!!;)B{=?n>AP|#a2N8n|xu) zn*XsITkhrOcKx2pia!ahxVH#>V>_V#oW^o0Yx$?Z^0&frhoxl`5iGn|94gSaW_s4J zbw3k^$i&JUy|CBkEX?Jbh3__K7XRejVLy$6haFm%( za+kwa!F;3Q;_L29_3!xSl^Y(Dl_B+5EE_3am?*-utpFA;FN1FXJkWD~E$dyan~LRB zc?^+=rUtOvQWZ2*U(_248hr^xj^}i8Z*X@!o7rr5IZ9shhI>wzhCe17B=m7O4^+=2 z#tt*i`XG6%%jwX|w=2C7 zqi%d-rc#9}&1N2bdyJIzg!?%}DI>WTEAG0ql=7dyb-6`MoE_gYPMrdr6q+^5^lqe^ zuQvbzwwZtUlF##SeyRqK{JE}*+l)HojzLm$XzYyn)DsV6M8YpfPg!ZB*{xgeWKRK9 z&Pu1%otNV`U;b(ZY-{UnzhNwwu?+{;ubJNoj=ft3GjC-NRxjh`z5TC9&y`m8_YXk$BTKqPX6#8sjG?T(hB4X??&@@|@j+&7450&#Q&Q z+x*i7E3QKsF2k?SY;HlPR>LOu#|3T8hWt4^gu%3=>QNvFCW)Bmc_(xo{-KbbRLITl z`(oxRL37jpXe2i3U7%E{;1cTY)c?_^lFa@UdYh+A_3Y6hmvCM0C4){FQ9&6{5aOgw zT~ALPfG;@J@vADDBt9^vQ8H6WN7Bw^9mMv?D1A{W;tWxIf-r`!E&wtUDMPH?-sD(0 zWPjUo)G!rYh;WwT&p5gSw*6mhIx1YU13B#>foIWCs_@nJ$X18EG$nus8L6k+O-(;U zP4~%{l9_2ecH2bYibJ#{e!JvV0sl~;ECP4;x&Ec@`}6$yZ-O>%l#vBiCJ4eiDGrfz zH|x+K`?_bX1&`6AM}~i$+Jkl}Jo=IEgaX|-Ts9-j1CB1R-xyMmIoxdFJ&e)NeQgNY zE7oyFW=a%YT*z=|DsCiYHP%`8sA?SiE;7r3*XHkaOu*&l`vcZ;twpvrH7&DOpSX{a zmjA)X&Bj$I<%(p-Ev&>E)8E{BV!>A{j`z^KYL;DV1Y6b576JS&pk7TXvxq*nmQQ=x zX(hD7N*f1C^YejvUyz+HdN2I)5<&z1kHbA1821m+evjB~oB^@mWv^?BZ^@-)`0n-C z88qp^|G$qup-|1QGj9B@P3F$$Mp-=v)4xfN>===9o!Nj&rlvYB+w4b;hT7hq<~M#s z&)3&pNX1oj&gs|7T4N?bECV9MAq=}gceeMurM=H?zxy=eG}E<~_&t4Bx@-s{&|Ph3 zKA!eyqyEDO!D#}8gi+`ct!@??fEZq^UNes1%QfPEYH+y(V26-J*>rJZt6nS16T_YE zFb*XKqw$|<^Uy8n32mN(LOm7QfMhH+{wyU>47p)z=S}^?4lXxh2Hv`*RP^zdBOtL! zb37&G>QmEq`7!k-SJt9u7S^~Wa>TZH$W^Nw*W$lEf7rS}8zw?CXf1~1Ui4a)p3=_z zl&f#7g;rEKvp~kFIjci!qYP26W1MhHW+)8)QX?o$m2 zcL}X$ybEBxOSn^A+94WogJvV7vw-TFhM-Xip^#{!6F8*X4hWo;`M4NWQy{*jk?_lqJ75JH*hAYAx@~{oeJCxkA7Y-m6TJT0w~k(7 zY0AI!jwIR)#oo(f+I!B~b^*e3TS*b?Leet+SDXI!<32g%P9$^l7pIJ@((|BRzWN(T zoylP$#?4v9oiC^I{BGvX*PMgKL7o21p#0b4RfENY*LKs--$+uaw#8mADq3scn|4O& zmsxiz{7KB)W0Xx6AENW^olROYm2ssBNuWV_AtbU0mz_7XznBVz_axptp*O5um<(-9 zv^9{nS09wS^nGXxt0b! zkPNJiZpz|abanK+l_X6sK2AxdW_%;Q4xjX!dBY9BkZ(>z62{tEO-qv0<8wZ`duU(O zDbTjHSuojX?Kct2!gREfq82$0vCMbhq}tfNA4M%~79fCKdM9(7P=z|6 za`P9Qdd9Y&s~HCfgAW6@=0z=f4bRe~urD8eZqA=oZ0F%x_PgMJ$PmrJ%zc5S=j^fj zx(d|ENwmDvf)s4s&6#uyRnGH3jjq{&pEK=S^Z*K{dg&wy;=)#{K*7@Iw%*)6?}te# zJh^2Dba=Rjs1|+T2j+>67)xiuZ48;vgWg#YDE3t8rH1popGa?Rn{aYUwT#~s{U zL$TRT<%x4l1P31=6daQLa&W14PIhizg;!!x^es#b%fI0NX5ez#be)1VI`W`m1zRWS zaD;s)!&<6`D5F=9peh}l(;V2doq~@W@)1n!yseN+5ghlBwEo1wH|LW~Yj#vvuB;gj zJj64l3H?m~WL$lUxd)8^4>DJb#{~FrySuP0QDS`^4(`~Dd+%a!UYv-Y!D1~T{*__q zR0X;-6xR`a$slEa#^yzP+vm;K$%J9q_JiRL$fD~r&uNR9%9bY;Ri5GNr@mbPP7uS| zMUAOpU{Boadu1w!5y6UJiB8=pU&sd|()tDR14o^{kBe7~AbtKbi#*E=;N5)_ImpJ2 zNs9EZVqcD4o)OH0|A&G9!cA<|lBr3K>U!!C8D2y6FM$iL00n)iB~MxYa=17OTI}90 z%FPr|6ZMzd2LB~DiSe4qP8$X@#bQa;B?(q69zvbTycKsY_FN<@r1fc$mr zIBNQ=>IatWCUu}2^lI!O z6Q=RvX1pDN(rgnPRkz22y#Wh-qv=jEUndXWl$C+lJA1==48IY7UpsU?9A~NC3r&4s z2Iu(_q%=C@+hK^NtYOlX%ap=W8&QGt*faz2d>tzs7r&3wsc3&;{H)%WMQ~6_=b9CH z)p^SyAUFg1v^C(`wSqC87(yj8`@lHOy$$+T1WNQ9j=4nBhN{;UbmO}X)xUon-&$ms zQdH_Nlp%kp_3`*5`I1rHjO+SAxXE)~u#Ff!DUK#w`I$unDa8hW`%fO^#v|XG4IP3w zu7Pp%Y-+8A0h~1f%H0^pbr;fgGecpOvM?TemkXPZiYeI{XTaXVNu7Ptb8a z6k7gmNPg4xt^auag83=hHKC?@=XU2Uq+!qgvmNrOrTQxE1N;6wBfQ2=_&+y$efbfG YUSwadq&)8v(x)2enX1kcK*cKbKO&wcG5`Po diff --git a/doc/user/group/planning_hierarchy/img/hierarchy_with_multi_level_epics.png b/doc/user/group/planning_hierarchy/img/hierarchy_with_multi_level_epics.png deleted file mode 100644 index d264ebf10d744048986184f65dc44c85812e6593..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9342 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 diff --git a/doc/user/group/planning_hierarchy/img/issue-view-parent-epic-in-sidebar_v14_6.png b/doc/user/group/planning_hierarchy/img/issue-view-parent-epic-in-sidebar_v14_6.png deleted file mode 100644 index f3b6a80ea661b534eed60f99500bd05759a4664c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4994 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 ruLc)9^lvV Project1_Issue1 - Group_epic --> Project1_Issue2 - Group_epic --> Project2_Issue1 -``` - -### Hierarchies with multi-level epics - -DETAILS: -**Tier:** Ultimate -**Offering:** GitLab.com, Self-managed, GitLab Dedicated - -With the addition of [multi-level epics](../epics/manage_epics.md#multi-level-child-epics) and up to -seven levels of nested epics, you can achieve the following hierarchy: - - - -![Diagram showing possible relationships of multi-level epics](img/hierarchy_with_multi_level_epics.png) - -## View ancestry of an issue - -In an issue, you can view the parented epic above the issue in the right sidebar under **Epic**. - -![epics state dropdown list](img/issue-view-parent-epic-in-sidebar_v14_6.png) - -## View ancestry of an epic - -In an epic, you can view the ancestors as parents in the right sidebar under **Ancestors**. - -![epics state dropdown list](img/epic-view-ancestors-in-sidebar_v14_6.png) + + + + diff --git a/lib/gitlab/search/sort_options.rb b/lib/gitlab/search/sort_options.rb index 083c03db880..31c374f6a78 100644 --- a/lib/gitlab/search/sort_options.rb +++ b/lib/gitlab/search/sort_options.rb @@ -9,8 +9,8 @@ module Gitlab }.freeze DOC_TYPE_ONLY_SORT = { - popularity_asc: %w[issue], - popularity_desc: %w[issue] + popularity_asc: %w[issue work_item], + popularity_desc: %w[issue work_item] }.freeze def sort_and_direction(order_by, sort) diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 237ef139be7..6f05bf41f11 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -11408,9 +11408,6 @@ msgstr "" msgid "Child" msgstr "" -msgid "Child epic" -msgstr "" - msgid "Child issues and epics" msgstr "" @@ -11935,10 +11932,10 @@ msgstr "" msgid "CiVariable|Define a CI/CD variable in the UI" msgstr "" -msgid "CiVariable|GitLab CI/CD supports OpenID Connect (OIDC) to give your build and deployment jobs access to cloud credentials and services. %{linkStart}How do I configure OIDC for my cloud provider?%{linkEnd}" +msgid "CiVariable|Enter a search query to find more environments, or use * to create a wildcard." msgstr "" -msgid "CiVariable|Maximum of %{limit} environments listed. For more environments, enter a search query." +msgid "CiVariable|GitLab CI/CD supports OpenID Connect (OIDC) to give your build and deployment jobs access to cloud credentials and services. %{linkStart}How do I configure OIDC for my cloud provider?%{linkEnd}" msgstr "" msgid "CiVariable|New environment" @@ -20937,6 +20934,9 @@ msgstr "" msgid "Enter a number from 0 to 100." msgstr "" +msgid "Enter a search query to find more branches, or use * to create a wildcard." +msgstr "" + msgid "Enter a valid URL" msgstr "" @@ -27075,39 +27075,12 @@ msgstr "" msgid "Hide values" msgstr "" -msgid "Hierarchy|Current structure" -msgstr "" - -msgid "Hierarchy|Deliver value more efficiently by breaking down necessary work into a hierarchical structure. This structure helps teams understand scope, priorities, and how work cascades up toward larger goals." -msgstr "" - -msgid "Hierarchy|Help us improve work items in GitLab!" -msgstr "" - -msgid "Hierarchy|Is there a framework or type of work item you wish you had access to in GitLab? Give us your feedback and help us build the experiences valuable to you." -msgstr "" - -msgid "Hierarchy|Planning hierarchy" -msgstr "" - msgid "Hierarchy|Something went wrong while fetching ancestors." msgstr "" msgid "Hierarchy|Something went wrong while fetching children." msgstr "" -msgid "Hierarchy|Take the work items survey" -msgstr "" - -msgid "Hierarchy|These items are unavailable in the current structure." -msgstr "" - -msgid "Hierarchy|Unavailable structure" -msgstr "" - -msgid "Hierarchy|You can start using these items now." -msgstr "" - msgid "High - S2" msgstr "" @@ -32908,9 +32881,6 @@ msgstr "" msgid "Maximum number of variables loaded (2000)" msgstr "" -msgid "Maximum of %{limit} branches listed. For more branches, enter a search query." -msgstr "" - msgid "Maximum of 255 characters" msgstr "" @@ -40557,9 +40527,6 @@ msgstr "" msgid "Plan:" msgstr "" -msgid "Planning hierarchy" -msgstr "" - msgid "PlantUML" msgstr "" @@ -49582,6 +49549,9 @@ msgstr "" msgid "SecurityReports|%{count} Selected" msgstr "" +msgid "SecurityReports|%{count}+" +msgstr "" + msgid "SecurityReports|%{count}+ projects" msgstr "" diff --git a/package.json b/package.json index 1750bb2ca56..acfb99bd8c7 100644 --- a/package.json +++ b/package.json @@ -276,8 +276,8 @@ "custom-jquery-matchers": "^2.1.0", "eslint": "8.57.0", "eslint-import-resolver-jest": "3.0.2", - "eslint-import-resolver-webpack": "0.13.8", - "eslint-plugin-import": "^2.29.1", + "eslint-import-resolver-webpack": "0.13.9", + "eslint-plugin-import": "^2.30.0", "eslint-plugin-local-rules": "^3.0.2", "eslint-plugin-no-jquery": "2.7.0", "eslint-plugin-no-unsanitized": "^4.1.0", diff --git a/spec/controllers/sessions_controller_spec.rb b/spec/controllers/sessions_controller_spec.rb index 7e6b34872b3..f778bf9a643 100644 --- a/spec/controllers/sessions_controller_spec.rb +++ b/spec/controllers/sessions_controller_spec.rb @@ -246,56 +246,31 @@ RSpec.describe SessionsController, feature_category: :system_access do create(:broadcast_message_dismissal, broadcast_message: other_message, user: build(:user)) end - context 'when new_broadcast_message_dismissal feature flag is not enabled' do - before do - stub_feature_flags(new_broadcast_message_dismissal: false) - end + it 'creates dismissed cookies based on db records' do + expect(cookies["hide_broadcast_message_#{message_banner.id}"]).to be_nil + expect(cookies["hide_broadcast_message_#{message_notification.id}"]).to be_nil + expect(cookies["hide_broadcast_message_#{other_message.id}"]).to be_nil - it 'does not create dismissed cookies based on db records' do - expect(cookies["hide_broadcast_message_#{message_banner.id}"]).to be_nil - expect(cookies["hide_broadcast_message_#{message_notification.id}"]).to be_nil - expect(cookies["hide_broadcast_message_#{other_message.id}"]).to be_nil + post_action - post_action - - expect(cookies["hide_broadcast_message_#{message_banner.id}"]).to be_nil - expect(cookies["hide_broadcast_message_#{message_notification.id}"]).to be_nil - expect(cookies["hide_broadcast_message_#{other_message.id}"]).to be_nil - end + expect(cookies["hide_broadcast_message_#{message_banner.id}"]).to be(true) + expect(cookies["hide_broadcast_message_#{message_notification.id}"]).to be(true) + expect(cookies["hide_broadcast_message_#{other_message.id}"]).to be_nil end - context 'when new_broadcast_message_dismissal feature flag is enabled' do + context 'when dismissal is expired' do + let_it_be(:message) { create(:broadcast_message, broadcast_type: :banner, message: 'banner') } + before do - allow(Gitlab::AppLogger).to receive(:info).and_call_original - stub_feature_flags(new_broadcast_message_dismissal: true) + create(:broadcast_message_dismissal, :expired, broadcast_message: message, user: user) end - it 'creates dismissed cookies based on db records' do - expect(cookies["hide_broadcast_message_#{message_banner.id}"]).to be_nil - expect(cookies["hide_broadcast_message_#{message_notification.id}"]).to be_nil - expect(cookies["hide_broadcast_message_#{other_message.id}"]).to be_nil + it 'does not create cookie' do + expect(cookies["hide_broadcast_message_#{message.id}"]).to be_nil post_action - expect(cookies["hide_broadcast_message_#{message_banner.id}"]).to be(true) - expect(cookies["hide_broadcast_message_#{message_notification.id}"]).to be(true) - expect(cookies["hide_broadcast_message_#{other_message.id}"]).to be_nil - end - - context 'when dismissal is expired' do - let_it_be(:message) { create(:broadcast_message, broadcast_type: :banner, message: 'banner') } - - before do - create(:broadcast_message_dismissal, :expired, broadcast_message: message, user: user) - end - - it 'does not create cookie' do - expect(cookies["hide_broadcast_message_#{message.id}"]).to be_nil - - post_action - - expect(cookies["hide_broadcast_message_#{message.id}"]).to be_nil - end + expect(cookies["hide_broadcast_message_#{message.id}"]).to be_nil end end end diff --git a/spec/frontend/ci/ci_environments_dropdown/ci_environments_dropdown_spec.js b/spec/frontend/ci/ci_environments_dropdown/ci_environments_dropdown_spec.js index 7cc8d88b5e5..e2de00c9a61 100644 --- a/spec/frontend/ci/ci_environments_dropdown/ci_environments_dropdown_spec.js +++ b/spec/frontend/ci/ci_environments_dropdown/ci_environments_dropdown_spec.js @@ -21,7 +21,7 @@ describe('Ci environments dropdown', () => { const findListboxText = () => findListbox().props('toggleText'); const findCreateWildcardButton = () => wrapper.findByTestId('create-wildcard-button'); const findDropdownDivider = () => wrapper.findComponent(GlDropdownDivider); - const findMaxEnvNote = () => wrapper.findByTestId('max-envs-notice'); + const findSearchQueryNote = () => wrapper.findByTestId('search-query-note'); const createComponent = ({ props = {}, searchTerm = '' } = {}) => { wrapper = mountExtended(CiEnvironmentsDropdown, { @@ -34,10 +34,10 @@ describe('Ci environments dropdown', () => { findListbox().vm.$emit('search', searchTerm); }; - describe('create wildcard button', () => { - describe('when canCreateWildcard is true', () => { + describe('create wildcard buttons', () => { + describe('when canCreateWildcard is true and search has wildcard character', () => { beforeEach(() => { - createComponent({ props: { canCreateWildcard: true }, searchTerm: 'stable' }); + createComponent({ props: { canCreateWildcard: true }, searchTerm: 'stable/*' }); }); it('renders create button during search', () => { @@ -45,9 +45,19 @@ describe('Ci environments dropdown', () => { }); }); + describe('when canCreateWildcard is true and wildcard character is missing from search', () => { + beforeEach(() => { + createComponent({ props: { canCreateWildcard: true }, searchTerm: 'stable/' }); + }); + + it('does not render create button during search', () => { + expect(findCreateWildcardButton().exists()).toBe(false); + }); + }); + describe('when canCreateWildcard is false', () => { beforeEach(() => { - createComponent({ props: { canCreateWildcard: false }, searchTerm: 'stable' }); + createComponent({ props: { canCreateWildcard: false }, searchTerm: 'stable/*' }); }); it('does not render create button during search', () => { @@ -59,7 +69,7 @@ describe('Ci environments dropdown', () => { describe('No environments found', () => { describe('default behavior', () => { beforeEach(() => { - createComponent({ searchTerm: 'stable' }); + createComponent({ searchTerm: 'stable/*' }); }); it('renders dropdown divider', () => { @@ -69,7 +79,7 @@ describe('Ci environments dropdown', () => { it('renders create button with search term if environments do not contain search term', () => { const button = findCreateWildcardButton(); expect(button.exists()).toBe(true); - expect(button.text()).toBe('Create wildcard: stable'); + expect(button.text()).toBe('Create wildcard: stable/*'); }); }); }); @@ -170,8 +180,9 @@ describe('Ci environments dropdown', () => { }); it('displays note about max environments', () => { - expect(findMaxEnvNote().exists()).toBe(true); - expect(findMaxEnvNote().text()).toContain('30'); + expect(findSearchQueryNote().text()).toBe( + 'Enter a search query to find more environments, or use * to create a wildcard.', + ); }); }); @@ -191,7 +202,7 @@ describe('Ci environments dropdown', () => { }); describe('when creating a new environment scope from a search term', () => { - const searchTerm = 'new-env'; + const searchTerm = 'new-env-*'; beforeEach(() => { createComponent({ searchTerm }); }); diff --git a/spec/frontend/work_items_hierarchy/components/app_spec.js b/spec/frontend/work_items_hierarchy/components/app_spec.js deleted file mode 100644 index 22fd7d5f48a..00000000000 --- a/spec/frontend/work_items_hierarchy/components/app_spec.js +++ /dev/null @@ -1,57 +0,0 @@ -import Vue, { nextTick } from 'vue'; -import { mount } from '@vue/test-utils'; -import VueApollo from 'vue-apollo'; -import { GlBanner } from '@gitlab/ui'; -import App from '~/work_items_hierarchy/components/app.vue'; -import { extendedWrapper } from 'helpers/vue_test_utils_helper'; - -Vue.use(VueApollo); - -describe('WorkItemsHierarchy App', () => { - let wrapper; - const createComponent = (props = {}, data = {}) => { - wrapper = extendedWrapper( - mount(App, { - provide: { - illustrationPath: '/foo.svg', - licensePlan: 'free', - ...props, - }, - data() { - return data; - }, - }), - ); - }; - - describe('survey banner', () => { - it('shows when the banner is visible', () => { - createComponent({}, { bannerVisible: true }); - - expect(wrapper.findComponent(GlBanner).exists()).toBe(true); - }); - - it('hide when close is called', async () => { - createComponent({}, { bannerVisible: true }); - - wrapper.findByTestId('close-icon').trigger('click'); - - await nextTick(); - - expect(wrapper.findComponent(GlBanner).exists()).toBe(false); - }); - }); - - describe('Unavailable structure', () => { - it.each` - licensePlan | visible - ${'free'} | ${true} - ${'premium'} | ${true} - ${'ultimate'} | ${false} - `('visibility is $visible when plan is $licensePlan', ({ licensePlan, visible }) => { - createComponent({ licensePlan }); - - expect(wrapper.findByTestId('unavailable-structure').exists()).toBe(visible); - }); - }); -}); diff --git a/spec/frontend/work_items_hierarchy/components/hierarchy_spec.js b/spec/frontend/work_items_hierarchy/components/hierarchy_spec.js deleted file mode 100644 index dfdef7915dd..00000000000 --- a/spec/frontend/work_items_hierarchy/components/hierarchy_spec.js +++ /dev/null @@ -1,113 +0,0 @@ -import { mount } from '@vue/test-utils'; -import Vue from 'vue'; -import VueApollo from 'vue-apollo'; -import { GlBadge } from '@gitlab/ui'; -import Hierarchy from '~/work_items_hierarchy/components/hierarchy.vue'; -import { extendedWrapper } from 'helpers/vue_test_utils_helper'; -import RESPONSE from '~/work_items_hierarchy/static_response'; -import { workItemTypes } from '~/work_items_hierarchy/constants'; - -Vue.use(VueApollo); - -describe('WorkItemsHierarchy Hierarchy', () => { - let wrapper; - - const workItemsFromResponse = (response) => { - return response.reduce( - (itemTypes, item) => { - const key = item.available ? 'available' : 'unavailable'; - itemTypes[key].push({ - ...item, - ...workItemTypes[item.type], - nestedTypes: item.nestedTypes - ? item.nestedTypes.map((type) => workItemTypes[type]) - : null, - }); - return itemTypes; - }, - { available: [], unavailable: [] }, - ); - }; - - const createComponent = (props = {}) => { - wrapper = extendedWrapper( - mount(Hierarchy, { - propsData: { - workItemTypes: props.workItemTypes, - ...props, - }, - }), - ); - }; - - describe('available structure', () => { - let items = []; - - beforeEach(() => { - items = workItemsFromResponse(RESPONSE.ultimate).available; - createComponent({ workItemTypes: items }); - }); - - it('renders all work items', () => { - expect(wrapper.findAllByTestId('work-item-wrapper')).toHaveLength(items.length); - }); - - it('does not render badges', () => { - expect(wrapper.findComponent(GlBadge).exists()).toBe(false); - }); - }); - - describe('unavailable structure', () => { - let items = []; - - beforeEach(() => { - items = workItemsFromResponse(RESPONSE.premium).unavailable; - createComponent({ workItemTypes: items }); - }); - - it('renders all work items', () => { - expect(wrapper.findAllByTestId('work-item-wrapper')).toHaveLength(items.length); - }); - - it('renders license badges for all work items', () => { - expect(wrapper.findAllComponents(GlBadge)).toHaveLength(items.length); - }); - - it('does not render svg icon for linking', () => { - expect(wrapper.findByTestId('hierarchy-rounded-arrow-tail').exists()).toBe(false); - expect(wrapper.findByTestId('level-up-icon').exists()).toBe(false); - }); - }); - - describe('nested work items', () => { - describe.each` - licensePlan | arrowTailVisible | levelUpIconVisible | arrowDownIconVisible - ${'ultimate'} | ${true} | ${true} | ${true} - ${'premium'} | ${false} | ${false} | ${true} - ${'free'} | ${false} | ${false} | ${false} - `( - 'when $licensePlan license', - ({ licensePlan, arrowTailVisible, levelUpIconVisible, arrowDownIconVisible }) => { - let items = []; - beforeEach(() => { - items = workItemsFromResponse(RESPONSE[licensePlan]).available; - createComponent({ workItemTypes: items }); - }); - - it(`${arrowTailVisible ? 'render' : 'does not render'} arrow tail svg`, () => { - expect(wrapper.findByTestId('hierarchy-rounded-arrow-tail').exists()).toBe( - arrowTailVisible, - ); - }); - - it(`${levelUpIconVisible ? 'render' : 'does not render'} arrow tail svg`, () => { - expect(wrapper.findByTestId('level-up-icon').exists()).toBe(levelUpIconVisible); - }); - - it(`${arrowDownIconVisible ? 'render' : 'does not render'} arrow tail svg`, () => { - expect(wrapper.findByTestId('arrow-down-icon').exists()).toBe(arrowDownIconVisible); - }); - }, - ); - }); -}); diff --git a/spec/frontend/work_items_hierarchy/hierarchy_util_spec.js b/spec/frontend/work_items_hierarchy/hierarchy_util_spec.js deleted file mode 100644 index 9042fa27d16..00000000000 --- a/spec/frontend/work_items_hierarchy/hierarchy_util_spec.js +++ /dev/null @@ -1,16 +0,0 @@ -import { inferLicensePlan } from '~/work_items_hierarchy/hierarchy_util'; -import { LICENSE_PLAN } from '~/work_items_hierarchy/constants'; - -describe('inferLicensePlan', () => { - it.each` - epics | subEpics | licensePlan - ${true} | ${true} | ${LICENSE_PLAN.ULTIMATE} - ${true} | ${false} | ${LICENSE_PLAN.PREMIUM} - ${false} | ${false} | ${LICENSE_PLAN.FREE} - `( - 'returns $licensePlan when epic is $epics and sub-epic is $subEpics', - ({ epics, subEpics, licensePlan }) => { - expect(inferLicensePlan({ hasEpics: epics, hasSubEpics: subEpics })).toBe(licensePlan); - }, - ); -}); diff --git a/spec/requests/concerns/planning_hierarchy_spec.rb b/spec/requests/concerns/planning_hierarchy_spec.rb deleted file mode 100644 index 265fcde35ad..00000000000 --- a/spec/requests/concerns/planning_hierarchy_spec.rb +++ /dev/null @@ -1,22 +0,0 @@ -# frozen_string_literal: true - -require 'spec_helper' - -RSpec.describe PlanningHierarchy, type: :request, feature_category: :groups_and_projects do - let_it_be(:user) { create(:user) } - let_it_be(:group) { create(:group) } - let_it_be(:project) { create(:project, group: group) } - - before do - project.add_maintainer(user) - sign_in(user) - end - - describe 'GET #planning_hierarchy' do - it 'renders planning hierarchy' do - get project_planning_hierarchy_path(project) - - expect(response).to have_gitlab_http_status(:not_found) - end - end -end diff --git a/spec/services/ml/create_model_service_spec.rb b/spec/services/ml/create_model_service_spec.rb index dd4d41b4995..c6341cd4c25 100644 --- a/spec/services/ml/create_model_service_spec.rb +++ b/spec/services/ml/create_model_service_spec.rb @@ -9,24 +9,38 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let_it_be(:description) { 'description' } let_it_be(:metadata) { [] } + let(:audit_event) do + { + name: 'ml_model_created', + author: user, + scope: project + } + end + before do allow(Gitlab::InternalEvents).to receive(:track_event) + allow(Gitlab::Audit::Auditor).to receive(:audit).and_call_original end subject(:create_model) { described_class.new(project, name, user, description, metadata).execute } - describe '#execute' do + describe '#execute', :aggregate_failures do subject(:model_payload) { create_model.payload } + let(:audit_context) do + audit_event.merge(target: model_payload, message: "MlModel #{name} created") + end + context 'when model name is not supplied' do let(:name) { nil } let(:project) { existing_model.project } - it 'returns a model with errors', :aggregate_failures do + it 'returns a model with errors' do expect { create_model }.not_to change { Ml::Model.count } expect(create_model).to be_error expect(Gitlab::InternalEvents).not_to have_received(:track_event) expect(create_model.message).to include("Name can't be blank") + expect(Gitlab::Audit::Auditor).not_to have_received(:audit) end end @@ -34,13 +48,15 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let(:name) { 'new_model' } let(:project) { existing_model.project } - it 'creates a model', :aggregate_failures do + it 'creates a model' do expect { create_model }.to change { Ml::Model.count }.by(1) expect(Gitlab::InternalEvents).to have_received(:track_event).with( 'model_registry_ml_model_created', { project: project, user: user } ) + expect(Gitlab::Audit::Auditor).to have_received(:audit).with(audit_context) + expect(model_payload.name).to eq('new_model') expect(model_payload.default_experiment.name).to eq('[model]new_model') end @@ -50,13 +66,14 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let(:name) { existing_model.name } let(:project) { another_project } - it 'creates a model', :aggregate_failures do + it 'creates a model' do expect { create_model }.to change { Ml::Model.count }.by(1) expect(Gitlab::InternalEvents).to have_received(:track_event).with( 'model_registry_ml_model_created', { project: project, user: user } ) + expect(Gitlab::Audit::Auditor).to have_received(:audit).with(audit_context) expect(model_payload.name).to eq(name) end end @@ -65,11 +82,12 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let(:name) { existing_model.name } let(:project) { existing_model.project } - it 'returns a model with errors', :aggregate_failures do + it 'returns a model with errors' do expect { create_model }.not_to change { Ml::Model.count } expect(create_model).to be_error expect(Gitlab::InternalEvents).not_to have_received(:track_event) expect(create_model.message).to eq(["Name should be unique in the project"]) + expect(Gitlab::Audit::Auditor).not_to have_received(:audit) end end @@ -78,10 +96,11 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let(:project) { existing_model.project } let(:metadata) { [{ key: 'key1', value: 'value1' }, { key: 'key2', value: 'value2' }] } - it 'creates metadata records', :aggregate_failures do + it 'creates metadata records' do expect { create_model }.to change { Ml::Model.count }.by(1) expect(model_payload.name).to eq(name) + expect(Gitlab::Audit::Auditor).to have_received(:audit).with(audit_context) expect(model_payload.metadata.count).to be 2 end end @@ -92,8 +111,9 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let(:project) { existing_model.project } let(:metadata) { [{ key: 'key1', value: 'value1' }, { key: 'key1', value: 'value2' }] } - it 'raises an error', :aggregate_failures do + it 'raises an error' do expect { create_model }.to raise_error(ActiveRecord::RecordInvalid) + expect(Gitlab::Audit::Auditor).not_to have_received(:audit) end end @@ -103,8 +123,9 @@ RSpec.describe ::Ml::CreateModelService, feature_category: :mlops do let(:project) { existing_model.project } let(:metadata) { [{ key: 'key1', value: 'value1' }, { key: '', value: 'value2' }] } - it 'raises an error', :aggregate_failures do + it 'raises an error' do expect { create_model }.to raise_error(ActiveRecord::RecordInvalid) + expect(Gitlab::Audit::Auditor).not_to have_received(:audit) end end end diff --git a/spec/services/ml/destroy_model_service_spec.rb b/spec/services/ml/destroy_model_service_spec.rb index 0e21d9dc39c..d1c70bab562 100644 --- a/spec/services/ml/destroy_model_service_spec.rb +++ b/spec/services/ml/destroy_model_service_spec.rb @@ -9,8 +9,21 @@ RSpec.describe ::Ml::DestroyModelService, feature_category: :mlops do let(:model) { model0 } let(:service) { described_class.new(model, user) } + let(:audit_event) do + { + name: 'ml_model_destroyed', + author: user, + scope: model.project, + message: "MlModel #{model.name} destroyed", + target: model + } + end - describe '#execute' do + before do + allow(Gitlab::Audit::Auditor).to receive(:audit).and_call_original + end + + describe '#execute', :aggregate_failures do subject(:service_result) { service.execute } context 'when model fails to delete' do @@ -18,17 +31,19 @@ RSpec.describe ::Ml::DestroyModelService, feature_category: :mlops do allow(model).to receive(:destroy).and_return(false) expect(service_result).to be_error + expect(Gitlab::Audit::Auditor).not_to have_received(:audit) end end context 'when a model exists' do - it 'destroys the model', :aggregate_failures do + it 'destroys the model' do allow_next_instance_of(Packages::MarkPackagesForDestructionService) do |instance| allow(instance).to receive(:execute).and_return ServiceResponse.success(message: "") end expect { service_result }.to change { Ml::Model.count }.by(-1).and change { Ml::ModelVersion.count }.by(-1) expect(service_result).to be_success + expect(Gitlab::Audit::Auditor).to have_received(:audit).with(audit_event) end context 'when a package cannot be marked for destruction' do @@ -40,10 +55,11 @@ RSpec.describe ::Ml::DestroyModelService, feature_category: :mlops do end end - it 'returns success with warning', :aggregate_failures do + it 'returns success with warning' do expect { service_result }.not_to change { Ml::Model.count } expect(service_result).to be_error expect(service_result.message).to eq("An error") + expect(Gitlab::Audit::Auditor).not_to have_received(:audit) end end end diff --git a/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb b/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb index 735a23ca1e1..45c64d4b142 100644 --- a/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb +++ b/spec/services/pages_domains/obtain_lets_encrypt_certificate_service_spec.rb @@ -130,6 +130,17 @@ RSpec.describe PagesDomains::ObtainLetsEncryptCertificateService, feature_catego service.execute end + + describe 'when #request_certificate returns a client error' do + before do + allow(api_order).to receive(:request_certificate).and_raise( + Acme::Client::Error::BadCSR, + 'Error finalizing order :: CN was longer than 64 bytes' + ) + end + + it_behaves_like 'saves error and sends notification' + end end context 'when order is valid' do diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml index 95a0b6b15e2..d0341ae3918 100644 --- a/spec/support/rspec_order_todo.yml +++ b/spec/support/rspec_order_todo.yml @@ -7206,7 +7206,6 @@ - './spec/requests/api/users_preferences_spec.rb' - './spec/requests/api/users_spec.rb' - './spec/requests/api/wikis_spec.rb' -- './spec/requests/concerns/planning_hierarchy_spec.rb' - './spec/requests/dashboard_controller_spec.rb' - './spec/requests/dashboard/projects_controller_spec.rb' - './spec/requests/git_http_spec.rb' diff --git a/spec/support/shared_contexts/policies/project_policy_shared_context.rb b/spec/support/shared_contexts/policies/project_policy_shared_context.rb index aacc5872c0f..7f27dc83e64 100644 --- a/spec/support/shared_contexts/policies/project_policy_shared_context.rb +++ b/spec/support/shared_contexts/policies/project_policy_shared_context.rb @@ -26,7 +26,7 @@ RSpec.shared_context 'ProjectPolicy context' do %i[ award_emoji create_issue create_note create_project read_issue_board read_issue read_issue_iid read_issue_link - read_label read_planning_hierarchy read_issue_board_list read_milestone read_note read_project + read_label read_issue_board_list read_milestone read_note read_project read_project_for_iids read_project_member read_release read_snippet read_wiki upload_file ] diff --git a/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb index 0016f1e670d..68d259a3c35 100644 --- a/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb +++ b/spec/support/shared_examples/lib/gitlab/project_search_results_shared_examples.rb @@ -1,14 +1,14 @@ # frozen_string_literal: true -RSpec.shared_examples 'access restricted confidential issues' do +RSpec.shared_examples 'access restricted confidential issues' do |document_type: :issue| let(:query) { 'issue' } let(:author) { create(:user) } let(:assignee) { create(:user) } let(:project) { create(:project, :internal) } - let!(:issue) { create(:issue, project: project, title: 'Issue 1') } - let!(:security_issue_1) { create(:issue, :confidential, project: project, title: 'Security issue 1', author: author) } - let!(:security_issue_2) { create(:issue, :confidential, title: 'Security issue 2', project: project, assignees: [assignee]) } + let!(:issue) { create(document_type, project: project, title: 'Issue 1') } + let!(:security_issue_1) { create(document_type, :confidential, project: project, title: 'Security issue 1', author: author) } + let!(:security_issue_2) { create(document_type, :confidential, title: 'Security issue 2', project: project, assignees: [assignee]) } subject(:objects) do described_class.new(user, query, project: project).objects('issues') diff --git a/yarn.lock b/yarn.lock index 99a3e8b5163..7988ae4023f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2049,6 +2049,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375" integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@sentry-internal/browser-utils@8.27.0": version "8.27.0" resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-8.27.0.tgz#b8fd1c5e6b8c01d76abbba7ac5017eebcf7d3ed2" @@ -3906,13 +3911,13 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= -array-buffer-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" - integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== +array-buffer-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz#1e5583ec16763540a27ae52eed99ff899223568f" + integrity sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg== dependencies: - call-bind "^1.0.2" - is-array-buffer "^3.0.1" + call-bind "^1.0.5" + is-array-buffer "^3.0.4" array-flatten@1.1.1: version "1.1.1" @@ -3924,15 +3929,16 @@ array-flatten@^2.1.2: resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== -array-includes@^3.1.7: - version "3.1.7" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" - integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== +array-includes@^3.1.8: + version "3.1.8" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.8.tgz#5e370cbe172fdd5dd6530c1d4aadda25281ba97d" + integrity sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.4" is-string "^1.0.7" array-union@^2.1.0: @@ -3945,26 +3951,17 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= -array.prototype.find@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/array.prototype.find/-/array.prototype.find-2.2.2.tgz#e862cf891e725d8f2a10e5e42d750629faaabd32" - integrity sha512-DRumkfW97iZGOfn+lIXbkVrXL04sfYKX+EfOodo8XboR5sxPDVvOjZTF/rysusa9lmhmSOeD6Vp6RKQP+eP4Tg== +array.prototype.findlastindex@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz#8c35a755c72908719453f87145ca011e39334d0d" + integrity sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - -array.prototype.findlastindex@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz#b37598438f97b579166940814e2c0493a4f50207" - integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== - dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-shim-unscopables "^1.0.2" array.prototype.flat@^1.3.2: version "1.3.2" @@ -3986,17 +3983,18 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" -arraybuffer.prototype.slice@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" - integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== +arraybuffer.prototype.slice@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz#097972f4255e41bc3425e37dc3f6421cf9aefde6" + integrity sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A== dependencies: - array-buffer-byte-length "^1.0.0" - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" - is-array-buffer "^3.0.2" + array-buffer-byte-length "^1.0.1" + call-bind "^1.0.5" + define-properties "^1.2.1" + es-abstract "^1.22.3" + es-errors "^1.2.1" + get-intrinsic "^1.2.3" + is-array-buffer "^3.0.4" is-shared-array-buffer "^1.0.2" arrify@^1.0.1: @@ -4063,10 +4061,12 @@ autosize@^5.0.1: resolved "https://registry.yarnpkg.com/autosize/-/autosize-5.0.1.tgz#ed269b0fa9b7eb47627048a1bb3299e99e003a0f" integrity sha512-UIWUlE4TOVPNNj2jjrU39wI4hEYbneUypEqcyRmRFIx5CC2gNdg3rQr+Zh7/3h6egbBvm33TDQjNQKtj9Tk1HA== -available-typed-arrays@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" - integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== +available-typed-arrays@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" + integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== + dependencies: + possible-typed-array-names "^1.0.0" axios-mock-adapter@^1.15.0: version "1.15.0" @@ -4565,14 +4565,16 @@ cache-loader@^4.1.0: neo-async "^2.6.1" schema-utils "^2.0.0" -call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" - integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.7.tgz#06016599c40c56498c18769d2730be242b6fa3b9" + integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== dependencies: + es-define-property "^1.0.0" + es-errors "^1.3.0" function-bind "^1.1.2" - get-intrinsic "^1.2.1" - set-function-length "^1.1.1" + get-intrinsic "^1.2.4" + set-function-length "^1.2.1" call-me-maybe@^1.0.1: version "1.0.1" @@ -5844,6 +5846,33 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" +data-view-buffer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" + integrity sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz#90721ca95ff280677eb793749fce1011347669e2" + integrity sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ== + dependencies: + call-bind "^1.0.7" + es-errors "^1.3.0" + is-data-view "^1.0.1" + +data-view-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz#5e0bbfb4828ed2d1b9b400cd8a7d119bca0ff18a" + integrity sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA== + dependencies: + call-bind "^1.0.6" + es-errors "^1.3.0" + is-data-view "^1.0.1" + dataloader@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.0.0.tgz#41eaf123db115987e21ca93c005cd7753c55fe6f" @@ -5968,25 +5997,26 @@ default-gateway@^6.0.3: dependencies: execa "^5.0.0" -define-data-property@^1.0.1, define-data-property@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" - integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== +define-data-property@^1.0.1, define-data-property@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e" + integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== dependencies: - get-intrinsic "^1.2.1" + es-define-property "^1.0.0" + es-errors "^1.3.0" gopd "^1.0.1" - has-property-descriptors "^1.0.0" define-lazy-prop@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== -define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.0.tgz#52988570670c9eacedd8064f4a990f2405849bd5" - integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== +define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -6355,66 +6385,92 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.19.1, es-abstract@^1.22.1: - version "1.22.3" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" - integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== +es-abstract@^1.19.1, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.2: + version "1.23.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0" + integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A== dependencies: - array-buffer-byte-length "^1.0.0" - arraybuffer.prototype.slice "^1.0.2" - available-typed-arrays "^1.0.5" - call-bind "^1.0.5" - es-set-tostringtag "^2.0.1" + array-buffer-byte-length "^1.0.1" + arraybuffer.prototype.slice "^1.0.3" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" + data-view-buffer "^1.0.1" + data-view-byte-length "^1.0.1" + data-view-byte-offset "^1.0.0" + es-define-property "^1.0.0" + es-errors "^1.3.0" + es-object-atoms "^1.0.0" + es-set-tostringtag "^2.0.3" es-to-primitive "^1.2.1" function.prototype.name "^1.1.6" - get-intrinsic "^1.2.2" - get-symbol-description "^1.0.0" + get-intrinsic "^1.2.4" + get-symbol-description "^1.0.2" globalthis "^1.0.3" gopd "^1.0.1" - has-property-descriptors "^1.0.0" - has-proto "^1.0.1" + has-property-descriptors "^1.0.2" + has-proto "^1.0.3" has-symbols "^1.0.3" - hasown "^2.0.0" - internal-slot "^1.0.5" - is-array-buffer "^3.0.2" + hasown "^2.0.2" + internal-slot "^1.0.7" + is-array-buffer "^3.0.4" is-callable "^1.2.7" - is-negative-zero "^2.0.2" + is-data-view "^1.0.1" + is-negative-zero "^2.0.3" is-regex "^1.1.4" - is-shared-array-buffer "^1.0.2" + is-shared-array-buffer "^1.0.3" is-string "^1.0.7" - is-typed-array "^1.1.12" + is-typed-array "^1.1.13" is-weakref "^1.0.2" object-inspect "^1.13.1" object-keys "^1.1.1" - object.assign "^4.1.4" - regexp.prototype.flags "^1.5.1" - safe-array-concat "^1.0.1" - safe-regex-test "^1.0.0" - string.prototype.trim "^1.2.8" - string.prototype.trimend "^1.0.7" - string.prototype.trimstart "^1.0.7" - typed-array-buffer "^1.0.0" - typed-array-byte-length "^1.0.0" - typed-array-byte-offset "^1.0.0" - typed-array-length "^1.0.4" + object.assign "^4.1.5" + regexp.prototype.flags "^1.5.2" + safe-array-concat "^1.1.2" + safe-regex-test "^1.0.3" + string.prototype.trim "^1.2.9" + string.prototype.trimend "^1.0.8" + string.prototype.trimstart "^1.0.8" + typed-array-buffer "^1.0.2" + typed-array-byte-length "^1.0.1" + typed-array-byte-offset "^1.0.2" + typed-array-length "^1.0.6" unbox-primitive "^1.0.2" - which-typed-array "^1.1.13" + which-typed-array "^1.1.15" -es-set-tostringtag@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz#338d502f6f674301d710b80c8592de8a15f09cd8" - integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== - dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" - has-tostringtag "^1.0.0" - -es-shim-unscopables@^1.0.0: +es-define-property@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.0.tgz#c7faefbdff8b2696cf5f46921edfb77cc4ba3845" + integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== dependencies: - has "^1.0.3" + get-intrinsic "^1.2.4" + +es-errors@^1.2.1, es-errors@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f" + integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== + +es-object-atoms@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.0.0.tgz#ddb55cd47ac2e240701260bc2a8e31ecb643d941" + integrity sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw== + dependencies: + es-errors "^1.3.0" + +es-set-tostringtag@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz#8bb60f0a440c2e4281962428438d58545af39777" + integrity sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ== + dependencies: + get-intrinsic "^1.2.4" + has-tostringtag "^1.0.2" + hasown "^2.0.1" + +es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== + dependencies: + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -6655,12 +6711,11 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-import-resolver-webpack@0.13.8: - version "0.13.8" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.8.tgz#5f64d1d653eefa19cdfd0f0165c996b6be7012f9" - integrity sha512-Y7WIaXWV+Q21Rz/PJgUxiW/FTBOWmU8NTLdz+nz9mMoiz5vAev/fOaQxwD7qRzTfE3HSm1qsxZ5uRd7eX+VEtA== +eslint-import-resolver-webpack@0.13.9: + version "0.13.9" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.9.tgz#eee41e81dadcdf22ce5f2c6b75952f41e6ac11fa" + integrity sha512-yGngeefNiHXau2yzKKs2BNON4HLpxBabY40BGL/vUSKZtqzjlVsTTZm57jhHULhm+mJEwKsEIIN3NXup5AiiBQ== dependencies: - array.prototype.find "^2.2.2" debug "^3.2.7" enhanced-resolve "^0.9.1" find-root "^1.1.0" @@ -6672,33 +6727,34 @@ eslint-import-resolver-webpack@0.13.8: resolve "^2.0.0-next.5" semver "^5.7.2" -eslint-module-utils@^2.8.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz#e439fee65fc33f6bba630ff621efc38ec0375c49" - integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== +eslint-module-utils@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.9.0.tgz#95d4ac038a68cd3f63482659dffe0883900eb342" + integrity sha512-McVbYmwA3NEKwRQY5g4aWMdcZE5xZxV8i8l7CqJSrameuGSQJtSWaL/LxTEzSKKaCcOhlpDR8XEfYXWPrdo/ZQ== dependencies: debug "^3.2.7" -eslint-plugin-import@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.29.1.tgz#d45b37b5ef5901d639c15270d74d46d161150643" - integrity sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw== +eslint-plugin-import@^2.29.1, eslint-plugin-import@^2.30.0: + version "2.30.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.30.0.tgz#21ceea0fc462657195989dd780e50c92fe95f449" + integrity sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw== dependencies: - array-includes "^3.1.7" - array.prototype.findlastindex "^1.2.3" + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.8" + array.prototype.findlastindex "^1.2.5" array.prototype.flat "^1.3.2" array.prototype.flatmap "^1.3.2" debug "^3.2.7" doctrine "^2.1.0" eslint-import-resolver-node "^0.3.9" - eslint-module-utils "^2.8.0" - hasown "^2.0.0" - is-core-module "^2.13.1" + eslint-module-utils "^2.9.0" + hasown "^2.0.2" + is-core-module "^2.15.1" is-glob "^4.0.3" minimatch "^3.1.2" - object.fromentries "^2.0.7" - object.groupby "^1.0.1" - object.values "^1.1.7" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.0" semver "^6.3.1" tsconfig-paths "^3.15.0" @@ -7395,7 +7451,7 @@ fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1, function-bind@^1.1.2: +function-bind@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== @@ -7445,11 +7501,12 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" - integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.3, get-intrinsic@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz#e385f5a4b5227d449c3eabbad05494ef0abbeadd" + integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== dependencies: + es-errors "^1.3.0" function-bind "^1.1.2" has-proto "^1.0.1" has-symbols "^1.0.3" @@ -7465,13 +7522,14 @@ get-stream@^6.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -get-symbol-description@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6" - integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== +get-symbol-description@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.2.tgz#533744d5aa20aca4e079c8e5daf7fd44202821f5" + integrity sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.1" + call-bind "^1.0.5" + es-errors "^1.3.0" + get-intrinsic "^1.2.4" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" @@ -7750,29 +7808,29 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854" + integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== dependencies: - get-intrinsic "^1.1.1" + es-define-property "^1.0.0" -has-proto@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" - integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== +has-proto@^1.0.1, has-proto@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.3.tgz#b31ddfe9b0e6e9914536a6ab286426d0214f77fd" + integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== -has-tostringtag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25" - integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== +has-tostringtag@^1.0.0, has-tostringtag@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc" + integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== dependencies: - has-symbols "^1.0.2" + has-symbols "^1.0.3" has-unicode@^2.0.1: version "2.0.1" @@ -7810,13 +7868,6 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" - hash-base@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" @@ -7850,10 +7901,10 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hasown@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" - integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== +hasown@^2.0.0, hasown@^2.0.1, hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== dependencies: function-bind "^1.1.2" @@ -8217,13 +8268,13 @@ inline-style-parser@0.1.1: resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -internal-slot@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" - integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== +internal-slot@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.7.tgz#c06dcca3ed874249881007b0a5523b172a190802" + integrity sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g== dependencies: - get-intrinsic "^1.2.0" - has "^1.0.3" + es-errors "^1.3.0" + hasown "^2.0.0" side-channel "^1.0.4" "internmap@1 - 2": @@ -8265,14 +8316,13 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" - integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== +is-array-buffer@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.4.tgz#7a1f92b3d61edd2bc65d24f130530ea93d7fae98" + integrity sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.2.0" - is-typed-array "^1.1.10" + get-intrinsic "^1.2.1" is-arrayish@^0.2.1: version "0.2.1" @@ -8330,12 +8380,12 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.13.0, is-core-module@^2.13.1: - version "2.13.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== +is-core-module@^2.13.0, is-core-module@^2.13.1, is-core-module@^2.15.1: + version "2.15.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37" + integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== dependencies: - hasown "^2.0.0" + hasown "^2.0.2" is-data-descriptor@^0.1.4: version "0.1.4" @@ -8351,6 +8401,13 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-data-view@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.1.tgz#4b4d3a511b70f3dc26d42c03ca9ca515d847759f" + integrity sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w== + dependencies: + is-typed-array "^1.1.13" + is-date-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" @@ -8413,10 +8470,10 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" - integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-negative-zero@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747" + integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== is-number-object@^1.0.4: version "1.0.7" @@ -8477,12 +8534,12 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-shared-array-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz#8f259c573b60b6a32d4058a1a07430c0a7344c79" - integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== +is-shared-array-buffer@^1.0.2, is-shared-array-buffer@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz#1237f1cba059cdb62431d378dcc37d9680181688" + integrity sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" is-stream@^2.0.0: version "2.0.0" @@ -8503,12 +8560,12 @@ is-symbol@^1.0.2, is-symbol@^1.0.3: dependencies: has-symbols "^1.0.2" -is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: - version "1.1.12" - resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" - integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== +is-typed-array@^1.1.13: + version "1.1.13" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.13.tgz#d6c5ca56df62334959322d7d7dd1cca50debe229" + integrity sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw== dependencies: - which-typed-array "^1.1.11" + which-typed-array "^1.1.14" is-weakref@^1.0.2: version "1.0.2" @@ -10903,13 +10960,13 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.2, object.assign@^4.1.4: - version "4.1.4" - resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" - integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== +object.assign@^4.1.2, object.assign@^4.1.5: + version "4.1.5" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.5.tgz#3a833f9ab7fdb80fc9e8d2300c803d216d8fdbb0" + integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.1.4" + call-bind "^1.0.5" + define-properties "^1.2.1" has-symbols "^1.0.3" object-keys "^1.1.1" @@ -10922,24 +10979,24 @@ object.entries@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" -object.fromentries@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" - integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== +object.fromentries@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.8.tgz#f7195d8a9b97bd95cbc1999ea939ecd1a2b00c65" + integrity sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" + es-object-atoms "^1.0.0" -object.groupby@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.1.tgz#d41d9f3c8d6c778d9cbac86b4ee9f5af103152ee" - integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== +object.groupby@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/object.groupby/-/object.groupby-1.0.3.tgz#9b125c36238129f6f7b61954a1e7176148d5002e" + integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.2" object.pick@^1.3.0: version "1.3.0" @@ -10948,14 +11005,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" - integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== +object.values@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b" + integrity sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -11377,6 +11434,11 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +possible-typed-array-names@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" + integrity sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q== + postcss-custom-properties@^13.3.12: version "13.3.12" resolved "https://registry.yarnpkg.com/postcss-custom-properties/-/postcss-custom-properties-13.3.12.tgz#e21960c7d13aed960b28236412d4da67f75317b0" @@ -12117,14 +12179,15 @@ regexp-tree@^0.1.27: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.27.tgz#2198f0ef54518ffa743fe74d983b56ffd631b6cd" integrity sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA== -regexp.prototype.flags@^1.5.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" - integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== +regexp.prototype.flags@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334" + integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - set-function-name "^2.0.0" + call-bind "^1.0.6" + define-properties "^1.2.1" + es-errors "^1.3.0" + set-function-name "^2.0.1" regexpu-core@^5.3.1: version "5.3.2" @@ -12400,13 +12463,13 @@ sade@^1.7.3: dependencies: mri "^1.1.0" -safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== +safe-array-concat@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.2.tgz#81d77ee0c4e8b863635227c721278dd524c20edb" + integrity sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.7" + get-intrinsic "^1.2.4" has-symbols "^1.0.3" isarray "^2.0.5" @@ -12420,13 +12483,13 @@ safe-buffer@5.2.1, safe-buffer@^5.2.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== +safe-regex-test@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377" + integrity sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.6" + es-errors "^1.3.0" is-regex "^1.1.4" safe-regex@^1.1.0: @@ -12602,24 +12665,27 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== -set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== +set-function-length@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449" + integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== dependencies: - define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" + function-bind "^1.1.2" + get-intrinsic "^1.2.4" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" -set-function-name@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" - integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== +set-function-name@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985" + integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== dependencies: - define-data-property "^1.0.1" + define-data-property "^1.1.4" + es-errors "^1.3.0" functions-have-names "^1.2.3" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.2" set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" @@ -13061,32 +13127,33 @@ string-width@^5.0.1, string-width@^5.1.2: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string.prototype.trim@^1.2.8: - version "1.2.8" - resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" - integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== +string.prototype.trim@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4" + integrity sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-abstract "^1.23.0" + es-object-atoms "^1.0.0" -string.prototype.trimend@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" - integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== +string.prototype.trimend@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz#3651b8513719e8a9f48de7f2f77640b26652b229" + integrity sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" -string.prototype.trimstart@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" - integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== +string.prototype.trimstart@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde" + integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== dependencies: - call-bind "^1.0.2" - define-properties "^1.2.0" - es-abstract "^1.22.1" + call-bind "^1.0.7" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" @@ -13807,44 +13874,49 @@ type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typed-array-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" - integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== +typed-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz#1867c5d83b20fcb5ccf32649e5e2fc7424474ff3" + integrity sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" - is-typed-array "^1.1.10" + call-bind "^1.0.7" + es-errors "^1.3.0" + is-typed-array "^1.1.13" -typed-array-byte-length@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" - integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== +typed-array-byte-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz#d92972d3cff99a3fa2e765a28fcdc0f1d89dec67" + integrity sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-byte-offset@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" - integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== +typed-array-byte-offset@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz#f9ec1acb9259f395093e4567eb3c28a580d02063" + integrity sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.2" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" - has-proto "^1.0.1" - is-typed-array "^1.1.10" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" -typed-array-length@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" - integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== +typed-array-length@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.6.tgz#57155207c76e64a3457482dfdc1c9d1d3c4c73a3" + integrity sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g== dependencies: - call-bind "^1.0.2" + call-bind "^1.0.7" for-each "^0.3.3" - is-typed-array "^1.1.9" + gopd "^1.0.1" + has-proto "^1.0.3" + is-typed-array "^1.1.13" + possible-typed-array-names "^1.0.0" typedarray@^0.0.6: version "0.0.6" @@ -14738,16 +14810,16 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== -which-typed-array@^1.1.11, which-typed-array@^1.1.13: - version "1.1.13" - resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" - integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== +which-typed-array@^1.1.14, which-typed-array@^1.1.15: + version "1.1.15" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d" + integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA== dependencies: - available-typed-arrays "^1.0.5" - call-bind "^1.0.4" + available-typed-arrays "^1.0.7" + call-bind "^1.0.7" for-each "^0.3.3" gopd "^1.0.1" - has-tostringtag "^1.0.0" + has-tostringtag "^1.0.2" which@^1.2.9, which@^1.3.1: version "1.3.1"