Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
f1503ea64b
commit
eda321fc0b
|
@ -652,6 +652,7 @@ Style/IfUnlessModifier:
|
|||
- 'ee/app/services/vulnerability_feedback/create_service.rb'
|
||||
- 'ee/app/services/vulnerability_feedback/destroy_service.rb'
|
||||
- 'ee/app/services/vulnerability_feedback_module/update_service.rb'
|
||||
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
|
||||
- 'ee/app/validators/host_validator.rb'
|
||||
- 'ee/app/validators/password/complexity_validator.rb'
|
||||
- 'ee/app/workers/app_sec/dast/profile_schedule_worker.rb'
|
||||
|
|
|
@ -3,17 +3,7 @@
|
|||
Style/Next:
|
||||
Exclude:
|
||||
- 'app/models/concerns/integrations/slack_mattermost_notifier.rb'
|
||||
- 'app/models/preloaders/environments/deployment_preloader.rb'
|
||||
- 'app/models/route.rb'
|
||||
- 'app/services/authorized_project_update/find_records_due_for_refresh_service.rb'
|
||||
- 'app/validators/nested_attributes_duplicates_validator.rb'
|
||||
- 'config/initializers/01_secret_token.rb'
|
||||
- 'config/initializers/sidekiq_cluster.rb'
|
||||
- 'ee/app/controllers/groups/analytics/cycle_analytics/value_streams_controller.rb'
|
||||
- 'ee/app/services/app_sec/dast/profiles/create_associations_service.rb'
|
||||
- 'ee/app/services/elastic/cluster_reindexing_service.rb'
|
||||
- 'ee/app/services/gitlab_subscriptions/fetch_purchase_eligible_namespaces_service.rb'
|
||||
- 'ee/app/services/security/auto_fix_service.rb'
|
||||
- 'ee/app/services/security/ingestion/tasks/update_vulnerability_uuids.rb'
|
||||
- 'ee/db/fixtures/development/20_vulnerabilities.rb'
|
||||
- 'ee/lib/ee/audit/protected_branches_changes_auditor.rb'
|
||||
|
|
|
@ -77,7 +77,7 @@ const mountLegacyCiVariableListApp = (containerEl) => {
|
|||
const {
|
||||
endpoint,
|
||||
projectId,
|
||||
group,
|
||||
isGroup,
|
||||
maskableRegex,
|
||||
protectedByDefault,
|
||||
awsLogoSvgPath,
|
||||
|
@ -89,13 +89,13 @@ const mountLegacyCiVariableListApp = (containerEl) => {
|
|||
maskedEnvironmentVariablesLink,
|
||||
environmentScopeLink,
|
||||
} = containerEl.dataset;
|
||||
const isGroup = parseBoolean(group);
|
||||
const parsedIsGroup = parseBoolean(isGroup);
|
||||
const isProtectedByDefault = parseBoolean(protectedByDefault);
|
||||
|
||||
const store = createStore({
|
||||
endpoint,
|
||||
projectId,
|
||||
isGroup,
|
||||
isGroup: parsedIsGroup,
|
||||
maskableRegex,
|
||||
isProtectedByDefault,
|
||||
awsLogoSvgPath,
|
||||
|
|
|
@ -60,7 +60,7 @@ const renderSideBySide = (domElement) => {
|
|||
|
||||
const updateDiffInstanceRendering = (instance) => {
|
||||
instance.updateOptions({
|
||||
renderSideBySide: renderSideBySide(instance.getDomNode()),
|
||||
renderSideBySide: renderSideBySide(instance.getContainerDomNode()),
|
||||
});
|
||||
};
|
||||
|
||||
|
|
|
@ -26,7 +26,7 @@ export const getBlobLanguage = (blobPath) => {
|
|||
const ext = `.${blobPath.split('.').pop()}`;
|
||||
const language = monacoLanguages
|
||||
.getLanguages()
|
||||
.find((lang) => lang.extensions.indexOf(ext) !== -1);
|
||||
.find((lang) => lang.extensions?.indexOf(ext) >= 0);
|
||||
return language ? language.id : defaultLanguage;
|
||||
};
|
||||
|
||||
|
|
|
@ -184,7 +184,7 @@ export default class Editor {
|
|||
if (!this.isDiffEditorType) return;
|
||||
|
||||
this.instance.updateOptions({
|
||||
renderSideBySide: Editor.renderSideBySide(this.instance.getDomNode()),
|
||||
renderSideBySide: Editor.renderSideBySide(this.instance.getContainerDomNode()),
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import { flatten, isString } from 'lodash';
|
||||
import { languages } from 'monaco-editor';
|
||||
import { setDiagnosticsOptions as yamlDiagnosticsOptions } from 'monaco-yaml';
|
||||
import { performanceMarkAndMeasure } from '~/performance/utils';
|
||||
import { SIDE_LEFT, SIDE_RIGHT } from './constants';
|
||||
|
||||
|
@ -82,17 +83,16 @@ export function registerLanguages(def, ...defs) {
|
|||
}
|
||||
|
||||
export function registerSchema(schema, options = {}) {
|
||||
const defaults = [languages.json.jsonDefaults, languages.yaml.yamlDefaults];
|
||||
defaults.forEach((d) =>
|
||||
d.setDiagnosticsOptions({
|
||||
validate: true,
|
||||
enableSchemaRequest: true,
|
||||
hover: true,
|
||||
completion: true,
|
||||
schemas: [schema],
|
||||
...options,
|
||||
}),
|
||||
);
|
||||
const defaultOptions = {
|
||||
validate: true,
|
||||
enableSchemaRequest: true,
|
||||
hover: true,
|
||||
completion: true,
|
||||
schemas: [schema],
|
||||
...options,
|
||||
};
|
||||
languages.json.jsonDefaults.setDiagnosticsOptions(defaultOptions);
|
||||
yamlDiagnosticsOptions(defaultOptions);
|
||||
}
|
||||
|
||||
export const otherSide = (side) => (side === SIDE_RIGHT ? SIDE_LEFT : SIDE_RIGHT);
|
||||
|
|
|
@ -1,12 +1,5 @@
|
|||
<script>
|
||||
import {
|
||||
GlButton,
|
||||
GlDropdown,
|
||||
GlDropdownItem,
|
||||
GlIcon,
|
||||
GlSafeHtmlDirective,
|
||||
GlSprintf,
|
||||
} from '@gitlab/ui';
|
||||
import { GlDropdown, GlDropdownItem, GlIcon, GlSafeHtmlDirective, GlSprintf } from '@gitlab/ui';
|
||||
import { formatDate } from '~/lib/utils/datetime_utility';
|
||||
import { __ } from '~/locale';
|
||||
import { getEventIcon } from './utils';
|
||||
|
@ -19,7 +12,6 @@ export default {
|
|||
timeUTC: __('%{time} UTC'),
|
||||
},
|
||||
components: {
|
||||
GlButton,
|
||||
GlDropdown,
|
||||
GlDropdownItem,
|
||||
GlIcon,
|
||||
|
@ -58,43 +50,39 @@ export default {
|
|||
};
|
||||
</script>
|
||||
<template>
|
||||
<li
|
||||
class="timeline-entry timeline-entry-vertical-line note system-note note-wrapper gl-my-2! gl-pr-0!"
|
||||
>
|
||||
<div class="gl-display-flex gl-align-items-center">
|
||||
<div
|
||||
class="gl-display-flex gl-align-items-center gl-justify-content-center gl-bg-white gl-text-gray-200 gl-border-gray-100 gl-border-1 gl-border-solid gl-rounded-full gl-mt-n2 gl-mr-3 gl-w-8 gl-h-8 gl-p-3 gl-z-index-1"
|
||||
>
|
||||
<gl-icon :name="getEventIcon(action)" class="note-icon" />
|
||||
</div>
|
||||
<div
|
||||
class="timeline-event-note gl-w-full gl-display-flex gl-flex-direction-row"
|
||||
:class="{ 'gl-pb-3 gl-border-gray-50 gl-border-1 gl-border-b-solid': !isLastItem }"
|
||||
data-testid="event-text-container"
|
||||
>
|
||||
<div>
|
||||
<strong class="gl-font-lg" data-testid="event-time">
|
||||
<gl-sprintf :message="$options.i18n.timeUTC">
|
||||
<template #time>{{ time }}</template>
|
||||
</gl-sprintf>
|
||||
</strong>
|
||||
<div v-safe-html="noteHtml"></div>
|
||||
</div>
|
||||
<gl-dropdown
|
||||
v-if="canUpdate"
|
||||
right
|
||||
class="event-note-actions gl-ml-auto gl-align-self-center"
|
||||
icon="ellipsis_v"
|
||||
text-sr-only
|
||||
:text="$options.i18n.moreActions"
|
||||
category="tertiary"
|
||||
no-caret
|
||||
>
|
||||
<gl-dropdown-item @click="$emit('delete')">
|
||||
<gl-button>{{ $options.i18n.delete }}</gl-button>
|
||||
</gl-dropdown-item>
|
||||
</gl-dropdown>
|
||||
</div>
|
||||
<div class="gl-display-flex gl-align-items-center">
|
||||
<div
|
||||
class="gl-display-flex gl-align-items-center gl-justify-content-center gl-bg-white gl-text-gray-200 gl-border-gray-100 gl-border-1 gl-border-solid gl-rounded-full gl-mt-n2 gl-mr-3 gl-w-8 gl-h-8 gl-p-3 gl-z-index-1"
|
||||
>
|
||||
<gl-icon :name="getEventIcon(action)" class="note-icon" />
|
||||
</div>
|
||||
</li>
|
||||
<div
|
||||
class="timeline-event-note gl-w-full gl-display-flex gl-flex-direction-row"
|
||||
:class="{ 'gl-pb-3 gl-border-gray-50 gl-border-1 gl-border-b-solid': !isLastItem }"
|
||||
data-testid="event-text-container"
|
||||
>
|
||||
<div>
|
||||
<strong class="gl-font-lg" data-testid="event-time">
|
||||
<gl-sprintf :message="$options.i18n.timeUTC">
|
||||
<template #time>{{ time }}</template>
|
||||
</gl-sprintf>
|
||||
</strong>
|
||||
<div v-safe-html="noteHtml"></div>
|
||||
</div>
|
||||
<gl-dropdown
|
||||
v-if="canUpdate"
|
||||
right
|
||||
class="event-note-actions gl-ml-auto gl-align-self-center"
|
||||
icon="ellipsis_v"
|
||||
text-sr-only
|
||||
:text="$options.i18n.moreActions"
|
||||
category="tertiary"
|
||||
no-caret
|
||||
>
|
||||
<gl-dropdown-item @click="$emit('delete')">
|
||||
{{ $options.i18n.delete }}
|
||||
</gl-dropdown-item>
|
||||
</gl-dropdown>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -36,6 +36,7 @@ class JwtController < ApplicationController
|
|||
@authentication_result = Gitlab::Auth.find_for_git_client(login, password, project: nil, ip: request.ip)
|
||||
|
||||
if @authentication_result.failed?
|
||||
log_authentication_failed(login, @authentication_result)
|
||||
render_unauthorized
|
||||
end
|
||||
end
|
||||
|
@ -54,6 +55,19 @@ class JwtController < ApplicationController
|
|||
}, status: :unauthorized
|
||||
end
|
||||
|
||||
def log_authentication_failed(login, result)
|
||||
log_info = {
|
||||
message: 'JWT authentication failed',
|
||||
http_user: login,
|
||||
remote_ip: request.ip,
|
||||
auth_service: params[:service],
|
||||
'auth_result.type': result.type,
|
||||
'auth_result.actor_type': result.actor&.class
|
||||
}.merge(::Gitlab::ApplicationContext.current)
|
||||
|
||||
Gitlab::AuthLogger.warn(log_info)
|
||||
end
|
||||
|
||||
def render_unauthorized
|
||||
render json: {
|
||||
errors: [
|
||||
|
|
|
@ -21,13 +21,13 @@ module Integrations
|
|||
)
|
||||
|
||||
responses.each do |response|
|
||||
unless response.success?
|
||||
log_error('SlackMattermostNotifier HTTP error response',
|
||||
request_host: response.request.uri.host,
|
||||
response_code: response.code,
|
||||
response_body: response.body
|
||||
)
|
||||
end
|
||||
next if response.success?
|
||||
|
||||
log_error('SlackMattermostNotifier HTTP error response',
|
||||
request_host: response.request.uri.host,
|
||||
response_code: response.code,
|
||||
response_body: response.body
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -81,8 +81,8 @@ class PoolRepository < ApplicationRecord
|
|||
object_pool.link(repository.raw)
|
||||
end
|
||||
|
||||
def unlink_repository(repository)
|
||||
repository.disconnect_alternates
|
||||
def unlink_repository(repository, disconnect: true)
|
||||
repository.disconnect_alternates if disconnect
|
||||
|
||||
if member_projects.where.not(id: repository.project.id).exists?
|
||||
true
|
||||
|
|
|
@ -41,11 +41,11 @@ module Preloaders
|
|||
environment.association(association_name).target = associated_deployment
|
||||
environment.association(association_name).loaded!
|
||||
|
||||
if associated_deployment
|
||||
# `last?` in DeploymentEntity requires this environment to be loaded
|
||||
associated_deployment.association(:environment).target = environment
|
||||
associated_deployment.association(:environment).loaded!
|
||||
end
|
||||
next unless associated_deployment
|
||||
|
||||
# `last?` in DeploymentEntity requires this environment to be loaded
|
||||
associated_deployment.association(:environment).target = environment
|
||||
associated_deployment.association(:environment).loaded!
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -2693,7 +2693,12 @@ class Project < ApplicationRecord
|
|||
end
|
||||
|
||||
def leave_pool_repository
|
||||
pool_repository&.unlink_repository(repository) && update_column(:pool_repository_id, nil)
|
||||
return if pool_repository.blank?
|
||||
|
||||
# Disconnecting the repository can be expensive, so let's skip it if
|
||||
# this repository is being deleted anyway.
|
||||
pool_repository.unlink_repository(repository, disconnect: !pending_delete?)
|
||||
update_column(:pool_repository_id, nil)
|
||||
end
|
||||
|
||||
def link_pool_repository
|
||||
|
|
|
@ -39,17 +39,17 @@ class Route < ApplicationRecord
|
|||
attributes[:name] = route.name.sub(name_before_last_save, name)
|
||||
end
|
||||
|
||||
if attributes.present?
|
||||
old_path = route.path
|
||||
next if attributes.empty?
|
||||
|
||||
# Callbacks must be run manually
|
||||
route.update_columns(attributes.merge(updated_at: Time.current))
|
||||
old_path = route.path
|
||||
|
||||
# We are not calling route.delete_conflicting_redirects here, in hopes
|
||||
# of avoiding deadlocks. The parent (self, in this method) already
|
||||
# called it, which deletes conflicts for all descendants.
|
||||
route.create_redirect(old_path) if attributes[:path]
|
||||
end
|
||||
# Callbacks must be run manually
|
||||
route.update_columns(attributes.merge(updated_at: Time.current))
|
||||
|
||||
# We are not calling route.delete_conflicting_redirects here, in hopes
|
||||
# of avoiding deadlocks. The parent (self, in this method) already
|
||||
# called it, which deletes conflicts for all descendants.
|
||||
route.create_redirect(old_path) if attributes[:path]
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -28,31 +28,33 @@ module AuthorizedProjectUpdate
|
|||
current.except!(*projects_with_duplicates)
|
||||
|
||||
remove |= current.each_with_object([]) do |(project_id, row), array|
|
||||
next if fresh[project_id] && fresh[project_id] == row.access_level
|
||||
|
||||
# rows not in the new list or with a different access level should be
|
||||
# removed.
|
||||
if !fresh[project_id] || fresh[project_id] != row.access_level
|
||||
if incorrect_auth_found_callback
|
||||
incorrect_auth_found_callback.call(project_id, row.access_level)
|
||||
end
|
||||
|
||||
array << row.project_id
|
||||
if incorrect_auth_found_callback
|
||||
incorrect_auth_found_callback.call(project_id, row.access_level)
|
||||
end
|
||||
|
||||
array << row.project_id
|
||||
end
|
||||
|
||||
add = fresh.each_with_object([]) do |(project_id, level), array|
|
||||
next if current[project_id] && current[project_id].access_level == level
|
||||
|
||||
# rows not in the old list or with a different access level should be
|
||||
# added.
|
||||
if !current[project_id] || current[project_id].access_level != level
|
||||
if missing_auth_found_callback
|
||||
missing_auth_found_callback.call(project_id, level)
|
||||
end
|
||||
|
||||
array << {
|
||||
user_id: user.id,
|
||||
project_id: project_id,
|
||||
access_level: level
|
||||
}
|
||||
if missing_auth_found_callback
|
||||
missing_auth_found_callback.call(project_id, level)
|
||||
end
|
||||
|
||||
array << {
|
||||
user_id: user.id,
|
||||
project_id: project_id,
|
||||
access_level: level
|
||||
}
|
||||
end
|
||||
|
||||
[remove, add]
|
||||
|
|
|
@ -65,11 +65,10 @@ end
|
|||
|
||||
def set_missing_keys(defaults)
|
||||
defaults.stringify_keys.each_with_object({}) do |(key, default), missing|
|
||||
if Rails.application.secrets[key].blank?
|
||||
warn_missing_secret(key)
|
||||
next if Rails.application.secrets[key].present?
|
||||
|
||||
missing[key] = Rails.application.secrets[key] = default
|
||||
end
|
||||
warn_missing_secret(key)
|
||||
missing[key] = Rails.application.secrets[key] = default
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
require 'openssl'
|
||||
|
||||
# Excon ships its own bundled certs by default. Avoid confusion
|
||||
# by using the same set that GitLab uses.
|
||||
Excon.defaults[:ssl_ca_file] = OpenSSL::X509::DEFAULT_CERT_FILE
|
||||
Excon.defaults[:ssl_verify_peer] = true
|
|
@ -9,22 +9,23 @@ if ENV['ENABLE_SIDEKIQ_CLUSTER']
|
|||
loop do
|
||||
sleep(5)
|
||||
|
||||
next if Process.ppid == parent
|
||||
|
||||
# In cluster mode it's possible that the master process is SIGKILL'd. In
|
||||
# this case the parent PID changes and we need to terminate ourselves.
|
||||
if Process.ppid != parent
|
||||
Process.kill(:TERM, Process.pid)
|
||||
|
||||
# Allow sidekiq to cleanly terminate and push any running jobs back
|
||||
# into the queue. We use the configured timeout and add a small
|
||||
# grace period
|
||||
sleep(Sidekiq.options[:timeout] + 5)
|
||||
Process.kill(:TERM, Process.pid)
|
||||
|
||||
# Signaling the Sidekiq Pgroup as KILL is not forwarded to
|
||||
# a possible child process. In Sidekiq Cluster, all child Sidekiq
|
||||
# processes are PGROUP leaders (each process has its own pgroup).
|
||||
Process.kill(:KILL, 0)
|
||||
break
|
||||
end
|
||||
# Allow sidekiq to cleanly terminate and push any running jobs back
|
||||
# into the queue. We use the configured timeout and add a small
|
||||
# grace period
|
||||
sleep(Sidekiq.options[:timeout] + 5)
|
||||
|
||||
# Signaling the Sidekiq Pgroup as KILL is not forwarded to
|
||||
# a possible child process. In Sidekiq Cluster, all child Sidekiq
|
||||
# processes are PGROUP leaders (each process has its own pgroup).
|
||||
Process.kill(:KILL, 0)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
const { languagesArr } = require('monaco-editor-webpack-plugin/out/languages');
|
||||
|
||||
// monaco-yaml library doesn't play so well with monaco-editor-webpack-plugin
|
||||
// so the only way to include its workers is by patching the list of languages
|
||||
// in monaco-editor-webpack-plugin and adding support for yaml workers. This is
|
||||
// a known issue in the library and this workaround was suggested here:
|
||||
// https://github.com/pengx17/monaco-yaml/issues/20
|
||||
|
||||
const yamlLang = languagesArr.find((t) => t.label === 'yaml');
|
||||
|
||||
yamlLang.entry = [yamlLang.entry, '../../monaco-yaml/lib/esm/monaco.contribution'];
|
||||
yamlLang.worker = {
|
||||
id: 'vs/language/yaml/yamlWorker',
|
||||
entry: '../../monaco-yaml/lib/esm/yaml.worker.js',
|
||||
};
|
||||
|
||||
module.exports = require('monaco-editor-webpack-plugin');
|
|
@ -19,13 +19,13 @@ const webpack = require('webpack');
|
|||
const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer');
|
||||
const { StatsWriterPlugin } = require('webpack-stats-plugin');
|
||||
const WEBPACK_VERSION = require('webpack/package.json').version;
|
||||
const MonacoWebpackPlugin = require('monaco-editor-webpack-plugin');
|
||||
|
||||
const createIncrementalWebpackCompiler = require('./helpers/incremental_webpack_compiler');
|
||||
const IS_EE = require('./helpers/is_ee_env');
|
||||
const IS_JH = require('./helpers/is_jh_env');
|
||||
const vendorDllHash = require('./helpers/vendor_dll_hash');
|
||||
|
||||
const MonacoWebpackPlugin = require('./plugins/monaco_webpack');
|
||||
const GraphqlKnownOperationsPlugin = require('./plugins/graphql_known_operations_plugin');
|
||||
|
||||
const ROOT_PATH = path.resolve(__dirname, '..');
|
||||
|
@ -78,6 +78,20 @@ const incrementalCompiler = createIncrementalWebpackCompiler(
|
|||
INCREMENTAL_COMPILER_TTL,
|
||||
);
|
||||
|
||||
const defaultJsTransformationOptions = {
|
||||
cacheDirectory: path.join(CACHE_PATH, 'babel-loader'),
|
||||
cacheIdentifier: [
|
||||
process.env.BABEL_ENV || process.env.NODE_ENV || 'development',
|
||||
webpack.version,
|
||||
BABEL_VERSION,
|
||||
BABEL_LOADER_VERSION,
|
||||
// Ensure that changing supported browsers will refresh the cache
|
||||
// in order to not pull in outdated files that import core-js
|
||||
SUPPORTED_BROWSERS_HASH,
|
||||
].join('|'),
|
||||
cacheCompression: false,
|
||||
};
|
||||
|
||||
function generateEntries() {
|
||||
// generate automatic entry points
|
||||
const autoEntries = {};
|
||||
|
@ -269,17 +283,23 @@ module.exports = {
|
|||
/node_modules|vendor[\\/]assets/.test(modulePath) && !/\.vue\.js/.test(modulePath),
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
cacheDirectory: path.join(CACHE_PATH, 'babel-loader'),
|
||||
cacheIdentifier: [
|
||||
process.env.BABEL_ENV || process.env.NODE_ENV || 'development',
|
||||
webpack.version,
|
||||
BABEL_VERSION,
|
||||
BABEL_LOADER_VERSION,
|
||||
// Ensure that changing supported browsers will refresh the cache
|
||||
// in order to not pull in outdated files that import core-js
|
||||
SUPPORTED_BROWSERS_HASH,
|
||||
].join('|'),
|
||||
cacheCompression: false,
|
||||
...defaultJsTransformationOptions,
|
||||
},
|
||||
},
|
||||
{
|
||||
test: /\.js$/,
|
||||
include: (modulePath) => /node_modules\/(monaco-|yaml)/.test(modulePath),
|
||||
exclude: (modulePath) =>
|
||||
/node_modules\/(monaco-yaml|monaco-editor\/esm\/vs\/editor\/contrib)/.test(modulePath),
|
||||
loader: 'babel-loader',
|
||||
options: {
|
||||
presets: ['@babel/preset-env'],
|
||||
plugins: [
|
||||
'@babel/plugin-proposal-numeric-separator',
|
||||
'@babel/plugin-syntax-dynamic-import',
|
||||
'@babel/plugin-proposal-optional-chaining',
|
||||
],
|
||||
...defaultJsTransformationOptions,
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -473,7 +493,18 @@ module.exports = {
|
|||
new VueLoaderPlugin(),
|
||||
|
||||
// automatically configure monaco editor web workers
|
||||
new MonacoWebpackPlugin(),
|
||||
new MonacoWebpackPlugin({
|
||||
customLanguages: [
|
||||
{
|
||||
label: 'yaml',
|
||||
entry: 'monaco-yaml',
|
||||
worker: {
|
||||
id: 'monaco-yaml/yamlWorker',
|
||||
entry: 'monaco-yaml/yaml.worker',
|
||||
},
|
||||
},
|
||||
],
|
||||
}),
|
||||
|
||||
new GraphqlKnownOperationsPlugin({ filename: 'graphql_known_operations.yml' }),
|
||||
|
||||
|
|
|
@ -125,40 +125,25 @@ As described in the section on the responsibility of the maintainer below, you
|
|||
are recommended to get your merge request approved and merged by maintainers
|
||||
with [domain expertise](#domain-experts).
|
||||
|
||||
1. If your merge request includes `~backend` changes (*1*), it must be
|
||||
**approved by a [backend maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_backend)**.
|
||||
1. If your merge request includes database migrations or changes to expensive queries (*2*), it must be
|
||||
**approved by a [database maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_database)**.
|
||||
Read the [database review guidelines](database_review.md) for more details.
|
||||
1. If your merge request includes `~frontend` changes (*1*), it must be
|
||||
**approved by a [frontend maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_frontend)**.
|
||||
1. If your merge request includes (`~UX`) user-facing changes (*3*), it must be
|
||||
**approved by a [Product Designer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_UX)**.
|
||||
See the [design and user interface guidelines](contributing/design.md) for details.
|
||||
1. If your merge request includes adding a new JavaScript library (*1*)...
|
||||
- If the library significantly increases the
|
||||
[bundle size](https://gitlab.com/gitlab-org/frontend/playground/webpack-memory-metrics/-/blob/master/doc/report.md), it must
|
||||
be **approved by a [frontend foundations member](https://about.gitlab.com/direction/ecosystem/foundations/)**.
|
||||
- If the license used by the new library hasn't been approved for use in
|
||||
GitLab, the license must be **approved by a [legal department member](https://about.gitlab.com/handbook/legal/)**.
|
||||
More information about license compatibility can be found in our
|
||||
[GitLab Licensing and Compatibility documentation](licensing.md).
|
||||
1. If your merge request includes a new dependency or a file system change, it must be
|
||||
**approved by a [Distribution team member](https://about.gitlab.com/company/team/)**. See how to work with the [Distribution team](https://about.gitlab.com/handbook/engineering/development/enablement/systems/distribution/#how-to-work-with-distribution) for more details.
|
||||
1. If your merge request includes documentation changes, it must be **approved
|
||||
by a [Technical writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments)**,
|
||||
based on assignments in the appropriate [DevOps stage group](https://about.gitlab.com/handbook/product/categories/#devops-stages).
|
||||
1. If your merge request includes changes to development guidelines, follow the [review process](development_processes.md#development-guidelines-review) and get the approvals accordingly.
|
||||
1. If your merge request includes end-to-end **and** non-end-to-end changes (*4*), it must be **approved
|
||||
by a [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors)**.
|
||||
1. If your merge request only includes end-to-end changes (*4*) **or** if the MR author is a [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors), it must be **approved by a [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa)**
|
||||
1. If your merge request includes a new or updated [application limit](https://about.gitlab.com/handbook/product/product-processes/#introducing-application-limits), it must be **approved by a [product manager](https://about.gitlab.com/company/team/)**.
|
||||
1. If your merge request includes Product Intelligence (telemetry or analytics) changes, it should be reviewed and approved by a [Product Intelligence engineer](https://gitlab.com/gitlab-org/analytics-section/product-intelligence/engineers).
|
||||
1. If your merge request includes an addition of, or changes to a [Feature spec](testing_guide/testing_levels.md#frontend-feature-tests), it must be **approved by a [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa) or [Quality reviewer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_qa)**.
|
||||
1. If your merge request introduces a new service to GitLab (Puma, Sidekiq, Gitaly are examples), it must be **approved by a [product manager](https://about.gitlab.com/company/team/)**. See the [process for adding a service component to GitLab](adding_service_component.md) for details.
|
||||
1. If your merge request includes changes related to authentication or authorization, it must be **approved by a [Manage:Authentication and Authorization team member](https://about.gitlab.com/company/team/)**. Check the [code review section on the group page](https://about.gitlab.com/handbook/engineering/development/dev/manage/authentication-and-authorization/#additional-considerations) for more details. Patterns for files known to require review from the team are listed in the in the `Authentication and Authorization` section of the [`CODEOWNERS`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/CODEOWNERS) file, and the team will be listed in the approvers section of all merge requests that modify these files.
|
||||
| If your merge request includes | It must be approved by a |
|
||||
| ------------------------------- | ------------------------ |
|
||||
| `~backend` changes (*1*) | [Backend maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_backend). |
|
||||
| `~database` migrations or changes to expensive queries (*2*) | [Database maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_database). Refer to the [database review guidelines](database_review.md) for more details. |
|
||||
| `~frontend` changes (*1*) | [Frontend maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_frontend). |
|
||||
| `~UX` user-facing changes (*3*) | [Product Designer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_UX). Refer to the [design and user interface guidelines](contributing/design.md) for details. |
|
||||
| Adding a new JavaScript library (*1*) | <ul><li>[Frontend foundations member](https://about.gitlab.com/direction/ecosystem/foundations/) if the library significantly increases the [bundle size](https://gitlab.com/gitlab-org/frontend/playground/webpack-memory-metrics/-/blob/master/doc/report.md)</li><li>A [legal department member](https://about.gitlab.com/handbook/legal/) if the license used by the new library hasn't been approved for use in GitLab</li></ul> More information about license compatibility can be found in our [GitLab Licensing and Compatibility documentation](licensing.md). |
|
||||
| A new dependency or a file system change | [Distribution team member](https://about.gitlab.com/company/team/). See how to work with the [Distribution team](https://about.gitlab.com/handbook/engineering/development/enablement/systems/distribution/#how-to-work-with-distribution) for more details. |
|
||||
| `~documentation` changes | [Technical writer](https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments) based on assignments in the appropriate [DevOps stage group](https://about.gitlab.com/handbook/product/categories/#devops-stages). |
|
||||
| Changes to development guidelines | Follow the [review process](development_processes.md#development-guidelines-review) and get the approvals accordingly. |
|
||||
| End-to-end **and** non-end-to-end changes (*4*) | [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors). |
|
||||
| Only End-to-end changes (*4*) **or** if the MR author is a [Software Engineer in Test](https://about.gitlab.com/handbook/engineering/quality/#individual-contributors) | [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa). |
|
||||
| A new or updated [application limit](https://about.gitlab.com/handbook/product/product-processes/#introducing-application-limits) | [Product manager](https://about.gitlab.com/company/team/). |
|
||||
| Product Intelligence (telemetry or analytics) changes | [Product Intelligence engineer](https://gitlab.com/gitlab-org/analytics-section/product-intelligence/engineers). |
|
||||
| An addition of, or changes to a [Feature spec](testing_guide/testing_levels.md#frontend-feature-tests) | [Quality maintainer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_maintainers_qa) or [Quality reviewer](https://about.gitlab.com/handbook/engineering/projects/#gitlab_reviewers_qa). |
|
||||
| A new service to GitLab (Puma, Sidekiq, Gitaly are examples) | [Product manager](https://about.gitlab.com/company/team/). See the [process for adding a service component to GitLab](adding_service_component.md) for details. |
|
||||
| Changes related to authentication or authorization | [Manage:Authentication and Authorization team member](https://about.gitlab.com/company/team/). Check the [code review section on the group page](https://about.gitlab.com/handbook/engineering/development/dev/manage/authentication-and-authorization/#additional-considerations) for more details. Patterns for files known to require review from the team are listed in the in the `Authentication and Authorization` section of the [`CODEOWNERS`](https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitlab/CODEOWNERS) file, and the team will be listed in the approvers section of all merge requests that modify these files. |
|
||||
|
||||
- (*1*): Specs other than JavaScript specs are considered `~backend` code. Haml markup is considered `~frontend` code. However, Ruby code within Haml templates is considered `~backend` code.
|
||||
- (*1*): Specs other than JavaScript specs are considered `~backend` code. Haml markup is considered `~frontend` code. However, Ruby code within Haml templates is considered `~backend` code. When in doubt, request both a frontend and backend review.
|
||||
- (*2*): We encourage you to seek guidance from a database maintainer if your merge
|
||||
request is potentially introducing expensive queries. It is most efficient to comment
|
||||
on the line of code in question with the SQL queries so they can give their advice.
|
||||
|
|
|
@ -112,6 +112,8 @@ incidents or in-progress change issues, for example:
|
|||
2021-06-29 Canary deployment failing QA tests
|
||||
```
|
||||
|
||||
Before enabling a feature flag, verify that you are not violating any [Production Change Lock periods](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#production-change-lock-pcl) and are in compliance with the [Feature Flags and the Change Management Process](https://about.gitlab.com/handbook/engineering/infrastructure/change-management/#feature-flags-and-the-change-management-process).
|
||||
|
||||
The following `/chatops` commands should be performed in the Slack
|
||||
`#production` channel.
|
||||
|
||||
|
|
|
@ -144,6 +144,8 @@ module.exports = (path, options = {}) => {
|
|||
'three',
|
||||
'monaco-editor',
|
||||
'monaco-yaml',
|
||||
'monaco-marker-data-provider',
|
||||
'monaco-worker-manager',
|
||||
'fast-mersenne-twister',
|
||||
'prosemirror-markdown',
|
||||
'marked',
|
||||
|
|
|
@ -11746,6 +11746,9 @@ msgstr ""
|
|||
msgid "DastConfig|Not enabled"
|
||||
msgstr ""
|
||||
|
||||
msgid "DastProfiles| Profile is currently in-use"
|
||||
msgstr ""
|
||||
|
||||
msgid "DastProfiles|A passive scan monitors all HTTP messages (requests and responses) sent to the target. An active scan attacks the target to find potential vulnerabilities."
|
||||
msgstr ""
|
||||
|
||||
|
@ -11926,6 +11929,9 @@ msgstr ""
|
|||
msgid "DastProfiles|Profile is being used by this on-demand scan"
|
||||
msgstr ""
|
||||
|
||||
msgid "DastProfiles|Profile is currently in-use"
|
||||
msgstr ""
|
||||
|
||||
msgid "DastProfiles|Profile name"
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -139,9 +139,9 @@
|
|||
"mermaid": "^9.1.3",
|
||||
"micromatch": "^4.0.5",
|
||||
"minimatch": "^3.0.4",
|
||||
"monaco-editor": "^0.30.1",
|
||||
"monaco-editor-webpack-plugin": "^6.0.0",
|
||||
"monaco-yaml": "3.0.0",
|
||||
"monaco-editor": "^0.33.0",
|
||||
"monaco-editor-webpack-plugin": "^7.0.1",
|
||||
"monaco-yaml": "4.0.0",
|
||||
"mousetrap": "1.6.5",
|
||||
"papaparse": "^5.3.1",
|
||||
"patch-package": "^6.4.7",
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
module QA
|
||||
module Resource
|
||||
class CiVariable < Base
|
||||
attr_accessor :key, :value, :masked, :protected
|
||||
attr_accessor :key, :value, :masked, :protected, :variable_type
|
||||
|
||||
attribute :project do
|
||||
Project.fabricate! do |resource|
|
||||
|
@ -15,6 +15,7 @@ module QA
|
|||
def initialize
|
||||
@masked = false
|
||||
@protected = false
|
||||
@variable_type = 'env_var'
|
||||
end
|
||||
|
||||
def fabricate!
|
||||
|
@ -55,7 +56,8 @@ module QA
|
|||
key: key,
|
||||
value: value,
|
||||
masked: masked,
|
||||
protected: protected
|
||||
protected: protected,
|
||||
variable_type: variable_type
|
||||
}
|
||||
end
|
||||
end
|
||||
|
|
|
@ -22,6 +22,10 @@ module QA
|
|||
"/projects/#{project.id}/jobs/#{id}"
|
||||
end
|
||||
|
||||
def api_trace_path
|
||||
"#{api_get_path}/trace"
|
||||
end
|
||||
|
||||
def api_post_path
|
||||
end
|
||||
|
||||
|
@ -30,6 +34,11 @@ module QA
|
|||
artifacts: artifacts
|
||||
}
|
||||
end
|
||||
|
||||
# Job log
|
||||
def trace
|
||||
get(request_url(api_trace_path))
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module QA
|
||||
RSpec.describe 'Verify', :runner, feature_flag: {
|
||||
name: 'ci_stop_expanding_file_vars_for_runners',
|
||||
scope: :project
|
||||
} do
|
||||
describe 'Pipeline with project file variables' do
|
||||
let(:executor) { "qa-runner-#{Faker::Alphanumeric.alphanumeric(number: 8)}" }
|
||||
|
||||
let(:project) do
|
||||
Resource::Project.fabricate_via_api! do |project|
|
||||
project.name = 'project-with-file-variables'
|
||||
end
|
||||
end
|
||||
|
||||
let(:runner) do
|
||||
Resource::Runner.fabricate! do |runner|
|
||||
runner.project = project
|
||||
runner.name = executor
|
||||
runner.tags = [executor]
|
||||
end
|
||||
end
|
||||
|
||||
let(:add_ci_file) do
|
||||
Resource::Repository::Commit.fabricate_via_api! do |commit|
|
||||
commit.project = project
|
||||
commit.commit_message = 'Add .gitlab-ci.yml'
|
||||
commit.add_files(
|
||||
[
|
||||
{
|
||||
file_path: '.gitlab-ci.yml',
|
||||
content: <<~YAML
|
||||
variables:
|
||||
EXTRA_ARGS: "-f $TEST_FILE"
|
||||
DOCKER_REMOTE_ARGS: --tlscacert="$DOCKER_CA_CERT"
|
||||
EXTRACTED_CRT_FILE: ${DOCKER_CA_CERT}.crt
|
||||
MY_FILE_VAR: $TEST_FILE
|
||||
|
||||
test:
|
||||
tags: [#{executor}]
|
||||
script:
|
||||
- echo "run something $EXTRA_ARGS"
|
||||
- echo "docker run $DOCKER_REMOTE_ARGS"
|
||||
- echo "run --output=$EXTRACTED_CRT_FILE"
|
||||
- echo "Will read private key from $MY_FILE_VAR"
|
||||
YAML
|
||||
}
|
||||
]
|
||||
)
|
||||
end
|
||||
end
|
||||
|
||||
let(:add_file_variables) do
|
||||
{
|
||||
'TEST_FILE' => 'hello, this is test',
|
||||
'DOCKER_CA_CERT' => 'This is secret'
|
||||
}.each do |file_name, content|
|
||||
add_file_variable_to_project(file_name, content)
|
||||
end
|
||||
end
|
||||
|
||||
after do
|
||||
runner.remove_via_api!
|
||||
end
|
||||
|
||||
shared_examples 'variables are read correctly' do
|
||||
it 'shows in job log accordingly' do
|
||||
job = Resource::Job.fabricate_via_api! do |job|
|
||||
job.project = project
|
||||
job.id = project.job_by_name('test')[:id]
|
||||
end
|
||||
|
||||
aggregate_failures do
|
||||
trace = job.trace
|
||||
expect(trace).to have_content('run something -f hello, this is test')
|
||||
expect(trace).to have_content('docker run --tlscacert="This is secret"')
|
||||
expect(trace).to have_content('run --output=This is secret.crt')
|
||||
expect(trace).to have_content('Will read private key from hello, this is test')
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# FF does not change current behavior
|
||||
# https://gitlab.com/gitlab-org/gitlab/-/merge_requests/94198#note_1057609893
|
||||
#
|
||||
# TODO: Remove when FF is removed
|
||||
# TODO: Archive testcase issue when FF is removed
|
||||
# Rollout issue: https://gitlab.com/gitlab-org/gitlab/-/issues/369907
|
||||
context 'when FF is on', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/370787' do
|
||||
before do
|
||||
Runtime::Feature.enable(:ci_stop_expanding_file_vars_for_runners, project: project)
|
||||
|
||||
runner
|
||||
add_file_variables
|
||||
add_ci_file
|
||||
trigger_pipeline
|
||||
wait_for_pipeline
|
||||
end
|
||||
|
||||
it_behaves_like 'variables are read correctly'
|
||||
end
|
||||
|
||||
# TODO: Refactor when FF is removed
|
||||
# TODO: Update testcase issue title and description to not refer to FF status
|
||||
context 'when FF is off', testcase: 'https://gitlab.com/gitlab-org/gitlab/-/quality/test_cases/370791' do
|
||||
before do
|
||||
runner
|
||||
add_file_variables
|
||||
add_ci_file
|
||||
trigger_pipeline
|
||||
wait_for_pipeline
|
||||
end
|
||||
|
||||
it_behaves_like 'variables are read correctly'
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def add_file_variable_to_project(key, value)
|
||||
Resource::CiVariable.fabricate_via_api! do |ci_variable|
|
||||
ci_variable.project = project
|
||||
ci_variable.key = key
|
||||
ci_variable.value = value
|
||||
ci_variable.variable_type = 'file'
|
||||
end
|
||||
end
|
||||
|
||||
def trigger_pipeline
|
||||
Resource::Pipeline.fabricate_via_api! do |pipeline|
|
||||
pipeline.project = project
|
||||
end
|
||||
end
|
||||
|
||||
def wait_for_pipeline
|
||||
Support::Waiter.wait_until do
|
||||
project.pipelines.present? && project.pipelines.first[:status] == 'success'
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -8,10 +8,8 @@ import 'monaco-editor/esm/vs/language/css/monaco.contribution';
|
|||
import 'monaco-editor/esm/vs/language/json/monaco.contribution';
|
||||
import 'monaco-editor/esm/vs/language/html/monaco.contribution';
|
||||
import 'monaco-editor/esm/vs/basic-languages/monaco.contribution';
|
||||
import 'monaco-yaml/lib/esm/monaco.contribution';
|
||||
|
||||
// This language starts trying to spin up web workers which obviously breaks in Jest environment
|
||||
jest.mock('monaco-editor/esm/vs/language/typescript/tsMode');
|
||||
jest.mock('monaco-yaml/lib/esm/yamlMode');
|
||||
|
||||
export * from 'monaco-editor/esm/vs/editor/editor.api';
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
const setDiagnosticsOptions = jest.fn();
|
||||
const yamlDefaults = {};
|
||||
|
||||
export { setDiagnosticsOptions, yamlDefaults };
|
|
@ -1,4 +1,4 @@
|
|||
import { languages } from 'monaco-editor';
|
||||
import { setDiagnosticsOptions } from 'monaco-yaml';
|
||||
import { setHTMLFixture, resetHTMLFixture } from 'helpers/fixtures';
|
||||
import { TEST_HOST } from 'helpers/test_constants';
|
||||
import { CiSchemaExtension } from '~/editor/extensions/source_editor_ci_schema_ext';
|
||||
|
@ -52,16 +52,12 @@ describe('~/editor/editor_ci_config_ext', () => {
|
|||
});
|
||||
|
||||
describe('registerCiSchema', () => {
|
||||
beforeEach(() => {
|
||||
jest.spyOn(languages.yaml.yamlDefaults, 'setDiagnosticsOptions');
|
||||
});
|
||||
|
||||
describe('register validations options with monaco for yaml language', () => {
|
||||
const mockProjectNamespace = 'namespace1';
|
||||
const mockProjectPath = 'project1';
|
||||
|
||||
const getConfiguredYmlSchema = () => {
|
||||
return languages.yaml.yamlDefaults.setDiagnosticsOptions.mock.calls[0][0].schemas[0];
|
||||
return setDiagnosticsOptions.mock.calls[0][0].schemas[0];
|
||||
};
|
||||
|
||||
it('with expected basic validation configuration', () => {
|
||||
|
@ -77,8 +73,8 @@ describe('~/editor/editor_ci_config_ext', () => {
|
|||
completion: true,
|
||||
};
|
||||
|
||||
expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledTimes(1);
|
||||
expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledWith(
|
||||
expect(setDiagnosticsOptions).toHaveBeenCalledTimes(1);
|
||||
expect(setDiagnosticsOptions).toHaveBeenCalledWith(
|
||||
expect.objectContaining(expectedOptions),
|
||||
);
|
||||
});
|
||||
|
|
|
@ -76,9 +76,9 @@ describe('Markdown Live Preview Extension for Source Editor', () => {
|
|||
actions: expect.any(Object),
|
||||
shown: false,
|
||||
modelChangeListener: undefined,
|
||||
layoutChangeListener: {
|
||||
layoutChangeListener: expect.objectContaining({
|
||||
dispose: expect.anything(),
|
||||
},
|
||||
}),
|
||||
path: previewMarkdownPath,
|
||||
actionShowPreviewCondition: expect.any(Object),
|
||||
});
|
||||
|
|
|
@ -16,14 +16,6 @@ describe('Multi-file editor library', () => {
|
|||
let holder;
|
||||
let store;
|
||||
|
||||
const setNodeOffsetWidth = (val) => {
|
||||
Object.defineProperty(instance.instance.getDomNode(), 'offsetWidth', {
|
||||
get() {
|
||||
return val;
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
store = createStore();
|
||||
el = document.createElement('div');
|
||||
|
@ -272,6 +264,13 @@ describe('Multi-file editor library', () => {
|
|||
});
|
||||
|
||||
describe('updateDiffView', () => {
|
||||
const setDiffNodeOffsetWidth = (val) => {
|
||||
Object.defineProperty(instance.instance.getContainerDomNode(), 'offsetWidth', {
|
||||
get() {
|
||||
return val;
|
||||
},
|
||||
});
|
||||
};
|
||||
describe('edit mode', () => {
|
||||
it('does not update options', () => {
|
||||
instance.createInstance(holder);
|
||||
|
@ -292,7 +291,7 @@ describe('Multi-file editor library', () => {
|
|||
});
|
||||
|
||||
it('sets renderSideBySide to false if el is less than 700 pixels', () => {
|
||||
setNodeOffsetWidth(600);
|
||||
setDiffNodeOffsetWidth(600);
|
||||
|
||||
expect(instance.instance.updateOptions).not.toHaveBeenCalledWith({
|
||||
renderSideBySide: false,
|
||||
|
@ -300,7 +299,7 @@ describe('Multi-file editor library', () => {
|
|||
});
|
||||
|
||||
it('sets renderSideBySide to false if el is more than 700 pixels', () => {
|
||||
setNodeOffsetWidth(800);
|
||||
setDiffNodeOffsetWidth(800);
|
||||
|
||||
expect(instance.instance.updateOptions).not.toHaveBeenCalledWith({
|
||||
renderSideBySide: true,
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { languages } from 'monaco-editor';
|
||||
import { setDiagnosticsOptions as yamlDiagnosticsOptions } from 'monaco-yaml';
|
||||
import {
|
||||
isTextFile,
|
||||
registerLanguages,
|
||||
|
@ -203,7 +204,6 @@ describe('WebIDE utils', () => {
|
|||
};
|
||||
|
||||
jest.spyOn(languages.json.jsonDefaults, 'setDiagnosticsOptions');
|
||||
jest.spyOn(languages.yaml.yamlDefaults, 'setDiagnosticsOptions');
|
||||
});
|
||||
|
||||
it('registers the given schemas with monaco for both json and yaml languages', () => {
|
||||
|
@ -212,7 +212,7 @@ describe('WebIDE utils', () => {
|
|||
expect(languages.json.jsonDefaults.setDiagnosticsOptions).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ schemas: [schema] }),
|
||||
);
|
||||
expect(languages.yaml.yamlDefaults.setDiagnosticsOptions).toHaveBeenCalledWith(
|
||||
expect(yamlDiagnosticsOptions).toHaveBeenCalledWith(
|
||||
expect.objectContaining({ schemas: [schema] }),
|
||||
);
|
||||
});
|
||||
|
|
|
@ -125,3 +125,8 @@ export const mockGetTimelineData = {
|
|||
},
|
||||
},
|
||||
};
|
||||
|
||||
export const fakeDate = '2020-07-08T00:00:00.000Z';
|
||||
|
||||
const { id, note, occurredAt } = mockEvents[0];
|
||||
export const fakeEventData = { id, note, occurredAt };
|
||||
|
|
|
@ -3,16 +3,21 @@ import VueApollo from 'vue-apollo';
|
|||
import Vue from 'vue';
|
||||
import { confirmAction } from '~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal';
|
||||
import IncidentTimelineEventList from '~/issues/show/components/incidents/timeline_events_list.vue';
|
||||
import IncidentTimelineEventListItem from '~/issues/show/components/incidents/timeline_events_item.vue';
|
||||
import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
|
||||
import IncidentTimelineEventItem from '~/issues/show/components/incidents/timeline_events_item.vue';
|
||||
import { mountExtended } from 'helpers/vue_test_utils_helper';
|
||||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import deleteTimelineEventMutation from '~/issues/show/components/incidents/graphql/queries/delete_timeline_event.mutation.graphql';
|
||||
import getTimelineEvents from '~/issues/show/components/incidents/graphql/queries/get_timeline_events.query.graphql';
|
||||
import createMockApollo from 'helpers/mock_apollo_helper';
|
||||
import { useFakeDate } from 'helpers/fake_date';
|
||||
import { createAlert } from '~/flash';
|
||||
import {
|
||||
mockEvents,
|
||||
timelineEventsDeleteEventResponse,
|
||||
timelineEventsDeleteEventError,
|
||||
fakeDate,
|
||||
fakeEventData,
|
||||
timelineEventsQueryListResponse,
|
||||
} from './mock_data';
|
||||
|
||||
Vue.use(VueApollo);
|
||||
|
@ -20,58 +25,61 @@ Vue.use(VueApollo);
|
|||
jest.mock('~/flash');
|
||||
jest.mock('~/lib/utils/confirm_via_gl_modal/confirm_via_gl_modal');
|
||||
|
||||
const deleteEventResponse = jest.fn();
|
||||
|
||||
function createMockApolloProvider() {
|
||||
deleteEventResponse.mockResolvedValue(timelineEventsDeleteEventResponse);
|
||||
const requestHandlers = [[deleteTimelineEventMutation, deleteEventResponse]];
|
||||
return createMockApollo(requestHandlers);
|
||||
}
|
||||
|
||||
const mockConfirmAction = ({ confirmed }) => {
|
||||
confirmAction.mockResolvedValueOnce(confirmed);
|
||||
};
|
||||
|
||||
describe('IncidentTimelineEventList', () => {
|
||||
useFakeDate(fakeDate);
|
||||
let wrapper;
|
||||
const responseSpy = jest.fn().mockResolvedValue(timelineEventsDeleteEventResponse);
|
||||
|
||||
const mountComponent = (mockApollo) => {
|
||||
const apollo = mockApollo ? { apolloProvider: mockApollo } : {};
|
||||
const requestHandlers = [[deleteTimelineEventMutation, responseSpy]];
|
||||
const apolloProvider = createMockApollo(requestHandlers);
|
||||
|
||||
wrapper = shallowMountExtended(IncidentTimelineEventList, {
|
||||
provide: {
|
||||
fullPath: 'group/project',
|
||||
issuableId: '1',
|
||||
},
|
||||
apolloProvider.clients.defaultClient.cache.writeQuery({
|
||||
query: getTimelineEvents,
|
||||
data: timelineEventsQueryListResponse.data,
|
||||
variables: {
|
||||
fullPath: 'group/project',
|
||||
incidentId: 'gid://gitlab/Issue/1',
|
||||
},
|
||||
});
|
||||
|
||||
const mountComponent = () => {
|
||||
wrapper = mountExtended(IncidentTimelineEventList, {
|
||||
propsData: {
|
||||
timelineEvents: mockEvents,
|
||||
},
|
||||
...apollo,
|
||||
provide: {
|
||||
fullPath: 'group/project',
|
||||
issuableId: '1',
|
||||
canUpdate: true,
|
||||
},
|
||||
apolloProvider,
|
||||
});
|
||||
};
|
||||
|
||||
const findTimelineEventGroups = () => wrapper.findAllByTestId('timeline-group');
|
||||
const findItems = (base = wrapper) => base.findAll(IncidentTimelineEventListItem);
|
||||
const findItems = (base = wrapper) => base.findAll(IncidentTimelineEventItem);
|
||||
const findFirstTimelineEventGroup = () => findTimelineEventGroups().at(0);
|
||||
const findSecondTimelineEventGroup = () => findTimelineEventGroups().at(1);
|
||||
const findDates = () => wrapper.findAllByTestId('event-date');
|
||||
const clickFirstDeleteButton = async () => {
|
||||
findItems()
|
||||
.at(0)
|
||||
.vm.$emit('delete', { ...mockEvents[0] });
|
||||
findItems().at(0).vm.$emit('delete', { fakeEventData });
|
||||
await waitForPromises();
|
||||
};
|
||||
|
||||
beforeEach(() => {
|
||||
mountComponent();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
confirmAction.mockReset();
|
||||
deleteEventResponse.mockReset();
|
||||
wrapper.destroy();
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
it('groups items correctly', () => {
|
||||
mountComponent();
|
||||
|
||||
expect(findTimelineEventGroups()).toHaveLength(2);
|
||||
|
||||
expect(findItems(findFirstTimelineEventGroup())).toHaveLength(1);
|
||||
|
@ -79,24 +87,18 @@ describe('IncidentTimelineEventList', () => {
|
|||
});
|
||||
|
||||
it('sets the isLastItem prop correctly', () => {
|
||||
mountComponent();
|
||||
|
||||
expect(findItems().at(0).props('isLastItem')).toBe(false);
|
||||
expect(findItems().at(1).props('isLastItem')).toBe(false);
|
||||
expect(findItems().at(2).props('isLastItem')).toBe(true);
|
||||
});
|
||||
|
||||
it('sets the event props correctly', () => {
|
||||
mountComponent();
|
||||
|
||||
expect(findItems().at(1).props('occurredAt')).toBe(mockEvents[1].occurredAt);
|
||||
expect(findItems().at(1).props('action')).toBe(mockEvents[1].action);
|
||||
expect(findItems().at(1).props('noteHtml')).toBe(mockEvents[1].noteHtml);
|
||||
});
|
||||
|
||||
it('formats dates correctly', () => {
|
||||
mountComponent();
|
||||
|
||||
expect(findDates().at(0).text()).toBe('2022-03-22');
|
||||
expect(findDates().at(1).text()).toBe('2022-03-23');
|
||||
});
|
||||
|
@ -110,8 +112,6 @@ describe('IncidentTimelineEventList', () => {
|
|||
describe(timezone, () => {
|
||||
beforeEach(() => {
|
||||
timezoneMock.register(timezone);
|
||||
|
||||
mountComponent();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
|
@ -131,12 +131,9 @@ describe('IncidentTimelineEventList', () => {
|
|||
|
||||
it('should delete when button is clicked', async () => {
|
||||
const expectedVars = { input: { id: mockEvents[0].id } };
|
||||
|
||||
mountComponent(createMockApolloProvider());
|
||||
|
||||
await clickFirstDeleteButton();
|
||||
|
||||
expect(deleteEventResponse).toHaveBeenCalledWith(expectedVars);
|
||||
expect(responseSpy).toHaveBeenCalledWith(expectedVars);
|
||||
});
|
||||
|
||||
it('should show an error when delete returns an error', async () => {
|
||||
|
@ -144,8 +141,7 @@ describe('IncidentTimelineEventList', () => {
|
|||
message: 'Error deleting incident timeline event: Item does not exist',
|
||||
};
|
||||
|
||||
mountComponent(createMockApolloProvider());
|
||||
deleteEventResponse.mockResolvedValue(timelineEventsDeleteEventError);
|
||||
responseSpy.mockResolvedValue(timelineEventsDeleteEventError);
|
||||
|
||||
await clickFirstDeleteButton();
|
||||
|
||||
|
@ -158,8 +154,7 @@ describe('IncidentTimelineEventList', () => {
|
|||
error: new Error(),
|
||||
message: 'Something went wrong while deleting the incident timeline event.',
|
||||
};
|
||||
mountComponent(createMockApolloProvider());
|
||||
deleteEventResponse.mockRejectedValueOnce();
|
||||
responseSpy.mockRejectedValueOnce();
|
||||
|
||||
await clickFirstDeleteButton();
|
||||
|
||||
|
|
|
@ -43,6 +43,15 @@ RSpec.describe PoolRepository do
|
|||
end
|
||||
end
|
||||
|
||||
context 'when skipping disconnect' do
|
||||
it 'does not change the alternates file' do
|
||||
before = File.read(alternates_file)
|
||||
pool.unlink_repository(pool.source_project.repository, disconnect: false)
|
||||
|
||||
expect(File.read(alternates_file)).to eq(before)
|
||||
end
|
||||
end
|
||||
|
||||
context 'when the second member leaves' do
|
||||
it 'does not schedule pool removal' do
|
||||
other_project = create(:project, :repository, pool_repository: pool)
|
||||
|
|
|
@ -6624,11 +6624,27 @@ RSpec.describe Project, factory_default: :keep do
|
|||
let(:pool) { create(:pool_repository) }
|
||||
let(:project) { create(:project, :repository, pool_repository: pool) }
|
||||
|
||||
it 'removes the membership' do
|
||||
project.leave_pool_repository
|
||||
subject { project.leave_pool_repository }
|
||||
|
||||
it 'removes the membership and disconnects alternates' do
|
||||
expect(pool).to receive(:unlink_repository).with(project.repository, disconnect: true).and_call_original
|
||||
|
||||
subject
|
||||
|
||||
expect(pool.member_projects.reload).not_to include(project)
|
||||
end
|
||||
|
||||
context 'when the project is pending delete' do
|
||||
it 'removes the membership and does not disconnect alternates' do
|
||||
project.pending_delete = true
|
||||
|
||||
expect(pool).to receive(:unlink_repository).with(project.repository, disconnect: false).and_call_original
|
||||
|
||||
subject
|
||||
|
||||
expect(pool.member_projects.reload).not_to include(project)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#check_personal_projects_limit' do
|
||||
|
|
|
@ -27,6 +27,10 @@ RSpec.describe JwtController do
|
|||
let(:headers) { { authorization: credentials('personal_access_token', pat.token) } }
|
||||
|
||||
it 'fails authentication' do
|
||||
expect(::Gitlab::AuthLogger).to receive(:warn).with(
|
||||
hash_including(message: 'JWT authentication failed',
|
||||
http_user: 'personal_access_token')).and_call_original
|
||||
|
||||
get '/jwt/auth', params: parameters, headers: headers
|
||||
|
||||
expect(response).to have_gitlab_http_status(:unauthorized)
|
||||
|
|
104
yarn.lock
104
yarn.lock
|
@ -2027,10 +2027,10 @@
|
|||
jest-matcher-utils "^27.0.0"
|
||||
pretty-format "^27.0.0"
|
||||
|
||||
"@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
|
||||
version "7.0.9"
|
||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.9.tgz#97edc9037ea0c38585320b28964dde3b39e4660d"
|
||||
integrity sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==
|
||||
"@types/json-schema@^7.0.0", "@types/json-schema@^7.0.3", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
|
||||
version "7.0.11"
|
||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
|
||||
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
|
||||
|
||||
"@types/json5@^0.0.29":
|
||||
version "0.0.29"
|
||||
|
@ -7463,7 +7463,7 @@ js-cookie@^3.0.0:
|
|||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
||||
|
||||
js-yaml@^3.13.1, js-yaml@^3.14.1:
|
||||
js-yaml@^3.13.1:
|
||||
version "3.14.1"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
|
||||
integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
|
||||
|
@ -7558,7 +7558,7 @@ json5@^2.1.2, json5@^2.2.1:
|
|||
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
|
||||
integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
|
||||
|
||||
jsonc-parser@~3.0.0:
|
||||
jsonc-parser@^3.0.0, jsonc-parser@~3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.0.0.tgz#abdd785701c7e7eaca8a9ec8cf070ca51a745a22"
|
||||
integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==
|
||||
|
@ -7710,10 +7710,10 @@ loader-utils@^1.0.0, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2
|
|||
emojis-list "^3.0.0"
|
||||
json5 "^1.0.1"
|
||||
|
||||
loader-utils@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0"
|
||||
integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==
|
||||
loader-utils@^2.0.0, loader-utils@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.2.tgz#d6e3b4fb81870721ae4e0868ab11dd638368c129"
|
||||
integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
|
||||
dependencies:
|
||||
big.js "^5.2.2"
|
||||
emojis-list "^3.0.0"
|
||||
|
@ -8823,26 +8823,43 @@ moment-mini@^2.24.0:
|
|||
resolved "https://registry.yarnpkg.com/moment-mini/-/moment-mini-2.24.0.tgz#fa68d98f7fe93ae65bf1262f6abb5fb6983d8d18"
|
||||
integrity sha512-9ARkWHBs+6YJIvrIp0Ik5tyTTtP9PoV0Ssu2Ocq5y9v8+NOOpWiRshAp8c4rZVWTOe+157on/5G+zj5pwIQFEQ==
|
||||
|
||||
monaco-editor-webpack-plugin@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-6.0.0.tgz#628956ce1851afa2a5f6c88d0ecbb24e9a444898"
|
||||
integrity sha512-vC886Mzpd2AkSM35XLkfQMjH+Ohz6RISVwhAejDUzZDheJAiz6G34lky1vyO8fZ702v7IrcKmsGwL1rRFnwvUA==
|
||||
monaco-editor-webpack-plugin@^7.0.1:
|
||||
version "7.0.1"
|
||||
resolved "https://registry.yarnpkg.com/monaco-editor-webpack-plugin/-/monaco-editor-webpack-plugin-7.0.1.tgz#ba19c60aba990184e36ad8722b1ed6a564527c7c"
|
||||
integrity sha512-M8qIqizltrPlIbrb73cZdTWfU9sIsUVFvAZkL3KGjAHmVWEJ0hZKa/uad14JuOckc0GwnCaoGHvMoYtJjVyCzw==
|
||||
dependencies:
|
||||
loader-utils "^2.0.0"
|
||||
loader-utils "^2.0.2"
|
||||
|
||||
monaco-editor@^0.30.1:
|
||||
version "0.30.1"
|
||||
resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.30.1.tgz#47f8d18a0aa2264fc5654581741ab8d7bec01689"
|
||||
integrity sha512-B/y4+b2O5G2gjuxIFtCE2EkM17R2NM7/3F8x0qcPsqy4V83bitJTIO4TIeZpYlzu/xy6INiY/+84BEm6+7Cmzg==
|
||||
monaco-editor@^0.33.0:
|
||||
version "0.33.0"
|
||||
resolved "https://registry.yarnpkg.com/monaco-editor/-/monaco-editor-0.33.0.tgz#842e244f3750a2482f8a29c676b5684e75ff34af"
|
||||
integrity sha512-VcRWPSLIUEgQJQIE0pVT8FcGBIgFoxz7jtqctE+IiCxWugD0DwgyQBcZBhdSrdMC84eumoqMZsGl2GTreOzwqw==
|
||||
|
||||
monaco-yaml@3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/monaco-yaml/-/monaco-yaml-3.0.0.tgz#b3d59c3485bd5a161438072a8e5a8aaf74041dfd"
|
||||
integrity sha512-WkgdfjCj0L2VPPwPoiwc4l8+B78FyVpSsMoufEWqe3ukm8+WygKUtmtCFOFnehmMih6tSqhy4DUtoAhfnicyZA==
|
||||
monaco-marker-data-provider@^1.0.0:
|
||||
version "1.1.0"
|
||||
resolved "https://registry.yarnpkg.com/monaco-marker-data-provider/-/monaco-marker-data-provider-1.1.0.tgz#370f41de6b4db0bdbc41403766a091c04eaefba0"
|
||||
integrity sha512-g5YH4FLItl3usf0Qxr1Td/vCd4XZmPOFh+dFpo8d+Q5mp8nJZTPFMVA7kwz0vWAy0zBd7bzQYUmfdvHfR1ETBw==
|
||||
|
||||
monaco-worker-manager@^2.0.0:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/monaco-worker-manager/-/monaco-worker-manager-2.0.1.tgz#f67c54dfca34ed4b225d5de84e77b24b4e36de8a"
|
||||
integrity sha512-kdPL0yvg5qjhKPNVjJoym331PY/5JC11aPJXtCZNwWRvBr6jhkIamvYAyiY5P1AWFmNOy0aRDRoMdZfa71h8kg==
|
||||
|
||||
monaco-yaml@4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/monaco-yaml/-/monaco-yaml-4.0.0.tgz#3bf8624f984665aba7e5f10c4987cecf2890e89b"
|
||||
integrity sha512-7/CbvZIHE1iOQF6ny+uPclcsrBnkK54lcZugIB9SzqADljhb3TliJyYs7vouaGNDF73RWvrtZrMsWCC5N/GW+g==
|
||||
dependencies:
|
||||
"@types/json-schema" "^7.0.8"
|
||||
js-yaml "^3.14.1"
|
||||
yaml-ast-parser-custom-tags "^0.0.43"
|
||||
"@types/json-schema" "^7.0.0"
|
||||
jsonc-parser "^3.0.0"
|
||||
monaco-marker-data-provider "^1.0.0"
|
||||
monaco-worker-manager "^2.0.0"
|
||||
path-browserify "^1.0.0"
|
||||
prettier "^2.0.0"
|
||||
vscode-languageserver-textdocument "^1.0.0"
|
||||
vscode-languageserver-types "^3.0.0"
|
||||
vscode-uri "^3.0.0"
|
||||
yaml "^2.0.0"
|
||||
|
||||
mousetrap@1.6.5:
|
||||
version "1.6.5"
|
||||
|
@ -9427,6 +9444,11 @@ path-browserify@0.0.1:
|
|||
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a"
|
||||
integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==
|
||||
|
||||
path-browserify@^1.0.0:
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd"
|
||||
integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==
|
||||
|
||||
path-exists@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
|
||||
|
@ -9660,7 +9682,7 @@ pretender@^3.4.3:
|
|||
fake-xml-http-request "^2.1.1"
|
||||
route-recognizer "^0.3.3"
|
||||
|
||||
prettier@2.2.1:
|
||||
prettier@2.2.1, prettier@^2.0.0:
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5"
|
||||
integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q==
|
||||
|
@ -11924,6 +11946,21 @@ vm-browserify@^1.0.1:
|
|||
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019"
|
||||
integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==
|
||||
|
||||
vscode-languageserver-textdocument@^1.0.0:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.5.tgz#838769940ece626176ec5d5a2aa2d0aa69f5095c"
|
||||
integrity sha512-1ah7zyQjKBudnMiHbZmxz5bYNM9KKZYz+5VQLj+yr8l+9w3g+WAhCkUkWbhMEdC5u0ub4Ndiye/fDyS8ghIKQg==
|
||||
|
||||
vscode-languageserver-types@^3.0.0:
|
||||
version "3.17.2"
|
||||
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz#b2c2e7de405ad3d73a883e91989b850170ffc4f2"
|
||||
integrity sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==
|
||||
|
||||
vscode-uri@^3.0.0:
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/vscode-uri/-/vscode-uri-3.0.3.tgz#a95c1ce2e6f41b7549f86279d19f47951e4f4d84"
|
||||
integrity sha512-EcswR2S8bpR7fD0YPeS7r2xXExrScVMxg4MedACaWHEtx9ftCF/qHG1xGkolzTPcEmjTavCQgbVzHUIdTMzFGA==
|
||||
|
||||
vue-apollo@^3.0.7:
|
||||
version "3.0.7"
|
||||
resolved "https://registry.yarnpkg.com/vue-apollo/-/vue-apollo-3.0.7.tgz#97a031d45641faa4888a6d5a7f71c40834359704"
|
||||
|
@ -12445,20 +12482,15 @@ yallist@^4.0.0:
|
|||
resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
|
||||
|
||||
yaml-ast-parser-custom-tags@^0.0.43:
|
||||
version "0.0.43"
|
||||
resolved "https://registry.yarnpkg.com/yaml-ast-parser-custom-tags/-/yaml-ast-parser-custom-tags-0.0.43.tgz#46968145ce4e24cb03c3312057f0f141b93a7d02"
|
||||
integrity sha512-R5063FF/JSAN6qXCmylwjt9PcDH6M0ExEme/nJBzLspc6FJDmHHIqM7xh2WfEmsTJqClF79A9VkXjkAqmZw9SQ==
|
||||
|
||||
yaml@^1.10.0:
|
||||
version "1.10.2"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
|
||||
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
|
||||
|
||||
yaml@^2.0.0-10:
|
||||
version "2.0.0-10"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.0-10.tgz#d5b59e2d14b8683313a534f2bbc648e211a2753e"
|
||||
integrity sha512-FHV8s5ODFFQXX/enJEU2EkanNl1UDBUz8oa4k5Qo/sR+Iq7VmhCDkRMb0/mjJCNeAWQ31W8WV6PYStDE4d9EIw==
|
||||
yaml@^2.0.0, yaml@^2.0.0-10:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.1.tgz#1e06fb4ca46e60d9da07e4f786ea370ed3c3cfec"
|
||||
integrity sha512-o96x3OPo8GjWeSLF+wOAbrPfhFOGY0W00GNaxCDv+9hkcDJEnev1yh8S7pgHF0ik6zc8sQLuL8hjHjJULZp8bw==
|
||||
|
||||
yargs-parser@^20.2.2, yargs-parser@^20.2.3:
|
||||
version "20.2.9"
|
||||
|
|
Loading…
Reference in New Issue