Add latest changes from gitlab-org/gitlab@master

This commit is contained in:
GitLab Bot 2025-01-21 21:38:50 +00:00
parent e86001df37
commit 41ec6319e8
62 changed files with 522 additions and 336 deletions

View File

@ -1,5 +1,6 @@
<script>
import {
GlBadge,
GlSkeletonLoader,
GlTable,
GlLink,
@ -7,10 +8,12 @@ import {
GlButton,
GlIcon,
GlPagination,
GlPopover,
GlFormCheckbox,
GlTooltipDirective,
} from '@gitlab/ui';
import CiIcon from '~/vue_shared/components/ci_icon/ci_icon.vue';
import { s__, sprintf } from '~/locale';
import { createAlert } from '~/alert';
import { scrollToElement } from '~/lib/utils/common_utils';
import { getIdFromGraphQLId, convertToGraphQLId } from '~/graphql_shared/utils';
@ -59,6 +62,7 @@ const INITIAL_PAGINATION_STATE = {
export default {
name: 'JobArtifactsTable',
components: {
GlBadge,
GlSkeletonLoader,
GlTable,
GlLink,
@ -66,6 +70,7 @@ export default {
GlButton,
GlIcon,
GlPagination,
GlPopover,
GlFormCheckbox,
TimeAgo,
CiIcon,
@ -336,6 +341,38 @@ export default {
this.jobArtifactsToDelete = job.artifacts.nodes.map((node) => node.id);
this.handleBulkDeleteModalShow();
},
artifactBadges(artifacts = []) {
if (!artifacts.length) {
return { first: null, remaining: [] };
}
// Extract file types and normalize to lowercase
const fileTypeList = artifacts.map((artifact) => artifact.fileType?.toLowerCase() || '');
// Find the first security file type (sast/dast)
const securityFileType = fileTypeList.find(
(fileType) => fileType === 'sast' || fileType === 'dast',
);
if (securityFileType) {
const index = fileTypeList.findIndex((fileType) => fileType === securityFileType);
// Move security file type to the front of the array
fileTypeList.unshift(fileTypeList.splice(index, 1)[0]);
}
return {
first: fileTypeList.shift(),
remaining: fileTypeList,
};
},
popoverText(remaining = []) {
return sprintf(s__('Artifacts|+%{count} more'), {
count: remaining.length,
});
},
popoverTarget(id) {
return `artifact-popover-${id}`;
},
},
fields: [
{
@ -473,6 +510,27 @@ export default {
<gl-link :href="item.webPath">
{{ item.name }}
</gl-link>
<template v-if="artifactBadges(item.artifacts.nodes)">
<gl-badge data-testid="visible-file-type-badge">
{{ artifactBadges(item.artifacts.nodes).first }}
</gl-badge>
<template v-if="artifactBadges(item.artifacts.nodes).remaining.length">
<gl-badge :id="popoverTarget(item.id)" data-testid="file-types-popover-text">
{{ popoverText(artifactBadges(item.artifacts.nodes).remaining) }}
</gl-badge>
<gl-popover :target="popoverTarget(item.id)" placement="right" triggers="hover focus">
<div class="gl-flex gl-flex-wrap gl-gap-3">
<gl-badge
v-for="(fileType, index) in artifactBadges(item.artifacts.nodes).remaining"
:key="index"
data-testid="remaining-file-type-badges"
>
{{ fileType }}
</gl-badge>
</div>
</gl-popover>
</template>
</template>
</div>
<div class="gl-mb-1">
<gl-icon name="pipeline" class="gl-mr-2" />

View File

@ -93,6 +93,7 @@ import NewResourceDropdown from '~/vue_shared/components/new_resource_dropdown/n
import {
WORK_ITEM_TYPE_ENUM_OBJECTIVE,
DETAIL_VIEW_QUERY_PARAM_NAME,
INJECTION_LINK_CHILD_PREVENT_ROUTER_NAVIGATION,
} from '~/work_items/constants';
import WorkItemDrawer from '~/work_items/components/work_item_drawer.vue';
import { makeDrawerUrlParam } from '~/work_items/utils';
@ -165,6 +166,9 @@ export default {
GlTooltip: GlTooltipDirective,
},
mixins: [glFeatureFlagMixin(), hasNewIssueDropdown()],
provide: {
[INJECTION_LINK_CHILD_PREVENT_ROUTER_NAVIGATION]: true,
},
inject: [
'autocompleteAwardEmojisPath',
'calendarPath',
@ -586,7 +590,7 @@ export default {
return !isEmpty(this.activeIssuable);
},
issuesDrawerEnabled() {
return this.glFeatures?.issuesListDrawer;
return this.glFeatures?.issuesListDrawer || gon.current_user_use_work_items_view;
},
},
watch: {

View File

@ -39,6 +39,7 @@ export default {
projectPath: this.projectPath,
maxAllowedFileSize: this.maxAllowedFileSize,
markdownPreviewPath: this.markdownPreviewPath,
canWriteModelRegistry: this.canWriteModelRegistry,
};
},
props: {
@ -200,7 +201,6 @@ export default {
:error-message="errorMessage"
:is-loading="isLoading"
:sortable-fields="$options.sortableFields"
can-write-model-registry
@fetch-page="fetchPage"
>
<template #empty-state>

View File

@ -311,12 +311,7 @@ export default {
@click="goTo($options.ROUTE_PERFORMANCE)"
/>
</gl-tabs>
<router-view
:model-version="modelVersion"
can-write-model-registry
import-path
allow-artifact-import
/>
<router-view :model-version="modelVersion" import-path allow-artifact-import />
</load-or-error-or-show>
</div>

View File

@ -110,7 +110,6 @@ export default {
:error-message="errorMessage"
:is-loading="isLoading"
:sortable-fields="$options.sortableFields"
can-write-model-registry
@fetch-page="fetchPage"
>
<template #empty-state>

View File

@ -22,15 +22,12 @@ export default {
directives: {
GlTooltip,
},
inject: ['canWriteModelRegistry'],
props: {
items: {
type: Array,
required: true,
},
canWriteModelRegistry: {
type: Boolean,
required: true,
},
},
computed: {
computedFields() {

View File

@ -28,15 +28,12 @@ export default {
directives: {
GlTooltip,
},
inject: ['canWriteModelRegistry'],
props: {
items: {
type: Array,
required: true,
},
canWriteModelRegistry: {
type: Boolean,
required: true,
},
},
computed: {
tableFields() {

View File

@ -62,11 +62,6 @@ export default {
required: false,
default: () => [],
},
canWriteModelRegistry: {
type: Boolean,
required: true,
default: false,
},
},
data() {
const query = queryToObject(window.location.search);
@ -162,15 +157,9 @@ export default {
<model-versions-table
v-if="modelVersions.length"
:items="modelVersions"
can-write-model-registry
@model-versions-update="submitFilters"
/>
<models-table
v-else-if="models.length"
:items="models"
can-write-model-registry
@models-update="submitFilters"
/>
<models-table v-else-if="models.length" :items="models" @models-update="submitFilters" />
<candidates-table v-else-if="candidates.length" :items="candidates" />
<slot v-else name="empty-state"></slot>
<gl-keyset-pagination

View File

@ -4,7 +4,10 @@ import { __ } from '~/locale';
import deleteWorkItemMutation from '~/work_items/graphql/delete_work_item.mutation.graphql';
import glFeatureFlagMixin from '~/vue_shared/mixins/gl_feature_flags_mixin';
import { TYPE_EPIC, TYPE_ISSUE } from '~/issues/constants';
import { DETAIL_VIEW_QUERY_PARAM_NAME } from '~/work_items/constants';
import {
DETAIL_VIEW_QUERY_PARAM_NAME,
INJECTION_LINK_CHILD_PREVENT_ROUTER_NAVIGATION,
} from '~/work_items/constants';
import * as Sentry from '~/sentry/sentry_browser_wrapper';
import { visitUrl, setUrlParams, updateHistory, removeParams } from '~/lib/utils/url_utility';
import { getIdFromGraphQLId } from '~/graphql_shared/utils';
@ -23,7 +26,14 @@ export default {
WorkItemDetail: () => import('~/work_items/components/work_item_detail.vue'),
},
mixins: [glFeatureFlagMixin()],
inject: ['fullPath', 'isGroup'],
inject: {
preventRouterNav: {
from: INJECTION_LINK_CHILD_PREVENT_ROUTER_NAVIGATION,
default: false,
},
isGroup: {},
fullPath: {},
},
inheritAttrs: false,
props: {
open: {

View File

@ -6,6 +6,8 @@ module Types
class DescriptionTemplateType < BaseObject
graphql_name 'WorkItemDescriptionTemplate'
field :category, GraphQL::Types::String,
description: 'Category of description template.', null: true, calls_gitaly: true
field :content, GraphQL::Types::String,
description: 'Content of Description Template.', null: false, calls_gitaly: true
field :name, GraphQL::Types::String,

View File

@ -16,7 +16,7 @@ module Packages
update_project_statistics project_statistics_name: :packages_size
validates :package, :file, :file_path, :signature, :object_storage_key, :size, presence: true
validates :package, :project, :file, :file_path, :signature, :object_storage_key, :size, presence: true
validates :object_storage_key, uniqueness: true
validate :unique_signature_and_file_path_when_installable_package, on: :create

View File

@ -8,7 +8,7 @@ module Import
GIT_SERVICE_NAME = "git-upload-pack"
GIT_EXPECTED_FIRST_PACKET_LINE = "# service=#{GIT_SERVICE_NAME}"
GIT_BODY_MESSAGE_REGEXP = /^[0-9a-f]{4}#{GIT_EXPECTED_FIRST_PACKET_LINE}/
GIT_BODY_MESSAGE_REGEXP = /^[0-9a-fA-F]{4}#{GIT_EXPECTED_FIRST_PACKET_LINE}/
# https://github.com/git/git/blob/master/Documentation/technical/protocol-common.txt#L56-L59
GIT_PROTOCOL_PKT_LEN = 4
GIT_MINIMUM_RESPONSE_LENGTH = GIT_PROTOCOL_PKT_LEN + GIT_EXPECTED_FIRST_PACKET_LINE.length

View File

@ -12,7 +12,7 @@
issues_path: project_issues_path(@project),
project_path: @project.full_path } }
- if Feature.enabled?(:work_items_view_preference, current_user) && current_user&.user_preference&.use_work_items_view
- if @project&.work_items_alpha_feature_flag_enabled? && current_user&.user_preference&.use_work_items_view
#js-work-items{ data: work_items_show_data(@project, current_user) }
- else
.js-issues-list-root{ data: project_issues_list_data(@project, current_user) }

View File

@ -14,7 +14,7 @@ if commit
xml.title truncate(tag.name, length: 160)
xml.summary strip_signature(tag.message)
xml.content markdown_field(release, :description), type: 'html'
xml.updated release.updated_at.xmlschema if release
xml.updated commit.committed_date.xmlschema
xml.media :thumbnail, width: '40', height: '40', url: image_url(avatar_icon_for_email(author_email))
xml.author do |author|
xml.name commit.author_name

View File

@ -1,9 +1,11 @@
# frozen_string_literal: true
first_tag_commit = @repository.commit(@tags.first.dereferenced_target) if @tags.any?
xml.title "#{@project.name} tags"
xml.link href: project_tags_url(@project, @ref, rss_url_options), rel: 'self', type: 'application/atom+xml'
xml.link href: project_tags_url(@project, @ref), rel: 'alternate', type: 'text/html'
xml.id project_tags_url(@project, @ref)
xml.updated @releases.first.updated_at.xmlschema if @releases.any?
xml.updated first_tag_commit.committed_date.xmlschema if first_tag_commit
xml << render(partial: 'tag', collection: @tags) if @tags.any?

View File

@ -5,4 +5,4 @@ feature_category: package_registry
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/166743
milestone: '17.6'
queued_migration_version: 20240911173549
finalized_by: # version of the migration that finalized this BBM
finalized_by: 20250115085553

View File

@ -8,14 +8,6 @@ description: Nuget package symbols
introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129916
milestone: '16.4'
gitlab_schema: gitlab_main_cell
desired_sharding_key:
project_id:
references: projects
backfill_via:
parent:
foreign_key: package_id
table: packages_packages
sharding_key: project_id
belongs_to: package
desired_sharding_key_migration_job_name: BackfillPackagesNugetSymbolsProjectId
table_size: small
sharding_key:
project_id: projects

View File

@ -0,0 +1,26 @@
# frozen_string_literal: true
class FinalizeBackfillPackagesNugetSymbolsProjectId < Gitlab::Database::Migration[2.2]
disable_ddl_transaction!
restrict_gitlab_migration gitlab_schema: :gitlab_main
milestone '17.9'
def up
ensure_batched_background_migration_is_finished(
job_class_name: 'BackfillPackagesNugetSymbolsProjectId',
table_name: :packages_nuget_symbols,
column_name: :id,
job_arguments: [
:project_id,
:packages_packages,
:project_id,
:package_id
],
finalize: true
)
end
def down
# no-op
end
end

View File

@ -0,0 +1,14 @@
# frozen_string_literal: true
class AddNotNullConstraintToPackagesNugetSymbolsProjectId < Gitlab::Database::Migration[2.2]
disable_ddl_transaction!
milestone '17.9'
def up
add_not_null_constraint :packages_nuget_symbols, :project_id
end
def down
remove_not_null_constraint :packages_nuget_symbols, :project_id
end
end

View File

@ -0,0 +1 @@
d8c50fe3ab156987bd4eae3d976818b9b863fbf44ba633eb12369b0303ceee16

View File

@ -0,0 +1 @@
33e2516e7f19eddc90f786dc9cb2193c10c44f9d026c7b88b702b6fd06638657

View File

@ -17528,6 +17528,7 @@ CREATE TABLE packages_nuget_symbols (
CONSTRAINT check_0e93ca58b7 CHECK ((char_length(file) <= 255)),
CONSTRAINT check_28b82b08fa CHECK ((char_length(object_storage_key) <= 255)),
CONSTRAINT check_30b0ef2ca2 CHECK ((char_length(file_path) <= 255)),
CONSTRAINT check_7a67b0fc8b CHECK ((project_id IS NOT NULL)),
CONSTRAINT check_8dc7152679 CHECK ((char_length(signature) <= 255))
);

View File

@ -26,7 +26,8 @@ GET /projects/:id/error_tracking/settings
| `id` | integer | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-paths) |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings"
```
Example response:
@ -66,7 +67,8 @@ Supported attributes:
Example request:
```shell
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true&integrated=true"
curl --request PUT --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true&integrated=true"
```
Example response:
@ -97,7 +99,8 @@ PATCH /projects/:id/error_tracking/settings
| `integrated` | boolean | no | Pass `true` to enable the integrated error tracking backend. |
```shell
curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true"
curl --request PATCH --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/1/error_tracking/settings?active=true"
```
Example response:
@ -128,7 +131,8 @@ GET /projects/:id/error_tracking/client_keys
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-paths). |
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/error_tracking/client_keys"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/error_tracking/client_keys"
```
Example response:
@ -163,8 +167,10 @@ POST /projects/:id/error_tracking/client_keys
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](rest/index.md#namespaced-paths). |
```shell
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --header "Content-Type: application/json" \
"https://gitlab.example.com/api/v4/projects/5/error_tracking/client_keys"
curl --request POST \
--header "PRIVATE-TOKEN: <your_access_token>" \
--header "Content-Type: application/json" \
--url "https://gitlab.example.com/api/v4/projects/5/error_tracking/client_keys"
```
Example response:
@ -192,5 +198,6 @@ DELETE /projects/:id/error_tracking/client_keys/:key_id
| `key_id` | integer | yes | The ID of the client key. |
```shell
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/error_tracking/client_keys/13"
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" \
--url "https://gitlab.example.com/api/v4/projects/5/error_tracking/client_keys/13"
```

View File

@ -37982,6 +37982,7 @@ Returns [`String!`](#string).
| Name | Type | Description |
| ---- | ---- | ----------- |
| <a id="workitemdescriptiontemplatecategory"></a>`category` | [`String`](#string) | Category of description template. |
| <a id="workitemdescriptiontemplatecontent"></a>`content` | [`String!`](#string) | Content of Description Template. |
| <a id="workitemdescriptiontemplatename"></a>`name` | [`String!`](#string) | Name of Description Template. |

View File

@ -23,7 +23,8 @@ GET /version
```
```shell
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/version"
curl --header "PRIVATE-TOKEN: <your_access_token>" \
"https://gitlab.example.com/api/v4/version"
```
## Example responses

View File

@ -94,6 +94,7 @@ If you use self-signed certificates to connect to your GitLab instance, read the
| `gitlab.duoCodeSuggestions.enabled` | true | Toggle to enable or disable AI-assisted code suggestions. |
| `gitlab.duoCodeSuggestions.enabledSupportedLanguages` | Not applicable | The [supported languages](../../user/project/repository/code_suggestions/supported_extensions.md#supported-languages) for which to enable Code Suggestions. By default, all supported languages are enabled. |
| `gitlab.duoCodeSuggestions.openTabsContext` | true | Toggle to enable or disable sending of context across open tabs to improve Code Suggestions. |
| `gitlab.keybindingHints.enabled"` | true | Enable keybinding hints for GitLab Duo. |
| `gitlab.pipelineGitRemoteName` | null | The name of the Git remote name corresponding to the GitLab repository with your pipelines. If set to `null` or missing, then the extension uses the same remote as for the non-pipeline features. |
| `gitlab.showPipelineUpdateNotifications` | false | Set to `true` to show an alert when a pipeline completes. |

View File

@ -22,7 +22,7 @@ Use these variables to customize and deploy your build.
| `AUTO_BUILD_IMAGE_VERSION` | Customize the image version used for the `build` job. See [list of versions](https://gitlab.com/gitlab-org/cluster-integration/auto-build-image/-/releases). |
| `AUTO_DEPLOY_IMAGE_VERSION` | Customize the image version used for Kubernetes deployment jobs. See [list of versions](https://gitlab.com/gitlab-org/cluster-integration/auto-deploy-image/-/releases). |
| `AUTO_DEVOPS_ATOMIC_RELEASE` | Auto DevOps uses [`--atomic`](https://v2.helm.sh/docs/helm/#options-43) for Helm deployments by default. Set this variable to `false` to disable the use of `--atomic` |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:18`. [More details](stages.md#auto-build-using-cloud-native-buildpacks). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_BUILDER` | The builder used when building with Cloud Native Buildpacks. The default builder is `heroku/buildpacks:22`. [More details](stages.md#auto-build-using-cloud-native-buildpacks). |
| `AUTO_DEVOPS_BUILD_IMAGE_EXTRA_ARGS` | Extra arguments to be passed to the `docker build` command. Using quotes doesn't prevent word splitting. [More details](customize.md#pass-arguments-to-docker-build). |
| `AUTO_DEVOPS_BUILD_IMAGE_FORWARDED_CI_VARIABLES` | A [comma-separated list of CI/CD variable names](customize.md#forward-cicd-variables-to-the-build-environment) to be forwarded to the build environment (the buildpack builder or `docker build`). |
| `AUTO_DEVOPS_BUILD_IMAGE_CNB_PORT` | In GitLab 15.0 and later, port exposed by the generated Docker image. Set to `false` to prevent exposing any ports. Defaults to `5000`. |

View File

@ -22,7 +22,7 @@ This table lists the secrets detected by:
| Description | ID | Pipeline secret detection | Client-side secret detection | Secret push protection |
|:----------------------------------------------|:----------------------------------------------|:--------------------------|:-----------------------------|:-----------------------|
| Adobe Client ID (Oauth Web) | Adobe Client ID (Oauth Web) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| Adobe Client ID (OAuth Web) | Adobe Client ID (OAuth Web) | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| Adobe Client Secret | Adobe Client Secret | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| Age secret key | Age secret key | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |
| Alibaba AccessKey ID | Alibaba AccessKey ID | **{check-circle}** Yes | **{dotted-circle}** No | **{dotted-circle}** No |

View File

@ -96,6 +96,8 @@ To enable secret push protection in a project:
1. On the left sidebar, select **Secure > Security configuration**.
1. Turn on the **Secret push protection** toggle.
You can also enable secret push protection for all projects in a group [with the API](../../../../api/group_security_settings.md#update-secret_push_protection_enabled-setting).
## Coverage
By default, secret push protection checks the content of each file modified in a commit. If you

View File

@ -128,6 +128,7 @@ If you have selected code in the editor, this selection is sent along with your
> - Introduced in GitLab 16.6 as an [experiment](../../policy/development_stages_support.md#experiment).
> - Changed to generally available in GitLab 16.11.
> - Status [added](https://gitlab.com/gitlab-org/gitlab-vscode-extension/-/issues/1712) in the GitLab Workflow extension for VS Code 5.29.0.
Prerequisites:
@ -143,6 +144,8 @@ To use GitLab Duo Chat in GitLab Workflow extension for VS Code:
1. Select **Explain selected code** or **Generate Tests**.
- Use the keyboard shortcut: <kbd>ALT</kbd>+<kbd>d</kbd> (on Windows and Linux) or <kbd>Option</kbd>+<kbd>d</kbd> (on Mac).
1. In the message box, enter your question and press **Enter** or select **Send**.
1. In the chat pane, on the top right corner, select **Show Status** to show information
in the Command Palette.
If you have selected code in the editor, this selection is sent along with your question to the AI. This way you can ask questions about this code selection. For instance, `Could you simplify this?`.

View File

@ -7989,6 +7989,9 @@ msgid_plural "Artifacts|%{strongStart}%{count}%{strongEnd} artifacts selected"
msgstr[0] ""
msgstr[1] ""
msgid "Artifacts|+%{count} more"
msgstr ""
msgid "Artifacts|An error occurred while deleting the artifact"
msgstr ""

View File

@ -256,8 +256,9 @@
"@vitejs/plugin-vue2": "^2.3.3",
"@vue/compat": "^3.5.13",
"@vue/compiler-sfc": "^3.5.13",
"@vue/server-renderer": "^3.5.13",
"@vue/test-utils": "1.3.6",
"@vue/test-utils-vue3": "npm:@vue/test-utils@2",
"@vue/test-utils-vue3": "npm:@vue/test-utils@^2.4.6",
"@vue/vue2-jest": "^28.1.0",
"@vue/vue3-jest": "^29.2.3",
"ajv": "^8.10.0",

View File

@ -1,15 +1,14 @@
diff --git a/node_modules/@vue/test-utils-vue3/dist/vue-test-utils.cjs.js b/node_modules/@vue/test-utils-vue3/dist/vue-test-utils.cjs.js
index 2902a1e..0c1e6b5 100644
index 118b9b3..5083f20 100644
--- a/node_modules/@vue/test-utils-vue3/dist/vue-test-utils.cjs.js
+++ b/node_modules/@vue/test-utils-vue3/dist/vue-test-utils.cjs.js
@@ -7945,7 +7945,9 @@ function createStubComponentsTransformer(_a) {
var stubName = name || registeredName || componentName;
@@ -8025,7 +8025,8 @@ function createStubComponentsTransformer(_a) {
return ((_c = (_b = (_a = config.plugins).createStubs) === null || _b === void 0 ? void 0 : _b.call(_a, {
name: stubName,
- component: type
+ component: type,
+ registerStub,
+ stubs
component: type,
- registerStub: registerStub
+ registerStub: registerStub,
+ stubs: stubs
})) !== null && _c !== void 0 ? _c : createStub({
name: stubName,
type: type,

View File

@ -1,4 +1,4 @@
ARG GDK_SHA=10f5424aee5ca5a0ce76b1d7e698bdd1b1491a66
ARG GDK_SHA=ac07225dc7faa0b88559a91208e57cea83756cfe
# Use tag prefix when running on 'stable' branch to make sure 'protected' image is used which is not deleted by registry cleanup
ARG GDK_BASE_TAG_PREFIX

View File

@ -7,7 +7,7 @@ gemspec
group :test do
gem "climate_control", "~> 1.2.0"
gem "gitlab-styles", "~> 13.0.2"
gem "pry", "~> 0.15.0"
gem "pry", "~> 0.15.2"
gem "rspec", "~> 3.13"
gem "simplecov", "~> 0.22.0"
end

View File

@ -56,7 +56,7 @@ GEM
racc
pastel (0.8.0)
tty-color (~> 0.5)
pry (0.15.0)
pry (0.15.2)
coderay (~> 1.1)
method_source (~> 1.0)
racc (1.8.1)
@ -142,7 +142,7 @@ DEPENDENCIES
climate_control (~> 1.2.0)
gitlab-cng!
gitlab-styles (~> 13.0.2)
pry (~> 0.15.0)
pry (~> 0.15.2)
rspec (~> 3.13)
simplecov (~> 0.22.0)

View File

@ -41,7 +41,6 @@ ee/spec/frontend/dependencies/components/app_spec.js
ee/spec/frontend/dependencies/components/dependency_location_spec.js
ee/spec/frontend/dependencies/components/dependency_path_viewer_spec.js
ee/spec/frontend/dependencies/components/filtered_search/tokens/component_token_spec.js
ee/spec/frontend/diffs/components/shared/findings_drawer_spec.js
ee/spec/frontend/geo_sites/components/details/secondary_site/geo_site_replication_details_responsive_spec.js
ee/spec/frontend/geo_sites/index_spec.js
ee/spec/frontend/groups/components/invite_members_spec.js
@ -80,7 +79,6 @@ ee/spec/frontend/roles_and_permissions/components/create_member_role_spec.js
ee/spec/frontend/roles_and_permissions/components/role_selector_spec.js
ee/spec/frontend/security_configuration/components/app_spec.js
ee/spec/frontend/security_configuration/components/dynamic_fields_spec.js
ee/spec/frontend/security_configuration/components/expandable_section_spec.js
ee/spec/frontend/security_configuration/dast_profiles/components/dast_profiles_list_spec.js
ee/spec/frontend/security_configuration/dast_profiles/dast_profile_selector/scanner_profile_selector_spec.js
ee/spec/frontend/security_configuration/dast_profiles/dast_profile_selector/site_profile_selector_spec.js
@ -89,13 +87,11 @@ ee/spec/frontend/security_dashboard/components/shared/vulnerability_details_grap
ee/spec/frontend/security_dashboard/components/shared/vulnerability_report/vulnerability_list_graphql_spec.js
ee/spec/frontend/security_dashboard/components/shared/vulnerability_report/vulnerability_report_spec.js
ee/spec/frontend/security_dashboard/components/shared/vulnerability_report/vulnerability_report_tabs_spec.js
ee/spec/frontend/sidebar/components/cve_id_request/cve_id_request_spec.js
ee/spec/frontend/sidebar/components/sidebar_dropdown_widget_spec.js
ee/spec/frontend/status_checks/components/modal_create_spec.js
ee/spec/frontend/status_checks/mount_spec.js
ee/spec/frontend/tracing/details/tracing_details_spec.js
ee/spec/frontend/tracing/details/tracing_header_spec.js
ee/spec/frontend/tracing/details/tracing_span_chart_spec.js
ee/spec/frontend/usage_quotas/code_suggestions/components/add_on_eligible_user_list_spec.js
ee/spec/frontend/usage_quotas/transfer/components/usage_by_month_spec.js
ee/spec/frontend/users/identity_verification/components/international_phone_input_spec.js
@ -103,6 +99,7 @@ ee/spec/frontend/users/identity_verification/components/verify_phone_verificatio
ee/spec/frontend/vue_merge_request_widget/components/mr_widget_pipeline_container_spec.js
ee/spec/frontend/vue_shared/components/groups_list/groups_list_item_spec.js
ee/spec/frontend/vue_shared/components/projects_list/projects_list_item_spec.js
ee/spec/frontend/vulnerabilities/generic_report/report_item_graphql_spec.js
ee/spec/frontend/vulnerabilities/related_issues_spec.js
spec/frontend/__helpers__/vue_test_utils_helper_spec.js
spec/frontend/access_tokens/index_spec.js
@ -205,7 +202,6 @@ spec/frontend/notebook/cells/output/html_spec.js
spec/frontend/notes/components/discussion_notes_spec.js
spec/frontend/notes/components/note_preview_spec.js
spec/frontend/notes/components/notes_app_spec.js
spec/frontend/notes/components/timeline_toggle_spec.js
spec/frontend/organizations/groups_and_projects/components/app_spec.js
spec/frontend/organizations/shared/components/new_edit_form_spec.js
spec/frontend/packages_and_registries/container_registry/explorer/components/list_page/image_list_row_spec.js

View File

@ -1,8 +0,0 @@
export function stubTransition() {
return {
render() {
// eslint-disable-next-line no-underscore-dangle
return this.$options._renderChildren;
},
};
}

View File

@ -0,0 +1,41 @@
// Fixtures located in spec/frontend/fixtures/job_artifacts.rb
import getJobArtifactsResponse from 'test_fixtures/graphql/ci/artifacts/graphql/queries/get_job_artifacts.query.graphql.json';
export const jobArtifactsResponseWithSecurityFiles = {
data: {
...getJobArtifactsResponse.data,
project: {
...getJobArtifactsResponse.data.project,
jobs: {
nodes: [
{
...getJobArtifactsResponse.data.project.jobs.nodes[0],
artifacts: {
nodes: [
{
id: 'gid://gitlab/Ci::JobArtifact/9539',
name: 'job.log',
fileType: 'TRACE',
downloadPath:
'/root/security-reports/-/jobs/12281/artifacts/download?file_type=trace',
size: '1842',
expireAt: null,
},
{
id: 'gid://gitlab/Ci::JobArtifact/9500',
name: 'gl-sast-report.json',
fileType: 'SAST',
downloadPath:
'/root/security-reports/-/jobs/12281/artifacts/download?file_type=sast',
size: '2036',
expireAt: '2025-02-08T17:00:46Z',
},
],
},
},
],
pageInfo: { ...getJobArtifactsResponse.data.project.jobs.pageInfo },
},
},
},
};

View File

@ -3,11 +3,13 @@ import {
GlTable,
GlLink,
GlPagination,
GlPopover,
GlModal,
GlFormCheckbox,
} from '@gitlab/ui';
import Vue, { nextTick } from 'vue';
import VueApollo from 'vue-apollo';
// Fixtures located in spec/frontend/fixtures/job_artifacts.rb
import getJobArtifactsResponse from 'test_fixtures/graphql/ci/artifacts/graphql/queries/get_job_artifacts.query.graphql.json';
import CiIcon from '~/vue_shared/components/ci_icon/ci_icon.vue';
import waitForPromises from 'helpers/wait_for_promises';
@ -32,6 +34,7 @@ import {
} from '~/ci/artifacts/constants';
import { totalArtifactsSizeForJob } from '~/ci/artifacts/utils';
import { createAlert } from '~/alert';
import { jobArtifactsResponseWithSecurityFiles } from './constants';
const jobArtifactsCountLimit = 100;
@ -97,6 +100,12 @@ describe('JobArtifactsTable component', () => {
await waitForPromises();
};
const findVisibleFileTypeBadge = () => wrapper.findByTestId('visible-file-type-badge');
const findPopoverText = () => wrapper.findByTestId('file-types-popover-text');
const findAllRemainingFileTypeBadges = () =>
wrapper.findAllByTestId('remaining-file-type-badges');
const findPopover = () => wrapper.findComponent(GlPopover);
const projectId = 'some/project/id';
let enoughJobsToPaginate = [...getJobArtifactsResponse.data.project.jobs.nodes];
@ -925,4 +934,43 @@ describe('JobArtifactsTable component', () => {
expect(findPagination().props('value')).toEqual(2);
});
});
describe('file type badges', () => {
it('displays file type badge', async () => {
createComponent();
await waitForPromises();
expect(findVisibleFileTypeBadge().text()).toBe('archive');
});
it('displays reamining file types in popover', async () => {
createComponent();
await waitForPromises();
expect(findPopoverText().text()).toBe('+2 more');
expect(findPopover().exists()).toBe(true);
expect(findAllRemainingFileTypeBadges().at(0).text()).toBe('metadata');
expect(findAllRemainingFileTypeBadges().at(1).text()).toBe('trace');
});
describe('with security file types', () => {
const query = jest.fn().mockResolvedValue(jobArtifactsResponseWithSecurityFiles);
beforeEach(async () => {
createComponent({
handlers: {
getJobArtifactsQuery: query,
},
});
await waitForPromises();
});
it('displays security badge first in the list', () => {
expect(findVisibleFileTypeBadge().text()).toBe('sast');
});
});
});
});

View File

@ -2,7 +2,6 @@ import { nextTick } from 'vue';
import { shallowMount } from '@vue/test-utils';
import { GlAlert } from '@gitlab/ui';
import { extendedWrapper } from 'helpers/vue_test_utils_helper';
import { createMockDirective } from 'helpers/vue_mock_directive';
import PipelineEditorFileTreeContainer from '~/ci/pipeline_editor/components/file_tree/container.vue';
import PipelineEditorFileTreeItem from '~/ci/pipeline_editor/components/file_tree/file_item.vue';
import { FILE_TREE_TIP_DISMISSED_KEY } from '~/ci/pipeline_editor/constants';
@ -21,9 +20,6 @@ describe('Pipeline editor file nav', () => {
propsData: {
includes,
},
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
stubs,
}),
);

View File

@ -22,7 +22,6 @@ class CustomEnvironment extends TestEnvironment {
this.jestConsoleWatcher = setupConsoleWatcher(this, context.console, {
ignores: [
/The updateQuery callback for fetchMore is deprecated/,
/^\[Vue warn\]: Wrong type passed as event handler to .* - did you forget @ or : in front of your prop\?/,
// TODO: Remove this and replace with localized calls to `ignoreVueConsoleWarnings`
// https://gitlab.com/gitlab-org/gitlab/-/issues/396779#note_1788506238
/^\[Vue warn\]: Missing required prop/,

View File

@ -2,7 +2,6 @@ import Vue from 'vue';
import VueApollo from 'vue-apollo';
import { GlCollapse, GlIcon } from '@gitlab/ui';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { stubTransition } from 'helpers/stub_transition';
import createMockApollo from 'helpers/mock_apollo_helper';
import DeployBoardWrapper from '~/environments/components/deploy_board_wrapper.vue';
import DeployBoard from '~/environments/components/deploy_board.vue';
@ -22,7 +21,6 @@ describe('~/environments/components/deploy_board_wrapper.vue', () => {
return mountExtended(DeployBoardWrapper, {
propsData: { environment: resolvedEnvironment, rolloutStatus, ...propsData },
provide: { helpPagePath: '/help' },
stubs: { transition: stubTransition() },
apolloProvider: mockApollo,
});
};

View File

@ -4,7 +4,6 @@ import { GlCollapse, GlIcon } from '@gitlab/ui';
import waitForPromises from 'helpers/wait_for_promises';
import createMockApollo from 'helpers/mock_apollo_helper';
import { mountExtended } from 'helpers/vue_test_utils_helper';
import { stubTransition } from 'helpers/stub_transition';
import { sprintf } from '~/locale';
import EnvironmentsFolder from '~/environments/components/environment_folder.vue';
import EnvironmentItem from '~/environments/components/new_environment_item.vue';
@ -42,7 +41,6 @@ describe('~/environments/components/environments_folder.vue', () => {
search: '',
...propsData,
},
stubs: { transition: stubTransition() },
provide: { helpPagePath: '/help', projectId: '1', projectPath: 'path/to/project' },
});

View File

@ -2,7 +2,6 @@ import { GlModal } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { stubComponent } from 'helpers/stub_component';
import { stubTransition } from 'helpers/stub_transition';
import { createMockDirective, getBinding } from 'helpers/vue_mock_directive';
import waitForPromises from 'helpers/wait_for_promises';
import { projectData } from 'jest/ide/mock_data';
@ -36,7 +35,6 @@ describe('IDE commit form', () => {
show: showModalSpy,
},
}),
transition: stubTransition(),
},
});
};

View File

@ -28,9 +28,6 @@ describe('~/vue_shared/components/content_transition.vue', () => {
dne: '<p>DOES NOT EXIST</p>',
...slots,
},
stubs: {
transition: true,
},
});
};

View File

@ -18,16 +18,15 @@ describe('PerformanceGraph', () => {
});
};
const findGraph = () => wrapper.findComponent(PerformanceGraph);
const findLineChart = () => findGraph().findComponent(GlLineChart);
const findLineChart = () => wrapper.findComponent(GlLineChart);
const findEmptyState = () => wrapper.findComponent(GlEmptyState);
describe('rendering', () => {
it('renders the component', () => {
createWrapper();
expect(findGraph().props('candidates')).toEqual(MOCK_CANDIDATES);
expect(findGraph().props('metricNames')).toEqual(MOCK_METRICS);
expect(wrapper.props('candidates')).toEqual(MOCK_CANDIDATES);
expect(wrapper.props('metricNames')).toEqual(MOCK_METRICS);
expect(findEmptyState().exists()).toBe(false);
});

View File

@ -18,7 +18,7 @@ Vue.use(VueApollo);
const defaultProps = {
projectPath: 'path/to/project',
canWriteModelRegistry: false,
canWriteModelRegistry: true,
maxAllowedFileSize: 99999,
markdownPreviewPath: '/markdown-preview',
createModelPath: 'path/to/project/-/ml/models/new,',
@ -94,7 +94,12 @@ describeSkipVue3(skipReason, () => {
describe('create button', () => {
describe('when user has no permission to write model registry', () => {
it('does not display create button', async () => {
await createWrapper({ resolver: emptyQueryResolver() });
await createWrapper({
props: {
canWriteModelRegistry: false,
},
resolver: emptyQueryResolver(),
});
expect(findModelCreate().exists()).toBe(false);
});

View File

@ -13,8 +13,6 @@ describe('ModelsTable', () => {
wrapper = mount(ModelsTable, {
propsData: {
items,
canWriteModelRegistry,
...props,
},
stubs: {
@ -26,6 +24,7 @@ describe('ModelsTable', () => {
},
provide: {
projectPath: 'projectPath',
canWriteModelRegistry,
},
});
};

View File

@ -37,7 +37,6 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
errorMessage: '',
showSearch: false,
sortableFields: [],
canWriteModelRegistry: true,
};
const mountComponent = (props = {}) => {
@ -114,7 +113,6 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
pageInfo: defaultPageInfo,
showSearch: false,
sortableFields: [],
canWriteModelRegistry: true,
});
});
@ -147,7 +145,6 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
pageInfo: defaultPageInfo,
showSearch: false,
sortableFields: [],
canWriteModelRegistry: true,
});
});
@ -180,7 +177,6 @@ describe('ml/model_registry/components/searchable_table.vue', () => {
pageInfo: defaultPageInfo,
showSearch: false,
sortableFields: [],
canWriteModelRegistry: true,
});
});

View File

@ -1,5 +1,5 @@
import { GlButton } from '@gitlab/ui';
import { shallowMount } from '@vue/test-utils';
import { mount } from '@vue/test-utils';
import Vue, { nextTick } from 'vue';
// eslint-disable-next-line no-restricted-imports
import Vuex from 'vuex';
@ -23,7 +23,7 @@ describe('Timeline toggle', () => {
jest.spyOn(store, 'dispatch').mockImplementation();
jest.spyOn(Tracking, 'event').mockImplementation();
wrapper = shallowMount(TimelineToggle, {
wrapper = mount(TimelineToggle, {
store,
});
};
@ -63,7 +63,7 @@ describe('Timeline toggle', () => {
findGlButton().vm.$emit('click', mockEvent);
await nextTick();
expect(findGlButton().attributes('title')).toBe(timelineEnabledTooltip);
expect(findGlButton().attributes('selected')).toBe('true');
expect(findGlButton().props('selected')).toBe(true);
expect(mockEvent.currentTarget.blur).toHaveBeenCalled();
});

View File

@ -1,7 +1,6 @@
import { mount } from '@vue/test-utils';
import { nextTick } from 'vue';
import { stubTransition } from 'helpers/stub_transition';
import { createMockDirective } from 'helpers/vue_mock_directive';
import TimeTracker from '~/sidebar/components/time_tracking/time_tracker.vue';
import SidebarEventHub from '~/sidebar/event_hub';
@ -33,9 +32,6 @@ describe('Issuable Time Tracker', () => {
return mount(TimeTracker, {
propsData: { ...defaultProps, ...props },
directives: { GlTooltip: createMockDirective('gl-tooltip') },
stubs: {
transition: stubTransition(),
},
provide: {
issuableType,
},

View File

@ -213,24 +213,4 @@ if (global.document) {
return stub;
};
/**
* VTU stubs "transition" and "transition-group" by default.
*
* In vue/test-utils@2.3.1, with vue/compat@v3.4.22 (or higher) this generates many warnings when stubbing <transition> that look like:
* [Vue warn]: Wrong type passed as event handler to onBeforeEnter - did you forget @ or : in front of your prop?
* Expected function or array of functions, received type string.
* at <Transition onBeforeEnter=fn<bound onBeforeEnter> onEnter=fn<bound onEnter> onAfterEnter=fn<bound onAfterEnter> ... >
*
* "transition" and "transition-group" stubs are not created by the custom `plugins.createStubs` so we can't patch this stubbing.
*
* This problem has been fixed at https://github.com/vuejs/test-utils/pull/2413, so this config can be removed when we update to
* a newer version of vue/test-utils.
*
* TLDR: Remove this after updating vue/test-utils@2
*/
if (VTU.config.stubs) {
VTU.config.stubs.transition = false;
VTU.config.stubs['transition-group'] = false;
}
}

View File

@ -15,9 +15,6 @@ describe('InputCopyToggleVisibility', () => {
const createComponent = ({ props, ...options } = {}) => {
wrapper = mountExtended(InputCopyToggleVisibility, {
propsData: props,
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
...options,
});
};
@ -118,6 +115,9 @@ describe('InputCopyToggleVisibility', () => {
value: valueProp,
readonly: true,
},
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
});
});
@ -233,91 +233,107 @@ describe('InputCopyToggleVisibility', () => {
});
describe('and `value` prop is passed', () => {
beforeEach(() => {
createComponent({
props: {
value: valueProp,
readonly: false,
},
describe('tooltip', () => {
beforeEach(() => {
createComponent({
props: {
value: valueProp,
readonly: false,
},
directives: {
GlTooltip: createMockDirective('gl-tooltip'),
},
});
});
it('renders a reveal button', () => {
const revealButton = findRevealButton();
expect(revealButton.exists()).toBe(true);
const tooltip = getBinding(revealButton.element, 'gl-tooltip');
expect(tooltip.value).toBe(InputCopyToggleVisibility.i18n.toggleVisibilityLabelReveal);
});
it('renders a hide button once revealed', async () => {
const revealButton = findRevealButton();
await revealButton.trigger('click');
await nextTick();
const hideButton = findHideButton();
expect(hideButton.exists()).toBe(true);
const tooltip = getBinding(hideButton.element, 'gl-tooltip');
expect(tooltip.value).toBe(InputCopyToggleVisibility.i18n.toggleVisibilityLabelHide);
});
});
it('renders a reveal button', () => {
const revealButton = findRevealButton();
expect(revealButton.exists()).toBe(true);
const tooltip = getBinding(revealButton.element, 'gl-tooltip');
expect(tooltip.value).toBe(InputCopyToggleVisibility.i18n.toggleVisibilityLabelReveal);
});
it('renders a hide button once revealed', async () => {
const revealButton = findRevealButton();
await revealButton.trigger('click');
await nextTick();
const hideButton = findHideButton();
expect(hideButton.exists()).toBe(true);
const tooltip = getBinding(hideButton.element, 'gl-tooltip');
expect(tooltip.value).toBe(InputCopyToggleVisibility.i18n.toggleVisibilityLabelHide);
});
it('emits `input` event when editing', () => {
expect(wrapper.emitted('input')).toBeUndefined();
const newVal = 'ding!';
const input = findFormInput();
input.element.value = newVal;
input.trigger('input');
expect(wrapper.emitted()).toHaveProperty('input');
expect(wrapper.emitted('input')).toHaveLength(1);
expect(wrapper.emitted('input')[0][0]).toBe(newVal);
});
it('copies updated value to clipboard after editing', async () => {
const writeTextSpy = jest.spyOn(global.navigator.clipboard, 'writeText');
triggerCopyShortcut();
await nextTick();
expect(wrapper.emitted('copy')).toHaveLength(1);
expect(writeTextSpy).toHaveBeenCalledWith(valueProp);
const updatedValue = 'wow amazing';
wrapper.setProps({ value: updatedValue });
await nextTick();
triggerCopyShortcut();
await nextTick();
expect(wrapper.emitted('copy')).toHaveLength(2);
expect(writeTextSpy).toHaveBeenCalledWith(updatedValue);
});
describe('when input is clicked', () => {
it('shows the actual value', async () => {
const input = findFormInput();
expectInputToBeMasked();
await findFormInput().trigger('click');
expect(input.element.value).toBe(valueProp);
describe('no tooltip', () => {
beforeEach(() => {
createComponent({
props: {
value: valueProp,
readonly: false,
},
});
});
it('ensures the selection start/end are in the correct position once the actual value has been revealed', async () => {
it('emits `input` event when editing', () => {
expect(wrapper.emitted('input')).toBeUndefined();
const newVal = 'ding!';
const input = findFormInput();
const selectionStart = 2;
const selectionEnd = 4;
input.element.value = newVal;
input.trigger('input');
input.element.setSelectionRange(selectionStart, selectionEnd);
await input.trigger('click');
expect(wrapper.emitted()).toHaveProperty('input');
expect(wrapper.emitted('input')).toHaveLength(1);
expect(wrapper.emitted('input')[0][0]).toBe(newVal);
});
expect(input.element.selectionStart).toBe(selectionStart);
expect(input.element.selectionEnd).toBe(selectionEnd);
it('copies updated value to clipboard after editing', async () => {
const writeTextSpy = jest.spyOn(global.navigator.clipboard, 'writeText');
triggerCopyShortcut();
await nextTick();
expect(wrapper.emitted('copy')).toHaveLength(1);
expect(writeTextSpy).toHaveBeenCalledWith(valueProp);
const updatedValue = 'wow amazing';
wrapper.setProps({ value: updatedValue });
await nextTick();
triggerCopyShortcut();
await nextTick();
expect(wrapper.emitted('copy')).toHaveLength(2);
expect(writeTextSpy).toHaveBeenCalledWith(updatedValue);
});
describe('when input is clicked', () => {
it('shows the actual value', async () => {
const input = findFormInput();
expectInputToBeMasked();
await findFormInput().trigger('click');
expect(input.element.value).toBe(valueProp);
});
it('ensures the selection start/end are in the correct position once the actual value has been revealed', async () => {
const input = findFormInput();
const selectionStart = 2;
const selectionEnd = 4;
input.element.setSelectionRange(selectionStart, selectionEnd);
await input.trigger('click');
expect(input.element.selectionStart).toBe(selectionStart);
expect(input.element.selectionEnd).toBe(selectionEnd);
});
});
});
});

View File

@ -16,9 +16,6 @@ const issuableTitleProps = {
const createComponent = (propsData = issuableTitleProps) =>
shallowMount(IssuableTitle, {
propsData,
stubs: {
transition: true,
},
slots: {
'status-badge': 'Open',
},

View File

@ -6,7 +6,7 @@ RSpec.describe Types::WorkItems::DescriptionTemplateType, feature_category: :por
include GraphqlHelpers
it 'exposes the expected fields' do
expected_fields = %i[content name]
expected_fields = %i[content name category]
expected_fields.each do |field|
expect(described_class).to have_graphql_field(field)

View File

@ -108,6 +108,14 @@ RSpec.describe Projects::Ml::ModelRegistryHelper, feature_category: :mlops do
expect(parsed['canWriteModelRegistry']).to eq(false)
end
end
context 'when no user' do
let_it_be(:user) { nil }
it 'canWriteModelRegistry is false' do
expect(parsed['canWriteModelRegistry']).to eq(nil)
end
end
end
describe '#edit_ml_model_data' do

View File

@ -86,7 +86,10 @@ RSpec.describe 'new tables missing sharding_key', feature_category: :cell do
# allowed as it points to itself
'organizations.id',
# contains an object storage reference. Group_id is the sharding key but we can't use the usual cascade delete FK.
'virtual_registries_packages_maven_cache_entries.group_id'
'virtual_registries_packages_maven_cache_entries.group_id',
# The table contains references in the object storage and thus can't have cascading delete
# nor being NULL by the definition of a sharding key.
'packages_nuget_symbols.project_id'
]
end

View File

@ -26,13 +26,23 @@ RSpec.describe Packages::Nuget::Symbol, type: :model, feature_category: :package
it { is_expected.to validate_presence_of(:object_storage_key) }
it { is_expected.to validate_presence_of(:size) }
it { is_expected.to validate_uniqueness_of(:object_storage_key).case_insensitive }
it { is_expected.to validate_presence_of(:project) }
context 'for signature & file_path uniqueness' do
let(:new_symbol) { build(:nuget_symbol, signature: symbol.signature) }
let(:package) { build_stubbed(:nuget_package) }
context 'when package is nil' do
let(:new_symbol) do
build(
:nuget_symbol,
signature: symbol.signature,
package: package,
project: package.project
)
end
context 'when symbol has basic validation error' do
before do
symbol.package = nil
new_symbol.project = nil
new_symbol.validate
end
@ -41,9 +51,8 @@ RSpec.describe Packages::Nuget::Symbol, type: :model, feature_category: :package
end
end
context 'when package is installable' do
context 'when symbol does not have basic validation errors' do
before do
new_symbol.object_storage_key = '123/foobar/456'
new_symbol.validate
end
@ -52,11 +61,10 @@ RSpec.describe Packages::Nuget::Symbol, type: :model, feature_category: :package
end
end
context 'when package is not installable' do
context 'when existing package is not installable' do
before do
new_symbol.package = symbol.package if package_exists
symbol.package.update_column(:status, :pending_destruction)
new_symbol.object_storage_key = '123/foobar/456'
new_symbol.validate
end

View File

@ -30,6 +30,7 @@ RSpec.describe 'getting work item description templates', feature_category: :gro
workItemDescriptionTemplates
{
nodes {
category
name
content
}
@ -49,6 +50,7 @@ RSpec.describe 'getting work item description templates', feature_category: :gro
expected_graphql_data.each_with_index do |template, index|
expect(".gitlab/issue_templates/#{template['name']}.md").to eq(template_files.to_a[index][0])
expect(template["content"]).to eq(template_files.to_a[index][1])
expect(template["category"]).to eq("Project Templates")
end
end
@ -61,6 +63,8 @@ RSpec.describe 'getting work item description templates', feature_category: :gro
expect(expected_graphql_data.first["name"]).to eq("project_issues_template_a")
expect(expected_graphql_data.first["content"]).to eq("project_issues_template_a content")
expect(expected_graphql_data.first["category"]).to be_nil
end
end

View File

@ -71,6 +71,23 @@ RSpec.describe Import::ValidateRemoteGitEndpointService, feature_category: :impo
expect(result.success?).to be(true)
end
context 'when server reply with capitized 001e# reply (Bonobo server)' do
let(:valid_response) do
{ status: 200,
body: '001E# service=git-upload-pack',
headers: { 'Content-Type': 'application/x-git-upload-pack-advertisement' } }
end
it 'returns success when HTTP response is valid and contains correct payload' do
stub_full_request(endpoint_url, method: :get).to_return(valid_response)
result = subject.execute
expect(result).to be_a(ServiceResponse)
expect(result.success?).to be(true)
end
end
it 'reports error when status code is not 200' do
error_response = { status: 401 }
stub_full_request(endpoint_url, method: :get).to_return(error_response)

207
yarn.lock
View File

@ -326,7 +326,7 @@
js-tokens "^4.0.0"
picocolors "^1.0.0"
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.4", "@babel/parser@^7.16.8", "@babel/parser@^7.23.5", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7", "@babel/parser@^7.25.3":
"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.8", "@babel/parser@^7.23.5", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7", "@babel/parser@^7.25.3":
version "7.26.3"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234"
integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==
@ -1412,7 +1412,8 @@
resolved "https://registry.yarnpkg.com/@gitlab/fonts/-/fonts-1.3.0.tgz#df89c1bb6714e4a8a5d3272568aa4de7fb337267"
integrity sha512-DoMUIN3DqjEn7wvcxBg/b7Ite5fTdF5EmuOZoBRo2j0UBGweDXmNBi+9HrTZs4cBU660dOxcf1hATFcG3npbPg==
"@gitlab/noop@^1.0.0":
"@gitlab/noop@^1.0.0", jackspeak@^3.1.2, "jackspeak@npm:@gitlab/noop@1.0.0":
name jackspeak
version "1.0.0"
resolved "https://registry.yarnpkg.com/@gitlab/noop/-/noop-1.0.0.tgz#b1ecb8ae6b2abf9b2e28927e4fbb05b7a1b2704b"
integrity sha512-nOltttik5o2BjBo8LnyeTFzHoLpMY/XcCVOC+lm9ZwU+ivEam8wafacMF0KTbRn1KVrIoHYdo70QnqS+vJiOVw==
@ -2097,6 +2098,11 @@
dependencies:
mkdirp "^1.0.4"
"@one-ini/wasm@0.1.1":
version "0.1.1"
resolved "https://registry.yarnpkg.com/@one-ini/wasm/-/wasm-0.1.1.tgz#6013659736c9dbfccc96e8a9c2b3de317df39323"
integrity sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==
"@originjs/vite-plugin-commonjs@^1.0.3":
version "1.0.3"
resolved "https://registry.yarnpkg.com/@originjs/vite-plugin-commonjs/-/vite-plugin-commonjs-1.0.3.tgz#2e3fb11ec78847da9422b79c103953f94d667f09"
@ -3809,16 +3815,6 @@
estree-walker "^2.0.2"
source-map-js "^1.2.0"
"@vue/compiler-core@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.47.tgz#3e07c684d74897ac9aa5922c520741f3029267f8"
integrity sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==
dependencies:
"@babel/parser" "^7.16.4"
"@vue/shared" "3.2.47"
estree-walker "^2.0.2"
source-map "^0.6.1"
"@vue/compiler-core@3.5.13":
version "3.5.13"
resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.5.13.tgz#b0ae6c4347f60c03e849a05d34e5bf747c9bda05"
@ -3830,15 +3826,7 @@
estree-walker "^2.0.2"
source-map-js "^1.2.0"
"@vue/compiler-dom@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz#a0b06caf7ef7056939e563dcaa9cbde30794f305"
integrity sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==
dependencies:
"@vue/compiler-core" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-dom@3.5.13", "@vue/compiler-dom@^3.0.1":
"@vue/compiler-dom@3.5.13":
version "3.5.13"
resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz#bb1b8758dbc542b3658dda973b98a1c9311a8a58"
integrity sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==
@ -3872,14 +3860,6 @@
postcss "^8.4.48"
source-map-js "^1.2.0"
"@vue/compiler-ssr@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz#35872c01a273aac4d6070ab9d8da918ab13057ee"
integrity sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==
dependencies:
"@vue/compiler-dom" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/compiler-ssr@3.5.13":
version "3.5.13"
resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz#e771adcca6d3d000f91a4277c972a996d07f43ba"
@ -3909,33 +3889,26 @@
resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.6.3.tgz#b23a588154cba8986bba82b6e1d0248bde3fd1a0"
integrity sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==
"@vue/server-renderer@^3.0.1":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.47.tgz#8aa1d1871fc4eb5a7851aa7f741f8f700e6de3c0"
integrity sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==
"@vue/server-renderer@^3.5.13":
version "3.5.13"
resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.5.13.tgz#429ead62ee51de789646c22efe908e489aad46f7"
integrity sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==
dependencies:
"@vue/compiler-ssr" "3.2.47"
"@vue/shared" "3.2.47"
"@vue/shared@3.2.47":
version "3.2.47"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.47.tgz#e597ef75086c6e896ff5478a6bfc0a7aa4bbd14c"
integrity sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==
"@vue/compiler-ssr" "3.5.13"
"@vue/shared" "3.5.13"
"@vue/shared@3.5.13":
version "3.5.13"
resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.5.13.tgz#87b309a6379c22b926e696893237826f64339b6f"
integrity sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==
"@vue/test-utils-vue3@npm:@vue/test-utils@2":
version "2.3.1"
resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.3.1.tgz#411883ea52091fa3e59d9b0b83f2934111c10776"
integrity sha512-tRtHRPEETQSUrqXgAewNZHm5iypxDFxwenfdcvMRm1kbGo4bcqHb1XHHlsaIjoDbLkuE2NYiF8vBQDNYrzlrSA==
"@vue/test-utils-vue3@npm:@vue/test-utils@^2.4.6":
version "2.4.6"
resolved "https://registry.yarnpkg.com/@vue/test-utils/-/test-utils-2.4.6.tgz#7d534e70c4319d2a587d6a3b45a39e9695ade03c"
integrity sha512-FMxEjOpYNYiFe0GkaHsnJPXFHxQ6m4t8vI/ElPGpMWxZKpmRvQ33OIrvRXemy6yha03RxhOlQuy+gZMC3CQSow==
dependencies:
js-beautify "1.14.6"
optionalDependencies:
"@vue/compiler-dom" "^3.0.1"
"@vue/server-renderer" "^3.0.1"
js-beautify "^1.14.9"
vue-component-type-helpers "^2.0.0"
"@vue/test-utils@1.3.6":
version "1.3.6"
@ -4173,11 +4146,16 @@ abab@^2.0.6:
resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291"
integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==
abbrev@1, abbrev@^1.0.0:
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
abbrev@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf"
integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==
abort-controller@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@ -5391,7 +5369,7 @@ commander@7, commander@^7.0.0, commander@^7.2.0:
resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
commander@^10.0.1:
commander@^10.0.0, commander@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06"
integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==
@ -6822,6 +6800,16 @@ editorconfig@^0.15.3:
semver "^5.6.0"
sigmund "^1.0.1"
editorconfig@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/editorconfig/-/editorconfig-1.0.4.tgz#040c9a8e9a6c5288388b87c2db07028aa89f53a3"
integrity sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==
dependencies:
"@one-ini/wasm" "0.1.1"
commander "^10.0.0"
minimatch "9.0.1"
semver "^7.5.3"
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@ -8206,27 +8194,17 @@ glob-to-regexp@^0.4.1:
once "^1.3.0"
path-is-absolute "^1.0.0"
glob@^10.3.10, glob@^10.3.7:
version "10.3.10"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b"
integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==
glob@^10.3.10, glob@^10.3.3, glob@^10.3.7:
version "10.4.5"
resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
dependencies:
foreground-child "^3.1.0"
jackspeak "^2.3.5"
minimatch "^9.0.1"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-scurry "^1.10.1"
glob@^8.0.3:
version "8.0.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e"
integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^5.0.1"
once "^1.3.0"
jackspeak "^3.1.2"
minimatch "^9.0.4"
minipass "^7.1.2"
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
global-modules@^2.0.0:
version "2.0.0"
@ -9351,11 +9329,6 @@ iterall@^1.2.1:
resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.3.0.tgz#afcb08492e2915cbd8a0884eb93a8c94d0d72fea"
integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==
jackspeak@^2.3.5, "jackspeak@npm:@gitlab/noop@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@gitlab/noop/-/noop-1.0.0.tgz#b1ecb8ae6b2abf9b2e28927e4fbb05b7a1b2704b"
integrity sha512-nOltttik5o2BjBo8LnyeTFzHoLpMY/XcCVOC+lm9ZwU+ivEam8wafacMF0KTbRn1KVrIoHYdo70QnqS+vJiOVw==
jed@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/jed/-/jed-1.1.1.tgz#7a549bbd9ffe1585b0cd0a191e203055bee574b4"
@ -9794,20 +9767,21 @@ jquery@^3.6.0:
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==
js-beautify@1.14.6, js-beautify@^1.6.12:
version "1.14.6"
resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.14.6.tgz#b23ca5d74a462c282c7711bb51150bcc97f2b507"
integrity sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==
js-beautify@^1.14.9, js-beautify@^1.6.12:
version "1.15.1"
resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.15.1.tgz#4695afb508c324e1084ee0b952a102023fc65b64"
integrity sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==
dependencies:
config-chain "^1.1.13"
editorconfig "^0.15.3"
glob "^8.0.3"
nopt "^6.0.0"
editorconfig "^1.0.4"
glob "^10.3.3"
js-cookie "^3.0.5"
nopt "^7.2.0"
js-cookie@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.1.tgz#9e39b4c6c2f56563708d7d31f6f5f21873a92414"
integrity sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==
js-cookie@^3.0.0, js-cookie@^3.0.5:
version "3.0.5"
resolved "https://registry.yarnpkg.com/js-cookie/-/js-cookie-3.0.5.tgz#0b7e2fd0c01552c58ba86e0841f94dc2557dcdbc"
integrity sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
@ -10196,6 +10170,11 @@ lowlight@^2.9.0:
fault "^2.0.0"
highlight.js "~11.8.0"
lru-cache@^10.2.0:
version "10.4.3"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
lru-cache@^4.1.2, lru-cache@^4.1.5:
version "4.1.5"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
@ -10218,11 +10197,6 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
"lru-cache@^9.1.1 || ^10.0.0":
version "9.1.2"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-9.1.2.tgz#255fdbc14b75589d6d0e73644ca167a8db506835"
integrity sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==
magic-string@^0.30.11:
version "0.30.17"
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.17.tgz#450a449673d2460e5bbcfba9a61916a1714c7453"
@ -11230,6 +11204,13 @@ minimatch@4.2.3:
dependencies:
brace-expansion "^1.1.7"
minimatch@9.0.1:
version "9.0.1"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.1.tgz#8a555f541cf976c622daf078bb28f29fb927c253"
integrity sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==
dependencies:
brace-expansion "^2.0.1"
minimatch@^3.0.4, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
@ -11237,13 +11218,6 @@ minimatch@^3.0.4, minimatch@^3.1.2:
dependencies:
brace-expansion "^1.1.7"
minimatch@^5.0.1:
version "5.1.0"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7"
integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==
dependencies:
brace-expansion "^2.0.1"
minimatch@^7.4.3:
version "7.4.6"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-7.4.6.tgz#845d6f254d8f4a5e4fd6baf44d5f10c8448365fb"
@ -11251,7 +11225,7 @@ minimatch@^7.4.3:
dependencies:
brace-expansion "^2.0.1"
minimatch@^9.0.1, minimatch@^9.0.4:
minimatch@^9.0.4:
version "9.0.5"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5"
integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==
@ -11291,11 +11265,16 @@ minipass@^3.0.0, minipass@^3.1.1:
dependencies:
yallist "^4.0.0"
minipass@^5.0.0, "minipass@^5.0.0 || ^6.0.2 || ^7.0.0":
minipass@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707"
integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==
minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
@ -11630,12 +11609,12 @@ nopt@^5.0.0:
dependencies:
abbrev "1"
nopt@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d"
integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==
nopt@^7.2.0:
version "7.2.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.1.tgz#1cac0eab9b8e97c9093338446eddd40b2c8ca1e7"
integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==
dependencies:
abbrev "^1.0.0"
abbrev "^2.0.0"
nopt@~1.0.10:
version "1.0.10"
@ -11950,6 +11929,11 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json-from-dist@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
pako@~1.0.2, pako@~1.0.5:
version "1.0.11"
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
@ -12092,12 +12076,12 @@ path-parse@^1.0.7:
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
path-scurry@^1.10.1:
version "1.10.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698"
integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==
path-scurry@^1.11.1:
version "1.11.1"
resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
dependencies:
lru-cache "^9.1.1 || ^10.0.0"
lru-cache "^10.2.0"
minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
path-to-regexp@0.1.10:
@ -15211,6 +15195,11 @@ vue-apollo@^3.0.7:
serialize-javascript "^4.0.0"
throttle-debounce "^2.1.0"
vue-component-type-helpers@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/vue-component-type-helpers/-/vue-component-type-helpers-2.2.0.tgz#de5fa802b6beae7125595ec0d3d5195a22691623"
integrity sha512-cYrAnv2me7bPDcg9kIcGwjJiSB6Qyi08+jLDo9yuvoFQjzHiPTzML7RnkJB1+3P6KMsX/KbCD4QE3Tv/knEllw==
vue-demi@^0.14.10:
version "0.14.10"
resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.10.tgz#afc78de3d6f9e11bf78c55e8510ee12814522f04"