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/publish_shared_examples.rb'
|
||||||
- 'ee/spec/support/shared_examples/status_page/reference_links_examples.rb'
|
- 'ee/spec/support/shared_examples/status_page/reference_links_examples.rb'
|
||||||
- 'ee/spec/workers/scan_security_report_secrets_worker_spec.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/emoji.rb'
|
||||||
- 'lib/gitlab/etag_caching/middleware.rb'
|
- 'lib/gitlab/etag_caching/middleware.rb'
|
||||||
- 'lib/gitlab/experimentation.rb'
|
- 'lib/gitlab/experimentation.rb'
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import produce from 'immer';
|
import produce from 'immer';
|
||||||
import Vue from 'vue';
|
|
||||||
import VueApollo from 'vue-apollo';
|
import VueApollo from 'vue-apollo';
|
||||||
|
import getIssueStateQuery from '~/issues/show/queries/get_issue_state.query.graphql';
|
||||||
import createDefaultClient from '~/lib/graphql';
|
import createDefaultClient from '~/lib/graphql';
|
||||||
import { WIDGET_TYPE_LABELS } from '../constants';
|
import typeDefs from '~/work_items/graphql/typedefs.graphql';
|
||||||
import typeDefs from './typedefs.graphql';
|
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
|
||||||
import workItemQuery from './work_item.query.graphql';
|
import { WIDGET_TYPE_LABELS } from '~/work_items/constants';
|
||||||
|
|
||||||
export const temporaryConfig = {
|
export const temporaryConfig = {
|
||||||
typeDefs,
|
typeDefs,
|
||||||
|
@ -42,6 +42,13 @@ export const temporaryConfig = {
|
||||||
|
|
||||||
export const resolvers = {
|
export const resolvers = {
|
||||||
Mutation: {
|
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 }) {
|
localUpdateWorkItem(_, { input }, { cache }) {
|
||||||
const sourceData = cache.readQuery({
|
const sourceData = cache.readQuery({
|
||||||
query: workItemQuery,
|
query: workItemQuery,
|
||||||
|
@ -66,12 +73,8 @@ export const resolvers = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export function createApolloProvider() {
|
export const defaultClient = createDefaultClient(resolvers, temporaryConfig);
|
||||||
Vue.use(VueApollo);
|
|
||||||
|
|
||||||
const defaultClient = createDefaultClient(resolvers, temporaryConfig);
|
export const apolloProvider = new VueApollo({
|
||||||
|
defaultClient,
|
||||||
return new VueApollo({
|
});
|
||||||
defaultClient,
|
|
||||||
});
|
|
||||||
}
|
|
|
@ -1,6 +1,6 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import VueApollo from 'vue-apollo';
|
import VueApollo from 'vue-apollo';
|
||||||
import { defaultClient } from '~/sidebar/graphql';
|
import { defaultClient } from '~/graphql_shared/issuable_client';
|
||||||
|
|
||||||
Vue.use(VueApollo);
|
Vue.use(VueApollo);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ import { mapActions } from 'vuex';
|
||||||
import { IssuableType } from '~/issues/constants';
|
import { IssuableType } from '~/issues/constants';
|
||||||
import { fetchPolicies } from '~/lib/graphql';
|
import { fetchPolicies } from '~/lib/graphql';
|
||||||
import { confidentialityQueries } from '~/sidebar/constants';
|
import { confidentialityQueries } from '~/sidebar/constants';
|
||||||
import { defaultClient as gqlClient } from '~/sidebar/graphql';
|
import { defaultClient as gqlClient } from '~/graphql_shared/issuable_client';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
props: {
|
props: {
|
||||||
|
|
|
@ -88,10 +88,7 @@ export default {
|
||||||
.then(
|
.then(
|
||||||
({
|
({
|
||||||
data: {
|
data: {
|
||||||
issuableSetConfidential: {
|
issuableSetConfidential: { errors },
|
||||||
issuable: { confidential },
|
|
||||||
errors,
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}) => {
|
}) => {
|
||||||
if (errors.length) {
|
if (errors.length) {
|
||||||
|
@ -99,7 +96,7 @@ export default {
|
||||||
message: errors[0],
|
message: errors[0],
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
this.$emit('closeForm', { confidential });
|
this.$emit('closeForm');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
|
@ -95,10 +95,10 @@ export default {
|
||||||
confidentialWidget.setConfidentiality = null;
|
confidentialWidget.setConfidentiality = null;
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
closeForm({ confidential } = {}) {
|
closeForm() {
|
||||||
this.$refs.editable.collapse();
|
this.$refs.editable.collapse();
|
||||||
this.$el.dispatchEvent(hideDropdownEvent);
|
this.$el.dispatchEvent(hideDropdownEvent);
|
||||||
this.$emit('closeForm', { confidential });
|
this.$emit('closeForm');
|
||||||
},
|
},
|
||||||
// synchronizing the quick action with the sidebar widget
|
// synchronizing the quick action with the sidebar widget
|
||||||
// this is a temporary solution until we have confidentiality real-time updates
|
// 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 SidebarReferenceWidget from '~/sidebar/components/reference/sidebar_reference_widget.vue';
|
||||||
import SidebarDropdownWidget from '~/sidebar/components/sidebar_dropdown_widget.vue';
|
import SidebarDropdownWidget from '~/sidebar/components/sidebar_dropdown_widget.vue';
|
||||||
import SidebarTodoWidget from '~/sidebar/components/todo_toggle/sidebar_todo_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 trackShowInviteMemberLink from '~/sidebar/track_invite_members';
|
||||||
import { DropdownVariant } from '~/vue_shared/components/sidebar/labels_select_vue/constants';
|
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';
|
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 { IssuableAttributeType } from './constants';
|
||||||
import SidebarMoveIssue from './lib/sidebar_move_issue';
|
import SidebarMoveIssue from './lib/sidebar_move_issue';
|
||||||
import CrmContacts from './components/crm_contacts/crm_contacts.vue';
|
import CrmContacts from './components/crm_contacts/crm_contacts.vue';
|
||||||
import SidebarEventHub from './event_hub';
|
|
||||||
|
|
||||||
Vue.use(Translate);
|
Vue.use(Translate);
|
||||||
Vue.use(VueApollo);
|
Vue.use(VueApollo);
|
||||||
|
@ -360,13 +359,6 @@ function mountConfidentialComponent() {
|
||||||
? IssuableType.Issue
|
? IssuableType.Issue
|
||||||
: IssuableType.MergeRequest,
|
: IssuableType.MergeRequest,
|
||||||
},
|
},
|
||||||
on: {
|
|
||||||
closeForm({ confidential }) {
|
|
||||||
if (confidential !== undefined) {
|
|
||||||
SidebarEventHub.$emit('confidentialityUpdated', confidential);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { GlToast } from '@gitlab/ui';
|
import { GlToast } from '@gitlab/ui';
|
||||||
import { createApolloProvider } from '../../graphql/provider';
|
import { apolloProvider } from '~/graphql_shared/issuable_client';
|
||||||
import WorkItemLinks from './work_item_links.vue';
|
import WorkItemLinks from './work_item_links.vue';
|
||||||
|
|
||||||
Vue.use(GlToast);
|
Vue.use(GlToast);
|
||||||
|
@ -16,18 +16,19 @@ export default function initWorkItemLinks() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const { projectPath, wiHasIssueWeightsFeature } = workItemLinksRoot.dataset;
|
const { projectPath, wiHasIssueWeightsFeature, iid } = workItemLinksRoot.dataset;
|
||||||
|
|
||||||
// eslint-disable-next-line no-new
|
// eslint-disable-next-line no-new
|
||||||
new Vue({
|
new Vue({
|
||||||
el: workItemLinksRoot,
|
el: workItemLinksRoot,
|
||||||
name: 'WorkItemLinksRoot',
|
name: 'WorkItemLinksRoot',
|
||||||
apolloProvider: createApolloProvider(),
|
apolloProvider,
|
||||||
components: {
|
components: {
|
||||||
workItemLinks: WorkItemLinks,
|
workItemLinks: WorkItemLinks,
|
||||||
},
|
},
|
||||||
provide: {
|
provide: {
|
||||||
projectPath,
|
projectPath,
|
||||||
|
iid,
|
||||||
fullPath: projectPath,
|
fullPath: projectPath,
|
||||||
hasIssueWeightsFeature: wiHasIssueWeightsFeature,
|
hasIssueWeightsFeature: wiHasIssueWeightsFeature,
|
||||||
},
|
},
|
||||||
|
|
|
@ -5,9 +5,9 @@ import { s__ } from '~/locale';
|
||||||
import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
|
import { convertToGraphQLId, getIdFromGraphQLId } from '~/graphql_shared/utils';
|
||||||
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
|
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
|
||||||
import { TYPE_WORK_ITEM } from '~/graphql_shared/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 { isMetaKey } from '~/lib/utils/common_utils';
|
||||||
import { setUrlParams, updateHistory } from '~/lib/utils/url_utility';
|
import { setUrlParams, updateHistory } from '~/lib/utils/url_utility';
|
||||||
import SidebarEventHub from '~/sidebar/event_hub';
|
|
||||||
|
|
||||||
import {
|
import {
|
||||||
STATE_OPEN,
|
STATE_OPEN,
|
||||||
|
@ -35,7 +35,7 @@ export default {
|
||||||
directives: {
|
directives: {
|
||||||
GlTooltip: GlTooltipDirective,
|
GlTooltip: GlTooltipDirective,
|
||||||
},
|
},
|
||||||
inject: ['projectPath'],
|
inject: ['projectPath', 'iid'],
|
||||||
props: {
|
props: {
|
||||||
workItemId: {
|
workItemId: {
|
||||||
type: String,
|
type: String,
|
||||||
|
@ -63,6 +63,18 @@ export default {
|
||||||
this.error = e.message || this.$options.i18n.fetchError;
|
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() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -72,9 +84,13 @@ export default {
|
||||||
activeToast: null,
|
activeToast: null,
|
||||||
prefetchedWorkItem: null,
|
prefetchedWorkItem: null,
|
||||||
error: undefined,
|
error: undefined,
|
||||||
|
parentIssue: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
confidential() {
|
||||||
|
return this.parentIssue?.confidential || this.workItem?.confidential || false;
|
||||||
|
},
|
||||||
children() {
|
children() {
|
||||||
return (
|
return (
|
||||||
this.workItem?.widgets.find((widget) => widget.type === WIDGET_TYPE_HIERARCHY)?.children
|
this.workItem?.widgets.find((widget) => widget.type === WIDGET_TYPE_HIERARCHY)?.children
|
||||||
|
@ -84,9 +100,6 @@ export default {
|
||||||
canUpdate() {
|
canUpdate() {
|
||||||
return this.workItem?.userPermissions.updateWorkItem || false;
|
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
|
// Only used for children for now but should be extended later to support parents and siblings
|
||||||
isChildrenEmpty() {
|
isChildrenEmpty() {
|
||||||
return this.children?.length === 0;
|
return this.children?.length === 0;
|
||||||
|
@ -112,16 +125,7 @@ export default {
|
||||||
return this.isLoading && this.children.length === 0 ? '...' : this.children.length;
|
return this.isLoading && this.children.length === 0 ? '...' : this.children.length;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
mounted() {
|
|
||||||
SidebarEventHub.$on('confidentialityUpdated', this.refetchWorkItems);
|
|
||||||
},
|
|
||||||
destroyed() {
|
|
||||||
SidebarEventHub.$off('confidentialityUpdated', this.refetchWorkItems);
|
|
||||||
},
|
|
||||||
methods: {
|
methods: {
|
||||||
refetchWorkItems() {
|
|
||||||
this.$apollo.queries.workItem.refetch();
|
|
||||||
},
|
|
||||||
iconClass(state) {
|
iconClass(state) {
|
||||||
return state === STATE_OPEN ? 'gl-text-green-500' : 'gl-text-blue-500';
|
return state === STATE_OPEN ? 'gl-text-green-500' : 'gl-text-blue-500';
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import Vue from 'vue';
|
import Vue from 'vue';
|
||||||
import { parseBoolean } from '~/lib/utils/common_utils';
|
import { parseBoolean } from '~/lib/utils/common_utils';
|
||||||
|
import { apolloProvider } from '~/graphql_shared/issuable_client';
|
||||||
import App from './components/app.vue';
|
import App from './components/app.vue';
|
||||||
import { createRouter } from './router';
|
import { createRouter } from './router';
|
||||||
import { createApolloProvider } from './graphql/provider';
|
|
||||||
|
|
||||||
export const initWorkItemsRoot = () => {
|
export const initWorkItemsRoot = () => {
|
||||||
const el = document.querySelector('#js-work-items');
|
const el = document.querySelector('#js-work-items');
|
||||||
|
@ -12,7 +12,7 @@ export const initWorkItemsRoot = () => {
|
||||||
el,
|
el,
|
||||||
name: 'WorkItemsRoot',
|
name: 'WorkItemsRoot',
|
||||||
router: createRouter(el.dataset.fullPath),
|
router: createRouter(el.dataset.fullPath),
|
||||||
apolloProvider: createApolloProvider(),
|
apolloProvider,
|
||||||
provide: {
|
provide: {
|
||||||
fullPath,
|
fullPath,
|
||||||
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
|
hasIssueWeightsFeature: parseBoolean(hasIssueWeightsFeature),
|
||||||
|
|
|
@ -41,24 +41,13 @@ module Namespaces
|
||||||
def self_and_descendants(include_self: true)
|
def self_and_descendants(include_self: true)
|
||||||
return super unless use_traversal_ids_for_descendants_scopes?
|
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)
|
||||||
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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self_and_descendant_ids(include_self: true)
|
def self_and_descendant_ids(include_self: true)
|
||||||
return super unless use_traversal_ids_for_descendants_scopes?
|
return super unless use_traversal_ids_for_descendants_scopes?
|
||||||
|
|
||||||
if Feature.enabled?(:traversal_ids_btree)
|
self_and_descendants(include_self: include_self).as_ids
|
||||||
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
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def self_and_hierarchy
|
def self_and_hierarchy
|
||||||
|
@ -181,20 +170,6 @@ module Namespaces
|
||||||
Arel::Nodes::NamedFunction.new('unnest', args)
|
Arel::Nodes::NamedFunction.new('unnest', args)
|
||||||
end
|
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)
|
def superset_cte(base_name)
|
||||||
superset_sql = <<~SQL
|
superset_sql = <<~SQL
|
||||||
SELECT d1.traversal_ids
|
SELECT d1.traversal_ids
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
- if Feature.enabled?(:work_items_hierarchy, @project)
|
- 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
|
### `Configuration validation currently not available` message
|
||||||
|
|
||||||
This message is due to a problem with the syntax validation in the pipeline editor.
|
This message is caused by a problem validating the syntax in the pipeline editor.
|
||||||
If GitLab is unable to communicate with the service that validates the syntax, the
|
It can happen when:
|
||||||
information in these sections may not display properly:
|
|
||||||
|
|
||||||
- The syntax status on the **Edit** tab (valid or invalid).
|
- GitLab is unable to communicate with the service that validates the syntax, so the
|
||||||
- The **Visualize** tab.
|
information in these sections may not display properly:
|
||||||
- The **Lint** tab.
|
|
||||||
- The **View merged YAML** tab.
|
|
||||||
|
|
||||||
You can still work on your CI/CD configuration and commit the changes you made without
|
- The syntax status on the **Edit** tab (valid or invalid).
|
||||||
any issues. As soon as the service becomes available again, the syntax validation
|
- The **Visualize** tab.
|
||||||
should display immediately.
|
- 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).
|
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 warnings
|
||||||
|
|
||||||
Pipeline configuration warnings are shown when you:
|
Pipeline configuration warnings are shown when you:
|
||||||
|
|
|
@ -431,7 +431,7 @@ must be unique. It's advised to use `kebab-case` namespaces.
|
||||||
|
|
||||||
Useful links:
|
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)
|
1. [Vue Style Guide: Keyed v-for](https://vuejs.org/v2/style-guide/#Keyed-v-for-essential)
|
||||||
|
|
||||||
## Vue testing
|
## Vue testing
|
||||||
|
@ -448,10 +448,8 @@ Typically, when testing a Vue component, the component should be "re-mounted" in
|
||||||
To achieve this:
|
To achieve this:
|
||||||
|
|
||||||
1. Create a mutable `wrapper` variable inside the top-level `describe` block.
|
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)/
|
1. Mount the component using [`mount`](https://v1.test-utils.vuejs.org/api/#mount) or [`shallowMount`](https://v1.test-utils.vuejs.org/api/#shallowMount).
|
||||||
[`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. 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:
|
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.
|
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
|
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
|
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
|
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.
|
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
|
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.
|
rules only if you are invoking/instantiating existing code modules.
|
||||||
|
|
||||||
- [`no-new`](https://eslint.org/docs/rules/no-new)
|
- [`no-new`](https://eslint.org/docs/latest/rules/no-new)
|
||||||
- [`class-method-use-this`](https://eslint.org/docs/rules/class-methods-use-this)
|
- [`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
|
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`.
|
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
|
#### 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:**
|
**Examples:**
|
||||||
|
|
||||||
|
@ -57,7 +57,7 @@ For the full list of options, see its
|
||||||
|
|
||||||
#### Banner
|
#### 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:**
|
**Examples:**
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ For the full list of options, see its
|
||||||
|
|
||||||
#### Button
|
#### 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:**
|
**Examples:**
|
||||||
|
|
||||||
|
@ -125,7 +125,7 @@ For the full list of options, see its
|
||||||
|
|
||||||
#### Card
|
#### 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:**
|
**Examples:**
|
||||||
|
|
||||||
|
@ -188,7 +188,7 @@ For the full list of options, see its
|
||||||
|
|
||||||
#### Toggle
|
#### 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
|
```haml
|
||||||
= render Pajamas::ToggleComponent.new(classes: 'js-force-push-toggle',
|
= 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
|
# 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
|
## 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).
|
To achieve this goal we use [Vuex](#vuex).
|
||||||
|
|
||||||
You can also read about this architecture in Vue documentation about
|
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)
|
[state management](https://v2.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).
|
and about [one way data flow](https://v2.vuejs.org/v2/guide/components-props.html#One-Way-Data-Flow).
|
||||||
|
|
||||||
### Components and Store
|
### 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
|
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.
|
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
|
### A folder for the Store
|
||||||
|
|
||||||
|
@ -348,8 +348,7 @@ recommended to observe objects with their own stateful behavior.
|
||||||
|
|
||||||
Based on the Vue guidance:
|
Based on the Vue guidance:
|
||||||
|
|
||||||
- **Do not** use or create a JavaScript class in your [data function](https://v2.vuejs.org/v2/api/#data),
|
- **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** add new JavaScript class implementations.
|
- **Do not** add new JavaScript class implementations.
|
||||||
- **Do** use [GraphQL](../api_graphql_styleguide.md), [Vuex](vuex.md) or a set of components if
|
- **Do** use [GraphQL](../api_graphql_styleguide.md), [Vuex](vuex.md) or a set of components if
|
||||||
cannot use primitives or objects.
|
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
|
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.
|
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
|
Visit the [Vue testing guide](https://v2.vuejs.org/v2/guide/testing.html#Unit-Testing) for help.
|
||||||
testing the rendered output.
|
|
||||||
|
|
||||||
Here's an example of a well structured unit test for [this Vue component](#appendix---vue-component-subject-under-test):
|
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
|
```javascript
|
||||||
wrapper = shallowMount(DropdownItem);
|
wrapper = shallowMount(DropdownItem);
|
||||||
|
|
|
@ -245,7 +245,7 @@ A mutation written like this is easier to maintain. In addition, we avoid errors
|
||||||
### `getters.js`
|
### `getters.js`
|
||||||
|
|
||||||
Sometimes we may need to get derived state based on store state, like filtering for a specific prop.
|
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`:
|
This can be done through the `getters`:
|
||||||
|
|
||||||
```javascript
|
```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).
|
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
|
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
|
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
|
```javascript
|
||||||
import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
|
import SidebarConfidentialityWidget from '~/sidebar/components/confidential/sidebar_confidentiality_widget.vue';
|
||||||
import { apolloProvider } from '~/sidebar/graphql';
|
import { apolloProvider } from '~/graphql_shared/issuable_client';
|
||||||
|
|
||||||
function mountConfidentialComponent() {
|
function mountConfidentialComponent() {
|
||||||
new Vue({
|
new Vue({
|
||||||
|
@ -118,7 +118,7 @@ In this case, we can use a renderless component that imports a client and listen
|
||||||
```javascript
|
```javascript
|
||||||
import { fetchPolicies } from '~/lib/graphql';
|
import { fetchPolicies } from '~/lib/graphql';
|
||||||
import { confidentialityQueries } from '~/sidebar/constants';
|
import { confidentialityQueries } from '~/sidebar/constants';
|
||||||
import { defaultClient as gqlClient } from '~/sidebar/graphql';
|
import { defaultClient as gqlClient } from '~/graphql_shared/issuable_client';
|
||||||
|
|
||||||
created() {
|
created() {
|
||||||
if (this.issuableType !== IssuableType.Issue) {
|
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):
|
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
|
```ruby
|
||||||
shared_examples 'unselected maintainer' do |testcase|
|
RSpec.shared_examples 'unselected maintainer' do |testcase|
|
||||||
it 'user fails to push', testcase: testcase do
|
it 'user fails to push', testcase: testcase do
|
||||||
...
|
...
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'selected developer' do |testcase|
|
RSpec.shared_examples 'selected developer' do |testcase|
|
||||||
it 'user pushes and merges', testcase: testcase do
|
it 'user pushes and merges', testcase: testcase do
|
||||||
...
|
...
|
||||||
end
|
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
|
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).
|
[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).
|
[`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:
|
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
|
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)
|
administrator to [enable the feature flag](../administration/feature_flags.md)
|
||||||
named `integrated_error_tracking`. The feature is not ready for production use.
|
named `integrated_error_tracking`. The feature is not ready for production use.
|
||||||
On GitLab.com, this feature is not available.
|
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.
|
||||||
|
|
||||||
WARNING:
|
|
||||||
Turning on integrated error tracking may impact performance, depending on your error rates.
|
|
||||||
|
|
||||||
Integrated error tracking is a lightweight alternative to Sentry backend.
|
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
|
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)
|
- 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)
|
- 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)
|
- 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)
|
- 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)
|
- 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)
|
- 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
|
# 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
|
Learn how to create a new cluster on Civo Kubernetes through
|
||||||
[Infrastructure as Code (IaC)](../../index.md). This process uses the Civo
|
[Infrastructure as Code (IaC)](../../index.md). This process uses the Civo
|
||||||
|
@ -15,7 +15,7 @@ by using the GitLab agent for Kubernetes.
|
||||||
|
|
||||||
**Prerequisites:**
|
**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.
|
- [A runner](https://docs.gitlab.com/runner/install/) you can use to run the GitLab CI/CD pipeline.
|
||||||
|
|
||||||
**Steps:**
|
**Steps:**
|
||||||
|
@ -64,7 +64,7 @@ Use CI/CD environment variables to configure your project.
|
||||||
|
|
||||||
1. On the left sidebar, select **Settings > CI/CD**.
|
1. On the left sidebar, select **Settings > CI/CD**.
|
||||||
1. Expand **Variables**.
|
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_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.
|
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:
|
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**.
|
- In GitLab: from your project's sidebar, select **Infrastructure > Kubernetes clusters**.
|
||||||
|
|
||||||
## Use your cluster
|
## 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.
|
> [Introduced](https://gitlab.com/groups/gitlab-org/-/epics/2673) in GitLab 13.0.
|
||||||
|
|
||||||
Terraform uses state files to store details about your infrastructure configuration.
|
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.
|
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)
|
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`.
|
`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.
|
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/language/settings/backends/http#configuration-variables) in your CI job,
|
||||||
|
|
||||||
As a workaround, use [http backend configuration variables](https://www.terraform.io/docs/language/settings/backends/http.html#configuration-variables) in your CI job,
|
|
||||||
which is what happens behind the scenes when following the
|
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.
|
[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:
|
must meet one of the following conditions prior to the import:
|
||||||
|
|
||||||
- Have previously logged in to a GitLab account using the GitHub icon.
|
- 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.
|
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
|
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:
|
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 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).
|
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.
|
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.
|
projects, groups, users, issues, merge requests, branches, and repositories.
|
||||||
|
|
||||||
For a full list of features, see the
|
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),
|
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
|
which involves creating an application and then providing the Application ID
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
module Gitlab
|
module Gitlab
|
||||||
module Abuse
|
module Abuse
|
||||||
CONFIDENCE_LEVELS = {
|
CONFIDENCE_LEVELS = {
|
||||||
certain: 1.0,
|
certain: 1.0,
|
||||||
likely: 0.8,
|
likely: 0.8,
|
||||||
uncertain: 0.5,
|
uncertain: 0.5,
|
||||||
unknown: 0.0
|
unknown: 0.0
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
|
|
|
@ -41,9 +41,9 @@ module Gitlab
|
||||||
|
|
||||||
def options
|
def options
|
||||||
{
|
{
|
||||||
"Guest" => GUEST,
|
"Guest" => GUEST,
|
||||||
"Reporter" => REPORTER,
|
"Reporter" => REPORTER,
|
||||||
"Developer" => DEVELOPER,
|
"Developer" => DEVELOPER,
|
||||||
"Maintainer" => MAINTAINER
|
"Maintainer" => MAINTAINER
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -62,9 +62,9 @@ module Gitlab
|
||||||
|
|
||||||
def sym_options
|
def sym_options
|
||||||
{
|
{
|
||||||
guest: GUEST,
|
guest: GUEST,
|
||||||
reporter: REPORTER,
|
reporter: REPORTER,
|
||||||
developer: DEVELOPER,
|
developer: DEVELOPER,
|
||||||
maintainer: MAINTAINER
|
maintainer: MAINTAINER
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
@ -120,9 +120,9 @@ module Gitlab
|
||||||
|
|
||||||
def project_creation_string_options
|
def project_creation_string_options
|
||||||
{
|
{
|
||||||
'noone' => NO_ONE_PROJECT_ACCESS,
|
'noone' => NO_ONE_PROJECT_ACCESS,
|
||||||
'maintainer' => MAINTAINER_PROJECT_ACCESS,
|
'maintainer' => MAINTAINER_PROJECT_ACCESS,
|
||||||
'developer' => DEVELOPER_MAINTAINER_PROJECT_ACCESS
|
'developer' => DEVELOPER_MAINTAINER_PROJECT_ACCESS
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -147,7 +147,7 @@ module Gitlab
|
||||||
|
|
||||||
def subgroup_creation_string_options
|
def subgroup_creation_string_options
|
||||||
{
|
{
|
||||||
'owner' => OWNER_SUBGROUP_ACCESS,
|
'owner' => OWNER_SUBGROUP_ACCESS,
|
||||||
'maintainer' => MAINTAINER_SUBGROUP_ACCESS
|
'maintainer' => MAINTAINER_SUBGROUP_ACCESS
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,39 +16,39 @@ module Gitlab
|
||||||
# and only do that when it's needed.
|
# and only do that when it's needed.
|
||||||
def rate_limits # rubocop:disable Metrics/AbcSize
|
def rate_limits # rubocop:disable Metrics/AbcSize
|
||||||
{
|
{
|
||||||
issues_create: { threshold: -> { application_settings.issues_create_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 },
|
notes_create: { threshold: -> { application_settings.notes_create_limit }, interval: 1.minute },
|
||||||
project_export: { threshold: -> { application_settings.project_export_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_download_export: { threshold: -> { application_settings.project_download_export_limit }, interval: 1.minute },
|
||||||
project_repositories_archive: { threshold: 5, 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_generate_new_export: { threshold: -> { application_settings.project_export_limit }, interval: 1.minute },
|
||||||
project_import: { threshold: -> { application_settings.project_import_limit }, interval: 1.minute },
|
project_import: { threshold: -> { application_settings.project_import_limit }, interval: 1.minute },
|
||||||
project_testing_hook: { threshold: 5, interval: 1.minute },
|
project_testing_hook: { threshold: 5, interval: 1.minute },
|
||||||
play_pipeline_schedule: { threshold: 1, interval: 1.minute },
|
play_pipeline_schedule: { threshold: 1, interval: 1.minute },
|
||||||
raw_blob: { threshold: -> { application_settings.raw_blob_request_limit }, 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_export: { threshold: -> { application_settings.group_export_limit }, interval: 1.minute },
|
||||||
group_download_export: { threshold: -> { application_settings.group_download_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_import: { threshold: -> { application_settings.group_import_limit }, interval: 1.minute },
|
||||||
group_testing_hook: { threshold: 5, interval: 1.minute },
|
group_testing_hook: { threshold: 5, interval: 1.minute },
|
||||||
profile_add_new_email: { threshold: 5, interval: 1.minute },
|
profile_add_new_email: { threshold: 5, interval: 1.minute },
|
||||||
web_hook_calls: { interval: 1.minute },
|
web_hook_calls: { interval: 1.minute },
|
||||||
web_hook_calls_mid: { interval: 1.minute },
|
web_hook_calls_mid: { interval: 1.minute },
|
||||||
web_hook_calls_low: { 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 },
|
users_get_by_id: { threshold: -> { application_settings.users_get_by_id_limit }, interval: 10.minutes },
|
||||||
username_exists: { threshold: 20, interval: 1.minute },
|
username_exists: { threshold: 20, interval: 1.minute },
|
||||||
user_sign_up: { threshold: 20, interval: 1.minute },
|
user_sign_up: { threshold: 20, interval: 1.minute },
|
||||||
user_sign_in: { threshold: 5, interval: 10.minutes },
|
user_sign_in: { threshold: 5, interval: 10.minutes },
|
||||||
profile_resend_email_confirmation: { threshold: 5, interval: 1.minute },
|
profile_resend_email_confirmation: { threshold: 5, interval: 1.minute },
|
||||||
profile_update_username: { threshold: 10, interval: 1.minute },
|
profile_update_username: { threshold: 10, interval: 1.minute },
|
||||||
update_environment_canary_ingress: { threshold: 1, interval: 1.minute },
|
update_environment_canary_ingress: { threshold: 1, interval: 1.minute },
|
||||||
auto_rollback_deployment: { threshold: 1, interval: 3.minutes },
|
auto_rollback_deployment: { threshold: 1, interval: 3.minutes },
|
||||||
search_rate_limit: { threshold: -> { application_settings.search_rate_limit }, interval: 1.minute },
|
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 },
|
search_rate_limit_unauthenticated: { threshold: -> { application_settings.search_rate_limit_unauthenticated }, interval: 1.minute },
|
||||||
gitlab_shell_operation: { threshold: 600, 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 },
|
pipelines_create: { threshold: -> { application_settings.pipeline_limit_per_project_user_sha }, interval: 1.minute },
|
||||||
temporary_email_failure: { threshold: 50, interval: 1.day },
|
temporary_email_failure: { threshold: 50, interval: 1.day },
|
||||||
project_testing_integration: { threshold: 5, interval: 1.minute },
|
project_testing_integration: { threshold: 5, interval: 1.minute },
|
||||||
email_verification: { threshold: 10, interval: 10.minutes },
|
email_verification: { threshold: 10, interval: 10.minutes },
|
||||||
email_verification_code_send: { threshold: 10, interval: 1.hour }
|
email_verification_code_send: { threshold: 10, interval: 1.hour }
|
||||||
}.freeze
|
}.freeze
|
||||||
end
|
end
|
||||||
|
@ -130,16 +130,16 @@ module Gitlab
|
||||||
# @param logger [Logger] Logger to log request to a specific log file. Defaults to Gitlab::AuthLogger
|
# @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)
|
def log_request(request, type, current_user, logger = Gitlab::AuthLogger)
|
||||||
request_information = {
|
request_information = {
|
||||||
message: 'Application_Rate_Limiter_Request',
|
message: 'Application_Rate_Limiter_Request',
|
||||||
env: type,
|
env: type,
|
||||||
remote_ip: request.ip,
|
remote_ip: request.ip,
|
||||||
request_method: request.request_method,
|
request_method: request.request_method,
|
||||||
path: request.fullpath
|
path: request.fullpath
|
||||||
}
|
}
|
||||||
|
|
||||||
if current_user
|
if current_user
|
||||||
request_information.merge!({
|
request_information.merge!({
|
||||||
user_id: current_user.id,
|
user_id: current_user.id,
|
||||||
username: current_user.username
|
username: current_user.username
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,8 +7,8 @@ module Gitlab
|
||||||
class Config
|
class Config
|
||||||
NET_LDAP_ENCRYPTION_METHOD = {
|
NET_LDAP_ENCRYPTION_METHOD = {
|
||||||
simple_tls: :simple_tls,
|
simple_tls: :simple_tls,
|
||||||
start_tls: :start_tls,
|
start_tls: :start_tls,
|
||||||
plain: nil
|
plain: nil
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
attr_accessor :provider, :options
|
attr_accessor :provider, :options
|
||||||
|
@ -193,11 +193,11 @@ module Gitlab
|
||||||
|
|
||||||
def default_attributes
|
def default_attributes
|
||||||
{
|
{
|
||||||
'username' => %W(#{uid} uid sAMAccountName userid).uniq,
|
'username' => %W(#{uid} uid sAMAccountName userid).uniq,
|
||||||
'email' => %w(mail email userPrincipalName),
|
'email' => %w(mail email userPrincipalName),
|
||||||
'name' => 'cn',
|
'name' => 'cn',
|
||||||
'first_name' => 'givenName',
|
'first_name' => 'givenName',
|
||||||
'last_name' => 'sn'
|
'last_name' => 'sn'
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -103,7 +103,7 @@ module Gitlab
|
||||||
|
|
||||||
{
|
{
|
||||||
username: username,
|
username: username,
|
||||||
email: email
|
email: email
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -5,14 +5,14 @@ module Gitlab
|
||||||
module OAuth
|
module OAuth
|
||||||
class Provider
|
class Provider
|
||||||
LABELS = {
|
LABELS = {
|
||||||
"alicloud" => "AliCloud",
|
"alicloud" => "AliCloud",
|
||||||
"dingtalk" => "DingTalk",
|
"dingtalk" => "DingTalk",
|
||||||
"github" => "GitHub",
|
"github" => "GitHub",
|
||||||
"gitlab" => "GitLab.com",
|
"gitlab" => "GitLab.com",
|
||||||
"google_oauth2" => "Google",
|
"google_oauth2" => "Google",
|
||||||
"azure_oauth2" => "Azure AD",
|
"azure_oauth2" => "Azure AD",
|
||||||
"azure_activedirectory_v2" => "Azure AD v2",
|
"azure_activedirectory_v2" => "Azure AD v2",
|
||||||
'atlassian_oauth2' => 'Atlassian'
|
'atlassian_oauth2' => 'Atlassian'
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
def self.authentication(user, provider)
|
def self.authentication(user, provider)
|
||||||
|
|
|
@ -240,11 +240,11 @@ module Gitlab
|
||||||
valid_username = Uniquify.new.string(valid_username) { |s| !NamespacePathValidator.valid_path?(s) }
|
valid_username = Uniquify.new.string(valid_username) { |s| !NamespacePathValidator.valid_path?(s) }
|
||||||
|
|
||||||
{
|
{
|
||||||
name: name.strip.presence || valid_username,
|
name: name.strip.presence || valid_username,
|
||||||
username: valid_username,
|
username: valid_username,
|
||||||
email: email,
|
email: email,
|
||||||
password: auth_hash.password,
|
password: auth_hash.password,
|
||||||
password_confirmation: auth_hash.password,
|
password_confirmation: auth_hash.password,
|
||||||
password_automatically_set: true
|
password_automatically_set: true
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
|
@ -34,7 +34,7 @@ module Gitlab
|
||||||
end
|
end
|
||||||
|
|
||||||
def body
|
def body
|
||||||
{ username: user.username,
|
{ username: user.username,
|
||||||
token_code: @otp_code }
|
token_code: @otp_code }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -212,8 +212,8 @@ module Gitlab
|
||||||
def build_attributes_for_project(project)
|
def build_attributes_for_project(project)
|
||||||
{
|
{
|
||||||
project_id: project.id,
|
project_id: project.id,
|
||||||
shard_id: find_shard_id(project.repository_storage),
|
shard_id: find_shard_id(project.repository_storage),
|
||||||
disk_path: project.disk_path
|
disk_path: project.disk_path
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ class Gitlab::BackgroundMigration::RecalculateVulnerabilitiesOccurrencesUuid # r
|
||||||
development: "a143e9e2-41b3-47bc-9a19-081d089229f4",
|
development: "a143e9e2-41b3-47bc-9a19-081d089229f4",
|
||||||
test: "a143e9e2-41b3-47bc-9a19-081d089229f4",
|
test: "a143e9e2-41b3-47bc-9a19-081d089229f4",
|
||||||
staging: "a6930898-a1b2-4365-ab18-12aa474d9b26",
|
staging: "a6930898-a1b2-4365-ab18-12aa474d9b26",
|
||||||
production: "58dc0f06-936c-43b3-93bb-71693f1b6570"
|
production: "58dc0f06-936c-43b3-93bb-71693f1b6570"
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
NAMESPACE_REGEX = /(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/.freeze
|
NAMESPACE_REGEX = /(\h{8})-(\h{4})-(\h{4})-(\h{4})-(\h{4})(\h{8})/.freeze
|
||||||
|
|
|
@ -19,11 +19,11 @@ module Gitlab
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
STYLE_SWITCHES = {
|
STYLE_SWITCHES = {
|
||||||
bold: 0x01,
|
bold: 0x01,
|
||||||
italic: 0x02,
|
italic: 0x02,
|
||||||
underline: 0x04,
|
underline: 0x04,
|
||||||
conceal: 0x08,
|
conceal: 0x08,
|
||||||
cross: 0x10
|
cross: 0x10
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
def self.convert(ansi, state = nil)
|
def self.convert(ansi, state = nil)
|
||||||
|
|
|
@ -20,11 +20,11 @@ module Gitlab
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
STYLE_SWITCHES = {
|
STYLE_SWITCHES = {
|
||||||
bold: 0x01,
|
bold: 0x01,
|
||||||
italic: 0x02,
|
italic: 0x02,
|
||||||
underline: 0x04,
|
underline: 0x04,
|
||||||
conceal: 0x08,
|
conceal: 0x08,
|
||||||
cross: 0x10
|
cross: 0x10
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
def self.bold?(mask)
|
def self.bold?(mask)
|
||||||
|
|
|
@ -29,7 +29,7 @@ module Gitlab
|
||||||
in: %i[only except start_in],
|
in: %i[only except start_in],
|
||||||
message: 'key may not be used with `rules`'
|
message: 'key may not be used with `rules`'
|
||||||
},
|
},
|
||||||
if: :has_rules?
|
if: :has_rules?
|
||||||
|
|
||||||
with_options allow_nil: true do
|
with_options allow_nil: true do
|
||||||
validates :extends, array_of_strings_or_string: true
|
validates :extends, array_of_strings_or_string: true
|
||||||
|
|
|
@ -8,7 +8,7 @@ module Gitlab
|
||||||
def reserved_claims
|
def reserved_claims
|
||||||
super.merge(
|
super.merge(
|
||||||
iss: Settings.gitlab.base_url,
|
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
|
aud: Settings.gitlab.base_url
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
|
@ -57,7 +57,8 @@ module Gitlab
|
||||||
}.compact
|
}.compact
|
||||||
|
|
||||||
Gitlab::HTTP.post(
|
Gitlab::HTTP.post(
|
||||||
validation_service_url, timeout: validation_service_timeout,
|
validation_service_url,
|
||||||
|
timeout: validation_service_timeout,
|
||||||
headers: headers,
|
headers: headers,
|
||||||
body: validation_service_payload.to_json
|
body: validation_service_payload.to_json
|
||||||
)
|
)
|
||||||
|
|
|
@ -7,13 +7,13 @@ module Gitlab
|
||||||
class Scanner
|
class Scanner
|
||||||
ANALYZER_ORDER = {
|
ANALYZER_ORDER = {
|
||||||
"bundler_audit" => 1,
|
"bundler_audit" => 1,
|
||||||
"retire.js" => 2,
|
"retire.js" => 2,
|
||||||
"gemnasium" => 3,
|
"gemnasium" => 3,
|
||||||
"gemnasium-maven" => 3,
|
"gemnasium-maven" => 3,
|
||||||
"gemnasium-python" => 3,
|
"gemnasium-python" => 3,
|
||||||
"bandit" => 1,
|
"bandit" => 1,
|
||||||
"spotbugs" => 1,
|
"spotbugs" => 1,
|
||||||
"semgrep" => 2
|
"semgrep" => 2
|
||||||
}.freeze
|
}.freeze
|
||||||
|
|
||||||
attr_accessor :external_id, :name, :vendor, :version
|
attr_accessor :external_id, :name, :vendor, :version
|
||||||
|
|
|
@ -18,7 +18,7 @@ module Gitlab
|
||||||
indicator.new(migration.health_context).evaluate
|
indicator.new(migration.health_context).evaluate
|
||||||
rescue StandardError => e
|
rescue StandardError => e
|
||||||
Gitlab::ErrorTracking.track_exception(e, migration_id: migration.id,
|
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})")
|
Signals::Unknown.new(indicator, reason: "unexpected error: #{e.message} (#{e.class})")
|
||||||
end
|
end
|
||||||
|
|
|
@ -114,7 +114,7 @@ module Gitlab
|
||||||
'PostgreSQL on Amazon RDS' => { statement: 'SHOW rds.extensions', error: /PG::UndefinedObject/ },
|
'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
|
# Based on https://cloud.google.com/sql/docs/postgres/flags#postgres-c this should be specific
|
||||||
# to Cloud SQL for PostgreSQL
|
# 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
|
# Based on
|
||||||
# - https://docs.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-extensions
|
# - https://docs.microsoft.com/en-us/azure/postgresql/flexible-server/concepts-extensions
|
||||||
# - https://docs.microsoft.com/en-us/azure/postgresql/concepts-extensions
|
# - https://docs.microsoft.com/en-us/azure/postgresql/concepts-extensions
|
||||||
|
|
|
@ -6,9 +6,9 @@ module Gitlab
|
||||||
class Compare < Base
|
class Compare < Base
|
||||||
def initialize(compare, project:, diff_options:, diff_refs: nil)
|
def initialize(compare, project:, diff_options:, diff_refs: nil)
|
||||||
super(compare,
|
super(compare,
|
||||||
project: project,
|
project: project,
|
||||||
diff_options: diff_options,
|
diff_options: diff_options,
|
||||||
diff_refs: diff_refs)
|
diff_refs: diff_refs)
|
||||||
end
|
end
|
||||||
|
|
||||||
def unfold_diff_lines(positions)
|
def unfold_diff_lines(positions)
|
||||||
|
|
|
@ -20,8 +20,8 @@ module Gitlab
|
||||||
sanitize_exif_if_needed(content, tmp.path)
|
sanitize_exif_if_needed(content, tmp.path)
|
||||||
|
|
||||||
file = {
|
file = {
|
||||||
tempfile: tmp,
|
tempfile: tmp,
|
||||||
filename: attachment.filename,
|
filename: attachment.filename,
|
||||||
content_type: attachment.content_type
|
content_type: attachment.content_type
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2457,9 +2457,6 @@ msgstr ""
|
||||||
msgid "Adjust how frequently the GitLab UI polls for updates."
|
msgid "Adjust how frequently the GitLab UI polls for updates."
|
||||||
msgstr ""
|
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"
|
msgid "Admin"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -14217,6 +14214,9 @@ msgstr ""
|
||||||
msgid "Edit your most recent comment in a thread (from an empty textarea)"
|
msgid "Edit your most recent comment in a thread (from an empty textarea)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Edit your search filter and try again."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Edit, lint, and visualize your pipeline."
|
msgid "Edit, lint, and visualize your pipeline."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -16983,9 +16983,6 @@ msgstr ""
|
||||||
msgid "Geo|Add site"
|
msgid "Geo|Add site"
|
||||||
msgstr ""
|
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"
|
msgid "Geo|All"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -17181,6 +17178,12 @@ msgstr ""
|
||||||
msgid "Geo|Next sync scheduled at"
|
msgid "Geo|Next sync scheduled at"
|
||||||
msgstr ""
|
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"
|
msgid "Geo|No Geo site found"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -17388,6 +17391,9 @@ msgstr ""
|
||||||
msgid "Geo|There are no %{replicable_type} to show"
|
msgid "Geo|There are no %{replicable_type} to show"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "Geo|There are no %{replicable} to show"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "Geo|There was an error deleting the Geo Site"
|
msgid "Geo|There was an error deleting the Geo Site"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -26410,6 +26416,9 @@ msgstr ""
|
||||||
msgid "No results"
|
msgid "No results"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
msgid "No results found"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
msgid "No runner executable"
|
msgid "No runner executable"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -39483,9 +39492,6 @@ msgstr ""
|
||||||
msgid "There are merge conflicts"
|
msgid "There are merge conflicts"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
msgid "There are no %{replicableTypeName} to show"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgid "There are no GPG keys associated with this account."
|
msgid "There are no GPG keys associated with this account."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
@ -45840,6 +45846,9 @@ msgid_plural "changes"
|
||||||
msgstr[0] ""
|
msgstr[0] ""
|
||||||
msgstr[1] ""
|
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}"
|
msgid "ciReport|%{danger_start}%{degradedNum} degraded%{danger_end}, %{same_start}%{sameNum} same%{same_end}, and %{success_start}%{improvedNum} improved%{success_end}"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
|
|
|
@ -177,16 +177,16 @@
|
||||||
"url-loader": "^4.1.1",
|
"url-loader": "^4.1.1",
|
||||||
"uuid": "8.1.0",
|
"uuid": "8.1.0",
|
||||||
"visibilityjs": "^1.2.4",
|
"visibilityjs": "^1.2.4",
|
||||||
"vue": "^2.6.12",
|
"vue": "^2.7.8",
|
||||||
"vue-apollo": "^3.0.7",
|
"vue-apollo": "^3.0.7",
|
||||||
"vue-loader": "^15.9.6",
|
"vue-loader": "^15.10",
|
||||||
"vue-observe-visibility": "^1.0.0",
|
"vue-observe-visibility": "^1.0.0",
|
||||||
"vue-resize": "^1.0.1",
|
"vue-resize": "^1.0.1",
|
||||||
"vue-router": "3.4.9",
|
"vue-router": "3.4.9",
|
||||||
"vue-template-compiler": "^2.6.12",
|
"vue-template-compiler": "^2.7.8",
|
||||||
"vue-virtual-scroll-list": "^1.4.7",
|
"vue-virtual-scroll-list": "^1.4.7",
|
||||||
"vuedraggable": "^2.23.0",
|
"vuedraggable": "^2.23.0",
|
||||||
"vuex": "^3.6.0",
|
"vuex": "^3.6.2",
|
||||||
"web-vitals": "^0.2.4",
|
"web-vitals": "^0.2.4",
|
||||||
"webpack": "^4.46.0",
|
"webpack": "^4.46.0",
|
||||||
"webpack-bundle-analyzer": "^4.5.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::AllureReport.configure!
|
||||||
QA::Runtime::Scenario.from_env(QA::Runtime::Env.runtime_scenario_attributes)
|
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_examples/*.rb")].sort.each { |f| require f }
|
||||||
Dir[::File.join(__dir__, "features/shared_contexts/*.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
|
end
|
||||||
|
|
||||||
config.shared_context_metadata_behavior = :apply_to_host_groups
|
config.shared_context_metadata_behavior = :apply_to_host_groups
|
||||||
config.disable_monkey_patching!
|
|
||||||
config.expose_dsl_globally = true
|
config.expose_dsl_globally = true
|
||||||
config.profile_examples = 10
|
config.profile_examples = 10
|
||||||
config.order = :random
|
config.order = :random
|
||||||
|
|
|
@ -11,6 +11,9 @@ require_relative '../config/bundler_setup'
|
||||||
ENV['GITLAB_ENV'] = 'test'
|
ENV['GITLAB_ENV'] = 'test'
|
||||||
ENV['IN_MEMORY_APPLICATION_SETTINGS'] = 'true'
|
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 'active_support/dependencies'
|
||||||
require_relative '../config/initializers/0_inject_enterprise_edition_module'
|
require_relative '../config/initializers/0_inject_enterprise_edition_module'
|
||||||
require_relative '../config/settings'
|
require_relative '../config/settings'
|
||||||
|
|
|
@ -71,12 +71,7 @@ describe('Sidebar Confidentiality Form', () => {
|
||||||
it('creates a flash if mutation contains errors', async () => {
|
it('creates a flash if mutation contains errors', async () => {
|
||||||
createComponent({
|
createComponent({
|
||||||
mutate: jest.fn().mockResolvedValue({
|
mutate: jest.fn().mockResolvedValue({
|
||||||
data: {
|
data: { issuableSetConfidential: { errors: ['Houston, we have a problem!'] } },
|
||||||
issuableSetConfidential: {
|
|
||||||
issuable: { confidential: false },
|
|
||||||
errors: ['Houston, we have a problem!'],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
findConfidentialToggle().vm.$emit('click', new MouseEvent('click'));
|
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', () => {
|
describe('when issue is not confidential', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
createComponent();
|
createComponent();
|
||||||
|
|
|
@ -132,7 +132,6 @@ describe('Sidebar Confidentiality Widget', () => {
|
||||||
it('closes the form and dispatches an event when `closeForm` is emitted', async () => {
|
it('closes the form and dispatches an event when `closeForm` is emitted', async () => {
|
||||||
createComponent();
|
createComponent();
|
||||||
const el = wrapper.vm.$el;
|
const el = wrapper.vm.$el;
|
||||||
const closeFormPayload = { confidential: true };
|
|
||||||
jest.spyOn(el, 'dispatchEvent');
|
jest.spyOn(el, 'dispatchEvent');
|
||||||
|
|
||||||
await waitForPromises();
|
await waitForPromises();
|
||||||
|
@ -141,12 +140,12 @@ describe('Sidebar Confidentiality Widget', () => {
|
||||||
|
|
||||||
expect(findConfidentialityForm().isVisible()).toBe(true);
|
expect(findConfidentialityForm().isVisible()).toBe(true);
|
||||||
|
|
||||||
findConfidentialityForm().vm.$emit('closeForm', closeFormPayload);
|
findConfidentialityForm().vm.$emit('closeForm');
|
||||||
await nextTick();
|
await nextTick();
|
||||||
expect(findConfidentialityForm().isVisible()).toBe(false);
|
expect(findConfidentialityForm().isVisible()).toBe(false);
|
||||||
|
|
||||||
expect(el.dispatchEvent).toHaveBeenCalled();
|
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 () => {
|
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 { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
|
||||||
import userSearchQuery from '~/graphql_shared/queries/users_search.query.graphql';
|
import userSearchQuery from '~/graphql_shared/queries/users_search.query.graphql';
|
||||||
import currentUserQuery from '~/graphql_shared/queries/current_user.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 InviteMembersTrigger from '~/invite_members/components/invite_members_trigger.vue';
|
||||||
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
|
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
|
||||||
import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
|
import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
|
||||||
import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue';
|
import WorkItemAssignees from '~/work_items/components/work_item_assignees.vue';
|
||||||
import { i18n, TASK_TYPE_NAME, TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
|
import { i18n, TASK_TYPE_NAME, TRACKING_CATEGORY_SHOW } from '~/work_items/constants';
|
||||||
import { temporaryConfig } from '~/work_items/graphql/provider';
|
|
||||||
import {
|
import {
|
||||||
projectMembersResponseWithCurrentUser,
|
projectMembersResponseWithCurrentUser,
|
||||||
mockAssignees,
|
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 workItemQuery from '~/work_items/graphql/work_item.query.graphql';
|
||||||
import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
|
import WorkItemLabels from '~/work_items/components/work_item_labels.vue';
|
||||||
import { i18n } from '~/work_items/constants';
|
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';
|
import { projectLabelsResponse, mockLabels, workItemQueryResponse } from '../mock_data';
|
||||||
|
|
||||||
Vue.use(VueApollo);
|
Vue.use(VueApollo);
|
||||||
|
|
|
@ -4,8 +4,8 @@ import VueApollo from 'vue-apollo';
|
||||||
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
|
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
|
||||||
import createMockApollo from 'helpers/mock_apollo_helper';
|
import createMockApollo from 'helpers/mock_apollo_helper';
|
||||||
import waitForPromises from 'helpers/wait_for_promises';
|
import waitForPromises from 'helpers/wait_for_promises';
|
||||||
import SidebarEventHub from '~/sidebar/event_hub';
|
|
||||||
import { DEFAULT_DEBOUNCE_AND_THROTTLE_MS } from '~/lib/utils/constants';
|
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 WorkItemLinks from '~/work_items/components/work_item_links/work_item_links.vue';
|
||||||
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
|
import workItemQuery from '~/work_items/graphql/work_item.query.graphql';
|
||||||
import changeWorkItemParentMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
|
import changeWorkItemParentMutation from '~/work_items/graphql/update_work_item.mutation.graphql';
|
||||||
|
@ -20,6 +20,20 @@ import {
|
||||||
|
|
||||||
Vue.use(VueApollo);
|
Vue.use(VueApollo);
|
||||||
|
|
||||||
|
const issueConfidentialityResponse = (confidential = false) => ({
|
||||||
|
data: {
|
||||||
|
workspace: {
|
||||||
|
id: '1',
|
||||||
|
__typename: 'Project',
|
||||||
|
issuable: {
|
||||||
|
__typename: 'Issue',
|
||||||
|
id: 'gid://gitlab/Issue/4',
|
||||||
|
confidential,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
describe('WorkItemLinks', () => {
|
describe('WorkItemLinks', () => {
|
||||||
let wrapper;
|
let wrapper;
|
||||||
let mockApollo;
|
let mockApollo;
|
||||||
|
@ -36,18 +50,18 @@ describe('WorkItemLinks', () => {
|
||||||
|
|
||||||
const childWorkItemQueryHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
|
const childWorkItemQueryHandler = jest.fn().mockResolvedValue(workItemQueryResponse);
|
||||||
|
|
||||||
const findChildren = () => wrapper.findAll('[data-testid="links-child"]');
|
|
||||||
|
|
||||||
const createComponent = async ({
|
const createComponent = async ({
|
||||||
data = {},
|
data = {},
|
||||||
fetchHandler = jest.fn().mockResolvedValue(workItemHierarchyResponse),
|
fetchHandler = jest.fn().mockResolvedValue(workItemHierarchyResponse),
|
||||||
mutationHandler = mutationChangeParentHandler,
|
mutationHandler = mutationChangeParentHandler,
|
||||||
|
confidentialQueryHandler = jest.fn().mockResolvedValue(issueConfidentialityResponse()),
|
||||||
} = {}) => {
|
} = {}) => {
|
||||||
mockApollo = createMockApollo(
|
mockApollo = createMockApollo(
|
||||||
[
|
[
|
||||||
[getWorkItemLinksQuery, fetchHandler],
|
[getWorkItemLinksQuery, fetchHandler],
|
||||||
[changeWorkItemParentMutation, mutationHandler],
|
[changeWorkItemParentMutation, mutationHandler],
|
||||||
[workItemQuery, childWorkItemQueryHandler],
|
[workItemQuery, childWorkItemQueryHandler],
|
||||||
|
[issueConfidentialQuery, confidentialQueryHandler],
|
||||||
],
|
],
|
||||||
{},
|
{},
|
||||||
{ addTypename: true },
|
{ addTypename: true },
|
||||||
|
@ -61,6 +75,7 @@ describe('WorkItemLinks', () => {
|
||||||
},
|
},
|
||||||
provide: {
|
provide: {
|
||||||
projectPath: 'project/path',
|
projectPath: 'project/path',
|
||||||
|
iid: '1',
|
||||||
},
|
},
|
||||||
propsData: { issuableId: 1 },
|
propsData: { issuableId: 1 },
|
||||||
apolloProvider: mockApollo,
|
apolloProvider: mockApollo,
|
||||||
|
@ -80,6 +95,7 @@ describe('WorkItemLinks', () => {
|
||||||
const findAddLinksForm = () => wrapper.findByTestId('add-links-form');
|
const findAddLinksForm = () => wrapper.findByTestId('add-links-form');
|
||||||
const findFirstLinksMenu = () => wrapper.findByTestId('links-menu');
|
const findFirstLinksMenu = () => wrapper.findByTestId('links-menu');
|
||||||
const findChildrenCount = () => wrapper.findByTestId('children-count');
|
const findChildrenCount = () => wrapper.findByTestId('children-count');
|
||||||
|
const findChildren = () => wrapper.findAllByTestId('links-child');
|
||||||
|
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await createComponent();
|
await createComponent();
|
||||||
|
@ -167,21 +183,6 @@ describe('WorkItemLinks', () => {
|
||||||
expect(findChildrenCount().text()).toContain('4');
|
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', () => {
|
describe('when no permission to update', () => {
|
||||||
beforeEach(async () => {
|
beforeEach(async () => {
|
||||||
await createComponent({
|
await createComponent({
|
||||||
|
@ -268,4 +269,16 @@ describe('WorkItemLinks', () => {
|
||||||
expect(childWorkItemQueryHandler).not.toHaveBeenCalled();
|
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 workItemTitleSubscription from '~/work_items/graphql/work_item_title.subscription.graphql';
|
||||||
import updateWorkItemMutation from '~/work_items/graphql/update_work_item.mutation.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 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 { useLocalStorageSpy } from 'helpers/local_storage_helper';
|
||||||
import {
|
import {
|
||||||
workItemTitleSubscriptionResponse,
|
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['project_runner_token_expiration_interval']).to be_nil
|
||||||
expect(json_response['max_export_size']).to eq(0)
|
expect(json_response['max_export_size']).to eq(0)
|
||||||
expect(json_response['pipeline_limit_per_project_user_sha']).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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -148,7 +152,11 @@ RSpec.describe API::Settings, 'Settings', :do_not_mock_admin_mode_setting do
|
||||||
user_deactivation_emails_enabled: false,
|
user_deactivation_emails_enabled: false,
|
||||||
admin_mode: true,
|
admin_mode: true,
|
||||||
suggest_pipeline_enabled: false,
|
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)
|
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['user_deactivation_emails_enabled']).to be(false)
|
||||||
expect(json_response['suggest_pipeline_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['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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -53,6 +53,9 @@ end
|
||||||
require 'rainbow/ext/string'
|
require 'rainbow/ext/string'
|
||||||
Rainbow.enabled = false
|
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('../ee/spec/spec_helper') if Gitlab.ee?
|
||||||
require_relative('../jh/spec/spec_helper') if Gitlab.jh?
|
require_relative('../jh/spec/spec_helper') if Gitlab.jh?
|
||||||
|
|
||||||
|
@ -478,8 +481,6 @@ RSpec.configure do |config|
|
||||||
config.before(:each, :js) do
|
config.before(:each, :js) do
|
||||||
allow_any_instance_of(VersionCheck).to receive(:response).and_return({ "severity" => "success" })
|
allow_any_instance_of(VersionCheck).to receive(:response).and_return({ "severity" => "success" })
|
||||||
end
|
end
|
||||||
|
|
||||||
config.disable_monkey_patching!
|
|
||||||
end
|
end
|
||||||
|
|
||||||
ActiveRecord::Migration.maintain_test_schema!
|
ActiveRecord::Migration.maintain_test_schema!
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
# - label
|
# - label
|
||||||
# - **extra
|
# - **extra
|
||||||
|
|
||||||
shared_examples 'Snowplow event tracking' do |overrides: {}|
|
RSpec.shared_examples 'Snowplow event tracking' do |overrides: {}|
|
||||||
let(:extra) { {} }
|
let(:extra) { {} }
|
||||||
|
|
||||||
it 'is not emitted if FF is disabled' do
|
it 'is not emitted if FF is disabled' do
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
# frozen_string_literal: true
|
# 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
|
it 'prevents N+1 queries' do
|
||||||
execute_query # "warm up" to prevent undeterministic counts
|
execute_query # "warm up" to prevent undeterministic counts
|
||||||
expect(graphql_errors).to be_blank # Sanity check - ex falso quodlibet!
|
expect(graphql_errors).to be_blank # Sanity check - ex falso quodlibet!
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
shared_examples 'deployment metrics examples' do
|
RSpec.shared_examples 'deployment metrics examples' do
|
||||||
def create_deployment(args)
|
def create_deployment(args)
|
||||||
project = args[:project]
|
project = args[:project]
|
||||||
environment = project.environments.production.first || create(:environment, :production, project: project)
|
environment = project.environments.production.first || create(:environment, :production, project: project)
|
||||||
|
|
|
@ -144,7 +144,7 @@ RSpec.shared_examples 'cacheable diff collection' do
|
||||||
end
|
end
|
||||||
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) }
|
subject { described_class.new(diffable, **collection_default_args) }
|
||||||
|
|
||||||
describe '#raw_diff_files' do
|
describe '#raw_diff_files' do
|
||||||
|
@ -170,7 +170,7 @@ shared_examples_for 'sortable diff files' do
|
||||||
end
|
end
|
||||||
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) }
|
subject { described_class.new(diffable, **collection_default_args) }
|
||||||
|
|
||||||
describe '#raw_diff_files' do
|
describe '#raw_diff_files' do
|
||||||
|
|
|
@ -265,14 +265,6 @@ RSpec.shared_examples 'namespace traversal scopes' do
|
||||||
|
|
||||||
describe '.self_and_descendants' do
|
describe '.self_and_descendants' do
|
||||||
include_examples '.self_and_descendants'
|
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
|
end
|
||||||
|
|
||||||
shared_examples '.self_and_descendant_ids' do
|
shared_examples '.self_and_descendant_ids' do
|
||||||
|
@ -308,14 +300,6 @@ RSpec.shared_examples 'namespace traversal scopes' do
|
||||||
|
|
||||||
describe '.self_and_descendant_ids' do
|
describe '.self_and_descendant_ids' do
|
||||||
include_examples '.self_and_descendant_ids'
|
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
|
end
|
||||||
|
|
||||||
shared_examples '.self_and_hierarchy' do
|
shared_examples '.self_and_hierarchy' do
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# 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) }
|
let!(:client) { create(:operations_feature_flags_client, project: project) }
|
||||||
|
|
||||||
it 'updates last feature flag updated at' do
|
it 'updates last feature flag updated at' do
|
||||||
|
@ -10,7 +10,7 @@ shared_examples_for 'update feature flag client' do
|
||||||
end
|
end
|
||||||
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) }
|
let!(:client) { create(:operations_feature_flags_client, project: project) }
|
||||||
|
|
||||||
it 'does not update last feature flag updated at' do
|
it 'does not update last feature flag updated at' do
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# 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
|
it 'destroys associated todos asynchronously' do
|
||||||
expect(worker_class)
|
expect(worker_class)
|
||||||
.to receive(:perform_async)
|
.to receive(:perform_async)
|
||||||
|
@ -20,13 +20,13 @@ shared_examples_for 'service scheduling async deletes' do
|
||||||
end
|
end
|
||||||
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
|
it_behaves_like 'service scheduling async deletes' do
|
||||||
let(:worker_class) { TodosDestroyer::DestroyedIssuableWorker }
|
let(:worker_class) { TodosDestroyer::DestroyedIssuableWorker }
|
||||||
end
|
end
|
||||||
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
|
it_behaves_like 'service scheduling async deletes' do
|
||||||
let(:worker_class) { Issuable::LabelLinksDestroyWorker }
|
let(:worker_class) { Issuable::LabelLinksDestroyWorker }
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
shared_examples 'issuable link creation' do
|
RSpec.shared_examples 'issuable link creation' do
|
||||||
describe '#execute' do
|
describe '#execute' do
|
||||||
subject { described_class.new(issuable, user, params).execute }
|
subject { described_class.new(issuable, user, params).execute }
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# 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
|
context 'when successfully removes an issuable link' do
|
||||||
before do
|
before do
|
||||||
issuable_link.source.resource_parent.add_reporter(user)
|
issuable_link.source.resource_parent.add_reporter(user)
|
||||||
|
|
|
@ -24,7 +24,7 @@ RSpec.shared_examples 'checking spam' do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
shared_examples 'invalid params error response' do
|
RSpec.shared_examples 'invalid params error response' do
|
||||||
before do
|
before do
|
||||||
allow_next_instance_of(described_class) do |service|
|
allow_next_instance_of(described_class) do |service|
|
||||||
allow(service).to receive(:valid_params?).and_return false
|
allow(service).to receive(:valid_params?).and_return false
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# frozen_string_literal: true
|
# 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(:category) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_CATEGORY }
|
||||||
let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_ACTION }
|
let(:action) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_ACTION }
|
||||||
let(:label) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_LABEL }
|
let(:label) { Gitlab::UsageDataCounters::IssueActivityUniqueCounter::ISSUE_LABEL }
|
||||||
|
|
107
yarn.lock
107
yarn.lock
|
@ -302,10 +302,10 @@
|
||||||
chalk "^2.0.0"
|
chalk "^2.0.0"
|
||||||
js-tokens "^4.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":
|
"@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.5"
|
version "7.18.11"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.5.tgz#337062363436a893a2d22faa60be5bb37091c83c"
|
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9"
|
||||||
integrity sha512-YZWVaglMiplo7v8f1oMQ5ZPQr0vn7HPeZXxXWsxXJRjGVrzUFn9OxFQl1sb5wzfootjA/yChhW84BV+383FSOw==
|
integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ==
|
||||||
|
|
||||||
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
|
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.17.12":
|
||||||
version "7.17.12"
|
version "7.17.12"
|
||||||
|
@ -2207,20 +2207,30 @@
|
||||||
semver "^6.3.0"
|
semver "^6.3.0"
|
||||||
tsutils "^3.17.1"
|
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":
|
"@vue/component-compiler-utils@^3.1.0":
|
||||||
version "3.1.1"
|
version "3.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.1.tgz#d4ef8f80292674044ad6211e336a302e4d2a6575"
|
resolved "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.3.0.tgz#f9f5fb53464b0c37b2c8d2f3fbfe44df60f61dc9"
|
||||||
integrity sha512-+lN3nsfJJDGMNz7fCpcoYIORrXo0K3OTsdr8jCM7FuqdI4+70TY6gxY6viJ2Xi1clqyPg7LpeOWwjF31vSMmUw==
|
integrity sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==
|
||||||
dependencies:
|
dependencies:
|
||||||
consolidate "^0.15.1"
|
consolidate "^0.15.1"
|
||||||
hash-sum "^1.0.2"
|
hash-sum "^1.0.2"
|
||||||
lru-cache "^4.1.2"
|
lru-cache "^4.1.2"
|
||||||
merge-source-map "^1.1.0"
|
merge-source-map "^1.1.0"
|
||||||
postcss "^7.0.14"
|
postcss "^7.0.36"
|
||||||
postcss-selector-parser "^6.0.2"
|
postcss-selector-parser "^6.0.2"
|
||||||
prettier "^1.18.2"
|
|
||||||
source-map "~0.6.1"
|
source-map "~0.6.1"
|
||||||
vue-template-es2015-compiler "^1.9.0"
|
vue-template-es2015-compiler "^1.9.0"
|
||||||
|
optionalDependencies:
|
||||||
|
prettier "^1.18.2 || ^2.0.0"
|
||||||
|
|
||||||
"@vue/test-utils@1.3.0":
|
"@vue/test-utils@1.3.0":
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
|
@ -2941,9 +2951,9 @@ binaryextensions@2:
|
||||||
integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==
|
integrity sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==
|
||||||
|
|
||||||
bluebird@^3.1.1, bluebird@^3.5.5:
|
bluebird@^3.1.1, bluebird@^3.5.5:
|
||||||
version "3.5.5"
|
version "3.7.2"
|
||||||
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.5.tgz#a8d0afd73251effbbd5fe384a77d73003c17a71f"
|
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||||
integrity sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==
|
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:
|
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.9:
|
||||||
version "4.11.9"
|
version "4.11.9"
|
||||||
|
@ -3968,6 +3978,11 @@ cssstyle@^2.3.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
cssom "~0.3.6"
|
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:
|
custom-jquery-matchers@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/custom-jquery-matchers/-/custom-jquery-matchers-2.1.0.tgz#e5988fa9715c416b0986b372563f872d9e91e024"
|
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:
|
hash-sum@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz#33b40777754c6432573c120cc3808bbd10d47f04"
|
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:
|
hash.js@^1.0.0, hash.js@^1.0.3:
|
||||||
version "1.1.3"
|
version "1.1.3"
|
||||||
|
@ -6277,7 +6292,7 @@ hastscript@^7.0.0:
|
||||||
property-information "^6.0.0"
|
property-information "^6.0.0"
|
||||||
space-separated-tokens "^2.0.0"
|
space-separated-tokens "^2.0.0"
|
||||||
|
|
||||||
he@^1.1.0:
|
he@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
||||||
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
|
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"
|
picocolors "^1.0.0"
|
||||||
source-map-js "^1.0.2"
|
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"
|
version "7.0.39"
|
||||||
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
|
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.39.tgz#9624375d965630e2e1f2c02a935c82a59cb48309"
|
||||||
integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
|
integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==
|
||||||
|
@ -9666,16 +9681,11 @@ pretender@^3.4.3:
|
||||||
fake-xml-http-request "^2.1.1"
|
fake-xml-http-request "^2.1.1"
|
||||||
route-recognizer "^0.3.3"
|
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"
|
version "2.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
|
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
|
||||||
integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
|
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:
|
pretty-format@^26.4.2:
|
||||||
version "26.6.2"
|
version "26.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
|
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:
|
pseudomap@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
|
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:
|
psl@^1.1.33:
|
||||||
version "1.8.0"
|
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:
|
util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
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:
|
util@0.10.3:
|
||||||
version "0.10.3"
|
version "0.10.3"
|
||||||
|
@ -11951,14 +11961,14 @@ vue-functional-data-merge@^3.1.0:
|
||||||
integrity sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==
|
integrity sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==
|
||||||
|
|
||||||
vue-hot-reload-api@^2.3.0:
|
vue-hot-reload-api@^2.3.0:
|
||||||
version "2.3.0"
|
version "2.3.4"
|
||||||
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.0.tgz#97976142405d13d8efae154749e88c4e358cf926"
|
resolved "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz#532955cc1eb208a3d990b3a9f9a70574657e08f2"
|
||||||
integrity sha512-2j/t+wIbyVMP5NvctQoSUvLkYKoWAAk2QlQiilrM2a6/ulzFgdcLUJfTvs4XQ/3eZhHiBmmEojbjmM4AzZj8JA==
|
integrity sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==
|
||||||
|
|
||||||
vue-loader@^15.9.6:
|
vue-loader@^15.10:
|
||||||
version "15.9.6"
|
version "15.10.0"
|
||||||
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.6.tgz#f4bb9ae20c3a8370af3ecf09b8126d38ffdb6b8b"
|
resolved "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.10.0.tgz#2a12695c421a2a2cc2138f05a949d04ed086e38b"
|
||||||
integrity sha512-j0cqiLzwbeImIC6nVIby2o/ABAWhlppyL/m5oJ67R5MloP0hj/DtFgb0Zmq3J9CG7AJ+AXIvHVnJAPBvrLyuDg==
|
integrity sha512-VU6tuO8eKajrFeBzMssFUP9SvakEeeSi1BxdTH5o3+1yUyrldp8IERkSdXlMI2t4kxF2sqYUDsQY+WJBxzBmZg==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@vue/component-compiler-utils" "^3.1.0"
|
"@vue/component-compiler-utils" "^3.1.0"
|
||||||
hash-sum "^1.0.2"
|
hash-sum "^1.0.2"
|
||||||
|
@ -11989,20 +11999,20 @@ vue-runtime-helpers@^1.1.2:
|
||||||
integrity sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q==
|
integrity sha512-pZfGp+PW/IXEOyETE09xQHR1CKkR9HfHZdnMD/FVLUNI+HxYTa82evx5WrF6Kz4s82qtqHvMZ8MZpbk2zT2E1Q==
|
||||||
|
|
||||||
vue-style-loader@^4.1.0:
|
vue-style-loader@^4.1.0:
|
||||||
version "4.1.0"
|
version "4.1.3"
|
||||||
resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.0.tgz#7588bd778e2c9f8d87bfc3c5a4a039638da7a863"
|
resolved "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.3.tgz#6d55863a51fa757ab24e89d9371465072aa7bc35"
|
||||||
integrity sha512-IsSiXDrLW2QIjyBsCqa35e45l5AceMbJ2jO8DxoEQv75xu/UmtXkSC0ybESq/LpbmmIW47MAWDQvErUw+Hrz/A==
|
integrity sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==
|
||||||
dependencies:
|
dependencies:
|
||||||
hash-sum "^1.0.2"
|
hash-sum "^1.0.2"
|
||||||
loader-utils "^1.0.2"
|
loader-utils "^1.0.2"
|
||||||
|
|
||||||
vue-template-compiler@^2.6.12:
|
vue-template-compiler@^2.7.8:
|
||||||
version "2.6.12"
|
version "2.7.8"
|
||||||
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz#947ed7196744c8a5285ebe1233fe960437fcc57e"
|
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.8.tgz#eadd54ed8fbff55b7deb07093a976c07f451a1dc"
|
||||||
integrity sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==
|
integrity sha512-eQqdcUpJKJpBRPDdxCNsqUoT0edNvdt1jFjtVnVS/LPPmr0BU2jWzXlrf6BVMeODtdLewB3j8j3WjNiB+V+giw==
|
||||||
dependencies:
|
dependencies:
|
||||||
de-indent "^1.0.2"
|
de-indent "^1.0.2"
|
||||||
he "^1.1.0"
|
he "^1.2.0"
|
||||||
|
|
||||||
vue-template-es2015-compiler@^1.9.0:
|
vue-template-es2015-compiler@^1.9.0:
|
||||||
version "1.9.1"
|
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"
|
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==
|
integrity sha512-R8bk+k7WMGGoFQ9xF0krGCAlZhQjbJOkDUX+YZD2J+sHQWTzDtmTLS6kiIJToOHK1d/8QPGiD8fd9w0lDP4arg==
|
||||||
|
|
||||||
vue@^2.6.12:
|
vue@^2.7.8:
|
||||||
version "2.6.12"
|
version "2.7.8"
|
||||||
resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.12.tgz#f5ebd4fa6bd2869403e29a896aed4904456c9123"
|
resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.8.tgz#34e06553137611d8cecc4b0cd78b7a59f80b1299"
|
||||||
integrity sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg==
|
integrity sha512-ncwlZx5qOcn754bCu5/tS/IWPhXHopfit79cx+uIlLMyt3vCMGcXai5yCG5y+I6cDmEj4ukRYyZail9FTQh7lQ==
|
||||||
|
dependencies:
|
||||||
|
"@vue/compiler-sfc" "2.7.8"
|
||||||
|
csstype "^3.1.0"
|
||||||
|
|
||||||
vuedraggable@^2.23.0:
|
vuedraggable@^2.23.0:
|
||||||
version "2.23.0"
|
version "2.23.0"
|
||||||
|
@ -12026,10 +12039,10 @@ vuedraggable@^2.23.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
sortablejs "^1.9.0"
|
sortablejs "^1.9.0"
|
||||||
|
|
||||||
vuex@^3.6.0:
|
vuex@^3.6.2:
|
||||||
version "3.6.0"
|
version "3.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.0.tgz#95efa56a58f7607c135b053350833a09e01aa813"
|
resolved "https://registry.yarnpkg.com/vuex/-/vuex-3.6.2.tgz#236bc086a870c3ae79946f107f16de59d5895e71"
|
||||||
integrity sha512-W74OO2vCJPs9/YjNjW8lLbj+jzT24waTo2KShI8jLvJW8OaIkgb3wuAMA7D+ZiUxDOx3ubwSZTaJBip9G8a3aQ==
|
integrity sha512-ETW44IqCgBpVomy520DT5jf8n0zoCac+sxWnn+hMe/CzaSejb/eVw2YToiXYX+Ex/AuHHia28vWTq4goAexFbw==
|
||||||
|
|
||||||
w3c-hr-time@^1.0.2:
|
w3c-hr-time@^1.0.2:
|
||||||
version "1.0.2"
|
version "1.0.2"
|
||||||
|
@ -12432,7 +12445,7 @@ y18n@^5.0.5:
|
||||||
yallist@^2.1.2:
|
yallist@^2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
|
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:
|
yallist@^3.0.2:
|
||||||
version "3.0.3"
|
version "3.0.3"
|
||||||
|
|
Loading…
Reference in New Issue