Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
c7b2529418
commit
c48bbe6650
|
@ -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'
|
||||
|
|
|
@ -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,
|
||||
});
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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: {
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
},
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
});
|
|
@ -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);
|
||||
}
|
||||
},
|
||||
},
|
||||
}),
|
||||
});
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
},
|
||||
|
|
|
@ -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';
|
||||
},
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) } }
|
||||
|
|
|
@ -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
|
|
@ -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.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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`.
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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:
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -103,7 +103,7 @@ module Gitlab
|
|||
|
||||
{
|
||||
username: username,
|
||||
email: email
|
||||
email: email
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -34,7 +34,7 @@ module Gitlab
|
|||
end
|
||||
|
||||
def body
|
||||
{ username: user.username,
|
||||
{ username: user.username,
|
||||
token_code: @otp_code }
|
||||
end
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ""
|
||||
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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'
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 () => {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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!
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 }
|
||||
|
|
107
yarn.lock
107
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"
|
||||
|
|
Loading…
Reference in New Issue