From 2828f81d2a41f46b89e13dc057b982f27aeee547 Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Fri, 1 Jul 2022 12:08:08 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .eslintrc.yml | 2 + .../boards/components/board_card_inner.vue | 2 +- app/assets/javascripts/deprecated_notes.js | 4 +- app/assets/javascripts/diff.js | 58 +- .../editor/source_editor_instance.js | 1 + .../environments/stores/environments_store.js | 2 - .../issuable_bulk_update_sidebar.js | 13 +- .../issues/create_merge_request_dropdown.js | 41 +- .../sidebar_job_details_container.vue | 10 +- .../javascripts/lib/utils/common_utils.js | 6 +- app/assets/javascripts/main.js | 2 +- .../notes/mixins/discussion_navigation.js | 2 - .../sidebar/services/sidebar_service.js | 1 + .../javascripts/sidebar/sidebar_mediator.js | 2 + .../sidebar/stores/sidebar_store.js | 1 + .../epics_select/epics_select_bundle.js | 1 + .../health_status_bundle.js | 1 + .../sidebar/iterations_dropdown_bundle.js | 1 + app/helpers/commits_helper.rb | 2 +- app/helpers/diff_helper.rb | 1 + app/helpers/search_helper.rb | 10 +- app/mailers/emails/admin_notification.rb | 7 +- app/mailers/previews/notify_preview.rb | 10 +- app/models/commit_status.rb | 3 + app/models/protected_branch.rb | 4 +- .../ci/generate_coverage_reports_service.rb | 15 + app/uploaders/object_storage.rb | 14 + .../application_settings/_mailgun.html.haml | 2 +- .../application_settings/_plantuml.html.haml | 2 +- .../application_settings/_registry.html.haml | 2 +- .../_repository_static_objects.html.haml | 2 +- .../application_settings/_signup.html.haml | 2 +- .../application_settings/_terminal.html.haml | 2 +- .../_third_party_offers.html.haml | 2 +- .../appearances/_form.html.haml | 2 +- .../application_settings/general.html.haml | 2 +- app/views/notify/_failed_builds.html.haml | 2 +- .../notify/user_auto_banned_email.html.haml | 2 +- .../notify/user_auto_banned_email.text.erb | 2 +- app/views/profiles/gpg_keys/_form.html.haml | 2 +- app/views/projects/blob/_blob.html.haml | 2 + app/views/projects/diffs/_content.html.haml | 4 +- app/workers/gitlab_service_ping_worker.rb | 2 - ...tom_headers_streaming_audit_events_ui.yml} | 12 +- config/object_store_settings.rb | 24 +- ...for_contribution_analytics_optimization.rb | 13 + db/schema_migrations/20220701085523 | 1 + doc/administration/audit_event_streaming.md | 57 +- doc/administration/object_storage.md | 9 + doc/api/packages/conan.md | 4 + .../database/batched_background_migrations.md | 2 +- .../policies/scan-execution-policies.md | 2 +- .../policies/scan-result-policies.md | 2 +- doc/user/packages/conan_repository/index.md | 3 + lib/api/concerns/packages/conan_endpoints.rb | 1 + lib/api/helpers.rb | 6 +- lib/api/helpers/issues_helpers.rb | 2 +- lib/gitlab/ci/variables/builder.rb | 2 +- locale/gitlab.pot | 28 +- package.json | 4 +- spec/config/object_store_settings_spec.rb | 76 +++ .../projects/commits/multi_view_diff_spec.rb | 26 +- spec/features/projects/new_project_spec.rb | 57 +- spec/frontend/__helpers__/web_worker_fake.js | 3 +- .../job_sidebar_details_container_spec.js | 4 +- spec/frontend/jobs/mock_data.js | 2 +- spec/frontend/lib/utils/rails_ujs_spec.js | 2 +- spec/helpers/commits_helper_spec.rb | 4 +- spec/lib/gitlab/git/commit_spec.rb | 2 +- spec/lib/gitlab/git/repository_spec.rb | 6 +- .../project/tree_restorer_spec.rb | 20 +- .../mailers/emails/admin_notification_spec.rb | 16 +- spec/models/ci/build_spec.rb | 2 +- spec/models/ci/processable_spec.rb | 2 +- spec/models/protected_branch_spec.rb | 8 + spec/models/repository_spec.rb | 3 +- .../api/ci/runner/jobs_request_post_spec.rb | 6 +- .../api/conan_instance_packages_spec.rb | 6 + .../api/conan_project_packages_spec.rb | 6 + spec/requests/api/issues/issues_spec.rb | 1 + .../generate_coverage_reports_service_spec.rb | 54 +- .../lib/gitlab/ci/ci_trace_shared_examples.rb | 3 +- .../search_language_filter_shared_examples.rb | 54 ++ .../api/conan_packages_shared_examples.rb | 33 ++ ...garbage_collect_methods_shared_examples.rb | 2 +- spec/uploaders/object_storage_spec.rb | 44 ++ .../gitlab_service_ping_worker_spec.rb | 25 +- yarn.lock | 526 ++++++++++-------- 88 files changed, 997 insertions(+), 418 deletions(-) create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js create mode 100644 app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js rename config/feature_flags/development/{prerecord_service_ping_data.yml => custom_headers_streaming_audit_events_ui.yml} (52%) create mode 100644 db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb create mode 100644 db/schema_migrations/20220701085523 create mode 100644 spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb diff --git a/.eslintrc.yml b/.eslintrc.yml index 7505d864e6f..1c621d17bb2 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -122,6 +122,8 @@ overrides: rules: '@gitlab/require-i18n-strings': off '@gitlab/no-runtime-template-compiler': off + 'import/no-dynamic-require': off + 'no-import-assign': off 'no-restricted-syntax': - error - selector: CallExpression[callee.object.name=/(wrapper|vm)/][callee.property.name="setData"] diff --git a/app/assets/javascripts/boards/components/board_card_inner.vue b/app/assets/javascripts/boards/components/board_card_inner.vue index 86cb052cb59..a632f5ae0ed 100644 --- a/app/assets/javascripts/boards/components/board_card_inner.vue +++ b/app/assets/javascripts/boards/components/board_card_inner.vue @@ -254,7 +254,7 @@ export default {
- + { this.highlightSelectedLine(); + this.prepareRenderedDiff(); if (cb) cb(); }); } else if (cb) { @@ -156,20 +157,22 @@ export default class Diff { } prepareRenderedDiff() { - const $elements = $('[data-diff-toggle-entity]'); - - if ($elements.length === 0) return; - + const allElements = this.elementsForRenderedDiff(); const diff = this; - const elements = $elements.toArray().map(this.formatElementToObject).reduce(merge); + for (const [fileHash, fileElements] of Object.entries(allElements)) { + // eslint-disable no-param-reassign + fileElements.rawButton.onclick = () => { + diff.showRawViewer(fileHash, diff.elementsForRenderedDiff()[fileHash]); + }; - Object.values(elements).forEach((e) => { - e.toShowBtn.onclick = () => diff.showOneHideAnother('rendered', e); // eslint-disable-line no-param-reassign - e.toHideBtn.onclick = () => diff.showOneHideAnother('raw', e); // eslint-disable-line no-param-reassign + fileElements.renderedButton.onclick = () => { + diff.showRenderedViewer(fileHash, diff.elementsForRenderedDiff()[fileHash]); + }; + // eslint-enable no-param-reassign - diff.showOneHideAnother('rendered', e); - }); + diff.showRenderedViewer(fileHash, fileElements); + } } formatElementToObject = (element) => { @@ -179,18 +182,33 @@ export default class Diff { return { [key]: { [name]: element } }; }; - showOneHideAnother = (mode, elements) => { - let { toShowBtn, toHideBtn, toShow, toHide } = elements; + elementsForRenderedDiff = () => { + const $elements = $('[data-diff-toggle-entity]'); - if (mode === 'raw') { - [toShowBtn, toHideBtn] = [toHideBtn, toShowBtn]; - [toShow, toHide] = [toHide, toShow]; - } + if ($elements.length === 0) return {}; - toShowBtn.classList.add('selected'); - toHideBtn.classList.remove('selected'); + const diff = this; - toHide.classList.add('hidden'); - toShow.classList.remove('hidden'); + return $elements.toArray().map(diff.formatElementToObject).reduce(merge); + }; + + showRawViewer = (fileHash, elements) => { + if (elements === undefined) return; + + elements.rawButton.classList.add('selected'); + elements.renderedButton.classList.remove('selected'); + + elements.renderedViewer.classList.add('hidden'); + elements.rawViewer.classList.remove('hidden'); + }; + + showRenderedViewer = (fileHash, elements) => { + if (elements === undefined) return; + + elements.rawButton.classList.remove('selected'); + elements.rawViewer.classList.add('hidden'); + + elements.renderedButton.classList.add('selected'); + elements.renderedViewer.classList.remove('hidden'); }; } diff --git a/app/assets/javascripts/editor/source_editor_instance.js b/app/assets/javascripts/editor/source_editor_instance.js index 95a43c2b2d0..fb5d5414ca4 100644 --- a/app/assets/javascripts/editor/source_editor_instance.js +++ b/app/assets/javascripts/editor/source_editor_instance.js @@ -90,6 +90,7 @@ export default class EditorInstance { this.dispatchExtAction = EditorInstance.useUnuse.bind(instProxy, extensionsStore); + // eslint-disable-next-line no-constructor-return return instProxy; } diff --git a/app/assets/javascripts/environments/stores/environments_store.js b/app/assets/javascripts/environments/stores/environments_store.js index a67e44b3348..4d70e29a684 100644 --- a/app/assets/javascripts/environments/stores/environments_store.js +++ b/app/assets/javascripts/environments/stores/environments_store.js @@ -15,8 +15,6 @@ export default class EnvironmentsStore { this.state.availableCounter = 0; this.state.paginationInformation = {}; this.state.reviewAppDetails = {}; - - return this; } /** diff --git a/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js b/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js index d46354e240a..8a55176fed0 100644 --- a/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js +++ b/app/assets/javascripts/issuable/bulk_update_sidebar/issuable_bulk_update_sidebar.js @@ -54,24 +54,23 @@ export default class IssuableBulkUpdateSidebar { new MilestoneSelect(); subscriptionSelect(); + // Checking IS_EE and using ee_else_ce is odd, but we do it here to satisfy + // the import/no-unresolved lint rule when FOSS_ONLY=1, even though at + // runtime this block won't execute. if (IS_EE) { - import('ee/vue_shared/components/sidebar/health_status_select/health_status_bundle') + import('ee_else_ce/vue_shared/components/sidebar/health_status_select/health_status_bundle') .then(({ default: HealthStatusSelect }) => { HealthStatusSelect(); }) .catch(() => {}); - } - if (IS_EE) { - import('ee/vue_shared/components/sidebar/epics_select/epics_select_bundle') + import('ee_else_ce/vue_shared/components/sidebar/epics_select/epics_select_bundle') .then(({ default: EpicSelect }) => { EpicSelect(); }) .catch(() => {}); - } - if (IS_EE) { - import('ee/vue_shared/components/sidebar/iterations_dropdown_bundle') + import('ee_else_ce/vue_shared/components/sidebar/iterations_dropdown_bundle') .then(({ default: iterationsDropdown }) => { iterationsDropdown(); }) diff --git a/app/assets/javascripts/issues/create_merge_request_dropdown.js b/app/assets/javascripts/issues/create_merge_request_dropdown.js index edf3789e6dc..92ff7f21eff 100644 --- a/app/assets/javascripts/issues/create_merge_request_dropdown.js +++ b/app/assets/javascripts/issues/create_merge_request_dropdown.js @@ -169,28 +169,27 @@ export default class CreateMergeRequestDropdown { } createMergeRequest() { - return new Promise(() => { - this.isCreatingMergeRequest = true; - return this.createBranch(false) - .then(() => api.trackRedisHllUserEvent('i_code_review_user_create_mr_from_issue')) - .then(() => { - let path = canCreateConfidentialMergeRequest() - ? this.createMrPath.replace( - this.projectPath, - confidentialMergeRequestState.selectedProject.pathWithNamespace, - ) - : this.createMrPath; - path = mergeUrlParams( - { - 'merge_request[target_branch]': this.refInput.value, - 'merge_request[source_branch]': this.branchInput.value, - }, - path, - ); + this.isCreatingMergeRequest = true; - window.location.href = path; - }); - }); + return this.createBranch(false) + .then(() => api.trackRedisHllUserEvent('i_code_review_user_create_mr_from_issue')) + .then(() => { + let path = canCreateConfidentialMergeRequest() + ? this.createMrPath.replace( + this.projectPath, + confidentialMergeRequestState.selectedProject.pathWithNamespace, + ) + : this.createMrPath; + path = mergeUrlParams( + { + 'merge_request[target_branch]': this.refInput.value, + 'merge_request[source_branch]': this.branchInput.value, + }, + path, + ); + + window.location.href = path; + }); } disable() { diff --git a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue index 2ba531c9e95..15c4e503685 100644 --- a/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue +++ b/app/assets/javascripts/jobs/components/sidebar_job_details_container.vue @@ -42,14 +42,11 @@ export default { this.job.duration || this.job.finished_at || this.job.erased_at || - this.job.queued || + this.job.queued_duration || this.job.runner || this.job.coverage, ); }, - queued() { - return timeIntervalInWords(this.job.queued); - }, runnerHelpUrl() { return helpPagePath('ci/runners/configure_runners.html', { anchor: 'set-maximum-job-timeout-for-a-runner', @@ -60,6 +57,9 @@ export default { return `#${id} (${token}) ${description}`; }, + queuedDuration() { + return timeIntervalInWords(this.job.queued_duration); + }, shouldRenderBlock() { return Boolean(this.hasAnyDetail || this.hasTimeout || this.hasTags); }, @@ -98,7 +98,7 @@ export default { :title="$options.i18n.FINISHED" /> - + { * @param {Number} precision */ export const roundOffFloat = (number, precision = 0) => { - // eslint-disable-next-line no-restricted-properties - const multiplier = Math.pow(10, precision); + const multiplier = 10 ** precision; return Math.round(number * multiplier) / multiplier; }; @@ -622,8 +621,7 @@ export const roundToNearestHalf = (num) => Math.round(num * 2).toFixed() / 2; * @param {Number} precision */ export const roundDownFloat = (number, precision = 0) => { - // eslint-disable-next-line no-restricted-properties - const multiplier = Math.pow(10, precision); + const multiplier = 10 ** precision; return Math.floor(number * multiplier) / multiplier; }; diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js index e3e8efdd771..a725ef972d4 100644 --- a/app/assets/javascripts/main.js +++ b/app/assets/javascripts/main.js @@ -53,7 +53,7 @@ window.gl = window.gl || {}; // inject test utilities if necessary if (process.env.NODE_ENV !== 'production' && gon?.test_env) { - import(/* webpackMode: "eager" */ './test_utils/'); + import(/* webpackMode: "eager" */ './test_utils'); } document.addEventListener('beforeunload', () => { diff --git a/app/assets/javascripts/notes/mixins/discussion_navigation.js b/app/assets/javascripts/notes/mixins/discussion_navigation.js index 754a534e055..45df91796fc 100644 --- a/app/assets/javascripts/notes/mixins/discussion_navigation.js +++ b/app/assets/javascripts/notes/mixins/discussion_navigation.js @@ -41,8 +41,6 @@ function updateUrlWithNoteId(noteId) { // Unmask the note's ID note?.setAttribute('id', `note_${noteId}`); - } else if (noteId) { - updateHistory(newHistoryEntry); } } diff --git a/app/assets/javascripts/sidebar/services/sidebar_service.js b/app/assets/javascripts/sidebar/services/sidebar_service.js index ea170203576..05268a5c89c 100644 --- a/app/assets/javascripts/sidebar/services/sidebar_service.js +++ b/app/assets/javascripts/sidebar/services/sidebar_service.js @@ -33,6 +33,7 @@ export default class SidebarService { SidebarService.singleton = this; } + // eslint-disable-next-line no-constructor-return return SidebarService.singleton; } diff --git a/app/assets/javascripts/sidebar/sidebar_mediator.js b/app/assets/javascripts/sidebar/sidebar_mediator.js index 7df901577b8..4df00903ab6 100644 --- a/app/assets/javascripts/sidebar/sidebar_mediator.js +++ b/app/assets/javascripts/sidebar/sidebar_mediator.js @@ -11,6 +11,8 @@ export default class SidebarMediator { if (!SidebarMediator.singleton) { this.initSingleton(options); } + + // eslint-disable-next-line no-constructor-return return SidebarMediator.singleton; } diff --git a/app/assets/javascripts/sidebar/stores/sidebar_store.js b/app/assets/javascripts/sidebar/stores/sidebar_store.js index ca85ee7fd94..971e2a15c68 100644 --- a/app/assets/javascripts/sidebar/stores/sidebar_store.js +++ b/app/assets/javascripts/sidebar/stores/sidebar_store.js @@ -4,6 +4,7 @@ export default class SidebarStore { this.initSingleton(options); } + // eslint-disable-next-line no-constructor-return return SidebarStore.singleton; } diff --git a/app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js b/app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js new file mode 100644 index 00000000000..1c08433ee78 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/sidebar/epics_select/epics_select_bundle.js @@ -0,0 +1 @@ +// This empty file satisfies the import/no-unresolved rule for ee_else_ce imports. diff --git a/app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js b/app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js new file mode 100644 index 00000000000..1c08433ee78 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/sidebar/health_status_select/health_status_bundle.js @@ -0,0 +1 @@ +// This empty file satisfies the import/no-unresolved rule for ee_else_ce imports. diff --git a/app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js b/app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js new file mode 100644 index 00000000000..1c08433ee78 --- /dev/null +++ b/app/assets/javascripts/vue_shared/components/sidebar/iterations_dropdown_bundle.js @@ -0,0 +1 @@ +// This empty file satisfies the import/no-unresolved rule for ee_else_ce imports. diff --git a/app/helpers/commits_helper.rb b/app/helpers/commits_helper.rb index 3c3179f6fbe..33b771eef69 100644 --- a/app/helpers/commits_helper.rb +++ b/app/helpers/commits_helper.rb @@ -184,7 +184,7 @@ module CommitsHelper def diff_mode_swap_button(mode, file_hash) icon = mode == 'raw' ? 'doc-code' : 'doc-text' - entity = mode == 'raw' ? 'toHideBtn' : 'toShowBtn' + entity = mode == 'raw' ? 'rawButton' : 'renderedButton' title = "Display #{mode} diff" link_to("##{mode}-diff-#{file_hash}", diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index 71c8296ad2e..789081556bb 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -33,6 +33,7 @@ module DiffHelper if action_name == 'diff_for_path' options[:expanded] = true options[:paths] = params.values_at(:old_path, :new_path) + options[:use_extra_viewer_as_main] = false end options diff --git a/app/helpers/search_helper.rb b/app/helpers/search_helper.rb index 23391bd1148..126d2e0f829 100644 --- a/app/helpers/search_helper.rb +++ b/app/helpers/search_helper.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true module SearchHelper + # params which should persist when a new tab is selected SEARCH_GENERIC_PARAMS = [ :search, :scope, @@ -129,7 +130,7 @@ module SearchHelper end def search_service - @search_service ||= ::SearchService.new(current_user, params.merge(confidential: Gitlab::Utils.to_boolean(params[:confidential]))) + @search_service ||= ::SearchService.new(current_user, sanitized_search_params) end def search_sort_options @@ -481,6 +482,13 @@ module SearchHelper def feature_flag_tab_enabled?(flag) @group || Feature.enabled?(flag, current_user, type: :ops) end + + def sanitized_search_params + sanitized_params = params.dup + sanitized_params[:confidential] = Gitlab::Utils.to_boolean(sanitized_params[:confidential]) if sanitized_params.key?(:confidential) + + sanitized_params + end end SearchHelper.prepend_mod_with('SearchHelper') diff --git a/app/mailers/emails/admin_notification.rb b/app/mailers/emails/admin_notification.rb index f44dd448a35..9d02d4132a1 100644 --- a/app/mailers/emails/admin_notification.rb +++ b/app/mailers/emails/admin_notification.rb @@ -16,11 +16,16 @@ module Emails mail to: email, subject: "Unsubscribed from GitLab administrator notifications" end - def user_auto_banned_email(admin_id, user_id, max_project_downloads:, within_seconds:) + def user_auto_banned_email(admin_id, user_id, max_project_downloads:, within_seconds:, group: nil) admin = User.find(admin_id) @user = User.find(user_id) @max_project_downloads = max_project_downloads @within_minutes = within_seconds / 60 + @ban_scope = if group.present? + _('your group (%{group_name})' % { group_name: group.name }) + else + _('your GitLab instance') + end Gitlab::I18n.with_locale(admin.preferred_language) do email_with_layout( diff --git a/app/mailers/previews/notify_preview.rb b/app/mailers/previews/notify_preview.rb index 61456ef79c8..074aec54b10 100644 --- a/app/mailers/previews/notify_preview.rb +++ b/app/mailers/previews/notify_preview.rb @@ -205,10 +205,14 @@ class NotifyPreview < ActionMailer::Preview Notify.inactive_project_deletion_warning_email(project, user, '2022-04-22').message end - def user_auto_banned_email + def user_auto_banned_instance_email ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600).message end + def user_auto_banned_namespace_email + ::Notify.user_auto_banned_email(user.id, user.id, max_project_downloads: 5, within_seconds: 600, group: group).message + end + private def project @@ -239,6 +243,10 @@ class NotifyPreview < ActionMailer::Preview @user ||= User.last end + def group + @group ||= Group.last + end + def member @member ||= Member.last end diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index 241ed7a860f..afe4927ee73 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -8,9 +8,12 @@ class CommitStatus < Ci::ApplicationRecord include EnumWithNil include BulkInsertableAssociations include TaggableQueries + include IgnorableColumns self.table_name = 'ci_builds' + ignore_column :token, remove_with: '15.4', remove_after: '2022-08-22' + belongs_to :user belongs_to :project belongs_to :pipeline, class_name: 'Ci::Pipeline', foreign_key: :commit_id diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb index 77038d52efe..7cf15439b47 100644 --- a/app/models/protected_branch.rb +++ b/app/models/protected_branch.rb @@ -4,6 +4,8 @@ class ProtectedBranch < ApplicationRecord include ProtectedRef include Gitlab::SQL::Pattern + CACHE_EXPIRE_IN = 1.hour + scope :requiring_code_owner_approval, -> { where(code_owner_approval_required: true) } @@ -29,7 +31,7 @@ class ProtectedBranch < ApplicationRecord return true if project.empty_repo? && project.default_branch_protected? return false if ref_name.blank? - Rails.cache.fetch(protected_ref_cache_key(project, ref_name)) do + Rails.cache.fetch(protected_ref_cache_key(project, ref_name), expires_in: CACHE_EXPIRE_IN) do self.matching(ref_name, protected_refs: protected_refs(project)).present? end end diff --git a/app/services/ci/generate_coverage_reports_service.rb b/app/services/ci/generate_coverage_reports_service.rb index 12b1f19f4b5..f8702b5536b 100644 --- a/app/services/ci/generate_coverage_reports_service.rb +++ b/app/services/ci/generate_coverage_reports_service.rb @@ -32,5 +32,20 @@ module Ci def latest?(base_pipeline, head_pipeline, data) data&.fetch(:key, nil) == key(base_pipeline, head_pipeline) end + + private + + def key(base_pipeline, head_pipeline) + return super unless Feature.enabled?(:ci_child_pipeline_coverage_reports, head_pipeline.project) + + [ + base_pipeline&.id, last_update_timestamp(base_pipeline), + head_pipeline&.id, last_update_timestamp(head_pipeline) + ] + end + + def last_update_timestamp(pipeline_hierarchy) + pipeline_hierarchy&.self_and_descendants&.maximum(:updated_at) + end end end diff --git a/app/uploaders/object_storage.rb b/app/uploaders/object_storage.rb index 1d56cddca63..891df5180d8 100644 --- a/app/uploaders/object_storage.rb +++ b/app/uploaders/object_storage.rb @@ -353,6 +353,20 @@ module ObjectStorage } end + def store_path(*args) + if self.object_store == Store::REMOTE + # We allow administrators to create "sub buckets" by setting a prefix. + # This makes it possible to deploy GitLab with only one object storage + # bucket. Because the prefix is configuration data we do not want to + # store it in the uploads table via RecordsUploads. That means that the + # prefix cannot be part of store_dir. This is why we chose to implement + # the prefix support here in store_path. + File.join([self.class.object_store_options.bucket_prefix, super].compact) + else + super + end + end + # Returns all the possible paths for an upload. # the `upload.path` is a lookup parameter, and it may change # depending on the `store` param. diff --git a/app/views/admin/application_settings/_mailgun.html.haml b/app/views/admin/application_settings/_mailgun.html.haml index e84fdc56f93..1239d9178ae 100644 --- a/app/views/admin/application_settings/_mailgun.html.haml +++ b/app/views/admin/application_settings/_mailgun.html.haml @@ -9,7 +9,7 @@ = _('Configure the %{link} integration.').html_safe % { link: link_to(_('Mailgun events'), 'https://documentation.mailgun.com/en/latest/user_manual.html#webhooks', target: '_blank', rel: 'noopener noreferrer') } .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-mailgun-settings'), html: { class: 'fieldset-form', id: 'mailgun-settings' } do |f| - = form_errors(@application_setting) if expanded + = form_errors(@application_setting, pajamas_alert: true) if expanded %fieldset .form-group diff --git a/app/views/admin/application_settings/_plantuml.html.haml b/app/views/admin/application_settings/_plantuml.html.haml index 57931544e65..9e22efce453 100644 --- a/app/views/admin/application_settings/_plantuml.html.haml +++ b/app/views/admin/application_settings/_plantuml.html.haml @@ -10,7 +10,7 @@ = link_to _('Learn more.'), help_page_path('administration/integration/plantuml.md'), target: '_blank', rel: 'noopener noreferrer' .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-plantuml-settings'), html: { class: 'fieldset-form', id: 'plantuml-settings' } do |f| - = form_errors(@application_setting) if expanded + = form_errors(@application_setting, pajamas_alert: true) if expanded %fieldset .form-group diff --git a/app/views/admin/application_settings/_registry.html.haml b/app/views/admin/application_settings/_registry.html.haml index 856db32e088..db4d1cb323c 100644 --- a/app/views/admin/application_settings/_registry.html.haml +++ b/app/views/admin/application_settings/_registry.html.haml @@ -1,5 +1,5 @@ = gitlab_ui_form_for @application_setting, url: ci_cd_admin_application_settings_path(anchor: 'js-registry-settings'), html: { class: 'fieldset-form' } do |f| - = form_errors(@application_setting) + = form_errors(@application_setting, pajamas_alert: true) %fieldset .form-group diff --git a/app/views/admin/application_settings/_repository_static_objects.html.haml b/app/views/admin/application_settings/_repository_static_objects.html.haml index d962d050ebc..a8e109ce377 100644 --- a/app/views/admin/application_settings/_repository_static_objects.html.haml +++ b/app/views/admin/application_settings/_repository_static_objects.html.haml @@ -1,5 +1,5 @@ = form_for @application_setting, url: repository_admin_application_settings_path(anchor: 'js-repository-static-objects-settings'), html: { class: 'fieldset-form' } do |f| - = form_errors(@application_setting) + = form_errors(@application_setting, pajamas_alert: true) %fieldset .form-group diff --git a/app/views/admin/application_settings/_signup.html.haml b/app/views/admin/application_settings/_signup.html.haml index fccf039533b..2365daa2c70 100644 --- a/app/views/admin/application_settings/_signup.html.haml +++ b/app/views/admin/application_settings/_signup.html.haml @@ -1,3 +1,3 @@ -= form_errors(@application_setting) += form_errors(@application_setting, pajamas_alert: true) #js-signup-form{ data: signup_form_data } diff --git a/app/views/admin/application_settings/_terminal.html.haml b/app/views/admin/application_settings/_terminal.html.haml index c53f63e124b..5703fbb463e 100644 --- a/app/views/admin/application_settings/_terminal.html.haml +++ b/app/views/admin/application_settings/_terminal.html.haml @@ -1,5 +1,5 @@ = form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-terminal-settings'), html: { class: 'fieldset-form', id: 'terminal-settings' } do |f| - = form_errors(@application_setting) + = form_errors(@application_setting, pajamas_alert: true) %fieldset .form-group diff --git a/app/views/admin/application_settings/_third_party_offers.html.haml b/app/views/admin/application_settings/_third_party_offers.html.haml index 205e14fb8ab..a868a397992 100644 --- a/app/views/admin/application_settings/_third_party_offers.html.haml +++ b/app/views/admin/application_settings/_third_party_offers.html.haml @@ -9,7 +9,7 @@ = _('Control whether to display customer experience improvement content and third-party offers in GitLab.') .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: 'js-third-party-offers-settings'), html: { class: 'fieldset-form', id: 'third-party-offers-settings' } do |f| - = form_errors(@application_setting) if expanded + = form_errors(@application_setting, pajamas_alert: true) if expanded %fieldset .form-group diff --git a/app/views/admin/application_settings/appearances/_form.html.haml b/app/views/admin/application_settings/appearances/_form.html.haml index 5816bd42a83..224d9fbe953 100644 --- a/app/views/admin/application_settings/appearances/_form.html.haml +++ b/app/views/admin/application_settings/appearances/_form.html.haml @@ -1,7 +1,7 @@ - parsed_with_gfm = (_("Content parsed with %{link}.") % { link: link_to('GitLab Flavored Markdown', help_page_path('user/markdown'), target: '_blank') }).html_safe = gitlab_ui_form_for @appearance, url: admin_application_settings_appearances_path, html: { class: 'gl-mt-3' } do |f| - = form_errors(@appearance) + = form_errors(@appearance, pajamas_alert: true) .row diff --git a/app/views/admin/application_settings/general.html.haml b/app/views/admin/application_settings/general.html.haml index 604b394ed35..52d39172556 100644 --- a/app/views/admin/application_settings/general.html.haml +++ b/app/views/admin/application_settings/general.html.haml @@ -94,7 +94,7 @@ = _('Manage Web IDE features.') .settings-content = gitlab_ui_form_for @application_setting, url: general_admin_application_settings_path(anchor: "js-web-ide-settings"), html: { class: 'fieldset-form', id: 'web-ide-settings' } do |f| - = form_errors(@application_setting) + = form_errors(@application_setting, pajamas_alert: true) %fieldset .form-group diff --git a/app/views/notify/_failed_builds.html.haml b/app/views/notify/_failed_builds.html.haml index ca589495284..fc4a063f5a9 100644 --- a/app/views/notify/_failed_builds.html.haml +++ b/app/views/notify/_failed_builds.html.haml @@ -4,7 +4,7 @@ %tr.table-warning %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; border: 1px solid #ededed; border-bottom: 0; border-radius: 4px 4px 0 0; overflow: hidden; background-color: #fdf4f6; color: #d22852; font-size: 14px; line-height: 1.4; text-align: center; padding: 8px 16px;" } - _('Failed jobs') + = n_('Failed job', 'Failed jobs', failed.size) %tr.section %td{ style: "font-family: 'Helvetica Neue',Helvetica,Arial,sans-serif; padding: 0 16px; border: 1px solid #ededed; border-radius: 4px; overflow: hidden; border-top: 0; border-radius: 0 0 4px 4px;" } %table.builds{ border: "0", cellpadding: "0", cellspacing: "0", style: "width: 100%; border-collapse: collapse;" } diff --git a/app/views/notify/user_auto_banned_email.html.haml b/app/views/notify/user_auto_banned_email.html.haml index d88c06526eb..8c33cd7299d 100644 --- a/app/views/notify/user_auto_banned_email.html.haml +++ b/app/views/notify/user_auto_banned_email.html.haml @@ -2,7 +2,7 @@ - link_end = ''.html_safe = email_default_heading(_("We've detected some unusual activity")) %p - = _('We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes } + = _('We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes, scope: @ban_scope } %p = _('If this is a mistake, you can %{link_start}unban them%{link_end}.').html_safe % { link_start: link_start % { url: admin_users_url(filter: 'banned') }, link_end: link_end } %p diff --git a/app/views/notify/user_auto_banned_email.text.erb b/app/views/notify/user_auto_banned_email.text.erb index 0469ee9788c..336973c2e42 100644 --- a/app/views/notify/user_auto_banned_email.text.erb +++ b/app/views/notify/user_auto_banned_email.text.erb @@ -1,6 +1,6 @@ <%= _("We've detected some unusual activity") %> -<%= _('We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes } %> +<%= _('We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes.') % { username: sanitize_name(@user.name), max_project_downloads: @max_project_downloads, within_minutes: @within_minutes, scope: @ban_scope } %> <%= _('If this is a mistake, you can unban them: %{url}.') % { url: admin_users_url(filter: 'banned') } %> diff --git a/app/views/profiles/gpg_keys/_form.html.haml b/app/views/profiles/gpg_keys/_form.html.haml index 9804a3b7735..b3784faed28 100644 --- a/app/views/profiles/gpg_keys/_form.html.haml +++ b/app/views/profiles/gpg_keys/_form.html.haml @@ -1,6 +1,6 @@ %div = form_for [:profile, @gpg_key], html: { class: 'js-requires-input' } do |f| - = form_errors(@gpg_key) + = form_errors(@gpg_key, pajamas_alert: true) .form-group = f.label :key, s_('Profiles|Key'), class: 'label-bold' diff --git a/app/views/projects/blob/_blob.html.haml b/app/views/projects/blob/_blob.html.haml index 2c3aade1068..8f3efb5da4e 100644 --- a/app/views/projects/blob/_blob.html.haml +++ b/app/views/projects/blob/_blob.html.haml @@ -2,6 +2,8 @@ - project = @project.present(current_user: current_user) - ref = local_assigns[:ref] || @ref - expanded = params[:expanded].present? +- if blob.rich_viewer + - add_page_startup_api_call local_assigns.fetch(:viewer_url) { url_for(safe_params.merge(viewer: blob.rich_viewer.type, format: :json)) } .info-well.d-none.d-sm-block .well-segment diff --git a/app/views/projects/diffs/_content.html.haml b/app/views/projects/diffs/_content.html.haml index 23f9afe8352..780bb3404cc 100644 --- a/app/views/projects/diffs/_content.html.haml +++ b/app/views/projects/diffs/_content.html.haml @@ -3,9 +3,9 @@ .diff-content - if diff_file.has_renderable? - %div{ id: "#raw-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'toHide' } } + .hidden{ id: "#raw-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'rawViewer' } } = render 'projects/diffs/viewer', viewer: diff_file.viewer - %div{ id: "#rendered-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'toShow' } } + %div{ id: "#rendered-diff-#{file_hash}", data: { file_hash: file_hash, diff_toggle_entity: 'renderedViewer' } } = render 'projects/diffs/viewer', viewer: diff_file.rendered.viewer - else = render 'projects/diffs/viewer', viewer: diff_file.viewer diff --git a/app/workers/gitlab_service_ping_worker.rb b/app/workers/gitlab_service_ping_worker.rb index 0f7b3ba56a5..a974667e5e0 100644 --- a/app/workers/gitlab_service_ping_worker.rb +++ b/app/workers/gitlab_service_ping_worker.rb @@ -30,8 +30,6 @@ class GitlabServicePingWorker # rubocop:disable Scalability/IdempotentWorker end def usage_data - return unless Feature.enabled?(:prerecord_service_ping_data) - ServicePing::BuildPayload.new.execute.tap do |payload| record = { recorded_at: payload[:recorded_at], diff --git a/config/feature_flags/development/prerecord_service_ping_data.yml b/config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml similarity index 52% rename from config/feature_flags/development/prerecord_service_ping_data.yml rename to config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml index ad284dbcce8..710a4f55130 100644 --- a/config/feature_flags/development/prerecord_service_ping_data.yml +++ b/config/feature_flags/development/custom_headers_streaming_audit_events_ui.yml @@ -1,8 +1,8 @@ --- -name: prerecord_service_ping_data -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/85503 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/360675 -milestone: '15.0' +name: custom_headers_streaming_audit_events_ui +introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/90135 +rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/365259 +milestone: '15.2' type: development -group: group::product intelligence -default_enabled: true +group: group::compliance +default_enabled: false diff --git a/config/object_store_settings.rb b/config/object_store_settings.rb index ea954b7061a..3280bc284ad 100644 --- a/config/object_store_settings.rb +++ b/config/object_store_settings.rb @@ -26,7 +26,9 @@ class ObjectStoreSettings def self.legacy_parse(object_store, object_store_type) object_store ||= Settingslogic.new({}) object_store['enabled'] = false if object_store['enabled'].nil? - object_store['remote_directory'] ||= nil + object_store['remote_directory'], object_store['bucket_prefix'] = split_bucket_prefix( + object_store['remote_directory'] + ) if support_legacy_background_upload?(object_store_type) object_store['direct_upload'] = false @@ -48,6 +50,22 @@ class ObjectStoreSettings ENV[LEGACY_BACKGROUND_UPLOADS_ENV].to_s.split(',').map(&:strip).include?(object_store_type) end + def self.split_bucket_prefix(bucket) + return [nil, nil] unless bucket.present? + + # Strictly speaking, object storage keys are not Unix paths and + # characters like '/' and '.' have no special meaning. But in practice, + # we do treat them like paths, and somewhere along the line something or + # somebody may turn '//' into '/' or try to resolve '/..'. To guard + # against this we reject "bad" combinations of '/' and '.'. + [%r{\A\.*/}, %r{/\.*/}, %r{/\.*\z}].each do |re| + raise 'invalid bucket' if re.match(bucket) + end + + bucket, prefix = bucket.split('/', 2) + [bucket, prefix] + end + def initialize(settings) @settings = settings end @@ -156,7 +174,9 @@ class ObjectStoreSettings next if allowed_storage_specific_settings?(store_type, section.to_h) # Map bucket (external name) -> remote_directory (internal representation) - target_config['remote_directory'] = target_config.delete('bucket') + target_config['remote_directory'], target_config['bucket_prefix'] = self.class.split_bucket_prefix( + target_config.delete('bucket') + ) target_config['consolidated_settings'] = true section['object_store'] = target_config # Settingslogic internally stores data as a Hash, but it also diff --git a/db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb b/db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb new file mode 100644 index 00000000000..10be7a25965 --- /dev/null +++ b/db/post_migrate/20220701085523_schedule_index_on_events_for_contribution_analytics_optimization.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +class ScheduleIndexOnEventsForContributionAnalyticsOptimization < Gitlab::Database::Migration[2.0] + INDEX_NAME = 'index_on_events_to_improve_contribution_analytics_performance' + + def up + prepare_async_index :events, [:project_id, :target_type, :action, :created_at, :author_id, :id], name: INDEX_NAME + end + + def down + unprepare_async_index :events, INDEX_NAME + end +end diff --git a/db/schema_migrations/20220701085523 b/db/schema_migrations/20220701085523 new file mode 100644 index 00000000000..c835395cd6d --- /dev/null +++ b/db/schema_migrations/20220701085523 @@ -0,0 +1 @@ +eb28e690d810a6b23454b0b5a2ebc1ff802cdf52f7c41faae7519ea8f018b96a \ No newline at end of file diff --git a/doc/administration/audit_event_streaming.md b/doc/administration/audit_event_streaming.md index 4e44a3a3e79..dfdb5c5e169 100644 --- a/doc/administration/audit_event_streaming.md +++ b/doc/administration/audit_event_streaming.md @@ -31,9 +31,9 @@ Users with at least the Owner role for a group can add event streaming destinati 1. On the top bar, select **Menu > Groups** and find your group. 1. On the left sidebar, select **Security & Compliance > Audit events** 1. On the main area, select **Streams** tab. - - When the destination list is empty, select **Add stream** activate edit mode and add a new destination. - - When the destination list is not empty, select **{plus}** under the **Streams** tab to activate edit mode. -1. Enter the endpoint you wish to add and select **Add**. + - When the destination list is empty, select **Add stream** to show the section for adding destinations. + - When the destination list is not empty, select **{plus}** to show the section for adding destinations. +1. Enter the destination URL to add and select **Add**. Event streaming is enabled if: @@ -143,18 +143,23 @@ Destination is deleted if: - The returned `errors` object is empty. - The API responds with `200 OK`. -## Custom HTTP header values +## Custom HTTP headers -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361216) in GitLab 15.1 [with a flag](feature_flags.md) named `streaming_audit_event_headers`. Disabled by default. -> - [Enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/362941) in GitLab 15.2. +> - API [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361216) in GitLab 15.1 [with a flag](feature_flags.md) named `streaming_audit_event_headers`. Disabled by default. +> - API [enabled on GitLab.com and self-managed](https://gitlab.com/gitlab-org/gitlab/-/issues/362941) in GitLab 15.2. +> - UI [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361630) in GitLab 15.2 [with a flag](feature_flags.md) named `custom_headers_streaming_audit_events_ui`. Disabled by default. FLAG: -On self-managed GitLab, by default this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `streaming_audit_event_headers`. -On GitLab.com, this feature is available. +On self-managed GitLab, by default the API for this feature is available. To hide the feature, ask an administrator to [disable the feature flag](../administration/feature_flags.md) named `streaming_audit_event_headers`. +On GitLab.com, the API for this feature is available. Each streaming destination can have up to 20 custom HTTP headers included with each streamed event. -### Add with the API +### Adding custom HTTP headers + +Add customer HTTP headers with the API or GitLab UI. + +#### Use the API Group owners can add a HTTP header using the GraphQL `auditEventsStreamingHeadersCreate` mutation. You can retrieve the destination ID by [listing the external audit destinations](#list-streaming-destinations) on the group. @@ -169,7 +174,37 @@ mutation { The header is created if the returned `errors` object is empty. -### Update with the API +#### Use the GitLab UI + +FLAG: +On self-managed GitLab, by default the UI for this feature is not available. To make it available per group, ask an administrator to +[enable the feature flag](../administration/feature_flags.md) named `custom_headers_streaming_audit_events_ui`. On GitLab.com, the UI for this feature is +not available. The UI for this feature is not ready for production use. Custom header values are not saved by the GitLab UI. To track progress on saving +custom header values in the GitLab UI, [see the relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/361631). + +Users with at least the Owner role for a group can add event streaming destinations and custom HTTP headers for it: + +1. On the top bar, select **Menu > Groups** and find your group. +1. On the left sidebar, select **Security & Compliance > Audit events** +1. On the main area, select **Streams** tab. + - When the destination list is empty, select **Add stream** to show the section for adding destinations. + - When the destination list is not empty, select **{plus}** to show the section for adding destinations. +1. Enter the destination URL to add. +1. Locate the **Custom HTTP headers** table. +1. In the **Header** column, add the header's name. +1. In the **Value** column, add the header's value. +1. Ignore the **Active** checkbox because it isn't functional. To track progress on adding functionality to the **Active** checkbox, see the + [relevant issue](https://gitlab.com/gitlab-org/gitlab/-/issues/361925). +1. Enter as many name and value pairs as required. When you enter a unique name and a value for a header, a new row in the table automatically appears. You can add up to + 20 headers per endpoint. +1. After all headers have been filled out, select **Add** to add the new endpoint. + +Event streaming is enabled if: + +- No warning is shown. +- The added endpoint is displayed in the UI. + +### Updating custom HTTP headers > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/361964) in GitLab 15.2. @@ -183,7 +218,7 @@ mutation { } ``` -### Delete with the API +### Deleting custom HTTP headers Group owners can remove a HTTP header using the GraphQL `auditEventsStreamingHeadersDestroy` mutation. You can retrieve the header ID by [listing all the custom headers](#list-all-custom-headers-with-the-api) on the group. diff --git a/doc/administration/object_storage.md b/doc/administration/object_storage.md index 47d01d92da5..5e54835c670 100644 --- a/doc/administration/object_storage.md +++ b/doc/administration/object_storage.md @@ -573,6 +573,15 @@ This ensures there are no collisions across the various types of data GitLab sto There are plans to [enable the use of a single bucket](https://gitlab.com/gitlab-org/gitlab/-/issues/292958) in the future. +With Omnibus and source installations it is possible to split a single +real bucket into multiple virtual buckets. If your object storage +bucket is called `my-gitlab-objects` you can configure uploads to go +into `my-gitlab-objects/uploads`, artifacts into +`my-gitlab-objects/artifacts`, etc. The application will act as if +these are separate buckets. Note that use of bucket prefixes [may not +work correctly with Helm +backups](https://gitlab.com/gitlab-org/charts/gitlab/-/issues/3376). + Helm-based installs require separate buckets to [handle backup restorations](https://docs.gitlab.com/charts/advanced/external-object-storage/#lfs-artifacts-uploads-packages-external-diffs-terraform-state-dependency-proxy). diff --git a/doc/api/packages/conan.md b/doc/api/packages/conan.md index 546a472ea53..1590893d006 100644 --- a/doc/api/packages/conan.md +++ b/doc/api/packages/conan.md @@ -19,6 +19,10 @@ NOTE: These endpoints do not adhere to the standard API authentication methods. See each route for details on how credentials are expected to be passed. +NOTE: +The Conan registry is not FIPS compliant and is disabled when [FIPS mode](../../development/fips_compliance.md) is enabled. +These endpoints will all return 404 Not Found. + ## Route prefix There are two sets of identical routes that each make requests in different scopes: diff --git a/doc/development/database/batched_background_migrations.md b/doc/development/database/batched_background_migrations.md index 01c03909d93..ece3b7b4614 100644 --- a/doc/development/database/batched_background_migrations.md +++ b/doc/development/database/batched_background_migrations.md @@ -355,7 +355,7 @@ You can view failures in two ways: - Via GitLab logs: 1. After running a batched background migration, if any jobs fail, - view the logs in [Kibana](https://log.gprd.gitlab.net/goto/5f06a57f768c6025e1c65aefb4075694). + view the logs in [Kibana](https://log.gprd.gitlab.net/goto/4cb43f40-f861-11ec-b86b-d963a1a6788e). View the production Sidekiq log and filter for: - `json.new_state: failed` diff --git a/doc/user/application_security/policies/scan-execution-policies.md b/doc/user/application_security/policies/scan-execution-policies.md index 50bb36a6a32..d9bbe9d21e9 100644 --- a/doc/user/application_security/policies/scan-execution-policies.md +++ b/doc/user/application_security/policies/scan-execution-policies.md @@ -65,7 +65,7 @@ the following sections and tables provide an alternative. | Field | Type | Possible values | Description | |-------|------|-----------------|-------------| -| `name` | `string` | | Name of the policy. | +| `name` | `string` | | Name of the policy. Maximum of 255 characters.| | `description` (optional) | `string` | | Description of the policy. | | `enabled` | `boolean` | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. | | `rules` | `array` of rules | | List of rules that the policy applies. | diff --git a/doc/user/application_security/policies/scan-result-policies.md b/doc/user/application_security/policies/scan-result-policies.md index aad425b4104..d6f9465327b 100644 --- a/doc/user/application_security/policies/scan-result-policies.md +++ b/doc/user/application_security/policies/scan-result-policies.md @@ -56,7 +56,7 @@ the following sections and tables provide an alternative. | Field | Type | Possible values | Description | |-------|------|-----------------|-------------| -| `name` | `string` | | Name of the policy. | +| `name` | `string` | | Name of the policy. Maximum of 255 characters.| | `description` (optional) | `string` | | Description of the policy. | | `enabled` | `boolean` | `true`, `false` | Flag to enable (`true`) or disable (`false`) the policy. | | `rules` | `array` of rules | | List of rules that the policy applies. | diff --git a/doc/user/packages/conan_repository/index.md b/doc/user/packages/conan_repository/index.md index b3eadc13772..264335cefea 100644 --- a/doc/user/packages/conan_repository/index.md +++ b/doc/user/packages/conan_repository/index.md @@ -14,6 +14,9 @@ The Conan package registry for GitLab is under development and isn't ready for p limited functionality. This [epic](https://gitlab.com/groups/gitlab-org/-/epics/6816) details the remaining work and timelines to make it production ready. +NOTE: +The Conan registry is not FIPS compliant and is disabled when [FIPS mode](../../../development/fips_compliance.md) is enabled. + Publish Conan packages in your project's Package Registry. Then install the packages whenever you need to use them as a dependency. diff --git a/lib/api/concerns/packages/conan_endpoints.rb b/lib/api/concerns/packages/conan_endpoints.rb index d1cc35b16d8..a90269b565c 100644 --- a/lib/api/concerns/packages/conan_endpoints.rb +++ b/lib/api/concerns/packages/conan_endpoints.rb @@ -43,6 +43,7 @@ module API end before do + not_found! if Gitlab::FIPS.enabled? require_packages_enabled! # Personal access token will be extracted from Bearer or Basic authorization diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index c73a5482cac..9068505aac8 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -225,7 +225,11 @@ module API def find_project_issue(iid, project_id = nil) project = project_id ? find_project!(project_id) : user_project - ::IssuesFinder.new(current_user, project_id: project.id).find_by!(iid: iid) + ::IssuesFinder.new( + current_user, + project_id: project.id, + issue_types: WorkItems::Type.allowed_types_for_issues + ).find_by!(iid: iid) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/lib/api/helpers/issues_helpers.rb b/lib/api/helpers/issues_helpers.rb index 185a10a250c..47ea9c9fe2c 100644 --- a/lib/api/helpers/issues_helpers.rb +++ b/lib/api/helpers/issues_helpers.rb @@ -60,7 +60,7 @@ module API args[:not][:label_name] ||= args[:not].delete(:labels) args[:scope] = args[:scope].underscore if args[:scope] args[:sort] = "#{args[:order_by]}_#{args[:sort]}" - args[:issue_types] ||= args.delete(:issue_type) + args[:issue_types] ||= args.delete(:issue_type) || WorkItems::Type.allowed_types_for_issues IssuesFinder.new(current_user, args) end diff --git a/lib/gitlab/ci/variables/builder.rb b/lib/gitlab/ci/variables/builder.rb index a452cb197ae..158559509b8 100644 --- a/lib/gitlab/ci/variables/builder.rb +++ b/lib/gitlab/ci/variables/builder.rb @@ -52,7 +52,7 @@ module Gitlab # https://gitlab.com/groups/gitlab-org/configure/-/epics/8 # Until then, we need to make both the old and the new KUBECONFIG contexts available collection.concat(deployment_variables(environment: environment, job: job)) - template = ::Ci::GenerateKubeconfigService.new(pipeline, token: job.token).execute + template = ::Ci::GenerateKubeconfigService.new(pipeline, token: job.try(:token)).execute kubeconfig_yaml = collection['KUBECONFIG']&.value template.merge_yaml(kubeconfig_yaml) if kubeconfig_yaml.present? diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 6779af2f80d..0f2969593c2 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -5277,6 +5277,9 @@ msgstr "" msgid "AuditLogs|User Events" msgstr "" +msgid "AuditStreams|A header with this name already exists." +msgstr "" + msgid "AuditStreams|Active" msgstr "" @@ -5301,6 +5304,9 @@ msgstr "" msgid "AuditStreams|Cancel editing" msgstr "" +msgid "AuditStreams|Custom HTTP headers" +msgstr "" + msgid "AuditStreams|Delete %{link}" msgstr "" @@ -5310,6 +5316,12 @@ msgstr "" msgid "AuditStreams|Destinations receive all audit event data" msgstr "" +msgid "AuditStreams|Header" +msgstr "" + +msgid "AuditStreams|Maximum of %{number} HTTP headers has been reached." +msgstr "" + msgid "AuditStreams|Setup streaming for audit events" msgstr "" @@ -5325,6 +5337,9 @@ msgstr "" msgid "AuditStreams|This is great for keeping everything one place." msgstr "" +msgid "AuditStreams|Value" +msgstr "" + msgid "Aug" msgstr "" @@ -15660,6 +15675,11 @@ msgstr "" msgid "Failed Jobs" msgstr "" +msgid "Failed job" +msgid_plural "Failed jobs" +msgstr[0] "" +msgstr[1] "" + msgid "Failed on" msgstr "" @@ -42970,7 +42990,7 @@ msgstr "" msgid "We want to be sure it is you, please confirm you are not a robot." msgstr "" -msgid "We want to let you know %{username} has been banned from your GitLab instance due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes." +msgid "We want to let you know %{username} has been banned from %{scope} due to them downloading more than %{max_project_downloads} project repositories within %{within_minutes} minutes." msgstr "" msgid "We will notify %{inviter} that you declined their invitation to join GitLab. You will stop receiving reminders." @@ -46716,6 +46736,12 @@ msgstr "" msgid "yaml invalid" msgstr "" +msgid "your GitLab instance" +msgstr "" + +msgid "your group (%{group_name})" +msgstr "" + msgid "your settings" msgstr "" diff --git a/package.json b/package.json index 1bdcd5073b1..4e2e894d2a2 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,7 @@ "@babel/preset-env": "^7.18.2", "@gitlab/at.js": "1.5.7", "@gitlab/favicon-overlay": "2.0.0", - "@gitlab/svgs": "2.24.0", + "@gitlab/svgs": "2.25.0", "@gitlab/ui": "42.12.0", "@gitlab/visual-review-tools": "1.7.3", "@rails/actioncable": "6.1.4-7", @@ -200,7 +200,7 @@ "yaml": "^2.0.0-10" }, "devDependencies": { - "@gitlab/eslint-plugin": "12.1.0", + "@gitlab/eslint-plugin": "12.3.0", "@gitlab/stylelint-config": "4.1.0", "@graphql-eslint/eslint-plugin": "3.10.4", "@testing-library/dom": "^7.16.2", diff --git a/spec/config/object_store_settings_spec.rb b/spec/config/object_store_settings_spec.rb index 56ad0943377..1555124fe03 100644 --- a/spec/config/object_store_settings_spec.rb +++ b/spec/config/object_store_settings_spec.rb @@ -73,6 +73,7 @@ RSpec.describe ObjectStoreSettings do expect(settings.artifacts['object_store']['background_upload']).to be false expect(settings.artifacts['object_store']['proxy_download']).to be false expect(settings.artifacts['object_store']['remote_directory']).to eq('artifacts') + expect(settings.artifacts['object_store']['bucket_prefix']).to eq(nil) expect(settings.artifacts['object_store']['consolidated_settings']).to be true expect(settings.artifacts).to eq(settings['artifacts']) @@ -83,6 +84,7 @@ RSpec.describe ObjectStoreSettings do expect(settings.lfs['object_store']['background_upload']).to be false expect(settings.lfs['object_store']['proxy_download']).to be true expect(settings.lfs['object_store']['remote_directory']).to eq('lfs-objects') + expect(settings.lfs['object_store']['bucket_prefix']).to eq(nil) expect(settings.lfs['object_store']['consolidated_settings']).to be true expect(settings.lfs).to eq(settings['lfs']) @@ -90,6 +92,7 @@ RSpec.describe ObjectStoreSettings do expect(settings.pages['object_store']['enabled']).to be true expect(settings.pages['object_store']['connection']).to eq(connection) expect(settings.pages['object_store']['remote_directory']).to eq('pages') + expect(settings.pages['object_store']['bucket_prefix']).to eq(nil) expect(settings.pages['object_store']['consolidated_settings']).to be true expect(settings.pages).to eq(settings['pages']) @@ -98,6 +101,18 @@ RSpec.describe ObjectStoreSettings do expect(settings.external_diffs).to eq(settings['external_diffs']) end + it 'supports bucket prefixes' do + config['object_store']['objects']['artifacts']['bucket'] = 'gitlab/artifacts' + config['object_store']['objects']['lfs']['bucket'] = 'gitlab/lfs' + + subject + + expect(settings.artifacts['object_store']['remote_directory']).to eq('gitlab') + expect(settings.artifacts['object_store']['bucket_prefix']).to eq('artifacts') + expect(settings.lfs['object_store']['remote_directory']).to eq('gitlab') + expect(settings.lfs['object_store']['bucket_prefix']).to eq('lfs') + end + it 'raises an error when a bucket is missing' do config['object_store']['objects']['lfs'].delete('bucket') @@ -152,6 +167,7 @@ RSpec.describe ObjectStoreSettings do expect(settings.artifacts['enabled']).to be true expect(settings.artifacts['object_store']['remote_directory']).to be_nil + expect(settings.artifacts['object_store']['bucket_prefix']).to be_nil expect(settings.artifacts['object_store']['enabled']).to be_falsey expect(settings.artifacts['object_store']['consolidated_settings']).to be_falsey end @@ -177,6 +193,7 @@ RSpec.describe ObjectStoreSettings do expect(settings.artifacts['object_store']).to be_nil expect(settings.lfs['object_store']['remote_directory']).to eq('some-bucket') + expect(settings.lfs['object_store']['bucket_prefix']).to eq(nil) # Disable background_upload, regardless of the input config expect(settings.lfs['object_store']['direct_upload']).to eq(true) expect(settings.lfs['object_store']['background_upload']).to eq(false) @@ -203,6 +220,7 @@ RSpec.describe ObjectStoreSettings do expect(settings.artifacts['object_store']).to be_nil expect(settings.lfs['object_store']['remote_directory']).to eq('some-bucket') + expect(settings.lfs['object_store']['bucket_prefix']).to eq(nil) # Enable background_upload if the environment variable is available expect(settings.lfs['object_store']['direct_upload']).to eq(false) expect(settings.lfs['object_store']['background_upload']).to eq(true) @@ -220,6 +238,7 @@ RSpec.describe ObjectStoreSettings do expect(settings['direct_upload']).to be true expect(settings['background_upload']).to be false expect(settings['remote_directory']).to be nil + expect(settings['bucket_prefix']).to be nil end it 'respects original values' do @@ -234,6 +253,18 @@ RSpec.describe ObjectStoreSettings do expect(settings['direct_upload']).to be true expect(settings['background_upload']).to be false expect(settings['remote_directory']).to eq 'artifacts' + expect(settings['bucket_prefix']).to be nil + end + + it 'supports bucket prefixes' do + original_settings = Settingslogic.new({ + 'enabled' => true, + 'remote_directory' => 'gitlab/artifacts' + }) + + settings = described_class.legacy_parse(original_settings, 'artifacts') + expect(settings['remote_directory']).to eq 'gitlab' + expect(settings['bucket_prefix']).to eq 'artifacts' end context 'legacy background upload environment variable is enabled' do @@ -253,6 +284,7 @@ RSpec.describe ObjectStoreSettings do expect(settings['direct_upload']).to be false expect(settings['background_upload']).to be true expect(settings['remote_directory']).to eq 'artifacts' + expect(settings['bucket_prefix']).to eq nil end end @@ -273,6 +305,50 @@ RSpec.describe ObjectStoreSettings do expect(settings['direct_upload']).to be true expect(settings['background_upload']).to be false expect(settings['remote_directory']).to eq 'artifacts' + expect(settings['bucket_prefix']).to eq nil + end + end + end + + describe '.split_bucket_prefix' do + using RSpec::Parameterized::TableSyntax + + subject { described_class.split_bucket_prefix(input) } + + context 'valid inputs' do + where(:input, :bucket, :prefix) do + nil | nil | nil + '' | nil | nil + 'bucket' | 'bucket' | nil + 'bucket/prefix' | 'bucket' | 'prefix' + 'bucket/pre/fix' | 'bucket' | 'pre/fix' + end + + with_them do + it { expect(subject).to eq([bucket, prefix]) } + end + end + + context 'invalid inputs' do + where(:input) do + [ + ['bucket/'], + ['bucket/.'], + ['bucket/..'], + ['bucket/prefix/'], + ['bucket/prefix/.'], + ['bucket/prefix/..'], + ['/bucket/prefix'], + ['./bucket/prefix'], + ['../bucket/prefix'], + ['bucket//prefix'], + ['bucket/./prefix'], + ['bucket/../prefix'] + ] + end + + with_them do + it { expect { subject }.to raise_error(/invalid bucket/) } end end end diff --git a/spec/features/projects/commits/multi_view_diff_spec.rb b/spec/features/projects/commits/multi_view_diff_spec.rb index 282112a3767..5af2e367aed 100644 --- a/spec/features/projects/commits/multi_view_diff_spec.rb +++ b/spec/features/projects/commits/multi_view_diff_spec.rb @@ -46,28 +46,28 @@ RSpec.describe 'Multiple view Diffs', :js do end context 'opening a diff with ipynb' do - it 'loads the rendered diff as hidden' do + it 'loads the raw diff as hidden' do diff = page.find('.diff-file, .file-holder', match: :first) - expect(diff).not_to have_selector '[data-diff-toggle-entity="toHide"]' - expect(diff).to have_selector '[data-diff-toggle-entity="toShow"]' + expect(diff).not_to have_selector '[data-diff-toggle-entity="rawViewer"]' + expect(diff).to have_selector '[data-diff-toggle-entity="renderedViewer"]' - expect(classes_for_element(diff, 'toHide', visible: false)).to include('hidden') - expect(classes_for_element(diff, 'toShow')).not_to include('hidden') + expect(classes_for_element(diff, 'rawViewer', visible: false)).to include('hidden') + expect(classes_for_element(diff, 'renderedViewer')).not_to include('hidden') - expect(classes_for_element(diff, 'toShowBtn')).to include('selected') - expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected') + expect(classes_for_element(diff, 'renderedButton')).to include('selected') + expect(classes_for_element(diff, 'rawButton')).not_to include('selected') end - it 'displays the rendered diff and hides after selection changes' do + it 'displays the raw diff and hides after selection changes' do diff = page.find('.diff-file, .file-holder', match: :first) - diff.find('[data-diff-toggle-entity="toShowBtn"]').click + diff.find('[data-diff-toggle-entity="rawButton"]').click - expect(diff).to have_selector '[data-diff-toggle-entity="toShow"]' - expect(diff).not_to have_selector '[data-diff-toggle-entity="toHide"]' + expect(diff).to have_selector '[data-diff-toggle-entity="rawViewer"]' + expect(diff).not_to have_selector '[data-diff-toggle-entity="renderedViewer"]' - expect(classes_for_element(diff, 'toHideBtn')).not_to include('selected') - expect(classes_for_element(diff, 'toShowBtn')).to include('selected') + expect(classes_for_element(diff, 'renderedButton')).not_to include('selected') + expect(classes_for_element(diff, 'rawButton')).to include('selected') end it 'transforms the diff' do diff --git a/spec/features/projects/new_project_spec.rb b/spec/features/projects/new_project_spec.rb index a1e92a79516..9d2d1454d77 100644 --- a/spec/features/projects/new_project_spec.rb +++ b/spec/features/projects/new_project_spec.rb @@ -61,15 +61,15 @@ RSpec.describe 'New project', :js do expect(page).to have_link('GitLab export') end - describe 'github import option' do + shared_examples 'renders importer link' do |params| context 'with user namespace' do before do visit new_project_path click_link 'Import project' end - it 'renders link to github importer' do - expect(page).to have_link(href: new_import_github_path) + it "renders link to #{params[:name]} importer" do + expect(page).to have_link(href: Rails.application.routes.url_helpers.send(params[:route])) end end @@ -82,21 +82,56 @@ RSpec.describe 'New project', :js do click_link 'Import project' end - it 'renders link to github importer including namespace id' do - expect(page).to have_link(href: new_import_github_path(namespace_id: group.id)) + it "renders link to #{params[:name]} importer including namespace id" do + expect(page).to have_link(href: Rails.application.routes.url_helpers.send(params[:route], namespace_id: group.id)) end end end - describe 'manifest import option' do - before do - visit new_project_path + describe 'importer links' do + shared_examples 'link to importers' do + let(:importer_routes) do + { + 'github': :new_import_github_path, + 'bitbucket': :status_import_bitbucket_path, + 'bitbucket server': :status_import_bitbucket_server_path, + 'gitlab.com': :status_import_gitlab_path, + 'fogbugz': :new_import_fogbugz_path, + 'gitea': :new_import_gitea_path, + 'manifest': :new_import_manifest_path, + 'phabricator': :new_import_phabricator_path + } + end - click_link 'Import project' + it 'renders links to several importers', :aggregate_failures do + importer_routes.each_value do |route| + expect(page).to have_link(href: Rails.application.routes.url_helpers.send(route, link_params)) + end + end end - it 'has Manifest file' do - expect(page).to have_link('Manifest file') + context 'with user namespace' do + let(:link_params) { {} } + + before do + visit new_project_path + click_link 'Import project' + end + + include_examples 'link to importers' + end + + context 'with group namespace' do + let(:group) { create(:group, :private) } + let(:link_params) { { namespace_id: group.id } } + + before do + group.add_owner(user) + visit new_project_path(namespace_id: group.id) + click_link 'Import project' + end + + include_examples 'link to importers' end end diff --git a/spec/frontend/__helpers__/web_worker_fake.js b/spec/frontend/__helpers__/web_worker_fake.js index 041a9bd8540..fb37e41a853 100644 --- a/spec/frontend/__helpers__/web_worker_fake.js +++ b/spec/frontend/__helpers__/web_worker_fake.js @@ -14,8 +14,7 @@ const createRelativeRequire = (filename) => { const rel = path.relative(__dirname, path.dirname(filename)); const base = path.resolve(__dirname, rel); - // reason: Dynamic require should be fine here since the code is dynamically evaluated anyways. - // eslint-disable-next-line import/no-dynamic-require, global-require + // eslint-disable-next-line global-require return (pathArg) => require(transformRequirePath(base, pathArg)); }; diff --git a/spec/frontend/jobs/components/job_sidebar_details_container_spec.js b/spec/frontend/jobs/components/job_sidebar_details_container_spec.js index cc9a5e4ee25..4046f0269dd 100644 --- a/spec/frontend/jobs/components/job_sidebar_details_container_spec.js +++ b/spec/frontend/jobs/components/job_sidebar_details_container_spec.js @@ -42,7 +42,7 @@ describe('Job Sidebar Details Container', () => { expect(wrapper.html()).toBe(''); }); - it.each(['duration', 'erased_at', 'finished_at', 'queued', 'runner', 'coverage'])( + it.each(['duration', 'erased_at', 'finished_at', 'queued_at', 'runner', 'coverage'])( 'should not render %s details when missing', async (detail) => { await store.dispatch('receiveJobSuccess', { [detail]: undefined }); @@ -59,7 +59,7 @@ describe('Job Sidebar Details Container', () => { ['duration', 'Elapsed time: 6 seconds'], ['erased_at', 'Erased: 3 weeks ago'], ['finished_at', 'Finished: 3 weeks ago'], - ['queued', 'Queued: 9 seconds'], + ['queued_duration', 'Queued: 9 seconds'], ['runner', 'Runner: #1 (ABCDEFGH) local ci runner'], ['coverage', 'Coverage: 20%'], ])('uses %s to render job-%s', async (detail, value) => { diff --git a/spec/frontend/jobs/mock_data.js b/spec/frontend/jobs/mock_data.js index 57ec1c7ef3f..cc5fd92615a 100644 --- a/spec/frontend/jobs/mock_data.js +++ b/spec/frontend/jobs/mock_data.js @@ -930,7 +930,7 @@ export default { created_at: threeWeeksAgo.toISOString(), updated_at: threeWeeksAgo.toISOString(), finished_at: threeWeeksAgo.toISOString(), - queued: 9.54, + queued_duration: 9.54, status: { icon: 'status_success', text: 'passed', diff --git a/spec/frontend/lib/utils/rails_ujs_spec.js b/spec/frontend/lib/utils/rails_ujs_spec.js index 00c29b72e73..c10301523c9 100644 --- a/spec/frontend/lib/utils/rails_ujs_spec.js +++ b/spec/frontend/lib/utils/rails_ujs_spec.js @@ -8,7 +8,7 @@ beforeAll(async () => { // that jQuery isn't available *before* we import @rails/ujs. delete global.jQuery; - const { initRails } = await import('~/lib/utils/rails_ujs.js'); + const { initRails } = await import('~/lib/utils/rails_ujs'); initRails(); }); diff --git a/spec/helpers/commits_helper_spec.rb b/spec/helpers/commits_helper_spec.rb index 961e7688202..b5b572e9719 100644 --- a/spec/helpers/commits_helper_spec.rb +++ b/spec/helpers/commits_helper_spec.rb @@ -94,7 +94,7 @@ RSpec.describe CommitsHelper do it 'renders the correct select-rendered button' do expect(node[:title]).to eq('Display rendered diff') expect(node['data-file-hash']).to eq('abc') - expect(node['data-diff-toggle-entity']).to eq('toShowBtn') + expect(node['data-diff-toggle-entity']).to eq('renderedButton') expect(node.xpath("//a/svg")[0]["data-testid"]).to eq('doc-text-icon') end end @@ -105,7 +105,7 @@ RSpec.describe CommitsHelper do it 'renders the correct select-raw button' do expect(node[:title]).to eq('Display raw diff') expect(node['data-file-hash']).to eq('abc') - expect(node['data-diff-toggle-entity']).to eq('toHideBtn') + expect(node['data-diff-toggle-entity']).to eq('rawButton') expect(node.xpath("//a/svg")[0]["data-testid"]).to eq('doc-code-icon') end end diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb index de342444c15..44b24385a6f 100644 --- a/spec/lib/gitlab/git/commit_spec.rb +++ b/spec/lib/gitlab/git/commit_spec.rb @@ -62,7 +62,7 @@ RSpec.describe Gitlab::Git::Commit, :seed_helper do after do # Erase the new commit so other tests get the original repo - rugged_repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID) + repository.write_ref("refs/heads/master", SeedRepo::LastCommit::ID) end end diff --git a/spec/lib/gitlab/git/repository_spec.rb b/spec/lib/gitlab/git/repository_spec.rb index 3081a3960e9..f75e3352e96 100644 --- a/spec/lib/gitlab/git/repository_spec.rb +++ b/spec/lib/gitlab/git/repository_spec.rb @@ -676,7 +676,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do after do # Erase our commits so other tests get the original repo - repository_rugged.references.update("refs/heads/master", SeedRepo::LastCommit::ID) + repository.write_ref("refs/heads/master", SeedRepo::LastCommit::ID) end context "where 'follow' == true" do @@ -2294,7 +2294,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do after do # Erase our commits so other tests get the original repo - repository_rugged.references.update('refs/heads/master', SeedRepo::LastCommit::ID) + repository.write_ref('refs/heads/master', SeedRepo::LastCommit::ID) end it 'does not include the renamed file in the sparse checkout' do @@ -2343,7 +2343,7 @@ RSpec.describe Gitlab::Git::Repository, :seed_helper do def create_remote_branch(remote_name, branch_name, source_branch_name) source_branch = repository.branches.find { |branch| branch.name == source_branch_name } - repository_rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha) + repository.write_ref("refs/remotes/#{remote_name}/#{branch_name}", source_branch.dereferenced_target.sha) end def refs(dir) diff --git a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb index d3397e89f1f..95a995b1d5e 100644 --- a/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project/tree_restorer_spec.rb @@ -441,7 +441,7 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do end it 'has a new CI build token' do - expect(Ci::Build.where(token: 'abcd')).to be_empty + expect(Ci::Build.find_by_token('abcd')).to be_nil end end @@ -568,20 +568,10 @@ RSpec.describe Gitlab::ImportExport::Project::TreeRestorer do context 'when there is an existing build with build token' do before do - create(:ci_build, token: 'abcd') - end - - it_behaves_like 'restores project successfully', - issues: 1, - labels: 2, - label_with_priorities: 'A project label', - milestones: 1, - first_issue_labels: 1 - end - - context 'when there is an existing build with build token' do - before do - create(:ci_build, token: 'abcd') + create(:ci_build).tap do |job| + job.set_token('abcd') + job.save! + end end it_behaves_like 'restores project successfully', diff --git a/spec/mailers/emails/admin_notification_spec.rb b/spec/mailers/emails/admin_notification_spec.rb index a233be86a83..bfd07f1d438 100644 --- a/spec/mailers/emails/admin_notification_spec.rb +++ b/spec/mailers/emails/admin_notification_spec.rb @@ -18,12 +18,14 @@ RSpec.describe Emails::AdminNotification do let(:max_project_downloads) { 5 } let(:time_period) { 600 } + let(:group) { nil } subject do Notify.user_auto_banned_email( admin.id, user.id, max_project_downloads: max_project_downloads, - within_seconds: time_period + within_seconds: time_period, + group: group ) end @@ -45,6 +47,10 @@ RSpec.describe Emails::AdminNotification do is_expected.to have_body_text user.name end + it 'includes the scope of the ban' do + is_expected.to have_body_text "banned from your GitLab instance" + end + it 'includes the reason' do is_expected.to have_body_text "due to them downloading more than 5 project repositories within 10 minutes" end @@ -60,5 +66,13 @@ RSpec.describe Emails::AdminNotification do it 'includes the email reason' do is_expected.to have_body_text "You're receiving this email because of your account on localhost" end + + context 'when scoped to a group' do + let(:group) { create(:group) } + + it 'includes the scope of the ban' do + is_expected.to have_body_text "banned from your group (#{group.name})" + end + end end end diff --git a/spec/models/ci/build_spec.rb b/spec/models/ci/build_spec.rb index dea1c5c57e1..d45660d120d 100644 --- a/spec/models/ci/build_spec.rb +++ b/spec/models/ci/build_spec.rb @@ -2598,7 +2598,7 @@ RSpec.describe Ci::Build do context 'when token is empty' do before do - build.update_columns(token: nil, token_encrypted: nil) + build.update_columns(token_encrypted: nil) end it { is_expected.to be_nil} diff --git a/spec/models/ci/processable_spec.rb b/spec/models/ci/processable_spec.rb index cdd96d45561..743736236c2 100644 --- a/spec/models/ci/processable_spec.rb +++ b/spec/models/ci/processable_spec.rb @@ -57,7 +57,7 @@ RSpec.describe Ci::Processable do let(:clone_accessors) { ::Ci::Build.clone_accessors.without(::Ci::Build.extra_accessors) } let(:reject_accessors) do - %i[id status user token token_encrypted coverage trace runner + %i[id status user token_encrypted coverage trace runner artifacts_expire_at created_at updated_at started_at finished_at queued_at erased_by erased_at auto_canceled_by job_artifacts job_artifacts_archive diff --git a/spec/models/protected_branch_spec.rb b/spec/models/protected_branch_spec.rb index 366de809bed..a3fc09b31fb 100644 --- a/spec/models/protected_branch_spec.rb +++ b/spec/models/protected_branch_spec.rb @@ -190,6 +190,14 @@ RSpec.describe ProtectedBranch do expect(described_class).not_to receive(:matching) expect(described_class.protected?(project, protected_branch.name)).to eq(true) end + + it 'sets expires_in for a cache key' do + cache_key = described_class.protected_ref_cache_key(project, protected_branch.name) + + expect(Rails.cache).to receive(:fetch).with(cache_key, expires_in: 1.hour) + + described_class.protected?(project, protected_branch.name) + end end end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index b5db4492ab9..05ba79e2b98 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -2773,8 +2773,7 @@ RSpec.describe Repository do end def create_remote_branch(remote_name, branch_name, target) - rugged = rugged_repo(repository) - rugged.references.create("refs/remotes/#{remote_name}/#{branch_name}", target.id) + repository.write_ref("refs/remotes/#{remote_name}/#{branch_name}", target.id) end shared_examples '#ancestor?' do diff --git a/spec/requests/api/ci/runner/jobs_request_post_spec.rb b/spec/requests/api/ci/runner/jobs_request_post_spec.rb index 738c0bed6cf..3f3a61949d4 100644 --- a/spec/requests/api/ci/runner/jobs_request_post_spec.rb +++ b/spec/requests/api/ci/runner/jobs_request_post_spec.rb @@ -546,7 +546,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do let!(:job) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0) } let!(:job2) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'rubocop', stage: 'test', stage_idx: 0) } let!(:test_job) do - create(:ci_build, :pending, :queued, pipeline: pipeline, token: 'test-job-token', name: 'deploy', + create(:ci_build, :pending, :queued, pipeline: pipeline, name: 'deploy', stage: 'deploy', stage_idx: 1, options: { script: ['bash'], dependencies: [job2.name] }) end @@ -570,7 +570,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do let!(:job) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'spinach', stage: 'test', stage_idx: 0) } let!(:job2) { create(:ci_build, :pending, :queued, :tag, pipeline: pipeline, name: 'rubocop', stage: 'test', stage_idx: 0) } let!(:empty_dependencies_job) do - create(:ci_build, :pending, :queued, pipeline: pipeline, token: 'test-job-token', name: 'empty_dependencies_job', + create(:ci_build, :pending, :queued, pipeline: pipeline, name: 'empty_dependencies_job', stage: 'deploy', stage_idx: 1, options: { script: ['bash'], dependencies: [] }) end @@ -897,7 +897,7 @@ RSpec.describe API::Ci::Runner, :clean_gitlab_redis_shared_state do describe 'a job with excluded artifacts' do context 'when excluded paths are defined' do let(:job) do - create(:ci_build, :pending, :queued, pipeline: pipeline, token: 'test-job-token', name: 'test', + create(:ci_build, :pending, :queued, pipeline: pipeline, name: 'test', stage: 'deploy', stage_idx: 1, options: { artifacts: { paths: ['abc'], exclude: ['cde'] } }) end diff --git a/spec/requests/api/conan_instance_packages_spec.rb b/spec/requests/api/conan_instance_packages_spec.rb index ff3b332c620..54cad3093d7 100644 --- a/spec/requests/api/conan_instance_packages_spec.rb +++ b/spec/requests/api/conan_instance_packages_spec.rb @@ -17,6 +17,12 @@ RSpec.describe API::ConanInstancePackages do let_it_be(:url) { '/packages/conan/v1/conans/search' } it_behaves_like 'conan search endpoint' + + it_behaves_like 'conan FIPS mode' do + let(:params) { { q: package.conan_recipe } } + + subject { get api(url), params: params } + end end describe 'GET /api/v4/packages/conan/v1/users/authenticate' do diff --git a/spec/requests/api/conan_project_packages_spec.rb b/spec/requests/api/conan_project_packages_spec.rb index c108f2efaaf..e28105eb8eb 100644 --- a/spec/requests/api/conan_project_packages_spec.rb +++ b/spec/requests/api/conan_project_packages_spec.rb @@ -17,6 +17,12 @@ RSpec.describe API::ConanProjectPackages do let(:url) { "/projects/#{project.id}/packages/conan/v1/conans/search" } it_behaves_like 'conan search endpoint' + + it_behaves_like 'conan FIPS mode' do + let(:params) { { q: package.conan_recipe } } + + subject { get api(url), params: params } + end end describe 'GET /api/v4/projects/:id/packages/conan/v1/users/authenticate' do diff --git a/spec/requests/api/issues/issues_spec.rb b/spec/requests/api/issues/issues_spec.rb index ff7f8f0f7a9..dd7d32f3565 100644 --- a/spec/requests/api/issues/issues_spec.rb +++ b/spec/requests/api/issues/issues_spec.rb @@ -20,6 +20,7 @@ RSpec.describe API::Issues do let_it_be(:milestone) { create(:milestone, title: '1.0.0', project: project) } let_it_be(:empty_milestone) { create(:milestone, title: '2.0.0', project: project) } + let_it_be(:task) { create(:issue, :task, author: user, project: project) } let_it_be(:closed_issue) do create :closed_issue, diff --git a/spec/services/ci/generate_coverage_reports_service_spec.rb b/spec/services/ci/generate_coverage_reports_service_spec.rb index d12a9268e7e..dea946f3b1c 100644 --- a/spec/services/ci/generate_coverage_reports_service_spec.rb +++ b/spec/services/ci/generate_coverage_reports_service_spec.rb @@ -3,8 +3,9 @@ require 'spec_helper' RSpec.describe Ci::GenerateCoverageReportsService do + let_it_be(:project) { create(:project, :repository) } + let(:service) { described_class.new(project) } - let(:project) { create(:project, :repository) } describe '#execute' do subject { service.execute(base_pipeline, head_pipeline) } @@ -52,4 +53,55 @@ RSpec.describe Ci::GenerateCoverageReportsService do end end end + + describe '#latest?' do + subject { service.latest?(base_pipeline, head_pipeline, data) } + + let!(:base_pipeline) { nil } + let!(:head_pipeline) { create(:ci_pipeline, :with_coverage_reports, project: project) } + let!(:child_pipeline) { create(:ci_pipeline, child_of: head_pipeline) } + let!(:key) { service.send(:key, base_pipeline, head_pipeline) } + + let(:data) { { key: key } } + + context 'when cache key is latest' do + it { is_expected.to be_truthy } + end + + context 'when head pipeline has been updated' do + before do + head_pipeline.update_column(:updated_at, 1.minute.from_now) + end + + it { is_expected.to be_falsy } + end + + context 'when cache key is empty' do + let(:data) { { key: nil } } + + it { is_expected.to be_falsy } + end + + context 'when the pipeline has a child that is updated' do + before do + child_pipeline.update_column(:updated_at, 1.minute.from_now) + end + + it { is_expected.to be_falsy } + + context 'when feature flag ci_child_pipeline_coverage_reports is disabled' do + let!(:key) do + # `let!` is executed before `before` block. If the feature flag + # is stubbed in `before`, the first call to `#key` uses the + # default feature flag value (enabled). + # The feature flag needs to be stubbed before the first call to `#key` + # so that the first and second key are calculated using the same method. + stub_feature_flags(ci_child_pipeline_coverage_reports: false) + service.send(:key, base_pipeline, head_pipeline) + end + + it { is_expected.to be_truthy } + end + end + end end diff --git a/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb index 284c129221b..b786d7e5527 100644 --- a/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb +++ b/spec/support/shared_examples/lib/gitlab/ci/ci_trace_shared_examples.rb @@ -265,10 +265,9 @@ RSpec.shared_examples 'common trace features' do end context 'build token' do - let(:token) { 'my_secret_token' } + let(:token) { build.token } before do - build.update!(token: token) trace.append(token, 0) end diff --git a/spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb new file mode 100644 index 00000000000..a3e4379f4d3 --- /dev/null +++ b/spec/support/shared_examples/lib/gitlab/search_language_filter_shared_examples.rb @@ -0,0 +1,54 @@ +# frozen_string_literal: true + +RSpec.shared_examples 'search results filtered by language' do + let(:scope) { 'blobs' } + let(:filters) { { language: %w[Ruby Markdown] } } + let(:query) { 'def | popen | test' } + + before do + project.repository.index_commits_and_blobs + + ensure_elasticsearch_index! + end + + subject(:blob_results) { results.objects('blobs') } + + it 'filters by language', :sidekiq_inline, :aggregate_failures do + expected_paths = %w[ + files/ruby/popen.rb + files/markdown/ruby-style-guide.md + files/ruby/regex.rb + files/ruby/version_info.rb + CONTRIBUTING.md + ] + + paths = blob_results.map { |blob| blob.binary_path } + expect(blob_results.size).to eq(5) + expect(paths).to match_array(expected_paths) + end + + context 'when the search_blobs_language_aggregation feature flag is disabled' do + before do + stub_feature_flags(search_blobs_language_aggregation: false) + end + + it 'does not filter by language', :sidekiq_inline, :aggregate_failures do + expected_paths = %w[ + CHANGELOG + CONTRIBUTING.md + bar/branch-test.txt + custom-highlighting/test.gitlab-custom + files/ruby/popen.rb + files/ruby/regex.rb + files/ruby/version_info.rb + files/whitespace + encoding/test.txt + files/markdown/ruby-style-guide.md + ] + + paths = blob_results.map { |blob| blob.binary_path } + expect(blob_results.size).to eq(10) + expect(paths).to match_array(expected_paths) + end + end +end diff --git a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb index e6b0772aec1..d7c2b645de9 100644 --- a/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb +++ b/spec/support/shared_examples/requests/api/conan_packages_shared_examples.rb @@ -1,6 +1,10 @@ # frozen_string_literal: true RSpec.shared_examples 'conan ping endpoint' do + it_behaves_like 'conan FIPS mode' do + subject { get api(url) } + end + it 'responds with 200 OK when no token provided' do get api(url) @@ -85,6 +89,8 @@ end RSpec.shared_examples 'conan authenticate endpoint' do subject { get api(url), headers: headers } + it_behaves_like 'conan FIPS mode' + context 'when using invalid token' do let(:auth_token) { 'invalid_token' } @@ -159,6 +165,10 @@ RSpec.shared_examples 'conan authenticate endpoint' do end RSpec.shared_examples 'conan check_credentials endpoint' do + it_behaves_like 'conan FIPS mode' do + subject { get api(url), headers: headers } + end + it 'responds with a 200 OK with PAT' do get api(url), headers: headers @@ -390,6 +400,7 @@ end RSpec.shared_examples 'recipe snapshot endpoint' do subject { get api(url), headers: headers } + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects recipe for invalid project' it_behaves_like 'empty recipe for not found package' @@ -415,6 +426,7 @@ end RSpec.shared_examples 'package snapshot endpoint' do subject { get api(url), headers: headers } + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects recipe for invalid project' it_behaves_like 'empty recipe for not found package' @@ -436,6 +448,10 @@ RSpec.shared_examples 'package snapshot endpoint' do end RSpec.shared_examples 'recipe download_urls endpoint' do + it_behaves_like 'conan FIPS mode' do + let(:recipe_path) { package.conan_recipe_path } + end + it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects recipe for invalid project' it_behaves_like 'recipe download_urls' @@ -443,6 +459,10 @@ RSpec.shared_examples 'recipe download_urls endpoint' do end RSpec.shared_examples 'package download_urls endpoint' do + it_behaves_like 'conan FIPS mode' do + let(:recipe_path) { package.conan_recipe_path } + end + it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects recipe for invalid project' it_behaves_like 'package download_urls' @@ -457,6 +477,7 @@ RSpec.shared_examples 'recipe upload_urls endpoint' do 'conanmanifest.txt': 123 } end + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects invalid upload_url params' it_behaves_like 'handling empty values for username and channel' @@ -519,6 +540,7 @@ RSpec.shared_examples 'package upload_urls endpoint' do 'conan_package.tgz': 523 } end + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects invalid upload_url params' it_behaves_like 'handling empty values for username and channel' @@ -556,6 +578,7 @@ end RSpec.shared_examples 'delete package endpoint' do let(:recipe_path) { package.conan_recipe_path } + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'handling empty values for username and channel' @@ -665,6 +688,7 @@ RSpec.shared_examples 'not found request' do end RSpec.shared_examples 'recipe file download endpoint' do + it_behaves_like 'conan FIPS mode' it_behaves_like 'a public project with packages' it_behaves_like 'an internal project with packages' it_behaves_like 'a private project with packages' @@ -672,6 +696,7 @@ RSpec.shared_examples 'recipe file download endpoint' do end RSpec.shared_examples 'package file download endpoint' do + it_behaves_like 'conan FIPS mode' it_behaves_like 'a public project with packages' it_behaves_like 'an internal project with packages' it_behaves_like 'a private project with packages' @@ -697,6 +722,7 @@ RSpec.shared_examples 'project not found by project id' do end RSpec.shared_examples 'workhorse authorize endpoint' do + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects invalid file_name', 'conanfile.py.git%2fgit-upload-pack' it_behaves_like 'workhorse authorization' @@ -718,6 +744,7 @@ RSpec.shared_examples 'workhorse recipe file upload endpoint' do ) end + it_behaves_like 'conan FIPS mode' it_behaves_like 'rejects invalid recipe' it_behaves_like 'rejects invalid file_name', 'conanfile.py.git%2fgit-upload-pack' it_behaves_like 'uploads a package file' @@ -979,3 +1006,9 @@ RSpec.shared_examples 'workhorse authorization' do end end end + +RSpec.shared_examples 'conan FIPS mode' do + context 'when FIPS mode is enabled', :fips_mode do + it_behaves_like 'returning response status', :not_found + end +end diff --git a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb index 77c4a3431e2..de257fb4fde 100644 --- a/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb +++ b/spec/support/shared_examples/workers/concerns/git_garbage_collect_methods_shared_examples.rb @@ -259,7 +259,7 @@ RSpec.shared_examples 'can collect git garbage' do |update_statistics: true| tree: old_commit.tree, parents: [old_commit] ) - rugged.references.create("refs/heads/#{SecureRandom.hex(6)}", new_commit_sha) + repository.write_ref("refs/heads/#{SecureRandom.hex(6)}", new_commit_sha) end def packs(resource) diff --git a/spec/uploaders/object_storage_spec.rb b/spec/uploaders/object_storage_spec.rb index 13f70e3f85b..1bcc43b81a8 100644 --- a/spec/uploaders/object_storage_spec.rb +++ b/spec/uploaders/object_storage_spec.rb @@ -48,6 +48,28 @@ RSpec.describe ObjectStorage do expect(uploader.store_dir).to start_with("uploads/-/system/user/") end end + + describe '#store_path' do + subject { uploader.store_path('filename') } + + it 'uses store_dir' do + expect(subject).to eq("uploads/-/system/user/#{object.id}/filename") + end + + context 'when a bucket prefix is configured' do + before do + allow(uploader_class).to receive(:object_store_options) do + double( + bucket_prefix: 'my/prefix' + ) + end + end + + it 'uses store_dir and ignores prefix' do + expect(subject).to eq("uploads/-/system/user/#{object.id}/filename") + end + end + end end context 'object_store is Store::REMOTE' do @@ -60,6 +82,28 @@ RSpec.describe ObjectStorage do expect(uploader.store_dir).to start_with("user/") end end + + describe '#store_path' do + subject { uploader.store_path('filename') } + + it 'uses store_dir' do + expect(subject).to eq("user/#{object.id}/filename") + end + + context 'when a bucket prefix is configured' do + before do + allow(uploader_class).to receive(:object_store_options) do + double( + bucket_prefix: 'my/prefix' + ) + end + end + + it 'uses the prefix and store_dir' do + expect(subject).to eq("my/prefix/user/#{object.id}/filename") + end + end + end end end diff --git a/spec/workers/gitlab_service_ping_worker_spec.rb b/spec/workers/gitlab_service_ping_worker_spec.rb index 057639dcf1d..c88708dc50a 100644 --- a/spec/workers/gitlab_service_ping_worker_spec.rb +++ b/spec/workers/gitlab_service_ping_worker_spec.rb @@ -21,29 +21,12 @@ RSpec.describe GitlabServicePingWorker, :clean_gitlab_redis_shared_state do subject.perform end - context 'with prerecord_service_ping_data feature enabled' do - it 'delegates to ServicePing::SubmitService' do - stub_feature_flags(prerecord_service_ping_data: true) - - expect_next_instance_of(ServicePing::SubmitService, payload: payload) do |service| - expect(service).to receive(:execute) - end - - subject.perform + it 'delegates to ServicePing::SubmitService' do + expect_next_instance_of(ServicePing::SubmitService, payload: payload) do |service| + expect(service).to receive(:execute) end - end - context 'with prerecord_service_ping_data feature disabled' do - it 'does not prerecord ServicePing, and calls SubmitService', :aggregate_failures do - stub_feature_flags(prerecord_service_ping_data: false) - - expect(ServicePing::BuildPayload).not_to receive(:new) - expect(ServicePing::BuildPayload).not_to receive(:new) - expect_next_instance_of(ServicePing::SubmitService, payload: nil) do |service| - expect(service).to receive(:execute) - end - expect { subject.perform }.not_to change { RawUsageData.count } - end + subject.perform end context 'payload computation' do diff --git a/yarn.lock b/yarn.lock index d50a4eaab76..b2736b14457 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1016,18 +1016,18 @@ resolved "https://registry.yarnpkg.com/@gitlab/at.js/-/at.js-1.5.7.tgz#1ee6f838cc4410a1d797770934df91d90df8179e" integrity sha512-c6ySRK/Ma7lxwpIVbSAF3P+xiTLrNTGTLRx4/pHK111AdFxwgUwrYF6aVZFXvmG65jHOJHoa0eQQ21RW6rm0Rg== -"@gitlab/eslint-plugin@12.1.0": - version "12.1.0" - resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-12.1.0.tgz#e62f2591164895f8cfccb3dd9ac77f3586b6e3d8" - integrity sha512-rq+aaF45s3FSzFFoK2BZ7X/uzOIhAWA0rfG4q5SnoecbMuEpPEX2OGZFRh8VOePZLmiylfwyxH0Cv12evzyUtg== +"@gitlab/eslint-plugin@12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@gitlab/eslint-plugin/-/eslint-plugin-12.3.0.tgz#951453556fb3b4f43e3028fead65e083a8b90b0e" + integrity sha512-DV84zLLv/wDUjzoVJfpvvAAiaemKUqT1IZf16fEtlw/A4/x48vWJTMHQF7ciQtjz+gVKAnlht67IstSY8W19ZQ== dependencies: "@babel/core" "^7.17.0" "@babel/eslint-parser" "^7.17.0" "@babel/eslint-plugin" "^7.17.7" - eslint-config-airbnb-base "^14.2.1" + eslint-config-airbnb-base "^15.0.0" eslint-config-prettier "^6.10.0" eslint-plugin-babel "^5.3.0" - eslint-plugin-import "^2.22.1" + eslint-plugin-import "^2.26.0" eslint-plugin-jest "^23.8.2" eslint-plugin-promise "^4.2.1" eslint-plugin-unicorn "^40.1.0" @@ -1048,10 +1048,10 @@ stylelint-declaration-strict-value "1.8.0" stylelint-scss "4.2.0" -"@gitlab/svgs@2.24.0": - version "2.24.0" - resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.24.0.tgz#9d36c63cebe03012ddd5564d57765e53c954b8f0" - integrity sha512-a1ACWu4cVSHyhLTAPZ34K+9m+4lRx72UpZaX9XGGuabUEWNA4NXFtJ/c7C+VFAZIaEL5xfglOB8ft6lCvniVyA== +"@gitlab/svgs@2.25.0": + version "2.25.0" + resolved "https://registry.yarnpkg.com/@gitlab/svgs/-/svgs-2.25.0.tgz#0fb831959c9f312ebb665d23ba8944f26faea164" + integrity sha512-R2oS/VghjP1T4WSTEkbadrzencmBesortvHT8VZUgUB1uQTLg52b843rTw/atVWpW2ecFRrEbjM8/lDwUwx0Aw== "@gitlab/ui@42.12.0": version "42.12.0" @@ -2771,16 +2771,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.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.2.tgz#a8db03e0b88c8c6aeddc49cb132f9bcab4ebf9c8" - integrity sha512-w2GspexNQpx+PutG3QpT437/BenZBj0M/MZGn5mzv/MofYqo0xmRHzn4lFsoDlWJ+THYsGJmFlW68WlDFx7VRw== +array-includes@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.5.tgz#2c320010db8d31031fd2a5f6b3bbd4b1aad31bdb" + integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - get-intrinsic "^1.0.1" - is-string "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" + get-intrinsic "^1.1.1" + is-string "^1.0.7" array-union@^2.1.0: version "2.1.0" @@ -2792,14 +2792,15 @@ 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.flat@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz#6ef638b43312bd401b4c6199fdec7e2dc9e9a123" - integrity sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg== +array.prototype.flat@^1.2.5: + version "1.3.0" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz#0b0c1567bf57b38b56b4c97b8aa72ab45e4adc7b" + integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" + es-abstract "^1.19.2" + es-shim-unscopables "^1.0.0" arrify@^1.0.1: version "1.0.1" @@ -3889,11 +3890,6 @@ constants-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= -contains-path@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -4884,12 +4880,13 @@ define-lazy-prop@^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: - version "1.1.3" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== +define-properties@^1.1.3, define-properties@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" + integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== dependencies: - object-keys "^1.0.12" + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" define-property@^0.2.5: version "0.2.5" @@ -5026,13 +5023,12 @@ docdash@^1.0.2: resolved "https://registry.yarnpkg.com/docdash/-/docdash-1.0.2.tgz#0449a8f6bb247f563020b78a5485dea95ae2e094" integrity sha512-IEM57bWPLtVXpUeCKbiGvHsHtW9O9ZiiBPfeQDAZ7JdQiAF3aNWQoJ3e/+uJ63lHO009yn0tbJjtKpXJ2AURCQ== -doctrine@1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== dependencies: esutils "^2.0.2" - isarray "^1.0.0" doctrine@^3.0.0: version "3.0.0" @@ -5283,32 +5279,48 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0, error-ex@^1.3.1: +error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.1: - version "1.18.0-next.2" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2" - integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw== +es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5: + version "1.20.1" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.1.tgz#027292cd6ef44bd12b1913b828116f54787d1814" + integrity sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA== dependencies: call-bind "^1.0.2" es-to-primitive "^1.2.1" function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function.prototype.name "^1.1.5" + get-intrinsic "^1.1.1" + get-symbol-description "^1.0.0" has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.1" - is-regex "^1.1.1" - object-inspect "^1.9.0" + has-property-descriptors "^1.0.0" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + is-callable "^1.2.4" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-weakref "^1.0.2" + object-inspect "^1.12.0" object-keys "^1.1.1" object.assign "^4.1.2" - string.prototype.trimend "^1.0.3" - string.prototype.trimstart "^1.0.3" + regexp.prototype.flags "^1.4.3" + string.prototype.trimend "^1.0.5" + string.prototype.trimstart "^1.0.5" + unbox-primitive "^1.0.2" + +es-shim-unscopables@^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== + dependencies: + has "^1.0.3" es-to-primitive@^1.2.1: version "1.2.1" @@ -5383,14 +5395,15 @@ escodegen@^1.14.1: optionalDependencies: source-map "~0.6.1" -eslint-config-airbnb-base@^14.2.1: - version "14.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz#8a2eb38455dc5a312550193b319cdaeef042cd1e" - integrity sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA== +eslint-config-airbnb-base@^15.0.0: + version "15.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz#6b09add90ac79c2f8d723a2580e07f3925afd236" + integrity sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig== dependencies: confusing-browser-globals "^1.0.10" object.assign "^4.1.2" - object.entries "^1.1.2" + object.entries "^1.1.5" + semver "^6.3.0" eslint-config-prettier@^6.10.0: version "6.10.0" @@ -5407,13 +5420,13 @@ eslint-import-resolver-jest@3.0.2: find-root "^1.1.0" resolve "^1.12.0" -eslint-import-resolver-node@^0.3.4: - version "0.3.4" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" - integrity sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA== +eslint-import-resolver-node@^0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: - debug "^2.6.9" - resolve "^1.13.1" + debug "^3.2.7" + resolve "^1.20.0" eslint-import-resolver-webpack@0.13.2: version "0.13.2" @@ -5432,13 +5445,13 @@ eslint-import-resolver-webpack@0.13.2: resolve "^1.20.0" semver "^5.7.1" -eslint-module-utils@^2.6.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz#579ebd094f56af7797d19c9866c9c9486629bfa6" - integrity sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA== +eslint-module-utils@^2.7.3: + version "2.7.3" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.3.tgz#ad7e3a10552fdd0642e1e55292781bd6e34876ee" + integrity sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ== dependencies: - debug "^2.6.9" - pkg-dir "^2.0.0" + debug "^3.2.7" + find-up "^2.1.0" eslint-plugin-babel@^5.3.0: version "5.3.0" @@ -5447,24 +5460,24 @@ eslint-plugin-babel@^5.3.0: dependencies: eslint-rule-composer "^0.3.0" -eslint-plugin-import@^2.22.1: - version "2.22.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz#0896c7e6a0cf44109a2d97b95903c2bb689d7702" - integrity sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw== +eslint-plugin-import@^2.26.0: + version "2.26.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz#f812dc47be4f2b72b478a021605a59fc6fe8b88b" + integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA== dependencies: - array-includes "^3.1.1" - array.prototype.flat "^1.2.3" - contains-path "^0.1.0" + array-includes "^3.1.4" + array.prototype.flat "^1.2.5" debug "^2.6.9" - doctrine "1.5.0" - eslint-import-resolver-node "^0.3.4" - eslint-module-utils "^2.6.0" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.6" + eslint-module-utils "^2.7.3" has "^1.0.3" - minimatch "^3.0.4" - object.values "^1.1.1" - read-pkg-up "^2.0.0" - resolve "^1.17.0" - tsconfig-paths "^3.9.0" + is-core-module "^2.8.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.5" + resolve "^1.22.0" + tsconfig-paths "^3.14.1" eslint-plugin-jest@^23.8.2: version "23.8.2" @@ -6040,7 +6053,7 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -6203,11 +6216,26 @@ function-bind@^1.1.1: resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= +functions-have-names@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + fuzzaldrin-plus@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/fuzzaldrin-plus/-/fuzzaldrin-plus-0.6.0.tgz#832f6489fbe876769459599c914a670ec22947ee" @@ -6223,14 +6251,14 @@ get-caller-file@^2.0.1: 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.1, get-intrinsic@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.2.tgz#336975123e05ad0b7ba41f152ee4aadbea6cf598" + integrity sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA== dependencies: function-bind "^1.1.1" has "^1.0.3" - has-symbols "^1.0.1" + has-symbols "^1.0.3" get-package-type@^0.1.0: version "0.1.0" @@ -6271,6 +6299,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== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -6504,6 +6540,11 @@ hard-rejection@^2.1.0: resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -6514,10 +6555,17 @@ 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-symbols@^1.0.0, has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== +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== + dependencies: + get-intrinsic "^1.1.1" + +has-symbols@^1.0.1, 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" @@ -7019,6 +7067,15 @@ 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.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" + integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA== + dependencies: + get-intrinsic "^1.1.0" + has "^1.0.3" + side-channel "^1.0.4" + "internmap@1 - 2": version "2.0.3" resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" @@ -7068,6 +7125,13 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -7075,6 +7139,14 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + is-buffer@^1.1.5, is-buffer@~1.1.1: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -7092,10 +7164,10 @@ is-builtin-module@^3.1.0: dependencies: builtin-modules "^3.0.0" -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== +is-callable@^1.1.4, is-callable@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" + integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w== is-ci@^2.0.0: version "2.0.0" @@ -7104,10 +7176,10 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.5.0, is-core-module@^2.7.0, is-core-module@^2.8.1: - version "2.8.1" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" - integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== +is-core-module@^2.5.0, is-core-module@^2.7.0, is-core-module@^2.8.1, is-core-module@^2.9.0: + version "2.9.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" + integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== dependencies: has "^1.0.3" @@ -7185,7 +7257,7 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: version "4.0.3" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== @@ -7200,16 +7272,23 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" -is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== +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-npm@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7264,7 +7343,7 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= -is-regex@^1.1.1, is-regex@^1.1.4: +is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== @@ -7277,6 +7356,13 @@ is-regexp@^2.0.0: resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-2.1.0.tgz#cd734a56864e23b956bf4e7c66c396a4c0b22c2d" integrity sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA== +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== + dependencies: + call-bind "^1.0.2" + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -7287,23 +7373,32 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-string@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== - -is-symbol@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.2.tgz#a055f6ae57192caee329e7a860118b497a950f38" - integrity sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw== +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== dependencies: - has-symbols "^1.0.0" + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + is-whitespace@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" @@ -8184,16 +8279,6 @@ linkifyjs@^3.0.5: resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34" integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg== -load-json-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" - integrity sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - strip-bom "^3.0.0" - loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -9177,7 +9262,14 @@ minimatch@4.2.1: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@~3.0.4: +minimatch@^3.0.4, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@~3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== @@ -9193,10 +9285,10 @@ minimist-options@4.1.0: is-plain-obj "^1.1.0" kind-of "^6.0.3" -minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== +minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" + integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== minipass-collect@^1.0.2: version "1.0.2" @@ -9527,7 +9619,7 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.5.0: +normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -9609,12 +9701,12 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== +object-inspect@^1.12.0, object-inspect@^1.9.0: + version "1.12.2" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" + integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== -object-keys@^1.0.12, object-keys@^1.1.1: +object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== @@ -9636,15 +9728,14 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.entries@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.3.tgz#c601c7f168b62374541a07ddbd3e2d5e4f7711a6" - integrity sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg== +object.entries@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" + integrity sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.19.1" object.pick@^1.3.0: version "1.3.0" @@ -9653,15 +9744,14 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -object.values@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.2.tgz#7a2015e06fcb0f546bd652486ce8583a4731c731" - integrity sha512-MYC0jvJopr8EK6dPBiO8Nb9mvjdypOachO5REGk6MXzujbBrAisKo3HmdEI6kZDL6fC31Mwee/5YbtMebixeag== +object.values@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" + integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg== dependencies: - call-bind "^1.0.0" + call-bind "^1.0.2" define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - has "^1.0.3" + es-abstract "^1.19.1" obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" @@ -9912,13 +10002,6 @@ parse-color@^1.0.0: dependencies: color-convert "~0.5.0" -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -10015,13 +10098,6 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= -path-type@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" - integrity sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM= - dependencies: - pify "^2.0.0" - path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -10066,11 +10142,6 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - pify@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" @@ -10088,13 +10159,6 @@ pirates@^4.0.1: dependencies: node-modules-regexp "^1.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -10659,14 +10723,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -read-pkg-up@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" - integrity sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4= - dependencies: - find-up "^2.0.0" - read-pkg "^2.0.0" - read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -10676,15 +10732,6 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" -read-pkg@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" - integrity sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg= - dependencies: - load-json-file "^2.0.0" - normalize-package-data "^2.3.2" - path-type "^2.0.0" - read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -10788,6 +10835,15 @@ regexp-tree@^0.1.24, regexp-tree@~0.1.1: resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.24.tgz#3d6fa238450a4d66e5bc9c4c14bb720e2196829d" integrity sha512-s2aEVuLhvnVJW6s/iPgEGK6R+/xngd2jNQ+xy4bXNDKxZKJH6jpPHY6kVeVv1IeLCHgswRj+Kl3ELaDjG6V1iw== +regexp.prototype.flags@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" + integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + functions-have-names "^1.2.2" + regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -10989,12 +11045,12 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.9.0: - version "1.22.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" - integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.17.0, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: + version "1.22.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" + integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== dependencies: - is-core-module "^2.8.1" + is-core-module "^2.9.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -11406,6 +11462,15 @@ shortcss@^0.1.3: dependencies: css-shorthand-properties "^1.0.0" +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + sigmund@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" @@ -11739,21 +11804,23 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string.prototype.trimend@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== +string.prototype.trimend@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz#914a65baaab25fbdd4ee291ca7dde57e869cb8d0" + integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" -string.prototype.trimstart@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== +string.prototype.trimstart@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz#5466d93ba58cfa2134839f81d7f42437e8c01fef" + integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg== dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.19.5" string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" @@ -12274,14 +12341,14 @@ ts-node@^9: source-map-support "^0.5.17" yn "3.1.1" -tsconfig-paths@^3.9.0: - version "3.9.0" - resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b" - integrity sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw== +tsconfig-paths@^3.14.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz#ba0734599e8ea36c862798e920bcf163277b137a" + integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ== dependencies: "@types/json5" "^0.0.29" json5 "^1.0.1" - minimist "^1.2.0" + minimist "^1.2.6" strip-bom "^3.0.0" tslib@2.3.0, tslib@~2.3.0: @@ -12397,6 +12464,16 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.2.tgz#29032021057d5e6cdbd08c5129c226dff8ed6f9e" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + undefsafe@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" @@ -13231,6 +13308,17 @@ whatwg-url@^8.0.0: tr46 "^2.0.2" webidl-conversions "^5.0.0" +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"