From c48bbe6650648fa034696de25983418981e695eb Mon Sep 17 00:00:00 2001 From: GitLab Bot Date: Thu, 18 Aug 2022 15:12:17 +0000 Subject: [PATCH] Add latest changes from gitlab-org/gitlab@master --- .rubocop_todo/layout/hash_alignment.yml | 20 ---- .../issuable_client.js} | 27 +++-- app/assets/javascripts/issues/show/graphql.js | 2 +- .../notes/components/sidebar_subscription.vue | 2 +- .../sidebar_confidentiality_form.vue | 7 +- .../sidebar_confidentiality_widget.vue | 4 +- app/assets/javascripts/sidebar/graphql.js | 29 ----- .../javascripts/sidebar/mount_sidebar.js | 10 +- .../components/work_item_links/index.js | 7 +- .../work_item_links/work_item_links.vue | 32 +++--- app/assets/javascripts/work_items/index.js | 4 +- .../namespaces/traversal/linear_scopes.rb | 29 +---- .../issues/_work_item_links.html.haml | 2 +- .../development/traversal_ids_btree.yml | 8 -- doc/ci/pipeline_editor/index.md | 28 +++-- doc/ci/troubleshooting.md | 5 + doc/development/fe_guide/style/vue.md | 10 +- doc/development/fe_guide/tooling.md | 4 +- doc/development/fe_guide/view_component.md | 10 +- doc/development/fe_guide/vue.md | 16 ++- doc/development/fe_guide/vuex.md | 2 +- doc/development/fe_guide/widgets.md | 6 +- .../end_to_end/best_practices.md | 6 +- doc/operations/error_tracking.md | 5 +- doc/user/group/import/index.md | 1 + .../clusters/connect/new_civo_cluster.md | 8 +- .../infrastructure/iac/terraform_state.md | 2 +- .../infrastructure/iac/troubleshooting.md | 4 +- doc/user/project/import/github.md | 4 +- doc/user/project/integrations/servicenow.md | 2 +- lib/gitlab/abuse.rb | 6 +- lib/gitlab/access.rb | 20 ++-- lib/gitlab/application_rate_limiter.rb | 74 ++++++------ lib/gitlab/auth/ldap/config.rb | 14 +-- lib/gitlab/auth/o_auth/auth_hash.rb | 2 +- lib/gitlab/auth/o_auth/provider.rb | 14 +-- lib/gitlab/auth/o_auth/user.rb | 10 +- .../forti_authenticator/manual_otp.rb | 2 +- .../backfill_project_repositories.rb | 4 +- ...culate_vulnerabilities_occurrences_uuid.rb | 2 +- lib/gitlab/ci/ansi2html.rb | 10 +- lib/gitlab/ci/ansi2json/parser.rb | 10 +- lib/gitlab/ci/config/entry/processable.rb | 2 +- lib/gitlab/ci/jwt_v2.rb | 2 +- .../ci/pipeline/chain/validate/external.rb | 3 +- lib/gitlab/ci/reports/security/scanner.rb | 4 +- .../background_migration/health_status.rb | 2 +- lib/gitlab/database/reflection.rb | 2 +- lib/gitlab/diff/file_collection/compare.rb | 4 +- lib/gitlab/email/attachment_uploader.rb | 4 +- locale/gitlab.pot | 27 +++-- package.json | 8 +- qa/qa/specs/spec_helper.rb | 4 +- spec/fast_spec_helper.rb | 3 + .../sidebar_confidentiality_form_spec.js | 25 +--- .../sidebar_confidentiality_widget_spec.js | 5 +- .../components/work_item_assignees_spec.js | 2 +- .../components/work_item_labels_spec.js | 2 +- .../work_item_links/work_item_links_spec.js | 49 +++++--- .../work_items/pages/work_item_detail_spec.js | 2 +- spec/requests/api/settings_spec.rb | 14 ++- spec/spec_helper.rb | 5 +- .../snowplow_event_tracking_examples.rb | 2 +- .../graphql/n_plus_one_query_examples.rb | 2 +- .../cycle_analytics/deployment_metrics.rb | 2 +- .../diff_file_collections_shared_examples.rb | 4 +- .../namespaces/traversal_scope_examples.rb | 16 --- .../feature_flags/client_shared_examples.rb | 4 +- .../destroy_service_shared_examples.rb | 6 +- .../create_links_shared_examples.rb | 2 +- ...troyable_issuable_links_shared_examples.rb | 2 +- .../services/snippets_shared_examples.rb | 2 +- .../snowplow_tracking_shared_examples.rb | 2 +- yarn.lock | 107 ++++++++++-------- 74 files changed, 359 insertions(+), 425 deletions(-) rename app/assets/javascripts/{work_items/graphql/provider.js => graphql_shared/issuable_client.js} (65%) delete mode 100644 app/assets/javascripts/sidebar/graphql.js delete mode 100644 config/feature_flags/development/traversal_ids_btree.yml diff --git a/.rubocop_todo/layout/hash_alignment.yml b/.rubocop_todo/layout/hash_alignment.yml index 2a44a7a3798..ceb8dc32005 100644 --- a/.rubocop_todo/layout/hash_alignment.yml +++ b/.rubocop_todo/layout/hash_alignment.yml @@ -89,26 +89,6 @@ Layout/HashAlignment: - 'ee/spec/support/shared_examples/status_page/publish_shared_examples.rb' - 'ee/spec/support/shared_examples/status_page/reference_links_examples.rb' - 'ee/spec/workers/scan_security_report_secrets_worker_spec.rb' - - 'lib/gitlab/abuse.rb' - - 'lib/gitlab/access.rb' - - 'lib/gitlab/application_rate_limiter.rb' - - 'lib/gitlab/auth/ldap/config.rb' - - 'lib/gitlab/auth/o_auth/auth_hash.rb' - - 'lib/gitlab/auth/o_auth/provider.rb' - - 'lib/gitlab/auth/o_auth/user.rb' - - 'lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb' - - 'lib/gitlab/background_migration/backfill_project_repositories.rb' - - 'lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb' - - 'lib/gitlab/ci/ansi2html.rb' - - 'lib/gitlab/ci/ansi2json/parser.rb' - - 'lib/gitlab/ci/config/entry/processable.rb' - - 'lib/gitlab/ci/jwt_v2.rb' - - 'lib/gitlab/ci/pipeline/chain/validate/external.rb' - - 'lib/gitlab/ci/reports/security/scanner.rb' - - 'lib/gitlab/database/background_migration/health_status.rb' - - 'lib/gitlab/database/reflection.rb' - - 'lib/gitlab/diff/file_collection/compare.rb' - - 'lib/gitlab/email/attachment_uploader.rb' - 'lib/gitlab/emoji.rb' - 'lib/gitlab/etag_caching/middleware.rb' - 'lib/gitlab/experimentation.rb' diff --git a/app/assets/javascripts/work_items/graphql/provider.js b/app/assets/javascripts/graphql_shared/issuable_client.js similarity index 65% rename from app/assets/javascripts/work_items/graphql/provider.js rename to app/assets/javascripts/graphql_shared/issuable_client.js index b70c06fddea..991572958c3 100644 --- a/app/assets/javascripts/work_items/graphql/provider.js +++ b/app/assets/javascripts/graphql_shared/issuable_client.js @@ -1,10 +1,10 @@ import produce from 'immer'; -import Vue from 'vue'; import VueApollo from 'vue-apollo'; +import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql'; import createDefaultClient from '~/lib/graphql'; -import { WIDGET_TYPE_LABELS } from '../constants'; -import typeDefs from './typedefs.graphql'; -import workItemQuery from './work_item.query.graphql'; +import typeDefs from '~/work_items/graphql/typedefs.graphql'; +import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; +import { WIDGET_TYPE_LABELS } from '~/work_items/constants'; export const temporaryConfig = { typeDefs, @@ -42,6 +42,13 @@ export const temporaryConfig = { export const resolvers = { Mutation: { + updateIssueState: (_, { issueType = undefined, isDirty = false }, { cache }) => { + const sourceData = cache.readQuery({ query: getIssueStateQuery }); + const data = produce(sourceData, (draftData) => { + draftData.issueState = { issueType, isDirty }; + }); + cache.writeQuery({ query: getIssueStateQuery, data }); + }, localUpdateWorkItem(_, { input }, { cache }) { const sourceData = cache.readQuery({ query: workItemQuery, @@ -66,12 +73,8 @@ export const resolvers = { }, }; -export function createApolloProvider() { - Vue.use(VueApollo); +export const defaultClient = createDefaultClient(resolvers, temporaryConfig); - const defaultClient = createDefaultClient(resolvers, temporaryConfig); - - return new VueApollo({ - defaultClient, - }); -} +export const apolloProvider = new VueApollo({ + defaultClient, +}); diff --git a/app/assets/javascripts/issues/show/graphql.js b/app/assets/javascripts/issues/show/graphql.js index 5b8630f7d63..deee034f9d1 100644 --- a/app/assets/javascripts/issues/show/graphql.js +++ b/app/assets/javascripts/issues/show/graphql.js @@ -1,6 +1,6 @@ import Vue from 'vue'; import VueApollo from 'vue-apollo'; -import { defaultClient } from '~/sidebar/graphql'; +import { defaultClient } from '~/graphql_shared/issuable_client'; Vue.use(VueApollo); diff --git a/app/assets/javascripts/notes/components/sidebar_subscription.vue b/app/assets/javascripts/notes/components/sidebar_subscription.vue index 52dadc7b4c3..9fc11ff65d5 100644 --- a/app/assets/javascripts/notes/components/sidebar_subscription.vue +++ b/app/assets/javascripts/notes/components/sidebar_subscription.vue @@ -3,7 +3,7 @@ import { mapActions } from 'vuex'; import { IssuableType } from '~/issues/constants'; import { fetchPolicies } from '~/lib/graphql'; import { confidentialityQueries } from '~/sidebar/constants'; -import { defaultClient as gqlClient } from '~/sidebar/graphql'; +import { defaultClient as gqlClient } from '~/graphql_shared/issuable_client'; export default { props: { diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue index 336c291d4f1..c44ce8b0057 100644 --- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue +++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_form.vue @@ -88,10 +88,7 @@ export default { .then( ({ data: { - issuableSetConfidential: { - issuable: { confidential }, - errors, - }, + issuableSetConfidential: { errors }, }, }) => { if (errors.length) { @@ -99,7 +96,7 @@ export default { message: errors[0], }); } else { - this.$emit('closeForm', { confidential }); + this.$emit('closeForm'); } }, ) diff --git a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue index eec083f23f3..f234c5ea3c9 100644 --- a/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue +++ b/app/assets/javascripts/sidebar/components/confidential/sidebar_confidentiality_widget.vue @@ -95,10 +95,10 @@ export default { confidentialWidget.setConfidentiality = null; }, methods: { - closeForm({ confidential } = {}) { + closeForm() { this.$refs.editable.collapse(); this.$el.dispatchEvent(hideDropdownEvent); - this.$emit('closeForm', { confidential }); + this.$emit('closeForm'); }, // synchronizing the quick action with the sidebar widget // this is a temporary solution until we have confidentiality real-time updates diff --git a/app/assets/javascripts/sidebar/graphql.js b/app/assets/javascripts/sidebar/graphql.js deleted file mode 100644 index 127e3a3c610..00000000000 --- a/app/assets/javascripts/sidebar/graphql.js +++ /dev/null @@ -1,29 +0,0 @@ -import produce from 'immer'; -import VueApollo from 'vue-apollo'; -import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql'; -import createDefaultClient from '~/lib/graphql'; -import { temporaryConfig, resolvers as workItemResolvers } from '~/work_items/graphql/provider'; - -const resolvers = { - Mutation: { - updateIssueState: (_, { issueType = undefined, isDirty = false }, { cache }) => { - const sourceData = cache.readQuery({ query: getIssueStateQuery }); - const data = produce(sourceData, (draftData) => { - draftData.issueState = { issueType, isDirty }; - }); - cache.writeQuery({ query: getIssueStateQuery, data }); - }, - ...workItemResolvers.Mutation, - }, -}; - -export const defaultClient = createDefaultClient( - resolvers, - // should be removed with the rollout of work item assignees FF - // https://gitlab.com/gitlab-org/gitlab/-/issues/363030 - temporaryConfig, -); - -export const apolloProvider = new VueApollo({ - defaultClient, -}); diff --git a/app/assets/javascripts/sidebar/mount_sidebar.js b/app/assets/javascripts/sidebar/mount_sidebar.js index fec4d0e346d..62032359d95 100644 --- a/app/assets/javascripts/sidebar/mount_sidebar.js +++ b/app/assets/javascripts/sidebar/mount_sidebar.js @@ -22,7 +22,7 @@ import SidebarParticipantsWidget from '~/sidebar/components/participants/sidebar import SidebarReferenceWidget from '~/sidebar/components/reference/sidebar_reference_widget.vue'; import SidebarDropdownWidget from '~/sidebar/components/sidebar_dropdown_widget.vue'; import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_widget.vue'; -import { apolloProvider } from '~/sidebar/graphql'; +import { apolloProvider } from '~/graphql_shared/issuable_client'; import trackShowInviteMemberLink from '~/sidebar/track_invite_members'; import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_vue/constants'; import LabelsSelectWidget from '~/vue_shared/components/sidebar/labels_select_widget/labels_select_root.vue'; @@ -39,7 +39,6 @@ import SidebarTimeTracking from './components/time_tracking/sidebar_time_trackin import { IssuableAttributeType } from './constants'; import SidebarMoveIssue from './lib/sidebar_move_issue'; import CrmContacts from './components/crm_contacts/crm_contacts.vue'; -import SidebarEventHub from './event_hub'; Vue.use(Translate); Vue.use(VueApollo); @@ -360,13 +359,6 @@ function mountConfidentialComponent() { ? IssuableType.Issue : IssuableType.MergeRequest, }, - on: { - closeForm({ confidential }) { - if (confidential !== undefined) { - SidebarEventHub.$emit('confidentialityUpdated', confidential); - } - }, - }, }), }); } diff --git a/app/assets/javascripts/work_items/components/work_item_links/index.js b/app/assets/javascripts/work_items/components/work_item_links/index.js index 86f03583ea3..4ac547f28f4 100644 --- a/app/assets/javascripts/work_items/components/work_item_links/index.js +++ b/app/assets/javascripts/work_items/components/work_item_links/index.js @@ -1,6 +1,6 @@ import Vue from 'vue'; import { GlToast } from '@gitlab/ui'; -import { createApolloProvider } from '../../graphql/provider'; +import { apolloProvider } from '~/graphql_shared/issuable_client'; import WorkItemLinks from './work_item_links.vue'; Vue.use(GlToast); @@ -16,18 +16,19 @@ export default function initWorkItemLinks() { return; } - const { projectPath, wiHasIssueWeightsFeature } = workItemLinksRoot.dataset; + const { projectPath, wiHasIssueWeightsFeature, iid } = workItemLinksRoot.dataset; // eslint-disable-next-line no-new new Vue({ el: workItemLinksRoot, name: 'WorkItemLinksRoot', - apolloProvider: createApolloProvider(), + apolloProvider, components: { workItemLinks: WorkItemLinks, }, provide: { projectPath, + iid, fullPath: projectPath, hasIssueWeightsFeature: wiHasIssueWeightsFeature, }, diff --git a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue index 534ebabee08..0d3bebc11e3 100644 --- a/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue +++ b/app/assets/javascripts/work_items/components/work_item_links/work_item_links.vue @@ -5,9 +5,9 @@ import { s__ } from '~/locale'; import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils'; import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; import { TYPE_WORK_ITEM } from '~/graphql_shared/constants'; +import issueConfidentialQuery from '~/sidebar/queries/issue_confidential.query.graphql'; import { isMetaKey } from '~/lib/utils/common_utils'; import { setUrlParams, updateHistory } from '~/lib/utils/url_utility'; -import SidebarEventHub from '~/sidebar/event_hub'; import { STATE_OPEN, @@ -35,7 +35,7 @@ export default { directives: { GlTooltip: GlTooltipDirective, }, - inject: ['projectPath'], + inject: ['projectPath', 'iid'], props: { workItemId: { type: String, @@ -63,6 +63,18 @@ export default { this.error = e.message || this.$options.i18n.fetchError; }, }, + parentIssue: { + query: issueConfidentialQuery, + variables() { + return { + fullPath: this.projectPath, + iid: String(this.iid), + }; + }, + update(data) { + return data.workspace?.issuable; + }, + }, }, data() { return { @@ -72,9 +84,13 @@ export default { activeToast: null, prefetchedWorkItem: null, error: undefined, + parentIssue: null, }; }, computed: { + confidential() { + return this.parentIssue?.confidential || this.workItem?.confidential || false; + }, children() { return ( this.workItem?.widgets.find((widget) => widget.type === WIDGET_TYPE_HIERARCHY)?.children @@ -84,9 +100,6 @@ export default { canUpdate() { return this.workItem?.userPermissions.updateWorkItem || false; }, - confidential() { - return this.workItem?.confidential || false; - }, // Only used for children for now but should be extended later to support parents and siblings isChildrenEmpty() { return this.children?.length === 0; @@ -112,16 +125,7 @@ export default { return this.isLoading && this.children.length === 0 ? '...' : this.children.length; }, }, - mounted() { - SidebarEventHub.$on('confidentialityUpdated', this.refetchWorkItems); - }, - destroyed() { - SidebarEventHub.$off('confidentialityUpdated', this.refetchWorkItems); - }, methods: { - refetchWorkItems() { - this.$apollo.queries.workItem.refetch(); - }, iconClass(state) { return state === STATE_OPEN ? 'gl-text-green-500' : 'gl-text-blue-500'; }, diff --git a/app/assets/javascripts/work_items/index.js b/app/assets/javascripts/work_items/index.js index 6437df597b4..bb4c7052238 100644 --- a/app/assets/javascripts/work_items/index.js +++ b/app/assets/javascripts/work_items/index.js @@ -1,8 +1,8 @@ import Vue from 'vue'; import { parseBoolean } from '~/lib/utils/common_utils'; +import { apolloProvider } from '~/graphql_shared/issuable_client'; import App from './components/app.vue'; import { createRouter } from './router'; -import { createApolloProvider } from './graphql/provider'; export const initWorkItemsRoot = () => { const el = document.querySelector('#js-work-items'); @@ -12,7 +12,7 @@ export const initWorkItemsRoot = () => { el, name: 'WorkItemsRoot', router: createRouter(el.dataset.fullPath), - apolloProvider: createApolloProvider(), + apolloProvider, provide: { fullPath, hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature), diff --git a/app/models/namespaces/traversal/linear_scopes.rb b/app/models/namespaces/traversal/linear_scopes.rb index 81ac026d7ff..843de9bce33 100644 --- a/app/models/namespaces/traversal/linear_scopes.rb +++ b/app/models/namespaces/traversal/linear_scopes.rb @@ -41,24 +41,13 @@ module Namespaces def self_and_descendants(include_self: true) return super unless use_traversal_ids_for_descendants_scopes? - if Feature.enabled?(:traversal_ids_btree) - self_and_descendants_with_comparison_operators(include_self: include_self) - else - records = self_and_descendants_with_duplicates_with_array_operator(include_self: include_self) - distinct = records.select('DISTINCT on(namespaces.id) namespaces.*') - distinct.normal_select - end + self_and_descendants_with_comparison_operators(include_self: include_self) end def self_and_descendant_ids(include_self: true) return super unless use_traversal_ids_for_descendants_scopes? - if Feature.enabled?(:traversal_ids_btree) - self_and_descendants_with_comparison_operators(include_self: include_self).as_ids - else - self_and_descendants_with_duplicates_with_array_operator(include_self: include_self) - .select('DISTINCT namespaces.id') - end + self_and_descendants(include_self: include_self).as_ids end def self_and_hierarchy @@ -181,20 +170,6 @@ module Namespaces Arel::Nodes::NamedFunction.new('unnest', args) end - def self_and_descendants_with_duplicates_with_array_operator(include_self: true) - base_ids = select(:id) - - records = unscoped - .from("namespaces, (#{base_ids.to_sql}) base") - .where('namespaces.traversal_ids @> ARRAY[base.id]') - - if include_self - records - else - records.where('namespaces.id <> base.id') - end - end - def superset_cte(base_name) superset_sql = <<~SQL SELECT d1.traversal_ids diff --git a/app/views/projects/issues/_work_item_links.html.haml b/app/views/projects/issues/_work_item_links.html.haml index df2ffdd30ee..bc2136b89fb 100644 --- a/app/views/projects/issues/_work_item_links.html.haml +++ b/app/views/projects/issues/_work_item_links.html.haml @@ -1,2 +1,2 @@ - if Feature.enabled?(:work_items_hierarchy, @project) - .js-work-item-links-root{ data: { issuable_id: @issue.id, project_path: @project.full_path, wi: work_items_index_data(@project) } } + .js-work-item-links-root{ data: { issuable_id: @issue.id, iid: @issue.iid, project_path: @project.full_path, wi: work_items_index_data(@project) } } diff --git a/config/feature_flags/development/traversal_ids_btree.yml b/config/feature_flags/development/traversal_ids_btree.yml deleted file mode 100644 index aaecafe04ae..00000000000 --- a/config/feature_flags/development/traversal_ids_btree.yml +++ /dev/null @@ -1,8 +0,0 @@ ---- -name: traversal_ids_btree -introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/69535 -rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/342871 -milestone: '14.5' -type: development -group: group::access -default_enabled: false diff --git a/doc/ci/pipeline_editor/index.md b/doc/ci/pipeline_editor/index.md index 0fd8fac7741..87c2b3f1c71 100644 --- a/doc/ci/pipeline_editor/index.md +++ b/doc/ci/pipeline_editor/index.md @@ -160,15 +160,23 @@ checkbox appears. Select it to start a new merge request after you commit the ch ### `Configuration validation currently not available` message -This message is due to a problem with the syntax validation in the pipeline editor. -If GitLab is unable to communicate with the service that validates the syntax, the -information in these sections may not display properly: +This message is caused by a problem validating the syntax in the pipeline editor. +It can happen when: -- The syntax status on the **Edit** tab (valid or invalid). -- The **Visualize** tab. -- The **Lint** tab. -- The **View merged YAML** tab. +- GitLab is unable to communicate with the service that validates the syntax, so the + information in these sections may not display properly: -You can still work on your CI/CD configuration and commit the changes you made without -any issues. As soon as the service becomes available again, the syntax validation -should display immediately. + - The syntax status on the **Edit** tab (valid or invalid). + - The **Visualize** tab. + - The **Lint** tab. + - The **View merged YAML** tab. + + You can still work on your CI/CD configuration and commit the changes you made without + any issues. As soon as the service becomes available again, the syntax validation + should display immediately. + +- Using [`include`](../yaml/index.md#include), but the included configuration files create a loop. + For example, `.gitlab-ci.yml` includes `file1.yml`, which includes `file2.yml`, + which includes `file1.yml`, creating a loop between `file1.yml` and `file2.yml`. + + Remove one of the `include` lines to eliminate the loop and resolve the issue. diff --git a/doc/ci/troubleshooting.md b/doc/ci/troubleshooting.md index 0230aaf7113..287594902b2 100644 --- a/doc/ci/troubleshooting.md +++ b/doc/ci/troubleshooting.md @@ -321,6 +321,11 @@ To reduce the configuration size, you can: On a self-managed instance, you can [increase the size limits](../administration/instance_limits.md#maximum-size-and-depth-of-cicd-configuration-yaml-files). +### Error 500 when editing the `.gitlab-ci.yml` file + +A [loop of included configuration files](pipeline_editor/index.md#configuration-validation-currently-not-available-message) +can cause a `500` error when editing the `.gitlab-ci.yml` file with the [web editor](../user/project/repository/web_editor.md). + ## Pipeline warnings Pipeline configuration warnings are shown when you: diff --git a/doc/development/fe_guide/style/vue.md b/doc/development/fe_guide/style/vue.md index c9bd0e1b35a..e960f10dd96 100644 --- a/doc/development/fe_guide/style/vue.md +++ b/doc/development/fe_guide/style/vue.md @@ -431,7 +431,7 @@ must be unique. It's advised to use `kebab-case` namespaces. Useful links: -1. [`key`](https://vuejs.org/v2/guide/list.html#key) +1. [Maintaining State](https://v2.vuejs.org/v2/guide/list.html#Maintaining-State) 1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential) ## Vue testing @@ -448,10 +448,8 @@ Typically, when testing a Vue component, the component should be "re-mounted" in To achieve this: 1. Create a mutable `wrapper` variable inside the top-level `describe` block. -1. Mount the component using [`mount`](https://v1.test-utils.vuejs.org/api/#mount)/ -[`shallowMount`](https://v1.test-utils.vuejs.org/api/#shallowMount). -1. Reassign the resulting [`Wrapper`](https://v1.test-utils.vuejs.org/api/wrapper/#wrapper) -instance to our `wrapper` variable. +1. Mount the component using [`mount`](https://v1.test-utils.vuejs.org/api/#mount) or [`shallowMount`](https://v1.test-utils.vuejs.org/api/#shallowMount). +1. Reassign the resulting [`Wrapper`](https://v1.test-utils.vuejs.org/api/wrapper/#wrapper) instance to our `wrapper` variable. Creating a global, mutable wrapper provides a number of advantages, including the ability to: @@ -671,6 +669,6 @@ In the coming months you should fix that tech debt, with its priority to be dete not be rewritten. For example, jQuery tests rewritten to Vue tests. 1. You may choose to use VueX as a centralized state management. If you choose not to use VueX, you must use the *store pattern* which can be found in the -[Vue.js documentation](https://vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch). +[Vue.js documentation](https://v2.vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch). 1. Once you have chosen a centralized state-management solution you must use it for your entire application. Don't mix and match your state-management solutions. diff --git a/doc/development/fe_guide/tooling.md b/doc/development/fe_guide/tooling.md index 2bb6cbfaf7a..4b55580c33c 100644 --- a/doc/development/fe_guide/tooling.md +++ b/doc/development/fe_guide/tooling.md @@ -63,8 +63,8 @@ disabled due to legacy compatibility reasons but they are in the process of bein Do not disable specific ESLint rules. To avoid introducing technical debt, you may disable the following rules only if you are invoking/instantiating existing code modules. -- [`no-new`](https://eslint.org/docs/rules/no-new) -- [`class-method-use-this`](https://eslint.org/docs/rules/class-methods-use-this) +- [`no-new`](https://eslint.org/docs/latest/rules/no-new) +- [`class-method-use-this`](https://eslint.org/docs/latest/rules/class-methods-use-this) Disable these rules on a per-line basis. This makes it easier to refactor in the future. For example, use `eslint-disable-next-line` or `eslint-disable-line`. diff --git a/doc/development/fe_guide/view_component.md b/doc/development/fe_guide/view_component.md index 2e373e6933b..cb76f9a0d7a 100644 --- a/doc/development/fe_guide/view_component.md +++ b/doc/development/fe_guide/view_component.md @@ -33,7 +33,7 @@ Consider this list a best effort. The full list can be found in [`app/components #### Alert -The `Pajamas::AlertComponent` follows the [Pajamas Alert](https://design.gitlab.com/components/alert) specification. +The `Pajamas::AlertComponent` follows the [Pajamas Alert](https://design.gitlab.com/components/alert/) specification. **Examples:** @@ -57,7 +57,7 @@ For the full list of options, see its #### Banner -The `Pajamas::BannerComponent` follows the [Pajamas Banner](https://design.gitlab.com/components/banner) specification. +The `Pajamas::BannerComponent` follows the [Pajamas Banner](https://design.gitlab.com/components/banner/) specification. **Examples:** @@ -88,7 +88,7 @@ For the full list of options, see its #### Button -The `Pajamas::ButtonComponent` follows the [Pajamas Button](https://design.gitlab.com/components/button) specification. +The `Pajamas::ButtonComponent` follows the [Pajamas Button](https://design.gitlab.com/components/button/) specification. **Examples:** @@ -125,7 +125,7 @@ For the full list of options, see its #### Card -The `Pajamas::CardComponent` follows the [Pajamas Card](https://design.gitlab.com/components/card) specification. +The `Pajamas::CardComponent` follows the [Pajamas Card](https://design.gitlab.com/components/card/) specification. **Examples:** @@ -188,7 +188,7 @@ For the full list of options, see its #### Toggle -The `Pajamas::ToggleComponent` follows the [Pajamas Toggle](https://design.gitlab.com/components/toggle) specification. +The `Pajamas::ToggleComponent` follows the [Pajamas Toggle](https://design.gitlab.com/components/toggle/) specification. ```haml = render Pajamas::ToggleComponent.new(classes: 'js-force-push-toggle', diff --git a/doc/development/fe_guide/vue.md b/doc/development/fe_guide/vue.md index 27660c0f5f7..5cb461c8ca0 100644 --- a/doc/development/fe_guide/vue.md +++ b/doc/development/fe_guide/vue.md @@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w # Vue -To get started with Vue, read through [their documentation](https://vuejs.org/v2/guide/). +To get started with Vue, read through [their documentation](https://v2.vuejs.org/v2/guide/index.html). ## Examples @@ -23,8 +23,8 @@ The main goal we are trying to achieve is to have only one data flow, and only o To achieve this goal we use [Vuex](#vuex). You can also read about this architecture in Vue documentation about -[state management](https://vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch) -and about [one way data flow](https://vuejs.org/v2/guide/components.html#One-Way-Data-Flow). +[state management](https://v2.vuejs.org/v2/guide/state-management.html#Simple-State-Management-from-Scratch) +and about [one way data flow](https://v2.vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow). ### Components and Store @@ -322,7 +322,7 @@ For example, tables are used in a quite amount of places across GitLab, a table would be a good fit for a component. On the other hand, a table cell used only in one table would not be a good use of this pattern. -You can read more about components in Vue.js site, [Component System](https://vuejs.org/v2/guide/#Composing-with-Components). +You can read more about components in Vue.js site, [Component System](https://v2.vuejs.org/v2/guide/#Composing-with-Components). ### A folder for the Store @@ -348,8 +348,7 @@ recommended to observe objects with their own stateful behavior. Based on the Vue guidance: -- **Do not** use or create a JavaScript class in your [data function](https://v2.vuejs.org/v2/api/#data), -such as `user: new User()`. +- **Do not** use or create a JavaScript class in your [data function](https://v2.vuejs.org/v2/api/#data). - **Do not** add new JavaScript class implementations. - **Do** use [GraphQL](../api_graphql_styleguide.md), [Vuex](vuex.md) or a set of components if cannot use primitives or objects. @@ -531,8 +530,7 @@ Each Vue component has a unique output. This output is always present in the ren Although each method of a Vue component can be tested individually, our goal is to test the output of the render function, which represents the state at all times. -Visit the [Vue testing guide](https://v2.vuejs.org/v2/guide/testing.html#Unit-Testing) for help -testing the rendered output. +Visit the [Vue testing guide](https://v2.vuejs.org/v2/guide/testing.html#Unit-Testing) for help. Here's an example of a well structured unit test for [this Vue component](#appendix---vue-component-subject-under-test): @@ -671,7 +669,7 @@ it('should fire the click event', () => { }) ``` -When firing a Vue event, use [`emit`](https://vuejs.org/v2/guide/components-custom-events.html). +When firing a Vue event, use [`emit`](https://v2.vuejs.org/v2/guide/components-custom-events.html). ```javascript wrapper = shallowMount(DropdownItem); diff --git a/doc/development/fe_guide/vuex.md b/doc/development/fe_guide/vuex.md index 8bfb912161a..14190d3fb5d 100644 --- a/doc/development/fe_guide/vuex.md +++ b/doc/development/fe_guide/vuex.md @@ -245,7 +245,7 @@ A mutation written like this is easier to maintain. In addition, we avoid errors ### `getters.js` Sometimes we may need to get derived state based on store state, like filtering for a specific prop. -Using a getter also caches the result based on dependencies due to [how computed props work](https://vuejs.org/v2/guide/computed.html#Computed-Caching-vs-Methods) +Using a getter also caches the result based on dependencies due to [how computed props work](https://v2.vuejs.org/v2/guide/computed.html#Computed-Caching-vs-Methods) This can be done through the `getters`: ```javascript diff --git a/doc/development/fe_guide/widgets.md b/doc/development/fe_guide/widgets.md index b54f9add97d..c6bb89d1fe8 100644 --- a/doc/development/fe_guide/widgets.md +++ b/doc/development/fe_guide/widgets.md @@ -18,11 +18,11 @@ When building a widget, we should follow a few principles described below. All widgets should use the same stack (Vue + Apollo Client). To make it happen, we must add Vue Apollo to the application root (if we use a widget as a component) or provide it directly to a widget. For sidebar widgets, use the -[sidebar Apollo Client and Apollo Provider](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/sidebar/graphql.js): +[issuable Apollo Client and Apollo Provider](https://gitlab.com/gitlab-org/gitlab/-/blob/master/app/assets/javascripts/graphql_shared/issuable_client.js): ```javascript import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue'; -import { apolloProvider } from '~/sidebar/graphql'; +import { apolloProvider } from '~/graphql_shared/issuable_client'; function mountConfidentialComponent() { new Vue({ @@ -118,7 +118,7 @@ In this case, we can use a renderless component that imports a client and listen ```javascript import { fetchPolicies } from '~/lib/graphql'; import { confidentialityQueries } from '~/sidebar/constants'; -import { defaultClient as gqlClient } from '~/sidebar/graphql'; +import { defaultClient as gqlClient } from '~/graphql_shared/issuable_client'; created() { if (this.issuableType !== IssuableType.Issue) { diff --git a/doc/development/testing_guide/end_to_end/best_practices.md b/doc/development/testing_guide/end_to_end/best_practices.md index bfda94b1f1d..b17ca9e6f8f 100644 --- a/doc/development/testing_guide/end_to_end/best_practices.md +++ b/doc/development/testing_guide/end_to_end/best_practices.md @@ -62,13 +62,13 @@ In those and similar cases we need to include the test case link by other means. To illustrate, there are two tests in the shared examples in [`qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/qa/qa/specs/features/ee/browser_ui/3_create/repository/restrict_push_protected_branch_spec.rb): ```ruby -shared_examples 'unselected maintainer' do |testcase| +RSpec.shared_examples 'unselected maintainer' do |testcase| it 'user fails to push', testcase: testcase do ... end end -shared_examples 'selected developer' do |testcase| +RSpec.shared_examples 'selected developer' do |testcase| it 'user pushes and merges', testcase: testcase do ... end @@ -415,7 +415,7 @@ except(page).to have_no_text('hidden') Unfortunately, that's not automatically the case for the predicate methods that we add to our [page objects](page_objects.md). We need to [create our own negatable matchers](https://relishapp.com/rspec/rspec-expectations/v/3-9/docs/custom-matchers/define-a-custom-matcher#matcher-with-separate-logic-for-expect().to-and-expect().not-to). -The initial example uses the `have_job` matcher which is derived from the +The initial example uses the `have_job` matcher which is derived from the [`has_job?` predicate method of the `Page::Project::Pipeline::Show` page object](https://gitlab.com/gitlab-org/gitlab/-/blob/87864b3047c23b4308f59c27a3757045944af447/qa/qa/page/project/pipeline/show.rb#L53). To create a negatable matcher, we use `has_no_job?` for the negative case: diff --git a/doc/operations/error_tracking.md b/doc/operations/error_tracking.md index 08acf77b6c7..a42aa3c19b0 100644 --- a/doc/operations/error_tracking.md +++ b/doc/operations/error_tracking.md @@ -136,10 +136,7 @@ FLAG: By default this feature is not available. To make it available on self-managed GitLab, ask an administrator to [enable the feature flag](../administration/feature_flags.md) named `integrated_error_tracking`. The feature is not ready for production use. -On GitLab.com, this feature is not available. - -WARNING: -Turning on integrated error tracking may impact performance, depending on your error rates. +On GitLab.com, please follow [our user guide](https://gitlab.com/gitlab-org/opstrace/opstrace/-/blob/main/docs/guides/user/error_tracking.md) to get started. Integrated error tracking is a lightweight alternative to Sentry backend. You still use Sentry SDK with your application. But you don't need to deploy Sentry diff --git a/doc/user/group/import/index.md b/doc/user/group/import/index.md index edf4d7677df..18a88f3aff8 100644 --- a/doc/user/group/import/index.md +++ b/doc/user/group/import/index.md @@ -120,6 +120,7 @@ On self-managed GitLab, migrating project resources are not available by default - LFS Objects ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339405) in GitLab 14.8) - Members ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/341886) in GitLab 14.8) - Merge Requests ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339403) in GitLab 14.5) + - Multiple merge request assignees ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339520) in GitLab 15.3) - Migrate Push Rules ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339403) in GitLab 14.6) - Pull Requests (including external pull requests) ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339409) in GitLab 14.5) - Pipeline History ([Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/339412) in GitLab 14.6) diff --git a/doc/user/infrastructure/clusters/connect/new_civo_cluster.md b/doc/user/infrastructure/clusters/connect/new_civo_cluster.md index ecf93958b1e..f2cf0193bd8 100644 --- a/doc/user/infrastructure/clusters/connect/new_civo_cluster.md +++ b/doc/user/infrastructure/clusters/connect/new_civo_cluster.md @@ -6,7 +6,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w # Create a Civo Kubernetes cluster -Every new Civo account receives [$250 in credit](https://civo.com/signup) to get started with the GitLab integration with Civo Kubernetes. You can also use a marketplace app to install GitLab on your Civo Kubernetes cluster. +Every new Civo account receives [$250 in credit](https://dashboard.civo.com/signup) to get started with the GitLab integration with Civo Kubernetes. You can also use a marketplace app to install GitLab on your Civo Kubernetes cluster. Learn how to create a new cluster on Civo Kubernetes through [Infrastructure as Code (IaC)](../../index.md). This process uses the Civo @@ -15,7 +15,7 @@ by using the GitLab agent for Kubernetes. **Prerequisites:** -- A [Civo account](https://civo.com/signup). +- A [Civo account](https://dashboard.civo.com/signup). - [A runner](https://docs.gitlab.com/runner/install/) you can use to run the GitLab CI/CD pipeline. **Steps:** @@ -64,7 +64,7 @@ Use CI/CD environment variables to configure your project. 1. On the left sidebar, select **Settings > CI/CD**. 1. Expand **Variables**. -1. Set the variable `BASE64_CIVO_TOKEN` to the [token](https://www.civo.com/account/security) from your Civo account. +1. Set the variable `BASE64_CIVO_TOKEN` to the token from your Civo account. 1. Set the variable `TF_VAR_agent_token` to the agent token you received in the previous task. 1. Set the variable `TF_VAR_kas_address` to the agent server address in the previous task. @@ -95,7 +95,7 @@ After configuring your project, manually trigger the provisioning of your cluste When the pipeline finishes successfully, you can see your new cluster: -- In Civo dashboard: on your [Kubernetes tab](https://www.civo.com/account/kubernetes). +- In Civo dashboard: on your Kubernetes tab. - In GitLab: from your project's sidebar, select **Infrastructure > Kubernetes clusters**. ## Use your cluster diff --git a/doc/user/infrastructure/iac/terraform_state.md b/doc/user/infrastructure/iac/terraform_state.md index 4e78e0bbed5..e24c66302c5 100644 --- a/doc/user/infrastructure/iac/terraform_state.md +++ b/doc/user/infrastructure/iac/terraform_state.md @@ -9,7 +9,7 @@ info: To determine the technical writer assigned to the Stage/Group associated w > [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2673) in GitLab 13.0. Terraform uses state files to store details about your infrastructure configuration. -With Terraform remote [backends](https://www.terraform.io/language/settings/backends), +With Terraform remote [backends](https://www.terraform.io/language/settings/backends/configuration), you can store the state file in a remote and shared store. GitLab provides a [Terraform HTTP backend](https://www.terraform.io/language/settings/backends/http) diff --git a/doc/user/infrastructure/iac/troubleshooting.md b/doc/user/infrastructure/iac/troubleshooting.md index e187fe54136..8a7ce3af83a 100644 --- a/doc/user/infrastructure/iac/troubleshooting.md +++ b/doc/user/infrastructure/iac/troubleshooting.md @@ -97,9 +97,7 @@ As a result, to create a plan and later use the same plan in another CI job, you `Error: Error acquiring the state lock` errors when using `-backend-config=password=$CI_JOB_TOKEN`. This happens because the value of `$CI_JOB_TOKEN` is only valid for the duration of the current job. -Another possible error message for the same problem could be: `Error: Error loading state: HTTP remote state endpoint requires auth`. - -As a workaround, use [http backend configuration variables](https://www.terraform.io/docs/language/settings/backends/http.html#configuration-variables) in your CI job, +As a workaround, use [http backend configuration variables](https://www.terraform.io/language/settings/backends/http#configuration-variables) in your CI job, which is what happens behind the scenes when following the [Get started using GitLab CI](terraform_state.md#initialize-a-terraform-state-as-a-backend-by-using-gitlab-cicd) instructions. diff --git a/doc/user/project/import/github.md b/doc/user/project/import/github.md index a3dfa3edff0..a4de3da0775 100644 --- a/doc/user/project/import/github.md +++ b/doc/user/project/import/github.md @@ -62,7 +62,7 @@ For this association to succeed, each GitHub author and assignee in the reposito must meet one of the following conditions prior to the import: - Have previously logged in to a GitLab account using the GitHub icon. -- Have a GitHub account with a [public-facing email address](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-github-user-account/managing-email-preferences/setting-your-commit-email-address) +- Have a GitHub account with a [public-facing email address](https://docs.github.com/en/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address) that matches their GitLab account's email address. GitLab content imports that use GitHub accounts require that the GitHub public-facing email address is populated. This means @@ -76,7 +76,7 @@ field to be populated so you may have to add it on existing accounts. Before you begin, ensure that any GitHub users who you want to map to GitLab users have either: - A GitLab account that has logged in using the GitHub icon. -- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/rest/reference/users#get-a-user) in the profile of the GitHub user +- A GitLab account with an email address that matches the [publicly visible email address](https://docs.github.com/en/rest/users#get-a-user) in the profile of the GitHub user If you are importing to GitLab.com, you can alternatively import GitHub repositories using a [personal access token](#use-a-github-token). We do not recommend this method, as it does not associate all user activity (such as issues and pull requests) with matching GitLab users. diff --git a/doc/user/project/integrations/servicenow.md b/doc/user/project/integrations/servicenow.md index fdcbb498621..dc6c2da0d91 100644 --- a/doc/user/project/integrations/servicenow.md +++ b/doc/user/project/integrations/servicenow.md @@ -15,7 +15,7 @@ With the GitLab spoke in ServiceNow, you can automate actions for GitLab projects, groups, users, issues, merge requests, branches, and repositories. For a full list of features, see the -[GitLab spoke documentation](https://docs.servicenow.com/bundle/orlando-servicenow-platform/page/administer/integrationhub-store-spokes/concept/gitlab-spoke.html). +[GitLab spoke documentation](https://docs.servicenow.com/bundle/sandiego-application-development/page/administer/integrationhub-store-spokes/concept/gitlab-spoke.html). You must [configure GitLab as an OAuth2 authentication service provider](../../../integration/oauth_provider.md), which involves creating an application and then providing the Application ID diff --git a/lib/gitlab/abuse.rb b/lib/gitlab/abuse.rb index cc95d3c1e0c..7db99d4b037 100644 --- a/lib/gitlab/abuse.rb +++ b/lib/gitlab/abuse.rb @@ -3,10 +3,10 @@ module Gitlab module Abuse CONFIDENCE_LEVELS = { - certain: 1.0, - likely: 0.8, + certain: 1.0, + likely: 0.8, uncertain: 0.5, - unknown: 0.0 + unknown: 0.0 }.freeze class << self diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb index 3e09d488bc3..fa025a2658f 100644 --- a/lib/gitlab/access.rb +++ b/lib/gitlab/access.rb @@ -41,9 +41,9 @@ module Gitlab def options { - "Guest" => GUEST, - "Reporter" => REPORTER, - "Developer" => DEVELOPER, + "Guest" => GUEST, + "Reporter" => REPORTER, + "Developer" => DEVELOPER, "Maintainer" => MAINTAINER } end @@ -62,9 +62,9 @@ module Gitlab def sym_options { - guest: GUEST, - reporter: REPORTER, - developer: DEVELOPER, + guest: GUEST, + reporter: REPORTER, + developer: DEVELOPER, maintainer: MAINTAINER } end @@ -120,9 +120,9 @@ module Gitlab def project_creation_string_options { - 'noone' => NO_ONE_PROJECT_ACCESS, - 'maintainer' => MAINTAINER_PROJECT_ACCESS, - 'developer' => DEVELOPER_MAINTAINER_PROJECT_ACCESS + 'noone' => NO_ONE_PROJECT_ACCESS, + 'maintainer' => MAINTAINER_PROJECT_ACCESS, + 'developer' => DEVELOPER_MAINTAINER_PROJECT_ACCESS } end @@ -147,7 +147,7 @@ module Gitlab def subgroup_creation_string_options { - 'owner' => OWNER_SUBGROUP_ACCESS, + 'owner' => OWNER_SUBGROUP_ACCESS, 'maintainer' => MAINTAINER_SUBGROUP_ACCESS } end diff --git a/lib/gitlab/application_rate_limiter.rb b/lib/gitlab/application_rate_limiter.rb index a2d79b189a3..542b59e98b8 100644 --- a/lib/gitlab/application_rate_limiter.rb +++ b/lib/gitlab/application_rate_limiter.rb @@ -16,39 +16,39 @@ module Gitlab # and only do that when it's needed. def rate_limits # rubocop:disable Metrics/AbcSize { - issues_create: { threshold: -> { application_settings.issues_create_limit }, interval: 1.minute }, - notes_create: { threshold: -> { application_settings.notes_create_limit }, interval: 1.minute }, - project_export: { threshold: -> { application_settings.project_export_limit }, interval: 1.minute }, - project_download_export: { threshold: -> { application_settings.project_download_export_limit }, interval: 1.minute }, + issues_create: { threshold: -> { application_settings.issues_create_limit }, interval: 1.minute }, + notes_create: { threshold: -> { application_settings.notes_create_limit }, interval: 1.minute }, + project_export: { threshold: -> { application_settings.project_export_limit }, interval: 1.minute }, + project_download_export: { threshold: -> { application_settings.project_download_export_limit }, interval: 1.minute }, project_repositories_archive: { threshold: 5, interval: 1.minute }, - project_generate_new_export: { threshold: -> { application_settings.project_export_limit }, interval: 1.minute }, - project_import: { threshold: -> { application_settings.project_import_limit }, interval: 1.minute }, - project_testing_hook: { threshold: 5, interval: 1.minute }, - play_pipeline_schedule: { threshold: 1, interval: 1.minute }, - raw_blob: { threshold: -> { application_settings.raw_blob_request_limit }, interval: 1.minute }, - group_export: { threshold: -> { application_settings.group_export_limit }, interval: 1.minute }, - group_download_export: { threshold: -> { application_settings.group_download_export_limit }, interval: 1.minute }, - group_import: { threshold: -> { application_settings.group_import_limit }, interval: 1.minute }, - group_testing_hook: { threshold: 5, interval: 1.minute }, - profile_add_new_email: { threshold: 5, interval: 1.minute }, - web_hook_calls: { interval: 1.minute }, - web_hook_calls_mid: { interval: 1.minute }, - web_hook_calls_low: { interval: 1.minute }, - users_get_by_id: { threshold: -> { application_settings.users_get_by_id_limit }, interval: 10.minutes }, - username_exists: { threshold: 20, interval: 1.minute }, - user_sign_up: { threshold: 20, interval: 1.minute }, - user_sign_in: { threshold: 5, interval: 10.minutes }, - profile_resend_email_confirmation: { threshold: 5, interval: 1.minute }, - profile_update_username: { threshold: 10, interval: 1.minute }, - update_environment_canary_ingress: { threshold: 1, interval: 1.minute }, - auto_rollback_deployment: { threshold: 1, interval: 3.minutes }, - search_rate_limit: { threshold: -> { application_settings.search_rate_limit }, interval: 1.minute }, - search_rate_limit_unauthenticated: { threshold: -> { application_settings.search_rate_limit_unauthenticated }, interval: 1.minute }, - gitlab_shell_operation: { threshold: 600, interval: 1.minute }, - pipelines_create: { threshold: -> { application_settings.pipeline_limit_per_project_user_sha }, interval: 1.minute }, - temporary_email_failure: { threshold: 50, interval: 1.day }, - project_testing_integration: { threshold: 5, interval: 1.minute }, - email_verification: { threshold: 10, interval: 10.minutes }, + project_generate_new_export: { threshold: -> { application_settings.project_export_limit }, interval: 1.minute }, + project_import: { threshold: -> { application_settings.project_import_limit }, interval: 1.minute }, + project_testing_hook: { threshold: 5, interval: 1.minute }, + play_pipeline_schedule: { threshold: 1, interval: 1.minute }, + raw_blob: { threshold: -> { application_settings.raw_blob_request_limit }, interval: 1.minute }, + group_export: { threshold: -> { application_settings.group_export_limit }, interval: 1.minute }, + group_download_export: { threshold: -> { application_settings.group_download_export_limit }, interval: 1.minute }, + group_import: { threshold: -> { application_settings.group_import_limit }, interval: 1.minute }, + group_testing_hook: { threshold: 5, interval: 1.minute }, + profile_add_new_email: { threshold: 5, interval: 1.minute }, + web_hook_calls: { interval: 1.minute }, + web_hook_calls_mid: { interval: 1.minute }, + web_hook_calls_low: { interval: 1.minute }, + users_get_by_id: { threshold: -> { application_settings.users_get_by_id_limit }, interval: 10.minutes }, + username_exists: { threshold: 20, interval: 1.minute }, + user_sign_up: { threshold: 20, interval: 1.minute }, + user_sign_in: { threshold: 5, interval: 10.minutes }, + profile_resend_email_confirmation: { threshold: 5, interval: 1.minute }, + profile_update_username: { threshold: 10, interval: 1.minute }, + update_environment_canary_ingress: { threshold: 1, interval: 1.minute }, + auto_rollback_deployment: { threshold: 1, interval: 3.minutes }, + search_rate_limit: { threshold: -> { application_settings.search_rate_limit }, interval: 1.minute }, + search_rate_limit_unauthenticated: { threshold: -> { application_settings.search_rate_limit_unauthenticated }, interval: 1.minute }, + gitlab_shell_operation: { threshold: 600, interval: 1.minute }, + pipelines_create: { threshold: -> { application_settings.pipeline_limit_per_project_user_sha }, interval: 1.minute }, + temporary_email_failure: { threshold: 50, interval: 1.day }, + project_testing_integration: { threshold: 5, interval: 1.minute }, + email_verification: { threshold: 10, interval: 10.minutes }, email_verification_code_send: { threshold: 10, interval: 1.hour } }.freeze end @@ -130,16 +130,16 @@ module Gitlab # @param logger [Logger] Logger to log request to a specific log file. Defaults to Gitlab::AuthLogger def log_request(request, type, current_user, logger = Gitlab::AuthLogger) request_information = { - message: 'Application_Rate_Limiter_Request', - env: type, - remote_ip: request.ip, + message: 'Application_Rate_Limiter_Request', + env: type, + remote_ip: request.ip, request_method: request.request_method, - path: request.fullpath + path: request.fullpath } if current_user request_information.merge!({ - user_id: current_user.id, + user_id: current_user.id, username: current_user.username }) end diff --git a/lib/gitlab/auth/ldap/config.rb b/lib/gitlab/auth/ldap/config.rb index 82c6411c712..9dafd59561a 100644 --- a/lib/gitlab/auth/ldap/config.rb +++ b/lib/gitlab/auth/ldap/config.rb @@ -7,8 +7,8 @@ module Gitlab class Config NET_LDAP_ENCRYPTION_METHOD = { simple_tls: :simple_tls, - start_tls: :start_tls, - plain: nil + start_tls: :start_tls, + plain: nil }.freeze attr_accessor :provider, :options @@ -193,11 +193,11 @@ module Gitlab def default_attributes { - 'username' => %W(#{uid} uid sAMAccountName userid).uniq, - 'email' => %w(mail email userPrincipalName), - 'name' => 'cn', - 'first_name' => 'givenName', - 'last_name' => 'sn' + 'username' => %W(#{uid} uid sAMAccountName userid).uniq, + 'email' => %w(mail email userPrincipalName), + 'name' => 'cn', + 'first_name' => 'givenName', + 'last_name' => 'sn' } end diff --git a/lib/gitlab/auth/o_auth/auth_hash.rb b/lib/gitlab/auth/o_auth/auth_hash.rb index 37f92792d2d..467a933c131 100644 --- a/lib/gitlab/auth/o_auth/auth_hash.rb +++ b/lib/gitlab/auth/o_auth/auth_hash.rb @@ -103,7 +103,7 @@ module Gitlab { username: username, - email: email + email: email } end end diff --git a/lib/gitlab/auth/o_auth/provider.rb b/lib/gitlab/auth/o_auth/provider.rb index 1a25ed10d81..2c2fb743927 100644 --- a/lib/gitlab/auth/o_auth/provider.rb +++ b/lib/gitlab/auth/o_auth/provider.rb @@ -5,14 +5,14 @@ module Gitlab module OAuth class Provider LABELS = { - "alicloud" => "AliCloud", - "dingtalk" => "DingTalk", - "github" => "GitHub", - "gitlab" => "GitLab.com", - "google_oauth2" => "Google", - "azure_oauth2" => "Azure AD", + "alicloud" => "AliCloud", + "dingtalk" => "DingTalk", + "github" => "GitHub", + "gitlab" => "GitLab.com", + "google_oauth2" => "Google", + "azure_oauth2" => "Azure AD", "azure_activedirectory_v2" => "Azure AD v2", - 'atlassian_oauth2' => 'Atlassian' + 'atlassian_oauth2' => 'Atlassian' }.freeze def self.authentication(user, provider) diff --git a/lib/gitlab/auth/o_auth/user.rb b/lib/gitlab/auth/o_auth/user.rb index 7d9c4c0d7c1..1fed2b263da 100644 --- a/lib/gitlab/auth/o_auth/user.rb +++ b/lib/gitlab/auth/o_auth/user.rb @@ -240,11 +240,11 @@ module Gitlab valid_username = Uniquify.new.string(valid_username) { |s| !NamespacePathValidator.valid_path?(s) } { - name: name.strip.presence || valid_username, - username: valid_username, - email: email, - password: auth_hash.password, - password_confirmation: auth_hash.password, + name: name.strip.presence || valid_username, + username: valid_username, + email: email, + password: auth_hash.password, + password_confirmation: auth_hash.password, password_automatically_set: true } end diff --git a/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb b/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb index 9cf1b2247a7..88ad48c3db7 100644 --- a/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb +++ b/lib/gitlab/auth/otp/strategies/forti_authenticator/manual_otp.rb @@ -34,7 +34,7 @@ module Gitlab end def body - { username: user.username, + { username: user.username, token_code: @otp_code } end diff --git a/lib/gitlab/background_migration/backfill_project_repositories.rb b/lib/gitlab/background_migration/backfill_project_repositories.rb index 05e2ed72fb3..c49ef9d10f5 100644 --- a/lib/gitlab/background_migration/backfill_project_repositories.rb +++ b/lib/gitlab/background_migration/backfill_project_repositories.rb @@ -212,8 +212,8 @@ module Gitlab def build_attributes_for_project(project) { project_id: project.id, - shard_id: find_shard_id(project.repository_storage), - disk_path: project.disk_path + shard_id: find_shard_id(project.repository_storage), + disk_path: project.disk_path } end diff --git a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb index 72380af2c53..9a42d035285 100644 --- a/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb +++ b/lib/gitlab/background_migration/recalculate_vulnerabilities_occurrences_uuid.rb @@ -58,7 +58,7 @@ class Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrencesUuid # r development: "a143e9e2-41b3-47bc-9a19-081d089229f4", test: "a143e9e2-41b3-47bc-9a19-081d089229f4", staging: "a6930898-a1b2-4365-ab18-12aa474d9b26", - production: "58dc0f06-936c-43b3-93bb-71693f1b6570" + production: "58dc0f06-936c-43b3-93bb-71693f1b6570" }.freeze NAMESPACE_REGEX = /(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/.freeze diff --git a/lib/gitlab/ci/ansi2html.rb b/lib/gitlab/ci/ansi2html.rb index 10233cf4228..2ab702aa4f9 100644 --- a/lib/gitlab/ci/ansi2html.rb +++ b/lib/gitlab/ci/ansi2html.rb @@ -19,11 +19,11 @@ module Gitlab }.freeze STYLE_SWITCHES = { - bold: 0x01, - italic: 0x02, - underline: 0x04, - conceal: 0x08, - cross: 0x10 + bold: 0x01, + italic: 0x02, + underline: 0x04, + conceal: 0x08, + cross: 0x10 }.freeze def self.convert(ansi, state = nil) diff --git a/lib/gitlab/ci/ansi2json/parser.rb b/lib/gitlab/ci/ansi2json/parser.rb index 79b42a5f5bf..fdd49df1e24 100644 --- a/lib/gitlab/ci/ansi2json/parser.rb +++ b/lib/gitlab/ci/ansi2json/parser.rb @@ -20,11 +20,11 @@ module Gitlab }.freeze STYLE_SWITCHES = { - bold: 0x01, - italic: 0x02, - underline: 0x04, - conceal: 0x08, - cross: 0x10 + bold: 0x01, + italic: 0x02, + underline: 0x04, + conceal: 0x08, + cross: 0x10 }.freeze def self.bold?(mask) diff --git a/lib/gitlab/ci/config/entry/processable.rb b/lib/gitlab/ci/config/entry/processable.rb index 78794f524f4..6077d70a080 100644 --- a/lib/gitlab/ci/config/entry/processable.rb +++ b/lib/gitlab/ci/config/entry/processable.rb @@ -29,7 +29,7 @@ module Gitlab in: %i[only except start_in], message: 'key may not be used with `rules`' }, - if: :has_rules? + if: :has_rules? with_options allow_nil: true do validates :extends, array_of_strings_or_string: true diff --git a/lib/gitlab/ci/jwt_v2.rb b/lib/gitlab/ci/jwt_v2.rb index 278353220e4..4e01688a955 100644 --- a/lib/gitlab/ci/jwt_v2.rb +++ b/lib/gitlab/ci/jwt_v2.rb @@ -8,7 +8,7 @@ module Gitlab def reserved_claims super.merge( iss: Settings.gitlab.base_url, - sub: "project_path:#{project.full_path}:ref_type:#{ref_type}:ref:#{source_ref}", + sub: "project_path:#{project.full_path}:ref_type:#{ref_type}:ref:#{source_ref}", aud: Settings.gitlab.base_url ) end diff --git a/lib/gitlab/ci/pipeline/chain/validate/external.rb b/lib/gitlab/ci/pipeline/chain/validate/external.rb index 6e95c7988fc..ba6de77d57d 100644 --- a/lib/gitlab/ci/pipeline/chain/validate/external.rb +++ b/lib/gitlab/ci/pipeline/chain/validate/external.rb @@ -57,7 +57,8 @@ module Gitlab }.compact Gitlab::HTTP.post( - validation_service_url, timeout: validation_service_timeout, + validation_service_url, + timeout: validation_service_timeout, headers: headers, body: validation_service_payload.to_json ) diff --git a/lib/gitlab/ci/reports/security/scanner.rb b/lib/gitlab/ci/reports/security/scanner.rb index 1ac66a0c671..918df163ede 100644 --- a/lib/gitlab/ci/reports/security/scanner.rb +++ b/lib/gitlab/ci/reports/security/scanner.rb @@ -7,13 +7,13 @@ module Gitlab class Scanner ANALYZER_ORDER = { "bundler_audit" => 1, - "retire.js" => 2, + "retire.js" => 2, "gemnasium" => 3, "gemnasium-maven" => 3, "gemnasium-python" => 3, "bandit" => 1, "spotbugs" => 1, - "semgrep" => 2 + "semgrep" => 2 }.freeze attr_accessor :external_id, :name, :vendor, :version diff --git a/lib/gitlab/database/background_migration/health_status.rb b/lib/gitlab/database/background_migration/health_status.rb index 9a283074b32..506d2996ad5 100644 --- a/lib/gitlab/database/background_migration/health_status.rb +++ b/lib/gitlab/database/background_migration/health_status.rb @@ -18,7 +18,7 @@ module Gitlab indicator.new(migration.health_context).evaluate rescue StandardError => e Gitlab::ErrorTracking.track_exception(e, migration_id: migration.id, - job_class_name: migration.job_class_name) + job_class_name: migration.job_class_name) Signals::Unknown.new(indicator, reason: "unexpected error: #{e.message} (#{e.class})") end diff --git a/lib/gitlab/database/reflection.rb b/lib/gitlab/database/reflection.rb index 3ea7277571f..33c965cb150 100644 --- a/lib/gitlab/database/reflection.rb +++ b/lib/gitlab/database/reflection.rb @@ -114,7 +114,7 @@ module Gitlab 'PostgreSQL on Amazon RDS' => { statement: 'SHOW rds.extensions', error: /PG::UndefinedObject/ }, # Based on https://cloud.google.com/sql/docs/postgres/flags#postgres-c this should be specific # to Cloud SQL for PostgreSQL - 'Cloud SQL for PostgreSQL' => { statement: 'SHOW cloudsql.iam_authentication', error: /PG::UndefinedObject/ }, + 'Cloud SQL for PostgreSQL' => { statement: 'SHOW cloudsql.iam_authentication', error: /PG::UndefinedObject/ }, # Based on # - https://docs.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-extensions # - https://docs.microsoft.com/en-us/azure/postgresql/concepts-extensions diff --git a/lib/gitlab/diff/file_collection/compare.rb b/lib/gitlab/diff/file_collection/compare.rb index badebabb192..6d8395d048d 100644 --- a/lib/gitlab/diff/file_collection/compare.rb +++ b/lib/gitlab/diff/file_collection/compare.rb @@ -6,9 +6,9 @@ module Gitlab class Compare < Base def initialize(compare, project:, diff_options:, diff_refs: nil) super(compare, - project: project, + project: project, diff_options: diff_options, - diff_refs: diff_refs) + diff_refs: diff_refs) end def unfold_diff_lines(positions) diff --git a/lib/gitlab/email/attachment_uploader.rb b/lib/gitlab/email/attachment_uploader.rb index b67ca8d8a7d..931276588f0 100644 --- a/lib/gitlab/email/attachment_uploader.rb +++ b/lib/gitlab/email/attachment_uploader.rb @@ -20,8 +20,8 @@ module Gitlab sanitize_exif_if_needed(content, tmp.path) file = { - tempfile: tmp, - filename: attachment.filename, + tempfile: tmp, + filename: attachment.filename, content_type: attachment.content_type } diff --git a/locale/gitlab.pot b/locale/gitlab.pot index 07a4bca4285..da602fe874d 100644 --- a/locale/gitlab.pot +++ b/locale/gitlab.pot @@ -2457,9 +2457,6 @@ msgstr "" msgid "Adjust how frequently the GitLab UI polls for updates." msgstr "" -msgid "Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information." -msgstr "" - msgid "Admin" msgstr "" @@ -14217,6 +14214,9 @@ msgstr "" msgid "Edit your most recent comment in a thread (from an empty textarea)" msgstr "" +msgid "Edit your search filter and try again." +msgstr "" + msgid "Edit, lint, and visualize your pipeline." msgstr "" @@ -16983,9 +16983,6 @@ msgstr "" msgid "Geo|Add site" msgstr "" -msgid "Geo|Adjust your filters/search criteria above. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information." -msgstr "" - msgid "Geo|All" msgstr "" @@ -17181,6 +17178,12 @@ msgstr "" msgid "Geo|Next sync scheduled at" msgstr "" +msgid "Geo|No %{replicable_type} were found. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information." +msgstr "" + +msgid "Geo|No %{replicable} were found. If you believe this may be an error, please refer to the %{linkStart}Geo Troubleshooting%{linkEnd} documentation for more information." +msgstr "" + msgid "Geo|No Geo site found" msgstr "" @@ -17388,6 +17391,9 @@ msgstr "" msgid "Geo|There are no %{replicable_type} to show" msgstr "" +msgid "Geo|There are no %{replicable} to show" +msgstr "" + msgid "Geo|There was an error deleting the Geo Site" msgstr "" @@ -26410,6 +26416,9 @@ msgstr "" msgid "No results" msgstr "" +msgid "No results found" +msgstr "" + msgid "No runner executable" msgstr "" @@ -39483,9 +39492,6 @@ msgstr "" msgid "There are merge conflicts" msgstr "" -msgid "There are no %{replicableTypeName} to show" -msgstr "" - msgid "There are no GPG keys associated with this account." msgstr "" @@ -45840,6 +45846,9 @@ msgid_plural "changes" msgstr[0] "" msgstr[1] "" +msgid "ciReport|%{criticalStart}critical%{criticalEnd}, %{highStart}high%{highEnd} and %{otherStart}others%{otherEnd}" +msgstr "" + msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}" msgstr "" diff --git a/package.json b/package.json index 86632d45e9e..ae96c1ad8a7 100644 --- a/package.json +++ b/package.json @@ -177,16 +177,16 @@ "url-loader": "^4.1.1", "uuid": "8.1.0", "visibilityjs": "^1.2.4", - "vue": "^2.6.12", + "vue": "^2.7.8", "vue-apollo": "^3.0.7", - "vue-loader": "^15.9.6", + "vue-loader": "^15.10", "vue-observe-visibility": "^1.0.0", "vue-resize": "^1.0.1", "vue-router": "3.4.9", - "vue-template-compiler": "^2.6.12", + "vue-template-compiler": "^2.7.8", "vue-virtual-scroll-list": "^1.4.7", "vuedraggable": "^2.23.0", - "vuex": "^3.6.0", + "vuex": "^3.6.2", "web-vitals": "^0.2.4", "webpack": "^4.46.0", "webpack-bundle-analyzer": "^4.5.0", diff --git a/qa/qa/specs/spec_helper.rb b/qa/qa/specs/spec_helper.rb index e1c08515521..b9e67c2fa72 100644 --- a/qa/qa/specs/spec_helper.rb +++ b/qa/qa/specs/spec_helper.rb @@ -12,6 +12,9 @@ QA::Runtime::Browser.configure! unless QA::Runtime::Env.dry_run QA::Runtime::AllureReport.configure! QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes) +# Enable zero monkey patching mode before loading any other RSpec code. +RSpec.configure(&:disable_monkey_patching!) + Dir[::File.join(__dir__, "features/shared_examples/*.rb")].sort.each { |f| require f } Dir[::File.join(__dir__, "features/shared_contexts/*.rb")].sort.each { |f| require f } @@ -119,7 +122,6 @@ RSpec.configure do |config| end config.shared_context_metadata_behavior = :apply_to_host_groups - config.disable_monkey_patching! config.expose_dsl_globally = true config.profile_examples = 10 config.order = :random diff --git a/spec/fast_spec_helper.rb b/spec/fast_spec_helper.rb index 34ab48f67a8..722c1e66f34 100644 --- a/spec/fast_spec_helper.rb +++ b/spec/fast_spec_helper.rb @@ -11,6 +11,9 @@ require_relative '../config/bundler_setup' ENV['GITLAB_ENV'] = 'test' ENV['IN_MEMORY_APPLICATION_SETTINGS'] = 'true' +# Enable zero monkey patching mode before loading any other RSpec code. +RSpec.configure(&:disable_monkey_patching!) + require 'active_support/dependencies' require_relative '../config/initializers/0_inject_enterprise_edition_module' require_relative '../config/settings' diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js index 7775ed6aa37..1ea035c7184 100644 --- a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js +++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_form_spec.js @@ -71,12 +71,7 @@ describe('Sidebar Confidentiality Form', () => { it('creates a flash if mutation contains errors', async () => { createComponent({ mutate: jest.fn().mockResolvedValue({ - data: { - issuableSetConfidential: { - issuable: { confidential: false }, - errors: ['Houston, we have a problem!'], - }, - }, + data: { issuableSetConfidential: { errors: ['Houston, we have a problem!'] } }, }), }); findConfidentialToggle().vm.$emit('click', new MouseEvent('click')); @@ -87,24 +82,6 @@ describe('Sidebar Confidentiality Form', () => { }); }); - it('emits `closeForm` event with confidentiality value when mutation is successful', async () => { - createComponent({ - mutate: jest.fn().mockResolvedValue({ - data: { - issuableSetConfidential: { - issuable: { confidential: true }, - errors: [], - }, - }, - }), - }); - - findConfidentialToggle().vm.$emit('click', new MouseEvent('click')); - await waitForPromises(); - - expect(wrapper.emitted('closeForm')).toEqual([[{ confidential: true }]]); - }); - describe('when issue is not confidential', () => { beforeEach(() => { createComponent(); diff --git a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js index 18ee423d12e..3a3f0b1d9fa 100644 --- a/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js +++ b/spec/frontend/sidebar/components/confidential/sidebar_confidentiality_widget_spec.js @@ -132,7 +132,6 @@ describe('Sidebar Confidentiality Widget', () => { it('closes the form and dispatches an event when `closeForm` is emitted', async () => { createComponent(); const el = wrapper.vm.$el; - const closeFormPayload = { confidential: true }; jest.spyOn(el, 'dispatchEvent'); await waitForPromises(); @@ -141,12 +140,12 @@ describe('Sidebar Confidentiality Widget', () => { expect(findConfidentialityForm().isVisible()).toBe(true); - findConfidentialityForm().vm.$emit('closeForm', closeFormPayload); + findConfidentialityForm().vm.$emit('closeForm'); await nextTick(); expect(findConfidentialityForm().isVisible()).toBe(false); expect(el.dispatchEvent).toHaveBeenCalled(); - expect(wrapper.emitted('closeForm')).toEqual([[closeFormPayload]]); + expect(wrapper.emitted('closeForm')).toEqual([[]]); }); it('emits `expandSidebar` event when it is emitted from child component', async () => { diff --git a/spec/frontend/work_items/components/work_item_assignees_spec.js b/spec/frontend/work_items/components/work_item_assignees_spec.js index f0ef8aee7a9..b00a9efa932 100644 --- a/spec/frontend/work_items/components/work_item_assignees_spec.js +++ b/spec/frontend/work_items/components/work_item_assignees_spec.js @@ -8,12 +8,12 @@ import { mockTracking } from 'helpers/tracking_helper'; import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; import userSearchQuery from '~/graphql_shared/queries/users_search.query.graphql'; import currentUserQuery from '~/graphql_shared/queries/current_user.query.graphql'; +import { temporaryConfig } from '~/graphql_shared/issuable_client'; import InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue'; import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue'; import { i18n, TASK_TYPE_NAME, TRACKING_CATEGORY_SHOW } from '~/work_items/constants'; -import { temporaryConfig } from '~/work_items/graphql/provider'; import { projectMembersResponseWithCurrentUser, mockAssignees, diff --git a/spec/frontend/work_items/components/work_item_labels_spec.js b/spec/frontend/work_items/components/work_item_labels_spec.js index 1734b901d1a..c206afc905a 100644 --- a/spec/frontend/work_items/components/work_item_labels_spec.js +++ b/spec/frontend/work_items/components/work_item_labels_spec.js @@ -9,7 +9,7 @@ import labelSearchQuery from '~/vue_shared/components/sidebar/labels_select_widg import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; import WorkItemLabels from '~/work_items/components/work_item_labels.vue'; import { i18n } from '~/work_items/constants'; -import { temporaryConfig, resolvers } from '~/work_items/graphql/provider'; +import { temporaryConfig, resolvers } from '~/graphql_shared/issuable_client'; import { projectLabelsResponse, mockLabels, workItemQueryResponse } from '../mock_data'; Vue.use(VueApollo); diff --git a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js index 00f508f1548..a5deeb827f6 100644 --- a/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js +++ b/spec/frontend/work_items/components/work_item_links/work_item_links_spec.js @@ -4,8 +4,8 @@ import VueApollo from 'vue-apollo'; import { shallowMountExtended } from 'helpers/vue_test_utils_helper'; import createMockApollo from 'helpers/mock_apollo_helper'; import waitForPromises from 'helpers/wait_for_promises'; -import SidebarEventHub from '~/sidebar/event_hub'; import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants'; +import issueConfidentialQuery from '~/sidebar/queries/issue_confidential.query.graphql'; import WorkItemLinks from '~/work_items/components/work_item_links/work_item_links.vue'; import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; import changeWorkItemParentMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; @@ -20,6 +20,20 @@ import { Vue.use(VueApollo); +const issueConfidentialityResponse = (confidential = false) => ({ + data: { + workspace: { + id: '1', + __typename: 'Project', + issuable: { + __typename: 'Issue', + id: 'gid://gitlab/Issue/4', + confidential, + }, + }, + }, +}); + describe('WorkItemLinks', () => { let wrapper; let mockApollo; @@ -36,18 +50,18 @@ describe('WorkItemLinks', () => { const childWorkItemQueryHandler = jest.fn().mockResolvedValue(workItemQueryResponse); - const findChildren = () => wrapper.findAll('[data-testid="links-child"]'); - const createComponent = async ({ data = {}, fetchHandler = jest.fn().mockResolvedValue(workItemHierarchyResponse), mutationHandler = mutationChangeParentHandler, + confidentialQueryHandler = jest.fn().mockResolvedValue(issueConfidentialityResponse()), } = {}) => { mockApollo = createMockApollo( [ [getWorkItemLinksQuery, fetchHandler], [changeWorkItemParentMutation, mutationHandler], [workItemQuery, childWorkItemQueryHandler], + [issueConfidentialQuery, confidentialQueryHandler], ], {}, { addTypename: true }, @@ -61,6 +75,7 @@ describe('WorkItemLinks', () => { }, provide: { projectPath: 'project/path', + iid: '1', }, propsData: { issuableId: 1 }, apolloProvider: mockApollo, @@ -80,6 +95,7 @@ describe('WorkItemLinks', () => { const findAddLinksForm = () => wrapper.findByTestId('add-links-form'); const findFirstLinksMenu = () => wrapper.findByTestId('links-menu'); const findChildrenCount = () => wrapper.findByTestId('children-count'); + const findChildren = () => wrapper.findAllByTestId('links-child'); beforeEach(async () => { await createComponent(); @@ -167,21 +183,6 @@ describe('WorkItemLinks', () => { expect(findChildrenCount().text()).toContain('4'); }); - it('refetches child items when `confidentialityUpdated` event is emitted on SidebarEventhub', async () => { - const fetchHandler = jest.fn().mockResolvedValue(workItemHierarchyResponse); - await createComponent({ - fetchHandler, - }); - await waitForPromises(); - - SidebarEventHub.$emit('confidentialityUpdated'); - await nextTick(); - - // First call is done on component mount. - // Second call is done on confidentialityUpdated event. - expect(fetchHandler).toHaveBeenCalledTimes(2); - }); - describe('when no permission to update', () => { beforeEach(async () => { await createComponent({ @@ -268,4 +269,16 @@ describe('WorkItemLinks', () => { expect(childWorkItemQueryHandler).not.toHaveBeenCalled(); }); }); + + describe('when parent item is confidential', () => { + it('passes correct confidentiality status to form', async () => { + await createComponent({ + confidentialQueryHandler: jest.fn().mockResolvedValue(issueConfidentialityResponse(true)), + }); + findToggleAddFormButton().vm.$emit('click'); + await nextTick(); + + expect(findAddLinksForm().props('parentConfidential')).toBe(true); + }); + }); }); diff --git a/spec/frontend/work_items/pages/work_item_detail_spec.js b/spec/frontend/work_items/pages/work_item_detail_spec.js index 823981df880..ab6050418c7 100644 --- a/spec/frontend/work_items/pages/work_item_detail_spec.js +++ b/spec/frontend/work_items/pages/work_item_detail_spec.js @@ -19,7 +19,7 @@ import workItemQuery from '~/work_items/graphql/work_item.query.graphql'; import workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql'; import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql'; import updateWorkItemTaskMutation from '~/work_items/graphql/update_work_item_task.mutation.graphql'; -import { temporaryConfig } from '~/work_items/graphql/provider'; +import { temporaryConfig } from '~/graphql_shared/issuable_client'; import { useLocalStorageSpy } from 'helpers/local_storage_helper'; import { workItemTitleSubscriptionResponse, diff --git a/spec/requests/api/settings_spec.rb b/spec/requests/api/settings_spec.rb index 6f0d5827a80..315c76c8ac3 100644 --- a/spec/requests/api/settings_spec.rb +++ b/spec/requests/api/settings_spec.rb @@ -56,6 +56,10 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do expect(json_response['project_runner_token_expiration_interval']).to be_nil expect(json_response['max_export_size']).to eq(0) expect(json_response['pipeline_limit_per_project_user_sha']).to eq(0) + expect(json_response['delete_inactive_projects']).to be(false) + expect(json_response['inactive_projects_delete_after_months']).to eq(2) + expect(json_response['inactive_projects_min_size_mb']).to eq(0) + expect(json_response['inactive_projects_send_warning_email_after_months']).to eq(1) end end @@ -148,7 +152,11 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do user_deactivation_emails_enabled: false, admin_mode: true, suggest_pipeline_enabled: false, - users_get_by_id_limit: 456 + users_get_by_id_limit: 456, + delete_inactive_projects: true, + inactive_projects_delete_after_months: 24, + inactive_projects_min_size_mb: 10, + inactive_projects_send_warning_email_after_months: 12 } expect(response).to have_gitlab_http_status(:ok) @@ -205,6 +213,10 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do expect(json_response['user_deactivation_emails_enabled']).to be(false) expect(json_response['suggest_pipeline_enabled']).to be(false) expect(json_response['users_get_by_id_limit']).to eq(456) + expect(json_response['delete_inactive_projects']).to be(true) + expect(json_response['inactive_projects_delete_after_months']).to eq(24) + expect(json_response['inactive_projects_min_size_mb']).to eq(10) + expect(json_response['inactive_projects_send_warning_email_after_months']).to eq(12) end end diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8acf3bcf9c0..2382d8732e5 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -53,6 +53,9 @@ end require 'rainbow/ext/string' Rainbow.enabled = false +# Enable zero monkey patching mode before loading any other RSpec code. +RSpec.configure(&:disable_monkey_patching!) + require_relative('../ee/spec/spec_helper') if Gitlab.ee? require_relative('../jh/spec/spec_helper') if Gitlab.jh? @@ -478,8 +481,6 @@ RSpec.configure do |config| config.before(:each, :js) do allow_any_instance_of(VersionCheck).to receive(:response).and_return({ "severity" => "success" }) end - - config.disable_monkey_patching! end ActiveRecord::Migration.maintain_test_schema! diff --git a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb index 2e691d1b36f..4af3c0cc6cc 100644 --- a/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb +++ b/spec/support/shared_examples/controllers/snowplow_event_tracking_examples.rb @@ -13,7 +13,7 @@ # - label # - **extra -shared_examples 'Snowplow event tracking' do |overrides: {}| +RSpec.shared_examples 'Snowplow event tracking' do |overrides: {}| let(:extra) { {} } it 'is not emitted if FF is disabled' do diff --git a/spec/support/shared_examples/graphql/n_plus_one_query_examples.rb b/spec/support/shared_examples/graphql/n_plus_one_query_examples.rb index 738edd43c92..faf1bb204c9 100644 --- a/spec/support/shared_examples/graphql/n_plus_one_query_examples.rb +++ b/spec/support/shared_examples/graphql/n_plus_one_query_examples.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -shared_examples 'N+1 query check' do +RSpec.shared_examples 'N+1 query check' do it 'prevents N+1 queries' do execute_query # "warm up" to prevent undeterministic counts expect(graphql_errors).to be_blank # Sanity check - ex falso quodlibet! diff --git a/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb b/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb index beec072e474..9ffc55f7e7e 100644 --- a/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb +++ b/spec/support/shared_examples/lib/gitlab/cycle_analytics/deployment_metrics.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples 'deployment metrics examples' do +RSpec.shared_examples 'deployment metrics examples' do def create_deployment(args) project = args[:project] environment = project.environments.production.first || create(:environment, :production, project: project) diff --git a/spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb b/spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb index 1f7325df11a..243dc1d195b 100644 --- a/spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb +++ b/spec/support/shared_examples/lib/gitlab/diff_file_collections_shared_examples.rb @@ -144,7 +144,7 @@ RSpec.shared_examples 'cacheable diff collection' do end end -shared_examples_for 'sortable diff files' do +RSpec.shared_examples_for 'sortable diff files' do subject { described_class.new(diffable, **collection_default_args) } describe '#raw_diff_files' do @@ -170,7 +170,7 @@ shared_examples_for 'sortable diff files' do end end -shared_examples_for 'unsortable diff files' do +RSpec.shared_examples_for 'unsortable diff files' do subject { described_class.new(diffable, **collection_default_args) } describe '#raw_diff_files' do diff --git a/spec/support/shared_examples/namespaces/traversal_scope_examples.rb b/spec/support/shared_examples/namespaces/traversal_scope_examples.rb index 807295f8442..4afed5139d8 100644 --- a/spec/support/shared_examples/namespaces/traversal_scope_examples.rb +++ b/spec/support/shared_examples/namespaces/traversal_scope_examples.rb @@ -265,14 +265,6 @@ RSpec.shared_examples 'namespace traversal scopes' do describe '.self_and_descendants' do include_examples '.self_and_descendants' - - context 'with traversal_ids_btree feature flag disabled' do - before do - stub_feature_flags(traversal_ids_btree: false) - end - - include_examples '.self_and_descendants' - end end shared_examples '.self_and_descendant_ids' do @@ -308,14 +300,6 @@ RSpec.shared_examples 'namespace traversal scopes' do describe '.self_and_descendant_ids' do include_examples '.self_and_descendant_ids' - - context 'with traversal_ids_btree feature flag disabled' do - before do - stub_feature_flags(traversal_ids_btree: false) - end - - include_examples '.self_and_descendant_ids' - end end shared_examples '.self_and_hierarchy' do diff --git a/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb b/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb index a62cffc0e1b..73a02905914 100644 --- a/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb +++ b/spec/support/shared_examples/services/feature_flags/client_shared_examples.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples_for 'update feature flag client' do +RSpec.shared_examples_for 'update feature flag client' do let!(:client) { create(:operations_feature_flags_client, project: project) } it 'updates last feature flag updated at' do @@ -10,7 +10,7 @@ shared_examples_for 'update feature flag client' do end end -shared_examples_for 'does not update feature flag client' do +RSpec.shared_examples_for 'does not update feature flag client' do let!(:client) { create(:operations_feature_flags_client, project: project) } it 'does not update last feature flag updated at' do diff --git a/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb b/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb index 31571b1ffb9..92681b8ba79 100644 --- a/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb +++ b/spec/support/shared_examples/services/issuable/destroy_service_shared_examples.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples_for 'service scheduling async deletes' do +RSpec.shared_examples_for 'service scheduling async deletes' do it 'destroys associated todos asynchronously' do expect(worker_class) .to receive(:perform_async) @@ -20,13 +20,13 @@ shared_examples_for 'service scheduling async deletes' do end end -shared_examples_for 'service deleting todos' do +RSpec.shared_examples_for 'service deleting todos' do it_behaves_like 'service scheduling async deletes' do let(:worker_class) { TodosDestroyer::DestroyedIssuableWorker } end end -shared_examples_for 'service deleting label links' do +RSpec.shared_examples_for 'service deleting label links' do it_behaves_like 'service scheduling async deletes' do let(:worker_class) { Issuable::LabelLinksDestroyWorker } end diff --git a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb index 9610cdd18a3..65351ac94ab 100644 --- a/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb +++ b/spec/support/shared_examples/services/issuable_links/create_links_shared_examples.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples 'issuable link creation' do +RSpec.shared_examples 'issuable link creation' do describe '#execute' do subject { described_class.new(issuable, user, params).execute } diff --git a/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb b/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb index 53d637a9094..5e80014da1d 100644 --- a/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb +++ b/spec/support/shared_examples/services/issuable_links/destroyable_issuable_links_shared_examples.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples 'a destroyable issuable link' do +RSpec.shared_examples 'a destroyable issuable link' do context 'when successfully removes an issuable link' do before do issuable_link.source.resource_parent.add_reporter(user) diff --git a/spec/support/shared_examples/services/snippets_shared_examples.rb b/spec/support/shared_examples/services/snippets_shared_examples.rb index 5a44f739b27..7629cfa976d 100644 --- a/spec/support/shared_examples/services/snippets_shared_examples.rb +++ b/spec/support/shared_examples/services/snippets_shared_examples.rb @@ -24,7 +24,7 @@ RSpec.shared_examples 'checking spam' do end end -shared_examples 'invalid params error response' do +RSpec.shared_examples 'invalid params error response' do before do allow_next_instance_of(described_class) do |service| allow(service).to receive(:valid_params?).and_return false diff --git a/spec/support/shared_examples/services/snowplow_tracking_shared_examples.rb b/spec/support/shared_examples/services/snowplow_tracking_shared_examples.rb index 0687be6f429..31919a4263d 100644 --- a/spec/support/shared_examples/services/snowplow_tracking_shared_examples.rb +++ b/spec/support/shared_examples/services/snowplow_tracking_shared_examples.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -shared_examples 'issue_edit snowplow tracking' do +RSpec.shared_examples 'issue_edit snowplow tracking' do let(:category) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CATEGORY } let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_ACTION } let(:label) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_LABEL } diff --git a/yarn.lock b/yarn.lock index ed4529399db..084317cd180 100644 --- a/yarn.lock +++ b/yarn.lock @@ -302,10 +302,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.5": - version "7.18.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c" - integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw== +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.16.8", "@babel/parser@^7.18.4", "@babel/parser@^7.18.5": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12": version "7.17.12" @@ -2207,20 +2207,30 @@ semver "^6.3.0" tsutils "^3.17.1" +"@vue/compiler-sfc@2.7.8": + version "2.7.8" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.8.tgz#731aadd6beafdb9c72fd8614ce189ac6cee87612" + integrity sha512-2DK4YWKfgLnW9VDR9gnju1gcYRk3flKj8UNsms7fsRmFcg35slVTZEkqwBtX+wJBXaamFfn6NxSsZh3h12Ix/Q== + dependencies: + "@babel/parser" "^7.18.4" + postcss "^8.4.14" + source-map "^0.6.1" + "@vue/component-compiler-utils@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz#d4ef8f80292674044ad6211e336a302e4d2a6575" - integrity sha512-+lN3nsfJJDGMNz7fCpcoYIORrXo0K3OTsdr8jCM7FuqdI4+70TY6gxY6viJ2Xi1clqyPg7LpeOWwjF31vSMmUw== + version "3.3.0" + resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9" + integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ== dependencies: consolidate "^0.15.1" hash-sum "^1.0.2" lru-cache "^4.1.2" merge-source-map "^1.1.0" - postcss "^7.0.14" + postcss "^7.0.36" postcss-selector-parser "^6.0.2" - prettier "^1.18.2" source-map "~0.6.1" vue-template-es2015-compiler "^1.9.0" + optionalDependencies: + prettier "^1.18.2 || ^2.0.0" "@vue/test-utils@1.3.0": version "1.3.0" @@ -2941,9 +2951,9 @@ binaryextensions@2: integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA== bluebird@^3.1.1, bluebird@^3.5.5: - version "3.5.5" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f" - integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w== + version "3.7.2" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9: version "4.11.9" @@ -3968,6 +3978,11 @@ cssstyle@^2.3.0: dependencies: cssom "~0.3.6" +csstype@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + custom-jquery-matchers@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/custom-jquery-matchers/-/custom-jquery-matchers-2.1.0.tgz#e5988fa9715c416b0986b372563f872d9e91e024" @@ -6193,7 +6208,7 @@ hash-base@^3.0.0: hash-sum@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04" - integrity sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ= + integrity sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA== hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.3" @@ -6277,7 +6292,7 @@ hastscript@^7.0.0: property-information "^6.0.0" space-separated-tokens "^2.0.0" -he@^1.1.0: +he@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== @@ -9640,7 +9655,7 @@ postcss@8.4.14, postcss@^8.2.1, postcss@^8.4.14: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^7.0.14, postcss@^7.0.5, postcss@^7.0.6: +postcss@^7.0.14, postcss@^7.0.36, postcss@^7.0.5, postcss@^7.0.6: version "7.0.39" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309" integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== @@ -9666,16 +9681,11 @@ pretender@^3.4.3: fake-xml-http-request "^2.1.1" route-recognizer "^0.3.3" -prettier@2.2.1, prettier@^2.0.0: +prettier@2.2.1, "prettier@^1.18.2 || ^2.0.0", prettier@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== -prettier@^1.18.2: - version "1.18.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" - integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== - pretty-format@^26.4.2: version "26.6.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93" @@ -9878,7 +9888,7 @@ prr@~1.0.1: pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== psl@^1.1.33: version "1.8.0" @@ -11794,7 +11804,7 @@ use@^3.1.0: util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== util@0.10.3: version "0.10.3" @@ -11951,14 +11961,14 @@ vue-functional-data-merge@^3.1.0: integrity sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA== vue-hot-reload-api@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926" - integrity sha512-2j/t+wIbyVMP5NvctQoSUvLkYKoWAAk2QlQiilrM2a6/ulzFgdcLUJfTvs4XQ/3eZhHiBmmEojbjmM4AzZj8JA== + version "2.3.4" + resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2" + integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog== -vue-loader@^15.9.6: - version "15.9.6" - resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.6.tgz#f4bb9ae20c3a8370af3ecf09b8126d38ffdb6b8b" - integrity sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg== +vue-loader@^15.10: + version "15.10.0" + resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.10.0.tgz#2a12695c421a2a2cc2138f05a949d04ed086e38b" + integrity sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg== dependencies: "@vue/component-compiler-utils" "^3.1.0" hash-sum "^1.0.2" @@ -11989,20 +11999,20 @@ vue-runtime-helpers@^1.1.2: integrity sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q== vue-style-loader@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863" - integrity sha512-IsSiXDrLW2QIjyBsCqa35e45l5AceMbJ2jO8DxoEQv75xu/UmtXkSC0ybESq/LpbmmIW47MAWDQvErUw+Hrz/A== + version "4.1.3" + resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35" + integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg== dependencies: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@^2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e" - integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg== +vue-template-compiler@^2.7.8: + version "2.7.8" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.8.tgz#eadd54ed8fbff55b7deb07093a976c07f451a1dc" + integrity sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw== dependencies: de-indent "^1.0.2" - he "^1.1.0" + he "^1.2.0" vue-template-es2015-compiler@^1.9.0: version "1.9.1" @@ -12014,10 +12024,13 @@ vue-virtual-scroll-list@^1.4.7: resolved "https://registry.yarnpkg.com/vue-virtual-scroll-list/-/vue-virtual-scroll-list-1.4.7.tgz#12ee26833885f5bb4d37dc058085ccf3ce5b5a74" integrity sha512-R8bk+k7WMGGoFQ9xF0krGCAlZhQjbJOkDUX+YZD2J+sHQWTzDtmTLS6kiIJToOHK1d/8QPGiD8fd9w0lDP4arg== -vue@^2.6.12: - version "2.6.12" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123" - integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg== +vue@^2.7.8: + version "2.7.8" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.8.tgz#34e06553137611d8cecc4b0cd78b7a59f80b1299" + integrity sha512-ncwlZx5qOcn754bCu5/tS/IWPhXHopfit79cx+uIlLMyt3vCMGcXai5yCG5y+I6cDmEj4ukRYyZail9FTQh7lQ== + dependencies: + "@vue/compiler-sfc" "2.7.8" + csstype "^3.1.0" vuedraggable@^2.23.0: version "2.23.0" @@ -12026,10 +12039,10 @@ vuedraggable@^2.23.0: dependencies: sortablejs "^1.9.0" -vuex@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.0.tgz#95efa56a58f7607c135b053350833a09e01aa813" - integrity sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ== +vuex@^3.6.2: + version "3.6.2" + resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71" + integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw== w3c-hr-time@^1.0.2: version "1.0.2" @@ -12432,7 +12445,7 @@ y18n@^5.0.5: yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== yallist@^3.0.2: version "3.0.3"