diff --git a/.gitlab/ci/rules.gitlab-ci.yml b/.gitlab/ci/rules.gitlab-ci.yml index c9c83937434..512adfc282f 100644 --- a/.gitlab/ci/rules.gitlab-ci.yml +++ b/.gitlab/ci/rules.gitlab-ci.yml @@ -453,6 +453,106 @@ .feature-flag-development-config-patterns: &feature-flag-development-config-patterns - "{,ee/}config/feature_flags/{development,ops}/*.yml" +################## +# Conditions set # +################## +.strict-ee-only-rules: + rules: + - <<: *if-not-ee + when: never + - <<: *if-jh + when: never + +.as-if-jh-default-exclusion-rules: + rules: + - <<: *if-security-merge-request + when: never + - <<: *if-merge-request-targeting-stable-branch + when: never + - <<: *if-stable-branch-refs + when: never + - <<: *if-merge-request-labels-as-if-jh + allow_failure: true + +.rails:rules:minimal-default-rules: + rules: + - <<: *if-merge-request-approved + when: never + - <<: *if-automated-merge-request + when: never + - <<: *if-security-merge-request + when: never + + +.rails:rules:ee-and-foss-default-rules: + rules: + - <<: *if-merge-request-labels-run-all-rspec + - <<: *if-merge-request + changes: *core-backend-patterns + - <<: *if-merge-request + changes: *ci-patterns + - <<: *if-automated-merge-request + changes: *backend-patterns + - <<: *if-security-merge-request + changes: *backend-patterns + - <<: *if-merge-request-not-approved + when: never + +.rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules: + rules: + - <<: *if-merge-request + changes: *core-backend-patterns + when: never + - <<: *if-merge-request + changes: *ci-patterns + when: never + +.rails:rules:unit-integration:minimal-default-rules: + rules: + - <<: *if-merge-request-labels-run-all-rspec + when: never + - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules] + +.rails:rules:system-default-rules: + rules: + - <<: *if-merge-request-labels-run-all-rspec + - <<: *if-merge-request + changes: *core-backend-patterns + - <<: *if-merge-request + changes: *workhorse-patterns + - <<: *if-merge-request + changes: *ci-patterns + - <<: *if-automated-merge-request + changes: *code-backstage-patterns + - <<: *if-security-merge-request + changes: *code-backstage-patterns + - <<: *if-merge-request-not-approved + when: never + +.rails:rules:system:minimal-default-rules: + rules: + - <<: *if-merge-request-labels-run-all-rspec + when: never + - <<: *if-merge-request + changes: *core-backend-patterns + when: never + - <<: *if-merge-request + changes: *workhorse-patterns + when: never + - <<: *if-merge-request + changes: *ci-patterns + when: never + - <<: *if-merge-request + changes: *code-backstage-patterns + +.rails:rules:previous-failed-tests-default-rules: + rules: + - <<: *if-security-merge-request + when: never + - <<: *if-merge-request-labels-run-all-rspec + - <<: *if-merge-request + changes: *code-backstage-patterns + ################ # Shared rules # ################ @@ -516,7 +616,6 @@ rules: - <<: *if-default-refs changes: *code-backstage-patterns - when: on_success .dev-fixtures:rules:ee-only: rules: @@ -524,7 +623,6 @@ when: never - <<: *if-default-refs changes: *code-backstage-patterns - when: on_success ############## # Docs rules # @@ -540,7 +638,6 @@ rules: - <<: *if-default-refs changes: *docs-patterns - when: on_success .docs:rules:deprecations-and-removals: rules: @@ -550,14 +647,12 @@ ################## # GraphQL rules # ################## - .graphql:rules:graphql-verify: rules: - <<: *if-not-ee when: never - <<: *if-default-refs changes: *code-backstage-qa-patterns - when: on_success ################## # Frontend rules # @@ -589,18 +684,8 @@ .frontend:rules:compile-test-assets-as-if-jh: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-targeting-stable-branch - when: never - - <<: *if-stable-branch-refs - when: never - - <<: *if-merge-request-labels-as-if-jh - allow_failure: true + - !reference [".strict-ee-only-rules", rules] + - !reference [".as-if-jh-default-exclusion-rules", rules] - <<: *if-merge-request-labels-run-all-rspec allow_failure: true - changes: *code-backstage-qa-patterns @@ -616,10 +701,7 @@ .frontend:rules:default-frontend-jobs-as-if-foss: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never + - !reference [".strict-ee-only-rules", rules] - <<: *if-security-merge-request changes: *code-backstage-patterns - <<: *if-merge-request-labels-as-if-foss @@ -631,18 +713,8 @@ .frontend:rules:default-frontend-jobs-as-if-jh: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-targeting-stable-branch - when: never - - <<: *if-stable-branch-refs - when: never - - <<: *if-merge-request-labels-as-if-jh - allow_failure: true + - !reference [".strict-ee-only-rules", rules] + - !reference [".as-if-jh-default-exclusion-rules", rules] - <<: *if-merge-request-labels-run-all-rspec allow_failure: true - <<: *if-merge-request @@ -670,12 +742,7 @@ .frontend:rules:jest:minimal: rules: - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never + - !reference [".rails:rules:minimal-default-rules", rules] - <<: *if-merge-request-labels-run-all-jest when: never - <<: *if-default-refs @@ -689,10 +756,7 @@ .frontend:rules:eslint-as-if-foss: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never + - !reference [".strict-ee-only-rules", rules] # We already have `static-analysis as-if-foss` which already runs `lint:eslint:all` if the `pipeline:run-as-if-foss` label is set. - <<: *if-merge-request-labels-as-if-foss when: never @@ -740,7 +804,6 @@ rules: - <<: *if-default-refs changes: *code-patterns - when: on_success ############### # Pages rules # @@ -756,14 +819,10 @@ rules: - <<: *if-default-refs changes: *code-qa-patterns - when: on_success .qa:rules:as-if-foss: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never + - !reference [".strict-ee-only-rules", rules] - <<: *if-security-merge-request changes: *code-qa-patterns - <<: *if-merge-request-labels-as-if-foss @@ -835,20 +894,8 @@ .rails:rules:ee-and-foss-migration:minimal: rules: - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:unit-integration:minimal-default-rules", rules] - <<: *if-merge-request changes: *db-patterns when: never @@ -869,110 +916,37 @@ .rails:rules:ee-and-foss-unit: rules: - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *backend-patterns - - <<: *if-security-merge-request - changes: *backend-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:ee-and-foss-default-rules", rules] - changes: *backend-patterns .rails:rules:ee-and-foss-unit:minimal: rules: - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:unit-integration:minimal-default-rules", rules] - <<: *if-merge-request changes: *backend-patterns .rails:rules:ee-and-foss-integration: rules: - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *backend-patterns - - <<: *if-security-merge-request - changes: *backend-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:ee-and-foss-default-rules", rules] - changes: *backend-patterns .rails:rules:ee-and-foss-integration:minimal: rules: - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:unit-integration:minimal-default-rules", rules] - <<: *if-merge-request changes: *backend-patterns .rails:rules:ee-and-foss-system: rules: - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *workhorse-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *code-backstage-patterns - - <<: *if-security-merge-request - changes: *code-backstage-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:system-default-rules", rules] - changes: *code-backstage-patterns .rails:rules:ee-and-foss-system:minimal: rules: - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *workhorse-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never - - <<: *if-merge-request - changes: *code-backstage-patterns + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:system:minimal-default-rules", rules] .rails:rules:ee-and-foss-fast_spec_helper: rules: @@ -1011,20 +985,8 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:unit-integration:minimal-default-rules", rules] - <<: *if-merge-request changes: *db-patterns when: never @@ -1033,37 +995,15 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *backend-patterns - - <<: *if-security-merge-request - changes: *backend-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:ee-and-foss-default-rules", rules] - changes: *backend-patterns .rails:rules:ee-only-unit:minimal: rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:unit-integration:minimal-default-rules", rules] - <<: *if-merge-request changes: *backend-patterns @@ -1071,37 +1011,15 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *backend-patterns - - <<: *if-security-merge-request - changes: *backend-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:ee-and-foss-default-rules", rules] - changes: *backend-patterns .rails:rules:ee-only-integration:minimal: rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:unit-integration:minimal-default-rules", rules] - <<: *if-merge-request changes: *backend-patterns @@ -1109,44 +1027,15 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *workhorse-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *code-backstage-patterns - - <<: *if-security-merge-request - changes: *code-backstage-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:system-default-rules", rules] - changes: *code-backstage-patterns .rails:rules:ee-only-system:minimal: rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *workhorse-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never - - <<: *if-merge-request - changes: *code-backstage-patterns + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:system:minimal-default-rules", rules] .rails:rules:as-if-foss-migration: rules: @@ -1172,18 +1061,8 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules] - <<: *if-merge-request-labels-as-if-foss changes: *db-patterns when: never @@ -1192,17 +1071,7 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *backend-patterns - - <<: *if-security-merge-request - changes: *backend-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:ee-and-foss-default-rules", rules] - <<: *if-merge-request-labels-as-if-foss changes: *backend-patterns @@ -1210,18 +1079,8 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules] - <<: *if-merge-request-labels-as-if-foss changes: *backend-patterns @@ -1229,17 +1088,7 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *backend-patterns - - <<: *if-security-merge-request - changes: *backend-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:ee-and-foss-default-rules", rules] - <<: *if-merge-request-labels-as-if-foss changes: *backend-patterns @@ -1247,18 +1096,8 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request - changes: *core-backend-patterns - when: never - - <<: *if-merge-request - changes: *ci-patterns - when: never + - !reference [".rails:rules:minimal-default-rules", rules] + - !reference [".rails:rules:as-if-foss-migration-unit-integration:minimal-default-rules", rules] - <<: *if-merge-request-labels-as-if-foss changes: *backend-patterns @@ -1266,19 +1105,7 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *core-backend-patterns - - <<: *if-merge-request - changes: *workhorse-patterns - - <<: *if-merge-request - changes: *ci-patterns - - <<: *if-automated-merge-request - changes: *code-backstage-patterns - - <<: *if-security-merge-request - changes: *code-backstage-patterns - - <<: *if-merge-request-not-approved - when: never + - !reference [".rails:rules:system-default-rules", rules] - <<: *if-merge-request-labels-as-if-foss changes: *code-backstage-patterns @@ -1286,12 +1113,7 @@ rules: - <<: *if-not-ee when: never - - <<: *if-merge-request-approved - when: never - - <<: *if-automated-merge-request - when: never - - <<: *if-security-merge-request - when: never + - !reference [".rails:rules:minimal-default-rules", rules] - <<: *if-merge-request changes: *core-backend-patterns when: never @@ -1306,18 +1128,8 @@ .rails:rules:as-if-jh-rspec: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-targeting-stable-branch - when: never - - <<: *if-stable-branch-refs - when: never - - <<: *if-merge-request-labels-as-if-jh - allow_failure: true + - !reference [".strict-ee-only-rules", rules] + - !reference [".as-if-jh-default-exclusion-rules", rules] - <<: *if-merge-request changes: *ci-patterns allow_failure: true @@ -1345,19 +1157,11 @@ .rails:rules:detect-previous-failed-tests: rules: - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *code-backstage-patterns + - !reference [".rails:rules:previous-failed-tests-default-rules", rules] .rails:rules:rerun-previous-failed-tests: rules: - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-labels-run-all-rspec - - <<: *if-merge-request - changes: *code-backstage-patterns + - !reference [".rails:rules:previous-failed-tests-default-rules", rules] .rails:rules:rspec-foss-impact: rules: @@ -1418,19 +1222,21 @@ - <<: *if-merge-request changes: *backend-patterns -.rails:rules:default-branch-schedule-nightly--code-backstage: +.rails:rules:default-branch-schedule-nightly--code-backstage-default-rules: rules: - <<: *if-default-branch-schedule-nightly - <<: *if-merge-request changes: [".gitlab/ci/rails.gitlab-ci.yml"] +.rails:rules:default-branch-schedule-nightly--code-backstage: + rules: + - !reference [".rails:rules:default-branch-schedule-nightly--code-backstage-default-rules", rules] + .rails:rules:default-branch-schedule-nightly--code-backstage-ee-only: rules: - <<: *if-not-ee when: never - - <<: *if-default-branch-schedule-nightly - - <<: *if-merge-request - changes: [".gitlab/ci/rails.gitlab-ci.yml"] + - !reference [".rails:rules:default-branch-schedule-nightly--code-backstage-default-rules", rules] .rails:rules:rspec-feature-flags: rules: @@ -1737,7 +1543,6 @@ when: never - <<: *if-default-branch-or-tag changes: *code-backstage-qa-patterns - when: on_success .setup:rules:dont-interrupt-me: rules: @@ -1752,7 +1557,6 @@ rules: - <<: *if-default-refs changes: *code-backstage-patterns - when: on_success .setup:rules:no-ee-check: rules: @@ -1760,7 +1564,6 @@ when: never - <<: *if-default-refs changes: *code-backstage-patterns - when: on_success .setup:rules:no-jh-check: rules: @@ -1768,7 +1571,6 @@ when: never - <<: *if-default-refs changes: *code-backstage-patterns - when: on_success .setup:rules:verify-tests-yml: rules: @@ -1776,7 +1578,6 @@ when: never - <<: *if-default-refs changes: *code-backstage-patterns - when: on_success .setup:rules:generate-frontend-fixtures-mapping: rules: @@ -1790,18 +1591,8 @@ .setup:rules:add-jh-folder: rules: - - <<: *if-not-ee - when: never - - <<: *if-jh - when: never - - <<: *if-security-merge-request - when: never - - <<: *if-merge-request-targeting-stable-branch - when: never - - <<: *if-stable-branch-refs - when: never - - <<: *if-merge-request-labels-as-if-jh - allow_failure: true + - !reference [".strict-ee-only-rules", rules] + - !reference [".as-if-jh-default-exclusion-rules", rules] - <<: *if-merge-request-labels-run-all-rspec allow_failure: true - changes: *code-backstage-qa-patterns diff --git a/GITLAB_PAGES_VERSION b/GITLAB_PAGES_VERSION index 3f4830156cb..b7921ae87bc 100644 --- a/GITLAB_PAGES_VERSION +++ b/GITLAB_PAGES_VERSION @@ -1 +1 @@ -1.53.0 +1.54.0 diff --git a/app/assets/javascripts/gfm_auto_complete.js b/app/assets/javascripts/gfm_auto_complete.js index d04896bf6e5..bf29a356abd 100644 --- a/app/assets/javascripts/gfm_auto_complete.js +++ b/app/assets/javascripts/gfm_auto_complete.js @@ -275,6 +275,8 @@ class GfmAutoComplete { UNASSIGN_REVIEWER: '/unassign_reviewer', REASSIGN: '/reassign', CC: '/cc', + ATTENTION: '/attention', + REMOVE_ATTENTION: '/remove_attention', }; let assignees = []; let reviewers = []; @@ -353,6 +355,23 @@ class GfmAutoComplete { } else if (command === MEMBER_COMMAND.UNASSIGN_REVIEWER) { // Only include members which are not assigned as a reviewer to Issuable currently return data.filter((member) => reviewers.includes(member.search)); + } else if ( + command === MEMBER_COMMAND.ATTENTION || + command === MEMBER_COMMAND.REMOVE_ATTENTION + ) { + const attentionUsers = [ + ...(SidebarMediator.singleton?.store?.assignees || []), + ...(SidebarMediator.singleton?.store?.reviewers || []), + ]; + const attentionRequested = command === MEMBER_COMMAND.REMOVE_ATTENTION; + + return data.filter((member) => + attentionUsers.find( + (u) => + createMemberSearchString(u).includes(member.search) && + u.attention_requested === attentionRequested, + ), + ); } return data; diff --git a/app/assets/javascripts/security_configuration/components/constants.js b/app/assets/javascripts/security_configuration/components/constants.js index 971706c941e..6888782fe06 100644 --- a/app/assets/javascripts/security_configuration/components/constants.js +++ b/app/assets/javascripts/security_configuration/components/constants.js @@ -123,7 +123,7 @@ export const COVERAGE_FUZZING_CONFIG_HELP_PATH = helpPagePath( export const CORPUS_MANAGEMENT_NAME = __('Corpus Management'); export const CORPUS_MANAGEMENT_DESCRIPTION = s__( - 'SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing.', + 'SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing.', ); export const CORPUS_MANAGEMENT_CONFIG_TEXT = s__('SecurityConfiguration|Manage corpus'); diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb index 9007db05431..b85ed29cc2a 100644 --- a/app/controllers/projects/merge_requests_controller.rb +++ b/app/controllers/projects/merge_requests_controller.rb @@ -501,6 +501,8 @@ class Projects::MergeRequestsController < Projects::MergeRequests::ApplicationCo .can_push_to_branch?(@merge_request.source_branch) access_denied! unless access_check + + access_denied! unless merge_request.permits_force_push? end def merge_access_check diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 11ea1115929..1283d095c6b 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -350,7 +350,7 @@ module Ci # # ref - The name (or names) of the branch(es)/tag(s) to limit the list of # pipelines to. - # sha - The commit SHA (or mutliple SHAs) to limit the list of pipelines to. + # sha - The commit SHA (or multiple SHAs) to limit the list of pipelines to. # limit - This limits a backlog search, default to 100. def self.newest_first(ref: nil, sha: nil, limit: 100) relation = order(id: :desc) diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index ffa010cf9fc..3826e496320 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -471,6 +471,12 @@ class MergeRequest < ApplicationRecord rebase_jid.present? && Gitlab::SidekiqStatus.running?(rebase_jid) end + def permits_force_push? + return true unless ProtectedBranch.protected?(source_project, source_branch) + + ProtectedBranch.allow_force_push?(source_project, source_branch) + end + # Use this method whenever you need to make sure the head_pipeline is synced with the # branch head commit, for example checking if a merge request can be merged. # For more information check: https://gitlab.com/gitlab-org/gitlab-foss/issues/40004 diff --git a/app/models/project.rb b/app/models/project.rb index 2b90f176279..a80673a1440 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -2779,6 +2779,12 @@ class Project < ApplicationRecord end def save_topics + topic_ids_before = self.topic_ids + update_topics + Projects::Topic.update_non_private_projects_counter(topic_ids_before, self.topic_ids, visibility_level_previously_was, visibility_level) + end + + def update_topics return if @topic_list.nil? @topic_list = @topic_list.split(',') if @topic_list.instance_of?(String) diff --git a/app/models/projects/topic.rb b/app/models/projects/topic.rb index 8d6f8c3a9ca..78bc2df2e1e 100644 --- a/app/models/projects/topic.rb +++ b/app/models/projects/topic.rb @@ -25,6 +25,29 @@ module Projects def search(query) fuzzy_search(query, [:name]) end + + def update_non_private_projects_counter(ids_before, ids_after, project_visibility_level_before, project_visibility_level_after) + project_visibility_level_before ||= project_visibility_level_after + + topics_to_decrement = [] + topics_to_increment = [] + topic_ids_removed = ids_before - ids_after + topic_ids_retained = ids_before & ids_after + topic_ids_added = ids_after - ids_before + + if project_visibility_level_before > Gitlab::VisibilityLevel::PRIVATE + topics_to_decrement += topic_ids_removed + topics_to_decrement += topic_ids_retained if project_visibility_level_after == Gitlab::VisibilityLevel::PRIVATE + end + + if project_visibility_level_after > Gitlab::VisibilityLevel::PRIVATE + topics_to_increment += topic_ids_added + topics_to_increment += topic_ids_retained if project_visibility_level_before == Gitlab::VisibilityLevel::PRIVATE + end + + where(id: topics_to_increment).update_counters(non_private_projects_count: 1) unless topics_to_increment.empty? + where(id: topics_to_decrement).where('non_private_projects_count > 0').update_counters(non_private_projects_count: -1) unless topics_to_decrement.empty? + end end end end diff --git a/app/services/merge_requests/base_service.rb b/app/services/merge_requests/base_service.rb index b0d0c32abd1..3363fc90997 100644 --- a/app/services/merge_requests/base_service.rb +++ b/app/services/merge_requests/base_service.rb @@ -246,7 +246,9 @@ module MergeRequests def remove_all_attention_requests(merge_request) return unless merge_request.attention_requested_enabled? - ::MergeRequests::BulkRemoveAttentionRequestedService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request).execute + users = merge_request.reviewers + merge_request.assignees + + ::MergeRequests::BulkRemoveAttentionRequestedService.new(project: merge_request.project, current_user: current_user, merge_request: merge_request, users: users.uniq).execute end def remove_attention_requested(merge_request, user) diff --git a/app/services/merge_requests/bulk_remove_attention_requested_service.rb b/app/services/merge_requests/bulk_remove_attention_requested_service.rb index dd2ff741ba6..6573b623779 100644 --- a/app/services/merge_requests/bulk_remove_attention_requested_service.rb +++ b/app/services/merge_requests/bulk_remove_attention_requested_service.rb @@ -3,20 +3,24 @@ module MergeRequests class BulkRemoveAttentionRequestedService < MergeRequests::BaseService attr_accessor :merge_request + attr_accessor :users - def initialize(project:, current_user:, merge_request:) + def initialize(project:, current_user:, merge_request:, users:) super(project: project, current_user: current_user) @merge_request = merge_request + @users = users end + # rubocop: disable CodeReuse/ActiveRecord def execute return error("Invalid permissions") unless can?(current_user, :update_merge_request, merge_request) - merge_request.merge_request_assignees.update_all(state: :reviewed) - merge_request.merge_request_reviewers.update_all(state: :reviewed) + merge_request.merge_request_assignees.where(user_id: users).update_all(state: :reviewed) + merge_request.merge_request_reviewers.where(user_id: users).update_all(state: :reviewed) success end + # rubocop: enable CodeReuse/ActiveRecord end end diff --git a/app/views/admin/application_settings/_repository_check.html.haml b/app/views/admin/application_settings/_repository_check.html.haml index 6df1be9f6cb..ce81f81c125 100644 --- a/app/views/admin/application_settings/_repository_check.html.haml +++ b/app/views/admin/application_settings/_repository_check.html.haml @@ -16,7 +16,7 @@ = _("If you get a lot of false alarms from repository checks, you can clear all repository check information from the database.") - clear_repository_checks_link = _('Clear all repository checks') - clear_repository_checks_message = _('This clears repository check states for all projects in the database and cannot be undone. Are you sure?') - = link_to clear_repository_checks_link, clear_repository_check_states_admin_application_settings_path, data: { confirm: clear_repository_checks_message }, method: :put, class: "gl-button btn btn-sm btn-danger gl-mt-3" + = link_to clear_repository_checks_link, clear_repository_check_states_admin_application_settings_path, data: { confirm: clear_repository_checks_message, confirm_btn_variant: 'danger' }, aria: { label: _('Clear repository checks') }, method: :put, class: "gl-button btn btn-sm btn-danger gl-mt-3" .sub-section %h4= _("Housekeeping") diff --git a/app/workers/all_queues.yml b/app/workers/all_queues.yml index 5b1a25396af..7e186baf134 100644 --- a/app/workers/all_queues.yml +++ b/app/workers/all_queues.yml @@ -282,6 +282,15 @@ :weight: 1 :idempotent: true :tags: [] +- :name: cronjob:container_registry_migration_observer + :worker_name: ContainerRegistry::Migration::ObserverWorker + :feature_category: :container_registry + :has_external_dependencies: + :urgency: :low + :resource_boundary: :unknown + :weight: 1 + :idempotent: true + :tags: [] - :name: cronjob:database_batched_background_migration :worker_name: Database::BatchedBackgroundMigrationWorker :feature_category: :database diff --git a/app/workers/container_registry/migration/observer_worker.rb b/app/workers/container_registry/migration/observer_worker.rb new file mode 100644 index 00000000000..757c4fd11a5 --- /dev/null +++ b/app/workers/container_registry/migration/observer_worker.rb @@ -0,0 +1,40 @@ +# frozen_string_literal: true + +module ContainerRegistry + module Migration + class ObserverWorker + include ApplicationWorker + # This worker does not perform work scoped to a context + include CronjobQueue # rubocop:disable Scalability/CronWorkerContext + + COUNT_BATCH_SIZE = 50000 + + data_consistency :sticky + feature_category :container_registry + urgency :low + deduplicate :until_executed, including_scheduled: true + idempotent! + + def perform + return unless ::ContainerRegistry::Migration.enabled? + + use_replica_if_available do + ContainerRepository::MIGRATION_STATES.each do |state| + relation = ContainerRepository.with_migration_state(state) + count = ::Gitlab::Database::BatchCount.batch_count( + relation, batch_size: COUNT_BATCH_SIZE + ) + name = "#{state}_count".to_sym + log_extra_metadata_on_done(name, count) + end + end + end + + private + + def use_replica_if_available(&block) + ::Gitlab::Database::LoadBalancing::Session.current.use_replicas_for_read_queries(&block) + end + end + end +end diff --git a/app/workers/projects/git_garbage_collect_worker.rb b/app/workers/projects/git_garbage_collect_worker.rb index cf236f8b660..d16583975fc 100644 --- a/app/workers/projects/git_garbage_collect_worker.rb +++ b/app/workers/projects/git_garbage_collect_worker.rb @@ -16,7 +16,15 @@ module Projects def before_gitaly_call(task, resource) return unless gc?(task) - ::Projects::GitDeduplicationService.new(resource).execute + # Don't block garbage collection if we can't fetch into an object pool + # due to some gRPC error because we don't want to accumulate cruft. + # See https://gitlab.com/gitlab-org/gitaly/-/issues/4022. + begin + ::Projects::GitDeduplicationService.new(resource).execute + rescue Gitlab::Git::CommandTimedOut, GRPC::Internal => e + Gitlab::ErrorTracking.track_exception(e) + end + cleanup_orphan_lfs_file_references(resource) end diff --git a/config/helpers/incremental_webpack_compiler/compiler.js b/config/helpers/incremental_webpack_compiler/compiler.js index 480d7fa3263..0ef090bce24 100644 --- a/config/helpers/incremental_webpack_compiler/compiler.js +++ b/config/helpers/incremental_webpack_compiler/compiler.js @@ -4,8 +4,8 @@ const path = require('path'); const { History, HistoryWithTTL } = require('./history'); const log = require('./log'); -const onRequestEntryPoint = (app, callback) => { - app.use((req, res, next) => { +const onRequestEntryPoint = (callback) => { + return (req, res, next) => { const fileName = path.basename(req.url); /** @@ -20,7 +20,7 @@ const onRequestEntryPoint = (app, callback) => { } next(); - }); + }; }; /** @@ -40,7 +40,9 @@ class NoopCompiler { logStatus() {} // eslint-disable-next-line class-methods-use-this - setupMiddleware() {} + createMiddleware() { + return null; + } } /** @@ -55,8 +57,8 @@ class HistoryOnlyCompiler extends NoopCompiler { this.history = new History(historyFilePath); } - setupMiddleware(app) { - onRequestEntryPoint(app, (entryPoint) => { + createMiddleware() { + return onRequestEntryPoint((entryPoint) => { this.history.onRequestEntryPoint(entryPoint); }); } @@ -92,16 +94,16 @@ class IncrementalWebpackCompiler { log(`Currently compiling route entrypoints: ${this.history.size} of ${totalCount}`); } - setupMiddleware(app, server) { - onRequestEntryPoint(app, (entryPoint) => { + createMiddleware(devServer) { + return onRequestEntryPoint((entryPoint) => { const wasVisitedRecently = this.history.onRequestEntryPoint(entryPoint); if (!wasVisitedRecently) { log(`Have not visited ${entryPoint} recently. Adding to compilation.`); setTimeout(() => { - server.middleware.invalidate(() => { - if (server.sockets) { - server.sockWrite(server.sockets, 'content-changed'); + devServer.invalidate(() => { + if (devServer.sockets) { + devServer.sendMessage(devServer.webSocketServer.clients, 'static-changed'); } }); }, TIMEOUT); diff --git a/config/initializers/1_settings.rb b/config/initializers/1_settings.rb index 69248822658..c634dbafe83 100644 --- a/config/initializers/1_settings.rb +++ b/config/initializers/1_settings.rb @@ -542,6 +542,9 @@ Settings.cron_jobs['container_expiration_policy_worker']['job_class'] = 'Contain Settings.cron_jobs['container_registry_migration_guard_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['container_registry_migration_guard_worker']['cron'] ||= '*/10 * * * *' Settings.cron_jobs['container_registry_migration_guard_worker']['job_class'] = 'ContainerRegistry::Migration::GuardWorker' +Settings.cron_jobs['container_registry_migration_observer_worker'] ||= Settingslogic.new({}) +Settings.cron_jobs['container_registry_migration_observer_worker']['cron'] ||= '*/30 * * * *' +Settings.cron_jobs['container_registry_migration_observer_worker']['job_class'] = 'ContainerRegistry::Migration::ObserverWorker' Settings.cron_jobs['image_ttl_group_policy_worker'] ||= Settingslogic.new({}) Settings.cron_jobs['image_ttl_group_policy_worker']['cron'] ||= '40 0 * * *' Settings.cron_jobs['image_ttl_group_policy_worker']['job_class'] = 'DependencyProxy::ImageTtlGroupPolicyWorker' diff --git a/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml b/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml new file mode 100644 index 00000000000..a7ae893ebe9 --- /dev/null +++ b/config/metrics/counts_28d/20220131143209_i_quickactions_attention_monthly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.quickactions.i_quickactions_attention_monthly +description: Count of MAU using the `/attention` quick action +product_section: dev +product_stage: create +product_group: group::code review +product_category: code_review +value_type: number +status: active +milestone: '14.8' +introduced_by_url: +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - i_quickactions_attention +distribution: + - ce + - ee +tier: + - free + - premium + - ultimate diff --git a/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml b/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml new file mode 100644 index 00000000000..3f6fe27c6e4 --- /dev/null +++ b/config/metrics/counts_28d/20220131153230_i_quickactions_remove_attention_monthly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.quickactions.i_quickactions_remove_attention_monthly +description: Count of MAU using the `/remove_attention` quick action +product_section: dev +product_stage: create +product_group: group::code review +product_category: code_review +value_type: number +status: active +milestone: '14.8' +introduced_by_url: +time_frame: 28d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - i_quickactions_remove_attention +distribution: + - ce + - ee +tier: + - free + - premium + - ultimate diff --git a/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml b/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml new file mode 100644 index 00000000000..2bd6c25281d --- /dev/null +++ b/config/metrics/counts_7d/20220131143201_i_quickactions_attention_weekly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.quickactions.i_quickactions_attention_weekly +description: Count of WAU using the `/attention` quick action +product_section: dev +product_stage: create +product_group: group::code review +product_category: code_review +value_type: number +status: active +milestone: '14.8' +introduced_by_url: +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - i_quickactions_attention +distribution: + - ce + - ee +tier: + - free + - premium + - ultimate diff --git a/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml b/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml new file mode 100644 index 00000000000..38f9841f447 --- /dev/null +++ b/config/metrics/counts_7d/20220131153223_i_quickactions_remove_attention_weekly.yml @@ -0,0 +1,25 @@ +--- +key_path: redis_hll_counters.quickactions.i_quickactions_remove_attention_weekly +description: Count of WAU using the `/remove_attention` quick action +product_section: dev +product_stage: create +product_group: group::code review +product_category: code_review +value_type: number +status: active +milestone: '14.8' +introduced_by_url: +time_frame: 7d +data_source: redis_hll +data_category: optional +instrumentation_class: RedisHLLMetric +options: + events: + - i_quickactions_remove_attention +distribution: + - ce + - ee +tier: + - free + - premium + - ultimate diff --git a/config/webpack.config.js b/config/webpack.config.js index 152a5a69842..c02c8f0d74d 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -38,11 +38,10 @@ const SUPPORTED_BROWSERS_HASH = crypto const VENDOR_DLL = process.env.WEBPACK_VENDOR_DLL && process.env.WEBPACK_VENDOR_DLL !== 'false'; const CACHE_PATH = process.env.WEBPACK_CACHE_PATH || path.join(ROOT_PATH, 'tmp/cache'); const IS_PRODUCTION = process.env.NODE_ENV === 'production'; -const IS_DEV_SERVER = process.env.WEBPACK_DEV_SERVER === 'true'; +const IS_DEV_SERVER = process.env.WEBPACK_SERVE === 'true'; -const DEV_SERVER_HOST = process.env.DEV_SERVER_HOST || 'localhost'; -const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10) || 3808; -const { DEV_SERVER_PUBLIC_ADDR } = process.env; +const { DEV_SERVER_HOST, DEV_SERVER_PUBLIC_ADDR } = process.env; +const DEV_SERVER_PORT = parseInt(process.env.DEV_SERVER_PORT, 10); const DEV_SERVER_ALLOWED_HOSTS = process.env.DEV_SERVER_ALLOWED_HOSTS && process.env.DEV_SERVER_ALLOWED_HOSTS.split(','); const DEV_SERVER_HTTPS = process.env.DEV_SERVER_HTTPS && process.env.DEV_SERVER_HTTPS !== 'false'; @@ -654,9 +653,6 @@ module.exports = { }, }, - // enable HMR only in webpack-dev-server - DEV_SERVER_LIVERELOAD && new webpack.HotModuleReplacementPlugin(), - // optionally generate webpack bundle analysis WEBPACK_REPORT && new BundleAnalyzerPlugin({ @@ -689,19 +685,38 @@ module.exports = { */ new webpack.IgnorePlugin(/moment/, /pikaday/), ].filter(Boolean), + devServer: { - before(app, server) { - incrementalCompiler.setupMiddleware(app, server); + setupMiddlewares: (middlewares, devServer) => { + if (!devServer) { + throw new Error('webpack-dev-server is not defined'); + } + + const incrementalCompilerMiddleware = incrementalCompiler.createMiddleware(devServer); + + if (incrementalCompilerMiddleware) { + middlewares.unshift(incrementalCompilerMiddleware); + } + + return middlewares; }, - host: DEV_SERVER_HOST, - port: DEV_SERVER_PORT, - public: DEV_SERVER_PUBLIC_ADDR, - allowedHosts: DEV_SERVER_ALLOWED_HOSTS, + // Only print errors to CLI + devMiddleware: { + stats: 'errors-only', + }, + host: DEV_SERVER_HOST || 'localhost', + port: DEV_SERVER_PORT || 3808, https: DEV_SERVER_HTTPS, - contentBase: false, - stats: 'errors-only', hot: DEV_SERVER_LIVERELOAD, - inline: DEV_SERVER_LIVERELOAD, + // The following settings are mainly needed for HMR support in gitpod. + // Per default only local hosts are allowed, but here we could + // allow different hosts (e.g. ['.gitpod'], all of gitpod), + // as the webpack server will run on a different subdomain than + // the rails application + ...(DEV_SERVER_ALLOWED_HOSTS ? { allowedHosts: DEV_SERVER_ALLOWED_HOSTS } : {}), + client: { + ...(DEV_SERVER_PUBLIC_ADDR ? { webSocketURL: DEV_SERVER_PUBLIC_ADDR } : {}), + }, }, devtool: NO_SOURCEMAPS ? false : devtool, diff --git a/db/migrate/20220125122228_add_topics_non_private_projects_count.rb b/db/migrate/20220125122228_add_topics_non_private_projects_count.rb new file mode 100644 index 00000000000..8c7b750d5ff --- /dev/null +++ b/db/migrate/20220125122228_add_topics_non_private_projects_count.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class AddTopicsNonPrivateProjectsCount < Gitlab::Database::Migration[1.0] + def up + add_column :topics, :non_private_projects_count, :bigint, null: false, default: 0 + end + + def down + remove_column :topics, :non_private_projects_count + end +end diff --git a/db/migrate/20220125122725_add_topics_non_private_projects_count_index.rb b/db/migrate/20220125122725_add_topics_non_private_projects_count_index.rb new file mode 100644 index 00000000000..46b4d298a2e --- /dev/null +++ b/db/migrate/20220125122725_add_topics_non_private_projects_count_index.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +class AddTopicsNonPrivateProjectsCountIndex < Gitlab::Database::Migration[1.0] + INDEX_NAME = 'index_topics_non_private_projects_count' + + disable_ddl_transaction! + + def up + add_concurrent_index :topics, [:non_private_projects_count, :id], order: { non_private_projects_count: :desc }, name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name :topics, INDEX_NAME + end +end diff --git a/db/migrate/20220202034409_add_tmp_index_on_id_and_migration_state_to_container_repositories.rb b/db/migrate/20220202034409_add_tmp_index_on_id_and_migration_state_to_container_repositories.rb new file mode 100644 index 00000000000..b999c871a3e --- /dev/null +++ b/db/migrate/20220202034409_add_tmp_index_on_id_and_migration_state_to_container_repositories.rb @@ -0,0 +1,16 @@ +# frozen_string_literal: true + +class AddTmpIndexOnIdAndMigrationStateToContainerRepositories < Gitlab::Database::Migration[1.0] + INDEX_NAME = 'tmp_index_container_repositories_on_id_migration_state' + + disable_ddl_transaction! + + # Temporary index to be removed https://gitlab.com/gitlab-org/gitlab/-/issues/351783 + def up + add_concurrent_index :container_repositories, [:id, :migration_state], name: INDEX_NAME + end + + def down + remove_concurrent_index_by_name :container_repositories, INDEX_NAME + end +end diff --git a/db/post_migrate/20220125122640_schedule_populate_topics_non_private_projects_count.rb b/db/post_migrate/20220125122640_schedule_populate_topics_non_private_projects_count.rb new file mode 100644 index 00000000000..dee86a70553 --- /dev/null +++ b/db/post_migrate/20220125122640_schedule_populate_topics_non_private_projects_count.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +class SchedulePopulateTopicsNonPrivateProjectsCount < Gitlab::Database::Migration[1.0] + MIGRATION = 'PopulateTopicsNonPrivateProjectsCount' + BATCH_SIZE = 10_000 + DELAY_INTERVAL = 2.minutes + + disable_ddl_transaction! + + def up + queue_background_migration_jobs_by_range_at_intervals( + define_batchable_model('topics'), + MIGRATION, + DELAY_INTERVAL, + batch_size: BATCH_SIZE, + track_jobs: true + ) + end + + def down + # no-op + end +end diff --git a/db/schema_migrations/20220125122228 b/db/schema_migrations/20220125122228 new file mode 100644 index 00000000000..2add72978c6 --- /dev/null +++ b/db/schema_migrations/20220125122228 @@ -0,0 +1 @@ +26600e01d8b31a4308d0e23564e4d4c52488ec87ad7990a410b7cc0c031f12e7 \ No newline at end of file diff --git a/db/schema_migrations/20220125122640 b/db/schema_migrations/20220125122640 new file mode 100644 index 00000000000..fdb85bb480a --- /dev/null +++ b/db/schema_migrations/20220125122640 @@ -0,0 +1 @@ +51c7ab860b952281bd7f65d68e7a539a8eee57cac3bbdaf439ff5593f5b065ed \ No newline at end of file diff --git a/db/schema_migrations/20220125122725 b/db/schema_migrations/20220125122725 new file mode 100644 index 00000000000..7a6ef38bfbc --- /dev/null +++ b/db/schema_migrations/20220125122725 @@ -0,0 +1 @@ +7740d1e71571576a709ae5bfd46f60ea3fb4be3f48cddec2cca53f148096cdd7 \ No newline at end of file diff --git a/db/schema_migrations/20220202034409 b/db/schema_migrations/20220202034409 new file mode 100644 index 00000000000..4eb359f45e6 --- /dev/null +++ b/db/schema_migrations/20220202034409 @@ -0,0 +1 @@ +0efe482aa626cf80912feaa1176837253b094fc434f273bee35b5fe3e8ce4243 \ No newline at end of file diff --git a/db/structure.sql b/db/structure.sql index 84810642895..c1645c2169f 100644 --- a/db/structure.sql +++ b/db/structure.sql @@ -20272,6 +20272,7 @@ CREATE TABLE topics ( avatar text, description text, total_projects_count bigint DEFAULT 0 NOT NULL, + non_private_projects_count bigint DEFAULT 0 NOT NULL, CONSTRAINT check_26753fb43a CHECK ((char_length(avatar) <= 255)), CONSTRAINT check_5d1a07c8c8 CHECK ((char_length(description) <= 1024)), CONSTRAINT check_7a90d4c757 CHECK ((char_length(name) <= 255)) @@ -27935,6 +27936,8 @@ CREATE UNIQUE INDEX index_token_with_ivs_on_hashed_plaintext_token ON token_with CREATE UNIQUE INDEX index_token_with_ivs_on_hashed_token ON token_with_ivs USING btree (hashed_token); +CREATE INDEX index_topics_non_private_projects_count ON topics USING btree (non_private_projects_count DESC, id); + CREATE UNIQUE INDEX index_topics_on_name ON topics USING btree (name); CREATE INDEX index_topics_on_name_trigram ON topics USING gin (name gin_trgm_ops); @@ -28317,6 +28320,8 @@ CREATE INDEX tmp_idx_deduplicate_vulnerability_occurrences ON vulnerability_occu CREATE INDEX tmp_idx_vulnerability_occurrences_on_id_where_report_type_7_99 ON vulnerability_occurrences USING btree (id) WHERE (report_type = ANY (ARRAY[7, 99])); +CREATE INDEX tmp_index_container_repositories_on_id_migration_state ON container_repositories USING btree (id, migration_state); + CREATE INDEX tmp_index_for_namespace_id_migration_on_routes ON routes USING btree (id) WHERE ((namespace_id IS NULL) AND ((source_type)::text = 'Namespace'::text)); CREATE INDEX tmp_index_members_on_state ON members USING btree (state) WHERE (state = 2); diff --git a/doc/api/merge_request_approvals.md b/doc/api/merge_request_approvals.md index 0e8fd6608b8..6a0b66ac5dc 100644 --- a/doc/api/merge_request_approvals.md +++ b/doc/api/merge_request_approvals.md @@ -990,7 +990,7 @@ POST /projects/:id/merge_requests/:merge_request_iid/approve | `approval_password` | string | no | Current user's password. Required if [**Require user password to approve**](../user/project/merge_requests/approvals/settings.md#require-user-password-to-approve) is enabled in the project settings. | The `sha` parameter works in the same way as -when [accepting a merge request](merge_requests.md#accept-mr): if it is passed, then it must +when [accepting a merge request](merge_requests.md#merge-a-merge-request): if it is passed, then it must match the current HEAD of the merge request for the approval to be added. If it does not match, the response code is `409`. diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md index 1fd2b8967f2..e4f7e9126dc 100644 --- a/doc/api/merge_requests.md +++ b/doc/api/merge_requests.md @@ -1454,9 +1454,9 @@ DELETE /projects/:id/merge_requests/:merge_request_iid curl --request DELETE --header "PRIVATE-TOKEN: " "https://gitlab.example.com/api/v4/projects/4/merge_requests/85" ``` -## Accept MR +## Merge a merge request -Merge changes submitted with MR using this API. +Accept and merge changes submitted with MR using this API. If a merge request is unable to be accepted (such as Draft, Closed, Pipeline Pending Completion, or Failed while requiring Success) - you receive a `405` and the error message 'Method Not Allowed' diff --git a/doc/development/snowplow/implementation.md b/doc/development/snowplow/implementation.md index 3f038dc74ca..d35413cfd5f 100644 --- a/doc/development/snowplow/implementation.md +++ b/doc/development/snowplow/implementation.md @@ -18,21 +18,27 @@ to track custom events. For the recommended frontend tracking implementation, see [Usage recommendations](#usage-recommendations). -Tracking implementations must have an `action` and a `category`. You can provide additional -categories from the [structured event taxonomy](index.md#structured-event-taxonomy) with an `extra` object -that accepts key-value pairs. +Structured events and page views include the [`gitlab_standard`](schemas.md#gitlab_standard) +context, using the `window.gl.snowplowStandardContext` object which includes +[default data](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/views/layouts/_snowplow.html.haml) +as base. This object can be modified for any subsequent structured event fired, +although it's not recommended. -| Field | Type | Default value | Description | +Tracking implementations must have an `action` and a `category`. You can provide additional +properties from the [structured event taxonomy](index.md#structured-event-taxonomy), in +addition to an `extra` object that accepts key-value pairs. + +| Property | Type | Default value | Description | |:-----------|:-------|:---------------------------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `category` | string | `document.body.dataset.page` | Page or subsection of a page in which events are captured. | -| `action` | string | generic | Action the user is taking. Clicks must be `click` and activations must be `activate`. For example, focusing a form field is `activate_form_input`, and clicking a button is `click_button`. | -| `data` | object | `{}` | Additional data such as `label`, `property`, `value`, `context` as described in [Structured event taxonomy](index.md#structured-event-taxonomy), and `extra` (key-value pairs object). | +| `action` | string | `'generic'` | Action the user is taking. Clicks must be `click` and activations must be `activate`. For example, focusing a form field is `activate_form_input`, and clicking a button is `click_button`. | +| `data` | object | `{}` | Additional data such as `label`, `property`, `value` as described in [Structured event taxonomy](index.md#structured-event-taxonomy), `context` for custom contexts, and `extra` (key-value pairs object). | ### Usage recommendations - Use [data attributes](#implement-data-attribute-tracking) on HTML elements that emit `click`, `show.bs.dropdown`, or `hide.bs.dropdown` events. -- Use the [Vue mixin](#implement-vue-component-tracking) for tracking custom events, or if the supported events for data attributes are not propagating. -- Use the [tracking class](#implement-raw-javascript-tracking) when tracking raw JavaScript files. +- Use the [Vue mixin](#implement-vue-component-tracking) for tracking custom events, or if the supported events for data attributes are not propagating. For example, clickable components that don't emit `click`. +- Use the [tracking class](#implement-raw-javascript-tracking) when tracking in vanilla JavaScript files. ### Implement data attribute tracking @@ -41,7 +47,10 @@ To implement tracking for HAML or Vue templates, add a [`data-track` attribute]( The following example shows `data-track-*` attributes assigned to a button: ```haml -%button.btn{ data: { track_action: "click_button", track_label: "template_preview", track_property: "my-template" } } +%button.btn{ data: { track: { action: "click_button", label: "template_preview", property: "my-template" } } } + +// or +// %button.btn{ data: { track_action: "click_button", track_label: "template_preview", track_property: "my-template" } } ``` ```html @@ -62,7 +71,7 @@ The following example shows `data-track-*` attributes assigned to a button: | `data-track-property` | false | Any additional property of the element, or object being acted on. | | `data-track-value` | false | Describes a numeric value (decimal) directly related to the event. This could be the value of an input. For example, `10` when clicking `internal` visibility. If omitted, this is the element's `value` property or `undefined`. For checkboxes, the default value is the element's checked attribute or `0` when unchecked. | | `data-track-extra` | false | A key-value pair object passed as a valid JSON string. This attribute is added to the `extra` property in our [`gitlab_standard`](schemas.md#gitlab_standard) schema. | -| `data-track-context` | false | The `context` as described in our [Structured event taxonomy](index.md#structured-event-taxonomy). | +| `data-track-context` | false | To append a custom context object, passed as a valid JSON string. | #### Event listeners @@ -74,12 +83,19 @@ If click events stop propagating, you must implement listeners and [Vue componen #### Helper methods -Use the following Ruby helper: +You can use the following Ruby helper: ```ruby tracking_attrs(label, action, property) # { data: { track_label... } } +``` +You can also use it on HAML templates: + +```haml %button{ **tracking_attrs('main_navigation', 'click_button', 'navigation') } + +// When adding additional data +// %button{ data: { platform: "...", **tracking_attrs('main_navigation', 'click_button', 'navigation') } } ``` If you use the GitLab helper method [`nav_link`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/helpers/tab_helper.rb#L76), you must wrap `html_options` under the `html_options` keyword argument. If you @@ -91,7 +107,7 @@ use the `ActionView` helper method [`link_to`](https://api.rubyonrails.org/v5.2. track_action: "click_button" }) # Good -= nav_link(controller: ['dashboard/groups', 'explore/groups'], html_options: { data: { track_label: += nav_link(controller: ['dashboard/groups', 'explore/groups'], html_options: { data: { track_label: "explore_groups", track_action: "click_button" } }) # Good (other helpers) @@ -101,63 +117,64 @@ track_action: "click_button" }) ### Implement Vue component tracking -For custom event tracking, use a Vue `mixin` in components. Vue `mixin` exposes the `Tracking.event` -static method and the `track` method. You can specify tracking options in `data` or `computed`. -These options override any defaults and allow the values to be dynamic from props or based on state. +For custom event tracking, use the [Vue mixin](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/tracking/tracking.js#L207). It exposes `Tracking.event` as the `track` method. +You can specify tracking options by creating a `tracking` data object or +computed property, and as a second parameter: `this.track('click_button', opts)`. +These options override any defaults and allow the values to be dynamic from props or based on state: -Several default options are passed when an event is tracked from the component: - -- `category`: If you don't specify, by default `document.body.dataset.page` is used. -- `label` -- `property` -- `value` +| Property | Type | Default | Example | +| -- | -- | -- | -- | +| `category` | string | `document.body.dataset.page` | `'code_quality_walkthrough'` | +| `label` | string | `''` | `'process_start_button'` | +| `property` | string | `''` | `'asc'` or `'desc'` | +| `value` | integer | `undefined` | `0`, `1`, `500` | +| `extra` | object | `{}` | `{ selectedVariant: this.variant }` | To implement Vue component tracking: -1. Import the `Tracking` library and request a `mixin`: +1. Import the `Tracking` library and call the `mixin` method: ```javascript import Tracking from '~/tracking'; - const trackingMixin = Tracking.mixin; + + const trackingMixin = Tracking.mixin(); + + // Optionally provide default properties + // const trackingMixin = Tracking.mixin({ label: 'right_sidebar' }); ``` -1. Provide categories to track the event from the component. For example, to track all events in a -component with a label, use the `label` category: - - ```javascript - import Tracking from '~/tracking'; - const trackingMixin = Tracking.mixin({ label: 'right_sidebar' }); - ``` - -1. In the component, declare the Vue `mixin`: +1. Use the mixin in the component: ```javascript export default { mixins: [trackingMixin], - // ...[component implementation]... + // Or + // mixins: [Tracking.mixin()], + // mixins: [Tracking.mixin({ label: 'right_sidebar' })], + data() { return { expanded: false, - tracking: { - label: 'left_sidebar', - }, }; }, }; ``` -1. To receive event data as a tracking object or computed property: - - Declare it in the `data` function. Use a `tracking` object when default event properties are dynamic or provided at runtime: +1. You can specify tracking options in by creating a `tracking` data object +or computed property: ```javascript export default { name: 'RightSidebar', + mixins: [Tracking.mixin()], + data() { return { + expanded: false, + variant: '', tracking: { label: 'right_sidebar', - // category: '', // property: '', // value: '', // experiment: '', @@ -165,18 +182,28 @@ component with a label, use the `label` category: }, }; }, + + // Or + // computed: { + // tracking() { + // return { + // property: this.variant, + // extra: { expanded: this.expanded }, + // }; + // }, + // }, }; ``` - - Declare it in the event data in the `track` function. This object merges with any previously provided options: +1. Call the `track` method. Tracking options can be passed as the second parameter: - ```javascript - this.track('click_button', { - label: 'right_sidebar', - }); - ``` + ```javascript + this.track('click_button', { + label: 'right_sidebar', + }); + ``` -1. Optional. Use the `track` method in a template: + Or use the `track` method in the template: ```html ``` -The following example shows an implementation of Vue component tracking: +#### Testing example ```javascript export default { - name: 'RightSidebar', - mixins: [Tracking.mixin({ label: 'right_sidebar' })], + name: 'CountDropdown', + + mixins: [Tracking.mixin({ label: 'count_dropdown' })], + data() { return { - expanded: false, + variant: 'counter', + count: 0, }; }, + methods: { - toggle() { - this.expanded = !this.expanded; - // Additional data will be merged, like `value` below - this.track('click_toggle', { value: Number(this.expanded) }); - } - } + handleChange({ target }) { + const { variant } = this; + + this.count = Number(target.value); + + this.track('change_value', { + value: this.count, + extra: { variant } + }); + }, + }, }; ``` -#### Testing example - ```javascript import { mockTracking } from 'helpers/tracking_helper'; // mockTracking(category, documentOverride, spyMethod) -describe('RightSidebar.vue', () => { +describe('CountDropdown.vue', () => { let trackingSpy; let wrapper; + ... + beforeEach(() => { trackingSpy = mockTracking(undefined, wrapper.element, jest.spyOn); }); - const findToggle = () => wrapper.find('[data-testid="toggle"]'); + const findDropdown = () => wrapper.find('[data-testid="dropdown"]'); - it('tracks turning off toggle', () => { - findToggle().trigger('click'); + it('tracks change event', () => { + const dropdown = findDropdown(); + dropdown.element.value = 30; + dropdown.trigger('change'); - expect(trackingSpy).toHaveBeenCalledWith(undefined, 'click_toggle', { - label: 'right_sidebar', - value: 0, + expect(trackingSpy).toHaveBeenCalledWith(undefined, 'change_value', { + value: 30, + label: 'count_dropdown', + extra: { variant: 'counter' }, }); }); }); @@ -241,7 +280,8 @@ describe('RightSidebar.vue', () => { ### Implement raw JavaScript tracking -To call custom event tracking and instrumentation directly from the JavaScript file, call the `Tracking.event` static function. +To track from a vanilla JavaScript file, use the `Tracking.event` static function +(calls [`dispatchSnowplowEvent`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/tracking/dispatch_snowplow_event.js)). The following example demonstrates tracking a click on a button by manually calling `Tracking.event`. @@ -251,7 +291,7 @@ import Tracking from '~/tracking'; const button = document.getElementById('create_from_template_button'); button.addEventListener('click', () => { - Tracking.event('dashboard:projects:index', 'click_button', { + Tracking.event(undefined, 'click_button', { label: 'create_from_template', property: 'template_preview', extra: { diff --git a/doc/development/snowplow/index.md b/doc/development/snowplow/index.md index 4b5dd82315b..29f4514a21e 100644 --- a/doc/development/snowplow/index.md +++ b/doc/development/snowplow/index.md @@ -72,6 +72,7 @@ sequenceDiagram GitLab.com Snowplow Collector ->> GitLab.com Snowplow Collector: Write to disk end GitLab.com Snowplow Collector ->> S3 Bucket: Kinesis Firehose + Note over GitLab.com Snowplow Collector, S3 Bucket: Pseudonymization S3 Bucket->>Snowflake DW: Import data Snowflake DW->>Snowflake DW: Transform data using dbt Snowflake DW->>Sisense Dashboards: Data available for querying diff --git a/doc/development/snowplow/schemas.md b/doc/development/snowplow/schemas.md index eb57e7d98a5..63864c9329b 100644 --- a/doc/development/snowplow/schemas.md +++ b/doc/development/snowplow/schemas.md @@ -12,19 +12,23 @@ This page provides Snowplow schema reference for GitLab events. We are including the [`gitlab_standard` schema](https://gitlab.com/gitlab-org/iglu/-/blob/master/public/schemas/com.gitlab/gitlab_standard/jsonschema/) with every event. See [Standardize Snowplow Schema](https://gitlab.com/groups/gitlab-org/-/epics/5218) for details. -The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) class represents this schema in the application. +The [`StandardContext`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/tracking/standard_context.rb) +class represents this schema in the application. Some properties are automatically populated for [frontend](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/views/layouts/_snowplow.html.haml) +events. -| Field Name | Required | Type | Description | -|----------------|---------------------|-----------------------|---------------------------------------------------------------------------------------------| -| `project_id` | **{dotted-circle}** | integer | | -| `namespace_id` | **{dotted-circle}** | integer | | -| `user_id` | **{dotted-circle}** | integer | User database record ID attribute. This file undergoes a pseudonymization process at the collector level. | -| `context_generated_at` | **{dotted-circle}** | string (date time format) | Timestamp indicating when context was generated. | -| `environment` | **{check-circle}** | string (max 32 chars) | Name of the source environment, such as `production` or `staging` | -| `source` | **{check-circle}** | string (max 32 chars) | Name of the source application, such as `gitlab-rails` or `gitlab-javascript` | -| `plan` | **{dotted-circle}** | string (max 32 chars) | Name of the plan for the namespace, such as `free`, `premium`, or `ultimate`. Automatically picked from the `namespace`. | -| `google_analytics_id` | **{dotted-circle}** | string (max 32 chars) | Google Analytics ID, present when set from our marketing sites. | -| `extra` | **{dotted-circle}** | JSON | Any additional data associated with the event, in the form of key-value pairs | +| Field Name | Required | Default value | Type | Description | +|----------------|:-------------------:|-----------------------|--|---------------------------------------------------------------------------------------------| +| `project_id` | **{dotted-circle}** | Current project ID * | integer | | +| `namespace_id` | **{dotted-circle}** | Current group/namespace ID * | integer | | +| `user_id` | **{dotted-circle}** | Current user ID * | integer | User database record ID attribute. This file undergoes a pseudonymization process at the collector level. | +| `context_generated_at` | **{dotted-circle}** | Current timestamp | string (date time format) | Timestamp indicating when context was generated. | +| `environment` | **{check-circle}** | Current environment | string (max 32 chars) | Name of the source environment, such as `production` or `staging` | +| `source` | **{check-circle}** | Event source | string (max 32 chars) | Name of the source application, such as `gitlab-rails` or `gitlab-javascript` | +| `plan` | **{dotted-circle}** | Current namespace plan * | string (max 32 chars) | Name of the plan for the namespace, such as `free`, `premium`, or `ultimate`. Automatically picked from the `namespace`. | +| `google_analytics_id` | **{dotted-circle}** | GA ID value * | string (max 32 chars) | Google Analytics ID, present when set from our marketing sites. | +| `extra` | **{dotted-circle}** | | JSON | Any additional data associated with the event, in the form of key-value pairs | + +_\* Default value present for frontend events only_ ## Default Schema diff --git a/doc/integration/github.md b/doc/integration/github.md index 412ddf0225e..a265d5c67ed 100644 --- a/doc/integration/github.md +++ b/doc/integration/github.md @@ -116,87 +116,106 @@ your website could enable the covert redirect attack. 1. Select the icon. Sign in to GitHub and authorize the GitLab application. -## GitHub Enterprise with self-signed Certificate - -If you are attempting to import projects from GitHub Enterprise with a self-signed -certificate and the imports are failing, you must disable SSL verification. -It should be disabled by adding `verify_ssl` to `false` in the provider configuration -and changing the global Git `sslVerify` option to `false` in the GitLab server. - -For Omnibus package: - -```ruby -gitlab_rails['omniauth_providers'] = [ - { - name: "github", - # label: "Provider name", # optional label for login button, defaults to "GitHub" - app_id: "YOUR_APP_ID", - app_secret: "YOUR_APP_SECRET", - url: "https://github.example.com/", - verify_ssl: false, - args: { scope: "user:email" } - } -] -``` - -You must also disable Git SSL verification on the server hosting GitLab. - -```ruby -omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] } -``` - -For installation from source: - -```yaml -- { name: 'github', - # label: 'Provider name', # optional label for login button, defaults to "GitHub" - app_id: 'YOUR_APP_ID', - app_secret: 'YOUR_APP_SECRET', - url: "https://github.example.com/", - verify_ssl: false, - args: { scope: 'user:email' } } -``` - -You must also disable Git SSL verification on the server hosting GitLab. - -```shell -git config --global http.sslVerify false -``` - -For the changes to take effect, [reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) if you installed -via Omnibus, or [restart GitLab](../administration/restart_gitlab.md#installations-from-source) if you installed from source. - ## Troubleshooting -### Error 500 when trying to sign in to GitLab via GitHub Enterprise +### Imports from GitHub Enterprise with a self-signed certificate fail -Check the [`production.log`](../administration/logs.md#productionlog) -on your GitLab server to obtain further details. If you are getting the error like -`Faraday::ConnectionFailed (execution expired)` in the log, there may be a connectivity issue -between your GitLab instance and GitHub Enterprise. To verify it, [start the rails console](../administration/operations/rails_console.md#starting-a-rails-console-session) -and run the commands below replacing `` with the URL of your GitHub Enterprise instance: +When you import projects from GitHub Enterprise using a self-signed +certificate, the imports fail. -```ruby -uri = URI.parse("https://") # replace `GitHub-URL` with the real one here -http = Net::HTTP.new(uri.host, uri.port) -http.use_ssl = true -http.verify_mode = 1 -response = http.request(Net::HTTP::Get.new(uri.request_uri)) -``` +To fix this issue, you must disable SSL verification: -If you are getting a similar `execution expired` error, it confirms the theory about the -network connectivity. In that case, make sure that the GitLab server is able to reach your -GitHub enterprise instance. +1. Set `verify_ssl` to `false` in the configuration file. + + - **For Omnibus installations** + + ```ruby + gitlab_rails['omniauth_providers'] = [ + { + name: "github", + # label: "Provider name", # optional label for login button, defaults to "GitHub" + app_id: "YOUR_APP_ID", + app_secret: "YOUR_APP_SECRET", + url: "https://github.example.com/", + verify_ssl: false, + args: { scope: "user:email" } + } + ] + ``` + + - **For installations from source** + + ```yaml + - { name: 'github', + # label: 'Provider name', # optional label for login button, defaults to "GitHub" + app_id: 'YOUR_APP_ID', + app_secret: 'YOUR_APP_SECRET', + url: "https://github.example.com/", + verify_ssl: false, + args: { scope: 'user:email' } } + ``` + +1. Change the global Git `sslVerify` option to `false` on the GitLab server. + + - **For Omnibus installations** + + ```ruby + omnibus_gitconfig['system'] = { "http" => ["sslVerify = false"] } + ``` + + - **For installations from source** + + ```shell + git config --global http.sslVerify false + ``` + +1. [Reconfigure GitLab](../administration/restart_gitlab.md#omnibus-gitlab-reconfigure) + if you installed using Omnibus, or [restart GitLab](../administration/restart_gitlab.md#installations-from-source) + if you installed from source. + +### Signing in using GitHub Enterprise returns a 500 error + +This error can occur because of a network connectivity issue between your +GitLab instance and GitHub Enterprise. + +To check for a connectivity issue: + +1. Go to the [`production.log`](../administration/logs.md#productionlog) + on your GitLab server and look for the following error: + + ``` plaintext + Faraday::ConnectionFailed (execution expired) + ``` + +1. [Start the rails console](../administration/operations/rails_console.md#starting-a-rails-console-session) + and run the following commands. Replace `` with the URL of your + GitHub Enterprise instance: + + ```ruby + uri = URI.parse("https://") # replace `GitHub-URL` with the real one here + http = Net::HTTP.new(uri.host, uri.port) + http.use_ssl = true + http.verify_mode = 1 + response = http.request(Net::HTTP::Get.new(uri.request_uri)) + ``` + +1. If a similar `execution expired` error is returned, this confirms the error is + caused by a connectivity issue. Make sure the GitLab server can reach + your GitHub Enterprise instance. ### Signing in using your GitHub account without a pre-existing GitLab account is not allowed -If you're getting the message `Signing in using your GitHub account without a pre-existing -GitLab account is not allowed. Create a GitLab account first, and then connect it to your -GitHub account` when signing in, in GitLab: +When you sign in to GitLab, you get the following error: -1. In the top-right corner, select your avatar. +```plaintext +Signing in using your GitHub account without a pre-existing +GitLab account is not allowed. Create a GitLab account first, +and then connect it to your GitHub account +``` + +To fix this issue, you must activate GitHub sign-in in GitLab: + +1. On the top bar, in the top right corner, select your avatar. 1. Select **Edit profile**. 1. On the left sidebar, select **Account**. 1. In the **Social sign-in** section, select **Connect to GitHub**. - -After that, you should be able to sign in via GitHub successfully. diff --git a/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png b/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png deleted file mode 100644 index ad108dabf73..00000000000 Binary files a/doc/user/analytics/img/mr_mean_time_to_merge_metric_v13_9.png and /dev/null differ diff --git a/doc/user/analytics/img/mr_throughput_table_v13_3.png b/doc/user/analytics/img/mr_throughput_table_v13_3.png deleted file mode 100644 index bb63770dc3f..00000000000 Binary files a/doc/user/analytics/img/mr_throughput_table_v13_3.png and /dev/null differ diff --git a/doc/user/analytics/merge_request_analytics.md b/doc/user/analytics/merge_request_analytics.md index 82177259c30..f9ca06c0ef9 100644 --- a/doc/user/analytics/merge_request_analytics.md +++ b/doc/user/analytics/merge_request_analytics.md @@ -1,119 +1,66 @@ --- -description: "Merge Request Analytics help you understand the efficiency of your code review process, and the productivity of your team." # Up to ~200 chars long. They will be displayed in Google Search snippets. It may help to write the page intro first, and then reuse it here. +description: "Merge request analytics help you understand the efficiency of your code review process, and the productivity of your team." # Up to ~200 chars long. They will be displayed in Google Search snippets. It may help to write the page intro first, and then reuse it here. stage: Manage group: Optimize info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Merge Request Analytics **(PREMIUM)** +# Merge request analytics **(PREMIUM)** > - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229045) in GitLab 13.3. > - Moved to GitLab Premium in 13.9. -Merge Request Analytics helps you understand the efficiency of your code review process, and the productivity of your team. +Use merge request analytics to view: -## Overview +- The number of merge requests your organization merged per month. +- The average time between merge request creation and merge. +- Information about each merged merge request. -Merge Request Analytics displays information that will help you evaluate the efficiency and productivity of your merge request process. +You can use merge request analytics to identify: -The Throughput chart shows the number of merge requests merged, by month. Merge request throughput is -a common measure of productivity in software engineering. Although imperfect, the average throughput can -be a meaningful benchmark of your team's overall productivity. +- Low or high productivity months. +- Efficiency and productivity of your merge request process. +- Efficiency of your code review process. -To access Merge Request Analytics: +## View merge request analytics + +You must have at least the Reporter role to view merge request analytics. + +To view merge request analytics: 1. On the top bar, select **Menu > Projects** and find your project. 1. On the left sidebar, select **Analytics > Merge request**. -## Use cases +## View merge requests merged per month -This feature is designed for [development team leaders](https://about.gitlab.com/handbook/marketing/strategic-marketing/roles-personas/#delaney-development-team-lead) -and others who want to understand broad patterns in code review and productivity. +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232651) in GitLab 13.3. +> - Filtering [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229266) in GitLab 13.4 -You can use Merge Request Analytics to expose when your team is most and least productive, and -identify improvements that might substantially accelerate your development cycle. +To view the number of merge requests merged per month: -Merge Request Analytics could be used when: +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Analytics > Merge request**. +1. Optional. Filter results: + 1. Select the filter bar. + 1. Select a parameter. + 1. Select a value or enter text to refine the results. + 1. To adjust the date range: + - In the **From** field, select a start date. + - In the **To** field, select an end date. -- You want to know if you were more productive this month than last month, or 12 months ago. -- You want to drill into low- or high-productivity months to understand the work that took place. +The **Throughput** chart shows the number of merge requests merged per month. -## Visualizations and data +The table shows up to 20 merge requests per page, and includes +information about each merge request. -The following visualizations and data are available, representing all merge requests that were merged in the given date range. - -### Mean time to merge +## View average time between merge request creation and merge > [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229389) in GitLab 13.9. -The mean time to merge (MTTM) metric shows the average time between when a merge request is created, -and when it is merged. To view how the MTTM changes over time, compare MTTM across different date ranges. +Use the number in **Mean time to merge** to view the average time between when a merge request is +created and when it's merged. -![Mean time to merge](img/mr_mean_time_to_merge_metric_v13_9.png "Merge Request Analytics - MTTM metric showing the average time it takes from initiating a MR to being merged") +To view **Mean time to merge**: -### Throughput chart - -The throughput chart shows the number of merge requests merged per month. - -![Throughput chart](img/mr_throughput_chart_v13_3.png "Merge Request Analytics - Throughput chart showing merge requests merged in the past 12 months") - -### Throughput table - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/232651) in GitLab 13.3. - -The Throughput table displays the most recent merge requests merged in the date range. The -table displays up to 20 merge requests at a time. If there are more than 20 merge requests, -you can paginate to them. For each merge request, you can review the following data: - -- Title (as a link to the merge request itself) -- ID -- Pipeline status -- Label count -- Comment count -- Approval count (if approved) -- Date merged -- Time to merge -- Milestone -- Commit count -- Pipeline count -- Line change counts -- Assignees - -![Throughput table](img/mr_throughput_table_v13_3.png "Merge Request Analytics - Throughput table listing the 100 merge requests most recently merged") - -## Filter the data - -> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/229266) in GitLab 13.4 - -You can filter the data that is presented on the page based on the following parameters: - -- Author -- Assignee -- Label -- Milestone -- Source branch -- Target branch - -To filter results: - -1. Select the filter bar. -1. Select a parameter to filter by. -1. Select a value from the autocompleted results, or enter search text to refine the results. -1. Press Enter. - -## Date range - -The date range is set to the past 12 months by default. You can modify the date range by changing the "From" and/or "To" values that appear alongside the filter bar. After changing either value, the data displayed on the page will update automatically. - -## Tip: Bookmark preferred settings - -You can bookmark preferred filters and date ranges. After you have applied a change to the -filter bar or the date range, you'll see that information in the URL. You can create a -bookmark for those preferred settings in your browser. - -## Permissions - -The **Merge Request Analytics** feature can be accessed only: - -- On [GitLab Premium](https://about.gitlab.com/pricing/) and above. -- By users with at least the Reporter role. +1. On the top bar, select **Menu > Projects** and find your project. +1. On the left sidebar, select **Analytics > Merge request**. diff --git a/doc/user/project/import/bitbucket_server.md b/doc/user/project/import/bitbucket_server.md index 65d830e0b1c..4e3642eb3bd 100644 --- a/doc/user/project/import/bitbucket_server.md +++ b/doc/user/project/import/bitbucket_server.md @@ -5,107 +5,30 @@ group: Import info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments --- -# Import your project from Bitbucket Server to GitLab **(FREE)** +# Import your project from Bitbucket Server **(FREE)** > [Introduced](https://gitlab.com/gitlab-org/gitlab-foss/-/merge_requests/20164) in GitLab 11.2. NOTE: -The Bitbucket Server importer does not work with [Bitbucket Cloud](https://bitbucket.org). -Use the [Bitbucket Cloud importer](bitbucket.md) for that. +This process is different than [importing from Bitbucket Cloud](bitbucket.md). -Import your projects from Bitbucket Server to GitLab with minimal effort. +From Bitbucket Server, you can import: -The Bitbucket importer can import: - -- Repository description (GitLab 11.2+) -- Git repository data (GitLab 11.2+) -- Pull requests (GitLab 11.2+) -- Pull request comments (GitLab 11.2+) +- Repository description +- Git repository data +- Pull requests +- Pull request comments When importing, repository public access is retained. If a repository is private in Bitbucket, it's created as private in GitLab as well. -## Limitations - -- GitLab doesn't allow comments on arbitrary lines of code, so any Bitbucket comments out of bounds - are inserted as comments in the merge request. -- Bitbucket Server allows multiple levels of threading. GitLab import collapses this into one thread - and quote part of the original comment. -- Declined pull requests have unreachable commits, which prevents the GitLab importer from - generating a proper diff. These pull requests show up as empty changes. -- Pull request approvals are not imported. -- Attachments in Markdown are not imported. -- Task lists are not imported. -- Emoji reactions are not imported. -- Project filtering does not support fuzzy search (only `starts with` or `full match strings` are - supported). - -## How it works - -The Bitbucket Server importer works as follows: - -1. The user is prompted to enter the URL, username, and password (or personal access token) to log in to Bitbucket. - These credentials are preserved only as long as the importer is running. -1. The importer attempts to list all the current repositories on the Bitbucket Server. -1. Upon selection, the importer clones the repository and import pull requests and comments. - -### User assignment - -When issues/pull requests are being imported, the Bitbucket importer tries to -find the author's email address with a confirmed email address in the GitLab -user database. If no such user is available, the project creator is set as -the author. The importer appends a note in the comment to mark the original -creator. - -The importer creates any new namespaces (groups) if they don't exist or in -the case the namespace is taken, the repository is imported under the user's -namespace that started the import process. - -#### User assignment by username - -> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218609) in GitLab 13.4. -> - It's [deployed behind a feature flag](../../feature_flags.md), disabled by default. -> - It's disabled on GitLab.com. -> - It's not recommended for production use. -> - To use it in GitLab self-managed instances, ask a GitLab administrator to enable it. - -WARNING: -This feature might not be available to you. Check the **version history** note above for details. - -If you've enabled this feature, the importer tries to find a user in the GitLab user database with -the author's: - -- `username` -- `slug` -- `displayName` - -If the user is not found by any of these properties, the project creator is set as the author. - -##### Enable or disable User assignment by username - -User assignment by username is under development and not ready for production use. It is -deployed behind a feature flag that is **disabled by default**. -[GitLab administrators with access to the GitLab Rails console](../../../administration/feature_flags.md) -can enable it. - -To enable it: - -```ruby -Feature.enable(:bitbucket_server_user_mapping_by_username) -``` - -To disable it: - -```ruby -Feature.disable(:bitbucket_server_user_mapping_by_username) -``` - ## Import your Bitbucket repositories -Prerequisite: +Prerequisites: -- An administrator must have enabled the importer in - **Admin > Application Settings > Visibility and access controls > Import sources**. +- An administrator must have enabled the **Bitbucket Server** in + **Admin > Settings > General > Visibility and access controls > Import sources**. +- Review the importer's [limitations](#limitations). To import your Bitbucket repositories: @@ -115,28 +38,77 @@ To import your Bitbucket repositories: 1. Select **Import project**. 1. Select **Bitbucket Server**. 1. Log in to Bitbucket and grant GitLab access to your Bitbucket account. -1. Select the projects that you'd like to import or import all projects. - You can filter projects by name and select the namespace - each project will be imported for. +1. Select the projects to import, or import all projects. You can filter projects by name and select + the namespace for which to import each project. -## Automate group and project import **(PREMIUM)** +## Limitations -For information on automating user, group, and project import API calls, see -[Automate group and project import](index.md#automate-group-and-project-import). +- GitLab doesn't allow comments on arbitrary lines of code. Any out-of-bounds Bitbucket comments are + inserted as comments in the merge request. +- Bitbucket Server allows multiple threading levels. The importer collapses this into one thread and + quotes part of the original comment. +- Declined pull requests have unreachable commits. This prevents the importer from generating a + proper diff. These pull requests show up as empty changes. +- Project filtering doesn't support fuzzy search. Only starts with or full match strings are + supported. + +The following aren't imported: + +- Pull request approvals +- Attachments in Markdown +- Task lists +- Emoji reactions + +## User assignment + +When issues and pull requests are importing, the importer tries to find the author's email address +with a confirmed email address in the GitLab user database. If no such user is available, the +project creator is set as the author. The importer appends a note in the comment to mark the +original creator. + +The importer creates any new namespaces (groups) if they don't exist. If the namespace is taken, the +repository imports under the namespace of the user who started the import process. + +### User assignment by username + +> - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/218609) in GitLab 13.4 [with a flag](../../../administration/feature_flags.md) named `bitbucket_server_user_mapping_by_username`. Disabled by default. +> - Not recommended for production use. + +FLAG: +On self-managed GitLab and GitLab.com, by default this feature is not available. To make it +available, ask an administrator to [enable the feature flag](../../../administration/feature_flags.md) +named `bitbucket_server_user_mapping_by_username`. This feature is not ready for production use. + +With this feature enabled, the importer tries to find a user in the GitLab user database with the +author's: + +- `username` +- `slug` +- `displayName` + +If no user matches these properties, the project creator is set as the author. ## Troubleshooting +### General + +If the GUI-based import tool does not work, you can try to: + +- Use the [GitLab Import API](../../../api/import.md#import-repository-from-bitbucket-server) + Bitbucket Server endpoint. +- Set up [repository mirroring](../repository/mirror/index.md). + It provides verbose error output. + +See the [troubleshooting section](bitbucket.md#troubleshooting) +for Bitbucket Cloud. + ### LFS objects not imported If the project import completes but LFS objects can't be downloaded or cloned, you may be using a password or personal access token containing special characters. For more information, see [this issue](https://gitlab.com/gitlab-org/gitlab/-/issues/337769). -### General +## Related topics -If the GUI-based import tool does not work, you can try to: - -- Use the [GitLab Import API](../../../api/import.md#import-repository-from-bitbucket-server) Bitbucket server endpoint. -- Set up [Repository Mirroring](../repository/mirror/index.md), which provides verbose error output. - -See the [troubleshooting](bitbucket.md#troubleshooting) section for [Bitbucket](bitbucket.md). +For information on automating user, group, and project import API calls, see +[Automate group and project import](index.md#automate-group-and-project-import). diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb index 3f39af7f909..c833e0f2863 100644 --- a/lib/api/merge_requests.rb +++ b/lib/api/merge_requests.rb @@ -117,6 +117,9 @@ module API forbidden!('Cannot push to source branch') unless user_access.can_push_to_branch?(merge_request.source_branch) + + forbidden!('Source branch is protected from force push') unless + merge_request.permits_force_push? end params :merge_requests_params do diff --git a/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb b/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb new file mode 100644 index 00000000000..769ca4be7f3 --- /dev/null +++ b/lib/gitlab/background_migration/populate_topics_non_private_projects_count.rb @@ -0,0 +1,36 @@ +# frozen_string_literal: true + +module Gitlab + module BackgroundMigration + # The class to populates the non private projects counter of topics + class PopulateTopicsNonPrivateProjectsCount + SUB_BATCH_SIZE = 100 + + # Temporary AR model for topics + class Topic < ActiveRecord::Base + include EachBatch + + self.table_name = 'topics' + end + + def perform(start_id, stop_id) + Topic.where(id: start_id..stop_id).each_batch(of: SUB_BATCH_SIZE) do |batch| + ActiveRecord::Base.connection.execute(<<~SQL) + WITH batched_relation AS #{Gitlab::Database::AsWithMaterialized.materialized_if_supported} (#{batch.select(:id).limit(SUB_BATCH_SIZE).to_sql}) + UPDATE topics + SET non_private_projects_count = ( + SELECT COUNT(*) + FROM project_topics + INNER JOIN projects + ON project_topics.project_id = projects.id + WHERE project_topics.topic_id = batched_relation.id + AND projects.visibility_level > 0 + ) + FROM batched_relation + WHERE topics.id = batched_relation.id + SQL + end + end + end + end +end diff --git a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml index 05f76653bc8..25d20563010 100644 --- a/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml +++ b/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml @@ -221,6 +221,7 @@ security-code-scan-sast: image: name: "$SAST_ANALYZER_IMAGE" variables: + SAST_ANALYZER_IMAGE_TAG: '2' SAST_ANALYZER_IMAGE: "$SECURE_ANALYZERS_PREFIX/security-code-scan:$SAST_ANALYZER_IMAGE_TAG" rules: - if: $SAST_DISABLED @@ -230,8 +231,6 @@ security-code-scan-sast: # This rule shim will be removed in %15.0, # See https://gitlab.com/gitlab-org/gitlab/-/issues/350935 - if: $CI_COMMIT_BRANCH && $CI_SERVER_VERSION_MAJOR == '14' - variables: - SAST_ANALYZER_IMAGE_TAG: '2' exists: - '**/*.csproj' - '**/*.vbproj' diff --git a/lib/gitlab/github_import/importer/pull_requests_importer.rb b/lib/gitlab/github_import/importer/pull_requests_importer.rb index 9648ad8dec4..fc0c099b71c 100644 --- a/lib/gitlab/github_import/importer/pull_requests_importer.rb +++ b/lib/gitlab/github_import/importer/pull_requests_importer.rb @@ -40,7 +40,7 @@ module Gitlab # updating the timestamp. project.touch(:last_repository_updated_at) # rubocop: disable Rails/SkipsModelValidations - project.repository.fetch_remote(project.import_url, refmap: Gitlab::GithubImport.refmap, forced: false) + project.repository.fetch_remote(project.import_url, refmap: Gitlab::GithubImport.refmap, forced: true) pname = project.path_with_namespace diff --git a/lib/gitlab/quick_actions/merge_request_actions.rb b/lib/gitlab/quick_actions/merge_request_actions.rb index 03f5ffd37ae..842d4ef482b 100644 --- a/lib/gitlab/quick_actions/merge_request_actions.rb +++ b/lib/gitlab/quick_actions/merge_request_actions.rb @@ -57,6 +57,11 @@ module Gitlab access_check.can_push_to_branch?(merge_request.source_branch) end command :rebase do + unless quick_action_target.permits_force_push? + @execution_message[:rebase] = _('This merge request branch is protected from force push.') + next + end + if quick_action_target.cannot_be_merged? @execution_message[:rebase] = _('This merge request cannot be rebased while there are conflicts.') next @@ -249,6 +254,76 @@ module Gitlab @updates[:reviewer_ids] = [] end end + + desc do + if quick_action_target.allows_multiple_reviewers? + _('Request attention from assignee(s) or reviewer(s)') + else + _('Request attention from assignee or reviewer') + end + end + explanation do |users| + _('Request attention from %{users_sentence}.') % { users_sentence: reviewer_users_sentence(users) } + end + execution_message do |users = nil| + if users.blank? + _("Failed to request attention because no user was found.") + else + _('Requested attention from %{users_sentence}.') % { users_sentence: reviewer_users_sentence(users) } + end + end + params do + quick_action_target.allows_multiple_reviewers? ? '@user1 @user2' : '@user' + end + types MergeRequest + condition do + Feature.enabled?(:mr_attention_requests, project, default_enabled: :yaml) && + current_user.can?(:"admin_#{quick_action_target.to_ability_name}", project) + end + parse_params do |attention_param| + extract_users(attention_param) + end + command :attention do |users| + next if users.empty? + + users.each do |user| + ::MergeRequests::ToggleAttentionRequestedService.new(project: quick_action_target.project, merge_request: quick_action_target, current_user: current_user, user: user).execute + end + end + + desc do + if quick_action_target.allows_multiple_reviewers? + _('Remove attention request(s)') + else + _('Remove attention request') + end + end + explanation do |users| + _('Removes attention from %{users_sentence}.') % { users_sentence: reviewer_users_sentence(users) } + end + execution_message do |users = nil| + if users.blank? + _("Failed to remove attention because no user was found.") + else + _('Removed attention from %{users_sentence}.') % { users_sentence: reviewer_users_sentence(users) } + end + end + params do + quick_action_target.allows_multiple_reviewers? ? '@user1 @user2' : '@user' + end + types MergeRequest + condition do + Feature.enabled?(:mr_attention_requests, project, default_enabled: :yaml) && + current_user.can?(:"admin_#{quick_action_target.to_ability_name}", project) + end + parse_params do |attention_param| + extract_users(attention_param) + end + command :remove_attention do |users| + next if users.empty? + + ::MergeRequests::BulkRemoveAttentionRequestedService.new(project: quick_action_target.project, merge_request: quick_action_target, current_user: current_user, users: users).execute + end end def reviewer_users_sentence(users) diff --git a/lib/gitlab/usage_data_counters/known_events/quickactions.yml b/lib/gitlab/usage_data_counters/known_events/quickactions.yml index 44f6b42d584..49891080b03 100644 --- a/lib/gitlab/usage_data_counters/known_events/quickactions.yml +++ b/lib/gitlab/usage_data_counters/known_events/quickactions.yml @@ -295,3 +295,11 @@ category: quickactions redis_slot: quickactions aggregation: weekly +- name: i_quickactions_attention + category: quickactions + redis_slot: quickactions + aggregation: weekly +- name: i_quickactions_remove_attention + category: quickactions + redis_slot: quickactions + aggregation: weekly diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 2a7bc43af62..3a9358c4e08 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -7405,6 +7405,9 @@ msgstr "" msgid "Clear recent searches" msgstr "" +msgid "Clear repository checks" +msgstr "" + msgid "Clear search" msgstr "" @@ -9896,10 +9899,10 @@ msgstr "" msgid "CorpusManagement|Actions" msgstr "" -msgid "CorpusManagement|Corpus are used in fuzz testing as mutation source to Improve future testing." +msgid "CorpusManagement|Corpus file" msgstr "" -msgid "CorpusManagement|Corpus file" +msgid "CorpusManagement|Corpus files are used in coverage-guided fuzz testing as seed inputs to improve testing." msgstr "" msgid "CorpusManagement|Corpus files must be in *.zip format. Maximum 5 GB" @@ -15023,6 +15026,9 @@ msgstr "" msgid "Failed to remove a to-do item for the design." msgstr "" +msgid "Failed to remove attention because no user was found." +msgstr "" + msgid "Failed to remove mirror." msgstr "" @@ -15035,6 +15041,9 @@ msgstr "" msgid "Failed to remove user key." msgstr "" +msgid "Failed to request attention because no user was found." +msgstr "" + msgid "Failed to reset key. Please try again." msgstr "" @@ -30016,6 +30025,9 @@ msgstr "" msgid "Remove attention request" msgstr "" +msgid "Remove attention request(s)" +msgstr "" + msgid "Remove avatar" msgstr "" @@ -30154,6 +30166,9 @@ msgstr "" msgid "Removed an issue from an epic." msgstr "" +msgid "Removed attention from %{users_sentence}." +msgstr "" + msgid "Removed attention request from @%{username}" msgstr "" @@ -30205,6 +30220,9 @@ msgstr "" msgid "Removes an issue from an epic." msgstr "" +msgid "Removes attention from %{users_sentence}." +msgstr "" + msgid "Removes parent epic %{epic_ref}." msgstr "" @@ -30605,6 +30623,15 @@ msgstr "" msgid "Request attention" msgstr "" +msgid "Request attention from %{users_sentence}." +msgstr "" + +msgid "Request attention from assignee or reviewer" +msgstr "" + +msgid "Request attention from assignee(s) or reviewer(s)" +msgstr "" + msgid "Request attention to review" msgstr "" @@ -30629,6 +30656,9 @@ msgstr "" msgid "Requested %{time_ago}" msgstr "" +msgid "Requested attention from %{users_sentence}." +msgstr "" + msgid "Requested attention from @%{username}" msgstr "" @@ -31973,7 +32003,7 @@ msgstr "" msgid "SecurityConfiguration|Manage corpus" msgstr "" -msgid "SecurityConfiguration|Manage corpus files used as mutation sources in coverage fuzzing." +msgid "SecurityConfiguration|Manage corpus files used as seed inputs with coverage-guided fuzzing." msgstr "" msgid "SecurityConfiguration|Manage profiles for use by DAST scans." @@ -37134,6 +37164,9 @@ msgstr "" msgid "This means you can not push code until you create an empty repository or import existing one." msgstr "" +msgid "This merge request branch is protected from force push." +msgstr "" + msgid "This merge request cannot be rebased while there are conflicts." msgstr "" diff --git a/package.json b/package.json index 8ed8200db94..c98c3e9b8e4 100644 --- a/package.json +++ b/package.json @@ -198,7 +198,7 @@ "web-vitals": "^0.2.4", "webpack": "^4.46.0", "webpack-bundle-analyzer": "^4.4.2", - "webpack-cli": "^3.3.12", + "webpack-cli": "^4.9.2", "webpack-stats-plugin": "^0.3.1", "worker-loader": "^2.0.0", "xterm": "3.14.5", @@ -257,7 +257,7 @@ "stylelint": "^14.3.0", "timezone-mock": "^1.0.8", "vue-jest": "4.0.1", - "webpack-dev-server": "^3.11.3", + "webpack-dev-server": "4.7.4", "xhr-mock": "^2.5.1", "yarn-check-webpack-plugin": "^1.2.0", "yarn-deduplicate": "^3.1.0" diff --git a/spec/controllers/projects/merge_requests_controller_spec.rb b/spec/controllers/projects/merge_requests_controller_spec.rb index 88e60a5352a..2390687c3ea 100644 --- a/spec/controllers/projects/merge_requests_controller_spec.rb +++ b/spec/controllers/projects/merge_requests_controller_spec.rb @@ -2078,6 +2078,20 @@ RSpec.describe Projects::MergeRequestsController do end end + context 'when source branch is protected from force push' do + before do + create(:protected_branch, project: project, name: merge_request.source_branch, allow_force_push: false) + end + + it 'returns 404' do + expect_rebase_worker_for(user).never + + post_rebase + + expect(response).to have_gitlab_http_status(:not_found) + end + end + context 'with a forked project' do let(:forked_project) { fork_project(project, fork_owner, repository: true) } let(:fork_owner) { create(:user) } diff --git a/spec/frontend/pages/dashboard/todos/index/todos_spec.js b/spec/frontend/pages/dashboard/todos/index/todos_spec.js index 6a7ce80ec5a..ef295e7d1ba 100644 --- a/spec/frontend/pages/dashboard/todos/index/todos_spec.js +++ b/spec/frontend/pages/dashboard/todos/index/todos_spec.js @@ -1,5 +1,6 @@ import MockAdapter from 'axios-mock-adapter'; import $ from 'jquery'; +import waitForPromises from 'helpers/wait_for_promises'; import '~/lib/utils/common_utils'; import axios from '~/lib/utils/axios_utils'; import { addDelimiter } from '~/lib/utils/text_utility'; @@ -71,7 +72,7 @@ describe('Todos', () => { describe('on done todo click', () => { let onToggleSpy; - beforeEach((done) => { + beforeEach(() => { const el = document.querySelector('.js-done-todo'); const path = el.dataset.href; @@ -86,7 +87,7 @@ describe('Todos', () => { el.click(); // Wait for axios and HTML to udpate - setImmediate(done); + return waitForPromises(); }); it('dispatches todo:toggle', () => { diff --git a/spec/frontend/projects/project_find_file_spec.js b/spec/frontend/projects/project_find_file_spec.js index 9c1000039b1..eec54dd04bc 100644 --- a/spec/frontend/projects/project_find_file_spec.js +++ b/spec/frontend/projects/project_find_file_spec.js @@ -1,6 +1,7 @@ import MockAdapter from 'axios-mock-adapter'; import $ from 'jquery'; import { TEST_HOST } from 'helpers/test_constants'; +import waitForPromises from 'helpers/wait_for_promises'; import { sanitize } from '~/lib/dompurify'; import axios from '~/lib/utils/axios_utils'; import ProjectFindFile from '~/projects/project_find_file'; @@ -53,7 +54,7 @@ describe('ProjectFindFile', () => { { path: 'folde?rC/fil#F.txt', escaped: 'folde%3FrC/fil%23F.txt' }, ]; - beforeEach((done) => { + beforeEach(() => { // Create a mock adapter for stubbing axios API requests mock = new MockAdapter(axios); @@ -64,7 +65,7 @@ describe('ProjectFindFile', () => { ); getProjectFindFileInstance(); // This triggers a load / axios call + subsequent render in the constructor - setImmediate(done); + return waitForPromises(); }); afterEach(() => { diff --git a/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js b/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js index a703dc0a66f..ee74e28ba23 100644 --- a/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js +++ b/spec/frontend/prometheus_metrics/prometheus_metrics_spec.js @@ -1,4 +1,5 @@ import MockAdapter from 'axios-mock-adapter'; +import waitForPromises from 'helpers/wait_for_promises'; import axios from '~/lib/utils/axios_utils'; import PANEL_STATE from '~/prometheus_metrics/constants'; import PrometheusMetrics from '~/prometheus_metrics/prometheus_metrics'; @@ -132,7 +133,7 @@ describe('PrometheusMetrics', () => { mock.restore(); }); - it('should show loader animation while response is being loaded and hide it when request is complete', (done) => { + it('should show loader animation while response is being loaded and hide it when request is complete', async () => { mockSuccess(); prometheusMetrics.loadActiveMetrics(); @@ -140,34 +141,31 @@ describe('PrometheusMetrics', () => { expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeFalsy(); expect(axios.get).toHaveBeenCalledWith(prometheusMetrics.activeMetricsEndpoint); - setImmediate(() => { - expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); - done(); - }); + await waitForPromises(); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); }); - it('should show empty state if response failed to load', (done) => { + it('should show empty state if response failed to load', async () => { mockError(); prometheusMetrics.loadActiveMetrics(); - setImmediate(() => { - expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); - expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBeFalsy(); - done(); - }); + await waitForPromises(); + + expect(prometheusMetrics.$monitoredMetricsLoading.hasClass('hidden')).toBeTruthy(); + expect(prometheusMetrics.$monitoredMetricsEmpty.hasClass('hidden')).toBeFalsy(); }); - it('should populate metrics list once response is loaded', (done) => { + it('should populate metrics list once response is loaded', async () => { jest.spyOn(prometheusMetrics, 'populateActiveMetrics').mockImplementation(); mockSuccess(); prometheusMetrics.loadActiveMetrics(); - setImmediate(() => { - expect(prometheusMetrics.populateActiveMetrics).toHaveBeenCalledWith(metrics); - done(); - }); + await waitForPromises(); + + expect(prometheusMetrics.populateActiveMetrics).toHaveBeenCalledWith(metrics); }); }); }); diff --git a/spec/frontend/sidebar/components/severity/sidebar_severity_spec.js b/spec/frontend/sidebar/components/severity/sidebar_severity_spec.js index 6116bc68927..5d80a221d8e 100644 --- a/spec/frontend/sidebar/components/severity/sidebar_severity_spec.js +++ b/spec/frontend/sidebar/components/severity/sidebar_severity_spec.js @@ -97,14 +97,14 @@ describe('SidebarSeverity', () => { }); }); - it('shows error alert when severity update fails ', () => { + it('shows error alert when severity update fails ', async () => { const errorMsg = 'Something went wrong'; jest.spyOn(wrapper.vm.$apollo, 'mutate').mockRejectedValueOnce(errorMsg); findCriticalSeverityDropdownItem().vm.$emit('click'); - setImmediate(() => { - expect(createFlash).toHaveBeenCalled(); - }); + await waitForPromises(); + + expect(createFlash).toHaveBeenCalled(); }); it('shows loading icon while updating', async () => { diff --git a/spec/frontend/sidebar/sidebar_move_issue_spec.js b/spec/frontend/sidebar/sidebar_move_issue_spec.js index d9972ae75c3..7bb7b18adf8 100644 --- a/spec/frontend/sidebar/sidebar_move_issue_spec.js +++ b/spec/frontend/sidebar/sidebar_move_issue_spec.js @@ -1,5 +1,6 @@ import MockAdapter from 'axios-mock-adapter'; import $ from 'jquery'; +import waitForPromises from 'helpers/wait_for_promises'; import createFlash from '~/flash'; import axios from '~/lib/utils/axios_utils'; import SidebarMoveIssue from '~/sidebar/lib/sidebar_move_issue'; @@ -77,15 +78,14 @@ describe('SidebarMoveIssue', () => { expect(test.sidebarMoveIssue.$dropdownToggle.data('deprecatedJQueryDropdown')).toBeTruthy(); }); - it('escapes html from project name', (done) => { + it('escapes html from project name', async () => { test.$toggleButton.dropdown('toggle'); - setImmediate(() => { - expect(test.$content.find('.js-move-issue-dropdown-item')[1].innerHTML.trim()).toEqual( - '<img src=x onerror=alert(document.domain)> foo / bar', - ); - done(); - }); + await waitForPromises(); + + expect(test.$content.find('.js-move-issue-dropdown-item')[1].innerHTML.trim()).toEqual( + '<img src=x onerror=alert(document.domain)> foo / bar', + ); }); }); @@ -101,20 +101,20 @@ describe('SidebarMoveIssue', () => { expect(test.$confirmButton.hasClass('is-loading')).toBe(true); }); - it('should remove loading state from confirm button on failure', (done) => { + it('should remove loading state from confirm button on failure', async () => { jest.spyOn(test.mediator, 'moveIssue').mockReturnValue(Promise.reject()); test.mediator.setMoveToProjectId(7); test.sidebarMoveIssue.onConfirmClicked(); expect(test.mediator.moveIssue).toHaveBeenCalled(); + // Wait for the move issue request to fail - setImmediate(() => { - expect(createFlash).toHaveBeenCalled(); - expect(test.$confirmButton.prop('disabled')).toBeFalsy(); - expect(test.$confirmButton.hasClass('is-loading')).toBe(false); - done(); - }); + await waitForPromises(); + + expect(createFlash).toHaveBeenCalled(); + expect(test.$confirmButton.prop('disabled')).toBeFalsy(); + expect(test.$confirmButton.hasClass('is-loading')).toBe(false); }); it('should not move the issue with id=0', () => { @@ -127,35 +127,33 @@ describe('SidebarMoveIssue', () => { }); }); - it('should set moveToProjectId on dropdown item "No project" click', (done) => { + it('should set moveToProjectId on dropdown item "No project" click', async () => { jest.spyOn(test.mediator, 'setMoveToProjectId').mockImplementation(() => {}); // Open the dropdown test.$toggleButton.dropdown('toggle'); // Wait for the autocomplete request to finish - setImmediate(() => { - test.$content.find('.js-move-issue-dropdown-item').eq(0).trigger('click'); + await waitForPromises(); - expect(test.mediator.setMoveToProjectId).toHaveBeenCalledWith(0); - expect(test.$confirmButton.prop('disabled')).toBeTruthy(); - done(); - }); + test.$content.find('.js-move-issue-dropdown-item').eq(0).trigger('click'); + + expect(test.mediator.setMoveToProjectId).toHaveBeenCalledWith(0); + expect(test.$confirmButton.prop('disabled')).toBeTruthy(); }); - it('should set moveToProjectId on dropdown item click', (done) => { + it('should set moveToProjectId on dropdown item click', async () => { jest.spyOn(test.mediator, 'setMoveToProjectId').mockImplementation(() => {}); // Open the dropdown test.$toggleButton.dropdown('toggle'); // Wait for the autocomplete request to finish - setImmediate(() => { - test.$content.find('.js-move-issue-dropdown-item').eq(1).trigger('click'); + await waitForPromises(); - expect(test.mediator.setMoveToProjectId).toHaveBeenCalledWith(20); - expect(test.$confirmButton.attr('disabled')).toBe(undefined); - done(); - }); + test.$content.find('.js-move-issue-dropdown-item').eq(1).trigger('click'); + + expect(test.mediator.setMoveToProjectId).toHaveBeenCalledWith(20); + expect(test.$confirmButton.attr('disabled')).toBe(undefined); }); }); diff --git a/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js b/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js index 45e9335abbe..c0a30a5093d 100644 --- a/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js +++ b/spec/frontend/vue_mr_widget/components/mr_widget_memory_usage_spec.js @@ -1,6 +1,7 @@ import axios from 'axios'; import MockAdapter from 'axios-mock-adapter'; import Vue, { nextTick } from 'vue'; +import waitForPromises from 'helpers/wait_for_promises'; import MemoryUsage from '~/vue_merge_request_widget/components/deployment/memory_usage.vue'; import MRWidgetService from '~/vue_merge_request_widget/services/mr_widget_service'; @@ -152,23 +153,18 @@ describe('MemoryUsage', () => { }); describe('loadMetrics', () => { - const returnServicePromise = () => - new Promise((resolve) => { - resolve({ - data: metricsMockData, - }); + it('should load metrics data using MRWidgetService', async () => { + jest.spyOn(MRWidgetService, 'fetchMetrics').mockResolvedValue({ + data: metricsMockData, }); - - it('should load metrics data using MRWidgetService', (done) => { - jest.spyOn(MRWidgetService, 'fetchMetrics').mockReturnValue(returnServicePromise(true)); jest.spyOn(vm, 'computeGraphData').mockImplementation(() => {}); vm.loadMetrics(); - setImmediate(() => { - expect(MRWidgetService.fetchMetrics).toHaveBeenCalledWith(url); - expect(vm.computeGraphData).toHaveBeenCalledWith(metrics, deployment_time); - done(); - }); + + await waitForPromises(); + + expect(MRWidgetService.fetchMetrics).toHaveBeenCalledWith(url); + expect(vm.computeGraphData).toHaveBeenCalledWith(metrics, deployment_time); }); }); }); diff --git a/spec/frontend/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js b/spec/frontend/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js index 52a56af454f..7387ed2d5e9 100644 --- a/spec/frontend/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js +++ b/spec/frontend/vue_mr_widget/components/states/mr_widget_auto_merge_enabled_spec.js @@ -2,6 +2,7 @@ import { shallowMount } from '@vue/test-utils'; import { nextTick } from 'vue'; import { trimText } from 'helpers/text_helper'; import { extendedWrapper } from 'helpers/vue_test_utils_helper'; +import waitForPromises from 'helpers/wait_for_promises'; import autoMergeEnabledComponent from '~/vue_merge_request_widget/components/states/mr_widget_auto_merge_enabled.vue'; import { MWPS_MERGE_STRATEGY } from '~/vue_merge_request_widget/constants'; import eventHub from '~/vue_merge_request_widget/event_hub'; @@ -185,7 +186,7 @@ describe('MRWidgetAutoMergeEnabled', () => { describe('methods', () => { describe('cancelAutomaticMerge', () => { - it('should set flag and call service then tell main component to update the widget with data', (done) => { + it('should set flag and call service then tell main component to update the widget with data', async () => { factory({ ...defaultMrProps(), }); @@ -201,20 +202,20 @@ describe('MRWidgetAutoMergeEnabled', () => { ); wrapper.vm.cancelAutomaticMerge(); - setImmediate(() => { - expect(wrapper.vm.isCancellingAutoMerge).toBeTruthy(); - if (mergeRequestWidgetGraphql) { - expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested'); - } else { - expect(eventHub.$emit).toHaveBeenCalledWith('UpdateWidgetData', mrObj); - } - done(); - }); + + await waitForPromises(); + + expect(wrapper.vm.isCancellingAutoMerge).toBeTruthy(); + if (mergeRequestWidgetGraphql) { + expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested'); + } else { + expect(eventHub.$emit).toHaveBeenCalledWith('UpdateWidgetData', mrObj); + } }); }); describe('removeSourceBranch', () => { - it('should set flag and call service then request main component to update the widget', (done) => { + it('should set flag and call service then request main component to update the widget', async () => { factory({ ...defaultMrProps(), }); @@ -227,14 +228,14 @@ describe('MRWidgetAutoMergeEnabled', () => { ); wrapper.vm.removeSourceBranch(); - setImmediate(() => { - expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested'); - expect(wrapper.vm.service.merge).toHaveBeenCalledWith({ - sha, - auto_merge_strategy: MWPS_MERGE_STRATEGY, - should_remove_source_branch: true, - }); - done(); + + await waitForPromises(); + + expect(eventHub.$emit).toHaveBeenCalledWith('MRWidgetUpdateRequested'); + expect(wrapper.vm.service.merge).toHaveBeenCalledWith({ + sha, + auto_merge_strategy: MWPS_MERGE_STRATEGY, + should_remove_source_branch: true, }); }); }); diff --git a/spec/lib/gitlab/background_migration/populate_topics_non_private_projects_count_spec.rb b/spec/lib/gitlab/background_migration/populate_topics_non_private_projects_count_spec.rb new file mode 100644 index 00000000000..e72e3392210 --- /dev/null +++ b/spec/lib/gitlab/background_migration/populate_topics_non_private_projects_count_spec.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe Gitlab::BackgroundMigration::PopulateTopicsNonPrivateProjectsCount, schema: 20220125122640 do + it 'correctly populates the non private projects counters' do + namespaces = table(:namespaces) + projects = table(:projects) + topics = table(:topics) + project_topics = table(:project_topics) + + group = namespaces.create!(name: 'group', path: 'group') + project_public = projects.create!(namespace_id: group.id, visibility_level: Gitlab::VisibilityLevel::PUBLIC) + project_internal = projects.create!(namespace_id: group.id, visibility_level: Gitlab::VisibilityLevel::INTERNAL) + project_private = projects.create!(namespace_id: group.id, visibility_level: Gitlab::VisibilityLevel::PRIVATE) + topic_1 = topics.create!(name: 'Topic1') + topic_2 = topics.create!(name: 'Topic2') + topic_3 = topics.create!(name: 'Topic3') + topic_4 = topics.create!(name: 'Topic4') + topic_5 = topics.create!(name: 'Topic5') + topic_6 = topics.create!(name: 'Topic6') + topic_7 = topics.create!(name: 'Topic7') + topic_8 = topics.create!(name: 'Topic8') + + project_topics.create!(topic_id: topic_1.id, project_id: project_public.id) + project_topics.create!(topic_id: topic_2.id, project_id: project_internal.id) + project_topics.create!(topic_id: topic_3.id, project_id: project_private.id) + project_topics.create!(topic_id: topic_4.id, project_id: project_public.id) + project_topics.create!(topic_id: topic_4.id, project_id: project_internal.id) + project_topics.create!(topic_id: topic_5.id, project_id: project_public.id) + project_topics.create!(topic_id: topic_5.id, project_id: project_private.id) + project_topics.create!(topic_id: topic_6.id, project_id: project_internal.id) + project_topics.create!(topic_id: topic_6.id, project_id: project_private.id) + project_topics.create!(topic_id: topic_7.id, project_id: project_public.id) + project_topics.create!(topic_id: topic_7.id, project_id: project_internal.id) + project_topics.create!(topic_id: topic_7.id, project_id: project_private.id) + project_topics.create!(topic_id: topic_8.id, project_id: project_public.id) + + subject.perform(topic_1.id, topic_7.id) + + expect(topic_1.reload.non_private_projects_count).to eq(1) + expect(topic_2.reload.non_private_projects_count).to eq(1) + expect(topic_3.reload.non_private_projects_count).to eq(0) + expect(topic_4.reload.non_private_projects_count).to eq(2) + expect(topic_5.reload.non_private_projects_count).to eq(1) + expect(topic_6.reload.non_private_projects_count).to eq(1) + expect(topic_7.reload.non_private_projects_count).to eq(2) + expect(topic_8.reload.non_private_projects_count).to eq(0) + end +end diff --git a/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb b/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb index 067b8b09516..a70ff0bd82d 100644 --- a/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb +++ b/spec/lib/gitlab/github_import/importer/pull_requests_importer_spec.rb @@ -164,7 +164,7 @@ RSpec.describe Gitlab::GithubImport::Importer::PullRequestsImporter do expect(project.repository) .to receive(:fetch_remote) - .with(url, forced: false, refmap: Gitlab::GithubImport.refmap) + .with(url, forced: true, refmap: Gitlab::GithubImport.refmap) freeze_time do importer.update_repository diff --git a/spec/models/merge_request_spec.rb b/spec/models/merge_request_spec.rb index e1f3b36a2ba..e9a38755692 100644 --- a/spec/models/merge_request_spec.rb +++ b/spec/models/merge_request_spec.rb @@ -1538,6 +1538,42 @@ RSpec.describe MergeRequest, factory_default: :keep do end end + describe '#permits_force_push?' do + let_it_be(:merge_request) { build_stubbed(:merge_request) } + + subject { merge_request.permits_force_push? } + + context 'when source branch is not protected' do + before do + allow(ProtectedBranch).to receive(:protected?).and_return(false) + end + + it { is_expected.to be_truthy } + end + + context 'when source branch is protected' do + before do + allow(ProtectedBranch).to receive(:protected?).and_return(true) + end + + context 'when force push is not allowed' do + before do + allow(ProtectedBranch).to receive(:allow_force_push?) { false } + end + + it { is_expected.to be_falsey } + end + + context 'when force push is allowed' do + before do + allow(ProtectedBranch).to receive(:allow_force_push?) { true } + end + + it { is_expected.to be_truthy } + end + end + end + describe '#can_remove_source_branch?' do let_it_be(:user) { create(:user) } let_it_be(:merge_request, reload: true) { create(:merge_request, :simple) } diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index 35d0566d9b4..f343e164d9b 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -7418,6 +7418,67 @@ RSpec.describe Project, factory_default: :keep do expect(project.reload.topics.map(&:name)).to eq(%w[topic1 topic2 topic3]) end end + + context 'public topics counter' do + let_it_be(:topic_1) { create(:topic, name: 't1') } + let_it_be(:topic_2) { create(:topic, name: 't2') } + let_it_be(:topic_3) { create(:topic, name: 't3') } + + let(:private) { Gitlab::VisibilityLevel::PRIVATE } + let(:internal) { Gitlab::VisibilityLevel::INTERNAL } + let(:public) { Gitlab::VisibilityLevel::PUBLIC } + + subject do + project_updates = { + visibility_level: new_visibility, + topic_list: new_topic_list + }.compact + + project.update!(project_updates) + end + + using RSpec::Parameterized::TableSyntax + + # rubocop:disable Lint/BinaryOperatorWithIdenticalOperands + where(:initial_visibility, :new_visibility, :new_topic_list, :expected_count_changes) do + ref(:private) | nil | 't2, t3' | [0, 0, 0] + ref(:internal) | nil | 't2, t3' | [-1, 0, 1] + ref(:public) | nil | 't2, t3' | [-1, 0, 1] + ref(:private) | ref(:public) | nil | [1, 1, 0] + ref(:private) | ref(:internal) | nil | [1, 1, 0] + ref(:private) | ref(:private) | nil | [0, 0, 0] + ref(:internal) | ref(:public) | nil | [0, 0, 0] + ref(:internal) | ref(:internal) | nil | [0, 0, 0] + ref(:internal) | ref(:private) | nil | [-1, -1, 0] + ref(:public) | ref(:public) | nil | [0, 0, 0] + ref(:public) | ref(:internal) | nil | [0, 0, 0] + ref(:public) | ref(:private) | nil | [-1, -1, 0] + ref(:private) | ref(:public) | 't2, t3' | [0, 1, 1] + ref(:private) | ref(:internal) | 't2, t3' | [0, 1, 1] + ref(:private) | ref(:private) | 't2, t3' | [0, 0, 0] + ref(:internal) | ref(:public) | 't2, t3' | [-1, 0, 1] + ref(:internal) | ref(:internal) | 't2, t3' | [-1, 0, 1] + ref(:internal) | ref(:private) | 't2, t3' | [-1, -1, 0] + ref(:public) | ref(:public) | 't2, t3' | [-1, 0, 1] + ref(:public) | ref(:internal) | 't2, t3' | [-1, 0, 1] + ref(:public) | ref(:private) | 't2, t3' | [-1, -1, 0] + end + # rubocop:enable Lint/BinaryOperatorWithIdenticalOperands + + with_them do + it 'increments or decrements counters of topics' do + project.reload.update!( + visibility_level: initial_visibility, + topic_list: [topic_1.name, topic_2.name] + ) + + expect { subject } + .to change { topic_1.reload.non_private_projects_count }.by(expected_count_changes[0]) + .and change { topic_2.reload.non_private_projects_count }.by(expected_count_changes[1]) + .and change { topic_3.reload.non_private_projects_count }.by(expected_count_changes[2]) + end + end + end end shared_examples 'all_runners' do diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb index 2a266ff5d19..dcf5c0151eb 100644 --- a/spec/requests/api/merge_requests_spec.rb +++ b/spec/requests/api/merge_requests_spec.rb @@ -3344,6 +3344,18 @@ RSpec.describe API::MergeRequests do end end + context 'when merge request branch does not allow force push' do + before do + create(:protected_branch, project: project, name: merge_request.source_branch, allow_force_push: false) + end + + it 'returns 403' do + put api("/projects/#{project.id}/merge_requests/#{merge_request.iid}/rebase", user) + + expect(response).to have_gitlab_http_status(:forbidden) + end + end + it 'returns 403 if the user cannot push to the branch' do guest = create(:user) project.add_guest(guest) diff --git a/spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb b/spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb index fe4ce0dab5e..ae8846974ce 100644 --- a/spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb +++ b/spec/services/merge_requests/bulk_remove_attention_requested_service_spec.rb @@ -10,7 +10,7 @@ RSpec.describe MergeRequests::BulkRemoveAttentionRequestedService do let(:reviewer) { merge_request.find_reviewer(user) } let(:assignee) { merge_request.find_assignee(assignee_user) } let(:project) { merge_request.project } - let(:service) { described_class.new(project: project, current_user: current_user, merge_request: merge_request) } + let(:service) { described_class.new(project: project, current_user: current_user, merge_request: merge_request, users: [user, assignee_user]) } let(:result) { service.execute } before do @@ -20,7 +20,7 @@ RSpec.describe MergeRequests::BulkRemoveAttentionRequestedService do describe '#execute' do context 'invalid permissions' do - let(:service) { described_class.new(project: project, current_user: create(:user), merge_request: merge_request) } + let(:service) { described_class.new(project: project, current_user: create(:user), merge_request: merge_request, users: [user]) } it 'returns an error' do expect(result[:status]).to eq :error diff --git a/spec/services/quick_actions/interpret_service_spec.rb b/spec/services/quick_actions/interpret_service_spec.rb index e3a6a60393d..bd0896bf0a8 100644 --- a/spec/services/quick_actions/interpret_service_spec.rb +++ b/spec/services/quick_actions/interpret_service_spec.rb @@ -701,6 +701,27 @@ RSpec.describe QuickActions::InterpretService do end end + shared_examples 'attention command' do + it 'updates reviewers attention status' do + _, _, message = service.execute(content, issuable) + + expect(message).to eq("Requested attention from #{developer.to_reference}.") + + reviewer.reload + + expect(reviewer).to be_attention_requested + end + end + + shared_examples 'remove attention command' do + it 'updates reviewers attention status' do + _, _, message = service.execute(content, issuable) + + expect(message).to eq("Removed attention from #{developer.to_reference}.") + expect(reviewer).not_to be_attention_requested + end + end + it_behaves_like 'reopen command' do let(:content) { '/reopen' } let(:issuable) { issue } @@ -2283,6 +2304,82 @@ RSpec.describe QuickActions::InterpretService do expect(message).to eq('One or more contacts were successfully removed.') end end + + describe 'attention command' do + let(:issuable) { create(:merge_request, reviewers: [developer], source_project: project) } + let(:reviewer) { issuable.merge_request_reviewers.find_by(user_id: developer.id) } + let(:content) { "/attention @#{developer.username}" } + + context 'with one user' do + before do + reviewer.update!(state: :reviewed) + end + + it_behaves_like 'attention command' + end + + context 'with no user' do + let(:content) { "/attention" } + + it_behaves_like 'failed command', 'Failed to request attention because no user was found.' + end + + context 'with incorrect permissions' do + let(:service) { described_class.new(project, create(:user)) } + + it_behaves_like 'failed command', 'Could not apply attention command.' + end + + context 'with feature flag disabled' do + before do + stub_feature_flags(mr_attention_requests: false) + end + + it_behaves_like 'failed command', 'Could not apply attention command.' + end + + context 'with an issue instead of a merge request' do + let(:issuable) { issue } + + it_behaves_like 'failed command', 'Could not apply attention command.' + end + end + + describe 'remove attention command' do + let(:issuable) { create(:merge_request, reviewers: [developer], source_project: project) } + let(:reviewer) { issuable.merge_request_reviewers.find_by(user_id: developer.id) } + let(:content) { "/remove_attention @#{developer.username}" } + + context 'with one user' do + it_behaves_like 'remove attention command' + end + + context 'with no user' do + let(:content) { "/remove_attention" } + + it_behaves_like 'failed command', 'Failed to remove attention because no user was found.' + end + + context 'with incorrect permissions' do + let(:service) { described_class.new(project, create(:user)) } + + it_behaves_like 'failed command', 'Could not apply remove_attention command.' + end + + context 'with feature flag disabled' do + before do + stub_feature_flags(mr_attention_requests: false) + end + + it_behaves_like 'failed command', 'Could not apply remove_attention command.' + end + + context 'with an issue instead of a merge request' do + let(:issuable) { issue } + + it_behaves_like 'failed command', 'Could not apply remove_attention command.' + end + end end describe '#explain' do diff --git a/spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_shared_examples.rb b/spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_shared_examples.rb index 28decb4011d..2258bdd2c79 100644 --- a/spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_shared_examples.rb +++ b/spec/support/shared_examples/quick_actions/merge_request/rebase_quick_action_shared_examples.rb @@ -73,6 +73,16 @@ RSpec.shared_examples 'rebase quick action' do expect(page).to have_content 'This merge request cannot be rebased while there are conflicts.' end end + + context 'when the merge request branch is protected from force push' do + let!(:protected_branch) { create(:protected_branch, project: project, name: merge_request.source_branch, allow_force_push: false) } + + it 'does not rebase the MR' do + add_note("/rebase") + + expect(page).to have_content 'This merge request branch is protected from force push.' + end + end end context 'when the current user cannot rebase the MR' do diff --git a/spec/workers/container_registry/migration/observer_worker_spec.rb b/spec/workers/container_registry/migration/observer_worker_spec.rb new file mode 100644 index 00000000000..fec6640d7ec --- /dev/null +++ b/spec/workers/container_registry/migration/observer_worker_spec.rb @@ -0,0 +1,57 @@ +# frozen_string_literal: true + +require 'spec_helper' + +RSpec.describe ContainerRegistry::Migration::ObserverWorker, :aggregate_failures do + let(:worker) { described_class.new } + + describe '#perform' do + subject { worker.perform } + + context 'when the migration feature flag is disabled' do + before do + stub_feature_flags(container_registry_migration_phase2_enabled: false) + end + + it 'does nothing' do + expect(worker).not_to receive(:log_extra_metadata_on_done) + + subject + end + end + + context 'when the migration is enabled' do + before do + create_list(:container_repository, 3) + create(:container_repository, :pre_importing) + create(:container_repository, :pre_import_done) + create_list(:container_repository, 2, :importing) + create(:container_repository, :import_aborted) + # batch_count is not allowed within a transaction but + # all rspec tests run inside of a transaction. + # This mocks the false positive. + allow(ActiveRecord::Base.connection).to receive(:transaction_open?).and_return(false) # rubocop:disable Database/MultipleDatabases + end + + it 'logs all the counts' do + expect(worker).to receive(:log_extra_metadata_on_done).with(:default_count, 3) + expect(worker).to receive(:log_extra_metadata_on_done).with(:pre_importing_count, 1) + expect(worker).to receive(:log_extra_metadata_on_done).with(:pre_import_done_count, 1) + expect(worker).to receive(:log_extra_metadata_on_done).with(:importing_count, 2) + expect(worker).to receive(:log_extra_metadata_on_done).with(:import_done_count, 0) + expect(worker).to receive(:log_extra_metadata_on_done).with(:import_aborted_count, 1) + expect(worker).to receive(:log_extra_metadata_on_done).with(:import_skipped_count, 0) + + subject + end + + context 'with load balancing enabled', :db_load_balancing do + it 'uses the replica' do + expect(Gitlab::Database::LoadBalancing::Session.current).to receive(:use_replicas_for_read_queries).and_call_original + + subject + end + end + end + end +end diff --git a/spec/workers/projects/git_garbage_collect_worker_spec.rb b/spec/workers/projects/git_garbage_collect_worker_spec.rb index 7b54d7df4b2..ae567107443 100644 --- a/spec/workers/projects/git_garbage_collect_worker_spec.rb +++ b/spec/workers/projects/git_garbage_collect_worker_spec.rb @@ -32,6 +32,21 @@ RSpec.describe Projects::GitGarbageCollectWorker do subject.perform(*params) end + + context 'when deduplication service runs into a GRPC internal error' do + before do + allow_next_instance_of(::Projects::GitDeduplicationService) do |instance| + expect(instance).to receive(:execute).and_raise(GRPC::Internal) + end + end + + it_behaves_like 'can collect git garbage' do + let(:resource) { project } + let(:statistics_service_klass) { Projects::UpdateStatisticsService } + let(:statistics_keys) { [:repository_size, :lfs_objects_size] } + let(:expected_default_lease) { "projects:#{resource.id}" } + end + end end context 'LFS object garbage collection' do diff --git a/yarn.lock b/yarn.lock index 222d00efa1e..22e6b2b569a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -896,6 +896,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@discoveryjs/json-ext@^0.5.0": + version "0.5.6" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz#d5e0706cf8c6acd8c6032f8d54070af261bbbb2f" + integrity sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA== + "@endemolshinegroup/cosmiconfig-typescript-loader@3.0.2": version "3.0.2" resolved "https://registry.yarnpkg.com/@endemolshinegroup/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-3.0.2.tgz#eea4635828dde372838b0909693ebd9aafeec22d" @@ -1785,6 +1790,21 @@ dependencies: "@babel/types" "^7.3.0" +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + "@types/codemirror@0.0.71": version "0.0.71" resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-0.0.71.tgz#861f1bcb3100c0a064567c5400f2981cf4ae8ca7" @@ -1792,6 +1812,21 @@ dependencies: "@types/tern" "*" +"@types/connect-history-api-fallback@^1.3.5": + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae" + integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + "@types/estree@*": version "0.0.44" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" @@ -1802,7 +1837,26 @@ resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== -"@types/glob@5 - 7", "@types/glob@^7.1.1": +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18": + version "4.17.28" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz#c47def9f34ec81dc6328d0b1b5303d1ec98d86b8" + integrity sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.13" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" + integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.18" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@5 - 7": version "7.1.1" resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.1.tgz#aa59a1c6e3fbc421e07ccd31a944c30eba521575" integrity sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w== @@ -1818,6 +1872,13 @@ dependencies: "@types/node" "*" +"@types/http-proxy@^1.17.8": + version "1.17.8" + resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.8.tgz#968c66903e7e42b483608030ee85800f22d03f55" + integrity sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA== + dependencies: + "@types/node" "*" + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" @@ -1837,10 +1898,10 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.6": - version "7.0.7" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.7.tgz#98a993516c859eb0d5c4c8f098317a9ea68db9ad" - integrity sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA== +"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.9" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d" + integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ== "@types/json5@^0.0.29": version "0.0.29" @@ -1852,6 +1913,11 @@ resolved "https://registry.yarnpkg.com/@types/lowlight/-/lowlight-0.0.3.tgz#433b03dd63894dde17860063f4c90a688431194b" integrity sha512-R83q/yPX2nIlo9D3WtSjyUDd57t8s+GVLaL8YIv3k7zMMWpYpOXqjJgrWp80qXUJB/a1t76nTyBpxrv0JNYaEg== +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.2.tgz#93e25bf9ee75fe0fd80b594bc4feb0e862111b5a" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + "@types/minimatch@*": version "3.0.3" resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" @@ -1975,6 +2041,43 @@ "@types/prosemirror-state" "*" "@types/prosemirror-transform" "*" +"@types/qs@*": + version "6.9.7" + resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/retry@^0.12.0": + version "0.12.1" + resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065" + integrity sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g== + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*": + version "1.13.10" + resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.10.tgz#f5e0ce8797d2d7cc5ebeda48a52c96c4fa47a8d9" + integrity sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" @@ -1994,10 +2097,10 @@ dependencies: "@types/node" "*" -"@types/ws@^8.0.0": - version "8.2.0" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.0.tgz#75faefbe2328f3b833cb8dc640658328990d04f3" - integrity sha512-cyeefcUCgJlEk+hk2h3N+MqKKsPViQgF5boi9TTHSK+PoR9KWBb/C5ccPcDyAqgsbAYHTwulch725DV84+pSpg== +"@types/ws@^8.0.0", "@types/ws@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.2.2.tgz#7c5be4decb19500ae6b3d563043cd407bf366c21" + integrity sha512-NOn5eIcgWLOo6qW8AcuLZ7G8PycXu0xTxxkS6Q18VWFxgPUSOwV0pBj2a/4viNZVu25i7RIB7GttdkAIUUXOOg== dependencies: "@types/node" "*" @@ -2210,6 +2313,23 @@ "@webassemblyjs/wast-parser" "1.9.0" "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.1.1.tgz#9f53b1b7946a6efc2a749095a4f450e2932e8356" + integrity sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg== + +"@webpack-cli/info@^1.4.1": + version "1.4.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.4.1.tgz#2360ea1710cbbb97ff156a3f0f24556e0fc1ebea" + integrity sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.6.1": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.6.1.tgz#0de2875ac31b46b6c5bb1ae0a7d7f0ba5678dffe" + integrity sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw== + "@wry/context@^0.4.0": version "0.4.4" resolved "https://registry.yarnpkg.com/@wry/context/-/context-0.4.4.tgz#e50f5fa1d6cfaabf2977d1fda5ae91717f8815f8" @@ -2323,11 +2443,25 @@ ajv-errors@^1.0.0: resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" integrity sha1-7PAh+hCP0X37Xms4Py3SM+Mf/Fk= +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== +ajv-keywords@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" @@ -2338,10 +2472,10 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.1: - version "8.6.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.6.2.tgz#2fb45e0e5fcbc0813326c1c3da535d1881bb0571" - integrity sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w== +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.8.0: + version "8.9.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.9.0.tgz#738019146638824dea25edcf299dcba1b0e7eb18" + integrity sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2355,11 +2489,6 @@ ansi-align@^3.0.0: dependencies: string-width "^3.0.0" -ansi-colors@^3.0.0: - version "3.2.4" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" - integrity sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA== - ansi-colors@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" @@ -2372,16 +2501,11 @@ ansi-escapes@^4.2.1: dependencies: type-fest "^0.21.3" -ansi-html-community@0.0.8: +ansi-html-community@^0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - ansi-regex@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" @@ -2392,7 +2516,12 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2606,23 +2735,11 @@ array-includes@^3.1.1: get-intrinsic "^1.0.1" is-string "^1.0.5" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= - dependencies: - array-uniq "^1.0.1" - array-union@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= - array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -2680,11 +2797,6 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== -async-limiter@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" - integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== - async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -3357,7 +3469,7 @@ cheerio@^1.0.0-rc.9: parse5-htmlparser2-tree-adapter "^6.0.1" tslib "^2.2.0" -"chokidar@>=3.0.0 <4.0.0", chokidar@^2.1.8, chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.1: +"chokidar@>=3.0.0 <4.0.0", chokidar@^2.1.8, chokidar@^3.2.2, chokidar@^3.4.0, chokidar@^3.4.1, chokidar@^3.5.3: version "3.4.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== @@ -3431,15 +3543,6 @@ clipboard@^2.0.0, clipboard@^2.0.8: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - cliui@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" @@ -3449,6 +3552,15 @@ cliui@^6.0.0: strip-ansi "^6.0.0" wrap-ansi "^6.2.0" +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + clone-regexp@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clone-regexp/-/clone-regexp-2.2.0.tgz#7d65e00885cd8796405c35a737e7a86b7429e36f" @@ -3539,6 +3651,11 @@ colord@^2.9.2: resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.2.tgz#25e2bacbbaa65991422c07ea209e2089428effb1" integrity sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ== +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.16" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da" + integrity sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g== + combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" @@ -3551,7 +3668,7 @@ commander@2, commander@^2.19.0, commander@^2.20.0, commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== -commander@7: +commander@7, commander@^7.0.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== @@ -3858,7 +3975,7 @@ cropper@^2.3.0: dependencies: jquery ">= 1.9.1" -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -3869,7 +3986,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -4656,19 +4773,23 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== -default-gateway@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b" - integrity sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA== +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== dependencies: - execa "^1.0.0" - ip-regex "^2.1.0" + execa "^5.0.0" defer-to-connect@^1.0.1: version "1.1.3" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -4698,18 +4819,19 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -del@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" - integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== +del@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952" + integrity sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ== dependencies: - "@types/glob" "^7.1.1" - globby "^6.1.0" - is-path-cwd "^2.0.0" - is-path-in-cwd "^2.0.0" - p-map "^2.0.0" - pify "^4.0.1" - rimraf "^2.6.3" + globby "^11.0.1" + graceful-fs "^4.2.4" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.2" + p-map "^4.0.0" + rimraf "^3.0.2" + slash "^3.0.0" delaunator@5: version "5.0.0" @@ -4751,11 +4873,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -4808,9 +4925,9 @@ dns-equal@^1.0.0: integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0= dns-packet@^1.0.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" - integrity sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f" + integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA== dependencies: ip "^1.1.0" safe-buffer "^5.0.1" @@ -5051,7 +5168,7 @@ enhanced-resolve@^0.9.1: memory-fs "^0.2.0" tapable "^0.1.8" -enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0: +enhanced-resolve@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== @@ -5077,6 +5194,11 @@ entities@~2.0.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== +envinfo@^7.7.3: + version "7.8.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" + integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -5470,13 +5592,6 @@ events@^3.0.0: resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== -eventsource@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" - integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== - dependencies: - original "^1.0.0" - evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -5518,6 +5633,21 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + execall@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/execall/-/execall-2.0.0.tgz#16a06b5fe5099df7d00be5d9c06eecded1663b45" @@ -5543,13 +5673,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect@^26.5.2: version "26.5.2" resolved "https://registry.yarnpkg.com/expect/-/expect-26.5.2.tgz#3e0631c4a657a83dbec769ad246a2998953a55a6" @@ -5818,16 +5941,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -5850,9 +5963,9 @@ flush-write-stream@^1.0.0: readable-stream "^2.3.6" follow-redirects@^1.0.0, follow-redirects@^1.14.4: - version "1.14.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" - integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== + version "1.14.8" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.8.tgz#016996fb9a11a100566398b1c6839337d7bfa8fc" + integrity sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA== for-in@^1.0.2: version "1.0.2" @@ -5919,6 +6032,11 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== + fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -6007,6 +6125,11 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + 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" @@ -6046,7 +6169,7 @@ glob-parent@^5.1.1, glob-parent@^5.1.2, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" -"glob@5 - 7", glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0: +"glob@5 - 7", glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== @@ -6065,15 +6188,6 @@ global-dirs@^2.0.1: dependencies: ini "^1.3.5" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -6081,17 +6195,6 @@ global-modules@^2.0.0: dependencies: global-prefix "^3.0.0" -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - global-prefix@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" @@ -6133,17 +6236,6 @@ globby@^11.0.1, globby@^11.0.3, globby@^11.1.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" - integrity sha1-9abXDoOV4hyFj7BInWTfAkJNUGw= - dependencies: - array-union "^1.0.1" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - globjoin@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/globjoin/-/globjoin-0.1.4.tgz#2f4494ac8919e3767c5cbb691e9f463324285d43" @@ -6173,10 +6265,10 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4: - version "4.2.8" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a" - integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg== +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.9, graceful-fs@^4.2.4, graceful-fs@^4.2.6: + version "4.2.9" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" + integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== graphlib@^2.1.8: version "2.1.8" @@ -6381,13 +6473,6 @@ hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -homedir-polyfill@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" - integrity sha1-TCu8inWJmP7r9e1oWA921GdotLw= - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -6417,10 +6502,10 @@ html-encoding-sniffer@^2.0.1: dependencies: whatwg-encoding "^1.0.5" -html-entities@^1.3.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.4.0.tgz#cfbd1b01d2afaf9adca1b10ae7dffab98c71d2dc" - integrity sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA== +html-entities@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.2.tgz#760b404685cb1d794e4f4b744332e3b00dcfe488" + integrity sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ== html-escaper@^2.0.0: version "2.0.0" @@ -6486,17 +6571,18 @@ http-proxy-agent@^2.1.0: agent-base "4" debug "3.1.0" -http-proxy-middleware@0.19.1: - version "0.19.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz#183c7dc4aa1479150306498c210cdaf96080a43a" - integrity sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q== +http-proxy-middleware@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.2.tgz#94d7593790aad6b3de48164f13792262f656c332" + integrity sha512-XtmDN5w+vdFTBZaYhdJAbMqn0DP/EhkUaAeo963mojwpKMMbw6nivtFKw07D7DDOH745L5k0VL0P8KRYNEVF/g== dependencies: - http-proxy "^1.17.0" - is-glob "^4.0.0" - lodash "^4.17.11" - micromatch "^3.1.10" + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" -http-proxy@^1.17.0: +http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -6532,6 +6618,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@0.4, iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -6616,14 +6707,6 @@ import-lazy@^4.0.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-4.0.0.tgz#e8eb627483a0a43da3c03f3e35548be5cb0cc153" integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== -import-local@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - import-local@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6" @@ -6685,14 +6768,6 @@ ini@~2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -internal-ip@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" - integrity sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg== - dependencies: - default-gateway "^4.2.0" - ipaddr.js "^1.9.0" - "internmap@1 - 2": version "2.0.3" resolved "https://registry.yarnpkg.com/internmap/-/internmap-2.0.3.tgz#6685f23755e43c524e251d29cbc97248e3061009" @@ -6703,6 +6778,11 @@ interpret@^1.4.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" @@ -6715,7 +6795,7 @@ ip-regex@^2.1.0: resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9" integrity sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk= -ip@^1.1.0, ip@^1.1.5: +ip@^1.1.0: version "1.1.5" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo= @@ -6725,15 +6805,15 @@ ipaddr.js@1.9.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== -ipaddr.js@^1.9.0, ipaddr.js@^1.9.1: +ipaddr.js@^1.9.1: version "1.9.1" resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute-url@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" - integrity sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q== +ipaddr.js@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0" + integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -6778,7 +6858,7 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.2.0, is-core-module@^2.5.0, is-core-module@^2.7.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== @@ -6822,7 +6902,7 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: is-data-descriptor "^1.0.0" kind-of "^6.0.2" -is-docker@^2.0.0: +is-docker@^2.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== @@ -6901,35 +6981,26 @@ is-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982" integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== -is-path-cwd@^2.0.0: +is-path-cwd@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== -is-path-in-cwd@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz#bfe2dca26c69f397265a4009963602935a053acb" - integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ== - dependencies: - is-path-inside "^2.1.0" - -is-path-inside@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz#7c9810587d659a40d27bcdb4d5616eab059494b2" - integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== - dependencies: - path-is-inside "^1.0.2" - -is-path-inside@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017" - integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg== +is-path-inside@^3.0.1, is-path-inside@^3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -6992,7 +7063,7 @@ is-whitespace@^0.3.0: resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f" integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -7688,11 +7759,6 @@ json-stringify-safe@~5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= -json3@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz#7fc10e375fc5ae42c4705a5cc0aa6f62be305b81" - integrity sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA== - json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -7762,11 +7828,6 @@ khroma@^1.4.1: resolved "https://registry.yarnpkg.com/khroma/-/khroma-1.4.1.tgz#ad6a5b6a972befc5112ce5129887a1a83af2c003" integrity sha512-+GmxKvmiRuCcUYDgR7g5Ngo0JEDeOsGdNONdU2zsiBQaK4z19Y2NvXqfEDE0ZiIrg45GTZyAnPLVsLZZACYm3Q== -killable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892" - integrity sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg== - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -8075,16 +8136,11 @@ lodash.values@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== -loglevel@^1.6.8: - version "1.7.1" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197" - integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw== - loose-envify@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -8278,6 +8334,13 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memfs@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.1.tgz#b78092f466a0dce054d63d39275b24c71d3f1305" + integrity sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw== + dependencies: + fs-monkey "1.0.3" + memory-fs@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.2.0.tgz#f2bb25368bc121e391c2520de92969caee0a0290" @@ -8364,7 +8427,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -8399,24 +8462,24 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.47.0, "mime-db@>= 1.40.0 < 2": - version "1.47.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== +mime-db@1.51.0, "mime-db@>= 1.40.0 < 2": + version "1.51.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" + integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.30" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: + version "2.1.34" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" + integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== dependencies: - mime-db "1.47.0" + mime-db "1.51.0" mime@1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.3.1, mime@^2.4.4: +mime@^2.3.1: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -8706,10 +8769,10 @@ node-fetch@^2.6.1, node-fetch@^2.6.5: dependencies: whatwg-url "^5.0.0" -node-forge@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" - integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== +node-forge@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.2.1.tgz#82794919071ef2eb5c509293325cec8afd0fd53c" + integrity sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w== node-int64@^0.4.0: version "0.4.0" @@ -8847,7 +8910,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -8871,11 +8934,6 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" @@ -8963,25 +9021,27 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== dependencies: mimic-fn "^2.1.0" +open@^8.0.9: + version "8.4.0" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" + integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -opn@^5.5.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" - integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== - dependencies: - is-wsl "^1.1.0" - optimism@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/optimism/-/optimism-0.10.3.tgz#163268fdc741dea2fb50f300bedda80356445fd7" @@ -9018,13 +9078,6 @@ orderedmap@^1.1.0: resolved "https://registry.yarnpkg.com/orderedmap/-/orderedmap-1.1.1.tgz#c618e77611b3b21d0fe3edc92586265e0059c789" integrity sha512-3Ux8um0zXbVacKUkcytc0u3HgC0b0bBLT+I60r2J/En72cI0nZffqrA7Xtf2Hqs27j1g82llR5Mhbd0Z1XW4AQ== -original@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" - integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== - dependencies: - url-parse "^1.4.3" - os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" @@ -9105,11 +9158,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-map@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" - integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== - p-map@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" @@ -9117,12 +9165,13 @@ p-map@^4.0.0: dependencies: aggregate-error "^3.0.0" -p-retry@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz#316b4c8893e2c8dc1cfa891f406c4b422bebf328" - integrity sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w== +p-retry@^4.5.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.1.tgz#8fcddd5cdf7a67a0911a9cf2ef0e5df7f602316c" + integrity sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA== dependencies: - retry "^0.12.0" + "@types/retry" "^0.12.0" + retry "^0.13.1" p-try@^1.0.0: version "1.0.0" @@ -9205,11 +9254,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5-htmlparser2-tree-adapter@^6.0.0, parse5-htmlparser2-tree-adapter@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" @@ -9257,11 +9301,6 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= -path-is-inside@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -9272,10 +9311,10 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-to-regexp@0.1.7: version "0.1.7" @@ -9348,18 +9387,6 @@ pikaday@^1.8.0: resolved "https://registry.yarnpkg.com/pikaday/-/pikaday-1.8.0.tgz#ce930e257042e852e6aadee1115e01554b2d71c5" integrity sha512-SgGxMYX0NHj9oQnMaSyAipr2gOrbB4Lfs/TJTb6H6hRHs39/5c5VZi73Q8hr53+vWjdn6HzkWcj8Vtl3c9ziaA== -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - pirates@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87" @@ -9403,7 +9430,7 @@ portal-vue@^2.1.6, portal-vue@^2.1.7: resolved "https://registry.yarnpkg.com/portal-vue/-/portal-vue-2.1.7.tgz#ea08069b25b640ca08a5b86f67c612f15f4e4ad4" integrity sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g== -portfinder@^1.0.26: +portfinder@^1.0.28: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== @@ -9873,11 +9900,6 @@ querystring@0.2.0: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= -querystringify@^2.1.1: - version "2.2.0" - resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" - integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== - queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -10030,6 +10052,13 @@ readdirp@~3.4.0: dependencies: picomatch "^2.2.1" +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -10212,13 +10241,6 @@ requizzle@~0.2.1: dependencies: underscore "~1.6.0" -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" @@ -10226,24 +10248,11 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -10254,13 +10263,14 @@ 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.17.0, resolve@^1.20.0: - version "1.20.0" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== +resolve@^1.10.0, resolve@^1.12.0, resolve@^1.13.1, 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== dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" responselike@^1.0.2: version "1.0.2" @@ -10274,10 +10284,10 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== -retry@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" - integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== reusify@^1.0.4: version "1.0.4" @@ -10433,14 +10443,24 @@ schema-utils@^2.0.0, schema-utils@^2.6.5, schema-utils@^2.7.0: ajv-keywords "^3.5.2" schema-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.0.0.tgz#67502f6aa2b66a2d4032b4279a2944978a0913ef" - integrity sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281" + integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw== dependencies: - "@types/json-schema" "^7.0.6" + "@types/json-schema" "^7.0.8" ajv "^6.12.5" ajv-keywords "^3.5.2" +schema-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7" + integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.8.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.0.0" + scrollparent@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/scrollparent/-/scrollparent-2.0.1.tgz#715d5b9cc57760fb22bdccc3befb5bfe06b1a317" @@ -10461,12 +10481,12 @@ select@^1.1.2: resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" integrity sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0= -selfsigned@^1.10.8: - version "1.10.8" - resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.8.tgz#0d17208b7d12c33f8eac85c41835f27fc3d81a30" - integrity sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w== +selfsigned@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.0.0.tgz#e927cd5377cbb0a1075302cff8df1042cc2bce5b" + integrity sha512-cUdFiCbKoa1mZ6osuJs2uDHrs0k0oprsKveFiiaBKCNq3SYyb5gs2HxhQyDNLCmL51ZZThqi4YNDpCK6GOP1iQ== dependencies: - node-forge "^0.10.0" + node-forge "^1.2.0" semver-diff@^3.1.1: version "3.1.1" @@ -10596,6 +10616,13 @@ sha.js@^2.4.0, sha.js@^2.4.8: inherits "^2.0.1" safe-buffer "^5.0.1" +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10637,10 +10664,10 @@ sigmund@^1.0.1: resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" integrity sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA= -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.4" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.4.tgz#366a4684d175b9cab2081e3681fda3747b6c51d7" - integrity sha512-rqYhcAnZ6d/vTPGghdrw7iumdcbXpsk1b8IG/rz+VWV51DM0p7XCtMoJ3qhPLIbp3tvyt3pKRbaaEMZYpHto8Q== +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.6" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af" + integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ== sirv@^1.0.7: version "1.0.11" @@ -10709,18 +10736,6 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -sockjs-client@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.5.0.tgz#2f8ff5d4b659e0d092f7aba0b7c386bd2aa20add" - integrity sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q== - dependencies: - debug "^3.2.6" - eventsource "^1.0.7" - faye-websocket "^0.11.3" - inherits "^2.0.4" - json3 "^3.3.3" - url-parse "^1.4.7" - sockjs@^0.3.21: version "0.3.21" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.21.tgz#b34ffb98e796930b60a0cfa11904d6a339a7d417" @@ -10959,7 +10974,7 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -string-width@^3.0.0, string-width@^3.1.0: +string-width@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== @@ -11005,14 +11020,7 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= -strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: +strip-ansi@^5.1.0, strip-ansi@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== @@ -11026,6 +11034,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" + integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -11164,13 +11179,6 @@ supports-color@^5.3.0, supports-color@^5.5.0: dependencies: has-flag "^3.0.0" -supports-color@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - supports-color@^7.0.0, supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -11186,6 +11194,11 @@ supports-hyperlinks@^2.0.0, supports-hyperlinks@^2.2.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" @@ -11830,14 +11843,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -url-parse@^1.4.3, url-parse@^1.4.7: - version "1.4.7" - resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278" - integrity sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg== - dependencies: - querystringify "^2.1.1" - requires-port "^1.0.0" - url-search-params-polyfill@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/url-search-params-polyfill/-/url-search-params-polyfill-5.1.0.tgz#f0405dcc2e921bf7f5fdf8c4e616f1e8088ef31b" @@ -11908,7 +11913,7 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1, v8-compile-cache@^2.3.0: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -12240,80 +12245,78 @@ webpack-bundle-analyzer@^4.4.2: sirv "^1.0.7" ws "^7.3.1" -webpack-cli@^3.3.12: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== +webpack-cli@^4.9.2: + version "4.9.2" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.9.2.tgz#77c1adaea020c3f9e2db8aad8ea78d235c83659d" + integrity sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ== dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.1.1" + "@webpack-cli/info" "^1.4.1" + "@webpack-cli/serve" "^1.6.1" + colorette "^2.0.14" + commander "^7.0.0" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" -webpack-dev-middleware@^3.7.2: - version "3.7.2" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz#0019c3db716e3fa5cecbf64f2ab88a74bab331f3" - integrity sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw== +webpack-dev-middleware@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.1.tgz#aa079a8dedd7e58bfeab358a9af7dab304cee57f" + integrity sha512-81EujCKkyles2wphtdrnPg/QqegC/AtqNH//mQkBYSMqwFVCQrxM6ktB2O/SPlZy7LqeEfTbV3cZARGQz6umhg== dependencies: - memory-fs "^0.4.1" - mime "^2.4.4" - mkdirp "^0.5.1" + colorette "^2.0.10" + memfs "^3.4.1" + mime-types "^2.1.31" range-parser "^1.2.1" - webpack-log "^2.0.0" + schema-utils "^4.0.0" -webpack-dev-server@^3.11.3: - version "3.11.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.3.tgz#8c86b9d2812bf135d3c9bce6f07b718e30f7c3d3" - integrity sha512-3x31rjbEQWKMNzacUZRE6wXvUFuGpH7vr0lIEbYpMAG9BOxi0928QU1BBswOAP3kg3H1O4hiS+sq4YyAn6ANnA== +webpack-dev-server@4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.7.4.tgz#d0ef7da78224578384e795ac228d8efb63d5f945" + integrity sha512-nfdsb02Zi2qzkNmgtZjkrMOcXnYZ6FLKcQwpxT7MvmHKc+oTtDsBju8j+NMyAygZ9GW1jMEUpy3itHtqgEhe1A== dependencies: - ansi-html-community "0.0.8" + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.2.2" + ansi-html-community "^0.0.8" bonjour "^3.5.0" - chokidar "^2.1.8" + chokidar "^3.5.3" + colorette "^2.0.10" compression "^1.7.4" connect-history-api-fallback "^1.6.0" - debug "^4.1.1" - del "^4.1.1" + default-gateway "^6.0.3" + del "^6.0.0" express "^4.17.1" - html-entities "^1.3.1" - http-proxy-middleware "0.19.1" - import-local "^2.0.0" - internal-ip "^4.3.0" - ip "^1.1.5" - is-absolute-url "^3.0.3" - killable "^1.0.1" - loglevel "^1.6.8" - opn "^5.5.0" - p-retry "^3.0.1" - portfinder "^1.0.26" - schema-utils "^1.0.0" - selfsigned "^1.10.8" - semver "^6.3.0" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.0" + ipaddr.js "^2.0.1" + open "^8.0.9" + p-retry "^4.5.0" + portfinder "^1.0.28" + schema-utils "^4.0.0" + selfsigned "^2.0.0" serve-index "^1.9.1" sockjs "^0.3.21" - sockjs-client "^1.5.0" spdy "^4.0.2" - strip-ansi "^3.0.1" - supports-color "^6.1.0" - url "^0.11.0" - webpack-dev-middleware "^3.7.2" - webpack-log "^2.0.0" - ws "^6.2.1" - yargs "^13.3.2" + strip-ansi "^7.0.0" + webpack-dev-middleware "^5.3.1" + ws "^8.4.2" -webpack-log@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" - integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== +webpack-merge@^5.7.3: + version "5.8.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61" + integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q== dependencies: - ansi-colors "^3.0.0" - uuid "^3.3.2" + clone-deep "^4.0.1" + wildcard "^2.0.0" webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack-sources@^1.4.3: version "1.4.3" @@ -12367,9 +12370,9 @@ websocket-driver@>=0.5.1, websocket-driver@^0.7.4: websocket-extensions ">=0.1.1" websocket-extensions@>=0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" - integrity sha1-domUmcGEtu91Q3fC27DNbLVdKec= + version "0.1.4" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== whatwg-encoding@^1.0.5: version "1.0.5" @@ -12405,7 +12408,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@^1.2.9, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -12426,6 +12429,11 @@ widest-line@^3.1.0: dependencies: string-width "^4.0.0" +wildcard@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec" + integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw== + word-wrap@^1.2.3, word-wrap@~1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" @@ -12446,15 +12454,6 @@ worker-loader@^2.0.0: loader-utils "^1.0.0" schema-utils "^0.4.0" -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" @@ -12499,12 +12498,10 @@ ws@8.2.3: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== -ws@^6.2.1: - version "6.2.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" - integrity sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA== - dependencies: - async-limiter "~1.0.0" +ws@^8.4.2: + version "8.5.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.5.0.tgz#bfb4be96600757fe5382de12c670dab984a1ed4f" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== xdg-basedir@^4.0.0: version "4.0.0" @@ -12614,14 +12611,6 @@ yaml@^2.0.0-10: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.0-10.tgz#d5b59e2d14b8683313a534f2bbc648e211a2753e" integrity sha512-FHV8s5ODFFQXX/enJEU2EkanNl1UDBUz8oa4k5Qo/sR+Iq7VmhCDkRMb0/mjJCNeAWQ31W8WV6PYStDE4d9EIw== -yargs-parser@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" - integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" @@ -12635,22 +12624,6 @@ yargs-parser@^20.2.3: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== -yargs@^13.3.2: - version "13.3.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" - integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.2" - yargs@^15.4.1: version "15.4.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"