diff --git a/.depcheckrc.json b/.depcheckrc.json new file mode 100644 index 00000000..42f8d8c4 --- /dev/null +++ b/.depcheckrc.json @@ -0,0 +1,13 @@ +{ + "specials": ["babel", "bin", "eslint", "jest", "lint-staged", "tslint"], + "ignoreMatches": [ + "@types/*", + "concurrently", + "doctoc", + "eslint-config-*", + "eslint-plugin-*", + "jest-github-actions-reporter", + "lint-staged", + "tslib" + ] +} diff --git a/README.md b/README.md index 288b30ae..9020d64c 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ - [Prettier](#prettier) - [Jest](#jest) - [Semantic Release](#semantic-release) + - [Depcheck](#depcheck) - [Lint Staged](#lint-staged) - [Source Control Hooks](#source-control-hooks) - [Husky Example](#husky-example) @@ -167,6 +168,31 @@ module.exports = { } ``` +#### Depcheck + +> ℹ️ The `hoverBabel` special requires NODE_PATH to be defined to resolve the +> babel config file + +Or, for depcheck in `.depcheckrc.json'`: + +```json +{ + "specials": [ + "babel", + "bin", + "jest", + [ + "hoverBabel", + { + "config": "babel.config.js", + "env": "development" + } + ] + ], + "ignoreMatches": ["types/*"] +} +``` + #### Lint Staged Or, for lint-staged (used in `pre-commit` script) in `lint-staged.config.js`: diff --git a/api/depcheck.d.ts b/api/depcheck.d.ts new file mode 100644 index 00000000..08b0523b --- /dev/null +++ b/api/depcheck.d.ts @@ -0,0 +1 @@ +export * from '../dist/api/depcheck' diff --git a/api/depcheck.js b/api/depcheck.js new file mode 100644 index 00000000..3573fd13 --- /dev/null +++ b/api/depcheck.js @@ -0,0 +1 @@ +module.exports = require('../dist/api/depcheck') diff --git a/package.json b/package.json index f7b42a52..f1c3b318 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "build:types": "tsc -p src/", "ci-after-success": "node src ci-after-success", "commit": "node src commit", + "depcheck": "node src depcheck", "format": "node src format", "lint": "node src lint", "prepublishOnly": "yarn build", @@ -53,6 +54,11 @@ "@commitlint/config-conventional": "^16.2.1", "@commitlint/prompt": "^16.1.0", "@types/jest": "^27.0.2", + "@types/lodash.has": "^4.5.6", + "@types/mkdirp": "^1.0.2", + "@types/node": ">=17.x", + "@types/rimraf": "^3.0.2", + "@types/which": "^2.0.1", "@typescript-eslint/eslint-plugin": "^5.13.0", "@typescript-eslint/parser": "^5.13.0", "arrify": "^2.0.1", @@ -63,7 +69,6 @@ "cross-spawn": "^7.0.1", "doctoc": "^2.1.0", "eslint": "^8.8.0", - "@types/node": ">=17.x", "eslint-config-airbnb": "19.0.0", "eslint-config-airbnb-typescript": "^16.1.0", "eslint-config-prettier": "^8.3.0", @@ -126,6 +131,7 @@ "@babel/preset-env": "^7.16.11", "@types/cross-spawn": "^6.0.2", "babel-jest": "^27.2.4", + "depcheck": "^1.4.3", "eslint-config-kentcdodds": "^20.0.1", "husky": "^7.0.4", "jest-in-case": "^1.0.2", diff --git a/src/__tests__/__snapshots__/index.js.snap b/src/__tests__/__snapshots__/index.js.snap index a26f0e7b..a14607b6 100644 --- a/src/__tests__/__snapshots__/index.js.snap +++ b/src/__tests__/__snapshots__/index.js.snap @@ -24,6 +24,7 @@ Available Scripts: ci-after-success commit-msg commit + depcheck format lint pre-commit diff --git a/src/api/depcheck/depcheck.js b/src/api/depcheck/depcheck.js new file mode 100644 index 00000000..1adb2a88 --- /dev/null +++ b/src/api/depcheck/depcheck.js @@ -0,0 +1,111 @@ +const fs = require('fs') +const depcheck = require('depcheck') +const hoverSpecials = require('./specials') +const {hasFile, uniq} = require('../../utils') + +/** + * @typedef Config + * @property {boolean} [ignoreBinPackage] + * @property {boolean} [skipMissing] + * @property {string[]} [ignorePatterns] + * @property {string[]} [ignoreMatches] + * @property {string[]} [parsers] + * @property {string[]} [detectors] + * @property {string[]} [specials] + */ + +/** + * @param {string} configPath + * @return {Config} + */ +const resolveConfig = configPath => { + let loadedOptions = {} + if (!!configPath && hasFile(configPath)) { + loadedOptions = JSON.parse(fs.readFileSync(configPath, {encoding: 'utf8'})) + } + + return loadedOptions +} + +/** + * + * @param {{[key: string]: string}} parsers + * @return {{[key: string]: depcheck.Parser}} + */ +const resolveParsers = parsers => { + /** @var {{[key: string]: depcheck.Parser}} resolvedParsers */ + const resolvedParsers = {} + Object.keys(parsers).forEach(key => { + // @ts-ignore + if (depcheck.parser[parsers[key]]) { + // @ts-ignore + resolvedParsers[key] = depcheck.parser[parsers[key]] + } + }) + + // @ts-ignore + return resolvedParsers +} + +/** + * + * @param {string[]}detectors + * @return {depcheck.Detector[]} + */ +const resolveDetectors = detectors => { + return uniq( + detectors.map(detector => { + // @ts-ignore + if (depcheck.detector[detector]) { + //@ts-ignore + return depcheck.detector[detector] + } + throw new Error(`Undefined detector ${detector}`) + }), + ) +} + +/** + * + * @param {*[]} specials + * @return {depcheck.Parser[]} + */ +const resolveSpecials = specials => { + return uniq( + specials.map(special => { + if (typeof special === 'string') { + // @ts-ignore + if (depcheck.special[special]) { + // @ts-ignore + return depcheck.special[special] + } + + // @ts-ignore + if (hoverSpecials[special] && hoverSpecials[special].special) { + // @ts-ignore + return hoverSpecials[special].special + } + } + + if (Array.isArray(special)) { + const name = special[0] || '' + const config = special[1] || {} + + // @ts-ignore + if (hoverSpecials[name] && hoverSpecials[name].configure) { + // @ts-ignore + return hoverSpecials[name].configure(config) + } + } + + throw new Error(`Undefined special ${special}`) + }), + ) +} + +module.exports = { + resolveConfig, + resolveDetectors, + resolveParsers, + resolveSpecials, +} diff --git a/src/api/depcheck/index.js b/src/api/depcheck/index.js new file mode 100644 index 00000000..df35de01 --- /dev/null +++ b/src/api/depcheck/index.js @@ -0,0 +1,4 @@ +module.exports = { + depcheck: require('./depcheck'), + specials: require('./specials'), +} diff --git a/src/api/depcheck/specials/babel.js b/src/api/depcheck/specials/babel.js new file mode 100644 index 00000000..4836c3f5 --- /dev/null +++ b/src/api/depcheck/specials/babel.js @@ -0,0 +1,71 @@ +const path = require('path') + +/** + * + * @param {string | unknown[]} preset + * @return {string} + */ +const babelDependencyToName = preset => { + if (typeof preset === 'string') return preset + if (Array.isArray(preset) && typeof preset[0] === 'string') return preset[0] + return '' +} + +/** + * Configures a special babel parser. Enables detection of babel plugins and presets when they are defined in js files + * (e.g. babel.config.js) + * + * @param {Object} options + * @param {string} options.config + * @param {string} options.env + * @return {function(string, *, string): string[]} + */ +const configure = options => { + const getBabelConfig = require(options.config) + const babelConfig = getBabelConfig({ + env: (/** @type {string[]} */ envs) => envs.includes(options.env), + }) + + /** + * @param {string} filePath + * @param {*} _ + * @param {string} dir + * @return {string[]} + */ + const detectBabelPreset = (filePath, _, dir) => { + if (filePath !== path.join(dir, options.config)) { + return [] + } + + const presets = babelConfig.presets || [] + return presets + .map(babelDependencyToName) + .filter((/** @type {string} */ name) => !!name) + } + + /** + * @param {string} filePath + * @param {*} _ + * @param {string} dir + * @return {string[]} + */ + const detectBabelPlugin = (filePath, _, dir) => { + if (filePath !== path.join(dir, options.config)) { + return [] + } + + const plugins = babelConfig.plugins || [] + return plugins + .map(babelDependencyToName) + .filter((/** @type {string} */ name) => !!name) + } + + return (filePath, _, dir) => [ + ...detectBabelPreset(filePath, _, dir), + ...detectBabelPlugin(filePath, _, dir), + ] +} + +module.exports = { + configure, +} diff --git a/src/api/depcheck/specials/index.js b/src/api/depcheck/specials/index.js new file mode 100644 index 00000000..556febe4 --- /dev/null +++ b/src/api/depcheck/specials/index.js @@ -0,0 +1,3 @@ +module.exports = { + hoverBabel: require('./babel'), +} diff --git a/src/scripts/depcheck.js b/src/scripts/depcheck.js new file mode 100644 index 00000000..6ef55471 --- /dev/null +++ b/src/scripts/depcheck.js @@ -0,0 +1,144 @@ +const depcheck = require('depcheck') +const yargsParser = require('yargs-parser') +const { + resolveConfig, + resolveDetectors, + resolveParsers, + resolveSpecials, +} = require('../api/depcheck/depcheck') +const {uniq, hasFile} = require('../utils') + +/** + * @typedef {yargsParser.Arguments} Arguments + * @property {string} [config='.depcheckrc.json'] + * @property {boolean} [ignoreBinPackage] + * @property {boolean} [skipMissing] + * @property {string[]} [warn=[]] + * @property {string[]} [ignores=[]] + * @property {string[]} [ignorePatterns=[]] + * @property {string[]} [specials=[]] + * @property {string[]} [detectors=[]] + */ + +/** @var {Arguments} parsedArgs */ +const parsedArgs = yargsParser(process.argv.slice(2), { + string: ['config'], + boolean: ['ignore-bin-package', 'skip-missing'], + configuration: {'strip-dashed': true}, + coerce: { + ignores: arg => arg.split(','), + warn: arg => arg.split(','), + 'ignore-patterns': arg => arg.split(','), + specials: arg => arg.split(','), + detectors: arg => arg.split(','), + }, + default: { + config: '.depcheckrc.json', + warn: [], + ignores: [], + ignorePatterns: [], + specials: [], + detectors: [], + }, +}) + +const resolvedConfig = resolveConfig(parsedArgs.config || '') +const resolvedDetectors = resolveDetectors( + uniq([...(resolvedConfig.detectors || []), ...parsedArgs.detectors]), +) +const resolvedParsers = resolveParsers({...(resolvedConfig.parsers || {})}) +const resolvedSpecials = resolveSpecials( + uniq([...(resolvedConfig.specials || []), ...parsedArgs.specials]), +) + +const resolvedOptions = { + ignorePatterns: uniq([ + ...(resolvedConfig.ignorePatterns || []), + ...parsedArgs.ignorePatterns, + ]), + ignoreMatches: uniq([ + ...(resolvedConfig.ignoreMatches || []), + ...parsedArgs.ignores, + ]), +} + +if (resolvedDetectors.length > 0) { + resolvedOptions.detectors = resolvedDetectors +} +if (resolvedParsers.length > 0) { + resolvedOptions.parsers = resolvedParsers +} +if (resolvedSpecials.length > 0) { + resolvedOptions.specials = resolvedSpecials +} +if (typeof resolvedConfig.ignoreBinPackage === 'boolean') { + resolvedOptions.ignoreBinPackage = resolvedConfig.ignoreBinPackage +} +if (typeof resolvedConfig.skipMissing === 'boolean') { + resolvedOptions.ignoreBinPackage = resolvedConfig.skipMissing +} +if (typeof parsedArgs.ignoreBinPackage === 'boolean') { + resolvedOptions.ignoreBinPackage = parsedArgs.ignoreBinPackage +} +if (typeof parsedArgs.skipMissing === 'boolean') { + resolvedOptions.skipMissing = parsedArgs.skipMissing +} + +const log = { + error: (...data) => { + console.error('Error:', ...data) + }, + warn: (...data) => { + console.warn('Warning:', ...data) + }, +} + +depcheck(process.cwd(), resolvedOptions, results => { + const logDependency = parsedArgs.warn.includes('dependency') + ? log.warn + : log.error + const logDevDependency = parsedArgs.warn.includes('devDependency') + ? log.warn + : log.error + let logMissing = parsedArgs.warn.includes('missing') ? log.warn : log.error + if (parsedArgs.skipMissing) { + logMissing = () => {} + } + + results.dependencies.forEach(dependency => + logDependency(`unused dependency ${dependency}`), + ) + results.devDependencies.forEach(devDependency => + logDevDependency(`unused devDependency ${devDependency}`), + ) + Object.keys(results.missing).forEach(missingDependency => + logMissing( + `missing dependency ${missingDependency} in file(s): ${JSON.stringify( + results.missing[missingDependency], + )}`, + ), + ) + + const exitWithError = + (!parsedArgs.warn.includes('dependency') && + results.dependencies.length > 0) || + (!parsedArgs.warn.includes('devDependency') && + results.devDependencies.length > 0) || + (!parsedArgs.skipMissing && + !parsedArgs.warn.includes('missing') && + Object.keys(results.missing).length > 0) + + if (exitWithError) { + if (!!parsedArgs.config && hasFile(parsedArgs.config)) { + console.error( + `\nFor any unused dependency false positives, consider adding a special parser or adding to ignoreMatches in ${parsedArgs.config}\n`, + ) + } else { + console.error( + `\nFor any unused dependency false positives, consider adding a special parser (--specials) or adding an ignore (--ignores)\n`, + ) + } + + process.exit(1) + } +}) diff --git a/src/utils.js b/src/utils.js index ba1daf6a..901ca3d0 100644 --- a/src/utils.js +++ b/src/utils.js @@ -10,7 +10,8 @@ const {cosmiconfigSync} = require('cosmiconfig') const {packageJson: pkg, path: pkgPath} = readPkgUp.sync({ cwd: fs.realpathSync(process.cwd()), -}) +}) || {packageJson: {name: ''}, path: ''} + const appDirectory = path.dirname(pkgPath) function resolveHoverScripts() { @@ -21,7 +22,10 @@ function resolveHoverScripts() { } // eslint-disable-next-line complexity -function resolveBin(modName, {executable = modName, cwd = process.cwd()} = {}) { +function resolveBin( + /** @type {string} */ modName, + {executable = modName, cwd = process.cwd()} = {}, +) { let pathFromWhich try { pathFromWhich = fs.realpathSync(which.sync(executable)) @@ -30,12 +34,20 @@ function resolveBin(modName, {executable = modName, cwd = process.cwd()} = {}) { // ignore _error } try { - const {packageJson: binPackage, path: binPackagePath} = readPkgUp.sync({ + const executablePkg = readPkgUp.sync({ cwd: path.dirname(require.resolve(modName)), }) + if (typeof executablePkg === 'undefined') { + throw new Error(`unable to resolve package ${modName}`) + } + + const {packageJson: binPackage, path: binPackagePath} = executablePkg const modPkgDir = path.dirname(binPackagePath) const {bin} = binPackage + if (typeof bin === 'undefined') { + throw new Error(`unable to resolve package binary ${modName}`) + } const binPath = typeof bin === 'string' ? bin : bin[executable] const fullPathToBin = path.join(modPkgDir, binPath) @@ -51,37 +63,49 @@ function resolveBin(modName, {executable = modName, cwd = process.cwd()} = {}) { } } -const fromRoot = (...p) => path.join(appDirectory, ...p) -const hasFile = (...p) => fs.existsSync(fromRoot(...p)) -const ifFile = (files, t, f) => - arrify(files).some(file => hasFile(file)) ? t : f +const fromRoot = (/** @type {string[]} */ ...p) => path.join(appDirectory, ...p) +const hasFile = (/** @type {string[]} */ ...p) => fs.existsSync(fromRoot(...p)) + +const ifFile = ( + /** @type {*} */ files, + /** @type {*} */ t, + /** @type {*} */ f, +) => (arrify(files).some((/** @type {*} */ file) => hasFile(file)) ? t : f) const getPkgName = () => pkg.name -const hasPkgProp = props => arrify(props).some(prop => has(pkg, prop)) +const hasPkgProp = (/** @type {*} */ props) => + arrify(props).some((/** @type {*} */ prop) => has(pkg, prop)) -const hasPkgSubProp = pkgProp => props => - hasPkgProp(arrify(props).map(p => `${pkgProp}.${p}`)) +const hasPkgSubProp = (/** @type {*} */ pkgProp) => (/** @type {*} */ props) => + hasPkgProp(arrify(props).map((/** @type {*} */ p) => `${pkgProp}.${p}`)) -const ifPkgSubProp = pkgProp => (props, t, f) => - hasPkgSubProp(pkgProp)(props) ? t : f +const ifPkgSubProp = + (/** @type {*} */ pkgProp) => + (/** @type {*} */ props, /** @type {*} */ t, /** @type {*} */ f) => + hasPkgSubProp(pkgProp)(props) ? t : f const hasScript = hasPkgSubProp('scripts') const hasPeerDep = hasPkgSubProp('peerDependencies') const hasDep = hasPkgSubProp('dependencies') const hasDevDep = hasPkgSubProp('devDependencies') -const hasAnyDep = args => [hasDep, hasDevDep, hasPeerDep].some(fn => fn(args)) +const hasAnyDep = (/** @type {*} */ args) => + [hasDep, hasDevDep, hasPeerDep].some(fn => fn(args)) const ifPeerDep = ifPkgSubProp('peerDependencies') const ifDep = ifPkgSubProp('dependencies') const ifDevDep = ifPkgSubProp('devDependencies') -const ifAnyDep = (deps, t, f) => (hasAnyDep(arrify(deps)) ? t : f) +const ifAnyDep = ( + /** @type {*} */ deps, + /** @type {*} */ t, + /** @type {*} */ f, +) => (hasAnyDep(arrify(deps)) ? t : f) const ifScript = ifPkgSubProp('scripts') -function parseEnv(name, def) { +function parseEnv(/** @type {string} */ name, /** @type {*} */ def) { if (envIsSet(name)) { try { - return JSON.parse(process.env[name]) + return JSON.parse(process.env[name] || '') } catch (err) { return process.env[name] } @@ -89,7 +113,7 @@ function parseEnv(name, def) { return def } -function envIsSet(name) { +function envIsSet(/** @type {string} */ name) { return ( process.env.hasOwnProperty(name) && process.env[name] && @@ -97,7 +121,10 @@ function envIsSet(name) { ) } -function getConcurrentlyArgs(scripts, {killOthers = true} = {}) { +function getConcurrentlyArgs( + /** @type {*} */ scripts, + {killOthers = true} = {}, +) { const colors = [ 'bgBlue', 'bgGreen', @@ -108,15 +135,18 @@ function getConcurrentlyArgs(scripts, {killOthers = true} = {}) { 'bgBlack', 'bgYellow', ] - scripts = Object.entries(scripts).reduce((all, [name, script]) => { - if (script) { - all[name] = script - } - return all - }, {}) + scripts = Object.entries(scripts).reduce( + (/** @type {*} */ all, [name, script]) => { + if (script) { + all[name] = script + } + return all + }, + {}, + ) const prefixColors = Object.keys(scripts) .reduce( - (pColors, _s, i) => + (/** @type {string[]} */ pColors, _s, i) => pColors.concat([`${colors[i % colors.length]}.bold.reset`]), [], ) @@ -131,11 +161,15 @@ function getConcurrentlyArgs(scripts, {killOthers = true} = {}) { ...Object.values(scripts).map(s => JSON.stringify(s)), // stringify escapes quotes ✨ ].filter(Boolean) } - -function uniq(arr) { +function uniq(/** @type {Iterable<*> | null} */ arr) { return Array.from(new Set(arr)) } +/** + * @param {string} name + * @param {{[key: string]: string}} options + * @param {boolean} [clean=true] + */ function writeExtraEntry(name, {cjs, esm}, clean = true) { if (clean) { rimraf.sync(fromRoot(name)) @@ -159,6 +193,11 @@ function writeExtraEntry(name, {cjs, esm}, clean = true) { ) } +/** + * @param {string} moduleName + * @param {{}} searchOptions + * @return {boolean} + */ function hasLocalConfig(moduleName, searchOptions = {}) { const explorerSync = cosmiconfigSync(moduleName, searchOptions) const result = explorerSync.search(pkgPath) diff --git a/yarn.lock b/yarn.lock index c5b537c5..55518251 100644 --- a/yarn.lock +++ b/yarn.lock @@ -83,6 +83,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.17.9.tgz#f4af9fd38fa8de143c29fce3f71852406fc1e2fc" + integrity sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ== + dependencies: + "@babel/types" "^7.17.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz#bb2339a7534a9c128e3102024c60760a3a7f3862" @@ -166,6 +175,14 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/helper-function-name@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz#136fcd54bc1da82fcb47565cf16fd8e444b1ff12" + integrity sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg== + dependencies: + "@babel/template" "^7.16.7" + "@babel/types" "^7.17.0" + "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz#ea08ac753117a669f1508ba06ebcc49156387419" @@ -306,11 +323,21 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/parser@7.16.4": + version "7.16.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" + integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== + "@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.16.7", "@babel/parser@^7.17.0": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.0.tgz#f0ac33eddbe214e4105363bb17c3341c5ffcc43c" integrity sha512-VKXSCQx5D8S04ej+Dqsr1CzYvvWgf20jIw2D+YhQCrIlr2UZGaDds23Y0xg75/skOxpLCRpUZvk/1EAVkGoDOw== +"@babel/parser@^7.16.4", "@babel/parser@^7.17.9": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.17.9.tgz#9c94189a6062f0291418ca021077983058e171ef" + integrity sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.7": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz#4eda6d6c2a0aa79c70fa7b6da67763dfe2141050" @@ -939,6 +966,22 @@ "@babel/parser" "^7.16.7" "@babel/types" "^7.16.7" +"@babel/traverse@^7.12.5": + version "7.17.9" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.9.tgz#1f9b207435d9ae4a8ed6998b2b82300d83c37a0d" + integrity sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw== + dependencies: + "@babel/code-frame" "^7.16.7" + "@babel/generator" "^7.17.9" + "@babel/helper-environment-visitor" "^7.16.7" + "@babel/helper-function-name" "^7.17.9" + "@babel/helper-hoist-variables" "^7.16.7" + "@babel/helper-split-export-declaration" "^7.16.7" + "@babel/parser" "^7.17.9" + "@babel/types" "^7.17.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.13.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.16.8", "@babel/traverse@^7.17.0", "@babel/traverse@^7.7.2": version "7.17.0" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.17.0.tgz#3143e5066796408ccc880a33ecd3184f3e75cd30" @@ -1602,6 +1645,14 @@ dependencies: "@types/node" "*" +"@types/glob@*": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.2.0.tgz#bc1b5bf3aa92f25bd5dd39f35c57361bdce5b2eb" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + "@types/graceful-fs@^4.1.2": version "4.1.3" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.3.tgz#039af35fe26bec35003e8d86d2ee9c586354348f" @@ -1646,11 +1697,35 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= +"@types/lodash.has@^4.5.6": + version "4.5.6" + resolved "https://registry.yarnpkg.com/@types/lodash.has/-/lodash.has-4.5.6.tgz#d94d3f0b45ced2ae76d632080daf70e9b76e29eb" + integrity sha512-SpUCvze0uHilQX/mt4K/cak5OQny1pVfz3pJx6H70dE3Tvw9s7EtlMK+vY6UBS+PQgETDfv6vhwoa3FPS2wrhg== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.181" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.181.tgz#d1d3740c379fda17ab175165ba04e2d03389385d" + integrity sha512-n3tyKthHJbkiWhDZs3DkhkCzt2MexYHXlX0td5iMplyfwketaOeKboEVBqzceH7juqvEg3q5oUoBFxSLu7zFag== + +"@types/minimatch@*", "@types/minimatch@^3.0.3": + version "3.0.5" + resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.5.tgz#1001cc5e6a3704b83c236027e77f2f58ea010f40" + integrity sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== + "@types/minimist@^1.2.0": version "1.2.2" resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/mkdirp@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.2.tgz#8d0bad7aa793abe551860be1f7ae7f3198c16666" + integrity sha512-o0K1tSO0Dx5X6xlU5F1D6625FawhC3dU3iqr25lluNv/+/QIVH8RLNEiVokgIZo+mz+87w/3Mkg/VvQS+J51fQ== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@>=17.x": version "17.0.17" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.17.tgz#a8ddf6e0c2341718d74ee3dc413a13a042c45a0c" @@ -1671,11 +1746,24 @@ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0" integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA== +"@types/rimraf@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/rimraf/-/rimraf-3.0.2.tgz#a63d175b331748e5220ad48c901d7bbf1f44eef8" + integrity sha512-F3OznnSLAUxFrCEu/L5PY8+ny8DtcFRjx7fZZ9bycvXRi3KPTRS9HOitGZwvPg0juRhXFWIeKX58cnX5YqLohQ== + dependencies: + "@types/glob" "*" + "@types/node" "*" + "@types/stack-utils@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== +"@types/which@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@types/which/-/which-2.0.1.tgz#27ecd67f915b7c3d6ba552135bb1eecd66e63501" + integrity sha512-Jjakcv8Roqtio6w1gr0D7y6twbhx6gGgFGF5BLwajPpnOIOxFkakFhCq+LmyyeAz7BX6ULrjBOxdKaCDy+4+dQ== + "@types/yargs-parser@*": version "15.0.0" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-15.0.0.tgz#cb3f9f741869e20cce330ffbeb9271590483882d" @@ -1821,6 +1909,64 @@ "@typescript-eslint/types" "5.13.0" eslint-visitor-keys "^3.0.0" +"@vue/compiler-core@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.31.tgz#d38f06c2cf845742403b523ab4596a3fda152e89" + integrity sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + source-map "^0.6.1" + +"@vue/compiler-dom@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz#b1b7dfad55c96c8cc2b919cd7eb5fd7e4ddbf00e" + integrity sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg== + dependencies: + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/compiler-sfc@^3.0.5": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz#d02b29c3fe34d599a52c5ae1c6937b4d69f11c2f" + integrity sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.31" + "@vue/compiler-dom" "3.2.31" + "@vue/compiler-ssr" "3.2.31" + "@vue/reactivity-transform" "3.2.31" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + magic-string "^0.25.7" + postcss "^8.1.10" + source-map "^0.6.1" + +"@vue/compiler-ssr@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz#4fa00f486c9c4580b40a4177871ebbd650ecb99c" + integrity sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw== + dependencies: + "@vue/compiler-dom" "3.2.31" + "@vue/shared" "3.2.31" + +"@vue/reactivity-transform@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz#0f5b25c24e70edab2b613d5305c465b50fc00911" + integrity sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA== + dependencies: + "@babel/parser" "^7.16.4" + "@vue/compiler-core" "3.2.31" + "@vue/shared" "3.2.31" + estree-walker "^2.0.2" + magic-string "^0.25.7" + +"@vue/shared@3.2.31": + version "3.2.31" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.31.tgz#c90de7126d833dcd3a4c7534d534be2fb41faa4e" + integrity sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ== + JSONStream@^1.0.4: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" @@ -1974,6 +2120,14 @@ anymatch@^3.0.3, anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" +anymatch@~3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + arg@^4.1.0: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -2004,6 +2158,11 @@ aria-query@^5.0.0: resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== +array-differ@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b" + integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== + array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -2407,6 +2566,21 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +"chokidar@>=3.0.0 <4.0.0": + version "3.5.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + chokidar@^3.4.0: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" @@ -2789,6 +2963,13 @@ debug@^3.2.7: dependencies: ms "^2.1.1" +debug@^4.2.0: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" @@ -2834,6 +3015,40 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= +depcheck@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/depcheck/-/depcheck-1.4.3.tgz#faa4c143921f3fe25d5a7a633f9864327c250843" + integrity sha512-vy8xe1tlLFu7t4jFyoirMmOR7x7N601ubU9Gkifyr9z8rjBFtEdWHDBMqXyk6OkK+94NXutzddVXJuo0JlUQKQ== + dependencies: + "@babel/parser" "7.16.4" + "@babel/traverse" "^7.12.5" + "@vue/compiler-sfc" "^3.0.5" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + debug "^4.2.0" + deps-regex "^0.1.4" + ignore "^5.1.8" + is-core-module "^2.4.0" + js-yaml "^3.14.0" + json5 "^2.1.3" + lodash "^4.17.20" + minimatch "^3.0.4" + multimatch "^5.0.0" + please-upgrade-node "^3.2.0" + query-ast "^1.0.3" + readdirp "^3.5.0" + require-package-name "^2.0.1" + resolve "^1.18.1" + sass "^1.29.0" + scss-parser "^1.0.4" + semver "^7.3.2" + yargs "^16.1.0" + +deps-regex@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deps-regex/-/deps-regex-0.1.4.tgz#518667b7691460a5e7e0a341be76eb7ce8090184" + integrity sha1-UYZnt2kUYKXn4KNBvnbrfOgJAYQ= + detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -3403,6 +3618,11 @@ estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -3634,7 +3854,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^2.3.2, fsevents@~2.3.1: +fsevents@^2.3.2, fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -3697,7 +3917,7 @@ git-raw-commits@^2.0.0: split2 "^2.0.0" through2 "^3.0.0" -glob-parent@^5.1.0, glob-parent@~5.1.0: +glob-parent@^5.1.0, glob-parent@~5.1.0, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== @@ -3920,6 +4140,11 @@ ignore@^5.1.4, ignore@^5.1.8, ignore@^5.2.0: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a" integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ== +immutable@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0.tgz#b86f78de6adef3608395efb269a91462797e2c23" + integrity sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw== + import-fresh@^3.0.0, import-fresh@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66" @@ -3997,6 +4222,13 @@ internal-slot@^1.0.3: has "^1.0.3" side-channel "^1.0.4" +invariant@2.2.4: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -4063,7 +4295,7 @@ is-core-module@^2.2.0, is-core-module@^2.8.0: dependencies: has "^1.0.3" -is-core-module@^2.5.0: +is-core-module@^2.4.0, is-core-module@^2.5.0, is-core-module@^2.8.1: version "2.8.1" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== @@ -4841,6 +5073,14 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.14.0: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" @@ -4920,6 +5160,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +json5@^2.1.3: + version "2.2.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" + integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== + jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -5137,7 +5382,7 @@ longest@^2.0.1: resolved "https://registry.yarnpkg.com/longest/-/longest-2.0.1.tgz#781e183296aa94f6d4d916dc335d0d17aefa23f8" integrity sha1-eB4YMpaqlPbU2RbcM10NF676I/g= -loose-envify@^1.4.0: +loose-envify@^1.0.0, loose-envify@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== @@ -5164,6 +5409,13 @@ lz-string@^1.4.4: resolved "https://registry.yarnpkg.com/lz-string/-/lz-string-1.4.4.tgz#c0d8eaf36059f705796e1e344811cf4c498d3a26" integrity sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY= +magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + make-dir@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" @@ -5347,11 +5599,27 @@ ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +multimatch@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-5.0.0.tgz#932b800963cea7a31a033328fa1e0c3a1874dbe6" + integrity sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== + dependencies: + "@types/minimatch" "^3.0.3" + array-differ "^3.0.0" + array-union "^2.1.0" + arrify "^2.0.1" + minimatch "^3.0.4" + mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= +nanoid@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.2.tgz#c89622fafb4381cd221421c69ec58547a1eec557" + integrity sha512-CuHBogktKwpm5g2sRgv83jEy2ijFzBwMoYA60orPDR7ynsLijJDqgsi4RDGj3OJpy3Ieb+LYwiRmIOGyytgITA== + natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -5685,7 +5953,7 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: +path-parse@^1.0.6, path-parse@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== @@ -5751,6 +6019,22 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" +please-upgrade-node@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz#aeddd3f994c933e4ad98b99d9a556efa0e2fe942" + integrity sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg== + dependencies: + semver-compare "^1.0.0" + +postcss@^8.1.10: + version "8.4.12" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.12.tgz#1e7de78733b28970fa4743f7da6f3763648b1905" + integrity sha512-lg6eITwYe9v6Hr5CncVbK70SoioNQIq81nsaG86ev5hAidQvmOeETBqs7jm43K2F5/Ley3ytDtriImV6TpNiSg== + dependencies: + nanoid "^3.3.1" + picocolors "^1.0.0" + source-map-js "^1.0.2" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -5839,6 +6123,13 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +query-ast@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/query-ast/-/query-ast-1.0.4.tgz#efa832e1270cc3e0ab42291716f73a7de1928c2a" + integrity sha512-KFJFSvODCBjIH5HbHvITj9EEZKYUU6VX0T5CuB1ayvjUoUaZkKMi6eeby5Tf8DMukyZHlJQOE1+f3vevKUe6eg== + dependencies: + invariant "2.2.4" + quick-lru@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" @@ -5917,6 +6208,13 @@ readable-stream@~2.3.6: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readdirp@^3.5.0, readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -6045,6 +6343,11 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= + requireindex@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef" @@ -6095,6 +6398,15 @@ resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0: is-core-module "^2.2.0" path-parse "^1.0.6" +resolve@^1.18.1: + version "1.22.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + resolve@^2.0.0-next.3: version "2.0.0-next.3" resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.3.tgz#d41016293d4a8586a39ca5d9b5f15cbea1f55e46" @@ -6175,6 +6487,15 @@ safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== +sass@^1.29.0: + version "1.50.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.50.0.tgz#3e407e2ebc53b12f1e35ce45efb226ea6063c7c8" + integrity sha512-cLsD6MEZ5URXHStxApajEh7gW189kkjn4Rc8DQweMyF+o5HF5nfEz8QYLMlPsTOD88DknatTmBWkOcw5/LnJLQ== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + saxes@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d" @@ -6182,6 +6503,18 @@ saxes@^5.0.1: dependencies: xmlchars "^2.2.0" +scss-parser@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/scss-parser/-/scss-parser-1.0.5.tgz#2297d688a4c300e94552f72c41fd7de092d19c4b" + integrity sha512-RZOtvCmCnwkDo7kdcYBi807Y5EoTIxJ34AgEgJNDmOH1jl0/xG0FyYZFbH6Ga3Iwu7q8LSdxJ4C5UkzNXjQxKQ== + dependencies: + invariant "2.2.4" + +semver-compare@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" + integrity sha1-De4hahyUGrN+nvsXiPavxf9VN/w= + "semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -6293,6 +6626,11 @@ slice-ansi@^5.0.0: ansi-styles "^6.0.0" is-fullwidth-code-point "^4.0.0" +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + source-map-support@^0.5.6: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -6316,7 +6654,7 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -sourcemap-codec@1.4.8: +sourcemap-codec@1.4.8, sourcemap-codec@^1.4.8: version "1.4.8" resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4" integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== @@ -6604,6 +6942,11 @@ supports-hyperlinks@^2.0.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -7209,7 +7552,7 @@ yargs-parser@^21.0.0: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55" integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA== -yargs@^16.2.0: +yargs@^16.1.0, yargs@^16.2.0: version "16.2.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==