diff options
author | Evan Read <eread@gitlab.com> | 2022-07-28 01:57:30 +0300 |
---|---|---|
committer | Evan Read <eread@gitlab.com> | 2022-07-28 01:57:30 +0300 |
commit | 716635c93d4e06eb8093c30ba0cbd68f1204d62c (patch) | |
tree | d3db08465c3b7e5e4b1a7c4409ce932b053dfb4a | |
parent | 1b73374b56bbbea88786e031cc03963e99ebd898 (diff) | |
parent | 69de0ea0dece446c36938ffc0fc8401d5557dbb8 (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.rb | 9 | ||||
-rw-r--r-- | content/assets/stylesheets/stylesheet.scss | 41 | ||||
-rw-r--r-- | content/frontend/default/components/versions_menu.vue | 94 | ||||
-rw-r--r-- | content/frontend/default/default.js | 17 | ||||
-rw-r--r-- | content/frontend/default/environment.js | 22 | ||||
-rw-r--r-- | content/frontend/home/index.js | 3 | ||||
-rw-r--r-- | content/frontend/services/fetch_versions.js | 8 | ||||
-rw-r--r-- | layouts/cta.html | 2 | ||||
-rw-r--r-- | layouts/docsearch.html | 2 | ||||
-rw-r--r-- | layouts/head.html | 2 | ||||
-rw-r--r-- | layouts/header.html | 33 | ||||
-rw-r--r-- | layouts/home.html | 1 | ||||
-rw-r--r-- | layouts/redirect.html | 2 | ||||
-rw-r--r-- | package.json | 2 | ||||
-rw-r--r-- | rollup.config.js | 8 | ||||
-rw-r--r-- | spec/frontend/default/components/helpers/versions_menu_helper.js | 14 | ||||
-rw-r--r-- | spec/frontend/default/components/versions_menu_spec.js | 87 | ||||
-rw-r--r-- | yarn.lock | 29 |
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'); + }); +}); @@ -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" |