From 2c0a1ca9f02b179ce68fda9af9c8e9b0c9d7d0ee Mon Sep 17 00:00:00 2001 From: "Fred K. Schott" Date: Thu, 17 Feb 2022 16:32:10 -0800 Subject: [PATCH] wip --- scripts/smoke/index.js | 200 +++++++++++++++-------------------------- yarn.lock | 104 ++++++++++++++++++++- 2 files changed, 173 insertions(+), 131 deletions(-) diff --git a/scripts/smoke/index.js b/scripts/smoke/index.js index c3c545529a..4c90ef0f9b 100644 --- a/scripts/smoke/index.js +++ b/scripts/smoke/index.js @@ -1,20 +1,51 @@ -/** @file Runs all smoke tests and may add extra smoke-test dependencies to `yarn.lock`. */ +/** @todo migrate these to use the independent docs repository at https://github.com/withastro/docs */ -// @ts-check - -import Zip from 'adm-zip'; +import fs from 'fs'; import { execa } from 'execa'; -import { polyfill } from '@astropub/webapi'; -import { fileURLToPath } from 'node:url'; -import { promises as fs } from 'node:fs'; +import { fileURLToPath } from 'url'; +import path from 'path'; -polyfill(globalThis, { exclude: 'window document' }); +// NOTE: Only needed for Windows, due to a Turbo bug. +// Once Turbo works on Windows, we can remove this script +// and update our CI to run through Turbo. -/* Configuration -/* -------------------------------------------------------------------------- */ +const astroBinLocation = new URL('../../node_modules/.bin/astro', import.meta.url); -/** URL directory containing this current script. */ -const scriptDir = new URL('./', import.meta.url); +/** Returns the parsed package.json of the given directory. */ +const readDirectoryPackage = async (/** @type {URL} */ dir) => JSON.parse(await fs.readFileSync(new URL('package.json', dir + '/'), 'utf-8')); + +/** Returns upon completion of writing a package.json to the given directory. */ +const writeDirectoryPackage = async (/** @type {URL} */ dir, /** @type {any} */ data) => + await fs.writeFileSync(new URL('package.json', dir + '/'), JSON.stringify(data, null, ' ') + '\n'); + + +export default async function run() { + const examplesUrl = new URL('../../examples/', import.meta.url); + const examplesToTest = fs + .readdirSync(examplesUrl) + .map((filename) => new URL(filename, examplesUrl)) + .filter((fileUrl) => fs.statSync(fileUrl).isDirectory()); + const allProjectsToTest = [/*...examplesToTest,*/ await gitCloneExample('www', `git@github.com:withastro/astro.build.git`), await gitCloneExample('docs', `git@github.com:withastro/docs.git`), ]; + + console.log(''); + for (const projectToTest of allProjectsToTest) { + const filePath = fileURLToPath(projectToTest); + console.log(' 🤖 Testing', filePath, '\n'); + try { + if (filePath.includes('examples-smoke')) { + await execa('node', [fileURLToPath(astroBinLocation), 'build'], { cwd: fileURLToPath(projectToTest), stdout: 'inherit', stderr: 'inherit' }); + } else { + await execa('yarn', ['build'], { cwd: fileURLToPath(projectToTest), stdout: 'inherit', stderr: 'inherit' }); + } + } catch (err) { + console.log(err); + process.exit(1); + } + console.log('\n 🤖 Test complete.'); + } +} + +run(); /** URL directory containing the entire project. */ const rootDir = new URL('../../', import.meta.url); @@ -25,123 +56,32 @@ const exampleDir = new URL('examples/', rootDir); /** URL directory containing the Astro package. */ const astroDir = new URL('packages/astro/', rootDir); -/** GitHub configuration for the external "docs" Astro project. */ -const docGithubConfig = { org: 'withastro', name: 'docs', branch: 'main' }; +async function gitCloneExample(id, cloneUrl) { + const smokeExamplesUrl = new URL('../../examples-smoke/', import.meta.url); + const clonedRepoUrl = new URL(`../../examples-smoke/${id}`, import.meta.url); + console.log('link:'+fileURLToPath(new URL('../../packages/astro', import.meta.url))); + // try { + // fs.statSync(clonedRepoUrl); + // } catch (err) { + // await execa('git', ['clone', cloneUrl, id], { cwd: fileURLToPath(smokeExamplesUrl), stdout: 'inherit', stderr: 'inherit' }); + // } + // await execa('git', ['fetch', 'origin'], { cwd: fileURLToPath(smokeExamplesUrl), stdout: 'inherit', stderr: 'inherit' }); + // await execa('git', ['checkout', 'main'], { cwd: fileURLToPath(smokeExamplesUrl), stdout: 'inherit', stderr: 'inherit' }); + // await execa('git', ['reset', 'origin/main', '--hard'], { cwd: fileURLToPath(smokeExamplesUrl), stdout: 'inherit', stderr: 'inherit' }); -/** GitHub configuration for the external "astro.build" Astro project. */ -const wwwGithubConfig = { org: 'withastro', name: 'astro.build', branch: 'main' }; + // const astroPackage = await readDirectoryPackage(astroDir); + // const githubPackage = await readDirectoryPackage(clonedRepoUrl); + // if ('astro' in Object(githubPackage.dependencies)) { + // githubPackage.dependencies['astro'] = astroPackage.version; + // } + // if ('astro' in Object(githubPackage.devDependencies)) { + // githubPackage.devDependencies['astro'] = astroPackage.version; + // } + // if ('astro' in Object(githubPackage.peerDependencies)) { + // githubPackage.peerDependencies['astro'] = astroPackage.version; + // } + // await writeDirectoryPackage(clonedRepoUrl, githubPackage); -/* Application -/* -------------------------------------------------------------------------- */ - -/** Runs all smoke tests. */ -async function run() { - console.log(''); - - const directories = await getChildDirectories(exampleDir); - - // TODO Skipped the docs-main test since it is failing at the moment. - directories.push(/*await downloadGithubZip(docGithubConfig), */ await downloadGithubZip(wwwGithubConfig)); - - console.log('🤖', 'Preparing', 'yarn'); - - await execa('yarn', [], { cwd: fileURLToPath(rootDir), stdout: 'inherit', stderr: 'inherit' }); - - for (const directory of directories) { - console.log('🤖', 'Testing', directory.pathname.split('/').at(-1)); - - try { - await execa('yarn', ['build'], { cwd: fileURLToPath(directory), stdout: 'inherit', stderr: 'inherit' }); - } catch (err) { - console.log(err); - - process.exit(1); - } - - console.log(); - } -} - -/* Functionality -/* -------------------------------------------------------------------------- */ - -/** Returns the URL to the ZIP of the given GitHub project. */ -const getGithubZipURL = (/** @type {GithubOpts} */ opts) => `https://github.com/${opts.org}/${opts.name}/archive/refs/heads/${opts.branch}.zip`; - -/** Returns the awaited ZIP Buffer from the given GitHub project. */ -const fetchGithubZip = (/** @type {GithubOpts} */ opts) => - fetch(getGithubZipURL(opts)) - .then((response) => response.arrayBuffer()) - .then((arrayBuffer) => Buffer.from(arrayBuffer)); - -/** Downloads a ZIP from the given GitHub project. */ -const downloadGithubZip = async (/** @type {GithubOpts} */ opts) => { - /** Expected directory when the zip is downloaded. */ - const githubDir = new URL(`${opts.name}-${opts.branch}`, scriptDir); - - /** Whether the expected directory is already available */ - const hasGithubDir = await fs.stat(githubDir).then( - (stats) => stats.isDirectory(), - () => false - ); - - if (!hasGithubDir) { - console.log('🤖', 'Downloading', `${opts.org}/${opts.name}#${opts.branch}`); - - const buffer = await fetchGithubZip(opts); - - console.log('🤖', 'Extracting', `${opts.org}/${opts.name}#${opts.branch}`); - - new Zip(buffer).extractAllTo(fileURLToPath(scriptDir), true); - - console.log('🤖', 'Preparing', `${opts.org}/${opts.name}#${opts.branch}`); - - const astroPackage = await readDirectoryPackage(astroDir); - - const githubPackage = await readDirectoryPackage(githubDir); - - if ('astro' in Object(githubPackage.dependencies)) { - githubPackage.dependencies['astro'] = astroPackage.version; - } - - if ('astro' in Object(githubPackage.devDependencies)) { - githubPackage.devDependencies['astro'] = astroPackage.version; - } - - if ('astro' in Object(githubPackage.peerDependencies)) { - githubPackage.peerDependencies['astro'] = astroPackage.version; - } - - await writeDirectoryPackage(githubDir, githubPackage); - } - - return githubDir; -}; - -/** Returns the parsed package.json of the given directory. */ -const readDirectoryPackage = async (/** @type {URL} */ dir) => JSON.parse(await fs.readFile(new URL('package.json', dir + '/'), 'utf-8')); - -/** Returns upon completion of writing a package.json to the given directory. */ -const writeDirectoryPackage = async (/** @type {URL} */ dir, /** @type {any} */ data) => - await fs.writeFile(new URL('package.json', dir + '/'), JSON.stringify(data, null, ' ') + '\n'); - -/** Returns all child directories of the given directory. */ -const getChildDirectories = async (/** @type {URL} */ dir) => { - /** @type {URL[]} */ - const dirs = []; - - for await (const dirent of await fs.opendir(dir)) { - if (dirent.isDirectory()) { - dirs.push(new URL(dirent.name, dir)); - } - } - - return dirs; -}; - -/* Execution -/* -------------------------------------------------------------------------- */ - -run(); - -/** @typedef {{ org: string, name: string, branch: string }} GithubOpts */ + // await execa('yarn', [], { cwd: fileURLToPath(clonedRepoUrl), stdout: 'inherit', stderr: 'inherit' }); + return clonedRepoUrl; +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 95d4cffc0d..f6d799a2d8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1666,6 +1666,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + "@ts-morph/common@~0.11.1": version "0.11.1" resolved "https://registry.yarnpkg.com/@ts-morph/common/-/common-0.11.1.tgz#281af2a0642b19354d8aa07a0d50dfdb4aa8164e" @@ -2460,6 +2465,14 @@ ast-types@^0.13.2: dependencies: tslib "^2.0.1" +astro-icon@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/astro-icon/-/astro-icon-0.5.3.tgz#095b6be506a2a021ef7e6ce0cce83e2699d46862" + integrity sha512-Tt+w6OyuE4NlvP1LjT09L8JD23+j9U2LYqEOtPDr7gDJXAZxa4mwz7pOJo9RNhdRx1SXh2aS8KK9v7D2N5d0aw== + dependencies: + node-fetch "^3.1.0" + svgo "^2.8.0" + async@0.9.x: version "0.9.2" resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" @@ -2919,6 +2932,11 @@ commander@^2.20.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + common-ancestor-path@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/common-ancestor-path/-/common-ancestor-path-1.0.1.tgz#4f7d2d1394d91b7abdf51871c62f71eadb0182a7" @@ -3014,6 +3032,14 @@ css-selector-parser@^1.0.0: resolved "https://registry.yarnpkg.com/css-selector-parser/-/css-selector-parser-1.4.1.tgz#03f9cb8a81c3e5ab2c51684557d5aaf6d2569759" integrity sha512-HYPSb7y/Z7BNDCOrakL4raGO2zltZkbeXyAd6Tg9obzix6QhzxCotdBl6VT0Dv4vZfJGVz3WL/xaEI9Ly3ul0g== +css-tree@^1.1.2, css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + css-what@^5.0.1, css-what@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" @@ -3024,6 +3050,13 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== +csso@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + csstype@^2.6.8: version "2.6.19" resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" @@ -3069,6 +3102,11 @@ dataloader@^1.4.0: resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== +date-fns@^2.28.0: + version "2.28.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" + integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== + debug@2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" @@ -5572,6 +5610,11 @@ mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-3.1.0.tgz#56c506d065fbf769515235e577b5a261552d56e9" integrity sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA== +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -6149,7 +6192,7 @@ node-domexception@^1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@*, node-fetch@^3.0.0: +node-fetch@*, node-fetch@^3.0.0, node-fetch@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.2.0.tgz#59390db4e489184fa35d4b74caf5510e8dfbaf3b" integrity sha512-8xeimMwMItMw8hRrOl3C9/xzU49HV/yE6ORew/l+dxWimO5A4Ra8ld2rerlJvc/O7et5Z1zrWsPX43v1QBjCxw== @@ -6728,6 +6771,14 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== +quicklink@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/quicklink/-/quicklink-2.2.0.tgz#011f47d4e5f67622d9d49f02c74c913852b01f8b" + integrity sha512-tfleXCZvxDppyZFqSDsbkS5aKemtA0ealvguxjp3tzXHMo+pzxrWtOh+6dnYK/mXzEYM1QiNhGttcS/W/T3JXA== + dependencies: + route-manifest "^1.0.0" + throttles "^1.0.0" + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -6885,6 +6936,11 @@ regexp.prototype.flags@^1.3.1: call-bind "^1.0.2" define-properties "^1.1.3" +regexparam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-1.3.0.tgz#2fe42c93e32a40eff6235d635e0ffa344b92965f" + integrity sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g== + regexpp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -6965,6 +7021,17 @@ rehype-toc@^3.0.2: dependencies: "@jsdevtools/rehype-toc" "3.0.2" +remark-autolink-headings@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/remark-autolink-headings/-/remark-autolink-headings-7.0.1.tgz#1d8528ea8783b828200d13c055ec2d5f2cae5060" + integrity sha512-a1BIwoJ0cSnX+sPp5u3AFULBFWHGYBt57Fo4a+7IlGiJOQxs8b7uYAE5Iu26Ocl7Y5cvinZy3FaGVruLCKg6vA== + dependencies: + "@types/hast" "^2.0.0" + "@types/mdast" "^3.0.0" + extend "^3.0.0" + unified "^10.0.0" + unist-util-visit "^4.0.0" + remark-code-titles@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/remark-code-titles/-/remark-code-titles-0.1.2.tgz#ae41b47c517eae4084c761a59a60df5f0bd54aa8" @@ -7128,6 +7195,13 @@ rollup@^2.43.1, rollup@^2.59.0, rollup@^2.60.0, rollup@^2.64.0: optionalDependencies: fsevents "~2.3.2" +route-manifest@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/route-manifest/-/route-manifest-1.0.0.tgz#0155513f3cd158c18827413845ab1a8ec2ad15e1" + integrity sha512-qn0xJr4nnF4caj0erOLLAHYiNyzqhzpUbgDQcEHrmBoG4sWCDLnIXLH7VccNSxe9cWgbP2Kw/OjME+eH3CeRSA== + dependencies: + regexparam "^1.3.0" + run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -7384,6 +7458,11 @@ smartwrap@^1.2.3: wcwidth "^1.0.1" yargs "^15.1.0" +smartypants@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/smartypants/-/smartypants-0.1.6.tgz#976d23dcccae83d56da93d59db1ba76838c976f7" + integrity sha512-zGXh+Q6Y3OPTLM5x2HxAIkEAj4ZcePftmIOdIYozv2T+m03Sp5R4YppczKuo6IdnSMc99U+Wgvy8Mil0eeep7g== + socks-proxy-agent@5, socks-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" @@ -7523,6 +7602,11 @@ srcset-parse@^1.1.0: resolved "https://registry.yarnpkg.com/srcset-parse/-/srcset-parse-1.1.0.tgz#73f787f38b73ede2c5af775e0a3465579488122b" integrity sha512-JWp4cG2eybkvKA1QUHGoNK6JDEYcOnSuhzNGjZuYUPqXreDl/VkkvP2sZW7Rmh+icuCttrR9ccb2WPIazyM/Cw== +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + "statuses@>= 1.5.0 < 2", statuses@~1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -7763,6 +7847,19 @@ svelte@^3.46.4: resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.46.4.tgz#0c46bc4a3e20a2617a1b7dc43a722f9d6c084a38" integrity sha512-qKJzw6DpA33CIa+C/rGp4AUdSfii0DOTCzj/2YpSKKayw5WGSS624Et9L1nU1k2OVRS9vaENQXp2CVZNU+xvIg== +svgo@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^4.1.3" + css-tree "^1.1.3" + csso "^4.2.0" + picocolors "^1.0.0" + stable "^0.1.8" + tailwindcss@^3.0.5: version "3.0.18" resolved "https://registry.yarnpkg.com/tailwindcss/-/tailwindcss-3.0.18.tgz#ea4825e6496d77dc21877b6b61c7cc56cda3add5" @@ -7856,6 +7953,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +throttles@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/throttles/-/throttles-1.0.1.tgz#3abdcde28df88d5eddf7e57cad8da35bd403ddd0" + integrity sha512-fab7Xg+zELr9KOv4fkaBoe/b3L0GMGLd0IBSCn16GoE/Qx6/OfCr1eGNyEcDU2pUA79qQfZ8kPQWlRuok4YwTw== + tiny-glob@^0.2.8: version "0.2.9" resolved "https://registry.yarnpkg.com/tiny-glob/-/tiny-glob-0.2.9.tgz#2212d441ac17928033b110f8b3640683129d31e2"