Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-docs.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvan Read <eread@gitlab.com>2022-07-28 01:57:30 +0300
committerEvan Read <eread@gitlab.com>2022-07-28 01:57:30 +0300
commit716635c93d4e06eb8093c30ba0cbd68f1204d62c (patch)
treed3db08465c3b7e5e4b1a7c4409ce932b053dfb4a
parent1b73374b56bbbea88786e031cc03963e99ebd898 (diff)
parent69de0ea0dece446c36938ffc0fc8401d5557dbb8 (diff)
Merge branch 'versions-menu-14.10' into '14.10'
Backport Versions menu to 14.10 See merge request gitlab-org/gitlab-docs!2972
-rw-r--r--commands/frontend.rb9
-rw-r--r--content/assets/stylesheets/stylesheet.scss41
-rw-r--r--content/frontend/default/components/versions_menu.vue94
-rw-r--r--content/frontend/default/default.js17
-rw-r--r--content/frontend/default/environment.js22
-rw-r--r--content/frontend/home/index.js3
-rw-r--r--content/frontend/services/fetch_versions.js8
-rw-r--r--layouts/cta.html2
-rw-r--r--layouts/docsearch.html2
-rw-r--r--layouts/head.html2
-rw-r--r--layouts/header.html33
-rw-r--r--layouts/home.html1
-rw-r--r--layouts/redirect.html2
-rw-r--r--package.json2
-rw-r--r--rollup.config.js8
-rw-r--r--spec/frontend/default/components/helpers/versions_menu_helper.js14
-rw-r--r--spec/frontend/default/components/versions_menu_spec.js87
-rw-r--r--yarn.lock29
18 files changed, 313 insertions, 63 deletions
diff --git a/commands/frontend.rb b/commands/frontend.rb
index fd691f97..50b46af6 100644
--- a/commands/frontend.rb
+++ b/commands/frontend.rb
@@ -26,13 +26,4 @@ run do |opts, args, cmd|
ERROR
end
- puts 'Create icons.svg ...'
- root = File.expand_path('../', __dir__)
- path = 'node_modules/@gitlab/svgs/dist/icons.svg'
-
- if File.write('public/assets/images/icons.svg', File.read("#{root}/#{path}"))
- puts 'Done!'
- else
- puts 'Failed to create icons.svg!'
- end
end
diff --git a/content/assets/stylesheets/stylesheet.scss b/content/assets/stylesheets/stylesheet.scss
index fd939d48..63c22163 100644
--- a/content/assets/stylesheets/stylesheet.scss
+++ b/content/assets/stylesheets/stylesheet.scss
@@ -280,23 +280,8 @@ ol {
}
}
- .btn {
- line-height: 1rem;
- font-size: 0.875rem;
- }
-
.navbar-nav {
margin-top: 0;
-
- .dropdown-menu {
- a {
- border-bottom: 0;
-
- &:hover {
- border-bottom: 0;
- }
- }
- }
}
.nav-item {
@@ -312,8 +297,30 @@ ol {
color: $gds-indigo-100;
}
- .dropdown-toggle {
+ .btn,
+ .gl-dropdown-toggle.gl-button.btn-default,
+ .gl-dropdown-toggle.gl-button.btn-default:hover,
+ .gl-dropdown-toggle.gl-button.btn-default:focus {
background-color: $help-indigo-500;
+ color: $gds-white;
+ box-shadow: none;
+ font-size: 0.875rem;
+ line-height: 1;
+ svg {
+ fill: $gds-white;
+ }
+ }
+ .dropdown-menu:focus-visible,
+ .gl-new-dropdown-inner:focus-visible,
+ .gl-new-dropdown-contents:focus-visible {
+ outline: none;
+ }
+
+ p.gl-new-dropdown-item-text-primary {
+ margin: 0;
+ }
+ .dropdown-toggle::after {
+ display: none;
}
@media all and (max-width: $bp-md) {
@@ -478,7 +485,7 @@ ol {
}
.btn-cta {
- background-color: $header-free-trial-button-color;
+ background-color: $header-free-trial-button-color !important;
}
h2[id]::before,
diff --git a/content/frontend/default/components/versions_menu.vue b/content/frontend/default/components/versions_menu.vue
new file mode 100644
index 00000000..f29e7af5
--- /dev/null
+++ b/content/frontend/default/components/versions_menu.vue
@@ -0,0 +1,94 @@
+<script>
+import { GlDropdown, GlDropdownItem, GlDropdownDivider } from '@gitlab/ui';
+import { getVersions } from '../../services/fetch_versions';
+import { isGitLabHosted } from '../environment';
+
+export default {
+ components: {
+ GlDropdown,
+ GlDropdownItem,
+ GlDropdownDivider,
+ },
+ data() {
+ return {
+ versions: {},
+ activeVersion: '',
+ };
+ },
+ async created() {
+ // Only build this menu if this is a GitLab-hosted copy of the site.
+ // Self-hosted Docs will only contain a single version.
+ if (isGitLabHosted()) {
+ try {
+ this.versions = await getVersions();
+ this.activeVersion = this.getActiveVersion(this.versions);
+ } catch (err) {
+ console.error(`Failed to fetch versions.json: ${err}`); // eslint-disable-line no-console
+ }
+ }
+ },
+ methods: {
+ getVersionPath(versionNumber) {
+ let path = window.location.pathname;
+
+ // If we're viewing an older version, drop its version prefix when creating links.
+ if (this.activeVersion !== this.versions.next) {
+ const pathArr = window.location.pathname.split('/').filter((n) => n);
+ pathArr.shift();
+ path = `/${pathArr.join('/')}`;
+ }
+
+ if (versionNumber) {
+ path = `/${versionNumber}${path}`;
+ }
+ return path;
+ },
+ getActiveVersion(versions) {
+ let activeVersion = versions.next;
+
+ // Check if the first item in the URL path is a valid version.
+ // If so, that should be the active menu item.
+ const versionPath = window.location.pathname.split('/')[1];
+
+ Object.keys(versions).forEach((key) => {
+ if (
+ versions[key] === versionPath ||
+ (versions[key].constructor === Array && versions[key].includes(versionPath))
+ ) {
+ activeVersion = versionPath;
+ }
+ });
+ return activeVersion;
+ },
+ },
+};
+</script>
+
+<template>
+ <gl-dropdown
+ v-if="versions.next"
+ :text="activeVersion"
+ class="mb-2 mb-md-0 mr-md-3 ml-md-3 d-flex"
+ data-testid="versions-menu"
+ >
+ <gl-dropdown-item :href="getVersionPath()">
+ <span data-testid="next-version">{{ versions.next }}</span> (not yet released)
+ </gl-dropdown-item>
+ <gl-dropdown-divider />
+
+ <gl-dropdown-item :href="getVersionPath(versions.current)">
+ {{ versions.current }} (recently released)
+ </gl-dropdown-item>
+ <gl-dropdown-item v-for="v in versions.last_minor" :key="v" :href="getVersionPath(v)">
+ {{ v }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider />
+
+ <gl-dropdown-item v-for="v in versions.last_major" :key="v" :href="getVersionPath(v)">
+ {{ v }}
+ </gl-dropdown-item>
+ <gl-dropdown-divider />
+
+ <gl-dropdown-item href="/archives">Archives</gl-dropdown-item>
+ </gl-dropdown>
+</template>
diff --git a/content/frontend/default/default.js b/content/frontend/default/default.js
index db3786f2..119842e8 100644
--- a/content/frontend/default/default.js
+++ b/content/frontend/default/default.js
@@ -2,6 +2,7 @@ import Vue from 'vue';
import NavigationToggle from './components/navigation_toggle.vue';
import VersionBanner from './components/version_banner.vue';
import { setupTableOfContents } from './setup_table_of_contents';
+import VersionsMenu from './components/versions_menu.vue';
function fixScrollPosition() {
if (!window.location.hash || !document.querySelector(window.location.hash)) return;
@@ -17,6 +18,10 @@ function fixScrollPosition() {
document.addEventListener('DOMContentLoaded', () => {
const versionBanner = document.querySelector('#js-version-banner');
+ if (!versionBanner) {
+ return;
+ }
+
const isOutdated = versionBanner.hasAttribute('data-is-outdated');
const { latestVersionUrl, archivesUrl } = versionBanner.dataset;
@@ -58,3 +63,15 @@ document.addEventListener('DOMContentLoaded', () => {
setupTableOfContents();
});
+
+document.addEventListener('DOMContentLoaded', () => {
+ return new Vue({
+ el: '.js-versions-menu',
+ components: {
+ VersionsMenu,
+ },
+ render(createElement) {
+ return createElement(VersionsMenu);
+ },
+ });
+});
diff --git a/content/frontend/default/environment.js b/content/frontend/default/environment.js
new file mode 100644
index 00000000..05e8ced5
--- /dev/null
+++ b/content/frontend/default/environment.js
@@ -0,0 +1,22 @@
+/**
+ * Utilities for determining site environment.
+ */
+
+export const GlHosts = [
+ {
+ environment: 'production',
+ host: 'docs.gitlab.com',
+ },
+ {
+ environment: 'review',
+ host: '35.193.151.162.nip.io',
+ },
+ {
+ environment: 'local',
+ host: 'localhost',
+ },
+];
+
+export function isGitLabHosted() {
+ return GlHosts.some((e) => window.location.host.includes(e.host));
+}
diff --git a/content/frontend/home/index.js b/content/frontend/home/index.js
index 3815e1b3..c64549e9 100644
--- a/content/frontend/home/index.js
+++ b/content/frontend/home/index.js
@@ -6,5 +6,8 @@ document.addEventListener('DOMContentLoaded', () => {
container: '#docsearch',
appId: '3PNCFOU757',
placeholder: 'Search the docs',
+ searchParameters: {
+ facetFilters: [`version:14.10`],
+ },
});
});
diff --git a/content/frontend/services/fetch_versions.js b/content/frontend/services/fetch_versions.js
new file mode 100644
index 00000000..e65f396c
--- /dev/null
+++ b/content/frontend/services/fetch_versions.js
@@ -0,0 +1,8 @@
+export function getVersions() {
+ return fetch('https://docs.gitlab.com/versions.json')
+ .then((response) => response.json())
+ .then((data) => {
+ return data[0];
+ })
+ .catch((error) => console.error(error)); // eslint-disable-line no-console
+}
diff --git a/layouts/cta.html b/layouts/cta.html
index 885378b6..29d6a920 100644
--- a/layouts/cta.html
+++ b/layouts/cta.html
@@ -1,3 +1,3 @@
-<a class="btn btn-danger btn-cta text-white" href="https://about.gitlab.com/free-trial/?glm_source=docs.gitlab.com&glm_content=navigation-cta-docs" target="_blank" rel="noopener noreferrer" role="button">
+<a class="gl-button btn btn-cta text-white gl-shadow-none! gl-md-pr-3" href="https://about.gitlab.com/free-trial/?glm_source=docs.gitlab.com&glm_content=navigation-cta-docs" target="_blank" rel="noopener noreferrer" role="button">
Get free trial
</a>
diff --git a/layouts/docsearch.html b/layouts/docsearch.html
index f09949f1..71a89ceb 100644
--- a/layouts/docsearch.html
+++ b/layouts/docsearch.html
@@ -1,3 +1,3 @@
<!-- Algolia docsearch https://community.algolia.com/docsearch/ -->
-<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/@docsearch/js@alpha"></script>
+<script src="https://cdn.jsdelivr.net/npm/@docsearch/js@3.0.0/dist/umd/index.min.js"></script>
<script src="<%= @items['/assets/javascripts/docsearch.*'].path %>"></script>
diff --git a/layouts/head.html b/layouts/head.html
index 30b8ef6d..55c42b31 100644
--- a/layouts/head.html
+++ b/layouts/head.html
@@ -39,7 +39,7 @@
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<!-- end of fontawesome -->
<!-- Docsearch https://community.algolia.com/docsearch/ - via CDN -->
-<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@alpha" />
+<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3.0.0/dist/style.css" />
<!-- end of docsearch -->
<% if production? %>
diff --git a/layouts/header.html b/layouts/header.html
index 083744d1..1788c4a2 100644
--- a/layouts/header.html
+++ b/layouts/header.html
@@ -22,36 +22,9 @@
<a class="nav-link" href="https://about.gitlab.com/releases/categories/releases/" target="_blank">What's new?</a>
</li>
</ul>
- <ul class="navbar-nav mb-0">
- <li class="nav-item p-2 dropdown">
- <button class="btn dropdown-toggle text-white" type="button" id="navbarDropdown" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
- <%= version_dropdown_title %>
- </button>
- <div class="dropdown-menu" aria-labelledby="navbarDropdown">
- <a class="dropdown-item" <%= active_dropdown(ENV['CI_DEFAULT_BRANCH']) %> href='<%= @item.identifier.without_ext + '.html' %>' class="versions-tooltip"><%= dotcom %>
- <i class="fa fa-question-circle-o" aria-hidden="true" data-toggle="tooltip" data-placement="bottom" title="Latest pre-release version of GitLab, with features available or about to become available on GitLab.com. For self-managed GitLab installations, select your version number as listed at your GitLab instance's /help URL."></i>
- </a>
- <% if display_previous_versions? %>
- <!-- Start of online versions -->
- <div class="dropdown-divider"></div>
- <% data_versions[:online].each do |version| %>
- <%= render '/partials/versions_list.*', version: version %>
- <% end %>
- <!-- End of online versions -->
-
- <!-- Start of last major versions -->
- <div class="dropdown-divider"></div>
- <% data_versions[:previous_majors].each do |version| %>
- <%= render '/partials/versions_list.*', version: version %>
- <% end %>
- <!-- End of last major versions -->
-
- <% end %>
- <div class="dropdown-divider"></div>
- <a class="dropdown-item" <%= active_dropdown('archives') %> href='/archives/'>Archives</a>
- </div>
- </li>
- <li class="nav-item p-2">
+ <div class="js-versions-menu"></div>
+ <ul class="navbar-nav gl-mb-3 gl-md-mb-0 gl-md-pr-3">
+ <li class="nav-item">
<% if @item.identifier.to_s.split('/')[1] == 'omnibus' %>
<%= render '/cta_omnibus.*' %>
<% else %>
diff --git a/layouts/home.html b/layouts/home.html
index d5aefa52..39f85629 100644
--- a/layouts/home.html
+++ b/layouts/home.html
@@ -19,5 +19,6 @@
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js" integrity="sha384-LtrjvnR4Twt/qOuYxE721u19sVFLVSA4hf/rRt6PrZTmiPltdZcI7q7PXQBYTKyf" crossorigin="anonymous"></script>
<script type="application/javascript" src="<%= @items['/assets/javascripts/badges.*'].path %>"></script>
+ <script src="<%= @items['/frontend/default/default.*'].path %>"></script>
</body>
</html>
diff --git a/layouts/redirect.html b/layouts/redirect.html
index 5533ba91..7cd451fb 100644
--- a/layouts/redirect.html
+++ b/layouts/redirect.html
@@ -10,7 +10,7 @@
<link rel="stylesheet" href="<%= @items['/assets/stylesheets/stylesheet.*'].path %>">
<link rel="stylesheet" href="<%= @items['/assets/stylesheets/footer.*'].path %>">
<!-- Docsearch https://community.algolia.com/docsearch/ - via CDN -->
- <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/docsearch.js@2/dist/cdn/docsearch.min.css">
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@docsearch/css@3.0.0/dist/style.css" />
<!-- end of docsearch -->
<script async src="<%= @items['/assets/javascripts/docs.*'].path %>"></script>
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,400italic' rel='stylesheet' type='text/css'>
diff --git a/package.json b/package.json
index f66a1029..ae4df5d6 100644
--- a/package.json
+++ b/package.json
@@ -30,6 +30,7 @@
"postcss": "^8.4.12",
"prettier": "^2.6.2",
"rollup": "^2.70.1",
+ "flush-promises": "^1.0.2",
"rollup-plugin-import-resolver": "^1.2.1",
"rollup-plugin-svg": "^2.0.0",
"rollup-plugin-vue": "^5.1.9",
@@ -44,6 +45,7 @@
"bootstrap": "^4.6.1",
"eslint-plugin-filenames": "^1.3.2",
"instantsearch.js": "^4.40.3",
+ "@rollup/plugin-url": "^7.0.0",
"pikaday": "^1.8.2",
"vue": "^2.6.14"
}
diff --git a/rollup.config.js b/rollup.config.js
index 29efc1b0..d6f91eab 100644
--- a/rollup.config.js
+++ b/rollup.config.js
@@ -2,11 +2,11 @@ const inject = require('@rollup/plugin-inject');
const json = require('@rollup/plugin-json');
const { nodeResolve } = require('@rollup/plugin-node-resolve');
const replace = require('@rollup/plugin-replace');
+const url = require('@rollup/plugin-url');
const glob = require('glob');
const commonjs = require('@rollup/plugin-commonjs');
const { babel } = require('@rollup/plugin-babel');
const importResolver = require('rollup-plugin-import-resolver');
-const svg = require('rollup-plugin-svg');
const vue = require('rollup-plugin-vue');
function mapDirectory(file) {
@@ -24,10 +24,14 @@ module.exports = glob.sync('content/frontend/**/*.js').map((file) => ({
nodeResolve({ browser: true, preferBuiltins: false }),
commonjs(),
vue(),
- svg(),
inject({
exclude: 'node_modules/**',
}),
+ url({
+ destDir: 'public/assets/images',
+ publicPath: '/assets/images/',
+ fileName: 'icons.svg',
+ }),
babel({
exclude: 'node_modules/**',
babelHelpers: 'bundled',
diff --git a/spec/frontend/default/components/helpers/versions_menu_helper.js b/spec/frontend/default/components/helpers/versions_menu_helper.js
new file mode 100644
index 00000000..bdc1fa88
--- /dev/null
+++ b/spec/frontend/default/components/helpers/versions_menu_helper.js
@@ -0,0 +1,14 @@
+/**
+ * Creates a mock browser window object with a given path.
+ * @param {String} pathname
+ */
+export const setWindowPath = (pathname) => {
+ const location = {
+ ...window.location,
+ pathname,
+ };
+ Object.defineProperty(window, 'location', {
+ writable: true,
+ value: location,
+ });
+};
diff --git a/spec/frontend/default/components/versions_menu_spec.js b/spec/frontend/default/components/versions_menu_spec.js
new file mode 100644
index 00000000..01bb43e2
--- /dev/null
+++ b/spec/frontend/default/components/versions_menu_spec.js
@@ -0,0 +1,87 @@
+/**
+ * @jest-environment jsdom
+ */
+
+import { mount } from '@vue/test-utils';
+import flushPromises from 'flush-promises';
+import VersionsMenu from '../../../../content/frontend/default/components/versions_menu.vue';
+import { getVersions } from '../../../../content/frontend/services/fetch_versions';
+import { setWindowPath } from './helpers/versions_menu_helper';
+
+jest.mock('../../../../content/frontend/services/fetch_versions');
+const mockVersions = {
+ next: '15.3',
+ current: '15.2',
+ last_minor: ['15.1', '15.0'],
+ last_major: ['14.10', '13.12'],
+};
+
+beforeEach(() => {
+ jest.clearAllMocks();
+ getVersions.mockResolvedValueOnce(mockVersions);
+});
+
+describe('component: Versions menu', () => {
+ it('Fetches versions.json and displays current version', async () => {
+ const wrapper = mount(VersionsMenu);
+ await flushPromises();
+
+ expect(getVersions).toHaveBeenCalledTimes(1);
+
+ const nextVersion = wrapper.find('[data-testid="next-version"]').element.textContent;
+ expect(nextVersion).toEqual(mockVersions.next);
+ });
+
+ it('Generates correct menu links from the homepage', async () => {
+ setWindowPath('/');
+ const wrapper = mount(VersionsMenu);
+
+ expect(wrapper.vm.getVersionPath('')).toBe('/');
+ expect(wrapper.vm.getVersionPath(mockVersions.current)).toBe(`/${mockVersions.current}/`);
+
+ Object.values([...mockVersions.last_major, ...mockVersions.last_minor]).forEach(
+ function testLink(v) {
+ expect(wrapper.vm.getVersionPath(v)).toBe(`/${v}/`);
+ },
+ );
+ });
+
+ it('Generates correct menu links from an interior page', async () => {
+ setWindowPath('/ee/user/project/issue_board.html');
+ const wrapper = mount(VersionsMenu);
+ await wrapper.setData({ activeVersion: '15.3', versions: mockVersions });
+
+ expect(wrapper.vm.getVersionPath('')).toBe('/ee/user/project/issue_board.html');
+ expect(wrapper.vm.getVersionPath(mockVersions.current)).toBe(
+ `/${mockVersions.current}/ee/user/project/issue_board.html`,
+ );
+
+ Object.values([...mockVersions.last_major, ...mockVersions.last_minor]).forEach(
+ function testLink(v) {
+ expect(wrapper.vm.getVersionPath(v)).toBe(`/${v}/ee/user/project/issue_board.html`);
+ },
+ );
+ });
+
+ it('Generates correct menu links from an older version', async () => {
+ setWindowPath('/14.10/runner');
+ const wrapper = mount(VersionsMenu);
+ await wrapper.setData({ activeVersion: '14.10', versions: mockVersions });
+
+ expect(wrapper.vm.getVersionPath('')).toBe('/runner');
+ expect(wrapper.vm.getVersionPath(mockVersions.current)).toBe(`/${mockVersions.current}/runner`);
+
+ Object.values([...mockVersions.last_major, ...mockVersions.last_minor]).forEach(
+ function testLink(v) {
+ expect(wrapper.vm.getVersionPath(v)).toBe(`/${v}/runner`);
+ },
+ );
+ });
+
+ it('Detects the active version from the page URL', async () => {
+ setWindowPath('/14.10/runner');
+ const wrapper = mount(VersionsMenu);
+ await flushPromises();
+ expect(wrapper.vm.getActiveVersion(mockVersions)).toBe('14.10');
+ });
+});
diff --git a/yarn.lock b/yarn.lock
index 7bfc232a..da1779a8 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1417,6 +1417,15 @@
"@rollup/pluginutils" "^3.1.0"
magic-string "^0.25.7"
+"@rollup/plugin-url@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/@rollup/plugin-url/-/plugin-url-7.0.0.tgz#571f6fd51c3d0e00f7404c67efdb93492bfac7f8"
+ integrity sha512-cIWcEObrmEPAU8q8NluGWlCPlQDuoSKvkyI3eOFO4fx6W02mLNj4ZEiUT0X2mKMIvQzoWL1feEK9d1yr1ICgrw==
+ dependencies:
+ "@rollup/pluginutils" "^4.2.1"
+ make-dir "^3.1.0"
+ mime "^2.4.6"
+
"@rollup/pluginutils@^3.0.8", "@rollup/pluginutils@^3.1.0":
version "3.1.0"
resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-3.1.0.tgz#706b4524ee6dc8b103b3c995533e5ad680c02b9b"
@@ -1426,6 +1435,14 @@
estree-walker "^1.0.1"
picomatch "^2.2.2"
+"@rollup/pluginutils@^4.2.1":
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz#e6c6c3aba0744edce3fb2074922d3776c0af2a6d"
+ integrity sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==
+ dependencies:
+ estree-walker "^2.0.1"
+ picomatch "^2.2.2"
+
"@sinonjs/commons@^1.7.0":
version "1.8.3"
resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
@@ -3097,6 +3114,11 @@ flatted@^3.1.0:
resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.5.tgz#76c8584f4fc843db64702a6bd04ab7a8bd666da3"
integrity sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==
+flush-promises@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/flush-promises/-/flush-promises-1.0.2.tgz#4948fd58f15281fed79cbafc86293d5bb09b2ced"
+ integrity sha512-G0sYfLQERwKz4+4iOZYQEZVpOt9zQrlItIxQAAYAWpfby3gbHrx0osCHz5RLl/XoXevXk0xoN4hDFky/VV9TrA==
+
form-data@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
@@ -4439,7 +4461,7 @@ make-dir@^2.1.0:
pify "^4.0.1"
semver "^5.6.0"
-make-dir@^3.0.0:
+make-dir@^3.0.0, make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
@@ -4528,6 +4550,11 @@ mime@^1.4.1:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+mime@^2.4.6:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
+ integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"