diff --git a/.gitignore b/.gitignore index 5db0a79a4..7a48c8351 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,6 @@ node_modules build/ content/ docs/ -blog/ \ No newline at end of file +blog/ +i18n/ +!i18n/en-US/ \ No newline at end of file diff --git a/docusaurus.config.js b/docusaurus.config.js index 08c6e72ec..58a214722 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -12,13 +12,26 @@ module.exports = { favicon: 'assets/img/favicon.ico', organizationName: 'electron', projectName: 'electron', + i18n: { + defaultLocale: 'en', + locales: [ + 'de-de', + 'en', + 'es-es', + 'fr-fr', + 'ja-jp', + 'pt-br', + 'ru-ru', + 'zh-cn', + ], + }, themeConfig: { announcementBar: { id: 'to_old_docs', content: 'Want to go back to the old docs?', backgroundColor: '#1a1b23', - textColor: '#9feaf9' + textColor: '#9feaf9', }, navbar: { title: 'Electron', @@ -43,7 +56,11 @@ module.exports = { label: 'Examples', to: 'docs/latest/tutorial/examples', position: 'left', - activeBaseRegex: '^\b$' // never active + activeBaseRegex: '^\b$', // never active + }, + { + type: 'localeDropdown', + position: 'right', }, { href: 'https://github.com/electron/electron', @@ -99,7 +116,7 @@ module.exports = { contextualSearch: true, }, googleAnalytics: { - trackingID: 'UA-160365006-1' + trackingID: 'UA-160365006-1', }, }, presets: [ diff --git a/package.json b/package.json index eb2c3bf92..ab9222924 100644 --- a/package.json +++ b/package.json @@ -22,16 +22,17 @@ "prepare": "husky install" }, "dependencies": { + "@crowdin/crowdin-api-client": "^1.11.2", "@docusaurus/core": "^2.0.0-beta.3", "@docusaurus/plugin-google-analytics": "^2.0.0-beta.3", "@docusaurus/preset-classic": "^2.0.0-beta.3", "@docusaurus/remark-plugin-npm2yarn": "^2.0.0-beta.3", "@mdx-js/react": "^1.6.21", + "D": "^1.0.0", "clsx": "^1.1.1", - "dotenv-safe": "^8.2.0", - "execa": "^5.0.0", "react": "^17.0.1", - "react-dom": "^17.0.1" + "react-dom": "^17.0.1", + "unzipper": "^0.10.11" }, "browserslist": { "production": [ @@ -51,6 +52,8 @@ "@types/jest": "^26.0.23", "@types/unist": "^2.0.3", "del": "^6.0.0", + "dotenv": "^10.0.0", + "execa": "^5.0.0", "fs-extra": "^9.1.0", "globby": "^11.0.3", "got": "^11.8.2", diff --git a/scripts/pre-build.js b/scripts/pre-build.js index 8d111adad..9690b2f0c 100644 --- a/scripts/pre-build.js +++ b/scripts/pre-build.js @@ -5,8 +5,13 @@ * right places, and transform it to make it ready to * be used by docusaurus. */ +if (process.env.NODE_ENV !== 'production') { + require('dotenv').config(); +} + const path = require('path'); const { existsSync } = require('fs'); +const fs = require('fs-extra'); const del = require('del'); const latestVersion = require('latest-version'); @@ -17,8 +22,10 @@ const { createSidebar } = require('./tasks/create-sidebar'); const { fixContent } = require('./tasks/md-fixers'); const { copyNewContent } = require('./tasks/copy-new-content'); const { sha } = require('../package.json'); +const { downloadTranslations } = require('./tasks/download-translations'); const DOCS_FOLDER = path.join('docs', 'latest'); +const I18N_FOLDER = 'i18n'; // const BLOG_FOLDER = 'blog'; /** @@ -64,15 +71,6 @@ const start = async (source) => { return process.exit(-1); } - // TODO: Uncoment once we have the blog enabled - // console.log(`Downloading posts`); - // await download({ - // target: 'master', - // repository: 'electronjs.org', - // destination: BLOG_FOLDER, - // downloadMatch: 'data/blog', - // }); - console.log('Copying new content'); await copyNewContent(DOCS_FOLDER); @@ -84,6 +82,39 @@ const start = async (source) => { console.log('Updating sidebar.js'); await createSidebar('docs', path.join(process.cwd(), 'sidebars.js')); + + console.log('Downloading translations'); + const locales = await downloadTranslations(I18N_FOLDER); + + for (const locale of locales) { + const localeDocs = path.join( + I18N_FOLDER, + locale, + 'docusaurus-plugin-content-docs', + 'current' + ); + const staticResources = ['fiddles', 'images']; + + console.log(`Copying static assets to ${locale}`); + for (const staticResource of staticResources) { + await fs.copy( + path.join(DOCS_FOLDER, staticResource), + path.join(localeDocs, 'latest', staticResource) + ); + } + + console.log(`Fixing markdown (${locale})`); + await fixContent(localeDocs, 'latest'); + + console.log(`Adding automatic frontmatter (${locale})`); + await addFrontmatter(path.join(localeDocs, 'latest')); + } }; +process.on('unhandledRejection', (error) => { + console.error(error); + + process.exit(1); +}); + start(process.argv[2]); diff --git a/scripts/tasks/download-translations.js b/scripts/tasks/download-translations.js new file mode 100644 index 000000000..a9153ac13 --- /dev/null +++ b/scripts/tasks/download-translations.js @@ -0,0 +1,170 @@ +//@ts-check +const stream = require('stream'); +const { join } = require('path'); +const { promisify } = require('util'); +const pipeline = promisify(stream.pipeline); +const got = require('got').default; +const unzipper = require('unzipper'); +const { tmpdir } = require('os'); +const fs = require('fs-extra'); + +// Assumes running from the root of the repo +const OUTPUT_PATH = join(process.cwd(), 'temp-i18n'); +const { CROWDIN_TOKEN, CROWDIN_PROJECT_ID } = process.env; +const PROJECT_ID = parseInt(CROWDIN_PROJECT_ID); +const crowdin = require('@crowdin/crowdin-api-client').default; + +const { translationsApi } = new crowdin({ + token: CROWDIN_TOKEN, +}); + +/** + * Downloads the Crowdin file and unzips the contents + * @param {string} url + * @param {string} destination + */ +const downloadFiles = async (url, destination) => { + const tmpPath = join( + tmpdir(), + 'electronjs.org', + `${Math.ceil(Math.random() * 1000)}` + ); + + await pipeline(got.stream(url), unzipper.Extract({ path: tmpPath })); + + const contentPath = join(tmpPath, `[electron.i18n] master`, `content`); + + const locales = await fs.readdir(contentPath); + + for (const locale of locales) { + const localeDestination = join(destination, locale.toLowerCase()); + const docsDestination = join( + localeDestination, + 'docusaurus-plugin-content-docs', + 'current', + 'latest' + ); + await fs.mkdirp(docsDestination); + + await fs.copy(join(contentPath, locale, 'docs'), docsDestination); + + await fs.copy( + join(contentPath, locale, 'website', 'i18n'), + + localeDestination + ); + } + + return locales.map((locale) => locale.toLowerCase()); +}; + +/** + * Waits for the given number of seconds + * @param {number} seconds + * @returns + */ +const waitFor = (seconds) => { + return new Promise((resolve) => { + setTimeout(() => { + resolve(); + }, seconds * 1000); + }); +}; + +/** + * @param {number} buildId + * @returns + */ +const getBuild = async (buildId) => { + const builds = await translationsApi.listProjectBuilds(PROJECT_ID); + const build = builds.data.find((item) => item.data.id === buildId); + + return build.data; +}; + +/** + * Kicks a build for `PROJECT_ID` and returns the download link once it + * has finished. + * If a build is not kicked we risked downloading outdated files. + * @param {number} projectId + */ +const buildAndDownloadLink = async (projectId) => { + const { + data: { id: buildId }, + } = await translationsApi.buildProject(projectId); + + let counter = 10; + let interval = 30; + let build; + + for (let i = 0; i < counter; i++) { + build = await getBuild(buildId); + console.log(`Crowdin status: Project ${buildId} - ${build.status}`); + + if (build.status === 'finished') { + break; + } else { + console.log( + `Crowdin status: Waiting ${interval} seconds (retry ${i}/${counter})` + ); + await waitFor(interval); + } + } + + if (build.status !== 'finished') { + throw new Error(`The project didn't build fast enough on Crowdin`); + } + + const { + data: { url }, + } = await translationsApi.downloadTranslations(PROJECT_ID, buildId); + + return url; +}; + +/** + * Gets the download link for the latest available build + * @param {number} projectId + */ +const getLatestBuildLink = async (projectId) => { + const { data: builds } = await translationsApi.listProjectBuilds(projectId); + + const { + data: { url }, + } = await translationsApi.downloadTranslations(PROJECT_ID, builds[0].data.id); + + return url; +}; + +/** + * Downloads the translations into the given target + * or the default one otherwise. + * @param {string} [target] + */ +const downloadTranslations = async (target) => { + let downloadLink = ''; + if (process.env.NODE_ENV === 'production') { + console.log( + `Starting a Crowdin build to download translations. This might take a few minutes.` + ); + downloadLink = await buildAndDownloadLink(PROJECT_ID); + } else { + console.log(`Downloading the latest available Crowdin build.`); + downloadLink = await getLatestBuildLink(PROJECT_ID); + } + + const destination = target || OUTPUT_PATH; + return await downloadFiles(downloadLink, destination); +}; + +// When a file is run directly from Node.js, `require.main` is set to its module. +// That means that it is possible to determine whether a file has been run directly +// by testing `require.main === module`. +// https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module +if (require.main === module) { + downloadTranslations(); +} + +module.exports = { + downloadTranslations, +}; diff --git a/scripts/tasks/md-fixers.js b/scripts/tasks/md-fixers.js index 532eb356b..8d405a7fd 100644 --- a/scripts/tasks/md-fixers.js +++ b/scripts/tasks/md-fixers.js @@ -72,6 +72,19 @@ const fiddleTransformer = (line) => { } }; +/** + * Crowdin translations put markdown content right + * after HTML comments and thus breaking Docusaurus + * parse engine. We need to add a new EOL after `-->` + * is found. + */ + const newLineOnHTMLComment = (line) => { + if (line.includes('-->')) { + return line.replace('-->', '-->\n'); + } + return line; +}; + /** * Applies any transformation that can be executed line by line on * the document to make sure it is ready to be consumed by @@ -83,7 +96,7 @@ const fiddleTransformer = (line) => { const transform = (doc) => { const lines = doc.split('\n'); const newDoc = []; - const transformers = [apiTransformer, fiddleTransformer]; + const transformers = [apiTransformer, fiddleTransformer, newLineOnHTMLComment]; for (const line of lines) { const newLine = transformers.reduce((newLine, transformer) => { diff --git a/yarn.lock b/yarn.lock index 745d23dba..19f38d5d6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1310,6 +1310,13 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@crowdin/crowdin-api-client@^1.11.2": + version "1.11.2" + resolved "https://registry.yarnpkg.com/@crowdin/crowdin-api-client/-/crowdin-api-client-1.11.2.tgz#9f037f0731cd232ad96fafbf69629d8bfc8fe9f3" + integrity sha512-W8dJOtJGoURk1+c0ciYg1o5aN5K97XovgdVyylFM5EUtIT+TCpdf42RzbpvjQ7qpJ2odmEktkhvQyxJcOVrhHg== + dependencies: + axios "^0.21.1" + "@docsearch/css@3.0.0-alpha.36": version "3.0.0-alpha.36" resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.0.0-alpha.36.tgz#0af69a86b845974d0f8cab62db0218f66b6ad2d6" @@ -2548,6 +2555,11 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +D@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/D/-/D-1.0.0.tgz#c348a4e034f72847be51206fc530fc089e9cc2a9" + integrity sha512-nQvrCBu7K2pSSEtIM0EEF03FVjcczCXInMt3moLNFbjlWx6bZrX72uT6/1uAXDbnzGUAx9gTyDiQ+vrFi663oA== + abab@^2.0.3, abab@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a" @@ -3049,6 +3061,11 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.1.tgz#73540563558687586b52ed217dad6a802ab1549c" integrity sha512-/6FKxSTWoJdbsLDF8tdIjaRiFXiE6UHsEHE3OPI/cwPURCVi1ukP0gmLn7XWEiFk5TcwQjjY5PWsU+j+tgXgmw== +big-integer@^1.6.17: + version "1.6.48" + resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.48.tgz#8fd88bd1632cba4a1c8c3e3d7159f08bb95b4b9e" + integrity sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -3064,6 +3081,14 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== +binary@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + integrity sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk= + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" @@ -3085,6 +3110,11 @@ bluebird@^3.7.1: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== +bluebird@~3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.7.tgz#f72d760be09b7f76d08ed8fae98b289a8d05fab3" + integrity sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM= + body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -3208,6 +3238,11 @@ buffer-from@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== +buffer-indexof-polyfill@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz#d2732135c5999c64b277fcf9b1abe3498254729c" + integrity sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A== + buffer-indexof@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" @@ -3221,6 +3256,11 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + integrity sha1-skV5w77U1tOWru5tmorn9Ugqt7s= + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" @@ -3345,6 +3385,13 @@ ccount@^1.0.0, ccount@^1.0.3: resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.1.0.tgz#246687debb6014735131be8abab2d93898f8d043" integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + integrity sha1-XqtQsor+WAdNDVgpE4iCi15fvJg= + dependencies: + traverse ">=0.3.0 <0.4" + chalk@2.4.2, chalk@^2.0.0, chalk@^2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" @@ -4414,17 +4461,17 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" -dotenv-safe@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/dotenv-safe/-/dotenv-safe-8.2.0.tgz#8d548c7318a62c09a66c4dc8c31864cc007c78ba" - integrity sha512-uWwWWdUQkSs5a3mySDB22UtNwyEYi0JtEQu+vDzIqr9OjbDdC2Ip13PnSpi/fctqlYmzkxCeabiyCAOROuAIaA== - dependencies: - dotenv "^8.2.0" +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== -dotenv@^8.2.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" - integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== +duplexer2@~0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" + integrity sha1-ixLauHjA1p4+eJEFFmKjL8a93ME= + dependencies: + readable-stream "^2.0.2" duplexer3@^0.1.4: version "0.1.4" @@ -5131,6 +5178,16 @@ fsevents@^2.1.2, fsevents@~2.3.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== +fstream@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.12.tgz#4e8ba8ee2d48be4f7d0de505455548eae5932045" + integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -5370,7 +5427,7 @@ got@^9.6.0: to-readable-stream "^1.0.0" url-parse-lax "^3.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4: version "4.2.6" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== @@ -5891,7 +5948,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.0, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7020,6 +7077,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +listenercount@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/listenercount/-/listenercount-1.0.1.tgz#84c8a72ab59c4725321480c975e6508342e70937" + integrity sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc= + loader-runner@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" @@ -7443,7 +7505,7 @@ mixin-deep@^1.2.0: for-in "^1.0.2" is-extendable "^1.0.1" -mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== @@ -9246,7 +9308,7 @@ rgba-regex@^1.0.0: resolved "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz#43374e2e2ca0968b0ef1523460b7d730ff22eeb3" integrity sha1-QzdOLiyglosO8VI0YLfXMP8i7rM= -rimraf@^2.6.3: +rimraf@2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -9511,7 +9573,7 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.5: +setimmediate@^1.0.5, setimmediate@~1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -10244,6 +10306,11 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + integrity sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk= + trim-trailing-lines@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz#bd4abbec7cc880462f10b2c8b5ce1d8d1ec7c2c0" @@ -10520,6 +10587,22 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" +unzipper@^0.10.11: + version "0.10.11" + resolved "https://registry.yarnpkg.com/unzipper/-/unzipper-0.10.11.tgz#0b4991446472cbdb92ee7403909f26c2419c782e" + integrity sha512-+BrAq2oFqWod5IESRjL3S8baohbevGcVA+teAIOYWM3pDVdseogqbzhhvvmiyQrUNKFUnDMtELW3X8ykbyDCJw== + dependencies: + big-integer "^1.6.17" + binary "~0.3.0" + bluebird "~3.4.1" + buffer-indexof-polyfill "~1.0.0" + duplexer2 "~0.1.4" + fstream "^1.0.12" + graceful-fs "^4.2.2" + listenercount "~1.0.1" + readable-stream "~2.3.6" + setimmediate "~1.0.4" + upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"