Add latest changes from gitlab-org/gitlab@master
This commit is contained in:
parent
807003377d
commit
75e959e683
|
@ -218,6 +218,7 @@ export default {
|
|||
id="fork-url"
|
||||
v-model="selectedNamespace"
|
||||
data-testid="fork-url-input"
|
||||
data-qa-selector="fork_namespace_dropdown"
|
||||
required
|
||||
>
|
||||
<template slot="first">
|
||||
|
@ -291,6 +292,7 @@ export default {
|
|||
category="primary"
|
||||
variant="confirm"
|
||||
data-testid="submit-button"
|
||||
data-qa-selector="fork_project_button"
|
||||
:loading="isSaving"
|
||||
>
|
||||
{{ s__('ForkProject|Fork project') }}
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
<script>
|
||||
import {
|
||||
GlFilteredSearchToken,
|
||||
GlFilteredSearchSuggestion,
|
||||
GlDropdownDivider,
|
||||
GlLoadingIcon,
|
||||
} from '@gitlab/ui';
|
||||
import { debounce } from 'lodash';
|
||||
|
||||
import { deprecatedCreateFlash as createFlash } from '~/flash';
|
||||
import { __ } from '~/locale';
|
||||
|
||||
import { DEFAULT_LABEL_NONE, DEFAULT_LABEL_ANY, DEBOUNCE_DELAY } from '../constants';
|
||||
import { stripQuotes } from '../filtered_search_utils';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
GlFilteredSearchToken,
|
||||
GlFilteredSearchSuggestion,
|
||||
GlDropdownDivider,
|
||||
GlLoadingIcon,
|
||||
},
|
||||
props: {
|
||||
config: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
value: {
|
||||
type: Object,
|
||||
required: true,
|
||||
},
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
emojis: this.config.initialEmojis || [],
|
||||
defaultEmojis: this.config.defaultEmojis || [DEFAULT_LABEL_NONE, DEFAULT_LABEL_ANY],
|
||||
loading: true,
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
currentValue() {
|
||||
return this.value.data.toLowerCase();
|
||||
},
|
||||
activeEmoji() {
|
||||
return this.emojis.find(
|
||||
(emoji) => emoji.name.toLowerCase() === stripQuotes(this.currentValue),
|
||||
);
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
fetchEmojiBySearchTerm(searchTerm) {
|
||||
this.loading = true;
|
||||
this.config
|
||||
.fetchEmojis(searchTerm)
|
||||
.then((res) => {
|
||||
this.emojis = Array.isArray(res) ? res : res.data;
|
||||
})
|
||||
.catch(() => createFlash(__('There was a problem fetching emojis.')))
|
||||
.finally(() => {
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
searchEmojis: debounce(function debouncedSearch({ data }) {
|
||||
this.fetchEmojiBySearchTerm(data);
|
||||
}, DEBOUNCE_DELAY),
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<gl-filtered-search-token
|
||||
:config="config"
|
||||
v-bind="{ ...$props, ...$attrs }"
|
||||
v-on="$listeners"
|
||||
@input="searchEmojis"
|
||||
>
|
||||
<template #view="{ inputValue }">
|
||||
<gl-emoji v-if="activeEmoji" :data-name="activeEmoji.name" />
|
||||
<span v-else>{{ inputValue }}</span>
|
||||
</template>
|
||||
<template #suggestions>
|
||||
<gl-filtered-search-suggestion
|
||||
v-for="emoji in defaultEmojis"
|
||||
:key="emoji.value"
|
||||
:value="emoji.value"
|
||||
>
|
||||
{{ emoji.value }}
|
||||
</gl-filtered-search-suggestion>
|
||||
<gl-dropdown-divider v-if="defaultEmojis.length" />
|
||||
<gl-loading-icon v-if="loading" />
|
||||
<template v-else>
|
||||
<gl-filtered-search-suggestion
|
||||
v-for="emoji in emojis"
|
||||
:key="emoji.name"
|
||||
:value="emoji.name"
|
||||
>
|
||||
<div class="gl-display-flex">
|
||||
<gl-emoji :data-name="emoji.name" />
|
||||
<span class="gl-ml-3">{{ emoji.name }}</span>
|
||||
</div>
|
||||
</gl-filtered-search-suggestion>
|
||||
</template>
|
||||
</template>
|
||||
</gl-filtered-search-token>
|
||||
</template>
|
|
@ -31026,6 +31026,9 @@ msgstr ""
|
|||
msgid "There was a problem fetching branches."
|
||||
msgstr ""
|
||||
|
||||
msgid "There was a problem fetching emojis."
|
||||
msgstr ""
|
||||
|
||||
msgid "There was a problem fetching groups."
|
||||
msgstr ""
|
||||
|
||||
|
|
|
@ -96,7 +96,7 @@
|
|||
"emoji-unicode-version": "^0.2.1",
|
||||
"exports-loader": "^0.7.0",
|
||||
"fast-mersenne-twister": "1.0.2",
|
||||
"file-loader": "^5.1.0",
|
||||
"file-loader": "^6.2.0",
|
||||
"fuzzaldrin-plus": "^0.6.0",
|
||||
"graphql": "^15.4.0",
|
||||
"graphql-tag": "^2.11.0",
|
||||
|
@ -142,7 +142,7 @@
|
|||
"tiptap": "^1.32.1",
|
||||
"tiptap-commands": "^1.17.1",
|
||||
"tiptap-extensions": "^1.35.1",
|
||||
"url-loader": "^3.0.0",
|
||||
"url-loader": "^4.1.1",
|
||||
"uuid": "8.1.0",
|
||||
"visibilityjs": "^1.2.4",
|
||||
"vue": "^2.6.12",
|
||||
|
|
|
@ -13,8 +13,18 @@ module QA
|
|||
element :fork_groups_list_search_field
|
||||
end
|
||||
|
||||
def choose_namespace(namespace = Runtime::Namespace.path)
|
||||
click_element(:fork_namespace_button, name: namespace)
|
||||
view 'app/assets/javascripts/pages/projects/forks/new/components/fork_form.vue' do
|
||||
element :fork_namespace_dropdown
|
||||
element :fork_project_button
|
||||
end
|
||||
|
||||
def fork_project(namespace = Runtime::Namespace.path)
|
||||
if has_element?(:fork_namespace_button, wait: 0)
|
||||
click_element(:fork_namespace_button, name: namespace)
|
||||
else
|
||||
select_element(:fork_namespace_dropdown, namespace)
|
||||
click_element(:fork_project_button)
|
||||
end
|
||||
end
|
||||
|
||||
def search_for_group(group_name)
|
||||
|
|
|
@ -3,6 +3,8 @@
|
|||
module QA
|
||||
module Resource
|
||||
class Fork < Base
|
||||
attr_accessor :namespace_path
|
||||
|
||||
attribute :name do
|
||||
upstream.name
|
||||
end
|
||||
|
@ -31,6 +33,8 @@ module QA
|
|||
def fabricate!
|
||||
populate(:upstream, :user)
|
||||
|
||||
namespace_path ||= user.name
|
||||
|
||||
# Sign out as admin and sign is as the fork user
|
||||
Page::Main::Menu.perform(&:sign_out)
|
||||
Runtime::Browser.visit(:gitlab, Page::Main::Login)
|
||||
|
@ -43,11 +47,11 @@ module QA
|
|||
Page::Project::Show.perform(&:fork_project)
|
||||
|
||||
Page::Project::Fork::New.perform do |fork_new|
|
||||
fork_new.choose_namespace(user.name)
|
||||
fork_new.fork_project(namespace_path)
|
||||
end
|
||||
|
||||
Page::Layout::Banner.perform do |banner|
|
||||
banner.has_notice?('The project was successfully forked.')
|
||||
Page::Project::Show.perform do |project_page|
|
||||
raise ResourceFabricationFailedError, "Forking failed!" unless project_page.forked_from?(upstream.name)
|
||||
end
|
||||
|
||||
populate(:project)
|
||||
|
|
|
@ -2,14 +2,12 @@
|
|||
|
||||
module QA
|
||||
RSpec.describe 'Create' do
|
||||
describe 'Merge request creation from fork' do
|
||||
let!(:merge_request) do
|
||||
Resource::MergeRequestFromFork.fabricate_via_browser_ui! do |merge_request|
|
||||
describe 'Merge request creation from fork', :smoke do
|
||||
it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1701' do
|
||||
merge_request = Resource::MergeRequestFromFork.fabricate_via_browser_ui! do |merge_request|
|
||||
merge_request.fork_branch = 'feature-branch'
|
||||
end
|
||||
end
|
||||
|
||||
it 'can merge feature branch fork to mainline', testcase: 'https://gitlab.com/gitlab-org/quality/testcases/-/issues/1701' do
|
||||
Flow::Login.while_signed_in do
|
||||
merge_request.visit!
|
||||
|
||||
|
|
|
@ -3,6 +3,7 @@ import { mockLabels } from 'jest/vue_shared/components/sidebar/labels_select_vue
|
|||
import Api from '~/api';
|
||||
import AuthorToken from '~/vue_shared/components/filtered_search_bar/tokens/author_token.vue';
|
||||
import BranchToken from '~/vue_shared/components/filtered_search_bar/tokens/branch_token.vue';
|
||||
import EmojiToken from '~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue';
|
||||
import LabelToken from '~/vue_shared/components/filtered_search_bar/tokens/label_token.vue';
|
||||
import MilestoneToken from '~/vue_shared/components/filtered_search_bar/tokens/milestone_token.vue';
|
||||
|
||||
|
@ -59,6 +60,16 @@ export const mockMilestones = [
|
|||
mockEscapedMilestone,
|
||||
];
|
||||
|
||||
export const mockEmoji1 = {
|
||||
name: 'thumbsup',
|
||||
};
|
||||
|
||||
export const mockEmoji2 = {
|
||||
name: 'star',
|
||||
};
|
||||
|
||||
export const mockEmojis = [mockEmoji1, mockEmoji2];
|
||||
|
||||
export const mockBranchToken = {
|
||||
type: 'source_branch',
|
||||
icon: 'branch',
|
||||
|
@ -103,6 +114,16 @@ export const mockMilestoneToken = {
|
|||
fetchMilestones: () => Promise.resolve({ data: mockMilestones }),
|
||||
};
|
||||
|
||||
export const mockReactionEmojiToken = {
|
||||
type: 'my_reaction_emoji',
|
||||
icon: 'thumb-up',
|
||||
title: 'My-Reaction',
|
||||
unique: true,
|
||||
token: EmojiToken,
|
||||
operators: [{ value: '=', description: 'is', default: 'true' }],
|
||||
fetchEmojis: () => Promise.resolve(mockEmojis),
|
||||
};
|
||||
|
||||
export const mockMembershipToken = {
|
||||
type: 'with_inherited_permissions',
|
||||
icon: 'group',
|
||||
|
|
|
@ -0,0 +1,217 @@
|
|||
import {
|
||||
GlFilteredSearchToken,
|
||||
GlFilteredSearchSuggestion,
|
||||
GlFilteredSearchTokenSegment,
|
||||
GlDropdownDivider,
|
||||
} from '@gitlab/ui';
|
||||
import { mount } from '@vue/test-utils';
|
||||
import MockAdapter from 'axios-mock-adapter';
|
||||
import waitForPromises from 'helpers/wait_for_promises';
|
||||
import { deprecatedCreateFlash as createFlash } from '~/flash';
|
||||
import axios from '~/lib/utils/axios_utils';
|
||||
|
||||
import {
|
||||
DEFAULT_LABEL_NONE,
|
||||
DEFAULT_LABEL_ANY,
|
||||
} from '~/vue_shared/components/filtered_search_bar/constants';
|
||||
import EmojiToken from '~/vue_shared/components/filtered_search_bar/tokens/emoji_token.vue';
|
||||
|
||||
import { mockReactionEmojiToken, mockEmojis } from '../mock_data';
|
||||
|
||||
jest.mock('~/flash');
|
||||
const GlEmoji = { template: '<img/>' };
|
||||
const defaultStubs = {
|
||||
Portal: true,
|
||||
GlFilteredSearchSuggestionList: {
|
||||
template: '<div></div>',
|
||||
methods: {
|
||||
getValue: () => '=',
|
||||
},
|
||||
},
|
||||
GlEmoji,
|
||||
};
|
||||
|
||||
function createComponent(options = {}) {
|
||||
const {
|
||||
config = mockReactionEmojiToken,
|
||||
value = { data: '' },
|
||||
active = false,
|
||||
stubs = defaultStubs,
|
||||
} = options;
|
||||
return mount(EmojiToken, {
|
||||
propsData: {
|
||||
config,
|
||||
value,
|
||||
active,
|
||||
},
|
||||
provide: {
|
||||
portalName: 'fake target',
|
||||
alignSuggestions: function fakeAlignSuggestions() {},
|
||||
suggestionsListClass: 'custom-class',
|
||||
},
|
||||
stubs,
|
||||
});
|
||||
}
|
||||
|
||||
describe('EmojiToken', () => {
|
||||
let mock;
|
||||
let wrapper;
|
||||
|
||||
beforeEach(() => {
|
||||
mock = new MockAdapter(axios);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
mock.restore();
|
||||
wrapper.destroy();
|
||||
});
|
||||
|
||||
describe('computed', () => {
|
||||
beforeEach(async () => {
|
||||
wrapper = createComponent({ value: { data: mockEmojis[0].name } });
|
||||
|
||||
wrapper.setData({
|
||||
emojis: mockEmojis,
|
||||
});
|
||||
|
||||
await wrapper.vm.$nextTick();
|
||||
});
|
||||
|
||||
describe('currentValue', () => {
|
||||
it('returns lowercase string for `value.data`', () => {
|
||||
expect(wrapper.vm.currentValue).toBe(mockEmojis[0].name);
|
||||
});
|
||||
});
|
||||
|
||||
describe('activeEmoji', () => {
|
||||
it('returns object for currently present `value.data`', () => {
|
||||
expect(wrapper.vm.activeEmoji).toEqual(mockEmojis[0]);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('methods', () => {
|
||||
beforeEach(() => {
|
||||
wrapper = createComponent();
|
||||
});
|
||||
|
||||
describe('fetchEmojiBySearchTerm', () => {
|
||||
it('calls `config.fetchEmojis` with provided searchTerm param', () => {
|
||||
jest.spyOn(wrapper.vm.config, 'fetchEmojis');
|
||||
|
||||
wrapper.vm.fetchEmojiBySearchTerm('foo');
|
||||
|
||||
expect(wrapper.vm.config.fetchEmojis).toHaveBeenCalledWith('foo');
|
||||
});
|
||||
|
||||
it('sets response to `emojis` when request is successful', () => {
|
||||
jest.spyOn(wrapper.vm.config, 'fetchEmojis').mockResolvedValue(mockEmojis);
|
||||
|
||||
wrapper.vm.fetchEmojiBySearchTerm('foo');
|
||||
|
||||
return waitForPromises().then(() => {
|
||||
expect(wrapper.vm.emojis).toEqual(mockEmojis);
|
||||
});
|
||||
});
|
||||
|
||||
it('calls `createFlash` with flash error message when request fails', () => {
|
||||
jest.spyOn(wrapper.vm.config, 'fetchEmojis').mockRejectedValue({});
|
||||
|
||||
wrapper.vm.fetchEmojiBySearchTerm('foo');
|
||||
|
||||
return waitForPromises().then(() => {
|
||||
expect(createFlash).toHaveBeenCalledWith('There was a problem fetching emojis.');
|
||||
});
|
||||
});
|
||||
|
||||
it('sets `loading` to false when request completes', () => {
|
||||
jest.spyOn(wrapper.vm.config, 'fetchEmojis').mockRejectedValue({});
|
||||
|
||||
wrapper.vm.fetchEmojiBySearchTerm('foo');
|
||||
|
||||
return waitForPromises().then(() => {
|
||||
expect(wrapper.vm.loading).toBe(false);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('template', () => {
|
||||
const defaultEmojis = [DEFAULT_LABEL_NONE, DEFAULT_LABEL_ANY];
|
||||
|
||||
beforeEach(async () => {
|
||||
wrapper = createComponent({
|
||||
value: { data: `"${mockEmojis[0].name}"` },
|
||||
});
|
||||
|
||||
wrapper.setData({
|
||||
emojis: mockEmojis,
|
||||
});
|
||||
|
||||
await wrapper.vm.$nextTick();
|
||||
});
|
||||
|
||||
it('renders gl-filtered-search-token component', () => {
|
||||
expect(wrapper.find(GlFilteredSearchToken).exists()).toBe(true);
|
||||
});
|
||||
|
||||
it('renders token item when value is selected', () => {
|
||||
const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
|
||||
|
||||
expect(tokenSegments).toHaveLength(3); // My Reaction, =, "thumbsup"
|
||||
expect(tokenSegments.at(2).find(GlEmoji).attributes('data-name')).toEqual('thumbsup');
|
||||
});
|
||||
|
||||
it('renders provided defaultEmojis as suggestions', async () => {
|
||||
wrapper = createComponent({
|
||||
active: true,
|
||||
config: { ...mockReactionEmojiToken, defaultEmojis },
|
||||
stubs: { Portal: true, GlEmoji },
|
||||
});
|
||||
const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
|
||||
const suggestionsSegment = tokenSegments.at(2);
|
||||
suggestionsSegment.vm.$emit('activate');
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
|
||||
|
||||
expect(suggestions).toHaveLength(defaultEmojis.length);
|
||||
defaultEmojis.forEach((emoji, index) => {
|
||||
expect(suggestions.at(index).text()).toBe(emoji.text);
|
||||
});
|
||||
});
|
||||
|
||||
it('does not render divider when no defaultEmojis', async () => {
|
||||
wrapper = createComponent({
|
||||
active: true,
|
||||
config: { ...mockReactionEmojiToken, defaultEmojis: [] },
|
||||
stubs: { Portal: true, GlEmoji },
|
||||
});
|
||||
const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
|
||||
const suggestionsSegment = tokenSegments.at(2);
|
||||
suggestionsSegment.vm.$emit('activate');
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
expect(wrapper.find(GlFilteredSearchSuggestion).exists()).toBe(false);
|
||||
expect(wrapper.find(GlDropdownDivider).exists()).toBe(false);
|
||||
});
|
||||
|
||||
it('renders `DEFAULT_LABEL_NONE` and `DEFAULT_LABEL_ANY` as default suggestions', async () => {
|
||||
wrapper = createComponent({
|
||||
active: true,
|
||||
config: { ...mockReactionEmojiToken },
|
||||
stubs: { Portal: true, GlEmoji },
|
||||
});
|
||||
const tokenSegments = wrapper.findAll(GlFilteredSearchTokenSegment);
|
||||
const suggestionsSegment = tokenSegments.at(2);
|
||||
suggestionsSegment.vm.$emit('activate');
|
||||
await wrapper.vm.$nextTick();
|
||||
|
||||
const suggestions = wrapper.findAll(GlFilteredSearchSuggestion);
|
||||
|
||||
expect(suggestions).toHaveLength(2);
|
||||
expect(suggestions.at(0).text()).toBe(DEFAULT_LABEL_NONE.text);
|
||||
expect(suggestions.at(1).text()).toBe(DEFAULT_LABEL_ANY.text);
|
||||
});
|
||||
});
|
||||
});
|
44
yarn.lock
44
yarn.lock
|
@ -5150,13 +5150,13 @@ file-entry-cache@^6.0.0, file-entry-cache@^6.0.1:
|
|||
dependencies:
|
||||
flat-cache "^3.0.4"
|
||||
|
||||
file-loader@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-5.1.0.tgz#cb56c070efc0e40666424309bd0d9e45ac6f2bb8"
|
||||
integrity sha512-u/VkLGskw3Ue59nyOwUwXI/6nuBCo7KBkniB/l7ICwr/7cPNGsL1WCXUp3GB0qgOOKU1TiP49bv4DZF/LJqprg==
|
||||
file-loader@^6.2.0:
|
||||
version "6.2.0"
|
||||
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
|
||||
integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
|
||||
dependencies:
|
||||
loader-utils "^1.4.0"
|
||||
schema-utils "^2.5.0"
|
||||
loader-utils "^2.0.0"
|
||||
schema-utils "^3.0.0"
|
||||
|
||||
fileset@^2.0.3:
|
||||
version "2.0.3"
|
||||
|
@ -8259,17 +8259,17 @@ miller-rabin@^4.0.0:
|
|||
bn.js "^4.0.0"
|
||||
brorand "^1.0.1"
|
||||
|
||||
mime-db@1.44.0, "mime-db@>= 1.40.0 < 2":
|
||||
version "1.44.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
|
||||
integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
|
||||
mime-db@1.47.0, "mime-db@>= 1.40.0 < 2":
|
||||
version "1.47.0"
|
||||
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
|
||||
integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
|
||||
|
||||
mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
|
||||
version "2.1.27"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
|
||||
integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
|
||||
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24:
|
||||
version "2.1.30"
|
||||
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
|
||||
integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
|
||||
dependencies:
|
||||
mime-db "1.44.0"
|
||||
mime-db "1.47.0"
|
||||
|
||||
mime@1.6.0:
|
||||
version "1.6.0"
|
||||
|
@ -12004,14 +12004,14 @@ urix@^0.1.0:
|
|||
resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
|
||||
integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
|
||||
|
||||
url-loader@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-3.0.0.tgz#9f1f11b371acf6e51ed15a50db635e02eec18368"
|
||||
integrity sha512-a84JJbIA5xTFTWyjjcPdnsu+41o/SNE8SpXMdUvXs6Q+LuhCD9E2+0VCiuDWqgo3GGXVlFHzArDmBpj9PgWn4A==
|
||||
url-loader@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-4.1.1.tgz#28505e905cae158cf07c92ca622d7f237e70a4e2"
|
||||
integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==
|
||||
dependencies:
|
||||
loader-utils "^1.2.3"
|
||||
mime "^2.4.4"
|
||||
schema-utils "^2.5.0"
|
||||
loader-utils "^2.0.0"
|
||||
mime-types "^2.1.27"
|
||||
schema-utils "^3.0.0"
|
||||
|
||||
url-parse-lax@^3.0.0:
|
||||
version "3.0.0"
|
||||
|
|
Loading…
Reference in New Issue