diff --git a/.github/workflows/pr-core-tests.yml b/.github/workflows/pr-core-tests.yml index 3790a8430..c742829ae 100644 --- a/.github/workflows/pr-core-tests.yml +++ b/.github/workflows/pr-core-tests.yml @@ -14,8 +14,7 @@ jobs: fail-fast: false matrix: docker-compose-version: - - "1.29.1" - - "2.21.0" + - "2.23.0" healthcheck: - new lando-version: @@ -35,7 +34,7 @@ jobs: - examples/services - examples/tooling node-version: - - "16" + - "18" os: - ubuntu-22.04 scanner: @@ -58,24 +57,22 @@ jobs: cache: yarn - name: Install Yarn dependencies run: yarn install --prefer-offline --frozen-lockfile + - name: Bundle Deps + uses: lando/prepare-release-action@v2 + with: + lando-plugin: true + version: dev + sync: false - name: Setup lando ${{ matrix.lando-version }} uses: lando/setup-lando@v2 with: lando-version: ${{ matrix.lando-version }} + telemetry: false config: | + setup.skipCommonPlugins=true + setup.plugins.@lando/core=/home/runner/work/core/core + setup.orchestrator=${{ matrix.docker-compose-version }} orchestratorVersion=${{ matrix.docker-compose-version }} - plugins.@lando/core=/home/runner/work/core/core - telemetry: false - - name: Verify Lando works and we are dogfooding this plugin for tests - run: | - # TODO: once we have the new plugin stuff in the CLI we can remove this in favor of a local lando pa - # what about removing the plugins? - mkdir -p /home/runner/.lando/plugins/@lando - ln -sf /home/runner/work/core/core /home/runner/.lando/plugins/@lando/core - - lando --clear - lando config - lando config --path plugins --format json | jq -r '.[] | select(.name == "@lando/core").searchDir' | grep /home/runner/work/core/core || (echo "::error:: Not dogfooding this plugin correctly!" && exit 1) - name: Run Leia Tests uses: lando/run-leia-action@v2 env: diff --git a/.github/workflows/pr-db-tools-tests.yml b/.github/workflows/pr-db-tools-tests.yml index cb479aa78..c15bd01ce 100644 --- a/.github/workflows/pr-db-tools-tests.yml +++ b/.github/workflows/pr-db-tools-tests.yml @@ -15,7 +15,7 @@ jobs: os: - ubuntu-22.04 node-version: - - '16' + - "18" leia-tests: - examples/sql-export - examples/sql-import diff --git a/.github/workflows/pr-plugin-tests.yml b/.github/workflows/pr-plugin-tests.yml index 3c2261261..ec02937a1 100644 --- a/.github/workflows/pr-plugin-tests.yml +++ b/.github/workflows/pr-plugin-tests.yml @@ -14,8 +14,7 @@ jobs: fail-fast: false matrix: docker-compose-version: - - "1.29.1" - - "2.21.0" + - "2.23.0" healthcheck: - new lando-version: @@ -26,7 +25,7 @@ jobs: - examples/proxy - examples/scanner node-version: - - "16" + - "18" os: - ubuntu-22.04 scanner: @@ -35,7 +34,7 @@ jobs: # run legacy scanner checks on dc2 - docker-compose-version: "2.21.0" healthcheck: new - node-version: "16" + node-version: "18" lando-version: 3-dev leia-test: examples/scanner os: ubuntu-22.04 @@ -43,7 +42,7 @@ jobs: # run legacy healthchecks on dc2 - docker-compose-version: "2.21.0" healthcheck: legacy - node-version: "16" + node-version: "18" lando-version: 3-dev leia-test: examples/healthcheck os: ubuntu-22.04 @@ -60,21 +59,22 @@ jobs: cache: yarn - name: Install Yarn dependencies run: yarn install --prefer-offline --frozen-lockfile + - name: Bundle Deps + uses: lando/prepare-release-action@v2 + with: + lando-plugin: true + version: dev + sync: false - name: Setup lando ${{ matrix.lando-version }} uses: lando/setup-lando@v2 with: lando-version: ${{ matrix.lando-version }} + telemetry: false config: | + setup.skipCommonPlugins=true + setup.plugins.@lando/core=/home/runner/work/core/core + setup.orchestrator=${{ matrix.docker-compose-version }} orchestratorVersion=${{ matrix.docker-compose-version }} - telemetry: false - - name: Verify Lando works and we are dogfooding this plugin for tests - run: | - mkdir -p /home/runner/.lando/plugins/@lando - ln -sf /home/runner/work/core/core /home/runner/.lando/plugins/@lando/core - lando --clear - lando config - lando config --path plugins --format json | jq -r '.[] | select(.name == "@lando/core").searchDir' | grep /home/runner/work/core/core || (echo "::error:: Not dogfooding this plugin correctly!" && exit 1) - lando config --path plugins --format json | jq -r '.[] | select(.name == "@lando/networking").searchDir' | grep /home/runner/work/core/core/plugins/networking || (echo "::error:: Not dogfooding this plugin correctly!" && exit 1) - name: Run Leia Tests uses: lando/run-leia-action@v2 env: diff --git a/.tool-versions b/.tool-versions index 2d8169e51..7caf03a07 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1 +1 @@ -nodejs 14.17.6 +nodejs 18 diff --git a/app.js b/app.js index f1e9b6138..2e561e3b9 100644 --- a/app.js +++ b/app.js @@ -116,9 +116,15 @@ module.exports = async (app, lando) => { // i really wish thre was a better way to do this but alas i do not think there is app.events.on('pre-rebuild', 10, async () => await require('./hooks/app-shuffle-locals')(app, lando)); + // Check for updates if the update cache is empty + app.events.on('pre-start', 1, async () => await require('./hooks/app-check-for-updates')(app, lando)); + // If the app already is installed but we can't determine the builtAgainst, then set it to something bogus app.events.on('pre-start', async () => await require('./hooks/app-update-built-against-pre')(app, lando)); + // Add update tip if needed + app.events.on('post-start', async () => await require('./hooks/app-add-updates-info')(app, lando)); + // If we don't have a builtAgainst already then we must be spinning up for the first time and its safe to set this app.events.on('post-start', async () => await require('./hooks/app-update-built-against-post')(app, lando)); @@ -128,6 +134,9 @@ module.exports = async (app, lando) => { // Check for docker compat warnings and surface them nicely as well app.events.on('post-start', async () => await require('./hooks/app-check-docker-compat')(app, lando)); + // throw service not start errors + app.events.on('post-start', 9999, async () => await require('./hooks/app-check-v4-service-running')(app, lando)); + // Reset app info on a stop, this helps prevent wrong/duplicate information being reported on a restart app.events.on('post-stop', async () => require('./utils/get-app-info-defaults')(app)); diff --git a/builders/_drupaly.js b/builders/_drupaly.js deleted file mode 100644 index f14c8dc61..000000000 --- a/builders/_drupaly.js +++ /dev/null @@ -1,113 +0,0 @@ -'use strict'; - -// Modules -const _ = require('lodash'); -const LandoLaemp = require('./_lamp.js'); -const semver = require('semver'); - -// "Constants" -const DRUSH8 = '8.4.8'; -const DRUSH7 = '7.4.0'; - -/* - * Helper to get DRUSH phar url - */ -const getDrushUrl = version => `https://github.com/drush-ops/drush/releases/download/${version}/drush.phar`; - -const drushWarn = version => ({ - title: 'May need site-local drush', - detail: [ - `Lando has detected you are trying to globally install drush ${version}`, - 'This version of drush prefers a site-local installation', - 'We recommend you install drush that way, see:', - ], - url: 'https://www.drush.org/install/', -}); - -/* - * Helper to get a phar download and setupcommand - * @TODO: clean this mess up - */ -const getPhar = (url, src, dest, check = 'true') => { - // Arrayify the check if needed - if (_.isString(check)) check = [check]; - // Phar install command - const pharInstall = [ - ['curl', url, '-LsS', '-o', src], - ['chmod', '+x', src], - ['mv', src, dest], - check, - ]; - // Return - return _.map(pharInstall, cmd => cmd.join(' ')).join(' && '); -}; - -/* - * Helper to get the phar build command - */ -const getDrush = (version, status) => getPhar( - getDrushUrl(version), - '/tmp/drush.phar', - '/usr/local/bin/drush', - status, -); - -/* - * Build Drupal 7 - */ -module.exports = { - name: '_drupaly', - parent: '_recipe', - config: { - build: [], - composer: {}, - confSrc: __dirname, - config: {}, - database: 'mysql', - defaultFiles: { - php: 'php.ini', - }, - php: '7.2', - tooling: {drush: { - service: 'appserver', - }}, - via: 'apache', - webroot: '.', - xdebug: false, - }, - builder: (parent, config) => class LandoDrupal extends LandoLaemp.builder(parent, config) { - constructor(id, options = {}) { - options = _.merge({}, config, options); - // Set the default drush version if we don't have it - if (!_.has(options, 'drush')) options.drush = (options.php === '5.3') ? DRUSH7 : DRUSH8; - - // Figure out the drush situation - if (options.drush !== false) { - // Start by assuming a composer based install - options.composer['drush/drush'] = options.drush; - // Switch to phar based install if we can - if (semver.valid(options.drush) && semver.major(options.drush) === 8) { - delete options.composer['drush/drush']; - options.build.unshift(getDrush(options.drush, ['drush', '--version'])); - } - // Attempt to set a warning if possible - const coercedDrushVersion = semver.valid(semver.coerce(options.drush)); - if (!_.isNull(coercedDrushVersion) && semver.gte(coercedDrushVersion, '10.0.0')) { - options._app.addWarning(drushWarn(options.drush)); - } - } - - // Merge in what we have for proxy settings so we can pass them downstream - options.proxy = _.merge({}, options.proxy); - // Set legacy envars - options.services = _.merge({}, options.services, {appserver: {overrides: { - environment: { - SIMPLETEST_BASE_URL: (options.via === 'nginx') ? 'https://appserver_nginx' : 'https://appserver', - SIMPLETEST_DB: `mysql://${options.recipe}:${options.recipe}@database/${options.recipe}`, - }, - }}}); - // Send downstream - super(id, options); - }; - }, -}; diff --git a/builders/_lamp.js b/builders/_lamp.js deleted file mode 100644 index 93854eb5a..000000000 --- a/builders/_lamp.js +++ /dev/null @@ -1,213 +0,0 @@ -'use strict'; - -// Modules -const _ = require('lodash'); -const fs = require('fs'); - -// Tooling defaults -const toolingDefaults = { - 'composer': { - service: 'appserver', - cmd: 'composer --ansi', - }, - 'db-import ': { - service: ':host', - description: 'Imports a dump file into a database service', - cmd: '/helpers/sql-import.sh', - user: 'root', - options: { - 'host': { - description: 'The database service to use', - default: 'database', - alias: ['h'], - }, - 'no-wipe': { - description: 'Do not destroy the existing database before an import', - boolean: true, - }, - }, - }, - 'db-export [file]': { - service: ':host', - description: 'Exports database from a database service to a file', - cmd: '/helpers/sql-export.sh', - user: 'root', - options: { - host: { - description: 'The database service to use', - default: 'database', - alias: ['h'], - }, - stdout: { - description: 'Dump database to stdout', - }, - }, - }, - 'php': { - service: 'appserver', - cmd: 'php', - }, -}; - -// Default DB cli commands -const mysqlCli = { - service: ':host', - description: 'Drops into a MySQL shell on a database service', - cmd: 'mysql -uroot', - options: { - host: { - description: 'The database service to use', - default: 'database', - alias: ['h'], - }, - }, -}; -const postgresCli = { - service: ':host', - description: 'Drops into a psql shell on a database service', - cmd: 'psql -Upostgres', - user: 'root', - options: { - host: { - description: 'The database service to use', - default: 'database', - alias: ['h'], - }, - }, -}; - -/* - * Helper to get config defaults - */ -const getConfigDefaults = options => { - // Get the viaconf - if (_.startsWith(options.via, 'nginx')) options.defaultFiles.vhosts = 'default.conf.tpl'; - - // Get the default db conf - const dbConfig = _.get(options, 'database', 'mysql'); - const database = _.first(dbConfig.split(':')); - const version = _.last(dbConfig.split(':')).substring(0, 2); - if (database === 'mysql' || database === 'mariadb') { - if (version === '8.') { - options.defaultFiles.database = 'mysql8.cnf'; - } else { - options.defaultFiles.database = 'mysql.cnf'; - } - } - - // Verify files exist and remove if it doesn't - _.forEach(options.defaultFiles, (file, type) => { - if (!fs.existsSync(`${options.confDest}/${file}`)) { - delete options.defaultFiles[type]; - } - }); - - // Return - return options.defaultFiles; -}; - -/* - * Helper to get services - */ -const getServices = options => ({ - appserver: { - build_as_root_internal: options.build_root, - build_internal: options.build, - composer: options.composer, - composer_version: options.composer_version, - config: getServiceConfig(options), - run_as_root_internal: options.run_root, - ssl: true, - type: `php:${options.php}`, - via: options.via, - xdebug: options.xdebug, - webroot: options.webroot, - }, - database: { - config: getServiceConfig(options, ['database']), - authentication: 'mysql_native_password', - type: options.database, - portforward: true, - creds: { - user: options.recipe, - password: options.recipe, - database: options.recipe, - }, - }, -}); - -/* - * Helper to get the phar build command - */ -const getDbTooling = database => { - // Make sure we strip out any version number - database = database.split(':')[0]; - // Choose wisely - if (_.includes(['mysql', 'mariadb'], database)) { - return {mysql: mysqlCli}; - } else if (database === 'postgres') { - return {psql: postgresCli}; - } else if (database === 'mongo') { - return {mongo: { - service: 'database', - description: 'Drop into the mongo shell', - }}; - } -}; - -/* - * Helper to get service config - */ -const getServiceConfig = (options, types = ['php', 'server', 'vhosts']) => { - const config = {}; - _.forEach(types, type => { - if (_.has(options, `config.${type}`)) { - config[type] = options.config[type]; - } else if (!_.has(options, `config.${type}`) && _.has(options, `defaultFiles.${type}`)) { - if (_.has(options, 'confDest')) { - config[type] = path.join(options.confDest, options.defaultFiles[type]); - } - } - }); - return config; -}; - -/* - * Helper to get tooling - */ -const getTooling = options => _.merge({}, toolingDefaults, getDbTooling(options.database)); - -/* - * Build L(E)AMP - */ -module.exports = { - name: '_lamp', - parent: '_recipe', - config: { - confSrc: __dirname, - database: 'mysql', - defaultFiles: {}, - php: '7.4', - via: 'apache', - webroot: '.', - xdebug: false, - proxy: {}, - }, - builder: (parent, config) => class LandoLaemp extends parent { - constructor(id, options = {}) { - options = _.merge({}, config, options); - // Rebase on top of any default config we might already have - options.defaultFiles = _.merge({}, getConfigDefaults(_.cloneDeep(options)), options.defaultFiles); - options.services = _.merge({}, getServices(options), options.services); - options.tooling = _.merge({}, getTooling(options), options.tooling); - // Switch the proxy if needed - if (!_.has(options, 'proxyService')) { - if (_.startsWith(options.via, 'nginx')) options.proxyService = 'appserver_nginx'; - else if (_.startsWith(options.via, 'apache')) options.proxyService = 'appserver'; - } - options.proxy = _.set(options.proxy, options.proxyService, [`${options.app}.${options._app._config.domain}`]); - // Downstream - super(id, options); - }; - }, -}; diff --git a/builders/_lando.js b/builders/_lando.js index 3e78a03c5..848172712 100644 --- a/builders/_lando.js +++ b/builders/_lando.js @@ -2,9 +2,9 @@ // Modules const _ = require('lodash'); -const chalk = require('chalk'); const fs = require('fs'); const path = require('path'); +const {color} = require('listr2'); /* * The lowest level lando service, this is where a lot of the deep magic lives @@ -63,7 +63,7 @@ module.exports = { } } if (_.includes(legacy, version)) { - console.error(chalk.yellow(`${type} version ${version} is a legacy version! We recommend upgrading.`)); + console.error(color.yellow(`${type} version ${version} is a legacy version! We recommend upgrading.`)); } // Move our config into the userconfroot if we have some diff --git a/components/docker-engine.js b/components/docker-engine.js index d28784b0a..6616df69f 100644 --- a/components/docker-engine.js +++ b/components/docker-engine.js @@ -22,7 +22,7 @@ class DockerEngine extends Dockerode { static debug = require('debug')('docker-engine'); static config = {}; // @NOTE: is wsl accurate here? - static supportedPlatforms = ['linux', 'wsl']; + // static supportedPlatforms = ['linux', 'wsl']; constructor(config, {debug = DockerEngine.debug} = {}) { super(config); @@ -45,7 +45,7 @@ class DockerEngine extends Dockerode { sources = [], } = {}) { // handles the promisification of the merged return - const promiseHandler = async () => { + const awaitHandler = async () => { return new Promise((resolve, reject) => { // if we are not attaching then lets log the progress to the debugger if (!attach) { @@ -134,7 +134,7 @@ class DockerEngine extends Dockerode { super.buildImage({context, src: fs.readdirSync(context)}, {forcerm: true, t: tag}, callbackHandler); // make this a hybrid async func and return - return mergePromise(builder, promiseHandler); + return mergePromise(builder, awaitHandler); } /* @@ -178,7 +178,7 @@ class DockerEngine extends Dockerode { attach = false, } = {}) { // handles the promisification of the merged return - const promiseHandler = async () => { + const awaitHandler = async () => { return new Promise((resolve, reject) => { // if we are not attaching then lets log the progress to the debugger if (!attach) { @@ -242,7 +242,7 @@ class DockerEngine extends Dockerode { // log this.debug('pulling image %o', image); // make this a hybrid async func and return - return mergePromise(puller, promiseHandler); + return mergePromise(puller, awaitHandler); } /* @@ -270,7 +270,7 @@ class DockerEngine extends Dockerode { */ run(command, { - image = 'node:16-alpine', + image = 'node:18-alpine', createOptions = {}, allo = '', attach = false, @@ -279,7 +279,7 @@ class DockerEngine extends Dockerode { stdouto = '', stderro = '', } = {}) { - const promiseHandler = async () => { + const awaitHandler = async () => { return new Promise((resolve, reject) => { runner.on('container', container => { runner.on('stream', stream => { @@ -382,7 +382,7 @@ class DockerEngine extends Dockerode { // log this.debug('running command %o on image %o with create opts %o', command, image, copts); // make this a hybrid async func and return - return mergePromise(runner, promiseHandler); + return mergePromise(runner, awaitHandler); } } diff --git a/components/plugin.js b/components/plugin.js new file mode 100644 index 000000000..364b462fb --- /dev/null +++ b/components/plugin.js @@ -0,0 +1,362 @@ +'use strict'; + +const fs = require('fs-extra'); +const has = require('lodash/has'); +const isClass = require('is-class'); +const makeError = require('../utils/make-error'); +const merge = require('../utils/merge'); +const os = require('os'); +const path = require('path'); +const parsePkgName = require('../utils/parse-package-name'); +const read = require('../utils/read-file'); +const semver = require('semver'); +const write = require('../utils/write-file'); + +const {nanoid} = require('nanoid'); +const {extract, manifest, packument} = require('pacote'); + +/** + * + */ +class Plugin { + // @TODO: in v4 auth/scope will be set in lando config at plugins.scope/plugins.auth + // @TODO: ^ some hook can set these with npmrc/yarnrc files? + // @TODO: we need to add some masking to auth stuff ^ in lando config get + static config = {}; + static channel = 'stable'; + static id = 'plugin'; + static debug = require('debug')('@lando/core:plugin'); + + /* + * fetches a plugin from a registry/git repo + */ + static async fetch(plugin, { + dest = os.tmpdir(), + installer = Plugin.installer, + config = Plugin.config, + type = 'app', + } = {}) { + // parse the package name + const pkg = parsePkgName(plugin); + + // get the info so we can determine whether this is a lando package or not + try { + const info = await Plugin.info(pkg.raw, {config}); + + // update dest with name and compute the package.json location + dest = path.join(dest, info.name); + const pjson = path.join(dest, 'package.json'); + + // make sure we have a place to extract the plugin + const tmp = path.join(os.tmpdir(), nanoid()); + fs.mkdirSync(tmp, {recursive: true}); + + // try to extract the plugin + const {resolved} = await extract(pkg.raw, tmp, merge({Arborist: require('@npmcli/arborist')}, [config])); + Plugin.debug('extracted plugin %o to %o from %o using %o', info._id, tmp, resolved, config); + + // if we get this far then we can safely move the plugin to dest + fs.removeSync(dest, {recursive: true, force: true}); + fs.mkdirSync(dest, {recursive: true}); + fs.copySync(tmp, dest, {overwrite: true}); + Plugin.debug('moved plugin from %o to %o', tmp, dest); + + // rewrite package.json so it includes relevant dist stuff from info, this is relevant for updating purposes + if (fs.existsSync(pjson)) { + write(pjson, merge(info, read(pjson))); + Plugin.debug('modified %o to include distribution info', pjson); + } + + // return instantiated plugin + return new Plugin(dest, {installer, type}); + + // handle errors + } catch (error) { + // local plugin does not seem to exist + if (error.code === 'ENOENT') error.message = `there does not seem to be a plugin at ${path.dirname(error.path)}`; + // other errors + throw error; + } + } + + /* + * TBD + */ + static async info(plugin, { + config = Plugin.config, + } = {}) { + // parse the plugin name + const pkg = parsePkgName(plugin); + + // try to get info about the package + try { + const info = await manifest(pkg.raw, merge({}, [config, {fullMetadata: true, preferOnline: true}])); + Plugin.debug('retrieved plugin information for %o from %o using %o', pkg.raw, info._resolved, config); + + // if not a "lando plugin" then throw an error + if (!Plugin.isValid(info)) { + const error = new Error(`${pkg.raw} does not seem to be a valid plugin!`); + error.ref = 'docs to plugin requirements dev page'; + error.suggestions = ['tbd']; + throw error; + } + + return info; + + // handle errors + } catch (error) { + // @TODO: other errors? + // local path that does not exist? + // auth failure? + // debug the original error + Plugin.debug('%s', error.message); + Plugin.debug('%j', error); + // better 404 message + if (error.statusCode === 404) error.message = `Could not find a plugin called ${pkg.raw} (${error.uri})`; + // throw + throw makeError({error}); + } + } + + /* + * Takes a plugin eg this or the result of Plugin.info and determines whether its a lando plugin or not + */ + static isValid(plugin) { + // if we are looking at a plugin instance then + if (isClass(plugin.constructor) && plugin.constructor.name === 'Plugin') { + return Object.keys(plugin.manifest).length > 0 || + has(plugin.pjson, 'lando') || + (plugin.pjson.keywords && plugin.pjson.keywords.includes('lando-plugin')); + } + + // if we get here assume its info and return true for needed conditions + // has a lando section in the package.json + if (plugin.lando) return true; + // has the "lando-plugin" keyword in the package.json + if (plugin.keywords && plugin.keywords.includes('lando-plugin')) return true; + + // otherwise false + return false; + } + + /* + * @TODO: scripts shoudl be moved into the engine constructor + */ + constructor(location, { + channel = Plugin.channel, + config = {}, + commit, + debug = Plugin.debug, + id = Plugin.id || 'lando', + installer = Plugin.installer, + loadOpts = [], + type = 'app', + version = undefined, + } = {}) { + // core props + this.root = location; + this.channel = channel; + this.enabled = true; + this.installer = installer; + this.type = type; + + // throw error if plugin does not seem to exist + if (!fs.existsSync(path.join(this.root, 'package.json'))) throw new Error(`Could not find a plugin in ${this.root}`); // eslint-disable-line max-len + + // set top level things + this.location = this.root; + this.pjson = read(path.join(this.root, 'package.json')); + this.sourceRoot = this.root; + + // get the manifest + debug.extend(this.pjson.name)('found plugin at %o', this.root); + // get the manifest and normalize it based on root + this.manifest = require('../utils/normalize-manifest-paths')({...this.pjson.lando, ...this.#load(...loadOpts)}, this.root); // eslint-disable-line max-len + + // if the manifest disables the plugin + if (this.manifest.enabled === false || this.manifest.enabled === 0) this.enabled = false; + + // set some key props + this.name = this.manifest.name || this.pjson.name; + this.nm = path.join(this.root, 'node_modules'); + this.debug = debug.extend(this.name); + this.package = this.pjson.name; + this.version = this.pjson.version; + + // extract the plugin config from teh manifest and merge in any user injected config + this.api = this.manifest.api || 4; + this.cspace = this.manifest.cspace || this.name; + this.core = this.manifest.core === true || false; + // @NOTE: do we still want to do this? + this.config = merge({}, [this.manifest.config, config[this.cspace]]); + + // if we dont have a version at this point lets traverse up and see if we can find a parent + if (!this.version) { + // get the list of potential parents + const ppsjons = require('../utils/traverse-up')(['package.json'], path.resolve(this.root, '..')); + // remove the root + ppsjons.pop(); + // paternity test + const pjsons = ppsjons.filter(pjson => fs.existsSync(pjson)); + + // if we have parents then use the closest and also reset some package considerations for updating + if (pjsons.length > 0) { + this.parent = require(pjsons[0]); + this.sourceRoot = path.dirname(pjsons[0]); + this.version = this.parent.version; + this.package = this.parent.name; + this.nested = true; + } + } + + // add auxilary package info + this.spec = `${this.package}@${this.version}`; + this.scope = require('npm-package-arg')(this.spec).scope; + if (this.scope) this.unscoped = this.package.replace(`${this.scope}/`, ''); + + // add some computed properties + // @NOTE: do we need a stronger check for isupdateable? + this.isInstalled = false; + this.isUpdateable = has(this.parent, 'pjson.dist') || has(this, 'pjson.dist'); + this.isValid = Plugin.isValid(this); + this.updateAvailable = false; + + // determine some packaging stuff + this.packaged = has(this.parent, 'pjson.dist') || has(this, 'pjson.dist'); + this.source = fs.existsSync(path.join(this.sourceRoot, '.git', 'HEAD')); + this.commit = this.source ? require('../utils/get-commit-hash')(this.sourceRoot, {short: true}) : false; + // append commit to version if from source + if (this.source && this.commit) this.version = `${this.version}-0-${this.commit}`; + + // if the plugin does not have any dependencies then consider it installed + if (!this.pjson.dependencies || Object.keys(this.pjson.dependencies).length === 0) { + this.isInstalled = true; + } + + // if plugin has a non-empty node_modules folder then consider it installed + // @NOTE: is this good enough? + if (fs.existsSync(this.nm) && fs.readdirSync(this.nm).length > 0) { + this.isInstalled = true; + } + + // if is updateable then lets try to figure out the template string for release notes + if (this.isUpdateable) this.rnt = this.manifest['release-notes']; + // special release notes handling for core @lando/packages + if (!this.rnt && this.scope === '@lando') { + this.rnt = `https://github.com/lando/${this.unscoped}/releases/tag/v\${version}`; + } + + // log result + const status = {enabled: this.enabled, valid: this.isValid, installed: this.isInstalled}; + this.debug('instantiated plugin with status %o', status); + } + + // Internal method to help load config + // @TODO: we might want to put more stuff in here at some point. + // @NOTE: this will differ from "init" which should require in all needed files? + // @TODO: we might want to replace this with Config? + // @TODO: how will plugin config merge with the global/app config? + #load(config) { + // return the plugin.js return first + if (fs.existsSync(path.join(this.root, 'plugin.js'))) return require(path.join(this.root, 'plugin.js'))(config); + // otherwise return the plugin.yaml content + if (fs.existsSync(path.join(this.root, 'plugin.yaml'))) return read(path.join(this.root, 'plugin.yaml')); + // otherwise return the plugin.yml content + if (fs.existsSync(path.join(this.root, 'plugin.yml'))) return read(path.join(this.root, 'plugin.yml')); + // otherwise return uh, nothing? + return {}; + } + + async check4Update() { + // if plugin is not updateable then immediately return + if (!this.isUpdateable) { + this.debug('%o is not updateable, update manually', this.name); + return this; + } + + // otherwise proceed by first normalizing the channel + const channel = this.channel === 'stable' ? 'latest' : this.channel; + + try { + // check internet connection + const online = await require('is-online')(); + // throw error if not online + if (!online) throw new Error('Cannot detect connection to internet!'); + // process to check + // get release data + const data = await packument(this.spec, merge({}, [Plugin.config, {fullMetadata: true}])); + // build a list of highest available versions + const havs = [data['dist-tags'].latest]; + // if we are looking at a non-standard channel then include that tag as well + if (this.channel !== 'stable') havs.push(data['dist-tags'][channel]); + // select the highest version + const hv = semver.rsort(havs)[0]; + const hc = data['dist-tags'].latest === hv ? 'stable' : channel; + + // if the hv is lte to what we have then no update is available + if (semver.lte(hv, this.version)) { + this.debug('%o cannot be updated on channel %o (%o <= %o)', this.package, channel, hv, this.version); + return this; + + // otherwise update is available + } else { + this.updateAvailable = `${this.package}@${hv}`; + this.update = await Plugin.info(this.updateAvailable); + this.update.channel = hc; + this.debug( + '%o can be updated to %o on channel %o (%o > %o) ', + this.package, + this.updateAvailable, + channel, + hv, + this.version, + ); + return this; + } + + // catch + // @TODO: what do we actually want to do here? + } catch (error) { + // better 404 message + if (error.statusCode === 404) error.message = `Could not find a plugin called ${this.package}`; + // debug error + this.debug('%o could not get update info, error: %o', this.package, error.message); + this.debug('%j', error); + this.isUpdateable = false; + this.updateAvailable = false; + this.update = {error}; + throw makeError({error}); + } + } + + /* + * We get the data from this.location when calling info on the instance because *presumably* this should be best + * across different package types + */ + async info() { + const info = await manifest(this.location, {fullMetadata: true}); + this.debug('retrieved plugin information for %o from %o', this.spec, info._resolved); + return info; + } + + /** + * Install a plugin. + * ideally we do not have to do this because the pacakge is fully contained in the tarball + */ + async install({installer = this.installer || Plugin.installer} = {}) { + // try teh install + await installer.installPlugin(this.root, this.config.installer); + // if we get here then we can update isInstalled + this.isInstalled = true; + } + + /* + * Remove a plugin. + */ + remove() { + this.debug('removed %o from %o', this.spec, this.location); + return fs.rmSync(this.root, {recursive: true, force: true}); + } +} + +module.exports = Plugin; diff --git a/examples/base/README.md b/examples/base/README.md index ab46af526..0c0f3f71e 100644 --- a/examples/base/README.md +++ b/examples/base/README.md @@ -81,11 +81,17 @@ lando config --lando | grep verbose # Should return the version lando version | grep "v3." -# Should run with specified verbosity -# @NOTE: for some reason -vvv|DEBUG does not work so omitting -lando info -v | grep INFO -lando info -vv | grep VERBOSE -lando info -vvvv | grep SILLY +# Should run debug messages on stderr +lando info -v | grep INFO || echo $? | grep 1 +lando info -vv | grep VERBOSE || echo $? | grep 1 +lando info -vvv | grep DEBUG || echo $? | grep 1 +lando info -vvvv | grep SILLY || echo $? | grep 1 + +# Should run with specified verbosity on stderr +lando info -v 2>&1 | grep INFO +lando info -vv 2>&1 | grep VERBOSE +lando info -vvv 2>&1 | grep DEBUG +lando info -vvvv 2>&1 | grep SILLY # Should run lando config without error lando config diff --git a/examples/orchestrator/README.md b/examples/orchestrator/README.md index acaf28b8e..c5a072338 100755 --- a/examples/orchestrator/README.md +++ b/examples/orchestrator/README.md @@ -28,9 +28,10 @@ lando start lando start -vvv 2>&1 | grep ".lando/bin/docker-compose-v$(lando config --path orchestratorVersion --format json | tr -d '"')" # Should install a custom version if specified -LANDO_ORCHESTRATOR_VERSION="1.29.2" lando config --path orchestratorVersion --format json | tr -d '"' | grep "1.29.2" -LANDO_ORCHESTRATOR_VERSION="1.29.2" lando start -LANDO_ORCHESTRATOR_VERSION="1.29.2" lando start -vvv 2>&1 | grep ".lando/bin/docker-compose-v1.29.2" +lando setup -y --skip-common-plugins --orchestrator="2.19.1" +LANDO_ORCHESTRATOR_VERSION="2.19.1" lando config --path orchestratorVersion --format json | tr -d '"' | grep "2.19.1" +LANDO_ORCHESTRATOR_VERSION="2.19.1" lando start +LANDO_ORCHESTRATOR_VERSION="2.19.1" lando start -vvv 2>&1 | grep ".lando/bin/docker-compose-v2.19.1" # Should use a system fallback if avialable if version is bogus LANDO_ORCHESTRATOR_VERSION="UHNO" lando start -vvv 2>&1 | grep "/usr/local/bin/docker-compose" diff --git a/hooks/app-add-recipes.js b/hooks/app-add-recipes.js index 416cbe0f0..4bb0aaa45 100644 --- a/hooks/app-add-recipes.js +++ b/hooks/app-add-recipes.js @@ -13,12 +13,12 @@ module.exports = async (app, lando) => { // Build da things // @NOTE: this also gathers app.info and build steps const Recipe = lando.factory.get(app.config.recipe); - const config = utils.parseConfig(app.config.recipe, app); + const config = require('../utils/parse-recipe-config')(app.config.recipe, app); // Get recipe config const recipe = new Recipe(config.name, config).config; // Cache dump our app tooling so we can use it in our entrypoint // @NOTE: we dump pre-merge so that tooling directly in the landofile is not mixed in - lando.cache.set(toolingCache, JSON.stringify(recipe.tooling), {persist: true}); + lando.cache.set(app.toolingCache, JSON.stringify(recipe.tooling), {persist: true}); // Merge stuff together correctly app.config.proxy = _.merge({}, recipe.proxy, _.get(app, 'config.proxy', {})); app.config = lando.utils.merge({services: recipe.services, tooling: recipe.tooling}, app.config); diff --git a/hooks/app-add-updates-info.js b/hooks/app-add-updates-info.js new file mode 100644 index 000000000..bac85b545 --- /dev/null +++ b/hooks/app-add-updates-info.js @@ -0,0 +1,18 @@ +'use strict'; + +module.exports = async (app, lando) => { + if (lando.config.channel !== 'none' && lando.cache.get('updates-2')) { + const {updates} = lando.cache.get('updates-2'); + if (updates > 0) { + app.addMessage({ + title: 'Updates available!', + type: 'tip', + detail: [ + `Lando has detected ${updates} packages that can be updated.`, + 'Updating fixes bugs, security issues and bring new features.', + ], + command: 'lando update', + }); + } + } +}; diff --git a/hooks/app-check-docker-compat.js b/hooks/app-check-docker-compat.js index b7489ef43..fa7d4ae59 100644 --- a/hooks/app-check-docker-compat.js +++ b/hooks/app-check-docker-compat.js @@ -1,10 +1,9 @@ 'use strict'; const _ = require('lodash'); -const warnings = require('../lib/warnings'); module.exports = async (app, lando) => { _.forEach(_(lando.versions).filter(version => version && version.dockerVersion).value(), thing => { - if (!thing.satisfied) app.addWarning(warnings.unsupportedVersionWarning(thing)); + if (!thing.satisfied) app.addMessage(require('../messages/unsupported-version-info')(thing)); }); }; diff --git a/hooks/app-check-for-updates.js b/hooks/app-check-for-updates.js new file mode 100644 index 000000000..258cc3fe6 --- /dev/null +++ b/hooks/app-check-for-updates.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = async (app, lando) => { + if (lando.config.channel !== 'none' && !lando.cache.get('updates-2')) { + lando.log.debug('checking for updates...'); + const tasks = await lando.updates.getUpdateTasks(); + // next check in a day + const expires = Date.now() + 60 * 60 * 24 * 1000; + lando.log.debug('%s updates available, next check at %s', tasks.length, new Date(expires)); + lando.cache.set('updates-2', {updates: tasks.length, expires}, {persist: true}); + } +}; diff --git a/hooks/app-check-ssh-keys.js b/hooks/app-check-ssh-keys.js index 964bbd783..466743e5d 100644 --- a/hooks/app-check-ssh-keys.js +++ b/hooks/app-check-ssh-keys.js @@ -3,7 +3,6 @@ const _ = require('lodash'); const fs = require('fs'); const path = require('path'); -const warnings = require('../lib/warnings'); module.exports = async (app, lando) => { // Get keys on host @@ -20,6 +19,6 @@ module.exports = async (app, lando) => { app.log.silly('users keys', keys); // Add a warning if we have more keys than the warning level if (keySize > lando.config.maxKeyWarning) { - app.addWarning(warnings.maxKeyWarning()); + app.addMessage(require('../messages/max-key-tip')); } }; diff --git a/hooks/app-check-v4-service-running.js b/hooks/app-check-v4-service-running.js new file mode 100644 index 000000000..4908ff16c --- /dev/null +++ b/hooks/app-check-v4-service-running.js @@ -0,0 +1,22 @@ +'use strict'; + +// Modules +const _ = require('lodash'); + +module.exports = async (app, lando) => { + const buildV4Services = _(app.v4.parsedConfig) + .filter(service => _.includes(_.get(app, 'opts.services', app.services), service.name)) + .map(service => service.name) + .value(); + + const containers = await lando.engine.list({project: app.project, all: true}) + .filter(container => buildV4Services.includes(container.service)) + .filter(container => !container.running); + + if (containers.length > 0) { + for (const container of containers) { + const err = new Error(`Service ${container.service} not running: ${container.status}`); + app.addMessage(require('../messages/service-not-running-error')(container.service), err); + } + } +}; diff --git a/hooks/app-refresh-v3-certs.js b/hooks/app-refresh-v3-certs.js index cca4b67f5..3862b30e5 100644 --- a/hooks/app-refresh-v3-certs.js +++ b/hooks/app-refresh-v3-certs.js @@ -1,7 +1,6 @@ 'use strict'; const _ = require('lodash'); -const warnings = require('../lib/warnings'); module.exports = async (app, lando) => { const buildServices = _.get(app, 'opts.services', app.services) @@ -23,7 +22,7 @@ module.exports = async (app, lando) => { }, }) .catch(err => { - app.addWarning(warnings.serviceNotRunningWarning(service), err); + app.addMessage(require('../messages/service-not-running-error')(service), err); }); })); }; diff --git a/hooks/app-run-events.js b/hooks/app-run-events.js index ba2f214eb..921086139 100644 --- a/hooks/app-run-events.js +++ b/hooks/app-run-events.js @@ -29,11 +29,11 @@ module.exports = async (app, lando, cmds, data, event) => { const injectable = _.has(app, 'engine') ? app : lando; return injectable.engine.run(eventCommands).catch(err => { const command = _.tail(event.split('-')).join('-'); - if (app.addWarning) { - const message = _.trim(_.get(err, 'message')); - console.log(err); - app.addWarning({ + if (app.addMessage) { + const message = _.trim(_.get(err, 'message')) || 'UNKNOWN ERROR'; + app.addMessage({ title: `The ${event} event has command(s) that failed!`, + type: 'warning', detail: [ `Event failed with: "${message}"`, 'This **MAY** prevent your app from working.', diff --git a/hooks/app-run-legacy-healthchecks.js b/hooks/app-run-legacy-healthchecks.js index 4da0f93a9..3d4c5f334 100644 --- a/hooks/app-run-legacy-healthchecks.js +++ b/hooks/app-run-legacy-healthchecks.js @@ -41,8 +41,9 @@ module.exports = async (app, lando) => { // parse the message const message = _.trim(_.get(error, 'message', 'UNKNOWN ERROR')); // add the warning - app.addWarning({ + app.addMessage({ title: `The service "${service.service}" failed its healthcheck`, + type: 'warning', detail: [ `Failed with "${message}"`, 'This may be ok but we recommend you run the command below to investigate:', diff --git a/hooks/app-run-v3-secondary-sweep.js b/hooks/app-run-v3-secondary-sweep.js index 647e5d7b0..296a3a48c 100644 --- a/hooks/app-run-v3-secondary-sweep.js +++ b/hooks/app-run-v3-secondary-sweep.js @@ -1,7 +1,6 @@ 'use strict'; const _ = require('lodash'); -const warnings = require('../lib/warnings'); module.exports = async (app, lando) => { // scope app.nonRoot to v3 services only since this is not a workaround that v4 needs @@ -24,7 +23,7 @@ module.exports = async (app, lando) => { }, }) .catch(err => { - app.addWarning(warnings.serviceNotRunningWarning(service), err); + app.addMessage(require('../messages/service-not-running-error')(service), err); }); })); } diff --git a/hooks/app-run-v4-build-steps.js b/hooks/app-run-v4-build-steps.js index b843be760..19d7ae6ff 100644 --- a/hooks/app-run-v4-build-steps.js +++ b/hooks/app-run-v4-build-steps.js @@ -48,7 +48,6 @@ module.exports = async (app, lando) => { // and then run them in parallel const {errors} = await app.runTasks(tasks, { - ctx: {errors: []}, renderer: 'dc2', rendererOptions: { header: 'Building', @@ -64,8 +63,9 @@ module.exports = async (app, lando) => { // go through failures and add warnings as needed, rebase on base image _.forEach(errors, error => { - app.addWarning({ + app.addMessage({ title: `Could not build v4 image "${_.get(error, 'context.id')}!"`, + type: 'warning', detail: [ `Failed with "${_.get(error, 'short')}"`, `Rerun with "lando rebuild -vvv" to see the entire build log and look for errors. When fixed run:`, diff --git a/hooks/app-update-built-against-post.js b/hooks/app-update-built-against-post.js index 4dec1ead9..4b414307f 100644 --- a/hooks/app-update-built-against-post.js +++ b/hooks/app-update-built-against-post.js @@ -1,9 +1,8 @@ 'use strict'; const _ = require('lodash'); -const warnings = require('../lib/warnings'); module.exports = async (app, lando) => { if (!_.has(app.meta, 'builtAgainst')) require('./app-update-built-against')(app, lando); - if (app.meta.builtAgainst !== app._config.version) app.addWarning(warnings.rebuildWarning()); + if (app.meta.builtAgainst !== app._config.version) app.addMessage(require('../messages/rebuild-tip')); }; diff --git a/hooks/lando-add-l337-spec.js b/hooks/lando-add-l337-spec.js new file mode 100644 index 000000000..eec76f731 --- /dev/null +++ b/hooks/lando-add-l337-spec.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = async lando => { + lando.factory.registry.unshift({api: 4, name: 'l337', builder: require('../components/l337-v4')}); +}; diff --git a/hooks/lando-autostart-engine.js b/hooks/lando-autostart-engine.js new file mode 100644 index 000000000..e326b0357 --- /dev/null +++ b/hooks/lando-autostart-engine.js @@ -0,0 +1,40 @@ +'use strict'; + +// if we at engine level bootsrap level or above then autostart the engine if we need to +// @NOTE: for some reason _SOMETIMES_ autostarting before lando start produces an error but we are just +// not going to address it in favor of lando 4 stuff +module.exports = async lando => { + if (lando._bootstrapLevel >= 3 && await lando.engine.daemon.isUp() === false) { + const debug = require('../utils/debug-shim')(lando.log); + const tasks = [{ + title: 'It seems Docker is not running, trying to start it up...', + retry: 25, + delay: 1000, + task: async (ctx, task) => { + // prompt for password if interactive and we dont have it + if (process.platform === 'linux' && require('is-interactive')) { + ctx.password = await task.prompt({ + type: 'password', + name: 'password', + message: `Enter computer password for ${lando.config.username} to start docker`, + validate: async (input, state) => { + const options = {debug, ignoreReturnCode: true, password: input}; + const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); + if (response.code !== 0) return response.stderr; + return true; + }, + }); + } + + try { + await lando.engine.daemon.up(false, ctx.password); + await lando.shell.sh([`"${lando.engine.daemon.docker}"`, 'network', 'ls']); + } catch (error) { + ctx.errors.push(error); + throw error; + } + }, + }]; + await lando.runTasks(tasks, {listrOptions: {exitOnError: true}}); + } +}; diff --git a/hooks/lando-dep-check.js b/hooks/lando-dep-check.js new file mode 100644 index 000000000..6b1180ba6 --- /dev/null +++ b/hooks/lando-dep-check.js @@ -0,0 +1,26 @@ +'use strict'; + +module.exports = async lando => { + // only run if engine bootstrap or above and if engine/orchestrator have been installed + if (lando._bootstrapLevel >= 3) { + lando.log.verbose('build-engine exists: %s', lando.engine.dockerInstalled); + lando.log.verbose('orchestrator exists: %s', lando.engine.composeInstalled); + + // BUILD ENGINE + if (lando.engine.dockerInstalled === false) { + if (lando.cli) { + const dep = process.platform === 'linux' ? 'DOCKER ENGINE' : 'DOCKER DESKTOP'; + console.error(lando.cli.makeArt('noDockerDep', dep)); + process.exit(1); + } else throw Error('docker could not be located!'); + } + + // ORCHESTRATOR + if (lando.engine.composeInstalled === false) { + if (lando.cli) { + console.error(lando.cli.makeArt('noDockerDep', 'DOCKER COMPOSE')); + process.exit(1); + } else throw Error('docker-compose could not be located!'); + } + } +}; diff --git a/hooks/lando-ensure-orchestrator.js b/hooks/lando-ensure-orchestrator.js deleted file mode 100644 index 4cb534a34..000000000 --- a/hooks/lando-ensure-orchestrator.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -module.exports = async lando => { - if (!!!lando.config.orchestratorBin) lando.config.orchestratorBin = require('./../utils/get-compose-x')(lando.config); - lando.log.debug('using docker-compose %s', lando.config.orchestratorBin); -}; diff --git a/hooks/lando-flush-updates-cache.js b/hooks/lando-flush-updates-cache.js new file mode 100644 index 000000000..b2e0775ba --- /dev/null +++ b/hooks/lando-flush-updates-cache.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = async (lando, options) => { + if (lando.config.channel !== 'none' && lando.cache.get('updates-2')) { + const {expires} = lando.cache.get('updates-2'); + if (expires < Date.now()) lando.cache.remove('updates-2'); + } +}; diff --git a/hooks/lando-get-compat.js b/hooks/lando-get-compat.js new file mode 100644 index 000000000..7acadcf39 --- /dev/null +++ b/hooks/lando-get-compat.js @@ -0,0 +1,17 @@ +'use strict'; + +const _ = require('lodash'); + +module.exports = async lando => { + // only run if engine bootstrap or above and if engine/orchestrator have been installed + if (lando._bootstrapLevel >= 3) { + if (lando.engine.composeInstalled && lando.engine.dockerInstalled ) { + lando.engine.getCompatibility().then(results => { + lando.log.verbose('checking docker version compatibility...'); + lando.log.debug('compatibility results', _.keyBy(results, 'name')); + lando.cache.set('versions', _.assign(lando.versions, _.keyBy(results, 'name')), {persist: true}); + lando.versions = lando.cache.get('versions'); + }); + } + } +}; diff --git a/hooks/lando-reset-orchestrator.js b/hooks/lando-reset-orchestrator.js new file mode 100644 index 000000000..a825a5c26 --- /dev/null +++ b/hooks/lando-reset-orchestrator.js @@ -0,0 +1,22 @@ +'use strict'; + +module.exports = async lando => { + // if we dont have an orchestrator bin yet then discover it + if (!!!lando.config.orchestratorBin) lando.config.orchestratorBin = require('../utils/get-compose-x')(lando.config); + + // because the entire lando 3 runtime was made in a bygone era when we never dreamed of doing stuff like this + // we need this workaround + if (lando._bootstrapLevel >= 3 && !lando.engine.composeInstalled) { + lando.engine = lando.engine = require('../utils/setup-engine')( + lando.config, + lando.cache, + lando.events, + lando.log, + lando.shell, + lando.config.instance, + ); + } + + // log our sitch + lando.log.debug('using docker-compose %s', lando.config.orchestratorBin); +}; diff --git a/hooks/lando-setup-build-engine-darwin.js b/hooks/lando-setup-build-engine-darwin.js new file mode 100644 index 000000000..e0c4e8355 --- /dev/null +++ b/hooks/lando-setup-build-engine-darwin.js @@ -0,0 +1,148 @@ +'use strict'; + +const os = require('os'); +const path = require('path'); +const semver = require('semver'); + +const {color} = require('listr2'); + +const buildIds = { + '4.25.2': '129061', + '4.25.1': '128006', + '4.25.0': '126437', +}; + +/* + * Helper to get build engine id + */ +const getId = version => { + // if version is an integer then assume its already the id + if (semver.valid(version) === null && Number.isInteger(parseInt(version))) return version; + // otherwise return that corresponding build-id + return buildIds[version]; +}; + +const getVersion = version => { + // if version is not an integer then assume its already the version + if (semver.valid(version) !== null) return version; + // otherwise return the version that corresponds to the build id + return Object.keys(buildIds).find(key => buildIds[key] === version); +}; + +/* + * Helper to get docker compose v2 download url + */ +const getEngineDownloadUrl = (id = '126437') => { + const arch = process.arch === 'arm64' ? 'arm64' : 'amd64'; + return `https://desktop.docker.com/mac/main/${arch}/${id}/Docker.dmg`; +}; + +/* + * wrapper for docker-desktop install + */ +const downloadDockerDesktop = (url, {debug, task, ctx}) => new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, {debug}); + // success + download.on('done', result => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', error => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', progress => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); +}); + +module.exports = async (lando, options) => { + const debug = require('../utils/debug-shim')(lando.log); + // get stuff from config/opts + const build = getId(options.buildEngine); + const version = getVersion(options.buildEngine); + // cosmetics + const install = version ? `v${version}` : `build ${build}`; + + // darwin install task + options.tasks.push({ + title: `Downloading build engine`, + id: 'setup-build-engine', + description: `@lando/build-engine (docker-desktop)`, + version: `docker-desktop ${install}`, + hasRun: async () => { + // start by looking at the engine install status + // @NOTE: is this always defined? + if (lando.engine.dockerInstalled === false) return false; + + // if we get here let's make sure the engine is on + try { + await lando.engine.daemon.up(); + const BuildEngine = require('../components/docker-engine'); + const bengine = new BuildEngine(lando.config.buildEngine, {debug}); + await bengine.info(); + return true; + } catch (error) { + lando.log.debug('docker install task has not run %j', error); + return false; + } + }, + canRun: async () => { + // throw if we cannot resolve a semantic version to a buildid + if (!build) throw new Error(`Could not resolve ${install} to an installable version!`); + // throw error if not online + if (!await require('is-online')()) throw new Error('Cannot detect connection to internet!'); + // throw if user is not an admin + if (!await require('../utils/is-admin-user')()) { + throw new Error([ + `User "${os.userInfo().username}" does not have permission to install the build engine!`, + 'Contact your system admin for permission and then rerun setup.', + ].join(os.EOL)); + } + + return true; + }, + task: async (ctx, task) => { + try { + // download the installer + ctx.download = await downloadDockerDesktop(getEngineDownloadUrl(build), {ctx, debug, task}); + + // prompt for password if interactive + if (require('is-interactive')) { + ctx.password = await task.prompt({ + type: 'password', + name: 'password', + message: `Enter computer password for ${lando.config.username} to install build engine`, + validate: async (input, state) => { + const options = {debug, ignoreReturnCode: true, password: input}; + const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); + if (response.code !== 0) return response.stderr; + return true; + }, + }); + } + + task.title = `Installing build engine ${color.dim('(this may take a minute)')}`; + + // assemble + const script = path.join(lando.config.userConfRoot, 'scripts', 'install-docker-desktop.sh'); + const command = [script, '--installer', ctx.download.dest, '--user', lando.config.username]; + + // add optional args + if (options.buildEngineAcceptLicense) command.push('--accept-license'); + if (options.debug || options.verbose > 0) command.push('--debug'); + + // run + const result = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + result.download = ctx.download; + + // finish up + task.title = 'Installed build engine to /Applications/Docker.app'; + return result; + } catch (error) { + throw error; + } + }, + }); +}; diff --git a/hooks/lando-setup-build-engine-linux.js b/hooks/lando-setup-build-engine-linux.js new file mode 100644 index 000000000..69332ff91 --- /dev/null +++ b/hooks/lando-setup-build-engine-linux.js @@ -0,0 +1,139 @@ +'use strict'; + +const os = require('os'); +const path = require('path'); + +const {color} = require('listr2'); + +const downloadDockerEngine = (url = 'https://get.docker.com', {debug, task, ctx}) => new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, {debug, test: ['--dry-run']}); + // success + download.on('done', result => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', error => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', progress => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); +}); + + +module.exports = async (lando, options) => { + const debug = require('../utils/debug-shim')(lando.log); + const version = options.buildEngine; + // set out of scope password so we can reuse it + let password = undefined; + + // darwin install task + options.tasks.push({ + title: `Installing build engine`, + id: 'setup-build-engine', + description: `@lando/build-engine (docker-engine)`, + version: `docker-engine ${version}`, + hasRun: async () => { + // start by looking at the engine install status + // @NOTE: is this always defined? + return lando.engine.dockerInstalled; + }, + canRun: async () => { + // throw if we cannot resolve a semantic version to a buildid + if (!version) throw new Error(`Could not resolve ${version} to an installable version!`); + // throw error if not online + if (!await require('is-online')()) throw new Error('Cannot detect connection to internet!'); + // throw if user is not an admin + if (!await require('../utils/is-admin-user')()) { + throw new Error([ + `User "${lando.config.username}" does not have permission to install the build engine!`, + 'Contact your system admin for permission and then rerun setup.', + ].join(os.EOL)); + } + + return true; + }, + task: async (ctx, task) => { + try { + // download the installer + ctx.download = await downloadDockerEngine('https://get.docker.com', {ctx, debug, task}); + + // prompt for password if interactive and we dont have it + if (password === undefined && require('is-interactive')) { + password = await task.prompt({ + type: 'password', + name: 'password', + message: `Enter computer password for ${lando.config.usernam} to add them to docker group`, + validate: async (input, state) => { + const options = {debug, ignoreReturnCode: true, password: input}; + const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); + if (response.code !== 0) return response.stderr; + return true; + }, + }); + } + + task.title = `Installing build engine ${color.dim('(this may take a minute)')}`; + // assemble + const script = path.join(lando.config.userConfRoot, 'scripts', 'install-docker-engine.sh'); + const command = [script, '--installer', ctx.download.dest, '--version', version]; + + // add optional args + if (options.debug || options.verbose > 0) command.push('--debug'); + + // run + const result = await require('../utils/run-elevated')(command, {debug, password: ctx.password}); + result.download = ctx.download; + + // finish up + task.title = 'Installed build engine to /usr/bin/docker'; + return result; + } catch (error) { + throw error; + } + }, + }); + + // group add + options.tasks.push({ + title: `Adding ${lando.config.username} to docker group`, + id: 'setup-build-engine-group', + dependsOn: ['setup-build-engine'], + description: `@lando/build-engine-group (${lando.config.username}@docker)`, + comments: { + 'NOT INSTALLED': `Will add ${lando.config.username} to docker group`, + }, + hasRun: async () => require('../utils/is-group-member')('docker'), + requiresRestart: true, + task: async (ctx, task) => { + // check one last time incase this was added by a dependee or otherwise + if (require('../utils/is-group-member')('docker')) return {code: 0}; + + // prompt for password if interactive and we dont have it + if (password === undefined && require('is-interactive')) { + password = await task.prompt({ + type: 'password', + name: 'password', + message: `Enter computer password for ${lando.config.usernam} to install build engine`, + validate: async (input, state) => { + const options = {debug, ignoreReturnCode: true, password: input}; + const response = await require('../utils/run-elevated')(['echo', 'hello there'], options); + if (response.code !== 0) return response.stderr; + return true; + }, + }); + } + + try { + const command = ['usermod', '-aG', 'docker', lando.config.username]; + const response = await require('../utils/run-elevated')(command, {debug}); + task.title = `Added ${lando.config.username} to docker group`; + return response; + } catch (error) { + throw error; + } + }, + }); +}; diff --git a/hooks/lando-setup-build-engine-win32.js b/hooks/lando-setup-build-engine-win32.js new file mode 100644 index 000000000..47ed27961 --- /dev/null +++ b/hooks/lando-setup-build-engine-win32.js @@ -0,0 +1,169 @@ +'use strict'; + +const os = require('os'); +const path = require('path'); +const semver = require('semver'); + +const {color} = require('listr2'); +const {nanoid} = require('nanoid'); + +const buildIds = { + '4.25.2': '129061', + '4.25.1': '128006', + '4.25.0': '126437', +}; + +/* + * Helper to get build engine id + */ +const getId = version => { + // if version is an integer then assume its already the id + if (semver.valid(version) === null && Number.isInteger(parseInt(version))) return version; + // otherwise return that corresponding build-id + return buildIds[version]; +}; + +const getVersion = version => { + // if version is not an integer then assume its already the version + if (semver.valid(version) !== null) return version; + // otherwise return the version that corresponds to the build id + return Object.keys(buildIds).find(key => buildIds[key] === version); +}; + +/* + * Helper to get docker compose v2 download url + */ +const getEngineDownloadUrl = (id = '126437') => { + const arch = process.arch === 'arm64' ? 'arm64' : 'amd64'; + return `https://desktop.docker.com/win/main/${arch}/${id}/Docker%20Desktop%20Installer.exe`; +}; + +/* + * wrapper for docker-desktop install + */ +const downloadDockerDesktop = (url, {debug, task, ctx}) => new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, { + debug, + dest: path.join(os.tmpdir(), `${nanoid()}.exe`), + }); + + // success + download.on('done', result => { + task.title = `Downloaded build engine`; + resolve(result); + }); + // handle errors + download.on('error', error => { + ctx.errors.push(error); + reject(error); + }); + // update title to reflect download progress + download.on('progress', progress => { + task.title = `Downloading build engine ${color.dim(`[${progress.percentage}%]`)}`; + }); +}); + +module.exports = async (lando, options) => { + const debug = require('../utils/debug-shim')(lando.log); + debug.enabled = lando.debuggy; + + // get stuff from config/opts + const build = getId(options.buildEngine); + const version = getVersion(options.buildEngine); + // cosmetics + const buildEngine = process.platform === 'linux' ? 'docker-engine' : 'docker-desktop'; + const install = version ? `v${version}` : `build ${build}`; + + // win32 install docker desktop task + options.tasks.push({ + title: `Downloading build engine`, + id: 'setup-build-engine', + description: `@lando/build-engine (${buildEngine})`, + version: `${buildEngine} ${install}`, + hasRun: async () => { + // start by looking at the engine install status + // @NOTE: is this always defined? + if (lando.engine.dockerInstalled === false) return false; + + // if we get here let's make sure the engine is on + try { + await lando.engine.daemon.up(); + const BuildEngine = require('../components/docker-engine'); + const bengine = new BuildEngine(lando.config.buildEngine, {debug}); + await bengine.info(); + return true; + } catch (error) { + lando.log.debug('docker install task has not run %j', error); + return false; + } + }, + canRun: async () => { + // throw if we cannot resolve a semantic version to a buildid + if (!build) throw new Error(`Could not resolve ${install} to an installable version!`); + // throw error if not online + if (!await require('is-online')()) throw new Error('Cannot detect connection to internet!'); + // @TODO: check for wsl2? + return true; + }, + requiresRestart: async () => { + // if wsl is not installed then this requires a restart + try { + await require('../utils/run-command')('wsl', ['--status'], {debug}); + return false; + } catch (error) { + lando.log.debug('wsl2 not installed, restart is now required!'); + return true; + } + }, + task: async (ctx, task) => { + try { + // download the installer + ctx.download = await downloadDockerDesktop(getEngineDownloadUrl(build), {ctx, debug, task}); + // script + const script = [path.join(lando.config.userConfRoot, 'scripts', 'install-docker-desktop.ps1')]; + // args + const args = ['-installer', ctx.download.dest]; + if (options.buildEngineAcceptLicense) args.push('-acceptlicense'); + if (options.debug || options.verbose > 0) args.push('-debug'); + + // run install command + task.title = `Installing build engine ${color.dim('(this may take a minute)')}`; + const result = await require('../utils/run-powershell-script')(script, args, {debug}); + result.download = ctx.download; + + // finish up + const location = process.env.ProgramW6432 ?? process.env.ProgramFiles; + task.title = `Installed build engine to ${location}/Docker/Docker!`; + return result; + } catch (error) { + throw error; + } + }, + }); + + // add docker group add task + options.tasks.push({ + title: `Adding ${lando.config.username} to docker-users group`, + id: 'setup-build-engine-group', + dependsOn: ['setup-build-engine'], + description: `@lando/build-engine-group (${lando.config.username}@docker-users)`, + comments: { + 'NOT INSTALLED': `Will add ${lando.config.username} to docker-users group`, + }, + hasRun: async () => require('../utils/is-group-member')('docker-users'), + task: async (ctx, task) => { + // check one last time incase this was added by a dependee or otherwise + if (require('../utils/is-group-member')('docker-users')) return {code: 0}; + + try { + const command = ['net', 'localgroup', 'docker-users', lando.config.username, '/ADD']; + const response = await require('../utils/run-elevated')(command, {debug}); + task.title = `Added ${lando.config.username} to docker-users`; + return response; + } catch (error) { + throw error; + } + }, + }); +}; + diff --git a/hooks/lando-setup-common-plugins.js b/hooks/lando-setup-common-plugins.js new file mode 100644 index 000000000..d6d18f5f8 --- /dev/null +++ b/hooks/lando-setup-common-plugins.js @@ -0,0 +1,11 @@ +'use strict'; + +const merge = require('lodash/merge'); + +module.exports = async (lando, options) => { + // if truthy then skip + if (options.skipCommonPlugins || options.skipCommonPlugins === 'true' || options.skipCommonPlugins === '1') return; + // otherwise proceed + lando.log.debug('rebased install plugins %o on common ones %o', options.plugins, lando.config.setup.commonPlugins); + options.plugins = merge({}, lando.config.setup.commonPlugins, options.plugins); +}; diff --git a/hooks/lando-setup-orchestrator.js b/hooks/lando-setup-orchestrator.js index 9cf550e27..406b8f30a 100644 --- a/hooks/lando-setup-orchestrator.js +++ b/hooks/lando-setup-orchestrator.js @@ -1,13 +1,8 @@ 'use strict'; -const _ = require('lodash'); -const axios = require('axios'); const fs = require('fs'); -const os = require('os'); const path = require('path'); -const {nanoid} = require('nanoid'); - /* * Helper to get docker compose v2 download url */ @@ -45,83 +40,46 @@ const getComposeDownloadDest = (base, version = '2.21.0') => { } }; -module.exports = async lando => { - // get stuff from config - const {orchestratorBin, orchestratorVersion, userConfRoot} = lando.config; - const dest = getComposeDownloadDest(path.join(userConfRoot, 'bin'), orchestratorVersion); - // if we dont have a orchestratorBin or havent downloaded orchestratorVersion yet - if (!!!orchestratorBin && typeof orchestratorVersion === 'string' && !fs.existsSync(dest)) { - lando.log.debug('could not detect docker-compose v%s!', orchestratorVersion); - let tmpDest = path.join(os.tmpdir(), nanoid()); - tmpDest = process.platform === 'win32' ? `${tmpDest}.exe` : tmpDest; - // download docker-compose - return axios({method: 'get', url: getComposeDownloadUrl(orchestratorVersion), responseType: 'stream'}) - // stream it into a file and reset the config - .then(response => { - lando.log.debug('downloading %s to %s...', getComposeDownloadUrl(orchestratorVersion), dest); - const filesize = _.get(response, 'headers.content-length', 60000000); - const writer = fs.createWriteStream(tmpDest); - const v = orchestratorVersion; - let counter = 0; - response.data.pipe(writer); - response.data.on('data', () => { - // only update a reasonanle amount of bytes - if (writer.bytesWritten / 2500000 > counter) { - const completion = Math.round((writer.bytesWritten / filesize) * 100); - if (process.stdout.isTTY) { - process.stdout.write(`Could not detect docker-compose v${v}! Downloading it... (${completion}%)`); - process.stdout.cursorTo(0); - } else { - lando.log.debug(`downloading %s to %s... (%s%)`, getComposeDownloadUrl(v), dest, completion); - } - counter++; - } - }); +module.exports = async (lando, options) => { + const debug = require('../utils/debug-shim')(lando.log); + const {color} = require('listr2'); - // wait for the stream to finish - return new Promise((resolve, reject) => { - let error = null; - writer.on('error', err => { - error = err; - writer.close(); - reject(err); - }); - writer.on('close', () => { - if (!error) resolve(true); - }); - }); - }) - // download success, trust but verify - .then(async () => { - const {spawnSync} = require('child_process'); - require('../utils/make-executable')([path.basename(tmpDest)], path.dirname(tmpDest)); - // see if the thing we downloaded is good - const {status, stdout, stderr} = spawnSync(tmpDest, ['--version']); - if (status === 0) { - lando.log.debug('%s returned %s', tmpDest, _.trim(stdout.toString())); - fs.copyFileSync(tmpDest, dest); - lando.log.debug('docker-compose v%s downloaded to %s', orchestratorVersion, dest); - // something aint right bob - } else { - lando.log.debug('verify docker-compose v%s failed, error: ', orchestratorVersion, _.trim(stderr.toString())); - } - }) + // get stuff from config/opts + const {orchestratorBin, userConfRoot} = lando.config; + const {orchestrator} = options; + const dest = getComposeDownloadDest(path.join(userConfRoot, 'bin'), orchestrator); + const url = getComposeDownloadUrl(orchestrator); - // if download fails for whatever reason then log it and indicate - .catch(error => { - lando.log.debug('could not download docker-compose v%s: %s', orchestratorVersion, error.message); - lando.log.silly('%j', error); - }) + options.tasks.push({ + title: `Downloading orchestrator`, + id: 'setup-orchestrator', + description: '@lando/orchestrator (docker-compose)', + version: `docker-compose v${orchestrator}`, + hasRun: async () => { + return !!orchestratorBin && typeof orchestrator === 'string' && fs.existsSync(dest); + }, + canRun: async () => { + const online = await require('is-online')(); + // throw error if not online + if (!online) throw new Error('Cannot detect connection to internet!'); - // do a final check to log our sitaution - .finally(() => { - if (fs.existsSync(dest)) { - lando.log.debug('using docker-compose %s located at %s', orchestratorVersion, dest); - } else { - lando.log.debug( - 'docker-compose setup failed! will attempt to use a system-installed version of docker-compose.', - ); - } - }); - } + return true; + }, + task: async (ctx, task) => new Promise((resolve, reject) => { + const download = require('../utils/download-x')(url, {debug, dest, test: ['--version']}); + // success + download.on('done', data => { + task.title = `Installed orchestrator to ${dest}`; + resolve(data); + }); + // handle errors + download.on('error', error => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', progress => { + task.title = `Downloading orchestrator ${color.dim(`[${progress.percentage}%]`)}`; + }); + }), + }); }; diff --git a/index.js b/index.js index aea9b4ac1..036946109 100644 --- a/index.js +++ b/index.js @@ -55,16 +55,41 @@ module.exports = async lando => { // Ensure some dirs exist before we start _.forEach([binDir, caDir, sshDir], dir => fs.mkdirSync(dir, {recursive: true})); - // make sure Lando Specification 337 is available to all - lando.events.on('post-bootstrap-app', async () => { - lando.factory.registry.unshift({api: 4, name: 'l337', builder: require('./components/l337-v4')}); + // Ensure we munge plugin stuff together appropriately + lando.events.once('pre-install-plugins', async options => await require('./hooks/lando-setup-common-plugins')(lando, options)); // eslint-disable-line max-len + + // Ensure we setup docker-compose if needed + lando.events.once('pre-setup', async options => await require('./hooks/lando-setup-orchestrator')(lando, options)); // eslint-disable-line max-len + + // Ensure we setup docker if needed + lando.events.once('pre-setup', async options => { + switch (process.platform) { + case 'darwin': + return await require('./hooks/lando-setup-build-engine-darwin')(lando, options); + case 'linux': + return await require('./hooks/lando-setup-build-engine-linux')(lando, options); + case 'win32': + return await require('./hooks/lando-setup-build-engine-win32')(lando, options); + } }); - // Ensure we download docker-compose if needed - lando.events.on('pre-bootstrap-engine', 1, async () => await require('./hooks/lando-setup-orchestrator')(lando)); + // make sure Lando Specification 337 is available to all + lando.events.on('post-bootstrap-app', async () => await require('./hooks/lando-add-l337-spec')(lando)); + + // flush update cache if it needs to be + lando.events.on('ready', async () => await require('./hooks/lando-flush-updates-cache')(lando)); + + // this is a gross hack we need to do to reset the engine because the lando 3 runtime had no idea + lando.events.on('almost-ready', 1, async () => await require('./hooks/lando-reset-orchestrator')(lando)); + + // run engine compat checks + lando.events.on('almost-ready', 2, async () => await require('./hooks/lando-get-compat')(lando)); + + // throw error if engine/orchestrator is not available + lando.events.on('engine-autostart', 1, async () => await require('./hooks/lando-dep-check')(lando)); - // at this point we should be able to set orchestratorBin if it hasnt been set already - lando.events.on('pre-bootstrap-engine', 2, async () => await require('./hooks/lando-ensure-orchestrator')(lando)); + // autostart docker if we need to + lando.events.on('engine-autostart', 2, async () => await require('./hooks/lando-autostart-engine')(lando)); // Make sure we have a host-exposed root ca if we don't already // NOTE: we don't run this on the caProject otherwise infinite loop happens! diff --git a/lib/app.js b/lib/app.js index fe183943a..6af6624cf 100644 --- a/lib/app.js +++ b/lib/app.js @@ -158,10 +158,10 @@ module.exports = class App { */ this.tasks = []; - // A place to collect warnings and errors so we can - // do stuff with them later - this.warnings = []; this.id = hasher(`${this.name}-${this.root}`); + this.messages = []; + // @DEPRECATED in favor of this.messages + this.warnings = []; }; /* @@ -172,9 +172,25 @@ module.exports = class App { else this.composeData.push(data); } + /* * @TODO, add and log a warning */ + addMessage(message, error = null) { + // Do special handling if this is a warning or error + if (error && ['warning', 'warn', 'error'].includes(message.type)) this.addWarning(message, error); + + else { + // otherwise normal stuff + this.log.verbose(message.title); + // Finish by pushing the warning + this.messages.push(_.merge({}, message, {severity: message.type || 'tip'})); + } + } + + /* + * @DEPRECATED, use addMessage + */ addWarning(message, error = null) { // Do special handling if this is an error if (error) { @@ -188,7 +204,7 @@ module.exports = class App { } // Finish by pushing the warning - this.warnings.push(_.merge({}, message, {severity: (error) ? 'error' : 'warning'})); + this.messages.push(_.merge({}, message, {severity: (error) ? 'error' : 'warning'})); } /** diff --git a/lib/cache.js b/lib/cache.js index 95ab9dd1a..826bbbcdb 100644 --- a/lib/cache.js +++ b/lib/cache.js @@ -5,7 +5,6 @@ const _ = require('lodash'); const fs = require('fs'); const jsonfile = require('jsonfile'); const Log = require('./logger'); -const mkdirp = require('mkdirp'); const NodeCache = require('node-cache'); const os = require('os'); const path = require('path'); @@ -21,7 +20,7 @@ class Cache extends NodeCache { this.log = log; this.cacheDir = cacheDir; // Ensure the cache dir exists - mkdirp.sync(this.cacheDir); + fs.mkdirSync(this.cacheDir, {recursive: true}); }; /** diff --git a/lib/config.js b/lib/config.js index da6c55fc1..3b2ca49c6 100644 --- a/lib/config.js +++ b/lib/config.js @@ -61,7 +61,7 @@ exports.loadEnvPluginConfig = (...args) => require('../utils/load-env-plugin-con * // Take an object and write a docker compose file * const newObject = _.mergeWith(a, b, lando.utils.merger); */ -exports.merge = (...args) => require('../utils/merge')(...args); +exports.merge = (...args) => require('../utils/legacy-merge')(...args); /** * Strips process.env of all envvars with PREFIX and returns process.env diff --git a/lib/daemon.js b/lib/daemon.js index 6ba4294df..426c41ad3 100644 --- a/lib/daemon.js +++ b/lib/daemon.js @@ -21,7 +21,7 @@ const buildDockerCmd = cmd => { case 'darwin': return ['open', macOSBase]; case 'linux': - return ['sudo', 'service', 'docker'].concat(cmd); + return ['systemctl', cmd, 'docker.service']; case 'win32': const base = process.env.ProgramW6432 || process.env.ProgramFiles; const dockerBin = base + '\\Docker\\Docker\\Docker Desktop.exe'; @@ -56,6 +56,7 @@ module.exports = class LandoDaemon { this.docker = docker; this.events = events; this.log = log; + this.isRunning = false; }; /* @@ -66,7 +67,7 @@ module.exports = class LandoDaemon { * @fires post_engine_up * @return {Promise} A Promise. */ - up() { + up(retry = true, password) { /* * Not officially documented event that allows you to do some things before * the docker engine is booted up. @@ -78,24 +79,42 @@ module.exports = class LandoDaemon { // Automatically return true if we are in the GUI and on linux because // this requires SUDO and because the daemon should always be running on nix if (this.context !== 'node' && process.platform === 'linux') return Promise.resolve(true); - // Turn it on if we can - return this.isUp().then(isUp => { - if (!isUp) { - const retryOpts = {max: 25, backoff: 1000}; - return shell.sh(buildDockerCmd('start')) - .catch(err => { - throw Error('Could not automatically start the Docker Daemon. Please manually start it to continue.'); - }) - // Likely need to retry until start command completes all good - .retry(() => this.isUp().then(isUp => (!isUp) ? Promise.reject() : Promise.resolve()), retryOpts) - // Fail if retry is no good - .catch(err => { - throw Error('Could not automatically start the Docker Daemon. Please manually start it to continue.'); - }) - // Engine is good! - .then(() => this.log.info('engine activated.')); - } - }); + + // special handling for linux + if (this.context === 'node' && process.platform === 'linux') { + return this.isUp().then(async isUp => { + if (!isUp) { + const debug = require('../utils/debug-shim')(this.log); + try { + await require('../utils/run-elevated')(buildDockerCmd('start'), {debug, password}); + return Promise.resolve(true); + } catch (error) { + this.log.debug('%j', error); + return Promise.reject(error); + } + } + }); + + // otherwise fallback to legacy stuff? + } else { + return this.isUp().then(async isUp => { + if (!isUp) { + const retryOpts = retry ? {max: 25, backoff: 1000} : {max: 0}; + return shell.sh(buildDockerCmd('start')) + .catch(err => { + throw Error('Could not automatically start the Docker Daemon. Please manually start it to continue.'); + }) + // Likely need to retry until start command completes all good + .retry(() => this.isUp().then(isUp => (!isUp) ? Promise.reject() : Promise.resolve()), retryOpts) + // Fail if retry is no good + .catch(err => { + throw Error('Could not automatically start the Docker Daemon. Please manually start it to continue.'); + }) + // Engine is good! + .then(() => this.log.info('engine activated.')); + } + }); + } }) /* @@ -163,10 +182,11 @@ module.exports = class LandoDaemon { return shell.sh([`"${docker}"`, 'info']).then(() => { log.debug('engine is up.'); cache.set('engineup', true, {ttl: 5}); + this.isRunning = true; return Promise.resolve(true); }) .catch(error => { - log.debug('engine is down with error', error); + log.debug('engine is down with error %j', error); return Promise.resolve(false); }); }; @@ -185,7 +205,8 @@ module.exports = class LandoDaemon { const cmd = [`"${this.docker}"`, 'version', '--format', '{{.Server.Version}}']; return shell.sh(cmd).catch(() => '18.0.0').then(version => ({...versions, engine: version})); case 'win32': - const componentsVersionFile = path.resolve(env.getDockerBinPath(), '..', 'componentsVersion.json'); + const dockerBinPath = require('../utils/get-docker-bin-path')(); + const componentsVersionFile = path.resolve(dockerBinPath, '..', 'componentsVersion.json'); // If we found one, use it but allow for a fallback in case these keys change if (componentsVersionFile) { // There are two different keys that map to the docker desktip version depending on the version diff --git a/lib/docker.js b/lib/docker.js index 59818b215..125594068 100644 --- a/lib/docker.js +++ b/lib/docker.js @@ -95,13 +95,25 @@ module.exports = class Landerode extends Dockerode { else if (options.app) return _.filter(containers, c => c.app === require('../utils/docker-composify')(options.app)); // eslint-disable-line max-len return containers; }) - // And finally filter by everything else + // Then finally filter by everything else .then(containers => { if (!_.isEmpty(options.filter)) { return _.filter(containers, _.fromPairs(_.map(options.filter, filter => filter.split('=')))); } else { return containers; } + }) + // if any container has been up for only a brief amount of time then + .then(containers => { + if (_.find(containers, container => container.status === 'Up Less than a second')) { + return this.list(options, separator); + }; + return containers; + }) + // add a "running" status to the thing + .map(container => { + container.running = container && typeof container.status === 'string' && !container.status.includes('Exited'); + return container; }); }; diff --git a/lib/engine.js b/lib/engine.js index 4b63f2c40..cce9b6310 100644 --- a/lib/engine.js +++ b/lib/engine.js @@ -197,8 +197,9 @@ module.exports = class Engine { // do the version comparison return _(versions).map((version, name) => ({ name, - link: supportedVersions[name].link[process.platform], + link: supportedVersions[name].link, satisfied: semver.satisfies(semver.clean(version), supportedVersions[name].satisfies), + wants: supportedVersions[name].satisfies, dockerVersion: true, version: semver.clean(version), })) diff --git a/lib/events.js b/lib/events.js index 4d4556297..bdcee0474 100644 --- a/lib/events.js +++ b/lib/events.js @@ -123,6 +123,11 @@ class AsyncEvents extends EventEmitter { // Return true if event had listeners just like the original emit function. .return(!!fns.length); }; + + removeAllListeners() { + this._listeners = []; + super.removeAllListeners(); + }; }; /* diff --git a/lib/lando.js b/lib/lando.js index 7b3e221fa..6eff6f6d6 100644 --- a/lib/lando.js +++ b/lib/lando.js @@ -16,6 +16,16 @@ const BOOTSTRAP_LEVELS = { // Default version information const DEFAULT_VERSIONS = {networking: 1}; +// Helper to resolve setup tasks for uniqueness and these things +const resolveSetupTasks = (tasks = []) => { + tasks = _.uniqBy(tasks, task => { + if (task.multiple === true) return Math.random(); + else return task.id; + }); + + return tasks; +}; + // Helper to get init config const getLegacyInitConfig = dirs => _(dirs) .filter(dir => fs.existsSync(dir)) @@ -78,6 +88,12 @@ const bootstrapConfig = async lando => { // log if (!_.isEmpty(removed)) lando.log.debug('removed duplicate plugin entries %o', removed); + + // add the plugins and install dir + const dir = lando.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + lando.updates.plugins = plugins; + lando.updates.dir = dir ? dir.dir : undefined; + // he who remains return plugins; }; @@ -232,6 +248,8 @@ const bootstrapRouter = async (level, lando) => { */ module.exports = class Lando { constructor(options = {}) { + const getPluginConfig = require('../utils/get-plugin-config'); + this.BOOTSTRAP_LEVELS = BOOTSTRAP_LEVELS; this.config = require('../utils/build-config')(options); this.Promise = require('./promise'); @@ -245,8 +263,21 @@ module.exports = class Lando { this.metrics = require('../utils/setup-metrics')(this.log, this.config); this.error = new ErrorHandler(this.log, this.metrics), this.events = new AsyncEvents(this.log); - this.updates = new UpdateManager(); this.user = require('./user'); + + // updater is more complex now + this.updates = new UpdateManager({ + channel: this.config.channel, + cli: _.get(this, 'config.cli'), + config: getPluginConfig(this.config.pluginConfigFile, this.config.pluginConfig), + debug: require('../utils/debug-shim')(this.log), + }); + + // helper just to determine whether we are "debuggy" or not + this.debuggy = this.config.logLevelConsole > 2 + || this.config.logLevelConsole === 'verbose' + || this.config.logLevelConsole === 'debug' + || this.config.logLevelConsole === 'silly'; } /** @@ -303,6 +334,7 @@ module.exports = class Lando { return this.Promise.each(bootstraps, level => { this.log.verbose('%s bootstrap beginning...', level); this._bootstrap = level; + this._bootstrapLevel = this.BOOTSTRAP_LEVELS[level]; /** * Event that runs before we bootstrap config. @@ -411,6 +443,8 @@ module.exports = class Lando { }) .then(() => this.log.verbose('bootstrap completed.')) .then(() => this.events.emit(`post-bootstrap`, this)) + .then(() => this.events.emit(`almost-ready`, this)) + .then(() => this.events.emit(`ready`, this)) .then(() => this); } @@ -429,7 +463,7 @@ module.exports = class Lando { */ getApp(startFrom = process.cwd(), warn = true) { const getLandoFiles = require('../utils/get-lando-files'); - const merger = require('../utils/merge'); + const lmerge = require('../utils/legacy-merge'); const Yaml = require('./yaml'); const yaml = new Yaml(this.log); // Grab lando files for this app @@ -444,7 +478,7 @@ module.exports = class Lando { } // Load the config and augment so we can get an App - const config = merger({}, ..._.map(landoFiles, file => yaml.load(file))); + const config = lmerge({}, ..._.map(landoFiles, file => yaml.load(file))); this.log.info('loading app %s from config files', config.name, landoFiles); this.log.debug('app %s has config', config.name, config); // Return us some app! @@ -452,6 +486,82 @@ module.exports = class Lando { return new App(config.name, _.merge({}, config, {files: landoFiles}), this); } + async getInstallPluginsStatus(options = this.config.setup) { + const getPluginConfig = require('../utils/get-plugin-config'); + const Plugin = require('../components/plugin'); + + // reset Plugin static defaults for v3 purposes + Plugin.config = getPluginConfig(this.config.pluginConfigFile, this.config.pluginConfig); + Plugin.debug = require('../utils/debug-shim')(this.log); + + // attempt to compute the destination to install the plugin + const {dir} = this.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + + // event that lets plugins modify the status check + await this.events.emit('pre-install-plugins', options); + + // prep tasks + const plugins = require('../utils/parse-to-plugin-strings')(options.plugins); + const results = await Promise.all(plugins.map(async plugin => { + const {description, canInstall, isInstalled} = require('../utils/get-plugin-add-task')(plugin, {dir, Plugin}); + // lets start optimistically + const status = {description, state: 'INSTALLED', version: plugin}; + // and slowly spiral down + if (await isInstalled() === false) { + try { + await canInstall(); + status.state = 'NOT INSTALLED'; + } catch (error) { + status.state = 'CANNOT INSTALL'; + status.comment = error.message; + } + } + + return status; + })); + + // set plugins much with the results + await this.events.emit('post-install-plugins', results); + + return results; + } + + async installPlugins(options = this.config.setup) { + const getPluginConfig = require('../utils/get-plugin-config'); + const Plugin = require('../components/plugin'); + + // reset Plugin static defaults for v3 purposes + Plugin.config = getPluginConfig(this.config.pluginConfigFile, this.config.pluginConfig); + Plugin.debug = require('../utils/debug-shim')(this.log); + + // attempt to compute the destination to install the plugin + const {dir} = this.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + + // event that lets plugins modify the install + await this.events.emit('pre-install-plugins', options); + + // prep tasks + const tasks = require('../utils/parse-to-plugin-strings')(options.plugins) + .map(plugin => require('../utils/get-plugin-add-task')(plugin, {dir, Plugin})) + .map(task => require('../utils/parse-setup-task')(task)); + + // try to fetch the plugins + const {data, errors, results, total} = await this.runTasks(tasks, { + renderer: 'lando', + rendererOptions: { + level: 0, + }, + }); + + // event that lets plugins modify the output + await this.events.emit('post-install-plugins', {data, errors, results, total}); + + this.log.debug('installed %s of %s plugins with %s errors', results.length, total, errors.length); + + // return + return {data, errors, results, total}; + } + // run tasks async runTasks(tasks, options = {}) { // some defaults @@ -474,4 +584,108 @@ module.exports = class Lando { return await require('../utils/run-tasks')(tasks, _.merge(defaults, options)); } + + // this lets us reload plugins mid-process as though we were bootstrapping lando freshly + async reloadPlugins() { + // if we dont do this we have at least double added setup tasks/plugins + this.events.removeAllListeners(); + // reload plugins + return await bootstrapConfig(this); + } + + // setup + async setup(options = this.config.setup) { + // merge needed defaults into options + options = _.merge({tasks: [], plugins: {}}, options); + + // collect our things + const data = {errors: [], results: [], restart: false, total: 0}; + + // if we should add plugins then install them + if (options.installPlugins) { + const {errors, results, total} = await this.installPlugins(options); + data.errors = [...data.errors, ...errors]; + data.results = [...data.results, ...results]; + data.total = data.total + total; + + // refresh the plugin cache + await this.reloadPlugins(); + } + + // pre setup event to mutate the setup tasks + await this.events.emit('pre-setup', options); + + // if we should run setup tasks + if (options.installTasks) { + // wrap the tasks + options.tasks = resolveSetupTasks(options.tasks.map(task => require('../utils/parse-setup-task')(task))); + // and then run them + const {errors, results, total} = await this.runTasks(options.tasks, + { + concurrent: true, + exitOnError: false, + renderer: 'lando', + rendererOptions: { + level: 0, + }, + }, + ); + + data.errors = [...data.errors, ...errors]; + data.results = [...data.results, ...results]; + data.total = data.total + total; + this.log.debug('ran %s of %s tasks with %s errors', results.length, results.length, errors.length); + } + + // assess restart situation + // @NOTE: we do not allow restarts on CI or non-interactive environments + data.restart = require('is-interactive') + && !_.has(process, 'env.CI') + && data.results.length > 0 + && options.tasks + .filter(task => task.enabled) + .some(task => task.requiresRestart === true); + + // post setup event + await this.events.emit('post-setup', data); + + // return the results + return data; + } + + async getSetupStatus(options = this.config.setup) { + // pre setup event to mutate the setup tasks + await this.events.emit('pre-setup', options); + + const results = await Promise.all(options.tasks.map(async task => { + // break it up + const {canRun, comments, description, hasRun, requiresRestart, version} = require('../utils/parse-setup-task')(task); // eslint-disable-line max-len + // lets start optimistically + const status = {version, description, state: 'INSTALLED'}; + // and slowly spiral down + // @TODO: woiuld be great if hasRun could also return a "comment" eg + // "installed but slightly above desired range" + if (await hasRun() === false) { + try { + await canRun(); + status.state = 'NOT INSTALLED'; + if (comments['NOT INSTALLED']) status.comment = comments['NOT INSTALLED']; + } catch (error) { + status.state = 'CANNOT INSTALL'; + status.comment = error.message; + } + } + + // if requires restart is a function then run it to reset teh task + if (typeof requiresRestart === 'function') status.restart = await requiresRestart({}, task); + else status.restart = requiresRestart; + + return status; + })); + + // pre setup event to mutate the setup tasks + await this.events.emit('post-setup', results); + + return results; + } }; diff --git a/lib/logger.js b/lib/logger.js index 4d403b0b3..48c8ca876 100644 --- a/lib/logger.js +++ b/lib/logger.js @@ -3,7 +3,7 @@ // Modules const _ = require('lodash'); const dayjs = require('dayjs'); -const mkdirp = require('mkdirp'); +const fs = require('fs'); const path = require('path'); const serialize = require('winston/lib/winston/common').serialize; const util = require('util'); @@ -175,13 +175,14 @@ module.exports = class Log extends winston.Logger { label: logName, level: logLevelConsole, colorize: true, + stderrLevels: ['error', 'info', 'verbose', 'debug', 'silly'], }), ]; // If we have a log path then let's add in some file transports if (logDir) { // Ensure the log dir actually exists - mkdirp.sync(logDir); + fs.mkdirSync(logDir, {recursive: true}); // Add in our generic and error logs transports.push(new winston.transports.File({ name: 'error-file', diff --git a/lib/router.js b/lib/router.js index 30e879791..e8337725e 100644 --- a/lib/router.js +++ b/lib/router.js @@ -23,7 +23,9 @@ const stripRun = datum => { const retryEach = (data, run) => Promise.each(normalizer(data), datum => run(datum)); // Helper to run engine event commands -exports.eventWrapper = (name, daemon, events, data, run) => daemon.up() +exports.eventWrapper = (name, daemon, events, data, run) => + events.emit('engine-autostart', data) + .then(() => daemon.up()) .then(() => events.emit(`pre-engine-${name}`, data)) .then(() => run(data)) .tap(() => events.emit(`post-engine-${name}`, data)); diff --git a/lib/updates.js b/lib/updates.js index 0f4d7cf12..cae2f69e6 100644 --- a/lib/updates.js +++ b/lib/updates.js @@ -1,44 +1,258 @@ 'use strict'; -// Modules -const _ = require('lodash'); -const GitHubApi = require('github'); -const Promise = require('./promise'); +const fs = require('fs'); +const get = require('lodash/get'); +const os = require('os'); +const path = require('path'); const semver = require('semver'); +const uniqBy = require('lodash/uniqBy'); + +const {color} = require('listr2'); +const {Octokit} = require('@octokit/rest'); + +const getOS = () => { + switch (process.platform) { + case 'darwin': + return 'macos'; + case 'win32': + return 'win'; + default: + return process.platform; + } +}; module.exports = class UpdateManager { - /* - * Constructor - */ - constructor() { - this.githubApi = new GitHubApi({Promise: Promise}); + constructor({ + config = {}, + cli, + channel = 'stable', + debug = require('debug')('@lando/updates'), + dir = os.tmpdir(), + plugins = [], + } = {}) { + // set things + this._plugins = plugins; + this.channel = channel; + this.config = config; + this.dir = dir; + this.debug = debug; + this.Plugin = require('../components/plugin'); + + // reset Plugin static defaults for v3 purposes + this.Plugin.channel = channel; + this.Plugin.config = config; + this.Plugin.debug = debug; + + // special handling for CLI + // @NOTE: we pretend its a plugin just to get some object consistency between our things + if (cli && cli.plugin) { + this._cli = new this.Plugin(cli.plugin); + this._cli.isCli = true; + this._cli.isUpdateable = cli.packaged && !cli.source; + this._cli.installPath = cli.installPath; + this.internalCore = cli.coreBase; + this.internalCoreVersion = cli.coreBaseVersion; + } + + // some state stuff + this.hasChecked = false; }; - // noinspection JSMethodCanBeStatic - /** - * Compares two versions and determines if an update is available or not - * - * @since 3.0.0 - * @alias lando.updates.updateAvailable - * @param {String} version1 The current version. - * @param {String} version2 The potential update version - * @return {Boolean} Whether an update is available. - * @example - * // Does our current version need to be updated? - * const updateAvailable = lando.updates.updateAvailable('1.0.0', '1.0.1'); + // translate set plugins when they are set + set plugins(plugins) { + this._plugins = plugins.map(plugin => new this.Plugin(plugin.dir)); + // if we are cli corebase then we need to reset core plugin stuff + if (this.internalCore && this.internalCoreVersion) { + this._plugins.forEach(plugin => { + if (plugin.package === '@lando/core') { + plugin.isUpdateable = true; + plugin.version = this.internalCoreVersion; + } + }); + } + } + + get plugins() { + return this._plugins; + } + + /* + * goes through the instantiated plugins and the cli/core-next if applicable + * and returns metadata about their release situatuon */ - updateAvailable(version1, version2) { - return semver.lt(version1, version2); - }; + async check() { + // Start with our basic checks + const checks = this.plugins.map(async plugin => { + try { + await plugin.check4Update(); + return plugin; + } catch { + return plugin; + } + }); + + // push cli check here + if (this._cli && this._cli.isCli) { + checks.push(new Promise(async resolve => { + // summon the katkraken + const octokit = new Octokit({auth: get(process, 'env.GITHUB_TOKEN')}); + // check internet connection + const online = await require('is-online')(); + // throw error if not online + if (!online) throw new Error('Cannot detect connection to internet!'); + + // go for it + try { + const {data, status, url} = await octokit.rest.repos.listReleases({owner: 'lando', repo: 'cli'}); + this.debug('retrieved cli information from %o [%o]', url, status); + + const versions = data + .map(release => ({...release, version: semver.clean(release.tag_name)})) + .filter(release => semver.valid(release.version) !== null) + .filter(release => semver.satisfies(release.version, '>=3.0.0 <4', {loose: true, includePrerelease: true})) + .filter(release => release.draft === false) + .filter(release => this.channel === 'edge' ? true : release.prerelease === false) + .map(release => release.version); + + // get highest version + const hv = semver.rsort(versions)[0]; + + // cli cannot be updated + if (semver.lte(hv, this._cli.version)) { + this.debug(`'@lando/cli' cannot be updated on channel %o (%o <= %o)`, this.channel, hv, this._cli.version); + resolve(this._cli); + + // otherwise update is available + } else { + const arch = ['arm64', 'aarch64'].includes(process.arch) ? 'arm64' : 'x64'; + const os = getOS(); + const ext = process.platform === 'win32' ? '.exe' : ''; + + // @NOTE: should this always work? + const release = data.find(release => release.tag_name === `v${hv}`); + release.version = hv; + release.binary = `lando-${os}-${arch}-v${release.version}${ext}`; + release.channel = release.prerelease ? 'edge' : 'stable'; + // @NOTE: ditto + const asset = release.assets.find(asset => asset.name === release.binary); + // if no asset or url then error + if (!asset || !asset.url) throw new Error('Could not find suitable download url!'); + release.download = asset.browser_download_url; + this._cli.updateAvailable = `@lando/cli@${hv}`; + this._cli.update = release; + this.debug( + `'@lando/cli' can be updated to %o on channel %o (%o > %o)`, + release.download, + this.channel, + hv, + this._cli.version, + ); + resolve(this._cli); + } - // noinspection JSMethodCanBeStatic - /** - * Determines whether we need to fetch updatest or not - * - * @since 3.0.0 - * @alias lando.updates.fetch - * @param {Object} data Cached update data - * @return {Boolean} Whether we need to ping GitHub for new data or not + // error has occured + } catch (error) { + if (error.status) error.message = `${error.message} [${error.status}]`; + if (error.response && error.response.url) error.message = `${error.message} (${error.response.url})`; + this.debug(`'@lando/cli' could not get update info, error: %o`, error.message); + this.debug('%j', error); + this._cli.isUpdateable = false; + this._cli.updateAvailable = false; + this._cli.update = {error}; + resolve(this._cli); + } + })); + } + + // run all checks and return + // @NOTE: will have to detangle cli from this? + this._plugins = await Promise.all(checks); + this.hasChecked = true; + return this._plugins; + } + + // return an array of update tasks we can run + async getUpdateTasks() { + // if we havent checked yet then by all means check + if (!this.hasChecked) await this.check(); + + // otherwise lets assembled our tasks + // start by filtering out any errors/duplicates/updated things + // @NOTE: we also remove @lando/cli because its update task is special + const tasks = uniqBy(this.plugins, plugin => plugin.parent ? plugin.parent.name : plugin.name) + .filter(plugin => plugin.isUpdateable) + .filter(plugin => plugin.updateAvailable !== false) + .filter(plugin => plugin.isCli !== true) + .map(plugin => require('../utils/get-plugin-update-task')(plugin.updateAvailable, { + dir: this.dir, + Plugin: this.Plugin, + })) + .map(task => require('../utils/parse-setup-task')(task)); + + // push cli check here + if (get(this, '_cli.update.download')) { + tasks.push(require('../utils/parse-setup-task')({ + title: `Updating @lando/cli to v${this._cli.update.version}`, + description: '@lando/cli', + canInstall: async () => { + // check if user can write to install path + try { + fs.accessSync(this._cli.installPath, fs.constants.W_OK); + } catch { + throw new Error(`Lando cannot write to ${this._cli.installPath}!`); + } + + // throw error if not online + if (!await require('is-online')()) throw new Error('Cannot detect connection to internet!'); + + // or true + return true; + }, + task: async (ctx, task) => new Promise((resolve, reject) => { + const url = this._cli.update.download; + const version = this._cli.update.version; + const dest = path.join(this._cli.installPath, `lando-v${version}`); + const sl = process.platform === 'win32' + ? path.join(this._cli.installPath, 'lando.exe') : path.join(this._cli.installPath, 'lando'); + // @TODO: restore test when we cut 3.22? + const download = require('../utils/download-x')(url, {debug: this.debug, dest}); // test: ['version']}); + + // success + download.on('done', data => { + // @NOTE: how does this work on windows? + // remove existing link if it exists + if (fs.existsSync(sl)) { + fs.unlinkSync(sl); + this.debug('removed existing symlink %o', sl); + } + + // set/reset + fs.symlinkSync(dest, sl); + this.debug('symlinked @lando/cli %o to %o', dest, sl); + + // finish + task.title = `Updated @lando/cli to ${version}`; + resolve(data); + }); + // handle errors + download.on('error', error => { + reject(error); + }); + // update title to reflect download progress + download.on('progress', progress => { + task.title = `Downloading @lando/cli@${version} ${color.dim(`[${progress.percentage}%]`)}`; + }); + }), + })); + } + + // return tasks + return tasks; + } + + /* + * DEPRECATED and for backwards compatibility only + * returns the cli version only? */ fetch(data) { // Return true immediately if update is undefined @@ -47,39 +261,36 @@ module.exports = class UpdateManager { return !(data.expires >= Math.floor(Date.now())); }; - /** - * Get latest version info from github - * - * @since 3.0.0 - * @alias lando.updates.refresh - * @param {String} version Lando version to use as a fallback - * @param {Boolean} edge Whether to check for edge releases or not - * @return {Object} Update data + /* + * DEPRECATED and for backwards compatibility only + * returns the cli version only? */ - refresh(version, edge = false) { - // GitHub repo config - const landoRepoConfig = { - owner: 'lando', - repo: 'lando', - page: 1, - per_page: 25, - }; - // Helper to parse data + async refresh(version, edge = false) { + const _ = require('lodash'); const parseData = (latest, version) => ({ version: _.trimStart(_.get(latest, 'tag_name', version), 'v'), url: _.get(latest, 'html_url', ''), expires: Math.floor(Date.now()) + 86400000, }); - // This i promise you - return this.githubApi.repos.getReleases(landoRepoConfig) - // Extract and return the metadata - .then(data => { - // Get the latest non-draft/non-prerelease version + + // summon the katkraken + const octokit = new Octokit({auth: get(process, 'env.GITHUB_TOKEN')}); + + // get latest + try { + const {data} = await octokit.rest.repos.listReleases({owner: 'lando', repo: 'lando'}); const latest = _.find(_.get(data, 'data', []), r => (r.draft === false && r.prerelease === edge)); - // Return the update data return parseData(latest, version); - }) - // Don't let an error here kill things - .catch(() => parseData(null, version)); + } catch { + return parseData(null, version); + } + }; + + /* + * DEPRECATED and for backwards compatibility only + * returns the cli version only? + */ + updateAvailable(version1, version2) { + return semver.lt(version1, version2); }; }; diff --git a/lib/utils.js b/lib/utils.js index d80dda89c..1d8e71e95 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -2,7 +2,7 @@ // Modules const _ = require('lodash'); -const chalk = require('chalk'); +const {color} = require('listr2'); // @NOTE: this file exists for backwards compatibility @@ -14,7 +14,7 @@ const startTable = (app, {legacyScanner = false} = {}) => { name: app.name, location: app.root, services: _(app.info) - .map(info => (info.healthy) ? chalk.green(info.service) : chalk.yellow(info.service)) + .map(info => (info.healthy) ? color.green(info.service) : color.yellow(info.service)) .values() .join(', '), }; @@ -26,7 +26,7 @@ const startTable = (app, {legacyScanner = false} = {}) => { _.forEach(app.info, info => { if (_.has(info, 'urls') && !_.isEmpty(info.urls)) { urls[info.service] = _.filter(app.urls, item => { - item.theme = chalk[item.color](item.url); + item.theme = color[item.color](item.url); return _.includes(info.urls, item.url); }); } diff --git a/lib/warnings.js b/lib/warnings.js deleted file mode 100644 index d04a3ccec..000000000 --- a/lib/warnings.js +++ /dev/null @@ -1,41 +0,0 @@ -'use strict'; - -// Modules -const _ = require('lodash'); - -exports.maxKeyWarning = () => ({ - title: 'You have a lot of keys!', - detail: [ - 'Lando has detected you have a lot of ssh keys.', - 'This may cause "Too many authentication failures" errors.', - 'We recommend you limit your keys. See below for more details:', - ], - url: 'https://docs.lando.dev/config/ssh.html#customizing', -}); - -exports.rebuildWarning = () => ({ - title: 'This app was built on a different version of Lando.', - detail: [ - 'While it may not be necessary, we highly recommend you update the app.', - 'This ensures your app is up to date with your current Lando version.', - 'You can do this with the command below:', - ], - command: 'lando rebuild', -}); - -exports.serviceNotRunningWarning = service => ({ - title: `The service "${service}" is not running!`, - detail: ['This is likely a critical problem and we recommend you run the command below to investigate'], - command: `lando logs -s ${service}`, -}); - -exports.unsupportedVersionWarning = ({name, version, wants, link}) => ({ - title: `Using an unsupported version of DOCKER ${_.upperCase(name)}`, - detail: [ - `You have version ${version} but Lando wants something in the ${wants} range.`, - 'If you have purposefully installed an unsupported version and know what you are doing', - 'you can probably ignore this warning. If not we recommend you use a supported version', - 'as this ensures we can provide the best support and stability.', - ], - url: link, -}); diff --git a/lib/yaml.js b/lib/yaml.js index dbe6db21e..d27addd2e 100644 --- a/lib/yaml.js +++ b/lib/yaml.js @@ -2,7 +2,6 @@ // Modules const fs = require('fs'); -const mkdirp = require('mkdirp'); const Log = require('./logger'); const path = require('path'); const yaml = require('js-yaml'); @@ -45,7 +44,7 @@ module.exports = class Yaml { */ dump(file, data = {}) { // Make sure we have a place to store these files - mkdirp.sync(path.dirname(file)); + fs.mkdirSync(path.dirname(file), {recursive: true}); // Remove any properties that might be bad and dump data = JSON.parse(JSON.stringify(data)); // And dump diff --git a/messages/max-key-tip.js b/messages/max-key-tip.js new file mode 100644 index 000000000..81e7cc615 --- /dev/null +++ b/messages/max-key-tip.js @@ -0,0 +1,13 @@ +'use strict'; + +// checks to see if a setting is disabled +module.exports = ({ + title: 'You have a lot of keys!', + type: 'tip', + detail: [ + 'Lando has detected you have a lot of ssh keys.', + 'This may cause "Too many authentication failures" errors.', + 'We recommend you limit your keys. See below for more details:', + ], + url: 'https://docs.lando.dev/config/ssh.html#customizing', +}); diff --git a/messages/rebuild-tip.js b/messages/rebuild-tip.js new file mode 100644 index 000000000..0a7aa4e05 --- /dev/null +++ b/messages/rebuild-tip.js @@ -0,0 +1,12 @@ +'use strict'; + +// checks to see if a setting is disabled +module.exports = ({ + title: 'This app was built on a different version of Lando.', + detail: [ + 'While it may not be necessary, we highly recommend you update the app.', + 'This ensures your app is up to date with your current Lando version.', + 'You can do this with the command below:', + ], + command: 'lando rebuild', +}); diff --git a/messages/service-not-running-error.js b/messages/service-not-running-error.js new file mode 100644 index 000000000..15dfb24c2 --- /dev/null +++ b/messages/service-not-running-error.js @@ -0,0 +1,9 @@ +'use strict'; + +// checks to see if a setting is disabled +module.exports = service => ({ + title: `The service "${service}" is not running!`, + type: 'error', + detail: ['This is likely a critical problem and we recommend you run the command below to investigate'], + command: `lando logs -s ${service}`, +}); diff --git a/messages/unsupported-version-info.js b/messages/unsupported-version-info.js new file mode 100644 index 000000000..329f22362 --- /dev/null +++ b/messages/unsupported-version-info.js @@ -0,0 +1,14 @@ +'use strict'; + +// checks to see if a setting is disabled +module.exports = ({name, version, wants, link}) => ({ + type: 'info', + title: `Using an unsupported version of DOCKER ${name.toUpperCase()}`, + detail: [ + `You have version ${version} but Lando wants something in the ${wants} range.`, + 'If you have purposefully installed an unsupported version and know what you are doing', + 'you can probably ignore this. If not we recommend you use a supported version', + 'as this ensures we can provide the best support and stability.', + ], + url: link, +}); diff --git a/plugin.yml b/plugin.yml index 6a4e3b51b..75cd29dec 100644 --- a/plugin.yml +++ b/plugin.yml @@ -1 +1,4 @@ name: "@lando/core" + +api: 3 +core: true diff --git a/plugins/healthcheck/hooks/app-add-healthchecks.js b/plugins/healthcheck/hooks/app-add-healthchecks.js index a728c4c3f..b4e071772 100644 --- a/plugins/healthcheck/hooks/app-add-healthchecks.js +++ b/plugins/healthcheck/hooks/app-add-healthchecks.js @@ -124,8 +124,9 @@ module.exports = async (app, lando) => { // parse the message const message = _.trim(_.get(error, 'message', 'UNKNOWN ERROR')); // add the warning - app.addWarning({ + app.addMessage({ title: `The service "${error.service}" failed its healthcheck`, + type: 'warning', detail: [ `Failed with "${message}"`, 'This may be ok but we recommend you run the command below to investigate:', @@ -137,7 +138,6 @@ module.exports = async (app, lando) => { } }, args: [tasks, { - ctx: {errors: []}, renderer: 'dc2', rendererOptions: { header: 'Healthchecking', diff --git a/plugins/healthcheck/package.json b/plugins/healthcheck/package.json new file mode 100644 index 000000000..fbe3d0645 --- /dev/null +++ b/plugins/healthcheck/package.json @@ -0,0 +1,18 @@ +{ + "name": "@lando/healthcheck", + "author": "Mike Pirog @pirog", + "license": "GPL-3.0", + "repository": "lando/core", + "bugs": "https://github.com/lando/core/issues/new/choose", + "homepage": "https://github.com/lando/core", + "keywords": [ + "lando", + "lando-plugin", + "@lando/core", + "php" + ], + "engines": { + "node": ">=18.0.0" + }, + "lando": {} +} diff --git a/plugins/healthcheck/plugin.yml b/plugins/healthcheck/plugin.yml index b2fb945be..5593e2efd 100644 --- a/plugins/healthcheck/plugin.yml +++ b/plugins/healthcheck/plugin.yml @@ -1 +1,4 @@ name: "@lando/healthcheck" + +api: 3 +core: true diff --git a/plugins/networking/app.js b/plugins/networking/app.js index 934678209..2ee5f9c1f 100644 --- a/plugins/networking/app.js +++ b/plugins/networking/app.js @@ -9,7 +9,7 @@ const _ = require('lodash'); module.exports = (app, lando) => { // Add all the apps containers to the lando bridge network with .internal aliases // for cross app networking - app.events.on('post-start', 1, () => { + app.events.on('post-start', 1, async () => { // We assume the lando net exists at this point const landonet = lando.engine.getNetwork(lando.config.networkBridge); // List all our app containers @@ -22,7 +22,7 @@ module.exports = (app, lando) => { return landonet.disconnect({Container: container.id, Force: true}) // Only throw non not connected errors .catch(error => { - if (!_.includes(error.message, 'is not connected to network lando')) throw error; + if (!_.includes(error.message, 'is not connected to network')) throw error; }) // Connect .then(() => { @@ -67,7 +67,7 @@ module.exports = (app, lando) => { return bridgeNet.disconnect({Container: proxyContainer, Force: true}) // Only throw non not connected errors .catch(error => { - if (!_.includes(error.message, 'is not connected to network lando')) throw error; + if (!_.includes(error.message, 'is not connected to network')) throw error; }) // Connect .then(() => { diff --git a/plugins/networking/package.json b/plugins/networking/package.json new file mode 100644 index 000000000..ea9225188 --- /dev/null +++ b/plugins/networking/package.json @@ -0,0 +1,18 @@ +{ + "name": "@lando/networking", + "author": "Mike Pirog @pirog", + "license": "GPL-3.0", + "repository": "lando/core", + "bugs": "https://github.com/lando/core/issues/new/choose", + "homepage": "https://github.com/lando/core", + "keywords": [ + "lando", + "lando-plugin", + "@lando/core", + "php" + ], + "engines": { + "node": ">=18.0.0" + }, + "lando": {} +} diff --git a/plugins/networking/plugin.yml b/plugins/networking/plugin.yml index 963298929..7fde7fb3d 100644 --- a/plugins/networking/plugin.yml +++ b/plugins/networking/plugin.yml @@ -1 +1,4 @@ name: "@lando/networking" + +api: 3 +core: true diff --git a/plugins/proxy/app.js b/plugins/proxy/app.js index 9b8b13b81..3e65146fa 100644 --- a/plugins/proxy/app.js +++ b/plugins/proxy/app.js @@ -2,10 +2,9 @@ // Modules const _ = require('lodash'); -const mkdirp = require('mkdirp'); +const fs = require('fs'); const path = require('path'); const utils = require('./lib/utils'); -const warnings = require('./lib/warnings'); /* * Helper to find the ports we need for the proxy @@ -69,7 +68,7 @@ module.exports = (app, lando) => { lando.log.verbose('proxy is ON.'); lando.log.verbose('Setting the default proxy certificate %s', lando.config.proxyDefaultCert); // Create needed directories - mkdirp.sync(lando.config.proxyConfigDir); + fs.mkdirSync(lando.config.proxyConfigDir, {recursive: true}); const files = [{ path: path.join(lando.config.proxyConfigDir, 'default-certs.yaml'), data: {tls: {stores: {default: {defaultCertificate: { @@ -152,7 +151,7 @@ module.exports = (app, lando) => { .map(service => { // Throw error but proceed if we don't have the service if (!_.includes(app.services, service.name)) { - app.addWarning(warnings.unknownServiceWarning(service.name)); + app.addMessage(require('./messages/unknown-service-warning')(service.name)); return {}; } diff --git a/plugins/proxy/lib/warnings.js b/plugins/proxy/lib/warnings.js deleted file mode 100644 index 6bc2ea183..000000000 --- a/plugins/proxy/lib/warnings.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -exports.cannotStartProxyWarning = message => ({ - title: 'Lando was not able to start the proxy', - detail: [ - `${message}`, - 'The proxy has been disabled for now so you can continue to work.', - 'Check out the docs below, resolve your issue and build this app', - ], - url: 'https://docs.lando.dev/config/proxy.html', -}); - -exports.unknownServiceWarning = service => ({ - title: 'Proxying to unknown service!', - detail: [ - `${service} is a service that does not exist in your app!!!`, - 'This means we have not been able to set up your proxy route', - 'We recommend running the below command to see the services for this app', - ], - command: `lando info`, -}); diff --git a/plugins/proxy/messages/cannot-start-proxy-warning.js b/plugins/proxy/messages/cannot-start-proxy-warning.js new file mode 100644 index 000000000..d65aeb824 --- /dev/null +++ b/plugins/proxy/messages/cannot-start-proxy-warning.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = message => ({ + title: 'Lando was not able to start the proxy', + type: 'warning', + detail: [ + `${message}`, + 'The proxy has been disabled for now so you can continue to work.', + 'Check out the docs below, resolve your issue and build this app', + ], + url: 'https://docs.lando.dev/config/proxy.html', +}); diff --git a/plugins/proxy/messages/unknown-service-warning.js b/plugins/proxy/messages/unknown-service-warning.js new file mode 100644 index 000000000..c2ae0622a --- /dev/null +++ b/plugins/proxy/messages/unknown-service-warning.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = service => ({ + title: 'Proxying to unknown service!', + type: 'warning', + detail: [ + `${service} is a service that does not exist in your app!!!`, + 'This means we have not been able to set up your proxy route', + 'We recommend running the below command to see the services for this app', + ], + command: `lando info`, +}); diff --git a/plugins/proxy/package.json b/plugins/proxy/package.json new file mode 100644 index 000000000..4df8d7deb --- /dev/null +++ b/plugins/proxy/package.json @@ -0,0 +1,18 @@ +{ + "name": "@lando/proxy", + "author": "Mike Pirog @pirog", + "license": "GPL-3.0", + "repository": "lando/core", + "bugs": "https://github.com/lando/core/issues/new/choose", + "homepage": "https://github.com/lando/core", + "keywords": [ + "lando", + "lando-plugin", + "@lando/core", + "php" + ], + "engines": { + "node": ">=18.0.0" + }, + "lando": {} +} diff --git a/plugins/proxy/plugin.yml b/plugins/proxy/plugin.yml index 63114f709..bc0f851e4 100644 --- a/plugins/proxy/plugin.yml +++ b/plugins/proxy/plugin.yml @@ -1 +1,4 @@ name: "@lando/proxy" + +api: 3 +core: true diff --git a/plugins/scanner/package.json b/plugins/scanner/package.json new file mode 100644 index 000000000..f22f0fa90 --- /dev/null +++ b/plugins/scanner/package.json @@ -0,0 +1,18 @@ +{ + "name": "@lando/scanner", + "author": "Mike Pirog @pirog", + "license": "GPL-3.0", + "repository": "lando/core", + "bugs": "https://github.com/lando/core/issues/new/choose", + "homepage": "https://github.com/lando/core", + "keywords": [ + "lando", + "lando-plugin", + "@lando/core", + "php" + ], + "engines": { + "node": ">=18.0.0" + }, + "lando": {} +} diff --git a/plugins/scanner/plugin.yml b/plugins/scanner/plugin.yml index f221c1f23..8ddc12006 100644 --- a/plugins/scanner/plugin.yml +++ b/plugins/scanner/plugin.yml @@ -1 +1,4 @@ name: "@lando/scanner" + +api: 3 +core: true diff --git a/plugins/scanner/utils/checks-to-tasks.js b/plugins/scanner/utils/checks-to-tasks.js index 0f33e86bb..f9447f18e 100644 --- a/plugins/scanner/utils/checks-to-tasks.js +++ b/plugins/scanner/utils/checks-to-tasks.js @@ -1,7 +1,7 @@ 'use strict'; const _ = require('lodash'); -const chalk = require('chalk'); +const {color} = require('listr2'); module.exports = ({ args, @@ -13,19 +13,19 @@ module.exports = ({ delay = 1000, retry = 10, } = {}) => ({ - title: chalk.grey(title || `${type} ${args[0]}`), + title: title || `${type} ${args[0]}`, retry: retry, task: (ctx, task) => { // if skip then we are done if (skip === true) { - task.title = chalk.yellow(title); + task.title = color.yellow(title); task.skip(); // otherwise try to actually test } else { return test(...args).then(response => { const code = `[${_.get(response, 'lando.code', 'UNKNOWN')}]`; - task.title = `${chalk.green(title)} ${chalk.dim(code)}`; + task.title = `${color.green(title)} ${color.dim(code)}`; }) .catch(error => { // assess retry situation @@ -36,12 +36,12 @@ module.exports = ({ // if this is our final retry then fail and bail if (count === retry) { - task.title = `${chalk.red(title)} ${chalk.dim(code)} ${chalk.dim(_.upperCase(error.message))}`; + task.title = `${color.red(title)} ${color.dim(code)} ${color.dim(_.upperCase(error.message))}`; throw error; // otherwise proceed with retrying } else { - task.title = `${chalk.grey(title)} ${chalk.dim(rm)}${chalk.dim(code)}`; + task.title = `${color.gray(title)} ${color.dim(rm)}${color.dim(code)}`; return require('delay')(delay + (100 * count)).then(() => { throw error; }); diff --git a/plugins/sharing/package.json b/plugins/sharing/package.json new file mode 100644 index 000000000..9bc7db92a --- /dev/null +++ b/plugins/sharing/package.json @@ -0,0 +1,18 @@ +{ + "name": "@lando/sharing", + "author": "Mike Pirog @pirog", + "license": "GPL-3.0", + "repository": "lando/core", + "bugs": "https://github.com/lando/core/issues/new/choose", + "homepage": "https://github.com/lando/core", + "keywords": [ + "lando", + "lando-plugin", + "@lando/core", + "php" + ], + "engines": { + "node": ">=18.0.0" + }, + "lando": {} +} diff --git a/plugins/sharing/plugin.yml b/plugins/sharing/plugin.yml index 093dbb8eb..f6d5816c3 100644 --- a/plugins/sharing/plugin.yml +++ b/plugins/sharing/plugin.yml @@ -1,3 +1,6 @@ name: "@lando/sharing" + +api: 3 +core: true hidden: true deprecated: true diff --git a/plugins/test/package.json b/plugins/test/package.json new file mode 100644 index 000000000..15942cc57 --- /dev/null +++ b/plugins/test/package.json @@ -0,0 +1,18 @@ +{ + "name": "@lando/test", + "author": "Mike Pirog @pirog", + "license": "GPL-3.0", + "repository": "lando/core", + "bugs": "https://github.com/lando/core/issues/new/choose", + "homepage": "https://github.com/lando/core", + "keywords": [ + "lando", + "lando-plugin", + "@lando/core", + "php" + ], + "engines": { + "node": ">=18.0.0" + }, + "lando": {} +} diff --git a/plugins/test/plugin.yml b/plugins/test/plugin.yml index 5b8a2c324..1a4a7617e 100644 --- a/plugins/test/plugin.yml +++ b/plugins/test/plugin.yml @@ -1,2 +1,5 @@ name: "@lando/test" + +api: 3 +core: true hidden: true diff --git a/renderers/dc2.js b/renderers/dc2.js index 6ea4dccc2..6c58f80ed 100644 --- a/renderers/dc2.js +++ b/renderers/dc2.js @@ -14,6 +14,7 @@ class DC2Renderer extends LandoRenderer { options.header = options.header || 'Processing'; options.icon = {...options.icon, DOCKER_COMPOSE_HEADER: '[+]'}; options.taskCount = options.taskCount || 0; + options.showErrorMessage = false; // dc2 state changes options.states = { diff --git a/renderers/lando.js b/renderers/lando.js index 9507d599a..fe3285cd8 100644 --- a/renderers/lando.js +++ b/renderers/lando.js @@ -6,7 +6,7 @@ const {DefaultRenderer} = require('listr2'); class LandoRenderer extends DefaultRenderer { constructor(tasks, options, $renderHook) { super(tasks, options, $renderHook); - this.options.level = options.level || 0.5; + this.options.level = options.level ?? 0.5; } create(options) { @@ -17,6 +17,8 @@ class LandoRenderer extends DefaultRenderer { ...options, }; + options.prompt = true; + const render = []; const renderTasks = this.renderer(this.tasks, this.options.level); diff --git a/scripts/drush b/scripts/drush deleted file mode 100755 index 477f7a846..000000000 --- a/scripts/drush +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/sh - -set -e - -# Get the lando logger -. /helpers/log.sh - -# Set the module -LANDO_MODULE="drush" - -echo "" -lando_yellow "This version of drupal prefers you have a site-local install of drush!" -echo "" -echo "Run the following command and try drush again:" -lando_green "lando composer require drush/drush" - -exit 1 diff --git a/scripts/install-composer.sh b/scripts/install-composer.sh deleted file mode 100644 index 47b6b8e29..000000000 --- a/scripts/install-composer.sh +++ /dev/null @@ -1,36 +0,0 @@ -#!/bin/sh - -set -e - -VERSION="$1" - -# NOTE: we should have better protections here -php -r "copy('https://getcomposer.org/installer', '/tmp/composer-setup.php');" - -# Allow for a few convenience install methods -if [ "$VERSION" = '1-latest' ]; then - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --1 -elif [ "$VERSION" = '1' ]; then - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --1 -elif [ "$VERSION" = '2-latest' ]; then - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --2 -elif [ "$VERSION" = '2' ]; then - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --2 -elif [ "$VERSION" = 'preview' ]; then - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --preview -elif [ "$VERSION" = 'snapshot' ]; then - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --snapshot -else - php /tmp/composer-setup.php --install-dir=/usr/local/bin --filename=composer --version="$VERSION" -fi - -# Remove the setup script -php -r "unlink('/tmp/composer-setup.php');" - -# Check if anything is installed globally -if [ -f /var/www/.composer/composer.json ]; then - # If this is version 2 then let's make sure hirak/prestissimo is removed - if composer --version 2>/dev/null | grep -E "Composer (version )?2." > /dev/null; then - composer global remove hirak/prestissimo - fi -fi diff --git a/scripts/install-docker-desktop.ps1 b/scripts/install-docker-desktop.ps1 new file mode 100644 index 000000000..03c18af97 --- /dev/null +++ b/scripts/install-docker-desktop.ps1 @@ -0,0 +1,41 @@ +#!/ + +# handle params +# @NOTE: we omit DEBUG as a param because its "built in" +[CmdletBinding(PositionalBinding=$false)] +Param( + [string]$installer, + [switch]$acceptlicense = $false +) + +# error handling +$ErrorActionPreference = "Stop" +# enable debugging if debug is true +$DebugPreference = If ($DebugPreference -eq "Inquire") {"Continue"} Else {"SilentlyContinue"} +$debug = If ($DebugPreference -eq "Continue") {$true} Else {$false} +Write-Debug "running script with:" +Write-Debug "INSTALLER: $installer" +Write-Debug "ACCEPT LICENSE: $acceptlicense" +Write-Debug "DEBUG: $debug" + +# validation +# @TODO: check if installer exists on fs? +if ([string]::IsNullOrEmpty($installer)) +{ + throw "You must pass in an -installer!" +} + +# Start arg stuff +$options = "--backend=wsl-2" +# if debug mode is off then make the installer quiet +if ($debug -eq $false) {$options = "$options --quiet"} +# if accept license is true then add that as well +if ($acceptlicense -eq $true) {$options = "$options --accept-license"} + +# Install +Write-Debug "Running $installer with 'install $options'" +$p = Start-Process -FilePath "$installer" -ArgumentList "install $options" -Wait -PassThru +Write-Debug "Process finished with return code: $($p.ExitCode)" + +# If there is an error then throw here +if ($($p.ExitCode) -ne 0) {throw "Docker Desktop install failed! Rerun setup with --debug or -vvv for more info!"} diff --git a/scripts/install-docker-desktop.sh b/scripts/install-docker-desktop.sh new file mode 100644 index 000000000..5cf14e1bb --- /dev/null +++ b/scripts/install-docker-desktop.sh @@ -0,0 +1,67 @@ +#!/bin/bash +set -eo pipefail + +DEBUG=0 +ACCEPT_LICENSE=0 +INSTALLER="Docker.dmg" +USER="$(whoami)" +OPTS= + +debug() { + if [ "${DEBUG}" == 1 ]; then printf '%s\n' "$1" >&2; fi +} + +# PARSE THE ARGZZ +while (( "$#" )); do + case "$1" in + --accept-license) + ACCEPT_LICENSE=1 + shift + ;; + --debug) + DEBUG=1 + shift + ;; + --installer) + INSTALLER="$2" + shift 2 + ;; + --installer=*) + INSTALLER="${i#*=}" + shift + ;; + -u|--user) + USER="$2" + shift 2 + ;; + -u=*|--user=*) + USER="${i#*=}" + shift + ;; + --) + shift + break + ;; + -*|--*=) + shift + ;; + *) + shift + ;; + esac +done + +# debug +debug "running script with:" +debug "ACCEPT LICENSE: $ACCEPT_LICENSE" +debug "DEBUG: $DEBUG" +debug "INSTALLER: $INSTALLER" +debug "USER: $USER" + +# add accept license if set +if [ "${DEBUG}" == 1 ]; then OPTS="$OPTS --accept-license"; fi + +# run +hdiutil attach "$INSTALLER" +/Volumes/Docker/Docker.app/Contents/MacOS/install --user="$USER" $OPTS +hdiutil detach /Volumes/Docker diff --git a/scripts/install-docker-engine.sh b/scripts/install-docker-engine.sh new file mode 100644 index 000000000..f5271511d --- /dev/null +++ b/scripts/install-docker-engine.sh @@ -0,0 +1,63 @@ +#!/bin/bash +set -eo pipefail + +DEBUG=0 +INSTALLER="get-docker.sh" +VERSION="24.0.7" +OPTS= + +debug() { + if [ "${DEBUG}" == 1 ]; then printf '%s\n' "$1" >&2; fi +} + +# PARSE THE ARGZZ +while (( "$#" )); do + case "$1" in + --debug) + DEBUG=1 + shift + ;; + --installer) + INSTALLER="$2" + shift 2 + ;; + --installer=*) + INSTALLER="${i#*=}" + shift + ;; + -v|--version) + VERSION="$2" + shift 2 + ;; + -v=*|--version=*) + VERSION="${i#*=}" + shift + ;; + --) + shift + break + ;; + -*|--*=) + shift + ;; + *) + shift + ;; + esac +done + +# debug +debug "running script with:" +debug "DEBUG: $DEBUG" +debug "INSTALLER: $INSTALLER" +debug "VERSION: $VERSION" + +# run +sh "$INSTALLER" --version "$VERSION" + +# add group +groupadd docker || true + +# enable system start? +# systemctl enable docker.service || true +# systemctl enable containerd.service || true diff --git a/scripts/run-elevated.ps1 b/scripts/run-elevated.ps1 new file mode 100644 index 000000000..3d1ea2242 --- /dev/null +++ b/scripts/run-elevated.ps1 @@ -0,0 +1,42 @@ +#!/ + +# handle params +# @NOTE: we omit DEBUG as a param because its "built in" +[CmdletBinding(PositionalBinding=$false)] +Param( + [string]$cmd +) + +# error handling +$ErrorActionPreference = "Stop" + +# enable debugging if debug is true +$DebugPreference = If ($DebugPreference -eq "Inquire") {"Continue"} Else {"SilentlyContinue"} +$debug = If ($DebugPreference -eq "Continue") {$true} Else {$false} + +# figure out the command and setup fake fds +$command = $cmd.split(',') +$stdoutfile = Join-Path $Env:Temp $(New-Guid) +$stderrfile = Join-Path $Env:Temp $(New-Guid) + +# DEBUG +Write-Debug "running elevated command:" +Write-Debug "CMD: $command" +Write-Debug "DEBUG: $debug" +Write-Debug "STDOUTPATH: $stdoutfile" +Write-Debug "STDERRPATH: $stderrfile" + +# add our fake fds to the command +$command += ">'$stdoutfile'" +$command += "2>'$stderrfile'" + +# run the process +$process = Start-Process powershell -Wait -PassThru -Verb RunAs -WindowStyle Hidden -ArgumentList $command +Write-Debug "Process finished with return code: $($process.ExitCode)" + +# print relevant fds +if (Test-Path $stdoutfile) {Write-Output $(Get-Content $stdoutfile)} +if (Test-Path $stderrfile) {[Console]::Error.WriteLine("$(Get-Content $stderrfile)")} + +# exit +exit $($process.ExitCode) diff --git a/sources/github.js b/sources/github.js index 3d4e7d487..e7aa213bc 100644 --- a/sources/github.js +++ b/sources/github.js @@ -144,6 +144,7 @@ module.exports = { }, }), build: (options, lando) => ([ + {name: 'wait-for-user', cmd: `/helpers/wait-for-user.sh www-data ${lando.config.uid}`}, {name: 'generate-key', cmd: `/helpers/generate-key.sh ${gitHubLandoKey} ${gitHubLandoKeyComment}`}, {name: 'post-key', func: (options, lando) => { return postKey( @@ -153,7 +154,6 @@ module.exports = { ); }}, {name: 'reload-keys', cmd: '/helpers/load-keys.sh --silent', user: 'root'}, - {name: 'wait-for-user', cmd: `/helpers/wait-for-user.sh www-data ${lando.config.uid}`}, {name: 'clone-repo', cmd: `/helpers/get-remote-url.sh ${options['github-repo']}`, remove: true}, {name: 'set-caches', func: (options, lando) => setCaches(options, lando)}, ]), diff --git a/tasks/plugin-add.js b/tasks/plugin-add.js new file mode 100644 index 000000000..25bd7919b --- /dev/null +++ b/tasks/plugin-add.js @@ -0,0 +1,72 @@ +'use strict'; + +module.exports = lando => { + return { + command: 'plugin-add [plugins...]', + level: 'tasks', + options: { + auth: { + describe: 'Use global or scoped auth', + alias: ['a'], + array: true, + default: [], + }, + registry: { + describe: 'Use global or scoped registry', + alias: ['r', 's', 'scope'], + array: true, + default: [], + }, + }, + + run: async options => { + const getPluginConfig = require('../utils/get-plugin-config'); + const lopts2Popts = require('../utils/lopts-2-popts'); + const merge = require('../utils/merge'); + + const Plugin = require('../components/plugin'); + + // normalize incoming options on top of any managed or user plugin config we already have + options.config = merge({}, [ + getPluginConfig(lando.config.pluginConfigFile, lando.config.pluginConfig), + lopts2Popts(options), + ]); + + // reset Plugin static defaults for v3 purposes + Plugin.config = options.config; + Plugin.debug = require('../utils/debug-shim')(lando.log); + + // merge plugins together + const plugins = [options.plugin].concat(options.plugins); + lando.log.debug('attempting to install plugins %j', plugins); + + // attempt to compute the destination to install the plugin + // @NOTE: is it possible for this to ever be undefined? + const {dir} = lando.config.pluginDirs.find(dir => dir.type === require('../utils/get-plugin-type')()); + // prep listr things + const tasks = plugins.map(plugin => require('../utils/get-plugin-add-task')(plugin, {dir, Plugin})); + + // try to fetch the plugins + const {errors, results, total} = await lando.runTasks(tasks, { + renderer: 'lando', + rendererOptions: { + level: 0, + }, + }); + + // status + console.log(); + console.log('added %s of %s plugins with %s errors', results.length, total, errors.length); // eslint-disable-line max-len + console.log(); + // clear + lando.cli.clearTaskCaches(); + + // if we have errors then lets print them out + if (errors.length > 0) { + // print the full errors + for (const error of errors) lando.log.debug(error); + throw Error('There was a problem installing some of your plugins. Rerun with -vvv for more details.'); + } + }, + }; +}; diff --git a/tasks/plugin-login.js b/tasks/plugin-login.js new file mode 100644 index 000000000..9db30f935 --- /dev/null +++ b/tasks/plugin-login.js @@ -0,0 +1,93 @@ +'use strict'; + +module.exports = lando => { + return { + command: 'plugin-login', + level: 'tasks', + options: { + username: { + describe: 'The registry username', + alias: ['u'], + string: true, + interactive: { + type: 'string', + message: 'Enter registry username', + weight: 100, + validate: input => { + return typeof input === 'string' && input.length > 0 ? true : 'Must enter a username!'; + }, + }, + }, + password: { + describe: 'The registry password', + alias: ['p'], + string: true, + interactive: { + type: 'password', + message: 'Enter registry password or token', + weight: 200, + validate: input => { + return typeof input === 'string' && input.length > 0 ? true : 'Must enter a password or token!'; + }, + }, + }, + registry: { + describe: 'Use registry', + alias: ['r'], + string: true, + default: 'https://registry.npmjs.org', + }, + scope: { + describe: 'Use scopes', + alias: ['s'], + array: true, + }, + }, + + run: async options => { + const merge = require('lodash/merge'); + const profile = require('npm-profile'); + const getPluginConfig = require('../utils/get-plugin-config'); + const lopts2Popts = require('../utils/lopts-2-popts'); + const write = require('../utils/write-file'); + + const {color} = require('listr2'); + + // get relevant options + const {username, password, registry} = options; + + // try to login + try { + // @NOTE: it also return ok=true? can it sometimes be not ok? + const {token} = await profile.loginCouch(username, password, {registry}); + + // assemble and write new plugin configFile + const data = merge({}, getPluginConfig(lando.config.pluginConfigFile), lopts2Popts({...options, auth: [`${registry}=${token}`]})); // eslint-disable-line max-len + write(lando.config.pluginConfigFile, data); + lando.log.debug('wrote plugin config to %s', lando.config.pluginConfigFile); + + // tell the user what happened + console.log(`${color.green(username)} is now ${color.bold('logged in')} to ${color.magenta(registry)}!`); + + // handle login errors + } catch (error) { + // debug the original error + lando.log.debug('original error %j', error); + // for some reason not all errors have a non-zero code so enforce here + error.code = 1; + // malformed URL + if (error.code === 'ERR_INVALID_URL') error.message = `${registry} does not appear to be a valid registry URL!`; + // @TODO? other non HTTP errors? + + // if we have a http status code then so we can reliably do some things + if (error.statusCode) { + error.message = `${error.body.error}`; + lando.log.debug('%s request failed to %s with status code %s', error.method, error.uri, error.statusCode); + throw error; + + // otherwise just throw and be done with it + } else throw error; + } + }, + }; +}; diff --git a/tasks/plugin-logout.js b/tasks/plugin-logout.js new file mode 100644 index 000000000..63726d423 --- /dev/null +++ b/tasks/plugin-logout.js @@ -0,0 +1,19 @@ +'use strict'; + +module.exports = lando => { + return { + command: 'plugin-logout', + level: 'tasks', + run: async options => { + const write = require('../utils/write-file'); + const {color} = require('listr2'); + + // write an empty config file + write(lando.config.pluginConfigFile, {}); + lando.log.debug('wrote empty config to %s', lando.config.pluginConfigFile); + + // tell the user what happened + console.log(`All ${color.bold('managed sessions')} have been ${color.red('destroyed')}!`); + }, + }; +}; diff --git a/tasks/plugin-remove.js b/tasks/plugin-remove.js new file mode 100644 index 000000000..aee2ffc2b --- /dev/null +++ b/tasks/plugin-remove.js @@ -0,0 +1,48 @@ +'use strict'; + +module.exports = lando => { + return { + command: 'plugin-remove [plugins...]', + level: 'tasks', + run: async options => { + const Plugin = require('../components/plugin'); + + // reset Plugin.debug to use the lando 3 debugger + Plugin.debug = require('../utils/debug-shim')(lando.log); + + // merge plugins together, parse/normalize their names and return only unique values + const plugins = [options.plugin] + .concat(options.plugins) + .map(plugin => require('../utils/parse-package-name')(plugin).name) + .filter((plugin, index, array) => array.indexOf(plugin) === index); + lando.log.debug('attempting to remove plugins %j', plugins); + + // prep listr things + const tasks = plugins + .map(plugin => ([lando.config.plugins.find(p => p.name === plugin), plugin])) + .map(([plugin, fallback]) => require('../utils/get-plugin-remove-task')(plugin, {fallback, Plugin})); + + // try to remove the plugins + const {errors, results, total} = await lando.runTasks(tasks, { + renderer: 'lando', + rendererOptions: { + level: 0, + }, + }); + + // otherwise we good! + console.log(); + console.log('removed %s of %s plugins with %s errors', results.length, total, errors.length); // eslint-disable-line max-len + console.log(); + // clear task caches for good measure + lando.cli.clearTaskCaches(); + + // if we have errors then lets print them out + if (errors.length > 0) { + // print the full errors + for (const error of errors) lando.log.debug(error); + throw Error('There was a problem removing some of your plugins. Rerun with -vvv for more details.'); + } + }, + }; +}; diff --git a/tasks/rebuild.js b/tasks/rebuild.js index c807a06b5..a9bf1b671 100644 --- a/tasks/rebuild.js +++ b/tasks/rebuild.js @@ -37,12 +37,12 @@ module.exports = lando => { // determine legacy settings const legacyScanner = _.get(lando, 'config.scanner', true) === 'legacy'; // get scanner stuff - const type = !_.isEmpty(app.warnings) ? 'report' : 'post'; + const type = !_.isEmpty(app.messages) ? 'report' : 'post'; const phase = legacyScanner ? `${type}_legacy` : type; const scans = _.find(app.checks, {type: 'url-scan-tasks'}); // rebuold tables - console.log(lando.cli.makeArt('appRebuild', {name: app.name, phase, warnings: app.warnings})); + console.log(lando.cli.makeArt('appRebuild', {name: app.name, phase, messages: app.messages})); console.log(lando.cli.formatData(utils.startTable(app, {legacyScanner}), {format: 'table'}, {border: false})); // if we are not in legacy scanner mode then run the scans diff --git a/tasks/restart.js b/tasks/restart.js index 3dbb7a79a..d5805ed93 100644 --- a/tasks/restart.js +++ b/tasks/restart.js @@ -21,12 +21,12 @@ module.exports = lando => { // determine legacy settings const legacyScanner = _.get(lando, 'config.scanner', true) === 'legacy'; // get scanner stuff - const type = !_.isEmpty(app.warnings) ? 'report' : 'post'; + const type = !_.isEmpty(app.messages) ? 'report' : 'post'; const phase = legacyScanner ? `${type}_legacy` : type; const scans = _.find(app.checks, {type: 'url-scan-tasks'}); // print post start table - console.log(lando.cli.makeArt('appStart', {name: app.name, phase, warnings: app.warnings})); + console.log(lando.cli.makeArt('appStart', {name: app.name, phase, messages: app.messages})); console.log(lando.cli.formatData(utils.startTable(app, {legacyScanner}), {format: 'table'}, {border: false})); // if we are not in legacy scanner mode then run the scans diff --git a/tasks/setup.js b/tasks/setup.js new file mode 100644 index 000000000..f9e91c81a --- /dev/null +++ b/tasks/setup.js @@ -0,0 +1,271 @@ +'use strict'; + +const groupBy = require('lodash/groupBy'); +const merge = require('lodash/merge'); +const sortBy = require('lodash/sortBy'); + +const {color, figures} = require('listr2'); + +const defaultStatus = { + 'CANNOT INSTALL': 0, + 'INSTALLED': 0, + 'NOT INSTALLED': 0, +}; + +// helper to get a status groupings +const getStatusGroups = (status = {}) => { + const results = Object.fromEntries(Object.entries(groupBy(status, 'state')) + .map(([state, items]) => ([state, items.length]))); + return merge({}, defaultStatus, results); +}; + +// get not installed message +const getNotInstalledMessage = item => { + // start with the action and fallbacks + const message = [item.comment || `Will install ${item.version}` || 'Will install']; + // add a restart message if applicable + if (item.restart) message.push('[Requires restart]'); + // return + return message.join(' '); +}; + +// helper to get a renderable status table +const getStatusTable = items => ({ + rows: items.map(item => { + switch (item.state) { + case 'INSTALLED': + return merge({}, item, { + description: item.description, + status: `${color.green(`${figures.tick} Installed`)}`, + comment: color.dim('Dialed'), + weight: -1, + }); + case 'NOT INSTALLED': + return merge({}, item, { + description: item.description, + status: `${color.yellow(`${figures.warning} Not Installed`)}`, + comment: color.dim(getNotInstalledMessage(item)), + weight: 0, + }); + case 'CANNOT INSTALL': + return merge({}, item, { + description: item.description, + status: `${color.red(`${figures.cross} Cannot Install!`)}`, + comment: item.comment, + weight: 1, + }); + } + }), + columns: { + description: {header: 'THING'}, + status: {header: 'STATUS'}, + comment: {header: 'COMMENT'}, + }, +}); + +module.exports = lando => { + // get defaults from the lando config + const defaults = lando.config.setup; + // determine label for build engine + const buildEngine = process.platform === 'linux' ? 'docker-engine' : 'docker-desktop'; + // default options + const options = { + 'build-engine': { + describe: `The version of the build engine (${buildEngine}) to install`, + default: defaults.buildEngine, + string: true, + }, + 'orchestrator': { + describe: 'The version of the orchestrator (docker-compose) to install', + default: defaults.orchestrator, + string: true, + }, + 'plugin': { + describe: 'Additional plugin(s) to install', + default: require('../utils/parse-to-plugin-strings')(defaults.plugins), + array: true, + }, + 'skip-common-plugins': { + describe: 'Disables the installation of common Lando plugins', + default: defaults.skipCommonPlugins, + boolean: true, + }, + 'yes': { + describe: 'Runs non-interactively with all accepted default answers', + alias: ['y'], + default: !require('is-interactive'), + boolean: true, + }, + }; + + // if docker-desktop then we need to add the accept license option + if (buildEngine === 'docker-desktop') { + options['build-engine-accept-license'] = { + describe: 'Accepts the Docker Desktop license during install instead of later', + default: defaults.buildEngineAcceptLicense, + boolean: true, + }; + } + + // allow plugins to contribute options to setup + // @NOTE: ideally we'd dynamically add in setup options but this is not easily possible in Lando 3 so + // we are going to kick it to Lando 4 and just hardcode all the options we need + // await lando.events.emit('setup-options', options); + + return { + command: 'setup', + options, + run: async options => { + // @TODO: conditional visibility for lando setup re first time run succesfully? + const parsePkgName = require('../utils/parse-package-name'); + const ux = lando.cli.getUX(); + + // setup header + console.log(lando.cli.makeArt('setupHeader')); + + // ensure plguins/tasks is an empty object if not passed in somehow? + options.plugins = options.plugins ?? {}; + options.tasks = options.tasks ?? []; + + // start by looping through option.plugin and object merging + // this should allow us to skip plugin-resolution because its just going to always use the "last" version + for (const plugin of options.plugin) { + const {name, peg} = parsePkgName(plugin); + options.plugins[name] = peg === '*' ? 'latest' : peg; + } + + // attempt to get the status and status summary of our plugins + ux.action.start('Generating plugin installation matrix'); + const pstatus = await lando.getInstallPluginsStatus(options); + const pstatusSummary = getStatusGroups(pstatus); + options.installPlugins = pstatusSummary['NOT INSTALLED'] + pstatusSummary['CANNOT INSTALL'] > 0; + ux.action.stop(options.installPlugins ? `${color.green('done')} ${color.dim('[see table below]')}` + : `${color.green('done')} ${color.dim('[nothing to install]')}`); + + // show plugin install status/summary and prompt if needed + if (options.installPlugins && options.yes === false) { + const {rows, columns} = getStatusTable(pstatus); + // print table + console.log(''); + ux.table(sortBy(rows, ['row', 'weight']), columns); + console.log(''); + + // things are good! + if (pstatusSummary['CANNOT INSTALL'] === 0) { + console.log(`Lando would like to install the ${pstatusSummary['NOT INSTALLED']} plugins listed above.`); + const answer = await ux.confirm(color.bold('DO YOU CONSENT?')); + if (!answer) throw new Error('Setup terminated!'); + + // things are probably not ok + } else { + console.log(`Lando has detected that ${pstatusSummary['CANNOT INSTALL']} plugins listed above cannot install correctly.`); // eslint-disable-line max-len + console.log(color.magenta('It may be wise to resolve their issues before continuing!')); + console.log(''); + const answer = await ux.confirm(color.bold('DO YOU STILL WISH TO CONTINUE?')); + if (!answer) throw new Error('Setup terminated!'); + } + } + + // actually install plugins + const presults = await lando.installPlugins(options); + + // handle plugin install errors + // @NOTE: should a plugin install error stop the rest of setup? + if (presults.errors.length > 0) { + const error = new Error(`A setup error occured! Rerun with ${color.bold('lando setup --debug')} for more info.`); // eslint-disable-line max-len + lando.log.debug('%j', presults.errors[0]); + throw error; + } + + // reload with newyl installed plugins and clear caches + await lando.reloadPlugins(); + + // get setup status + ux.action.start('Generating setup task installation matrix'); + const sstatus = await lando.getSetupStatus(options); + const sstatusSummary = getStatusGroups(sstatus); + options.installTasks = sstatusSummary['NOT INSTALLED'] + sstatusSummary['CANNOT INSTALL'] > 0; + ux.action.stop(options.installTasks ? `${color.green('done')} ${color.dim('[see table below]')}` + : `${color.green('done')} ${color.dim('[nothing to install]')}`); + + // show setup status/summary and prompt if needed + if (options.installTasks && options.yes === false) { + // @TODO: lando plugin header install art + const {rows, columns} = getStatusTable(sstatus); + + // print table + console.log(''); + ux.table(sortBy(rows, ['row', 'weight']), columns); + console.log(''); + + // things are good! + if (sstatusSummary['CANNOT INSTALL'] === 0) { + console.log(`Lando would like to run the ${sstatusSummary['NOT INSTALLED']} setup tasks listed above.`); + const answer = await ux.confirm(color.bold('DO YOU CONSENT?')); + if (!answer) throw new Error('Setup terminated!'); + + // things are probably not ok + } else { + console.log(`Lando has detected that ${sstatusSummary['CANNOT INSTALL']} setup tasks listed above cannot run correctly.`); // eslint-disable-line max-len + console.log(color.magenta('It may be wise to resolve their issues before continuing!')); + console.log(''); + const answer = await ux.confirm(color.bold('DO YOU STILL WISH TO CONTINUE?')); + if (!answer) throw new Error('Setup terminated!'); + } + } + + // run setup + const sresults = await lando.setup(options); + + // combine all our results + const results = presults.results.concat(sresults.results); + const errors = presults.errors.concat(sresults.errors); + // @NOTE: total includes all tasks, even ones that dont need to run so its sort of confusing for UX purposes + // we will just imrpove this in L4 + // const total = presults.total = sresults.total; + // padme bro + console.log(''); + + // we didnt have to do anything + if (errors.length === 0 && results.length === 0) { + console.log(`As far as ${color.bold('lando setup')} can tell you are ${color.green('good to go')} and do not require additional setup!`); // eslint-disable-line max-len + return; + } + + // if we had errors + if (errors.length > 0) { + const error = new Error(`A setup error occured! Rerun with ${color.bold('lando setup --debug')} for more info.`); // eslint-disable-line max-len + lando.log.debug('%j', errors[0]); + throw error; + } + + // success! + if (errors.length === 0 && results.length > 0) { + // restart logix + if (sresults.restart) { + console.log(`Setup installed ${color.green(results.length)} of ${color.bold(results.length)} things successfully!`); // eslint-disable-line max-len + console.log(color.magenta('However, a restart is required is complete your setup.')); + if (options.yes === false) { + try { + console.log(''); + await ux.anykey(`Press any key to restart or ${color.yellow('q')} to restart later`); + } catch { + throw new Error(`Restart cancelled! ${color.yellow('Note that Lando may not work correctly until you restart!')}`); // eslint-disable-line max-len + } + } + ux.action.start('Restarting'); + await require('../utils/shutdown-os')({ + debug: require('../utils/debug-shim')(lando.log), + message: 'Lando needs to restart to complete setup!', + }); + ux.action.stop(color.green('done')); + + // otherwise the usual success message + } else { + console.log(`Setup installed ${color.green(results.length)} of ${color.bold(results.length)} things successfully!`); // eslint-disable-line max-len + console.log(`You are now ${color.green('good to go')} and can start using Lando!`); + } + } + }, + }; +}; diff --git a/tasks/start.js b/tasks/start.js index cc3c08b30..1e80eb2e6 100644 --- a/tasks/start.js +++ b/tasks/start.js @@ -21,12 +21,12 @@ module.exports = lando => { // determine legacy settings const legacyScanner = _.get(lando, 'config.scanner', true) === 'legacy'; // get scanner stuff - const type = !_.isEmpty(app.warnings) ? 'report' : 'post'; + const type = !_.isEmpty(app.messages) ? 'report' : 'post'; const phase = legacyScanner ? `${type}_legacy` : type; const scans = _.find(app.checks, {type: 'url-scan-tasks'}); // print post start table - console.log(lando.cli.makeArt('appStart', {name: app.name, phase, warnings: app.warnings})); + console.log(lando.cli.makeArt('appStart', {name: app.name, phase, messages: app.messages})); console.log(lando.cli.formatData(utils.startTable(app, {legacyScanner}), {format: 'table'}, {border: false})); // if we are not in legacy scanner mode then run the scans diff --git a/tasks/update.js b/tasks/update.js new file mode 100644 index 000000000..5d855b238 --- /dev/null +++ b/tasks/update.js @@ -0,0 +1,168 @@ +'use strict'; + +const groupBy = require('lodash/groupBy'); +const merge = require('lodash/merge'); + +const {color, figures} = require('listr2'); + +const defaultStatus = { + 'NO UPDATE': 0, + 'HAS UPDATE': 0, + 'CANNOT UPDATE': 0, + 'ERROR': 0, +}; + +// helper to get a status groupings +const getStatusGroups = (status = {}) => { + const results = Object.fromEntries(Object.entries(groupBy(status, 'state')) + .map(([state, items]) => ([state, items.length]))); + return merge({}, defaultStatus, results); +}; + +// get not installed message +const getUpdateMessage = item => { + // pieces of you + const rn = item.rnt ? item.rnt.replace('${version}', item.update.version) : undefined; + const update = `${item.update.version}-${item.update.channel}`; + // it no release notes template then + return rn || update; +}; + +// get not installed message +const getCannotUpdateMessage = item => { + if (item.source) return 'Running from source. Please update manually.'; + else 'Please update manually.'; +}; + +// helper to get a renderable status table +const getStatusTable = items => ({ + rows: items.map(item => { + switch (item.state) { + case 'NO UPDATE': + return merge({}, item, { + description: item.description, + status: `${color.green(`${figures.tick} Up to date`)}`, + comment: color.dim('All good'), + }); + case 'HAS UPDATE': + return merge({}, item, { + description: item.description, + status: `${color.yellow(`${figures.warning} Update available`)}`, // eslint-disable-line max-len + comment: getUpdateMessage(item), + }); + case 'CANNOT UPDATE': + return merge({}, item, { + description: item.description, + status: `${color.dim(`${figures.warning} Cannot update`)}`, + comment: color.dim(getCannotUpdateMessage(item)), + }); + case 'ERROR': + return merge({}, item, { + description: item.description, + status: `${color.red(`${figures.cross} Update check failed!`)}`, + comment: item.update.error.message, + }); + } + }), + columns: { + name: {header: 'PACKAGE'}, + status: {header: 'STATUS'}, + comment: {header: 'COMMENT'}, + }, +}); + +module.exports = lando => { + // default options + const options = { + 'yes': { + describe: 'Runs non-interactively with all accepted default answers', + alias: ['y'], + default: !require('is-interactive'), + boolean: true, + }, + }; + + return { + command: 'update', + describe: 'Updates lando', + options, + run: async options => { + const sortBy = require('lodash/sortBy'); + const ux = lando.cli.getUX(); + // get updatable items + ux.action.start('Generating plugin/cli update matrix'); + const checks = await lando.updates.check(); + const updatesAvailable = checks.some(result => result.updateAvailable !== false); + ux.action.stop(updatesAvailable ? `${color.green('done')} ${color.dim('[see table below]')}` + : `${color.green('done')} ${color.dim('[nothing to update]')}`); + + // show plugin install status/summary and prompt if needed + if (updatesAvailable && options.yes === false) { + // map into things for tabular display + const items = checks.map(item => { + if (item.update && item.update.error) item.state = 'ERROR'; + else if (!item.isUpdateable) item.state = 'CANNOT UPDATE'; + else if (item.updateAvailable === false) item.state = 'NO UPDATE'; + else item.state = 'HAS UPDATE'; + return item; + }); + + const {rows, columns} = getStatusTable(items); + const summary = getStatusGroups(items); + + // print table + console.log(''); + ux.ux.table(sortBy(rows, ['row', 'name']), columns); + console.log(''); + + // things are good! + if (summary['ERROR'] === 0) { + console.log(`Lando would like to update ${summary['HAS UPDATE']} package(s) listed above.`); + const answer = await ux.confirm(color.bold('DO YOU CONSENT?')); + if (!answer) throw new Error('Update terminated!'); + + // things are probably not ok + } else { + console.log(`Lando has detected that ${summary['ERROR']} package(s) listed above has update errors.`); // eslint-disable-line max-len + console.log(color.magenta(`It may be wise to resolve their issues before updating the other ${summary['HAS UPDATE']}!`)); // eslint-disable-line max-len + console.log(''); + const answer = await ux.confirm(color.bold('DO YOU STILL WISH TO CONTINUE?')); + if (!answer) throw new Error('Update terminated!'); + } + } + + // resolve to unique and installable list of items + const tasks = await lando.updates.getUpdateTasks(); + // try to update the plugins + const {errors, results} = await lando.runTasks(tasks, { + renderer: 'lando', + rendererOptions: { + level: 0, + }, + }); + + // flush relevant caches + lando.cli.clearTaskCaches(); + lando.cache.remove('updates-2'); + + // we didnt have to do anything + if (errors.length === 0 && results.length === 0) { + console.log(`As far as ${color.bold('lando update')} can tell you are already ${color.green('up to date!')}`); + return; + } + + // if we had errors + if (errors.length > 0) { + const error = new Error(`An update error occured! Rerun with ${color.bold('lando update --debug')} for more info.`); // eslint-disable-line max-len + lando.log.debug('%j', errors[0]); + throw error; + } + + // success! + if (errors.length === 0 && results.length > 0) { + console.log(`Updated ${color.green(results.length)} of ${color.bold(results.length)} packages successfully!`); + console.log(`You are now ${color.green('up to date!')} with the latest and greatest!`); + } + }, + }; +}; diff --git a/tasks/version.js b/tasks/version.js index 6e394f7b7..655ad1fe7 100644 --- a/tasks/version.js +++ b/tasks/version.js @@ -1,5 +1,22 @@ 'use strict'; -const _ = require('lodash'); + +const get = require('lodash/get'); +const sortBy = require('lodash/sortBy'); + +// assumes non-scoped plugins are lando ones +const normalize = name => { + // if name is not a string then just return false? + if (typeof name !== 'string') return false; + // split it + const parts = name.split('/'); + // if only one part assume its the package + // @NOTE: is that a good assumption? + if (parts.length === 1) return ['@lando', parts[0]].join('/'); + // if length is two then reassemble + else if (parts.length === 2) return parts.join('/'); + // or just return i guess? + else return name; +}; module.exports = lando => ({ command: 'version', @@ -7,13 +24,73 @@ module.exports = lando => ({ describe: 'Displays the lando version', options: { all: { - describe: 'Shows additional version information', - alias: ['-a'], + describe: 'Show all version information', + alias: ['a'], + type: 'boolean', + }, + component: { + describe: 'Show version info for specific component', + alias: ['c'], + type: 'string', + default: '@lando/core', + }, + full: { + describe: 'Show full version string', + alias: ['f'], + type: 'boolean', }, }, run: options => { - const versions = _.merge({}, lando.versions, {lando: lando.config.version}); - if (options.all) console.log(versions); - else console.log(`v${versions.lando}`); + // get UX + const ux = lando.cli.getUX(); + // normalize component + options.component = normalize(options.component); + // start by getting the core version + const versions = {'@lando/core': `v${lando.config.version}`}; + + // if full/all and component = cli then add cli + if (options.full || options.all || options.component === '@lando/cli') { + versions['@lando/cli'] = `v${get(lando, 'config.cli.version', lando.config.version)}`; + } + + // if all or component is non cli/core then also add all our plugin versions + if (options.all || (options.component !== '@lando/core' && options.component !== '@lando/cli')) { + const Plugin = require('../components/plugin'); + for (const data of lando.config.plugins) { + const plugin = new Plugin(data.dir); + // if we are an internal lando core in packaged dev version then reset any core plugin to match that + if (lando.config.cli + && lando.config.cli.dev + && lando.config.cli.coreBase + && plugin.package === '@lando/core') { + plugin.version = lando.config.version; + } + + // then set the version + versions[plugin.name] = `v${plugin.version}`; + } + } + + // if full then update all versions with their full variant + if (options.full) { + const os = `${lando.config.os.platform}-${lando.config.os.arch}`; + const node = `node-${lando.config.node}`; + const cli = `cli-${versions['@lando/cli']}`; + for (const [name, version] of Object.entries(versions)) { + versions[name] = `${name}/${version} ${os} ${node} ${cli}`; + } + } + + // show it all + if (options.all) { + const rows = Object.entries(versions).map(([name, version]) => ({name, version})); + console.log(); + ux.table(sortBy(rows, ['name']), {name: {}, version: {}}); + console.log(); + return; + } + + // if we get here then just print component version + console.log(versions[options.component]); }, }); diff --git a/test/cache.spec.js b/test/cache.spec.js index 65a649ba3..9741dc7f9 100644 --- a/test/cache.spec.js +++ b/test/cache.spec.js @@ -9,7 +9,6 @@ const _ = require('lodash'); const chai = require('chai'); const expect = chai.expect; const sinon = require('sinon'); -const filesystem = require('mock-fs'); const fs = require('fs'); const NodeCache = require('node-cache'); chai.should(); @@ -17,6 +16,10 @@ chai.should(); const Cache = require('./../lib/cache'); describe('cache', () => { + beforeEach(() => { + fs.rmSync('/tmp/cache', {recursive: true, force: true}); + }); + describe('#Cache', () => { it('should return a cache instance with correct default options', () => { const cache = new Cache(); @@ -36,29 +39,19 @@ describe('cache', () => { }); it('should return a cache instance with custom cachedir option', () => { - filesystem(); - const cache = new Cache({cacheDir: '/tmp/cache'}); cache.should.have.property('cacheDir', '/tmp/cache'); - - filesystem.restore(); }); it('should create the cache directory', () => { - filesystem(); - const cache = new Cache({cacheDir: '/tmp/cache'}); cache.should.have.property('cacheDir', '/tmp/cache'); fs.existsSync('/tmp/cache').should.be.true; - - filesystem.restore(); }); }); describe('#__get', () => { it('should be the same as new NodeCache().get', () => { - filesystem(); - const cache = new Cache(); cache.set('yyz', 'amazing'); @@ -66,27 +59,19 @@ describe('cache', () => { nCache.set('yyz', 'amazing'); cache.__get('yyz').should.eql(nCache.get('yyz')); - - filesystem.restore(); }); }); describe('#__set', () => { it('should be the same as new NodeCache().set', () => { - filesystem(); - const cache = new Cache(); const nCache = new NodeCache(); cache.__set('yyz', 'amazing').should.eql(nCache.set('yyz', 'amazing')); - - filesystem.restore(); }); }); describe('#__del', () => { it('should be the same as new NodeCache().del', () => { - filesystem(); - const cache = new Cache(); const nCache = new NodeCache(); cache.__set('yyz', 'amazing'); @@ -95,20 +80,14 @@ describe('cache', () => { const returntwo = nCache.del('yyz'); returnone.should.eql(returntwo); - - filesystem.restore(); }); }); describe('#set', () => { it('should set a cached key in memory', () => { - filesystem(); - const cache = new Cache({cacheDir: '/tmp/cache'}); cache.set('yyz', 'amazing'); fs.existsSync('/tmp/cache/yyz').should.be.false; - - filesystem.restore(); }); it('should log a failure when key cannot be cached in memory', () => { @@ -121,7 +100,6 @@ describe('cache', () => { }); it('should remove a cached key in memory after ttl has expired', () => { - filesystem(); const clock = sinon.useFakeTimers(); const cache = new Cache(); @@ -133,15 +111,12 @@ describe('cache', () => { expect(cache.get('yyz')).to.be.undefined; clock.restore(); - filesystem.restore(); }); it('should set a cached key in a file if persist is set', () => { - filesystem(); const cache = new Cache({cacheDir: '/tmp/cache'}); cache.set('yyz', 'amazing', {persist: true}); fs.existsSync('/tmp/cache/yyz').should.be.true; - filesystem.restore(); }); it('should throw an error for unsafe cache keys', () => { @@ -158,7 +133,6 @@ describe('cache', () => { }); it('should fail to return a cached key from memory if ttl is expired', () => { - filesystem(); const clock = sinon.useFakeTimers(); const cache = new Cache(); @@ -170,15 +144,12 @@ describe('cache', () => { expect(cache.get('yyz')).to.be.undefined; clock.restore(); - filesystem.restore(); }); it('should return a cached key from file if persists is set', () => { - filesystem(); const cache = new Cache({cacheDir: '/tmp/cache'}); cache.set('yyz', 'amazing', {persist: true}); cache.get('yyz').should.eql('amazing'); - filesystem.restore(); }); it('should return undefined when grabbing an unset key', () => { @@ -200,7 +171,6 @@ describe('cache', () => { }); it('should remove file for cached key if it was persistent', () => { - filesystem(); const cache = new Cache({cacheDir: '/tmp/cache/'}); cache.set( 'subdivisions', @@ -212,7 +182,6 @@ describe('cache', () => { cache.remove('subdivisions'); fs.existsSync('/tmp/cache/subdivisions').should.be.false; - filesystem.restore(); }); it('should log a failure when key cannot be removed from memory', () => { diff --git a/test/get-compose-x.spec.js b/test/get-compose-x.spec.js index 7c5d4f575..1c3d71ad9 100644 --- a/test/get-compose-x.spec.js +++ b/test/get-compose-x.spec.js @@ -26,6 +26,7 @@ const resetPlatform = () => { const getComposeExecutable = require('../utils/get-compose-x'); const getDockerBinPath= require('../utils/get-docker-bin-path'); +require('../utils/get-compose-bin-path'); describe('get-compose-x', () => { it('should return the correct lando-provided path on win32', () => { diff --git a/test/lando.spec.js b/test/lando.spec.js index 1fbcb1c18..e2ee3eaa9 100644 --- a/test/lando.spec.js +++ b/test/lando.spec.js @@ -7,7 +7,6 @@ // Setup chai. const chai = require('chai'); -const filesystem = require('mock-fs'); const fs = require('fs'); const os = require('os'); const path = require('path'); @@ -25,6 +24,10 @@ const cliMock = { // This is the file we are testing describe('lando', () => { + beforeEach(() => { + fs.rmSync('/tmp/cache', {recursive: true, force: true}); + }); + describe('#Lando', () => { // @todo: do we need a stronger test? presumably downstream requires handle that? it('should return a Lando instance with correct default options', () => { @@ -33,22 +36,18 @@ describe('lando', () => { }); it('should use prexisting instance id if possible', () => { - filesystem({ - '/tmp/cache/id': '"24601"', - }); + fs.mkdirSync('/tmp/cache', {recursive: true}); + fs.writeFileSync('/tmp/cache/id', '"24601"'); const lando = new Lando({userConfRoot: '/tmp'}); lando.config.id.should.equal('24601'); lando.config.user.should.equal('24601'); - filesystem.restore(); }); it('should set and persitent cache an instance id if needed', () => { - filesystem(); const lando = new Lando({userConfRoot: os.tmpdir()}); const idPath = path.join(lando.config.userConfRoot, 'cache', 'id'); fs.existsSync(idPath).should.be.true; lando.cache.get('id').should.equal(lando.config.id); - filesystem.restore(); }); }); diff --git a/test/merge.spec.js b/test/legacy-merge.spec.js similarity index 96% rename from test/merge.spec.js rename to test/legacy-merge.spec.js index 01a1f9435..ab1af3f5d 100644 --- a/test/merge.spec.js +++ b/test/legacy-merge.spec.js @@ -11,7 +11,7 @@ const expect = chai.expect; const hasher = require('object-hash'); chai.should(); -const merge = require('../utils/merge'); +const merge = require('../utils/legacy-merge'); describe('merge', () => { it('should return the same as _.merge for objects', () => { diff --git a/test/logger.spec.js b/test/logger.spec.js index a2c5290d4..096b5f839 100644 --- a/test/logger.spec.js +++ b/test/logger.spec.js @@ -8,7 +8,6 @@ const _ = require('lodash'); const chai = require('chai'); const EventEmitter = require('events').EventEmitter; -const filesystem = require('mock-fs'); const fs = require('fs'); const path = require('path'); chai.should(); @@ -16,6 +15,10 @@ chai.should(); const Log = require('./../lib/logger'); describe('logger', () => { + beforeEach(() => { + fs.rmSync('/tmp/logz', {recursive: true, force: true}); + }); + describe('#Log', () => { it('should return a Log instance with correct default options', () => { const log = new Log(); @@ -54,7 +57,6 @@ describe('logger', () => { // lazy requires on the mock filesystem and CAN'T FIND SHIT // @see: https://github.com/tschaub/mock-fs/issues/213 require(path.resolve('./node_modules/winston/lib/winston/transports/file')).File; - filesystem(); const log = new Log({logDir: '/tmp/logz', logLevel: 'warn'}); fs.existsSync('/tmp/logz').should.be.true; _.forEach(['error-file', 'log-file'], transport => { @@ -62,7 +64,6 @@ describe('logger', () => { log.transports[transport].should.be.instanceof(EventEmitter); log.transports[transport].should.have.property('level', 'warn'); }); - filesystem.restore(); }); }); }); diff --git a/test/updates.spec.js b/test/updates.spec.js index 2b893d958..8ac62ba9a 100644 --- a/test/updates.spec.js +++ b/test/updates.spec.js @@ -11,9 +11,6 @@ chai.use(require('sinon-chai')); chai.use(require('chai-as-promised')); chai.should(); -const Github = require('github'); -const Promise = require('../lib/promise'); - const UpdateManager = require('./../lib/updates'); const updates = new UpdateManager(); @@ -62,49 +59,4 @@ describe('updates', () => { clock.restore(); }); }); - - describe('#refresh', () => { - // We need a Github API Client to stub. - const github = new Github({Promise: Promise}); - // Use our stubbed Github API so we don't make a real HTTP request. - updates.githubApi = github; - - it('should use current or specified version of there is an error getting updated data', () => { - // Throw an error on purpose - const stub = sinon.stub(updates.githubApi.repos, 'getReleases').rejects('Whoops!'); - // If something goes wrong with the Github API, handle it gracefully. - return updates.refresh('vlolnotrealversion').should.eventually.be - .an('object').with.property('version', 'lolnotrealversion') - .then(() => stub.restore()); - }); - - it('should return the first non draft or prerelease release data', () => { - const mockReleaseData = {data: [ - { - tag_name: 'v1', - prerelease: true, - draft: false, - }, - { - tag_name: 'v2', - prerelease: false, - draft: true, - }, - { - tag_name: 'v3', - prerelease: false, - draft: false, - html_url: 'crashoverride', - }, - ]}; - const stub = sinon.stub(updates.githubApi.repos, 'getReleases').callsFake(() => Promise.resolve(mockReleaseData)); - return updates.refresh('beta.2') - .then(data => { - data.should.be.an('object'); - data.version.should.equal('3'); - data.url.should.equal('crashoverride'); - }) - .then(() => stub.restore()); - }); - }); }); diff --git a/test/yaml.spec.js b/test/yaml.spec.js index 0f746134c..1af9a397a 100644 --- a/test/yaml.spec.js +++ b/test/yaml.spec.js @@ -47,7 +47,7 @@ describe('yaml', () => { describe('#dump', () => { beforeEach(() => { - filesystem(); + fs.rmSync('/tmp/test', {recursive: true, force: true}); }); it('should create the directory for the file if it does not exist', () => { @@ -69,9 +69,5 @@ describe('yaml', () => { const file = yaml.dump('/tmp/test/file.yml', {}); expect(file).to.equal('/tmp/test/file.yml'); }); - - afterEach(() => { - filesystem.restore(); - }); }); }); diff --git a/utils/add-v3-build-step.js b/utils/add-v3-build-step.js index b441fce6a..dd853bfce 100644 --- a/utils/add-v3-build-step.js +++ b/utils/add-v3-build-step.js @@ -2,6 +2,7 @@ const _ = require('lodash'); +// checks to see if a setting is disabled module.exports = (steps, app, name, step = 'build_internal', front = false) => { const current = _.get(app, `config.services.${name}.${step}`, []); const add = (front) ? _.flatten([steps, current]) : _.flatten([current, steps]); diff --git a/utils/build-config.js b/utils/build-config.js index a5d96ec17..e417054fb 100644 --- a/utils/build-config.js +++ b/utils/build-config.js @@ -19,14 +19,14 @@ module.exports = options => { // Modules const hasher = require('object-hash'); - const merge = require('../utils/merge'); + const lmerge = require('./legacy-merge'); const getConfigDefaults = require('../utils/get-config-defaults'); const getEngineConfig = require('../utils/get-engine-config'); const getOclifCacheDir = require('../utils/get-cache-dir'); const stripEnv = require('../utils/strip-env'); // Start building the config - let config = merge(getConfigDefaults(options), options); + let config = lmerge(getConfigDefaults(options), options); // add the core config.yaml as a config source if we have it, ideally splice it in after the cli config // but if we cant then just put it at the beginning @@ -44,18 +44,18 @@ module.exports = options => { // If we have configSources let's merge those in as well if (!_.isEmpty(config.configSources)) { - config = merge(config, require('../utils/load-config-files')(config.configSources)); + config = lmerge(config, require('../utils/load-config-files')(config.configSources)); } // @TODO: app plugin dir gets through but core yml does not? // If we have an envPrefix set then lets merge that in as well if (_.has(config, 'envPrefix')) { - config = merge(config, require('../utils/load-env')(config.envPrefix)); + config = lmerge(config, require('../utils/load-env')(config.envPrefix)); } // special handling for LANDO_PLUGIN_CONFIG if (_.keys(config, 'envPrefix')) { - config = merge(config, require('../utils/load-env-plugin-config')(config.envPrefix)); + config = lmerge(config, require('../utils/load-env-plugin-config')(config.envPrefix)); } // Add some final computed properties to the config @@ -81,9 +81,16 @@ module.exports = options => { delete config.orchestratorBin; } + // if orchestrator is not a valid version then remove it and try to use a system provided orchestartor + if (require('semver/functions/valid')(config.orchestratorVersion) === null) { + config.orchestratorBin = require('./get-compose-x')(config); + delete config.orchestratorVersion; + } + // if we still have an orchestrator version at this point lets try to suss out its major version if (config.orchestratorVersion && require('semver/functions/valid')(config.orchestratorVersion)) { config.orchestratorMV = require('semver/functions/major')(config.orchestratorVersion); + config.setup.orchestrator = config.setup.orchestrator ?? config.orchestratorVersion; } // Add some docker compose protection on windows @@ -94,7 +101,6 @@ module.exports = options => { config.env.COMPOSE_COMPATIBILITY = config.orchestratorSeparator === '_'; // config.env.COMPOSE_ANSI='always'; - // Get hyperdrive lando config file location config.hconf = path.join(getOclifCacheDir(config.hyperdrive), `${config.product}.json`); // Return the config diff --git a/utils/config-2-lopts.js b/utils/config-2-lopts.js new file mode 100644 index 000000000..9e3d7da86 --- /dev/null +++ b/utils/config-2-lopts.js @@ -0,0 +1,27 @@ +'use strict'; + +/* + * brief wrapper to accomodate lando 3 conventions when using lando 4 plugin fetching + */ +module.exports = (config = {}, auth = [], scope = []) => { + // if auth if a string hing push directly + if (typeof config.auth === 'string') auth.push(config.auth); + + // if either regsitry of scope is a strinbg then just push + if (typeof config.registry === 'string') scope.push(config.registry); + else if (typeof config.scope === 'string') scope.push(config.scope); + + // if auth is an object then arrify + if (typeof config.auth === 'object' && config.auth !== null) { + for (const [key, value] of Object.entries(config.auth)) auth.push(`${key}=${value}`); + } + + // ditto for scop/registry + ['registry', 'scope'].forEach(part => { + if (typeof config[part] === 'object' && config[part] !== null) { + for (const [key, value] of Object.entries(config[part])) scope.push(`${key}=${value}`); + } + }); + + return {auth, scope}; +}; diff --git a/utils/download-x.js b/utils/download-x.js new file mode 100644 index 000000000..e7b7649b5 --- /dev/null +++ b/utils/download-x.js @@ -0,0 +1,102 @@ +'use strict'; + +const axios = require('axios'); +const fs = require('fs'); +const os = require('os'); +const path = require('path'); + +const {EventEmitter} = require('events'); +const {nanoid} = require('nanoid'); + +// helper to get a platform spec tmpfile +const tmpfile = () => { + return process.platform === 'win32' ? path.join(os.tmpdir(), `${nanoid()}.exe`) : path.join(os.tmpdir(), nanoid()); +}; + +module.exports = (url, { + debug = require('debug')('@lando/download-x'), + dest = path.join(os.tmpdir(), nanoid()), + test = false} = {}, +) => { + // create an event emitter we can return + const download = new EventEmitter(); + // download progress event + const onDownloadProgress = data => { + data.percentage = Math.round(data.progress * 100); + download.emit('progress', data); + debug('downloading %o to %o... (%o%)', url, dest, data.percentage); + }; + + // get the stream and start writing + axios({url, responseType: 'stream', onDownloadProgress}).then(response => new Promise((resolve, reject) => { + // emit response and add the data stream to the event emitter + download.emit('response', response); + // set some props for later + download.data = response.data; + download.status = response.status; + download.statusText = response.statusText; + + // get a temporary destination test file and writer + download.testfile = tmpfile(); + const writer = fs.createWriteStream(download.testfile); + // and write dat data + response.data.pipe(writer); + // resolve promise + writer.on('error', error => reject(error)); + writer.on('close', () => resolve()); + // debug + debug('downloading %o %o with code %o', url, response.statusText, response.status); + })) + + // an error has occured + .catch(error => { + error.message = `could not download ${url} [${error.response.status}] ${error.response.statusText}`; + debug(error.message); + // debug('%o', error); + download.error = error; + download.emit('error', download.error); + }) + + // trust but verify + .finally(async () => { + // if the file exists then try to finish up + if (fs.existsSync(download.testfile)) { + require('./make-executable')([path.basename(download.testfile)], path.dirname(download.testfile)); + // run the test if we have one + download.test = test ? require('./spawn-sync-stringer')(download.testfile, test) : false; + const {pid, status, stderr, stdout} = download.test; + + // if we have a test and it succeeded just let the people know + if (download.test !== false && download.test.status === 0) { + debug('%o download test %o passed with %o', url, test.join(' '), stdout); + } + + // if we have a test and it failed then yet another error + if (download.test !== false && download.test.status !== 0) { + const error = new Error(`${url} download test ${test.join(' ')} failed with code ${status} and ${stderr}`); + error.pid = pid; + error.stdout = stdout; + error.status = status; + debug(error.message); + download.emit('error', error); + + // otherwise we assume all is well and we emit success! + } else { + if (fs.existsSync(dest)) fs.unlinkSync(dest); + fs.copyFileSync(download.testfile, dest); + debug('downloaded %o to %o', url, dest); + const data = {dest, url, test: download.test, status: download.status, text: download.statusText}; + download.emit('success', data); + download.emit('done', data); + } + } + }); + + // merge promise magix so we can await or not + return require('./merge-promise')(download, async () => { + return new Promise((resolve, reject) => { + download.on('error', error => reject(error)); + download.on('success', success => resolve(success)); + }); + }); +}; diff --git a/utils/fetch-plugin.js b/utils/fetch-plugin.js new file mode 100644 index 000000000..9fdc463fd --- /dev/null +++ b/utils/fetch-plugin.js @@ -0,0 +1,34 @@ +'use strict'; + +const fs = require('fs-extra'); +const path = require('path'); + +/* + * brief wrapper to accomodate lando 3 conventions when using lando 4 plugin fetching + */ +module.exports = async (spec, opts, Plugin = require('../components/plugin')) => { + // attempt to fetch the plugin + const plugin = await Plugin.fetch(spec, opts); + + // lando 3 plugin loading is at odds with lando 4 plugin installing so we need to move up a directory + // if the plugin has non-lando org scope also clean up dangling org dir + if (plugin.scope && plugin.scope !== '@lando') { + const src = plugin.location; + const dest = path.resolve(plugin.location, '..', '..', plugin.name.split('/')[1]); + const orgDir = path.resolve(plugin.location, '..', '..', plugin.name.split('/')[0]); + + // move and log + fs.moveSync(src, dest, {overwrite: true}); + plugin.debug('non-lando org scoped plugin detected, moved up a dir to %s', dest); + // remove and log + fs.removeSync(path.resolve(src, '..'), {recursive: true}); + plugin.debug('removed dangling and presumably/hopefully empty org scope dir %s', orgDir); + + // get the plugin info again to confirm we moved it to the correct place + // @NOTE: we use new Plugin() here instead of Plugin.info to ensure plugin remains consistent + return new Plugin(dest); + } + + // otherwise return the original + return plugin; +}; diff --git a/utils/get-config-defaults.js b/utils/get-config-defaults.js index e5ba2477b..900a53d17 100644 --- a/utils/get-config-defaults.js +++ b/utils/get-config-defaults.js @@ -8,7 +8,7 @@ const os = require('os'); // Default config const defaultConfig = options => ({ orchestratorSeparator: '_', - orchestratorVersion: '2.21.0', + orchestratorVersion: '2.23.0', configSources: [], disablePlugins: [], dockerBin: require('../utils/get-docker-x')(), @@ -27,6 +27,55 @@ const defaultConfig = options => ({ pluginDirs: [{path: path.join(__dirname, '..'), subdir: 'plugins', namespace: '@lando'}], plugins: [{name: '@lando/core', path: path.join(__dirname, '..'), type: 'local'}], userConfRoot: os.tmpdir(), + + // this governs both autosetup and the defaults of lando setup + // @TODO: orchestrator works a bit differently because it predates lando.setup() we set it elsewhere + setup: { + buildEngine: process.platform === 'linux' ? '24.0.7' : '4.25.2', + buildEngineAcceptLicense: !require('is-interactive')(), + commonPlugins: { + '@lando/acquia': 'latest', + '@lando/apache': 'latest', + '@lando/backdrop': 'latest', + '@lando/compose': 'latest', + '@lando/dotnet': 'latest', + '@lando/drupal': 'latest', + '@lando/elasticsearch': 'latest', + '@lando/go': 'latest', + '@lando/joomla': 'latest', + '@lando/lagoon': 'latest', + '@lando/lamp': 'latest', + '@lando/laravel': 'latest', + '@lando/lemp': 'latest', + '@lando/mailhog': 'latest', + '@lando/mariadb': 'latest', + '@lando/mean': 'latest', + '@lando/memcached': 'latest', + '@lando/mongo': 'latest', + '@lando/mssql': 'latest', + '@lando/mysql': 'latest', + '@lando/nginx': 'latest', + '@lando/node': 'latest', + '@lando/pantheon': 'latest', + '@lando/php': 'latest', + '@lando/phpmyadmin': 'latest', + '@lando/platformsh': 'latest', + '@lando/postgres': 'latest', + '@lando/python': 'latest', + '@lando/redis': 'latest', + '@lando/ruby': 'latest', + '@lando/solr': 'latest', + '@lando/symfony': 'latest', + '@lando/tomcat': 'latest', + '@lando/varnish': 'latest', + '@lando/wordpress': 'latest', + }, + installPlugins: true, + installTasks: true, + plugins: {}, + tasks: [], + skipCommonPlugins: _.get(options, 'fatcore', false), + }, }); /* diff --git a/utils/get-plugin-add-task.js b/utils/get-plugin-add-task.js new file mode 100644 index 000000000..727485ec7 --- /dev/null +++ b/utils/get-plugin-add-task.js @@ -0,0 +1,52 @@ +'use strict'; + +const os = require('os'); +const path = require('path'); + +// checks to see if a setting is disabled +module.exports = (plugin, { + dir = os.tmpdir(), + Plugin = require('../components/plugin'), +} = {}) => { + // parse into a full package + const pkg = require('./parse-package-name')(plugin); + + return { + title: `Adding ${pkg.raw}`, + id: `install-${pkg.name}`, + description: pkg.name, + isInstalled: async () => { + const location = pkg.scope === '@lando' + ? path.join(dir, '@lando', pkg.package) : path.join(dir, pkg.package); + + try { + const plugin = new Plugin(location); + return plugin.isInstalled && plugin.isValid; + } catch { + return false; + } + }, + canInstall: async () => { + const online = await require('is-online')(); + // throw error if not online + if (!online) throw new Error('Cannot detect connection to internet!'); + // attempt ti get info on the plugin + await Plugin.info(plugin); + }, + task: async (ctx, task) => { + try { + // add the plugin + task.plugin = await require('./fetch-plugin')(plugin, {config: Plugin.config, dest: dir}, Plugin); + // update and and return + task.title = `Installed ${task.plugin.name}@${task.plugin.version} to ${task.plugin.location}`; + return task.plugin; + + // if we have an error then add it to the status object and throw + // @TODO: make sure we force remove any errered plugins? + } catch (error) { + error.plugin = task.plugin; + throw error; + } + }, + }; +}; diff --git a/utils/get-plugin-config.js b/utils/get-plugin-config.js new file mode 100644 index 000000000..ac0d07086 --- /dev/null +++ b/utils/get-plugin-config.js @@ -0,0 +1,12 @@ +'use strict'; + +const fs = require('fs'); +const merge = require('lodash/merge'); +const read = require('./read-file'); + +module.exports = (file, config = {}) => { + // if config file exists then rebase config on top of it + if (fs.existsSync(file)) return merge({}, read(file), config); + // otherwise return config alone + return config; +}; diff --git a/utils/get-plugin-remove-task.js b/utils/get-plugin-remove-task.js new file mode 100644 index 000000000..3bd8aeb23 --- /dev/null +++ b/utils/get-plugin-remove-task.js @@ -0,0 +1,45 @@ +'use strict'; + +// checks to see if a setting is disabled +module.exports = (plugin, { + fallback = 'unknown plugin', + Plugin = require('../components/plugin'), +} = {}) => { + const name = plugin && plugin.name ? plugin.name : fallback; + return { + title: `Removing ${name}`, + task: async (ctx, task) => { + try { + // add a short wait for ux purposes + await require('delay')(Math.floor(Math.random() * 2000)); + + // if we cannot find the plugin then error? + if (!plugin) throw Error(`Could not find plugin ${name}!`); + + // instantiate plugin and remove + task.plugin = new Plugin(plugin.dir); + + // do not allow removal of core plugins + if (task.plugin.core) { + task.skip(`Cannot remove core plugin ${task.plugin.name}`); + return; + } + + // if we get here tehn we can remove + task.plugin.remove(); + + // update and and return + task.title = `Removed ${task.plugin.name}@${task.plugin.version} from ${task.plugin.location}`; + ctx.results.push(task.plugin); + return task.plugin; + + // if we have an error then add it to the status object and throw + // @TODO: make sure we force remove any errered plugins? + } catch (error) { + error.plugin = task.plugin; + ctx.errors.push(error); + throw error; + } + }, + }; +}; diff --git a/utils/get-plugin-type.js b/utils/get-plugin-type.js new file mode 100644 index 000000000..78f508ca5 --- /dev/null +++ b/utils/get-plugin-type.js @@ -0,0 +1,3 @@ +'use strict'; + +module.exports = plugin => require('is-root')() ? 'system' : 'user'; diff --git a/utils/get-plugin-update-task.js b/utils/get-plugin-update-task.js new file mode 100644 index 000000000..1173290cb --- /dev/null +++ b/utils/get-plugin-update-task.js @@ -0,0 +1,39 @@ +'use strict'; + +const os = require('os'); + +// checks to see if a setting is disabled +module.exports = (plugin, { + dir = os.tmpdir(), + Plugin = require('../components/plugin'), +} = {}) => { + // parse into a full package + const pkg = require('./parse-package-name')(plugin); + + return { + title: `Updating ${pkg.name} to v${pkg.peg}`, + description: pkg.name, + canInstall: async () => { + const online = await require('is-online')(); + // throw error if not online + if (!online) throw new Error('Cannot detect connection to internet!'); + // or true + return true; + }, + task: async (ctx, task) => { + try { + // add the plugin + task.plugin = await require('./fetch-plugin')(plugin, {config: Plugin.config, dest: dir}, Plugin); + // update and and return + task.title = `Updated ${task.plugin.name} to v${task.plugin.version}`; + return task.plugin; + + // if we have an error then add it to the status object and throw + // @TODO: make sure we force remove any errered plugins? + } catch (error) { + error.plugin = task.plugin; + throw error; + } + }, + }; +}; diff --git a/utils/is-admin-user.js b/utils/is-admin-user.js new file mode 100644 index 000000000..6c4ea9374 --- /dev/null +++ b/utils/is-admin-user.js @@ -0,0 +1,20 @@ +'use strict'; + +const os = require('os'); + +module.exports = user => { + // set user to person running this process if its not set + if (!user) user = os.userInfo().username; + + // differetn strokes, different folks + switch (process.platform) { + case 'darwin': + return require('./is-group-member')('admin', user); + case 'linux': + return require('./is-group-member')('sudo', user); + case 'win32': + return require('./is-group-member')('administrators', user); + default: + return false; + } +}; diff --git a/utils/is-group-member.js b/utils/is-group-member.js new file mode 100644 index 000000000..4cf3842e7 --- /dev/null +++ b/utils/is-group-member.js @@ -0,0 +1,34 @@ +'use strict'; + +const os = require('os'); + +const posixCmd = user => (['groups', [user]]); +const win32Cmd = group => (['net', ['localgroup', group]]); + +module.exports = (group, user) => { + // @TODO: throw error if no group specified? + // set user to person running this process if its not set + if (!user) user = os.userInfo().username; + + // get the result of the membership command + const cmd = process.platform === 'win32' ? win32Cmd(group) : posixCmd(user); + const {status, stdout, stderr} = require('./spawn-sync-stringer')(...cmd); + + // if we failed for some reason + if (status !== 0) throw new Error(`Could not determine group situation: ${stderr}`); + + // mac and linux + if (process.platform === 'darwin' || process.platform === 'linux') { + const groups = stdout.split(' ').map(group => group.trim()); + return groups.includes(group); + } + + // if windows we have a long command to check + if (process.platform === 'win32') { + const lines = stdout.split(os.EOL).map(group => group.trim()); + return lines.includes(user); + } + + // otherwise false? + return false; +}; diff --git a/utils/legacy-merge.js b/utils/legacy-merge.js new file mode 100644 index 000000000..21c6a961a --- /dev/null +++ b/utils/legacy-merge.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = (old, ...fresh) => require('lodash/mergeWith')(old, ...fresh, (s, f) => { + if (Array.isArray(s)) return require('lodash/uniq')(s.concat(f)); +}); diff --git a/utils/load-config-files.js b/utils/load-config-files.js index 39612b775..bee2bcf06 100644 --- a/utils/load-config-files.js +++ b/utils/load-config-files.js @@ -71,4 +71,4 @@ module.exports = files => _(files) return source; }) // Start collecting - .reduce((a, source) => require('./merge')(a, source.data), {}); + .reduce((a, source) => require('./legacy-merge')(a, source.data), {}); diff --git a/utils/lopts-2-popts.js b/utils/lopts-2-popts.js new file mode 100644 index 000000000..82e1cbe9d --- /dev/null +++ b/utils/lopts-2-popts.js @@ -0,0 +1,59 @@ +'use strict'; + +const parseND = require('./parse-nerfdart'); + +/* + * brief wrapper to accomodate lando 3 conventions when using lando 4 plugin fetching + */ +module.exports = (options = {}, popts = {}) => { + // if we only have one registry/scope and its global then set registry + if (options.registry && options.registry.length === 1 && options.registry[0].split('=').length === 1) { + popts.registry = options.registry[0]; + } else if (options.scope && options.scope.length === 1 && options.scope[0].split('=').length === 1) { + popts.registry = options.scope[0]; + + // otherwise loop through the scopes and set them correctly + } else { + for (const scope of options.scope) { + // get key and value + const key = scope.split('=')[0]; + const value = scope.split('=')[1]; + + // get org scope amd strip @ so we can handle both @ and non-@ scopes downstream + const org = key.split(':')[0].replace('@', ''); + // determine the scope key, usually this is just the assumed to be the registry + const skey = key.split(':')[1] || 'registry'; + + // set + popts[`@${org}:${skey}`] = value; + } + } + + // if we only have one auth and its not scoped then set forceAuth with assumed token + if (options.auth && options.auth.length === 1 && options.auth[0].split('=').length === 1) { + popts.forceAuth = {'_authToken': options.auth[0]}; + + // otherwise loops through the auths and set them correctly + } else { + for (const auth of options.auth) { + // get key and value and key parts + let key = auth.split('=')[0]; + const value = auth.split('=')[1]; + + // start by trying to translate org scopes into registry urls + if (popts[`@${key.split(':')[0].replace('@', '')}:registry`]) { + const url = popts[`@${key.split(':')[0].replace('@', '')}:registry`]; + const pathname = key.split(':')[1] || '_authToken'; + const {registry, method} = parseND(`${url}/${pathname}`); + key = `${registry}${method}`; + } + + // then parse key into nerfdart component pieces and fill defaults if needed + const {registry, method} = parseND(key); + // and set + popts[`${registry}:${method}`] = value; + } + } + + return popts; +}; diff --git a/utils/make-error.js b/utils/make-error.js index baa6c8c25..d81d78d0c 100644 --- a/utils/make-error.js +++ b/utils/make-error.js @@ -27,7 +27,7 @@ module.exports = ({ short = short || (error && error.reason) || (error && error.body && error.body.error); - const message = [stdout, stderr].filter(Boolean).join('\n') || all || error; + const message = [stdout, stderr].filter(Boolean).join('\n') || all || error.message; // repurpose original error if we have one if (Object.prototype.toString.call(error) === '[object Error]') { diff --git a/utils/merge-arrays.js b/utils/merge-arrays.js new file mode 100644 index 000000000..bf8a44ab4 --- /dev/null +++ b/utils/merge-arrays.js @@ -0,0 +1,39 @@ +'use strict'; + +const merge = require('lodash/merge'); + +// @TODO: error handling +module.exports = (a, b, ams = 'replace') => { + // get strat and id if applicable + const strategy = ams.split(':')[0]; + const by = ams.split(':')[1] || 'id'; + + switch (strategy) { + case 'aoa': + return (a.length === 1) ? [a, b] : [...a, b]; + case 'concat': + return a.concat(b); + case 'first': + return a; + case 'last': + return b; + case 'merge': + return Object.entries([a, b] + .filter(Boolean) + .reduce((acc, datum) => { + return merge(acc, Object.fromEntries(datum.map(a => { + // if an object do fancy stuff + if (require('lodash/isPlainObject')(a)) { + if (a.hasOwnProperty(by)) return [a[by], a]; + if (Object.keys(a).length === 1) return [Object.keys(a)[0], a]; + } + // otherwise just return pairself + return [a, a]; + }))); + }, {})) + .map(data => data[1]); + case 'replace': + default: + return merge(a, b); + } +}; diff --git a/utils/merge.js b/utils/merge.js index e503c35ca..3b0a8da84 100644 --- a/utils/merge.js +++ b/utils/merge.js @@ -1,7 +1,35 @@ 'use strict'; -const _ = require('lodash'); +const isObject = require('lodash/isPlainObject'); +const merge = require('lodash/mergeWith'); +const mergeArrays = require('./merge-arrays'); -module.exports = (old, ...fresh) => _.mergeWith(old, ...fresh, (s, f) => { - if (_.isArray(s)) return _.uniq(s.concat(f)); -}); +// @TODO: error handling +module.exports = (object, sources, ams = ['merge:id', 'replace']) => { + // if sources is not an array then make it so + if (!Array.isArray(sources)) sources = [sources]; + + // normalize ams into array + ams = Array.isArray(ams) ? ams : [ams]; + // then break into the things we need + const first = ams[0].split(':')[0]; + const by = ams[0].split(':')[1] || 'id'; + const fallback = ams[1] || 'replace'; + + // then return the merge + return merge(object, ...sources, (objValue, srcValue) => { + // if not an arrayjust proceed normally + if (!Array.isArray(objValue)) return undefined; + // if first strategy is replace then also proceed normally + if (first === 'replace') return undefined; + // if first strategy is merge and some part of objvalue has an object then try to merge with by + if (first === 'merge') { + // if mergable object detected in array then proceed + if (objValue.some(element => isObject(element))) return mergeArrays(objValue, srcValue, `merge:${by}`); + // otherwise return the fallback + return mergeArrays(objValue, srcValue, fallback); + } + // if we get here then just pass it through to mergeArrays + return mergeArrays(objValue, srcValue, first); + }); +}; diff --git a/utils/move-config.js b/utils/move-config.js index 40b2b24ed..aec193967 100644 --- a/utils/move-config.js +++ b/utils/move-config.js @@ -26,7 +26,7 @@ module.exports = (src, dest = os.tmpdir()) => { const f = _.get(error, 'path'); // Catch this so we can try to repair - if (code !== 'EISDIR' || syscall !== 'open' || !!mkdirp.sync(f)) { + if (code !== 'EISDIR' || syscall !== 'open' || !!fs.mkdirSync(f, {recursive: true})) { throw new Error(error); } diff --git a/utils/normalize-manifest-paths.js b/utils/normalize-manifest-paths.js new file mode 100644 index 000000000..65f603978 --- /dev/null +++ b/utils/normalize-manifest-paths.js @@ -0,0 +1,25 @@ +'use strict'; + +const get = require('lodash/get'); +const getKeys = require('./get-object-keys'); +const path = require('path'); +const set = require('lodash/set'); + +const defaultPathyKeys = ['hooks', 'registry', 'tasks']; + +module.exports = (data = {}, base, pathyKeys = defaultPathyKeys) => { + // @TODO: error handling? + + for (const key of getKeys(data)) { + // skip if not a pathy key + if (!defaultPathyKeys.includes(key.split('.')[0])) continue; + // reset data to be an absolute path + // @TODO: should we test if abolute path exists? + if (key && typeof get(data, key) === 'string' && !path.isAbsolute(get(data, key))) { + set(data, key, path.resolve(base, get(data, key))); + } + } + + // then return + return data; +}; diff --git a/utils/parse-init-options.js b/utils/parse-init-options.js index d89b3394c..3b6a1e653 100644 --- a/utils/parse-init-options.js +++ b/utils/parse-init-options.js @@ -14,7 +14,7 @@ module.exports = options => { // Get absolute path of destination options.destination = path.resolve(options.destination); // Create directory if needed - if (!fs.existsSync(options.destination)) mkdirp.sync(options.destination); + if (!fs.existsSync(options.destination)) fs.mkdirSync(options.destination, {recursive: true}); // Set node working directory to the destination // @NOTE: is this still needed? process.chdir(options.destination); diff --git a/utils/parse-nerfdart.js b/utils/parse-nerfdart.js new file mode 100644 index 000000000..ec4d1f0b1 --- /dev/null +++ b/utils/parse-nerfdart.js @@ -0,0 +1,19 @@ + +'use strict'; + +module.exports = (key, registry = 'https://registry.npmjs.org') => { + // if this is valid url then should be easy + try { + const url = new URL(key); + const registry = `//${url.host}/`; + const method = url.pathname.split('/:')[1] || url.pathname.split('/')[1] || '_authToken'; + return {registry, method}; + + // if its not then handle the two cases and recurse + } catch (e) { + // if key starts with // then add a bogus protocol and recurse + if (key.startsWith('//')) return module.exports(`lando:${key}`); + // key needs default + else return module.exports(`${registry}/${key}`); + } +}; diff --git a/utils/parse-package-name.js b/utils/parse-package-name.js new file mode 100644 index 000000000..30fe597fa --- /dev/null +++ b/utils/parse-package-name.js @@ -0,0 +1,18 @@ +'use strict'; + +/* + * TBD + */ +module.exports = (plugin, {defaultTag = 'stable'} = {}) => { + // parse the plugin + const result = require('npm-package-arg')(plugin); + + // add a package property + result.package = result.scope ? result.name.replace(`${result.scope}/`, '') : result.name; + // if we have an explict non-tag peg then lets set it + if (result.type !== 'tag') result.peg = result.saveSpec || result.rawSpec; + else if (result.rawSpec !== '') result.peg = result.rawSpec; + + // return + return result; +}; diff --git a/utils/parse-recipe-config.js b/utils/parse-recipe-config.js new file mode 100644 index 000000000..1c71f5e42 --- /dev/null +++ b/utils/parse-recipe-config.js @@ -0,0 +1,18 @@ +'use strict'; + +const _ = require('lodash'); +const path = require('path'); + +/* + * Parse config into raw materials for our factory + */ +module.exports = (recipe, app) => _.merge({}, _.get(app, 'config.config', {}), { + _app: app, + app: app.name, + confDest: path.join(app._config.userConfRoot, 'config', recipe), + home: app._config.home, + project: app.project, + recipe, + root: app.root, + userConfRoot: app._config.userConfRoot, +}); diff --git a/utils/parse-setup-task.js b/utils/parse-setup-task.js new file mode 100644 index 000000000..3086062d3 --- /dev/null +++ b/utils/parse-setup-task.js @@ -0,0 +1,97 @@ +'use strict'; + +const slugify = require('slugify'); + +const {color} = require('listr2'); + +const defaults = task => ({ + canInstall: async () => true, + canRun: async () => true, + comments: {}, + dependsOn: [], + description: task.title, + hasRun: async () => false, + id: slugify(task.title), + isInstalled: async () => false, + requiresRestart: false, +}); + +/* + * TBD + */ +module.exports = otask => { + // first make sure task is sufficiently defined + // @TODO: post-install-notes? + otask = {...defaults(otask), ...otask}; + + // get the parent task + const orunner = otask.task; + + // lets rework the task to accomodate some setup things + otask.task = async (ctx, task) => { + try { + // checks + await otask.canInstall(); + await otask.canRun(); + + // if requires restart is a function then run it to reset teh task + if (typeof otask.requiresRestart === 'function') otask.requiresRestart = await otask.requiresRestart(ctx, task); + + // get some helpful things for downstream + const initialTitle = task.task.initialTitle ?? task.task.title; + + // if we have a dependsOn we need to just CHILLTFO untill dependees are good + if (Array.isArray(otask.dependsOn) && otask.dependsOn.length > 0) { + // get our dependants + const dependees = ctx.runner.tasks.filter(task => otask.dependsOn.includes(task.task.id)); + const dids = dependees.map(dependee => dependee.task.id); + + // update title to reflect pending + task.title = `${initialTitle} ${color.dim(`[Needs ${dids.join(', ')}]`)}`; + + // wait until all tasks close, for good or ill + try { + await Promise.all(dependees.map(async dependee => new Promise(async (resolve, reject) => { + // if they are already installed then just move on + if (await dependee.task.hasRun()) resolve(dependee); + else if (await dependee.task.isInstalled()) resolve(dependee); + else { + dependee.on('CLOSED', () => { + if (dependee.state === 'COMPLETED') resolve(dependee); + else reject(dependee); + }); + } + }))); + } catch (dependee) { + const id = dependee.task.id; + task.skip(`Skipped due to failure in ${id}! Rerun setup with -vvv or --debug for more info!`); + return; + } + } + + // main event + task.title = initialTitle; + const result = await orunner(ctx, task); + // harvest + ctx.results.push(result); + return result; + } catch (error) { + ctx.errors.push(error); + throw error; + } + }; + + // also skip the task if its already been set and skip has not been set + if (!otask.enabled) otask.enabled = async () => !await otask.isInstalled() && !await otask.hasRun(); + + // but actually wrap enabled in something else so we can make sure it resolves to a boolean + if (otask.enabled && typeof otask.enabled === 'function') { + const penabled = otask.enabled; + otask.enabled = async () => { + otask.enabled = await penabled(); + }; + } + + // return + return otask; +}; diff --git a/utils/parse-to-plugin-strings.js b/utils/parse-to-plugin-strings.js new file mode 100644 index 000000000..d79eda392 --- /dev/null +++ b/utils/parse-to-plugin-strings.js @@ -0,0 +1,4 @@ +'use strict'; + +// adds required methods to ensure the lando v3 debugger can be injected into v4 things +module.exports = (plugins = {}) => Object.entries(plugins).map(entry => entry.join('@')); diff --git a/utils/read-file.js b/utils/read-file.js new file mode 100644 index 000000000..c370976c1 --- /dev/null +++ b/utils/read-file.js @@ -0,0 +1,34 @@ +'use strict'; + +const fs = require('fs'); +const path = require('path'); + +module.exports = (file, options = {}) => { + // @TODO: file does nto exist? + + // set extension if not set + const extension = options.extension || path.extname(file); + + // @TODO: better try/catches here? + // @TODO: throw error for default? + // @TODO: require('js-yaml').loadAll? + switch (extension) { + case '.yaml': + case '.yml': + case 'yaml': + case 'yml': + try { + return require('js-yaml').load(fs.readFileSync(file, 'utf8'), options); + } catch (e) { + throw e; + } + case '.js': + case 'js': + return require(file); + case '.json': + case 'json': + return require('jsonfile').readFileSync(file, options); + default: + // throw error + } +}; diff --git a/utils/run-command.js b/utils/run-command.js new file mode 100644 index 000000000..2d4b2b0b5 --- /dev/null +++ b/utils/run-command.js @@ -0,0 +1,54 @@ +'use strict'; + +// Modules +const merge = require('lodash/merge'); + +const {spawn} = require('child_process'); + +// get the bosmang +const defaults = { + debug: require('debug')('@lando/run-command'), + ignoreReturnCode: false, + env: process.env, +}; + +module.exports = (command, args = [], options = {}, stdout = '', stderr = '') => { + // @TODO: error handling? + // merge our options over the defaults + options = merge({}, defaults, options); + const debug = options.debug; + + // this is a weirdly odd and specific thing we need to do + // @TODO: scope to just command = wsl|wsl.exe? + if (process.platform === 'win32') options.env.WSL_UTF8 = 1; + + // birth + debug('running command %o %o', command, args); + const child = spawn(command, args, options); + + return require('./merge-promise')(child, async () => { + return new Promise((resolve, reject) => { + child.stdout.on('data', data => { + debug('stdout %o', data.toString().trim()); + stdout += data; + }); + + child.stderr.on('data', data => { + debug('stderr %o', data.toString().trim()); + stderr += data; + }); + + child.on('close', code => { + // if code is non-zero and we arent ignoring then reject here + if (code !== 0 && !options.ignoreReturnCode) { + const error = new Error(stderr); + error.code = code; + reject(error); + } + + // otherwise return + resolve({stdout, stderr, code}); + }); + }); + }); +}; diff --git a/utils/run-elevated.js b/utils/run-elevated.js new file mode 100644 index 000000000..80094657f --- /dev/null +++ b/utils/run-elevated.js @@ -0,0 +1,110 @@ +'use strict'; + +// Modules +const fs = require('fs'); +const merge = require('lodash/merge'); +const os = require('os'); +const path = require('path'); + +const {nanoid} = require('nanoid'); +const {spawn} = require('child_process'); + +// get the bosmang +const defaults = { + notify: true, + debug: require('debug')('@lando/run-elevated'), + ignoreReturnCode: false, + isInteractive: require('is-interactive'), + password: undefined, + method: process.platform === 'win32' ? 'run-elevated' : 'sudo', +}; + +const getChild = (command, options) => { + switch (options.method) { + case 'sudo': + return spawn('sudo', command, options); + case 'run-elevated': + // copy elevation script to tmpfile + // @NOTE: we do this because if this code is run from a packaged up binary we dont have access to the file + // from the outside + const script = path.join(os.tmpdir(), `${nanoid()}.ps1`); + fs.copyFileSync(path.resolve(__dirname, '..', 'scripts', 'run-elevated.ps1'), script); + return require('./run-powershell-script')(script, command, options); + default: + return spawn('sudo', command, options); + } +}; + +module.exports = (command, options, stdout = '', stderr = '') => { + // @TODO: handle string args with string-argv? + // merge our options over the defaults + options = merge({}, defaults, options); + + // sudo + if (options.method === 'sudo') { + command.unshift('--'); + // if we want to notify the user + if (options.notify) command.unshift('--bell'); + // if this is non-interactive then pass that along to sudo + if (!options.isInteractive) command.unshift('--non-interactive'); + // if interactive and have a password then add -S so we can write the password to stdin + if (options.isInteractive && options.password) command.unshift('--stdin'); + + // run-elevated + } else if (options.method === 'run-elevated') { + // reset args + command = ['-cmd', command.join(',')]; + // debug mode + if (options.debug.enabled) command.push('-debug'); + } + + // grab the child + // @TODO: also debug the options? + options.debug('running elevated command %o %o %o', options.method, command); + const child = getChild(command, options); + + // return the merged thingy + return require('./merge-promise')(child, async () => { + return new Promise((resolve, reject) => { + child.stdout.on('data', data => { + options.debug('%o stdout %o', options.method, data.toString().trim()); + stdout += data; + }); + + child.stderr.on('data', data => { + options.debug('%o stderr %o', options.method, data.toString().trim()); + stderr += data; + }); + + // write the password to stdin if we can + if (options.isInteractive && options.password) { + child.stdin.setEncoding('utf-8'); + child.stdin.write(`${options.password}${os.EOL}`); + child.stdin.end(); + } + + child.on('close', code => { + // with run-elevate we want to clean up stderr a bit if we can eg remove the powershell shit + if (options.method === 'run-elevated') { + stderr = stderr.split('. At line')[0]; + stderr = stderr.split(`${os.EOL}At `)[0]; + + // simplify the UAC cancel error + if (stderr.includes('The operation was canceled by the user.')) { + stderr = 'The operation was canceled by the user.'; + } + } + + // if code is non-zero and we arent ignoring then reject here + if (code !== 0 && !options.ignoreReturnCode) { + const error = new Error(stderr); + error.code = code; + reject(error); + } + + // otherwise return + resolve({stdout, stderr, code}); + }); + }); + }); +}; diff --git a/utils/run-powershell-script.js b/utils/run-powershell-script.js new file mode 100644 index 000000000..a7ed54c26 --- /dev/null +++ b/utils/run-powershell-script.js @@ -0,0 +1,49 @@ +'use strict'; + +// Modules +const merge = require('lodash/merge'); + +const {spawn} = require('child_process'); + +// get the bosmang +const defaults = { + debug: require('debug')('@lando/run-powershell-script'), + ignoreReturnCode: false, +}; + +module.exports = (script, args = [], options = {}, stdout = '', stderr = '') => { + // @TODO: error handling? + // merge our options over the defaults + options = merge({}, defaults, options); + const debug = options.debug; + + // birth + debug('running powershell script %o %o', script, args); + const child = spawn('powershell', ['-ExecutionPolicy', 'Bypass', '-File', script].concat(args), options); + + return require('./merge-promise')(child, async () => { + return new Promise((resolve, reject) => { + child.stdout.on('data', data => { + debug('powershell stdout %o', data.toString().trim()); + stdout += data; + }); + + child.stderr.on('data', data => { + debug('powershell stderr %o', data.toString().trim()); + stderr += data; + }); + + child.on('close', code => { + // if code is non-zero and we arent ignoring then reject here + if (code !== 0 && !options.ignoreReturnCode) { + const error = new Error(stderr); + error.code = code; + reject(error); + } + + // otherwise return + resolve({stdout, stderr, code}); + }); + }); + }); +}; diff --git a/utils/run-tasks.js b/utils/run-tasks.js index 7b9fc2162..0782d1e7c 100644 --- a/utils/run-tasks.js +++ b/utils/run-tasks.js @@ -6,7 +6,7 @@ const fs = require('fs'); const path = require('path'); // get the bosmang -const {Manager} = require('listr2'); +const {Listr} = require('listr2'); // adds required methods to ensure the lando v3 debugger can be injected into v4 things module.exports = async (tasks, { @@ -34,7 +34,7 @@ module.exports = async (tasks, { } const defaults = { - ctx, + ctx: {data: {}, errors: [], results: [], skipped: 0, ran: 0, total: 0}, concurrent: true, collectErrors: true, exitOnError: false, @@ -45,22 +45,34 @@ module.exports = async (tasks, { log: require('debug')('task-runner'), collapseSubtasks: false, suffixRetries: false, - showErrorMessage: false, + showErrorMessage: true, taskCount: Array.isArray(tasks) ? tasks.length : 0, }, - showErrorMessage: false, + showErrorMessage: true, }; // construct the runner - const runner = new Manager(_.merge({}, defaults, { + const runner = new Listr(tasks, _.merge({}, defaults, { + ctx, ...listrOptions, rendererOptions, })); - // add the tasks - runner.add(tasks); + // if we got nothing to run then return the ctx + if (!Array.isArray(tasks) || tasks.length === 0) return runner.options.ctx; + + // also add the runner to ctx so we can access other tasks and stuff + runner.options.ctx.runner = runner; + runner.options.ctx.total = Array.isArray(runner.tasks) ? runner.tasks.length : 0; - // run - return runner.runAll(); + // get results + const results = await runner.run(); + // update results and then return + results.skipped = tasks.filter(task => !task.enabled).length; + results.ran = tasks.filter(task => task.enabled).length; + // remove the runner from the results + // @NOTE: is this a good idea? + delete results.runner; + return results; }; diff --git a/utils/run-v3-build.js b/utils/run-v3-build.js index f3c78bb64..0393c8540 100644 --- a/utils/run-v3-build.js +++ b/utils/run-v3-build.js @@ -15,8 +15,9 @@ module.exports = (app, steps, lockfile, hash = 'YOU SHALL NOT PASS') => { }) // Make sure we don't save a hash if our build fails .catch(error => { - app.addWarning({ + app.addMessage({ title: `One of your v3 build steps failed`, + type: 'warning', detail: [ 'This **MAY** prevent your app from working.', 'Check for errors above, fix them in your Landofile, and try again by running:', diff --git a/utils/shutdown-os.js b/utils/shutdown-os.js new file mode 100644 index 000000000..5358355f0 --- /dev/null +++ b/utils/shutdown-os.js @@ -0,0 +1,53 @@ +'use strict'; + +module.exports = ({ + args = [], + debug = require('debug')('@lando/shutdown-os'), + message = 'Lando wants to restart your computer', + password = undefined, + type = 'restart', + wait = process.platform === 'win32' ? 5 : 'now', +} = {}) => { + debug('shutdown with %o %o', type, {message, wait}); + + switch (process.platform) { + case 'darwin': + args.push('shutdown'); + // handle the restart type + if (type === 'logout') args.push('-r'); + else if (type === 'restart') args.push('-r'); + else if (type === 'shutdown') args.push('-h'); + else args.push('-r'); + // the waiting is the hardest part + args.push(wait); + // message + args.push(`"${message}"`); + return require('./run-elevated')(args, {password, debug}); + case 'linux': + // handle the restart type + if (type === 'logout') args.push('--reboot'); + else if (type === 'restart') args.push('--reboot'); + else if (type === 'shutdown') args.push('--poweroff'); + else args.push('--reboot'); + // the waiting is the hardest part + args.push(wait); + // message + args.push(`"${message}"`); + + return require('./run-command')('shutdown', args, {debug}); + case 'win32': + // handle the restart type + if (type === 'logout') args.push('/l'); + else if (type === 'restart') args.push('/r'); + else if (type === 'shutdown') args.push('/s'); + else args.push('r'); + // the waiting is the hardest part + args.push('/t'); + args.push(wait); + // add a comment + args.push('/c'); + args.push(message); + + return require('./run-command')('shutdown', args, {debug}); + } +}; diff --git a/utils/spawn-sync-stringer.js b/utils/spawn-sync-stringer.js new file mode 100644 index 000000000..afa4e0222 --- /dev/null +++ b/utils/spawn-sync-stringer.js @@ -0,0 +1,11 @@ +'use strict'; + +const {spawnSync} = require('child_process'); + +module.exports = (...args) => { + const result = spawnSync(...args); + // stringify and trim + result.stdout = result.stdout.toString().trim(); + result.stderr = result.stderr.toString().trim(); + return result; +}; diff --git a/utils/traverse-up.js b/utils/traverse-up.js new file mode 100644 index 000000000..18a427c79 --- /dev/null +++ b/utils/traverse-up.js @@ -0,0 +1,15 @@ +'use strict'; + +const dropRight = require('lodash/dropRight'); +const path = require('path'); +const range = require('lodash/range'); + +/* + * TBD + */ +module.exports = (files, startsFrom) => { + return range(startsFrom.split(path.sep).length) + .map(end => dropRight(startsFrom.split(path.sep), end).join(path.sep)) + .map(dir => files.map(file => path.join(dir, path.basename(file)))) + .flat(Number.POSITIVE_INFINITY); +}; diff --git a/utils/write-file.js b/utils/write-file.js new file mode 100644 index 000000000..4dbf6c70f --- /dev/null +++ b/utils/write-file.js @@ -0,0 +1,40 @@ +'use strict'; + +const fs = require('fs'); +const get = require('lodash/get'); +const path = require('path'); + +// @TODO: maybe extension should be in {options}? +module.exports = (file, data, options = {}) => { + // @TODO: error handling, defaults etc? + + // set extension if not set + const extension = options.extension || path.extname(file); + + switch (extension) { + case '.yaml': + case '.yml': + case 'yaml': + case 'yml': + // if this is a YAML DOC then use yaml module + if (get(data, 'constructor.name') === 'Document') { + try { + fs.writeFileSync(file, data.toString()); + } catch (error) { + throw new Error(error); + } + + // otherwise use the normal js-yaml dump + } else { + try { + return fs.writeFileSync(file, require('js-yaml').dump(data, options)); + } catch (error) { + throw new Error(error); + } + } + case '.json': + case 'json': + require('jsonfile').writeFileSync(file, data, options); + default: + } +}; diff --git a/yarn.lock b/yarn.lock index e91cacea4..9cc3dc6ee 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,135 +2,148 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.7.2.tgz#8abbed88082f611997538760dffcb43b33b1fd1d" - integrity sha512-eclwUDC6qfApNnEfu1uWcL/rudQsn59tjEoUYZYE2JSXZrHLRjBUGMxiCoknobU2Pva8ejb0eRxpIYDtVVqdsw== - dependencies: - "@algolia/autocomplete-shared" "1.7.2" - -"@algolia/autocomplete-preset-algolia@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.7.2.tgz#9cd4f64b3d64399657ee2dc2b7e0a939e0713a26" - integrity sha512-+RYEG6B0QiGGfRb2G3MtPfyrl0dALF3cQNTWBzBX6p5o01vCCGTTinAm2UKG3tfc2CnOMAtnPLkzNZyJUpnVJw== - dependencies: - "@algolia/autocomplete-shared" "1.7.2" - -"@algolia/autocomplete-shared@1.7.2": - version "1.7.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.7.2.tgz#daa23280e78d3b42ae9564d12470ae034db51a89" - integrity sha512-QCckjiC7xXHIUaIL3ektBtjJ0w7tTA3iqKcAE/Hjn1lZ5omp7i3Y4e09rAr9ZybqirL7AbxCLLq0Ra5DDPKeug== +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== -"@algolia/cache-browser-local-storage@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.14.2.tgz#d5b1b90130ca87c6321de876e167df9ec6524936" - integrity sha512-FRweBkK/ywO+GKYfAWbrepewQsPTIEirhi1BdykX9mxvBPtGNKccYAxvGdDCumU1jL4r3cayio4psfzKMejBlA== - dependencies: - "@algolia/cache-common" "4.14.2" - -"@algolia/cache-common@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.14.2.tgz#b946b6103c922f0c06006fb6929163ed2c67d598" - integrity sha512-SbvAlG9VqNanCErr44q6lEKD2qoK4XtFNx9Qn8FK26ePCI8I9yU7pYB+eM/cZdS9SzQCRJBbHUumVr4bsQ4uxg== - -"@algolia/cache-in-memory@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.14.2.tgz#88e4a21474f9ac05331c2fa3ceb929684a395a24" - integrity sha512-HrOukWoop9XB/VFojPv1R5SVXowgI56T9pmezd/djh2JnVN/vXswhXV51RKy4nCpqxyHt/aGFSq2qkDvj6KiuQ== - dependencies: - "@algolia/cache-common" "4.14.2" - -"@algolia/client-account@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.14.2.tgz#b76ac1ba9ea71e8c3f77a1805b48350dc0728a16" - integrity sha512-WHtriQqGyibbb/Rx71YY43T0cXqyelEU0lB2QMBRXvD2X0iyeGl4qMxocgEIcbHyK7uqE7hKgjT8aBrHqhgc1w== - dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/client-search" "4.14.2" - "@algolia/transporter" "4.14.2" - -"@algolia/client-analytics@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.14.2.tgz#ca04dcaf9a78ee5c92c5cb5e9c74cf031eb2f1fb" - integrity sha512-yBvBv2mw+HX5a+aeR0dkvUbFZsiC4FKSnfqk9rrfX+QrlNOKEhCG0tJzjiOggRW4EcNqRmaTULIYvIzQVL2KYQ== - dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/client-search" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" - -"@algolia/client-common@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.14.2.tgz#e1324e167ffa8af60f3e8bcd122110fd0bfd1300" - integrity sha512-43o4fslNLcktgtDMVaT5XwlzsDPzlqvqesRi4MjQz2x4/Sxm7zYg5LRYFol1BIhG6EwxKvSUq8HcC/KxJu3J0Q== - dependencies: - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" - -"@algolia/client-personalization@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.14.2.tgz#656bbb6157a3dd1a4be7de65e457fda136c404ec" - integrity sha512-ACCoLi0cL8CBZ1W/2juehSltrw2iqsQBnfiu/Rbl9W2yE6o2ZUb97+sqN/jBqYNQBS+o0ekTMKNkQjHHAcEXNw== - dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" - -"@algolia/client-search@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.14.2.tgz#357bdb7e640163f0e33bad231dfcc21f67dc2e92" - integrity sha512-L5zScdOmcZ6NGiVbLKTvP02UbxZ0njd5Vq9nJAmPFtjffUSOGEp11BmD2oMJ5QvARgx2XbX4KzTTNS5ECYIMWw== - dependencies: - "@algolia/client-common" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/transporter" "4.14.2" - -"@algolia/logger-common@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.14.2.tgz#b74b3a92431f92665519d95942c246793ec390ee" - integrity sha512-/JGlYvdV++IcMHBnVFsqEisTiOeEr6cUJtpjz8zc0A9c31JrtLm318Njc72p14Pnkw3A/5lHHh+QxpJ6WFTmsA== - -"@algolia/logger-console@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.14.2.tgz#ec49cb47408f5811d4792598683923a800abce7b" - integrity sha512-8S2PlpdshbkwlLCSAB5f8c91xyc84VM9Ar9EdfE9UmX+NrKNYnWR1maXXVDQQoto07G1Ol/tYFnFVhUZq0xV/g== - dependencies: - "@algolia/logger-common" "4.14.2" - -"@algolia/requester-browser-xhr@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.14.2.tgz#a2cd4d9d8d90d53109cc7f3682dc6ebf20f798f2" - integrity sha512-CEh//xYz/WfxHFh7pcMjQNWgpl4wFB85lUMRyVwaDPibNzQRVcV33YS+63fShFWc2+42YEipFGH2iPzlpszmDw== - dependencies: - "@algolia/requester-common" "4.14.2" +"@algolia/autocomplete-core@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz#1d56482a768c33aae0868c8533049e02e8961be7" + integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== + dependencies: + "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" + "@algolia/autocomplete-shared" "1.9.3" -"@algolia/requester-common@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.14.2.tgz#bc4e9e5ee16c953c0ecacbfb334a33c30c28b1a1" - integrity sha512-73YQsBOKa5fvVV3My7iZHu1sUqmjjfs9TteFWwPwDmnad7T0VTCopttcsM3OjLxZFtBnX61Xxl2T2gmG2O4ehg== +"@algolia/autocomplete-plugin-algolia-insights@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz#9b7f8641052c8ead6d66c1623d444cbe19dde587" + integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== + dependencies: + "@algolia/autocomplete-shared" "1.9.3" -"@algolia/requester-node-http@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.14.2.tgz#7c1223a1785decaab1def64c83dade6bea45e115" - integrity sha512-oDbb02kd1o5GTEld4pETlPZLY0e+gOSWjWMJHWTgDXbv9rm/o2cF7japO6Vj1ENnrqWvLBmW1OzV9g6FUFhFXg== +"@algolia/autocomplete-preset-algolia@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz#64cca4a4304cfcad2cf730e83067e0c1b2f485da" + integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== dependencies: - "@algolia/requester-common" "4.14.2" + "@algolia/autocomplete-shared" "1.9.3" -"@algolia/transporter@4.14.2": - version "4.14.2" - resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.14.2.tgz#77c069047fb1a4359ee6a51f51829508e44a1e3d" - integrity sha512-t89dfQb2T9MFQHidjHcfhh6iGMNwvuKUvojAj+JsrHAGbuSy7yE4BylhLX6R0Q1xYRoC4Vvv+O5qIw/LdnQfsQ== +"@algolia/autocomplete-shared@1.9.3": + version "1.9.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz#2e22e830d36f0a9cf2c0ccd3c7f6d59435b77dfa" + integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== + +"@algolia/cache-browser-local-storage@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.20.0.tgz#357318242fc542ffce41d6eb5b4a9b402921b0bb" + integrity sha512-uujahcBt4DxduBTvYdwO3sBfHuJvJokiC3BP1+O70fglmE1ShkH8lpXqZBac1rrU3FnNYSUs4pL9lBdTKeRPOQ== + dependencies: + "@algolia/cache-common" "4.20.0" + +"@algolia/cache-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-common/-/cache-common-4.20.0.tgz#ec52230509fce891091ffd0d890618bcdc2fa20d" + integrity sha512-vCfxauaZutL3NImzB2G9LjLt36vKAckc6DhMp05An14kVo8F1Yofb6SIl6U3SaEz8pG2QOB9ptwM5c+zGevwIQ== + +"@algolia/cache-in-memory@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/cache-in-memory/-/cache-in-memory-4.20.0.tgz#5f18d057bd6b3b075022df085c4f83bcca4e3e67" + integrity sha512-Wm9ak/IaacAZXS4mB3+qF/KCoVSBV6aLgIGFEtQtJwjv64g4ePMapORGmCyulCFwfePaRAtcaTbMcJF+voc/bg== + dependencies: + "@algolia/cache-common" "4.20.0" + +"@algolia/client-account@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-account/-/client-account-4.20.0.tgz#23ce0b4cffd63100fb7c1aa1c67a4494de5bd645" + integrity sha512-GGToLQvrwo7am4zVkZTnKa72pheQeez/16sURDWm7Seyz+HUxKi3BM6fthVVPUEBhtJ0reyVtuK9ArmnaKl10Q== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/client-search" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-analytics@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-analytics/-/client-analytics-4.20.0.tgz#0aa6bef35d3a41ac3991b3f46fcd0bf00d276fa9" + integrity sha512-EIr+PdFMOallRdBTHHdKI3CstslgLORQG7844Mq84ib5oVFRVASuuPmG4bXBgiDbcsMLUeOC6zRVJhv1KWI0ug== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/client-search" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-common/-/client-common-4.20.0.tgz#ca60f04466515548651c4371a742fbb8971790ef" + integrity sha512-P3WgMdEss915p+knMMSd/fwiHRHKvDu4DYRrCRaBrsfFw7EQHon+EbRSm4QisS9NYdxbS04kcvNoavVGthyfqQ== + dependencies: + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-personalization@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-personalization/-/client-personalization-4.20.0.tgz#ca81308e8ad0db3b27458b78355f124f29657181" + integrity sha512-N9+zx0tWOQsLc3K4PVRDV8GUeOLAY0i445En79Pr3zWB+m67V+n/8w4Kw1C5LlbHDDJcyhMMIlqezh6BEk7xAQ== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/client-search@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/client-search/-/client-search-4.20.0.tgz#3bcce817ca6caedc835e0eaf6f580e02ee7c3e15" + integrity sha512-zgwqnMvhWLdpzKTpd3sGmMlr4c+iS7eyyLGiaO51zDZWGMkpgoNVmltkzdBwxOVXz0RsFMznIxB9zuarUv4TZg== + dependencies: + "@algolia/client-common" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/transporter" "4.20.0" + +"@algolia/logger-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-common/-/logger-common-4.20.0.tgz#f148ddf67e5d733a06213bebf7117cb8a651ab36" + integrity sha512-xouigCMB5WJYEwvoWW5XDv7Z9f0A8VoXJc3VKwlHJw/je+3p2RcDXfksLI4G4lIVncFUYMZx30tP/rsdlvvzHQ== + +"@algolia/logger-console@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/logger-console/-/logger-console-4.20.0.tgz#ac443d27c4e94357f3063e675039cef0aa2de0a7" + integrity sha512-THlIGG1g/FS63z0StQqDhT6bprUczBI8wnLT3JWvfAQDZX5P6fCg7dG+pIrUBpDIHGszgkqYEqECaKKsdNKOUA== + dependencies: + "@algolia/logger-common" "4.20.0" + +"@algolia/requester-browser-xhr@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.20.0.tgz#db16d0bdef018b93b51681d3f1e134aca4f64814" + integrity sha512-HbzoSjcjuUmYOkcHECkVTwAelmvTlgs48N6Owt4FnTOQdwn0b8pdht9eMgishvk8+F8bal354nhx/xOoTfwiAw== + dependencies: + "@algolia/requester-common" "4.20.0" + +"@algolia/requester-common@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-common/-/requester-common-4.20.0.tgz#65694b2263a8712b4360fef18680528ffd435b5c" + integrity sha512-9h6ye6RY/BkfmeJp7Z8gyyeMrmmWsMOCRBXQDs4mZKKsyVlfIVICpcSibbeYcuUdurLhIlrOUkH3rQEgZzonng== + +"@algolia/requester-node-http@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/requester-node-http/-/requester-node-http-4.20.0.tgz#b52b182b52b0b16dec4070832267d484a6b1d5bb" + integrity sha512-ocJ66L60ABSSTRFnCHIEZpNHv6qTxsBwJEPfYaSBsLQodm0F9ptvalFkHMpvj5DfE22oZrcrLbOYM2bdPJRHng== + dependencies: + "@algolia/requester-common" "4.20.0" + +"@algolia/transporter@4.20.0": + version "4.20.0" + resolved "https://registry.yarnpkg.com/@algolia/transporter/-/transporter-4.20.0.tgz#7e5b24333d7cc9a926b2f6a249f87c2889b944a9" + integrity sha512-Lsii1pGWOAISbzeyuf+r/GPhvHMPHSPrTDWNcIzOE1SG1inlJHICaVe2ikuoRjcpgxZNU54Jl+if15SUCsaTUg== dependencies: - "@algolia/cache-common" "4.14.2" - "@algolia/logger-common" "4.14.2" - "@algolia/requester-common" "4.14.2" + "@algolia/cache-common" "4.20.0" + "@algolia/logger-common" "4.20.0" + "@algolia/requester-common" "4.20.0" -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" "@babel/code-frame@7.12.11": @@ -140,14 +153,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== - dependencies: - "@babel/highlight" "^7.18.6" - -"@babel/code-frame@^7.22.13": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13": version "7.22.13" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== @@ -155,49 +161,40 @@ "@babel/highlight" "^7.22.13" chalk "^2.4.2" -"@babel/compat-data@^7.20.0": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" - integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== +"@babel/compat-data@^7.22.9": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc" + integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ== "@babel/core@^7.7.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - convert-source-map "^1.7.0" + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94" + integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.0" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.0" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/eslint-parser@^7.16.0": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" - integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz#263f059c476e29ca4972481a17b8b660cb025a34" + integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" - -"@babel/generator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== - dependencies: - "@babel/types" "^7.20.5" - "@jridgewell/gen-mapping" "^0.3.2" - jsesc "^2.5.1" + semver "^6.3.1" "@babel/generator@^7.23.0": version "7.23.0" @@ -209,20 +206,16 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-compilation-targets@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" - -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" @@ -244,40 +237,30 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" + "@babel/types" "^7.22.15" -"@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== +"@babel/helper-module-transforms@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e" + integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw== dependencies: - "@babel/types" "^7.20.2" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.22.5" "@babel/helper-split-export-declaration@^7.22.6": version "7.22.6" @@ -286,50 +269,31 @@ dependencies: "@babel/types" "^7.22.5" -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - "@babel/helper-string-parser@^7.22.5": version "7.22.5" resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - "@babel/helper-validator-identifier@^7.22.20": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== -"@babel/highlight@^7.10.4", "@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" - js-tokens "^4.0.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" -"@babel/highlight@^7.22.13": +"@babel/highlight@^7.10.4", "@babel/highlight@^7.22.13": version "7.22.20" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== @@ -338,25 +302,11 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.16.4", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== - "@babel/parser@^7.22.15", "@babel/parser@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719" integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw== -"@babel/template@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - "@babel/template@^7.22.15": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" @@ -366,7 +316,7 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" -"@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5": +"@babel/traverse@^7.23.2": version "7.23.2" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8" integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw== @@ -382,15 +332,6 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== - dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" - to-fast-properties "^2.0.0" - "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0": version "7.23.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.0.tgz#8c1f020c9df0e737e4e247c0619f58c68458aaeb" @@ -400,28 +341,28 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" -"@docsearch/css@3.3.0", "@docsearch/css@^3.2.2": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.3.0.tgz#d698e48302d12240d7c2f7452ccb2d2239a8cd80" - integrity sha512-rODCdDtGyudLj+Va8b6w6Y85KE85bXRsps/R4Yjwt5vueXKXZQKYw0aA9knxLBT6a/bI/GMrAcmCR75KYOM6hg== +"@docsearch/css@3.5.2", "@docsearch/css@^3.2.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/css/-/css-3.5.2.tgz#610f47b48814ca94041df969d9fcc47b91fc5aac" + integrity sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA== "@docsearch/js@^3.2.2": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.3.0.tgz#c8f614b722cc8a6375e83f9c27557e9398d6a4d4" - integrity sha512-oFXWRPNvPxAzBhnFJ9UCFIYZiQNc3Yrv6912nZHw/UIGxsyzKpNRZgHq8HDk1niYmOSoLKtVFcxkccpQmYGFyg== + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/js/-/js-3.5.2.tgz#a11cb2e7e62890e9e940283fed6972ecf632629d" + integrity sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg== dependencies: - "@docsearch/react" "3.3.0" + "@docsearch/react" "3.5.2" preact "^10.0.0" -"@docsearch/react@3.3.0", "@docsearch/react@^3.2.2": - version "3.3.0" - resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.3.0.tgz#b8ac8e7f49b9bf2f96d34c24bc1cfd097ec0eead" - integrity sha512-fhS5adZkae2SSdMYEMVg6pxI5a/cE+tW16ki1V0/ur4Fdok3hBRkmN/H8VvlXnxzggkQIIRIVvYPn00JPjen3A== +"@docsearch/react@3.5.2", "@docsearch/react@^3.2.2": + version "3.5.2" + resolved "https://registry.yarnpkg.com/@docsearch/react/-/react-3.5.2.tgz#2e6bbee00eb67333b64906352734da6aef1232b9" + integrity sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng== dependencies: - "@algolia/autocomplete-core" "1.7.2" - "@algolia/autocomplete-preset-algolia" "1.7.2" - "@docsearch/css" "3.3.0" - algoliasearch "^4.0.0" + "@algolia/autocomplete-core" "1.9.3" + "@algolia/autocomplete-preset-algolia" "1.9.3" + "@docsearch/css" "3.5.2" + algoliasearch "^4.19.1" "@esbuild/android-arm@0.15.18": version "0.15.18" @@ -462,6 +403,23 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@isaacs/string-locale-compare@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b" + integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== + "@istanbuljs/load-nyc-config@^1.0.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" @@ -478,49 +436,31 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - "@jridgewell/resolve-uri@^3.1.0": version "3.1.1" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.14": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15": version "1.4.15" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== -"@jridgewell/trace-mapping@^0.3.17": +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": version "0.3.20" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== @@ -528,18 +468,10 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@lando/argv@^1.0.6": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@lando/argv/-/argv-1.1.0.tgz#96ba39e6a0498995c7abbbaff1794d71f827cd78" - integrity sha512-nBM6Rk1XorQdxad0CJTxDaNKrj+ITUg3u9rZYrOiF1KI5oImBJRBKjwf1EhnktJ63HmLGTq+sZQsR8veJmf1GQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@lando/argv/-/argv-1.1.2.tgz#e0abe88428ebbdba01eddce84f9fc3f72157e81d" + integrity sha512-b3d4zF1QBrFgUCFxEb48b0hse98wRhfnnydFsKXTcQc4aogfCBZc9wbgktLrs6TUtLKvU57YtlfNU4ack1ll7w== "@lando/leia@^1.0.0-beta.1": version "1.0.0-beta.1" @@ -602,10 +534,15 @@ vue "^3.2.20" vue-router "^4.0.12" +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + "@mdit-vue/plugin-component@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-component/-/plugin-component-0.11.1.tgz#0ffd542a6ef26655a6c48c8f255fe1ac4f3db6fc" - integrity sha512-fCqyYPwEXFa182/Vz6g8McDi3SCIwm3yHWkWddHx+QNn0gMGFqkhJVcz/wjCIA3oCoWUBWM80aZ09ZuoQiOmvQ== + version "0.11.2" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-component/-/plugin-component-0.11.2.tgz#3b7b6aef7368bb1a4b006c8430f0e9b7d4044b5b" + integrity sha512-ucFiEULCkLcCG1Tf1MfG5u5PS4BIXWIeKGHRGsXxz1ix2GbZWKFVgWEdNEckBu8s75Fv1WJLIOiAYZyri2f1nw== dependencies: "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" @@ -621,11 +558,11 @@ markdown-it "^13.0.1" "@mdit-vue/plugin-headers@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-headers/-/plugin-headers-0.11.1.tgz#246c56102f3ab197afa2a8c87fe669afb87df735" - integrity sha512-eBUonsEkXP2Uf2MIXSWZGCcLCIMSA1XfThJwhzSAosoa7fO5aw52LKCweddmn7zLQvgQh7p7382sFAhCc2KXog== + version "0.11.2" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-headers/-/plugin-headers-0.11.2.tgz#dd7ca7d00a6b2e28d516ba83718c6e336995d125" + integrity sha512-hH2zm4m+2tWe7dya/nxbbpB95pa9RjwYxl++kyZuRrqyhNTtsi2HWojX02peQ1nQMKKIWPDHtpeAHGP7dOLKFw== dependencies: - "@mdit-vue/shared" "0.11.0" + "@mdit-vue/shared" "0.11.2" "@mdit-vue/types" "0.11.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" @@ -640,29 +577,29 @@ markdown-it "^13.0.1" "@mdit-vue/plugin-title@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-title/-/plugin-title-0.11.1.tgz#98e116bc64d59b380a529f22d077dc105f6e862f" - integrity sha512-lvgR1pSgwX5D3tmLGyYBsfd3GbEoscqYsLTE8Vg+rCY8LfSrHdwrOD3Eg+SM2KyS5+gn+Zw4nS0S1yxOIVZBCQ== + version "0.11.2" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-title/-/plugin-title-0.11.2.tgz#8fc030ef1ef835872ce8a184a6941242c8bdc10e" + integrity sha512-R91WCN16CePWRT2bSXaDJGXvj0MuaCz4m2GbYqUbQxd+dqf18uuGPdbhr1rwhIqCvy7GD/g7hSgOFi3DNDAIzA== dependencies: - "@mdit-vue/shared" "0.11.0" + "@mdit-vue/shared" "0.11.2" "@mdit-vue/types" "0.11.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" "@mdit-vue/plugin-toc@^0.11.1": - version "0.11.1" - resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-toc/-/plugin-toc-0.11.1.tgz#81394518fd48e54a94e6c41d804270c2b37761bf" - integrity sha512-1tkGb1092ZgLhoSmE5hkC6U0IRGG5bWhUY4p14npV4cwqntciXEoXRqPA1jGEDh5hnofZC0bHbeS3uKxsmAEew== + version "0.11.2" + resolved "https://registry.yarnpkg.com/@mdit-vue/plugin-toc/-/plugin-toc-0.11.2.tgz#ed508ec23fd7ea2b6a7263ac4c1b98a4bbdc0853" + integrity sha512-0OcGG4TnYIZJ6SLZtk24Nj0oP2vcLn0FyMTao/nB/2Z17/fP3whoo6dVV+0G4Oi8HZ+MMDi661lvS2b4b/glYA== dependencies: - "@mdit-vue/shared" "0.11.0" + "@mdit-vue/shared" "0.11.2" "@mdit-vue/types" "0.11.0" "@types/markdown-it" "^12.2.3" markdown-it "^13.0.1" -"@mdit-vue/shared@0.11.0", "@mdit-vue/shared@^0.11.0": - version "0.11.0" - resolved "https://registry.yarnpkg.com/@mdit-vue/shared/-/shared-0.11.0.tgz#c4b2554795fd1924302fe7f7fee2b5fb412aa578" - integrity sha512-eiGe42y7UYpjO6/8Lg6OpAtzZrRU9k8dhpX1e/kJMTcL+tn+XkqRMJJ8I2pdrOQMSkgvIva5FNAriykqFzkdGg== +"@mdit-vue/shared@0.11.2", "@mdit-vue/shared@^0.11.0": + version "0.11.2" + resolved "https://registry.yarnpkg.com/@mdit-vue/shared/-/shared-0.11.2.tgz#ef575b9b6b4697858b9e391dcae7307b503bd9ad" + integrity sha512-Z/GS/v9DURZE13Hv41meKzdnprMwenVJoM3t82OE5HIGvtE6QovsZ+mMF/rMvLgaLLMDjT3EwvrrBmemWkHYTQ== dependencies: "@mdit-vue/types" "0.11.0" "@types/markdown-it" "^12.2.3" @@ -701,17 +638,176 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@npmcli/agent@^2.0.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@npmcli/agent/-/agent-2.2.0.tgz#e81f00fdb2a670750ff7731bbefb47ecbf0ccf44" + integrity sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.1" + +"@npmcli/arborist@^6.2.9": + version "6.5.0" + resolved "https://registry.yarnpkg.com/@npmcli/arborist/-/arborist-6.5.0.tgz#ee24ecc56e4c387d78c3bce66918b386df6bd560" + integrity sha512-Ir14P+DyH4COJ9fVbmxVy+9GmyU3e/DnlBtijVN7B3Ri53Y9QmAqi1S9IifG0PTGsfa2U4zhAF8e6I/0VXfWjg== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.0" + "@npmcli/installed-package-contents" "^2.0.2" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^5.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^4.0.0" + "@npmcli/query" "^3.0.0" + "@npmcli/run-script" "^6.0.0" + bin-links "^4.0.1" + cacache "^17.0.4" + common-ancestor-path "^1.0.1" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + json-stringify-nice "^1.1.4" + minimatch "^9.0.0" + nopt "^7.0.0" + npm-install-checks "^6.2.0" + npm-package-arg "^10.1.0" + npm-pick-manifest "^8.0.1" + npm-registry-fetch "^14.0.3" + npmlog "^7.0.1" + pacote "^15.0.8" + parse-conflict-json "^3.0.0" + proc-log "^3.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^1.0.2" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.1" + treeverse "^3.0.0" + walk-up-path "^3.0.1" + +"@npmcli/fs@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/fs/-/fs-3.1.0.tgz#233d43a25a91d68c3a863ba0da6a3f00924a173e" + integrity sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w== + dependencies: + semver "^7.3.5" + +"@npmcli/git@^4.0.0", "@npmcli/git@^4.1.0": + version "4.1.0" + resolved "https://registry.yarnpkg.com/@npmcli/git/-/git-4.1.0.tgz#ab0ad3fd82bc4d8c1351b6c62f0fa56e8fe6afa6" + integrity sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ== + dependencies: + "@npmcli/promise-spawn" "^6.0.0" + lru-cache "^7.4.4" + npm-pick-manifest "^8.0.0" + proc-log "^3.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^3.0.0" + +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz#bfd817eccd9e8df200919e73f57f9e3d9e4f9e33" + integrity sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +"@npmcli/map-workspaces@^3.0.2": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@npmcli/map-workspaces/-/map-workspaces-3.0.4.tgz#15ad7d854292e484f7ba04bc30187a8320dba799" + integrity sha512-Z0TbvXkRbacjFFLpVpV0e2mheCh+WzQpcqL+4xp49uNJOxOnIAPZyXtUxZ5Qn3QBTGKA11Exjd9a5411rBrhDg== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + +"@npmcli/metavuln-calculator@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/metavuln-calculator/-/metavuln-calculator-5.0.1.tgz#426b3e524c2008bcc82dbc2ef390aefedd643d76" + integrity sha512-qb8Q9wIIlEPj3WeA1Lba91R4ZboPL0uspzV0F9uwP+9AYMVB2zOoa7Pbk12g6D2NHAinSbHh6QYmGuRyHZ874Q== + dependencies: + cacache "^17.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^15.0.0" + semver "^7.3.5" + +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz#c44d3a7c6d5c184bb6036f4d5995eee298945815" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz#101b2d0490ef1aa20ed460e4c0813f0db560545a" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + +"@npmcli/package-json@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/package-json/-/package-json-4.0.1.tgz#1a07bf0e086b640500791f6bf245ff43cc27fa37" + integrity sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q== + dependencies: + "@npmcli/git" "^4.1.0" + glob "^10.2.2" + hosted-git-info "^6.1.1" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + proc-log "^3.0.0" + semver "^7.5.3" + +"@npmcli/promise-spawn@^6.0.0", "@npmcli/promise-spawn@^6.0.1": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/promise-spawn/-/promise-spawn-6.0.2.tgz#c8bc4fa2bd0f01cb979d8798ba038f314cfa70f2" + integrity sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg== + dependencies: + which "^3.0.0" + +"@npmcli/query@^3.0.0": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@npmcli/query/-/query-3.0.1.tgz#77d63ceb7d27ed748da3cc8b50d45fc341448ed6" + integrity sha512-0jE8iHBogf/+bFDj+ju6/UMLbJ39c8h6nSe6qile+dB7PJ0iV3gNqcb2vtt6WWCBrxv9uAjzUT/8vroluulidA== + dependencies: + postcss-selector-parser "^6.0.10" + +"@npmcli/run-script@^6.0.0": + version "6.0.2" + resolved "https://registry.yarnpkg.com/@npmcli/run-script/-/run-script-6.0.2.tgz#a25452d45ee7f7fb8c16dfaf9624423c0c0eb885" + integrity sha512-NCcr1uQo1k5U+SYlnIrbAh3cxy+OQT1VtqiAbxdymSlptbzBb62AjH2xXgjNCoP073hoa1CfCAcwoZ8k96C4nA== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/promise-spawn" "^6.0.0" + node-gyp "^9.0.0" + read-package-json-fast "^3.0.0" + which "^3.0.0" + "@oclif/command@^1.8.0", "@oclif/command@^1.8.15": - version "1.8.20" - resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.20.tgz#7e28387be8744145e1b2ee7db89275bc7f708f2f" - integrity sha512-BHM9byujY0kf0PiRorIyp99K50cA3i6Hyro0+TPpFFx+4QM+PyQ5vMHO/TG5wkEP8tIivNRs24bF8QVyJru25g== + version "1.8.36" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.8.36.tgz#9739b9c268580d064a50887c4597d1b4e86ca8b5" + integrity sha512-/zACSgaYGtAQRzc7HjzrlIs14FuEYAZrMOEwicRoUnZVyRunG4+t5iSEeQu0Xy2bgbCD0U1SP/EdeNZSTXRwjQ== dependencies: "@oclif/config" "^1.18.2" "@oclif/errors" "^1.3.6" "@oclif/help" "^1.0.1" - "@oclif/parser" "^3.8.9" + "@oclif/parser" "^3.8.17" debug "^4.1.1" - semver "^7.3.8" + semver "^7.5.4" + +"@oclif/config@1.18.16": + version "1.18.16" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.16.tgz#3235d260ab1eb8388ebb6255bca3dd956249d796" + integrity sha512-VskIxVcN22qJzxRUq+raalq6Q3HUde7sokB7/xk5TqRZGEKRVbFeqdQBxDWwQeudiJEgcNiMvIFbMQ43dY37FA== + dependencies: + "@oclif/errors" "^1.3.6" + "@oclif/parser" "^3.8.16" + debug "^4.3.4" + globby "^11.1.0" + is-wsl "^2.1.1" + tslib "^2.6.1" "@oclif/config@1.18.2": version "1.18.2" @@ -725,17 +821,17 @@ is-wsl "^2.1.1" tslib "^2.0.0" -"@oclif/config@1.18.6", "@oclif/config@^1.17.0", "@oclif/config@^1.18.2": - version "1.18.6" - resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.6.tgz#37367026b3110a2f04875509b1920a8ee4489f21" - integrity sha512-OWhCpdu4QqggOPX1YPZ4XVmLLRX+lhGjXV6RNA7sogOwLqlEmSslnN/lhR5dkhcWZbKWBQH29YCrB3LDPRu/IA== +"@oclif/config@^1.17.0", "@oclif/config@^1.18.2": + version "1.18.17" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.18.17.tgz#00aa4049da27edca8f06fc106832d9f0f38786a5" + integrity sha512-k77qyeUvjU8qAJ3XK3fr/QVAqsZO8QOBuESnfeM5HHtPNLSyfVcwiMM2zveSW5xRdLSG3MfV8QnLVkuyCL2ENg== dependencies: "@oclif/errors" "^1.3.6" - "@oclif/parser" "^3.8.9" + "@oclif/parser" "^3.8.17" debug "^4.3.4" globby "^11.1.0" is-wsl "^2.1.1" - tslib "^2.3.1" + tslib "^2.6.1" "@oclif/errors@1.3.5": version "1.3.5" @@ -760,11 +856,11 @@ wrap-ansi "^7.0.0" "@oclif/help@^1.0.1": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.4.tgz#0c7cfd776e3cbe033cab023486ed929be0cd1c77" - integrity sha512-w3xsdZj1af/dFN7oCmvAHbHRj6L0SOO5uGXEve0LLroAJSM3DeEpzgNMjxS5RTV2gVC4RmJ/rTqmp0SRaXGiTA== + version "1.0.15" + resolved "https://registry.yarnpkg.com/@oclif/help/-/help-1.0.15.tgz#5e36e576b8132a4906d2662204ad9de7ece87e8f" + integrity sha512-Yt8UHoetk/XqohYX76DfdrUYLsPKMc5pgkzsZVHDyBSkLiGRzujVaGZdjr32ckVZU9q3a47IjhWxhip7Dz5W/g== dependencies: - "@oclif/config" "1.18.6" + "@oclif/config" "1.18.16" "@oclif/errors" "1.3.6" chalk "^4.1.2" indent-string "^4.0.0" @@ -779,15 +875,15 @@ resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== -"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.9": - version "3.8.9" - resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.9.tgz#9399041ada7e465043f34b24f4d82a8beb68a023" - integrity sha512-1j/kThdse7yHQz6+c3v8RA1I3gD6+SGt2O7IAb/MAMoxqyBrFQDabQHH2UU4eVFGMLN7U91AiYJp11zJ9LcQAg== +"@oclif/parser@^3.8.0", "@oclif/parser@^3.8.16", "@oclif/parser@^3.8.17": + version "3.8.17" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.8.17.tgz#e1ce0f29b22762d752d9da1c7abd57ad81c56188" + integrity sha512-l04iSd0xoh/16TGVpXb81Gg3z7tlQGrEup16BrVLsZBK6SEYpYHRJZnM32BwZrHI97ZSFfuSwVlzoo6HdsaK8A== dependencies: "@oclif/errors" "^1.3.6" "@oclif/linewrap" "^1.0.0" chalk "^4.1.0" - tslib "^2.4.1" + tslib "^2.6.2" "@oclif/plugin-help@^3.2.3": version "3.3.1" @@ -995,6 +1091,50 @@ dependencies: "@octokit/openapi-types" "^18.0.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@sigstore/bundle@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@sigstore/bundle/-/bundle-1.1.0.tgz#17f8d813b09348b16eeed66a8cf1c3d6bd3d04f1" + integrity sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + +"@sigstore/protobuf-specs@^0.2.0": + version "0.2.1" + resolved "https://registry.yarnpkg.com/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz#be9ef4f3c38052c43bd399d3f792c97ff9e2277b" + integrity sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A== + +"@sigstore/sign@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@sigstore/sign/-/sign-1.0.0.tgz#6b08ebc2f6c92aa5acb07a49784cb6738796f7b4" + integrity sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + make-fetch-happen "^11.0.1" + +"@sigstore/tuf@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@sigstore/tuf/-/tuf-1.0.3.tgz#2a65986772ede996485728f027b0514c0b70b160" + integrity sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg== + dependencies: + "@sigstore/protobuf-specs" "^0.2.0" + tuf-js "^1.1.7" + +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + +"@sindresorhus/is@^4.0.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f" + integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== + "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.7.0": version "1.8.6" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.6.tgz#80c516a4dc264c2a69115e7578d62581ff455ed9" @@ -1031,10 +1171,52 @@ resolved "https://registry.yarnpkg.com/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz#5981a8db18b56ba38ef0efb7d995b12aa7b51918" integrity sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ== +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@tufjs/canonical-json@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tufjs/canonical-json/-/canonical-json-1.0.0.tgz#eade9fd1f537993bc1f0949f3aea276ecc4fab31" + integrity sha512-QTnf++uxunWvG2z3UFNzAoQPHxnSXOwtaI3iJ+AohhV+5vONuArPjJE7aPXPVXfXJsqrVbZBu9b81AJoSd09IQ== + +"@tufjs/models@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tufjs/models/-/models-1.0.4.tgz#5a689630f6b9dbda338d4b208019336562f176ef" + integrity sha512-qaGV9ltJP0EO25YfFUPhxRVK0evXFIAGicsVXuRim4Ed9cjPxYhNnNJ49SFmbeLgtxpslIkX317IgpfcHPVj/A== + dependencies: + "@tufjs/canonical-json" "1.0.0" + minimatch "^9.0.0" + +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/debug@^4.1.7": - version "4.1.7" - resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82" - integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg== + version "4.1.10" + resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.10.tgz#f23148a6eb771a34c466a4fc28379d8101e84494" + integrity sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA== dependencies: "@types/ms" "*" @@ -1046,23 +1228,43 @@ "@types/node" "*" "@types/hash-sum@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@types/hash-sum/-/hash-sum-1.0.0.tgz#838f4e8627887d42b162d05f3d96ca636c2bc504" - integrity sha512-FdLBT93h3kcZ586Aee66HPCVJ6qvxVjBlDWNmxSGSbCZe9hTsjRKdSsl4y1T+3zfujxo9auykQMnFsfyHWD7wg== + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/hash-sum/-/hash-sum-1.0.1.tgz#4e43c16324f875b2813001a1022e7f327a3e648a" + integrity sha512-5JLywbPgWZVgxhAV//qTU6LPurKfQeiyw20GKZMi9V7AjHnAP4t1eNCJ1mC2L4TAicuS71MVoFYVcEM+EiR4lg== + +"@types/http-cache-semantics@*": + version "4.0.3" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.3.tgz#a3ff232bf7d5c55f38e4e45693eda2ebb545794d" + integrity sha512-V46MYLFp08Wf2mmaBhvgjStM3tPa+2GAdy/iqoX+noX1//zje2x4XmrIU0cAwyClATsTmahbtoQ2EwP7I5WSiA== + +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" "@types/linkify-it@*": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.2.tgz#fd2cd2edbaa7eaac7e7f3c1748b52a19143846c9" - integrity sha512-HZQYqbiFVWufzCwexrvh694SOim8z2d+xJl5UNamcvQFejLY/2YUtzXHYi3cHdI7PMlS8ejH2slRAOJQ32aNbA== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/linkify-it/-/linkify-it-3.0.4.tgz#def6a9bb0ce78140860602f16ace37a9997f086a" + integrity sha512-hPpIeeHb/2UuCw06kSNAOVWgehBLXEo0/fUs0mw3W2qhqX89PI2yvok83MnuctYGCPrabGIoi0fFso4DQ+sNUQ== "@types/markdown-it-emoji@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.2.tgz#f12a97df2758f38b4b38f277b468780459faff14" - integrity sha512-2ln8Wjbcj/0oRi/6VnuMeWEHHuK8uapFttvcLmDIe1GKCsFBLOLBX+D+xhDa9oWOQV0IpvxwrSfKKssAqqroog== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/markdown-it-emoji/-/markdown-it-emoji-2.0.3.tgz#7e2070baa0ca5c6fc8f3fd2a8829b98270491424" + integrity sha512-YjoZM0vP2KZSTwDh/5LamI58Cynk+lCfRJWM2nBAiWwclfyfj2wpaoDEo6ZVpH6Fn1f0RYs8q7u2biHL5YuEOg== dependencies: "@types/markdown-it" "*" -"@types/markdown-it@*", "@types/markdown-it@^12.2.3": +"@types/markdown-it@*": + version "13.0.4" + resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-13.0.4.tgz#33ede9fe0f23f62f39f83d7530ba69762b0bfd35" + integrity sha512-FAIUdEXrCDnQmAAmJC+UeW/3p0eCI4QZ/+W0lX/h83VD3v78IgTFYftjnAeXS8H0g4PFQCgipc51cQDA8tjgLw== + dependencies: + "@types/linkify-it" "*" + "@types/mdurl" "*" + +"@types/markdown-it@^12.2.3": version "12.2.3" resolved "https://registry.yarnpkg.com/@types/markdown-it/-/markdown-it-12.2.3.tgz#0d6f6e5e413f8daaa26522904597be3d6cd93b51" integrity sha512-GKMHFfv3458yYy+v/N8gjufHO6MSZKCOXpZc5GXIWWy8uldwfmPn98vp81gZ5f9SVw8YYBctgfJ22a2d7AOMeQ== @@ -1071,24 +1273,26 @@ "@types/mdurl" "*" "@types/mdurl@*": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.2.tgz#e2ce9d83a613bacf284c7be7d491945e39e1f8e9" - integrity sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@types/mdurl/-/mdurl-1.0.4.tgz#574bfbec51eb41ab5f444116c8555bc4347feba5" + integrity sha512-ARVxjAEX5TARFRzpDRVC6cEk0hUIXCCwaMhz8y7S1/PxU6zZS1UMjyobz7q4w/D/R552r4++EhwmXK1N2rAy0A== "@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== + version "1.2.4" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.4.tgz#81f886786411c45bba3f33e781ab48bd56bfca2e" + integrity sha512-Kfe/D3hxHTusnPNRbycJE1N77WHDsdS4AjUYIzlDzhDrS47NrwuL3YW4VITxwR7KCVpzwgy4Rbj829KSSQmwXQ== "@types/ms@*": - version "0.7.31" - resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197" - integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA== + version "0.7.33" + resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.33.tgz#80bf1da64b15f21fd8c1dc387c31929317d99ee9" + integrity sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ== "@types/node@*": - version "18.11.13" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.13.tgz#dff34f226ec1ac0432ae3b136ec5552bd3b9c0fe" - integrity sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w== + version "20.8.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.8.7.tgz#ad23827850843de973096edfc5abc9e922492a25" + integrity sha512-21TKHHh3eUHIi2MloeptJWALuCu5H7HQTdTrWIFReA8ad+aggoX+lRes3ex7/FtpC+sVUpFMQ+QTfYr74mruiQ== + dependencies: + undici-types "~5.25.1" "@types/node@^17.0.5": version "17.0.45" @@ -1096,19 +1300,26 @@ integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.3" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.3.tgz#291c243e4b94dbfbc0c0ee26b7666f1d5c030e2c" + integrity sha512-ehPtgRgaULsFG8x0NeYJvmyH1hmlfsNLujHe9dQEia/7MAJYdzMSi19JtchUHjmBA6XC/75dK55mzZH+RyieSg== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.1.tgz#27f7559836ad796cea31acb63163b203756a5b4e" + integrity sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng== + +"@types/responselike@^1.0.0": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.2.tgz#8de1b0477fd7c12df77e50832fa51701a8414bd6" + integrity sha512-/4YQT5Kp6HxUDb4yhRkm0bJ7TbjvTddqX7PZ5hz6qV3pxSo72f/6YPRo+Mu2DU307tm9IioO69l7uAwn5XNcFA== + dependencies: + "@types/node" "*" "@types/sax@^1.2.1": - version "1.2.4" - resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.4.tgz#8221affa7f4f3cb21abd22f244cfabfa63e6a69e" - integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== + version "1.2.6" + resolved "https://registry.yarnpkg.com/@types/sax/-/sax-1.2.6.tgz#6e563455034014db5ab9e24a929404cf9b43adc3" + integrity sha512-A1mpYCYu1aHFayy8XKN57ebXeAbh9oQIZ1wXcno6b1ESUAfMBDMx7mf/QGlYwcMRaFryh9YBuH03i/3FlPGDkQ== dependencies: "@types/node" "*" @@ -1127,100 +1338,100 @@ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz#a1484089dd85d6528f435743f84cdd0d215bbb54" integrity sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw== -"@vue/compiler-core@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz#d9311207d96f6ebd5f4660be129fb99f01ddb41b" - integrity sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A== +"@vue/compiler-core@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.3.6.tgz#ffc14517e0a7269983b9a93994df9669e9e03506" + integrity sha512-2JNjemwaNwf+MkkatATVZi7oAH1Hx0B04DdPH3ZoZ8vKC1xZVP7nl4HIsk8XYd3r+/52sqqoz9TWzYc3yE9dqA== dependencies: - "@babel/parser" "^7.16.4" - "@vue/shared" "3.2.45" + "@babel/parser" "^7.23.0" + "@vue/shared" "3.3.6" estree-walker "^2.0.2" - source-map "^0.6.1" + source-map-js "^1.0.2" + +"@vue/compiler-dom@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.3.6.tgz#683420cc201c3a48cb0841467bf19a433ffbede6" + integrity sha512-1MxXcJYMHiTPexjLAJUkNs/Tw2eDf2tY3a0rL+LfuWyiKN2s6jvSwywH3PWD8bKICjfebX3GWx2Os8jkRDq3Ng== + dependencies: + "@vue/compiler-core" "3.3.6" + "@vue/shared" "3.3.6" -"@vue/compiler-dom@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz#c43cc15e50da62ecc16a42f2622d25dc5fd97dce" - integrity sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw== - dependencies: - "@vue/compiler-core" "3.2.45" - "@vue/shared" "3.2.45" - -"@vue/compiler-sfc@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz#7f7989cc04ec9e7c55acd406827a2c4e96872c70" - integrity sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q== - dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.45" - "@vue/compiler-dom" "3.2.45" - "@vue/compiler-ssr" "3.2.45" - "@vue/reactivity-transform" "3.2.45" - "@vue/shared" "3.2.45" +"@vue/compiler-sfc@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.3.6.tgz#00dce2e7aa569101009c5eedec4a69e2f831d8cc" + integrity sha512-/Kms6du2h1VrXFreuZmlvQej8B1zenBqIohP0690IUBkJjsFvJxY0crcvVRJ0UhMgSR9dewB+khdR1DfbpArJA== + dependencies: + "@babel/parser" "^7.23.0" + "@vue/compiler-core" "3.3.6" + "@vue/compiler-dom" "3.3.6" + "@vue/compiler-ssr" "3.3.6" + "@vue/reactivity-transform" "3.3.6" + "@vue/shared" "3.3.6" estree-walker "^2.0.2" - magic-string "^0.25.7" - postcss "^8.1.10" - source-map "^0.6.1" + magic-string "^0.30.5" + postcss "^8.4.31" + source-map-js "^1.0.2" -"@vue/compiler-ssr@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz#bd20604b6e64ea15344d5b6278c4141191c983b2" - integrity sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ== +"@vue/compiler-ssr@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.3.6.tgz#d767602563f2596a03b44b3dea4a32c715f64915" + integrity sha512-QTIHAfDCHhjXlYGkUg5KH7YwYtdUM1vcFl/FxFDlD6d0nXAmnjizka3HITp8DGudzHndv2PjKVS44vqqy0vP4w== dependencies: - "@vue/compiler-dom" "3.2.45" - "@vue/shared" "3.2.45" + "@vue/compiler-dom" "3.3.6" + "@vue/shared" "3.3.6" -"@vue/devtools-api@^6.4.5": - version "6.4.5" - resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz#d54e844c1adbb1e677c81c665ecef1a2b4bb8380" - integrity sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ== +"@vue/devtools-api@^6.4.5", "@vue/devtools-api@^6.5.0": + version "6.5.1" + resolved "https://registry.yarnpkg.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz#7f71f31e40973eeee65b9a64382b13593fdbd697" + integrity sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA== -"@vue/reactivity-transform@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz#07ac83b8138550c83dfb50db43cde1e0e5e8124d" - integrity sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ== +"@vue/reactivity-transform@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.3.6.tgz#29d615455992d253b8f21b47d084445b5d3f916d" + integrity sha512-RlJl4dHfeO7EuzU1iJOsrlqWyJfHTkJbvYz/IOJWqu8dlCNWtxWX377WI0VsbAgBizjwD+3ZjdnvSyyFW1YVng== dependencies: - "@babel/parser" "^7.16.4" - "@vue/compiler-core" "3.2.45" - "@vue/shared" "3.2.45" + "@babel/parser" "^7.23.0" + "@vue/compiler-core" "3.3.6" + "@vue/shared" "3.3.6" estree-walker "^2.0.2" - magic-string "^0.25.7" + magic-string "^0.30.5" -"@vue/reactivity@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.45.tgz#412a45b574de601be5a4a5d9a8cbd4dee4662ff0" - integrity sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A== +"@vue/reactivity@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.3.6.tgz#436bd2997673ae2a7b6f4e1c376163f0445f9a5e" + integrity sha512-gtChAumfQz5lSy5jZXfyXbKrIYPf9XEOrIr6rxwVyeWVjFhJwmwPLtV6Yis+M9onzX++I5AVE9j+iPH60U+B8Q== dependencies: - "@vue/shared" "3.2.45" + "@vue/shared" "3.3.6" -"@vue/runtime-core@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz#7ad7ef9b2519d41062a30c6fa001ec43ac549c7f" - integrity sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A== +"@vue/runtime-core@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.3.6.tgz#749ff325c95bb3a690c512da0215339fd241872c" + integrity sha512-qp7HTP1iw1UW2ZGJ8L3zpqlngrBKvLsDAcq5lA6JvEXHmpoEmjKju7ahM9W2p/h51h0OT5F2fGlP/gMhHOmbUA== dependencies: - "@vue/reactivity" "3.2.45" - "@vue/shared" "3.2.45" + "@vue/reactivity" "3.3.6" + "@vue/shared" "3.3.6" -"@vue/runtime-dom@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz#1a2ef6ee2ad876206fbbe2a884554bba2d0faf59" - integrity sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA== +"@vue/runtime-dom@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.3.6.tgz#30729eac969467c6be6723677d14b873918a467c" + integrity sha512-AoX3Cp8NqMXjLbIG9YR6n/pPLWE9TiDdk6wTJHFnl2GpHzDFH1HLBC9wlqqQ7RlnvN3bVLpzPGAAH00SAtOxHg== dependencies: - "@vue/runtime-core" "3.2.45" - "@vue/shared" "3.2.45" - csstype "^2.6.8" + "@vue/runtime-core" "3.3.6" + "@vue/shared" "3.3.6" + csstype "^3.1.2" -"@vue/server-renderer@3.2.45": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz#ca9306a0c12b0530a1a250e44f4a0abac6b81f3f" - integrity sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g== +"@vue/server-renderer@3.3.6": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.3.6.tgz#b8a4d7254b67a5cc663f2b9e16cde019483620c9" + integrity sha512-kgLoN43W4ERdZ6dpyy+gnk2ZHtcOaIr5Uc/WUP5DRwutgvluzu2pudsZGoD2b7AEJHByUVMa9k6Sho5lLRCykw== dependencies: - "@vue/compiler-ssr" "3.2.45" - "@vue/shared" "3.2.45" + "@vue/compiler-ssr" "3.3.6" + "@vue/shared" "3.3.6" -"@vue/shared@3.2.45", "@vue/shared@^3.2.41": - version "3.2.45" - resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.45.tgz#a3fffa7489eafff38d984e23d0236e230c818bc2" - integrity sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg== +"@vue/shared@3.3.6", "@vue/shared@^3.2.41": + version "3.3.6" + resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.3.6.tgz#bd97c22972c6519250069297d01cbed077054b7e" + integrity sha512-Xno5pEqg8SVhomD0kTSmfh30ZEmV/+jZtyh39q6QflrjdJCXah5lrnOLi9KB6a5k5aAHXMXjoMnxlzUkCNfWLQ== "@vuepress/bundler-vite@2.0.0-beta.53": version "2.0.0-beta.53" @@ -1502,24 +1713,24 @@ upath "^2.0.1" "@vueuse/core@^9.3.1", "@vueuse/core@^9.6.0": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.6.0.tgz#de1d4730849cdbe28a9ebcf6cad167a700919603" - integrity sha512-qGUcjKQXHgN+jqXEgpeZGoxdCbIDCdVPz3QiF1uyecVGbMuM63o96I1GjYx5zskKgRI0FKSNsVWM7rwrRMTf6A== + version "9.13.0" + resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-9.13.0.tgz#2f69e66d1905c1e4eebc249a01759cf88ea00cf4" + integrity sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw== dependencies: "@types/web-bluetooth" "^0.0.16" - "@vueuse/metadata" "9.6.0" - "@vueuse/shared" "9.6.0" + "@vueuse/metadata" "9.13.0" + "@vueuse/shared" "9.13.0" vue-demi "*" -"@vueuse/metadata@9.6.0": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.6.0.tgz#b0a73277538cebef5d477983f74fdd2aa21ce5f9" - integrity sha512-sIC8R+kWkIdpi5X2z2Gk8TRYzmczDwHRhEFfCu2P+XW2JdPoXrziqsGpDDsN7ykBx4ilwieS7JUIweVGhvZ93w== +"@vueuse/metadata@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-9.13.0.tgz#bc25a6cdad1b1a93c36ce30191124da6520539ff" + integrity sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ== -"@vueuse/shared@9.6.0": - version "9.6.0" - resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.6.0.tgz#ce2e0e8124c6bdb1e270fc213e334ccc71dcb951" - integrity sha512-/eDchxYYhkHnFyrb00t90UfjCx94kRHxc7J1GtBCqCG4HyPMX+krV9XJgVtWIsAMaxKVU4fC8NSUviG1JkwhUQ== +"@vueuse/shared@9.13.0": + version "9.13.0" + resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-9.13.0.tgz#089ff4cc4e2e7a4015e57a8f32e4b39d096353b9" + integrity sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw== dependencies: vue-demi "*" @@ -1531,6 +1742,23 @@ JSONStream@1.3.2: jsonparse "^1.2.0" through ">=2.2.7 <3" +abbrev@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== + +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-2.0.0.tgz#cf59829b8b4f03f89dda2771cb7f3653828c89bf" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + +abort-controller@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" + integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== + dependencies: + event-target-shim "^5.0.0" + acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" @@ -1541,17 +1769,31 @@ acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== -agent-base@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" - integrity sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg== +agent-base@6, agent-base@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: - es6-promisify "^5.0.0" + debug "4" + +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + +agentkeepalive@^4.2.1: + version "4.5.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" + integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== + dependencies: + humanize-ms "^1.2.1" aggregate-error@^3.0.0: version "3.1.0" @@ -1572,34 +1814,34 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" uri-js "^4.2.2" -algoliasearch@^4.0.0: - version "4.14.2" - resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.14.2.tgz#63f142583bfc3a9bd3cd4a1b098bf6fe58e56f6c" - integrity sha512-ngbEQonGEmf8dyEh5f+uOIihv4176dgbuOZspiuhmTTBRBuzWu3KCGHre6uHj5YyuC7pNvQGzB6ZNJyZi0z+Sg== - dependencies: - "@algolia/cache-browser-local-storage" "4.14.2" - "@algolia/cache-common" "4.14.2" - "@algolia/cache-in-memory" "4.14.2" - "@algolia/client-account" "4.14.2" - "@algolia/client-analytics" "4.14.2" - "@algolia/client-common" "4.14.2" - "@algolia/client-personalization" "4.14.2" - "@algolia/client-search" "4.14.2" - "@algolia/logger-common" "4.14.2" - "@algolia/logger-console" "4.14.2" - "@algolia/requester-browser-xhr" "4.14.2" - "@algolia/requester-common" "4.14.2" - "@algolia/requester-node-http" "4.14.2" - "@algolia/transporter" "4.14.2" +algoliasearch@^4.19.1: + version "4.20.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-4.20.0.tgz#700c2cb66e14f8a288460036c7b2a554d0d93cf4" + integrity sha512-y+UHEjnOItoNy0bYO+WWmLWBlPwDjKHW6mNHrPi0NkuhpQOOEbrkwQH/wgKFDLh7qlKjzoKeiRtlpewDPDG23g== + dependencies: + "@algolia/cache-browser-local-storage" "4.20.0" + "@algolia/cache-common" "4.20.0" + "@algolia/cache-in-memory" "4.20.0" + "@algolia/client-account" "4.20.0" + "@algolia/client-analytics" "4.20.0" + "@algolia/client-common" "4.20.0" + "@algolia/client-personalization" "4.20.0" + "@algolia/client-search" "4.20.0" + "@algolia/logger-common" "4.20.0" + "@algolia/logger-console" "4.20.0" + "@algolia/requester-browser-xhr" "4.20.0" + "@algolia/requester-common" "4.20.0" + "@algolia/requester-node-http" "4.20.0" + "@algolia/transporter" "4.20.0" ansi-colors@4.1.1: version "4.1.1" @@ -1669,11 +1911,32 @@ append-transform@^2.0.0: dependencies: default-require-extensions "^3.0.0" +"aproba@^1.0.3 || ^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-2.0.0.tgz#52520b8ae5b569215b354efc0caa3fe1e45a8adc" + integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + archy@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== +are-we-there-yet@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz#679df222b278c64f2cdba1175cdc00b0d96164bd" + integrity sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg== + dependencies: + delegates "^1.0.0" + readable-stream "^3.6.0" + +are-we-there-yet@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-4.0.1.tgz#05a6fc0e5f70771b673e82b0f915616e0ace8fd3" + integrity sha512-2zuA+jpOYBRgoBCfa+fB87Rk0oGJjDX6pxGzqH6f33NzUhG25Xur6R0u0Z9VVAq8Z5JvQpQI6j6rtonuivC8QA== + dependencies: + delegates "^1.0.0" + readable-stream "^4.1.0" + arg@^5.0.0: version "5.0.2" resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c" @@ -1721,29 +1984,36 @@ async@~1.0.0: resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" integrity sha512-5mO7DX4CbJzp9zjaFXusQQ4tzKJARjNB1Ih1pVBi8wkbmXy/xzIDgEMXxWePLzt2OdFwaxfneIlT1nCiXubrPQ== +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + at-least-node@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== autoprefixer@^10.4.12: - version "10.4.13" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.13.tgz#b5136b59930209a321e9fa3dca2e7c4d223e83a8" - integrity sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg== + version "10.4.16" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.16.tgz#fad1411024d8670880bdece3970aa72e3572feb8" + integrity sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ== dependencies: - browserslist "^4.21.4" - caniuse-lite "^1.0.30001426" - fraction.js "^4.2.0" + browserslist "^4.21.10" + caniuse-lite "^1.0.30001538" + fraction.js "^4.3.6" normalize-range "^0.1.2" picocolors "^1.0.0" postcss-value-parser "^4.2.0" -axios@0.21.4: - version "0.21.4" - resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" - integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== +axios@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.5.1.tgz#11fbaa11fc35f431193a9564109c88c1f27b585f" + integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== dependencies: - follow-redirects "^1.14.0" + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" balanced-match@^1.0.0: version "1.0.2" @@ -1760,6 +2030,16 @@ before-after-hook@^2.2.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== +bin-links@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-4.0.3.tgz#9e4a3c5900830aee3d7f52178b65e01dcdde64a5" + integrity sha512-obsRaULtJurnfox/MDwgq6Yo9kzbv1CPTk/1/s7Z/61Lezc8IKkFCOXNeVLXz0456WRzBQmSsDWlai2tIhBsfA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1805,6 +2085,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1817,15 +2104,15 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.21.10, browserslist@^4.21.9: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -1858,11 +2145,85 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + cac@^6.7.14: version "6.7.14" resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== +cacache@^17.0.0, cacache@^17.0.4: + version "17.1.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-17.1.4.tgz#b3ff381580b47e85c6e64f801101508e26604b35" + integrity sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^7.7.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacache@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.0.tgz#17a9ecd6e1be2564ebe6cdca5f7cfed2bfeb6ddc" + integrity sha512-I7mVOPl3PUCeRub1U8YoGz2Lqv9WOBpobZ8RyWFXmReuILz+3OAyTa5oH3QPdtKZD7N0Yk00aLfzn0qvp8dZ1w== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^1.0.2" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + caching-transform@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" @@ -1897,10 +2258,10 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -caniuse-lite@^1.0.30001400, caniuse-lite@^1.0.30001426: - version "1.0.30001439" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" - integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== +caniuse-lite@^1.0.30001538, caniuse-lite@^1.0.30001541: + version "1.0.30001551" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001551.tgz#1f2cfa8820bd97c971a57349d7fd8f6e08664a3e" + integrity sha512-vtBAez47BoGMMzlbYhfXrMV1kvRF2WP/lqiMuDu1Sb4EE4LKEgjopFDSRtZfdVnslNRpOqV/woE+Xgrwj6VQlg== chai-as-promised@^7.1.1: version "7.1.1" @@ -1926,19 +2287,19 @@ chai@^3.5.0: type-detect "^1.0.0" chai@^4.2.0, chai@^4.3.4: - version "4.3.7" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.7.tgz#ec63f6df01829088e8bf55fca839bcd464a8ec51" - integrity sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A== + version "4.3.10" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.10.tgz#d784cec635e3b7e2ffb66446a63b4e33bd390384" + integrity sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g== dependencies: assertion-error "^1.1.0" - check-error "^1.0.2" - deep-eql "^4.1.2" - get-func-name "^2.0.0" - loupe "^2.3.1" + check-error "^1.0.3" + deep-eql "^4.1.3" + get-func-name "^2.0.2" + loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.5" + type-detect "^4.0.8" -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -1956,14 +2317,16 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: supports-color "^7.1.0" chalk@^5.0.0, chalk@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== -check-error@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - integrity sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA== +check-error@^1.0.2, check-error@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" + integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== + dependencies: + get-func-name "^2.0.2" chokidar@3.5.3, "chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: version "3.5.3" @@ -1985,7 +2348,12 @@ chownr@^1.0.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== -clean-stack@^2.0.0: +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + +clean-stack@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== @@ -2019,9 +2387,9 @@ cli-cursor@^4.0.0: restore-cursor "^4.0.0" cli-spinners@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== cli-truncate@2.1.0: version "2.1.0" @@ -2057,6 +2425,13 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + clone@2.x: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -2067,6 +2442,11 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== +cmd-shim@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-6.0.2.tgz#435fd9e5c95340e61715e19f90209ed6fcd9e0a4" + integrity sha512-+FFYbB0YLaAkhkcrjkyNLYDiOsFSfRjwjY19LXk/psmMx1z00xlCv7hhQoTGXXIKi+YXHL/iiFo8NqMVQX9nOw== + color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -2091,6 +2471,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== + colorette@^2.0.20: version "2.0.20" resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" @@ -2101,6 +2486,13 @@ colors@1.0.x: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw== +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + command-line-test@^1.0.10: version "1.0.10" resolved "https://registry.yarnpkg.com/command-line-test/-/command-line-test-1.0.10.tgz#7897c68076a9cfb6a53e78af069c316b5185ee7d" @@ -2111,6 +2503,11 @@ commander@2.15.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== +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" + integrity sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2136,11 +2533,21 @@ connect-history-api-fallback@^2.0.0: resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8" integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== +console-control-strings@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== + convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + copy-dir@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/copy-dir/-/copy-dir-0.4.0.tgz#bb7f603890ec20bf14678cbd6735fa46fc156be7" @@ -2178,10 +2585,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -csstype@^2.6.8: - version "2.6.21" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" - integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== +csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== cycle@1.0.x: version "1.0.3" @@ -2189,9 +2596,9 @@ cycle@1.0.x: integrity sha512-TVF6svNzeQCOpjCqsy0/CSy8VgObG3wXusJ73xW2GbG5rGx7lC8zxDSURicsXI2UsGdi2L0QNRCi745/wUDvsA== dayjs@^1.8.25: - version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== debug@3.1.0: version "3.1.0" @@ -2200,6 +2607,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.3, debug@^4.3.4: + 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" + debug@4.3.3: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" @@ -2207,20 +2621,13 @@ debug@4.3.3: dependencies: ms "2.1.2" -debug@^3.1.0, debug@^3.2.6: +debug@^3.2.6: version "3.2.7" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: ms "^2.1.1" -debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: - 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.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" @@ -2239,6 +2646,20 @@ decamelize@^4.0.0: resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== + dependencies: + mimic-response "^1.0.0" + +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" @@ -2246,7 +2667,7 @@ deep-eql@^0.1.3: dependencies: type-detect "0.1.1" -deep-eql@^4.1.2: +deep-eql@^4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.3.tgz#7c7775513092f7df98d8df9996dd085eb668cc6d" integrity sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw== @@ -2272,11 +2693,31 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + delay@^5: version "5.0.0" resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ== + deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" @@ -2304,6 +2745,20 @@ dir-glob@^3.0.1: dependencies: path-type "^4.0.0" +dns-packet@^5.2.4: + version "5.6.1" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.6.1.tgz#ae888ad425a9d1478a0674256ab866de1012cf2f" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +dns-socket@^4.2.2: + version "4.2.2" + resolved "https://registry.yarnpkg.com/dns-socket/-/dns-socket-4.2.2.tgz#58b0186ec053ea0731feb06783c7eeac4b95b616" + integrity sha512-BDeBd8najI4/lS00HSKpdFia+OvUMytaVjfzR9n5Lq8MlZRSvtbI+uLtx1+XmQFls5wFU9dssccTmQQ6nfpjdg== + dependencies: + dns-packet "^5.2.4" + docker-modem@^1.0.8: version "1.0.9" resolved "https://registry.yarnpkg.com/docker-modem/-/docker-modem-1.0.9.tgz#a1f13e50e6afb6cf3431b2d5e7aac589db6aaba8" @@ -2323,9 +2778,9 @@ dockerfile-ast@0.6.1: vscode-languageserver-types "^3.17.3" dockerfile-generator@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/dockerfile-generator/-/dockerfile-generator-5.0.0.tgz#47c7693feb1370a10b700850dd85a3b4531ac408" - integrity sha512-a9c4YdWv39C/wL99GUEHFCvUt1H7oqWqqDPpd1qlx0Y4KutPlO5f23TmHYXlT9x0mBun+TeMlBZhxiG8wLH10g== + version "5.0.2" + resolved "https://registry.yarnpkg.com/dockerfile-generator/-/dockerfile-generator-5.0.2.tgz#60b9ca7b85ebb0e257b0f4bd9ce2fb2c1125f61a" + integrity sha512-jtFB/LKtVvSF2aik4PqJWpx7o2B3xWoZ5XH2muxsuBkCrOdPBVu0MoKgvv/Sf+yv70rVkIOph+GgcN1o6rJkmQ== dependencies: jsonschema "^1.4.0" @@ -2359,20 +2814,20 @@ dot@^1.1.2: resolved "https://registry.yarnpkg.com/dot/-/dot-1.1.3.tgz#351360e00a748bce9a1f8f27c00c394a7e4e1e9f" integrity sha512-/nt74Rm+PcfnirXGEdhZleTwGC2LMnuKTeeTIlI82xb5loBBoXNYzr2ezCroPSMtilK8EZIfcNZwOcHN+ib1Lg== -dotenv@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-4.0.0.tgz#864ef1379aced55ce6f95debecdce179f7a0cd1d" - integrity sha512-XcaMACOr3JMVcEv0Y/iUM2XaOsATRZ3U1In41/1jjK6vJZ2PZbQ1bzCG8uvaByfaBpl9gqc9QWJovpUGBXLLYQ== +duplexer3@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.5.tgz#0b5e4d7bad5de8901ea4440624c8e1d20099217e" + integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== eastasianwidth@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.535: + version "1.4.563" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.563.tgz#dabb424202754c1fed2d2938ff564b23d3bbf0d3" + integrity sha512-dg5gj5qOgfZNkPNeyKBZQAQitIQ/xwfIDmEQJHCbXaD9ebTZxwJXUsDYcBlAvZGZLi+/354l35J1wkmP6CqYaw== emoji-regex@^8.0.0: version "8.0.0" @@ -2384,6 +2839,13 @@ emoji-regex@^9.2.2: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== +encoding@^0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" @@ -2391,22 +2853,33 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enquirer@^2.3.5: - version "2.3.6" - resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" - integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== +enquirer@^2.3.5, enquirer@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" + integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== dependencies: ansi-colors "^4.1.1" + strip-ansi "^6.0.1" entities@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== +env-paths@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + envinfo@^7.8.1: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + version "7.10.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.10.0.tgz#55146e3909cc5fe63c22da63fb15b05aeac35b13" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + +err-code@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" + integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== error-ex@^1.3.1: version "1.3.2" @@ -2420,18 +2893,6 @@ es6-error@^4.0.1: resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== -es6-promise@^4.0.3: - version "4.2.8" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" - integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== - -es6-promisify@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" - integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== - dependencies: - es6-promise "^4.0.3" - esbuild-android-64@0.15.18: version "0.15.18" resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5" @@ -2601,9 +3062,9 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: estraverse "^4.1.1" eslint-scope@^7.0.0: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -2632,10 +3093,10 @@ eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.1.0, eslint-visitor-keys@^3.4.1: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^7.32.0: version "7.32.0" @@ -2693,13 +3154,13 @@ espree@^7.3.0, espree@^7.3.1: eslint-visitor-keys "^1.3.0" espree@^9.0.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0: version "4.0.1" @@ -2707,9 +3168,9 @@ esprima@^4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -2740,11 +3201,21 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +event-target-shim@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" + integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== + eventemitter3@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + execa@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" @@ -2760,6 +3231,11 @@ execa@^6.1.0: signal-exit "^3.0.7" strip-final-newline "^3.0.0" +exponential-backoff@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6" + integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -2777,10 +3253,10 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== -fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== +fast-glob@^3.2.9, fast-glob@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -2799,9 +3275,9 @@ fast-levenshtein@^2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -2845,11 +3321,12 @@ find-up@^4.0.0, find-up@^4.1.0: path-exists "^4.0.0" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" flat@^5.0.2: @@ -2857,22 +3334,15 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== - -follow-redirects@1.2.6: - version "1.2.6" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.2.6.tgz#4dcdc7e4ab3dd6765a97ff89c3b4c258117c79bf" - integrity sha512-FrMqZ/FONtHnbqO651UPpfRUVukIEwJhXMfdr/JWAmrDbeYBu773b1J6gdWDyRIj4hvvzQEHoEOTrdR8o6KLYA== - dependencies: - debug "^3.1.0" +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== -follow-redirects@^1.14.0: - version "1.15.2" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== +follow-redirects@^1.15.0: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== foreground-child@^2.0.0: version "2.0.0" @@ -2882,10 +3352,27 @@ foreground-child@^2.0.0: cross-spawn "^7.0.0" signal-exit "^3.0.2" -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +foreground-child@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" + integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +fraction.js@^4.3.6: + version "4.3.7" + resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.3.7.tgz#06ca0085157e42fda7f9e726e79fefc4068840f7" + integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== fromentries@^1.2.0: version "1.3.2" @@ -2906,6 +3393,15 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" @@ -2934,26 +3430,68 @@ fs-extra@^9.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-minipass@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== + dependencies: + minipass "^3.0.0" + +fs-minipass@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-3.0.3.tgz#79a85981c4dc120065e96f62086bf6f9dc26cc54" + integrity sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw== + dependencies: + minipass "^7.0.3" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 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== + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g== +gauge@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" + integrity sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^3.0.7" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + +gauge@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-5.0.1.tgz#1efc801b8ff076b86ef3e9a7a280a975df572112" + integrity sha512-CmykPMJGuNan/3S4kZOpvvPYSNqSHANiWnh9XcMU2pSjtBfF0XzZ2p1bFAxTbnFxyBuPxQYHhzwaoOmUdqzvxQ== + dependencies: + aproba "^1.0.3 || ^2.0.0" + color-support "^1.1.3" + console-control-strings "^1.1.0" + has-unicode "^2.0.1" + signal-exit "^4.0.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" + wide-align "^1.1.5" + generate-robotstxt@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/generate-robotstxt/-/generate-robotstxt-8.0.3.tgz#83384090406e760e9d02247412b2b704562c9b58" @@ -2976,7 +3514,7 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-func-name@^2.0.0: +get-func-name@^2.0.1, get-func-name@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== @@ -2986,23 +3524,25 @@ get-package-type@^0.1.0: resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + get-stream@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== -github@^12.0.0: - version "12.1.0" - resolved "https://registry.yarnpkg.com/github/-/github-12.1.0.tgz#f2a2dcbd441178155942257491a4bc08bf661dd7" - integrity sha512-HhWjhd/OATC4Hjj7xfGjGRtwWzo/fzTc55EkvsRatI9G6Vp47mVcdBIt1lQ56A9Qit/yVQRX1+M9jbWlcJvgug== - dependencies: - dotenv "^4.0.0" - follow-redirects "1.2.6" - https-proxy-agent "^2.1.0" - lodash "^4.17.4" - mime "^2.0.3" - netrc "^0.1.4" - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -3034,6 +3574,17 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^10.2.2: + version "10.3.10" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" + integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== + dependencies: + foreground-child "^3.1.0" + jackspeak "^2.3.5" + minimatch "^9.0.1" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry "^1.10.1" + glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" @@ -3046,15 +3597,25 @@ glob@^7.0.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^9.2.0: + version "9.3.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" + integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== + dependencies: + fs.realpath "^1.0.0" + minimatch "^8.0.2" + minipass "^4.2.4" + path-scurry "^1.6.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.18.0.tgz#fb224daeeb2bb7d254cd2c640f003528b8d0c1dc" - integrity sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" @@ -3071,20 +3632,54 @@ globby@^11.0.1, globby@^11.1.0: slash "^3.0.0" globby@^13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + version "13.2.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.2.2.tgz#63b90b1bf68619c2135475cbd4e71e66aa090592" + integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== dependencies: dir-glob "^3.0.1" - fast-glob "^3.2.11" - ignore "^5.2.0" + fast-glob "^3.3.0" + ignore "^5.2.4" merge2 "^1.4.1" slash "^4.0.0" -graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0: - version "4.2.10" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" - integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== +got@^11.8.0: + version "11.8.6" + resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + +graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.6: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== gravatar-url@^4.0.1: version "4.0.1" @@ -3124,12 +3719,10 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== - dependencies: - function-bind "^1.1.1" +has-unicode@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== hash-sum@^2.0.0: version "2.0.0" @@ -3144,6 +3737,13 @@ hasha@^5.0.0: is-stream "^2.0.0" type-fest "^0.8.0" +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== + dependencies: + function-bind "^1.1.2" + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -3159,43 +3759,116 @@ hosted-git-info@^2.1.4: resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== +hosted-git-info@^6.0.0, hosted-git-info@^6.1.1: + version "6.1.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-6.1.1.tgz#629442c7889a69c05de604d52996b74fe6f26d58" + integrity sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w== + dependencies: + lru-cache "^7.5.1" + +hosted-git-info@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-7.0.1.tgz#9985fcb2700467fecf7f33a4d4874e30680b5322" + integrity sha512-+K84LB1DYwMHoHSgaOY/Jfhw3ucPmSET5v98Ke/HdNSw4a0UktWzyW1mjhjpuxxTqOOsfWT/7iVshHmVZ4IpOA== + dependencies: + lru-cache "^10.0.1" + html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== -https-proxy-agent@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz#4ee7a737abd92678a293d9b34a1af4d0d08c787b" - integrity sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg== +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== + +http-proxy-agent@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz#5129800203520d434f142bc78ff3c170800f2b43" + integrity sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + +http2-wrapper@^1.0.0-beta.5.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +https-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== dependencies: - agent-base "^4.3.0" - debug "^3.1.0" + agent-base "^7.0.2" + debug "4" human-signals@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== + dependencies: + ms "^2.0.0" + +iconv-lite@^0.6.2: + version "0.6.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + ieee754@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== +ignore-walk@^6.0.0: + version "6.0.3" + resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-6.0.3.tgz#0fcdb6decaccda35e308a7b0948645dd9523b7bb" + integrity sha512-C7FfFoTA+bI10qfeydT8aZbvr91vAEU+2W5BZUlzPec47oNb07SsOfwYrtxuvOYdUApPP/Qlh4DtAO51Ekk2QA== + dependencies: + minimatch "^9.0.0" + ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -ignore@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.1.tgz#c2b1f76cb999ede1502f3a226a9310fdfe88d46c" - integrity sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA== +ignore@^5.2.0, ignore@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== immutable@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.1.0.tgz#f795787f0db780183307b9eb2091fcac1f6fafef" - integrity sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ== + version "4.3.4" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.4.tgz#2e07b33837b4bb7662f288c244d1ced1ef65a78f" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: version "3.3.0" @@ -3233,7 +3906,7 @@ interpret@^1.0.0: resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== -ip-regex@^4.1.0: +ip-regex@^4.0.0, ip-regex@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5" integrity sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q== @@ -3243,6 +3916,11 @@ ip@^1.1.8: resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== +ip@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" + integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== + is-absolute-url@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz#96c6a22b6a23929b11ea0afb1836c36ad4a5d698" @@ -3265,12 +3943,12 @@ is-class@^0.0.9: resolved "https://registry.yarnpkg.com/is-class/-/is-class-0.0.9.tgz#3024c17b1cf8f6bdc1f3eca1bae507ea992b6d93" integrity sha512-kUfRnejcRC9YLgblxoJ76dp9gZ3vMKTrDS5I6z2UVMOsHHSImNKCJocjQTkZr38PwiSZ9LVklaHEENaVYeFTXg== -is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== +is-core-module@^2.13.0, is-core-module@^2.8.1: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - has "^1.0.3" + hasown "^2.0.0" is-docker@^2.0.0: version "2.2.1" @@ -3304,16 +3982,43 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-interactive@^1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e" + integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== + is-interactive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== +is-ip@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-ip/-/is-ip-3.1.0.tgz#2ae5ddfafaf05cb8008a62093cf29734f657c5d8" + integrity sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q== + dependencies: + ip-regex "^4.0.0" + +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== +is-online@^9: + version "9.0.1" + resolved "https://registry.yarnpkg.com/is-online/-/is-online-9.0.1.tgz#71a34202fa826bae6f3ff8bea420c56573448a5f" + integrity sha512-+08dRW0dcFOtleR2N3rHRVxDyZtQitUp9cC+KpKTds0mXibbQyW5js7xX0UGyQXkaLUJObe0w6uQ4ex34lX9LA== + dependencies: + got "^11.8.0" + p-any "^3.0.0" + p-timeout "^3.2.0" + public-ip "^4.0.4" + is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" @@ -3329,6 +4034,11 @@ is-plain-object@^5.0.0: resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== +is-root@^2: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + is-stream@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" @@ -3421,12 +4131,12 @@ istanbul-lib-processinfo@^2.0.2: uuid "^8.3.2" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -3439,13 +4149,22 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" +jackspeak@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" + integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -3471,11 +4190,26 @@ jsesc@^2.5.1: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== +json-buffer@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" + integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + json-parse-even-better-errors@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz#2cb2ee33069a78870a0c7e3da560026b89669cf7" + integrity sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA== + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -3491,7 +4225,12 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json5@^2.2.1: +json-stringify-nice@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67" + integrity sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== + +json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== @@ -3519,7 +4258,7 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonparse@^1.2.0: +jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== @@ -3529,20 +4268,44 @@ jsonschema@^1.4.0: resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== +just-diff-apply@^5.2.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/just-diff-apply/-/just-diff-apply-5.5.0.tgz#771c2ca9fa69f3d2b54e7c3f5c1dfcbcc47f9f0f" + integrity sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== + +just-diff@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-6.0.2.tgz#03b65908543ac0521caf6d8eb85035f7d27ea285" + integrity sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== + just-extend@^4.0.2: version "4.2.1" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" integrity sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg== +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + +keyv@^4.0.0, keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== klona@^2.0.4: - version "2.0.5" - resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" - integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== + version "2.0.6" + resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.6.tgz#85bffbf819c03b2f53270412420a4555ef882e22" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== levn@^0.4.1: version "0.4.1" @@ -3553,9 +4316,9 @@ levn@^0.4.1: type-check "~0.4.0" lilconfig@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4" - integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== lines-and-columns@^1.1.6: version "1.2.4" @@ -3615,7 +4378,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== -lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17.4: +lodash@^4.17.11, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3669,12 +4432,34 @@ lolex@^5.0.1: dependencies: "@sinonjs/commons" "^1.7.0" -loupe@^2.3.1: - version "2.3.6" - resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.6.tgz#76e4af498103c532d1ecc9be102036a21f787b53" - integrity sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA== +loupe@^2.3.6: + version "2.3.7" + resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" + integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== + dependencies: + get-func-name "^2.0.1" + +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== + +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + +lru-cache@^10.0.1, "lru-cache@^9.1.1 || ^10.0.0": + version "10.0.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.0.1.tgz#0a3be479df549cca0e5d693ac402ff19537a6b7a" + integrity sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== dependencies: - get-func-name "^2.0.0" + yallist "^3.0.2" lru-cache@^6.0.0: version "6.0.0" @@ -3683,12 +4468,17 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -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== +lru-cache@^7.4.4, lru-cache@^7.5.1, lru-cache@^7.7.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +magic-string@^0.30.5: + version "0.30.5" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.5.tgz#1994d980bd1c8835dc6e78db7cbd4ae4f24746f9" + integrity sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA== dependencies: - sourcemap-codec "^1.4.8" + "@jridgewell/sourcemap-codec" "^1.4.15" make-dir@^3.0.0, make-dir@^3.0.2: version "3.1.0" @@ -3697,6 +4487,51 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-fetch-happen@^11.0.0, make-fetch-happen@^11.0.1, make-fetch-happen@^11.0.3, make-fetch-happen@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz#85ceb98079584a9523d4bf71d32996e7e208549f" + integrity sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w== + dependencies: + agentkeepalive "^4.2.1" + cacache "^17.0.0" + http-cache-semantics "^4.1.1" + http-proxy-agent "^5.0.0" + https-proxy-agent "^5.0.0" + is-lambda "^1.0.1" + lru-cache "^7.7.1" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + socks-proxy-agent "^7.0.0" + ssri "^10.0.0" + +make-fetch-happen@^13.0.0: + version "13.0.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-13.0.0.tgz#705d6f6cbd7faecb8eac2432f551e49475bfedf0" + integrity sha512-7ThobcL8brtGo9CavByQrQi+23aIfgYU++wg4B87AIS8Rb2ZBt/MEaDqzA00Xwv/jUjAjYkLHjVolYuTLKda2A== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" + is-lambda "^1.0.1" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + promise-retry "^2.0.1" + ssri "^10.0.0" + map-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -3708,9 +4543,9 @@ map-obj@^4.0.0: integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== markdown-it-anchor@^8.6.5: - version "8.6.5" - resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.5.tgz#30c4bc5bbff327f15ce3c429010ec7ba75e7b5f8" - integrity sha512-PI1qEHHkTNWT+X6Ip9w+paonfIQ+QZP9sCeMYi47oqhH+EsW8CrJ8J7CzV19QVOj6il8ATGbK2nTECj22ZHGvQ== + version "8.6.7" + resolved "https://registry.yarnpkg.com/markdown-it-anchor/-/markdown-it-anchor-8.6.7.tgz#ee6926daf3ad1ed5e4e3968b1740eef1c6399634" + integrity sha512-FlCHFwNnutLgVTflOYHPW2pPcl2AACqVzExlkGQNsi4CJgqOHN7YTgDd4LuhgN1BFO3TS0vLAruV1Td6dwWPJA== markdown-it-container@^3.0.0: version "3.0.0" @@ -3723,9 +4558,9 @@ markdown-it-emoji@^2.0.2: integrity sha512-zLftSaNrKuYl0kR5zm4gxXjHaOI3FAOEaloKmRA5hijmJZvSjmxcokOLlzycb/HXlUFWzXqpIEoyEMCE4i9MvQ== markdown-it@^13.0.1: - version "13.0.1" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" - integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== + version "13.0.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.2.tgz#1bc22e23379a6952e5d56217fbed881e0c94d536" + integrity sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w== dependencies: argparse "^2.0.1" entities "~3.0.1" @@ -3790,10 +4625,17 @@ micromatch@^4.0.4: braces "^3.0.2" picomatch "^2.3.1" -mime@^2.0.3: - version "2.6.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" - integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" mimic-fn@^2.1.0: version "2.1.0" @@ -3805,6 +4647,16 @@ mimic-fn@^4.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-4.0.0.tgz#60a90550d5cb0b239cca65d893b1a53b29871ecc" integrity sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw== +mimic-response@^1.0.0, mimic-response@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869" @@ -3831,6 +4683,20 @@ minimatch@^3.0.4, minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" +minimatch@^8.0.2: + version "8.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-8.0.4.tgz#847c1b25c014d4e9a7f68aaf63dedd668a626229" + integrity sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== + dependencies: + brace-expansion "^2.0.1" + +minimatch@^9.0.0, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -3846,9 +4712,86 @@ minimist@0.0.8: integrity sha512-miQKw5Hv4NS1Psg2517mV4e4dYNaO3++hjAvLOAzKqZ61rH8NS1SK+vbfBWZ5PY/Me/bEWhUwqMghEW5Fb9T7Q== minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +minipass-collect@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617" + integrity sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA== + dependencies: + minipass "^3.0.0" + +minipass-fetch@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minipass-fetch/-/minipass-fetch-3.0.4.tgz#4d4d9b9f34053af6c6e597a64be8e66e42bf45b7" + integrity sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg== + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + optionalDependencies: + encoding "^0.1.13" + +minipass-flush@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz#82e7135d7e89a50ffe64610a787953c4c4cbb373" + integrity sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== + dependencies: + minipass "^3.0.0" + +minipass-json-stream@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz#7edbb92588fbfc2ff1db2fc10397acb7b6b44aa7" + integrity sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg== + dependencies: + jsonparse "^1.3.1" + minipass "^3.0.0" + +minipass-pipeline@^1.2.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz#68472f79711c084657c067c5c6ad93cddea8214c" + integrity sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== + dependencies: + minipass "^3.0.0" + +minipass-sized@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/minipass-sized/-/minipass-sized-1.0.3.tgz#70ee5a7c5052070afacfbc22977ea79def353b70" + integrity sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== + dependencies: + minipass "^3.0.0" + +minipass@^3.0.0: + version "3.3.6" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.3.6.tgz#7bba384db3a1520d18c9c0e5251c3444e95dd94a" + integrity sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== + dependencies: + yallist "^4.0.0" + +minipass@^4.2.4: + version "4.2.8" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a" + integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== + +minipass@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d" + integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.0.2, minipass@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" + integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== + +minizlib@^2.1.1, minizlib@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== + dependencies: + minipass "^3.0.0" + yallist "^4.0.0" mkdir-p@~0.0.4: version "0.0.7" @@ -3869,6 +4812,11 @@ mkdirp@^0.5.1: dependencies: minimist "^1.2.6" +mkdirp@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== + mocha@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" @@ -3930,7 +4878,7 @@ ms@2.1.2: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -ms@2.1.3, ms@^2.1.1: +ms@2.1.3, ms@^2.0.0, ms@^2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== @@ -3950,16 +4898,16 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +negotiator@^0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== -netrc@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/netrc/-/netrc-0.1.4.tgz#6be94fcaca8d77ade0a9670dc460914c94472444" - integrity sha512-ye8AIYWQcP9MvoM1i0Z2jV0qed31Z8EWXYnyGNkiUAd+Fo8J+7uy90xTV8g/oAbhtjkY7iZbNTizQaXdKUuwpQ== - nise@^1.2.0: version "1.5.3" resolved "https://registry.yarnpkg.com/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" @@ -3980,12 +4928,29 @@ node-cache@^4.1.1: lodash "^4.17.15" node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" +node-gyp@^9.0.0: + version "9.4.0" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.0.tgz#2a7a91c7cba4eccfd95e949369f27c9ba704f369" + integrity sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^7.1.4" + graceful-fs "^4.2.6" + make-fetch-happen "^11.0.3" + nopt "^6.0.0" + npmlog "^6.0.0" + rimraf "^3.0.2" + semver "^7.3.5" + tar "^6.1.2" + which "^2.0.2" + node-preload@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" @@ -3993,10 +4958,24 @@ node-preload@^0.2.1: dependencies: process-on-spawn "^1.0.0" -node-releases@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" - integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +nopt@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-6.0.0.tgz#245801d8ebf409c6df22ab9d95b65e1309cdb16d" + integrity sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g== + dependencies: + abbrev "^1.0.0" + +nopt@^7.0.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-7.2.0.tgz#067378c68116f602f552876194fd11f1292503d7" + integrity sha512-CVDtwCdhYIvnAzFoJ6NJ6dX3oga9/HyciQDnG1vQDjSLMeKLJ4A93ZqYKDrgYSr1FBY5/hMYC+2VCi24pgpkGA== + dependencies: + abbrev "^2.0.0" normalize-package-data@^2.5.0: version "2.5.0" @@ -4008,6 +4987,16 @@ normalize-package-data@^2.5.0: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-5.0.0.tgz#abcb8d7e724c40d88462b84982f7cbf6859b4588" + integrity sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q== + dependencies: + hosted-git-info "^6.0.0" + is-core-module "^2.8.1" + semver "^7.3.5" + validate-npm-package-license "^3.0.4" + normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -4018,6 +5007,106 @@ normalize-range@^0.1.2: resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-bundled@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-3.0.0.tgz#7e8e2f8bb26b794265028491be60321a25a39db7" + integrity sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-6.3.0.tgz#046552d8920e801fa9f919cad569545d60e826fe" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz#25447e32a9a7de1f51362c61a559233b89947832" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + +npm-package-arg@^10.0.0, npm-package-arg@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-10.1.0.tgz#827d1260a683806685d17193073cc152d3c7e9b1" + integrity sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA== + dependencies: + hosted-git-info "^6.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-package-arg@^11.0.0, npm-package-arg@^11.0.1: + version "11.0.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-11.0.1.tgz#f208b0022c29240a1c532a449bdde3f0a4708ebc" + integrity sha512-M7s1BD4NxdAvBKUPqqRW957Xwcl/4Zvo8Aj+ANrzvIPzGJZElrH7Z//rSaec2ORcND6FHHLnZeY8qgTpXDMFQQ== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^3.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + +npm-packlist@^7.0.0: + version "7.0.4" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-7.0.4.tgz#033bf74110eb74daf2910dc75144411999c5ff32" + integrity sha512-d6RGEuRrNS5/N84iglPivjaJPxhDbZmlbTwTDX2IbcRHG5bZCdtysYMhwiPvcF4GisXHGn7xsxv+GQ7T/02M5Q== + dependencies: + ignore-walk "^6.0.0" + +npm-pick-manifest@^8.0.0, npm-pick-manifest@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz#2159778d9c7360420c925c1a2287b5a884c713aa" + integrity sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^10.0.0" + semver "^7.3.5" + +npm-profile@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/npm-profile/-/npm-profile-9.0.0.tgz#ffcfa4e3e1b1cb44b17c192f75b44b24b4aae645" + integrity sha512-qv43ixsJ7vndzfxD3XsPNu1Njck6dhO7q1efksTo+0DiOQysKSOsIhK/qDD1/xO2o+2jDOA4Rv/zOJ9KQFs9nw== + dependencies: + npm-registry-fetch "^16.0.0" + proc-log "^3.0.0" + +npm-registry-fetch@^14.0.0, npm-registry-fetch@^14.0.3: + version "14.0.5" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz#fe7169957ba4986a4853a650278ee02e568d115d" + integrity sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA== + dependencies: + make-fetch-happen "^11.0.0" + minipass "^5.0.0" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^10.0.0" + proc-log "^3.0.0" + +npm-registry-fetch@^16.0.0: + version "16.1.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-16.1.0.tgz#10227b7b36c97bc1cf2902a24e4f710cfe62803c" + integrity sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw== + dependencies: + make-fetch-happen "^13.0.0" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-json-stream "^1.0.1" + minizlib "^2.1.2" + npm-package-arg "^11.0.0" + proc-log "^3.0.0" + npm-run-path@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" @@ -4025,6 +5114,26 @@ npm-run-path@^5.1.0: dependencies: path-key "^4.0.0" +npmlog@^6.0.0: + version "6.0.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-6.0.2.tgz#c8166017a42f2dea92d6453168dd865186a70830" + integrity sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg== + dependencies: + are-we-there-yet "^3.0.0" + console-control-strings "^1.1.0" + gauge "^4.0.3" + set-blocking "^2.0.0" + +npmlog@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-7.0.1.tgz#7372151a01ccb095c47d8bf1d0771a4ff1f53ac8" + integrity sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg== + dependencies: + are-we-there-yet "^4.0.0" + console-control-strings "^1.1.0" + gauge "^5.0.0" + set-blocking "^2.0.0" + nth-check@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" @@ -4097,32 +5206,55 @@ onetime@^6.0.0: mimic-fn "^4.0.0" optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" ora@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ora/-/ora-6.1.2.tgz#7b3c1356b42fd90fb1dad043d5dbe649388a0bf5" - integrity sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw== + version "6.3.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.1.tgz#a4e9e5c2cf5ee73c259e8b410273e706a2ad3ed6" + integrity sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ== dependencies: - bl "^5.0.0" chalk "^5.0.0" cli-cursor "^4.0.0" cli-spinners "^2.6.1" is-interactive "^2.0.0" is-unicode-supported "^1.1.0" log-symbols "^5.1.0" + stdin-discarder "^0.1.0" strip-ansi "^7.0.1" wcwidth "^1.0.1" +p-any@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-any/-/p-any-3.0.0.tgz#79847aeed70b5d3a10ea625296c0c3d2e90a87b9" + integrity sha512-5rqbqfsRWNb0sukt0awwgJMlaep+8jV45S15SKKB34z4UuzjcofIfnriCBhWjZP2jbVtjt9yRl7buB6RlKsu9w== + dependencies: + p-cancelable "^2.0.0" + p-some "^5.0.0" + +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -4158,6 +5290,28 @@ p-map@^3.0.0: dependencies: aggregate-error "^3.0.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-4.0.0.tgz#bb2f95a5eda2ec168ec9274e06a747c3e2904d2b" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + +p-some@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-some/-/p-some-5.0.0.tgz#8b730c74b4fe5169d7264a240ad010b6ebc686a4" + integrity sha512-Js5XZxo6vHjB9NOYAzWDYAIyyiPvva0DWESAIWIK7uhSpGsyg5FwUPxipU/SOQx5x9EqhOh545d1jo6cVkitig== + dependencies: + aggregate-error "^3.0.0" + p-cancelable "^2.0.0" + +p-timeout@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-3.2.0.tgz#c7e17abc971d2a7962ef83626b35d635acf23dfe" + integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== + dependencies: + p-finally "^1.0.0" + p-try@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" @@ -4173,6 +5327,30 @@ package-hash@^4.0.0: lodash.flattendeep "^4.4.0" release-zalgo "^1.0.0" +pacote@^15.0.0, pacote@^15.0.8, pacote@^15.1.3: + version "15.2.0" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-15.2.0.tgz#0f0dfcc3e60c7b39121b2ac612bf8596e95344d3" + integrity sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA== + dependencies: + "@npmcli/git" "^4.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/promise-spawn" "^6.0.1" + "@npmcli/run-script" "^6.0.0" + cacache "^17.0.0" + fs-minipass "^3.0.0" + minipass "^5.0.0" + npm-package-arg "^10.0.0" + npm-packlist "^7.0.0" + npm-pick-manifest "^8.0.0" + npm-registry-fetch "^14.0.0" + proc-log "^3.0.0" + promise-retry "^2.0.1" + read-package-json "^6.0.0" + read-package-json-fast "^3.0.0" + sigstore "^1.3.0" + ssri "^10.0.0" + tar "^6.1.11" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -4180,6 +5358,15 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz#67dc55312781e62aa2ddb91452c7606d1969960c" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -4215,6 +5402,14 @@ path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.10.1, path-scurry@^1.6.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" + integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== + dependencies: + lru-cache "^9.1.1 || ^10.0.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + path-to-regexp@^1.7.0: version "1.8.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" @@ -4257,10 +5452,10 @@ postcss-load-config@^4.0.1: lilconfig "^2.0.5" yaml "^2.1.1" -postcss-selector-parser@^6.0.9: - version "6.0.11" - resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz#2e41dc39b7ad74046e1615185185cd0b17d0c8dc" - integrity sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g== +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.9: + version "6.0.13" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz#d05d8d76b1e8e173257ef9d60b706a8e5e99bf1b" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -4270,7 +5465,7 @@ postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.1.10, postcss@^8.4.16, postcss@^8.4.18: +postcss@^8.4.16, postcss@^8.4.18, postcss@^8.4.31: version "8.4.31" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== @@ -4280,20 +5475,30 @@ postcss@^8.1.10, postcss@^8.4.16, postcss@^8.4.18: source-map-js "^1.0.2" preact@^10.0.0: - version "10.11.3" - resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19" - integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg== + version "10.18.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.18.1.tgz#3b84bb305f0b05f4ad5784b981d15fcec4e105da" + integrity sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg== prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== +prepend-http@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" + integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== + prismjs@^1.29.0: version "1.29.0" resolved "https://registry.yarnpkg.com/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12" integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== +proc-log@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-3.0.0.tgz#fb05ef83ccd64fd7b20bbe9c8c1070fc08338dd8" + integrity sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -4306,11 +5511,53 @@ process-on-spawn@^1.0.0: dependencies: fromentries "^1.2.0" +process@^0.11.10: + version "0.11.10" + resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" + integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== +promise-all-reject-late@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2" + integrity sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== + +promise-call-limit@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/promise-call-limit/-/promise-call-limit-1.0.2.tgz#f64b8dd9ef7693c9c7613e7dfe8d6d24de3031ea" + integrity sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA== + +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + +promise-retry@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22" + integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== + dependencies: + err-code "^2.0.2" + retry "^0.12.0" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +public-ip@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/public-ip/-/public-ip-4.0.4.tgz#b3784a5a1ff1b81d015b9a18450be65ffd929eb3" + integrity sha512-EJ0VMV2vF6Cu7BIPo3IMW1Maq6ME+fbR0NcPmqDfpfNGIRPue1X8QrGjrg/rfjDkOsIkKHIf2S5FlEa48hFMTA== + dependencies: + dns-socket "^4.2.2" + got "^9.6.0" + is-ip "^3.1.0" + pump@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" @@ -4319,10 +5566,18 @@ pump@^1.0.0: end-of-stream "^1.1.0" once "^1.3.1" +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== queue-microtask@^1.2.2: version "1.2.3" @@ -4334,6 +5589,11 @@ quick-lru@^4.0.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" @@ -4341,6 +5601,29 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz#640a08b473a49043e394ae0c7a34dd822c73b9bb" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz#394908a9725dc7a5f14e70c8e7556dff1d2b1049" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + +read-package-json@^6.0.0: + version "6.0.4" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-6.0.4.tgz#90318824ec456c287437ea79595f4c2854708836" + integrity sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw== + dependencies: + glob "^10.2.2" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^5.0.0" + npm-normalize-package-bin "^3.0.0" + read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -4361,9 +5644,9 @@ read-pkg@^5.2.0: type-fest "^0.6.0" readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -4373,15 +5656,26 @@ readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== +readable-stream@^3.4.0, readable-stream@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^4.1.0: + version "4.4.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.4.2.tgz#e6aced27ad3b9d726d8308515b9a1b98dc1b9d13" + integrity sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA== + dependencies: + abort-controller "^3.0.0" + buffer "^6.0.3" + events "^3.3.0" + process "^0.11.10" + string_decoder "^1.3.0" + readable-stream@~1.0.26-4: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" @@ -4441,6 +5735,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -4452,14 +5751,28 @@ resolve-from@^5.0.0: integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== resolve@^1.1.6, resolve@^1.10.0, resolve@^1.22.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +responselike@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" + integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== + dependencies: + lowercase-keys "^1.0.0" + +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + restore-cursor@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" @@ -4476,6 +5789,11 @@ restore-cursor@^4.0.0: onetime "^5.1.0" signal-exit "^3.0.2" +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -4494,9 +5812,11 @@ rimraf@^3.0.0, rimraf@^3.0.2: glob "^7.1.3" rimraf@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.1.1.tgz#ec29817863e5d82d22bca82f9dc4325be2f1e72b" - integrity sha512-Z4Y81w8atcvaJuJuBB88VpADRH66okZAuEm+Jtaufa+s7rZmIz+Hik2G53kGaNytE7lsfXyWktTmfVz0H9xuDg== + version "4.4.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-4.4.1.tgz#bd33364f67021c5b79e93d7f4fa0568c7c21b755" + integrity sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== + dependencies: + glob "^9.2.0" rollup@^2.79.1: version "2.79.1" @@ -4529,6 +5849,11 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== +"safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + samsam@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" @@ -4543,18 +5868,18 @@ sass-loader@^12.4.0: neo-async "^2.6.2" sass@^1.47.0, sass@^1.55.0: - version "1.56.2" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.56.2.tgz#9433b345ab3872996c82a53a58c014fd244fd095" - integrity sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w== + version "1.69.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.69.4.tgz#10c735f55e3ea0b7742c6efa940bce30e07fbca2" + integrity sha512-+qEreVhqAy8o++aQfCJwp0sklr2xyEzkm9Pp/Igu9wNPoe7EZEQ8X/MBvvXggI2ql607cxKg/RKOwDj6pp2XDA== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" source-map-js ">=0.6.2 <2.0.0" sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== section-matter@^1.0.0: version "1.0.0" @@ -4565,19 +5890,19 @@ section-matter@^1.0.0: kind-of "^6.0.0" "semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== + version "5.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0, semver@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.8: - version "7.5.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.2.tgz#5b851e66d1be07c1cdaf37dfc856f543325a2beb" - integrity sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ== +semver@^7.0.0, semver@^7.1.1, semver@^7.2.1, semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -4619,6 +5944,22 @@ signal-exit@^3.0.2, signal-exit@^3.0.7: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +sigstore@^1.3.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/sigstore/-/sigstore-1.9.0.tgz#1e7ad8933aa99b75c6898ddd0eeebc3eb0d59875" + integrity sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A== + dependencies: + "@sigstore/bundle" "^1.1.0" + "@sigstore/protobuf-specs" "^0.2.0" + "@sigstore/sign" "^1.0.0" + "@sigstore/tuf" "^1.0.3" + make-fetch-happen "^11.0.1" + sinon-chai@^2.14.0: version "2.14.0" resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d" @@ -4688,6 +6029,37 @@ slugify@^1.6.5: resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== +smart-buffer@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" + integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== + +socks-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz#dc069ecf34436621acb41e3efa66ca1b5fed15b6" + integrity sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww== + dependencies: + agent-base "^6.0.2" + debug "^4.3.3" + socks "^2.6.2" + +socks-proxy-agent@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" + integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + socks "^2.7.1" + +socks@^2.6.2, socks@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" + integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== + dependencies: + ip "^2.0.0" + smart-buffer "^4.2.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" @@ -4698,11 +6070,6 @@ source-map@^0.6.1: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -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== - spawn-wrap@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-2.0.0.tgz#103685b8b8f9b79771318827aa78650a610d457e" @@ -4716,9 +6083,9 @@ spawn-wrap@^2.0.0: which "^2.0.1" spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -4737,9 +6104,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== split-ca@^1.0.0: version "1.0.1" @@ -4751,6 +6118,13 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== +ssri@^10.0.0, ssri@^10.0.1: + version "10.0.5" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-10.0.5.tgz#e49efcd6e36385196cb515d3a2ad6c3f0265ef8c" + integrity sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A== + dependencies: + minipass "^7.0.3" + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -4761,12 +6135,19 @@ stack-utils-node-internals@^1.0.1: resolved "https://registry.yarnpkg.com/stack-utils-node-internals/-/stack-utils-node-internals-1.0.1.tgz#ab4a8a469b6cbec72b0bfb589df5e28b1d12281f" integrity sha512-lMuPPh5lj8Nj+vGsxnrp5LRamN5SF++yJE+skeXz9Chy/Uw93BzxzrnQ/8BLOIKKVsJ44bleARrfSUh3ZGdMZw== +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + string-argv@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.1.1.tgz#66bd5ae3823708eaa1916fa5412703150d4ddfaf" integrity sha512-El1Va5ehZ0XTj3Ekw4WFidXvTmt9SrC0+eigdojgtJMVtPkF0qbBe9fyNSl9eQf+kUHnTSQxdQYzuHfZy8V+DQ== -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -4775,7 +6156,7 @@ string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2 is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.0, string-width@^5.0.1: +string-width@^5.0.0, string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== @@ -4784,7 +6165,7 @@ string-width@^5.0.0, string-width@^5.0.1: emoji-regex "^9.2.2" strip-ansi "^7.0.1" -string_decoder@^1.1.1: +string_decoder@^1.1.1, string_decoder@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -4803,7 +6184,7 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -4811,9 +6192,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -4911,6 +6292,18 @@ tar-stream@^1.1.2: to-buffer "^1.1.1" xtend "^4.0.0" +tar@^6.1.11, tar@^6.1.2: + version "6.2.0" + resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73" + integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ== + dependencies: + chownr "^2.0.0" + fs-minipass "^2.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + mkdirp "^1.0.3" + yallist "^4.0.0" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -4945,6 +6338,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4957,6 +6355,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== +treeverse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/treeverse/-/treeverse-3.0.0.tgz#dd82de9eb602115c6ebd77a574aae67003cb48c8" + integrity sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== + trim-newlines@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" @@ -4967,10 +6370,19 @@ ts-debounce@^4.0.0: resolved "https://registry.yarnpkg.com/ts-debounce/-/ts-debounce-4.0.0.tgz#33440ef64fab53793c3d546a8ca6ae539ec15841" integrity sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg== -tslib@^2.0.0, tslib@^2.3.1, tslib@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== +tslib@^2.0.0, tslib@^2.6.1, tslib@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tuf-js@^1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/tuf-js/-/tuf-js-1.1.7.tgz#21b7ae92a9373015be77dfe0cb282a80ec3bbe43" + integrity sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg== + dependencies: + "@tufjs/models" "1.0.4" + debug "^4.3.4" + make-fetch-happen "^11.1.1" type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" @@ -4984,7 +6396,7 @@ type-detect@0.1.1: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" integrity sha512-5rqszGVwYgBoDkIm2oUtvkfZMQ0vk29iDMU0W2qCa3rG0vPDNczCMT4hV/bLBgLg8k8ri6+u3Zbt+S/14eMzlA== -type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5: +type-detect@4.0.8, type-detect@^4.0.0, type-detect@^4.0.5, type-detect@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== @@ -5041,6 +6453,25 @@ uc.micro@^1.0.1, uc.micro@^1.0.5: resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== +undici-types@~5.25.1: + version "5.25.3" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.25.3.tgz#e044115914c85f0bcbb229f346ab739f064998c3" + integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== + +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-3.0.0.tgz#48ba7a5a16849f5080d26c760c86cf5cf05770ea" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-4.0.0.tgz#6bae6bb16be91351badd24cdce741f892a6532e3" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + universal-user-agent@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" @@ -5061,10 +6492,10 @@ upath@^2.0.1: resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -5076,6 +6507,13 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-parse-lax@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" + integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== + dependencies: + prepend-http "^2.0.0" + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -5087,16 +6525,16 @@ uuid@^8.3.2: integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== v8-compile-cache@^2.0.3: - version "2.3.0" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" - integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== + version "2.4.0" + resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== valid-url@^1.0.9: version "1.0.9" resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200" integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA== -validate-npm-package-license@^3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== @@ -5104,6 +6542,13 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz#f16afd48318e6f90a1ec101377fa0384cfc8c713" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + vite@~3.1.8: version "3.1.8" resolved "https://registry.yarnpkg.com/vite/-/vite-3.1.8.tgz#fa29144167d19b773baffd65b3972ea4c12359c9" @@ -5117,19 +6562,19 @@ vite@~3.1.8: fsevents "~2.3.2" vscode-languageserver-textdocument@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz#9eae94509cbd945ea44bca8dcfe4bb0c15bb3ac0" - integrity sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q== + version "1.0.11" + resolved "https://registry.yarnpkg.com/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.11.tgz#0822a000e7d4dc083312580d7575fe9e3ba2e2bf" + integrity sha512-X+8T3GoiwTVlJbicx/sIAF+yuJAqz8VvwJyoMVhwEMoEKE/fkDmrqUgDMyBECcM2A2frVZIUj5HI/ErRXCfOeA== vscode-languageserver-types@^3.17.3: - version "3.17.3" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.3.tgz#72d05e47b73be93acb84d6e311b5786390f13f64" - integrity sha512-SYU4z1dL0PyIMd4Vj8YOqFvHu7Hz/enbWtpfnVbJHU4Nd1YNYx8u0ennumc6h48GQNeOLxmwySmnADouT/AuZA== + version "3.17.5" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.17.5.tgz#3273676f0cf2eab40b3f44d085acbb7f08a39d8a" + integrity sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg== vue-demi@*: - version "0.13.11" - resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.13.11.tgz#7d90369bdae8974d87b1973564ad390182410d99" - integrity sha512-IR8HoEEGM65YY3ZJYAjMlKygDQn25D5ajNFNoKh9RSDMQtlzCxtfQjdQgv9jjK+m3377SsJXY8ysq8kLCZL25A== + version "0.14.6" + resolved "https://registry.yarnpkg.com/vue-demi/-/vue-demi-0.14.6.tgz#dc706582851dc1cdc17a0054f4fec2eb6df74c92" + integrity sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w== vue-eslint-parser@^8.0.1: version "8.3.0" @@ -5145,22 +6590,22 @@ vue-eslint-parser@^8.0.1: semver "^7.3.5" vue-router@^4.0.12, vue-router@^4.1.6: - version "4.1.6" - resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.1.6.tgz#b70303737e12b4814578d21d68d21618469375a1" - integrity sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ== + version "4.2.5" + resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-4.2.5.tgz#b9e3e08f1bd9ea363fdd173032620bc50cf0e98a" + integrity sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw== dependencies: - "@vue/devtools-api" "^6.4.5" + "@vue/devtools-api" "^6.5.0" vue@^3.2.20, vue@^3.2.41: - version "3.2.45" - resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.45.tgz#94a116784447eb7dbd892167784619fef379b3c8" - integrity sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA== + version "3.3.6" + resolved "https://registry.yarnpkg.com/vue/-/vue-3.3.6.tgz#bc1b129a73705db16da90aa1edde539d7401ca9d" + integrity sha512-jJIDETeWJnoY+gfn4ZtMPMS5KtbP4ax+CT4dcQFhTnWEk8xMupFyQ0JxL28nvT/M4+p4a0ptxaV2WY0LiIxvRg== dependencies: - "@vue/compiler-dom" "3.2.45" - "@vue/compiler-sfc" "3.2.45" - "@vue/runtime-dom" "3.2.45" - "@vue/server-renderer" "3.2.45" - "@vue/shared" "3.2.45" + "@vue/compiler-dom" "3.3.6" + "@vue/compiler-sfc" "3.3.6" + "@vue/runtime-dom" "3.3.6" + "@vue/server-renderer" "3.3.6" + "@vue/shared" "3.3.6" vuepress-vite@2.0.0-beta.53: version "2.0.0-beta.53" @@ -5179,6 +6624,11 @@ vuepress@2.0.0-beta.53: dependencies: vuepress-vite "2.0.0-beta.53" +walk-up-path@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-3.0.1.tgz#c8d78d5375b4966c717eb17ada73dbd41490e886" + integrity sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA== + wcwidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" @@ -5200,17 +6650,31 @@ whatwg-url@^5.0.0: webidl-conversions "^3.0.0" which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== -which@2.0.2, which@^2.0.1: +which@2.0.2, which@^2.0.1, which@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== dependencies: isexe "^2.0.0" +which@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/which/-/which-3.0.1.tgz#89f1cd0c23f629a8105ffe69b8172791c87b4be1" + integrity sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg== + dependencies: + isexe "^2.0.0" + +wide-align@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.5.tgz#df1d4c206854369ecf3c9a4898f1b23fbd9d15d3" + integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== + dependencies: + string-width "^1.0.2 || 2 || 3 || 4" + widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -5230,17 +6694,13 @@ winston@2.4.5: isstream "0.1.x" stack-trace "0.0.x" -word-wrap@^1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== - workerpool@6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -wrap-ansi@7.0.0, wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@7.0.0, wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -5282,6 +6742,14 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-5.0.1.tgz#68df4717c55c6fa4281a7860b4c2ba0a6d2b11e7" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + xtend@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -5297,6 +6765,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yallist@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" @@ -5308,9 +6781,9 @@ yaml@^1.7.2: integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== yaml@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.1.3.tgz#9b3a4c8aff9821b696275c79a8bee8399d945207" - integrity sha512-AacA8nRULjKMX2DvWvOAdBZMOfQlypSFkjcOcu9FalllIDJ1kvlREzcdIZmidQUqqeMv7jorHjq2HlLv/+c2lg== + version "2.3.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.3.3.tgz#01f6d18ef036446340007db8e016810e5d64aad9" + integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== yargs-parser@20.2.4: version "20.2.4"