diff --git a/__snapshots__/prepare-release-artifacts-spec.js b/__snapshots__/prepare-release-artifacts-spec.js new file mode 100644 index 000000000000..04b0b136bdcc --- /dev/null +++ b/__snapshots__/prepare-release-artifacts-spec.js @@ -0,0 +1,8 @@ +exports['prepare-release-artifacts runs expected commands 1'] = ` +$ node ./scripts/prepare-release-artifacts.js --dry-run --sha 57d0a85108fad6f77b39db88b8a7d8a3bfdb51a2 --version 1.2.3 +🏗 Running \`move-binaries\`... +🏗 Dry run, not executing: node ./scripts/binary.js move-binaries --sha 57d0a85108fad6f77b39db88b8a7d8a3bfdb51a2 --version 1.2.3 +🏗 Running \`create-stable-npm-package\`... +🏗 Dry run, not executing: ./scripts/create-stable-npm-package.sh https://cdn.cypress.io/beta/npm/1.2.3/linux-x64/develop-57d0a85108fad6f77b39db88b8a7d8a3bfdb51a2/cypress.tgz + +` diff --git a/assets/cypress-bot-pre-release-comment.png b/assets/cypress-bot-pre-release-comment.png deleted file mode 100644 index 28c8cccdc8f7..000000000000 Binary files a/assets/cypress-bot-pre-release-comment.png and /dev/null differ diff --git a/circle.yml b/circle.yml index a9372c874b8f..e6a9d99dfa79 100644 --- a/circle.yml +++ b/circle.yml @@ -29,7 +29,7 @@ mainBuildFilters: &mainBuildFilters only: - develop - 10.0-release - - fix-release-scripts + - fix-beta-build-caching # usually we don't build Mac app - it takes a long time # but sometimes we want to really confirm we are doing the right thing @@ -38,7 +38,7 @@ macWorkflowFilters: &mac-workflow-filters when: or: - equal: [ develop, << pipeline.git.branch >> ] - - equal: [ faster-mac-builds, << pipeline.git.branch >> ] + - equal: [ fix-beta-build-caching, << pipeline.git.branch >> ] - matches: pattern: "-release$" value: << pipeline.git.branch >> @@ -48,7 +48,7 @@ windowsWorkflowFilters: &windows-workflow-filters or: - equal: [ master, << pipeline.git.branch >> ] - equal: [ develop, << pipeline.git.branch >> ] - - equal: [ fix-next-version-in-test-repos, << pipeline.git.branch >> ] + - equal: [ fix-beta-build-caching, << pipeline.git.branch >> ] - matches: pattern: "-release$" value: << pipeline.git.branch >> @@ -1633,7 +1633,7 @@ jobs: - run: name: Check current branch to persist artifacts command: | - if [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "fix-release-scripts" ]]; then + if [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "fix-beta-build-caching" ]]; then echo "Not uploading artifacts or posting install comment for this branch." circleci-agent step halt fi diff --git a/cli/__snapshots__/build_spec.js b/cli/__snapshots__/build_spec.js index 558312d4f0f2..4be1b245a7e9 100644 --- a/cli/__snapshots__/build_spec.js +++ b/cli/__snapshots__/build_spec.js @@ -2,6 +2,7 @@ exports['package.json build outputs expected properties 1'] = { "name": "test", "engines": "test engines", "version": "x.y.z", + "buildInfo": "replaced by normalizePackageJson", "description": "Cypress.io end to end testing tool", "homepage": "https://github.com/cypress-io/cypress", "license": "MIT", diff --git a/cli/__snapshots__/download_spec.js b/cli/__snapshots__/download_spec.js index b0dfb8dcc1c3..70d42ad8b764 100644 --- a/cli/__snapshots__/download_spec.js +++ b/cli/__snapshots__/download_spec.js @@ -43,4 +43,4 @@ https://download.cypress.io/desktop/0.20.2?platform=OS&arch=ARCH exports['desktop url from template'] = ` https://download.cypress.io/desktop/0.20.2/darwin-x64/cypress.zip -` \ No newline at end of file +` diff --git a/cli/__snapshots__/info_spec.js b/cli/__snapshots__/info_spec.js index d2b662e8b7fb..1a72cea863af 100644 --- a/cli/__snapshots__/info_spec.js +++ b/cli/__snapshots__/info_spec.js @@ -7,7 +7,7 @@ Application Data: /user/app/data/path Browser Profiles: /user/app/data/path/to/browsers Binary Caches: /user/path/to/binary/cache -Cypress Version: 0.0.0-development +Cypress Version: 0.0.0-development (stable) System Platform: linux (Foo-OsVersion) System Memory: 1.2 GB free 400 MB @@ -29,7 +29,7 @@ Application Data: /user/app/data/path Browser Profiles: /user/app/data/path/to/browsers Binary Caches: /user/path/to/binary/cache -Cypress Version: 0.0.0-development +Cypress Version: 0.0.0-development (stable) System Platform: linux (Foo-OsVersion) System Memory: 1.2 GB free 400 MB @@ -48,8 +48,46 @@ Application Data: /user/app/data/path Browser Profiles: /user/app/data/path/to/browsers Binary Caches: /user/path/to/binary/cache -Cypress Version: 0.0.0-development +Cypress Version: 0.0.0-development (stable) System Platform: linux (Foo-OsVersion) System Memory: 1.2 GB free 400 MB ` + +exports['logs additional info about pre-releases'] = ` + +Proxy Settings: none detected +Environment Variables: none detected + +Application Data: /user/app/data/path +Browser Profiles: /user/app/data/path/to/browsers +Binary Caches: /user/path/to/binary/cache + +Cypress Version: 0.0.0-development (pre-release) +System Platform: linux (Foo-OsVersion) +System Memory: 1.2 GB free 400 MB + +This is a pre-release build of Cypress. +Build info: + Commit SHA: abc123 + Commit Branch: someBranchName + Commit Date: 2022-02-02Txx:xx:xx.000Z + +` + +exports['logs additional info about development'] = ` + +Proxy Settings: none detected +Environment Variables: none detected + +Application Data: /user/app/data/path +Browser Profiles: /user/app/data/path/to/browsers +Binary Caches: /user/path/to/binary/cache + +Cypress Version: 0.0.0-development (pre-release) +System Platform: linux (Foo-OsVersion) +System Memory: 1.2 GB free 400 MB + +This is the development (un-built) Cypress CLI. + +` diff --git a/cli/__snapshots__/install_spec.js b/cli/__snapshots__/install_spec.js index 7d6add82dc1e..c28d2dce7132 100644 --- a/cli/__snapshots__/install_spec.js +++ b/cli/__snapshots__/install_spec.js @@ -256,4 +256,40 @@ https://on.cypress.io/guides/getting-started/installing-cypress#system-requireme Platform: win32-ia32 +` + +exports['/lib/tasks/install .start non-stable builds logs a warning about installing a pre-release 1'] = ` +⚠ Warning: You are installing a pre-release build of Cypress. + +Bugs may be present which do not exist in production builds. + +This build was created from: + * Commit SHA: abc123 + * Commit Branch: aBranchName + * Commit Timestamp: 1996-11-27Txx:xx:xx.000Z + +Installing Cypress (version: https://cdn.cypress.io/beta/binary/0.0.0-development/darwin-x64/aBranchName-abc123/cypress.zip) + + +⠋ Downloaded Cypress +✔ Downloaded Cypress +✔ Downloaded Cypress +⠋ Unzipped Cypress +✔ Downloaded Cypress +✔ Unzipped Cypress +✔ Downloaded Cypress +✔ Unzipped Cypress +⠋ Finished Installation /cache/Cypress/1.2.3 +✔ Downloaded Cypress +✔ Unzipped Cypress +✔ Finished Installation /cache/Cypress/1.2.3 +✔ Downloaded Cypress +✔ Unzipped Cypress +✔ Finished Installation /cache/Cypress/1.2.3 + +You can now open Cypress by running: node_modules/.bin/cypress open + +https://on.cypress.io/installing-cypress + + ` diff --git a/cli/lib/exec/info.js b/cli/lib/exec/info.js index cd21138029c8..5aa73b88c366 100644 --- a/cli/lib/exec/info.js +++ b/cli/lib/exec/info.js @@ -11,6 +11,7 @@ const _ = require('lodash') const g = chalk.green // color for paths const p = chalk.cyan +const red = chalk.red // urls const link = chalk.blue.underline @@ -43,56 +44,66 @@ const formatCypressVariables = () => { return maskSensitiveVariables(vars) } -methods.start = (options = {}) => { +methods.start = async (options = {}) => { const args = ['--mode=info'] - return spawn.start(args, { + await spawn.start(args, { dev: options.dev, }) - .then(() => { - console.log() - const proxyVars = methods.findProxyEnvironmentVariables() - - if (_.isEmpty(proxyVars)) { - console.log('Proxy Settings: none detected') - } else { - console.log('Proxy Settings:') - _.forEach(proxyVars, (value, key) => { - console.log('%s: %s', key, g(value)) - }) - - console.log() - console.log('Learn More: %s', link('https://on.cypress.io/proxy-configuration')) - console.log() - } - }) - .then(() => { - const cyVars = formatCypressVariables() - - if (_.isEmpty(cyVars)) { - console.log('Environment Variables: none detected') - } else { - console.log('Environment Variables:') - _.forEach(cyVars, (value, key) => { - console.log('%s: %s', key, g(value)) - }) - } - }) - .then(() => { + + console.log() + const proxyVars = methods.findProxyEnvironmentVariables() + + if (_.isEmpty(proxyVars)) { + console.log('Proxy Settings: none detected') + } else { + console.log('Proxy Settings:') + _.forEach(proxyVars, (value, key) => { + console.log('%s: %s', key, g(value)) + }) + console.log() - console.log('Application Data:', p(util.getApplicationDataFolder())) - console.log('Browser Profiles:', p(util.getApplicationDataFolder('browsers'))) - console.log('Binary Caches: %s', p(state.getCacheDir())) - }) - .then(() => { + console.log('Learn More: %s', link('https://on.cypress.io/proxy-configuration')) console.log() + } + + const cyVars = formatCypressVariables() - return util.getOsVersionAsync().then((osVersion) => { - console.log('Cypress Version: %s', g(util.pkgVersion())) - console.log('System Platform: %s (%s)', g(os.platform()), g(osVersion)) - console.log('System Memory: %s free %s', g(prettyBytes(os.totalmem())), g(prettyBytes(os.freemem()))) + if (_.isEmpty(cyVars)) { + console.log('Environment Variables: none detected') + } else { + console.log('Environment Variables:') + _.forEach(cyVars, (value, key) => { + console.log('%s: %s', key, g(value)) }) - }) + } + + console.log() + console.log('Application Data:', p(util.getApplicationDataFolder())) + console.log('Browser Profiles:', p(util.getApplicationDataFolder('browsers'))) + console.log('Binary Caches: %s', p(state.getCacheDir())) + + console.log() + + const osVersion = await util.getOsVersionAsync() + const buildInfo = util.pkgBuildInfo() + const isStable = buildInfo && buildInfo.stable + + console.log('Cypress Version: %s', g(util.pkgVersion()), isStable ? g('(stable)') : red('(pre-release)')) + console.log('System Platform: %s (%s)', g(os.platform()), g(osVersion)) + console.log('System Memory: %s free %s', g(prettyBytes(os.totalmem())), g(prettyBytes(os.freemem()))) + + if (!buildInfo) { + console.log() + console.log('This is the', red('development'), '(un-built) Cypress CLI.') + } else if (!isStable) { + console.log() + console.log('This is a', red('pre-release'), 'build of Cypress.') + console.log('Build info:') + console.log(' Commit SHA:', g(buildInfo.commitSha)) + console.log(' Commit Branch:', g(buildInfo.commitBranch)) + console.log(' Commit Date:', g(buildInfo.commitDate)) + } } module.exports = methods diff --git a/cli/lib/exec/versions.js b/cli/lib/exec/versions.js index 94fd9f1b9915..420292bff5f6 100644 --- a/cli/lib/exec/versions.js +++ b/cli/lib/exec/versions.js @@ -41,8 +41,15 @@ const getVersions = () => { return versions }) .then((binaryVersions) => { + const buildInfo = util.pkgBuildInfo() + + let packageVersion = util.pkgVersion() + + if (!buildInfo) packageVersion += ' (development)' + else if (!buildInfo.stable) packageVersion += ' (pre-release)' + const versions = { - package: util.pkgVersion(), + package: packageVersion, binary: binaryVersions.binary || 'not installed', electronVersion: binaryVersions.electronVersion || 'not found', electronNodeVersion: binaryVersions.electronNodeVersion || 'not found', diff --git a/cli/lib/tasks/install.js b/cli/lib/tasks/install.js index 10d342645142..589a8019db6f 100644 --- a/cli/lib/tasks/install.js +++ b/cli/lib/tasks/install.js @@ -1,7 +1,6 @@ const _ = require('lodash') const arch = require('arch') const os = require('os') -const url = require('url') const path = require('path') const chalk = require('chalk') const debug = require('debug')('cypress:cli') @@ -18,97 +17,10 @@ const logger = require('../logger') const { throwFormErrorText, errors } = require('../errors') const verbose = require('../VerboseRenderer') -const getNpmArgv = () => { - const json = process.env.npm_config_argv +const { buildInfo, version } = require('../../package.json') - if (!json) { - return - } - - debug('found npm argv json %o', json) - - try { - return JSON.parse(json).original || [] - } catch (e) { - return [] - } -} - -// attempt to discover the version specifier used to install Cypress -// for example: "^5.0.0", "https://cdn.cypress.io/...", ... -const getVersionSpecifier = (startDir = path.resolve(__dirname, '../..')) => { - const argv = getNpmArgv() - - if ((process.env.npm_package_resolved || '').endsWith('cypress.tgz')) { - return process.env.npm_package_resolved - } - - if (argv) { - const tgz = _.find(argv, (t) => t.endsWith('cypress.tgz')) - - if (tgz) { - return tgz - } - } - - const getVersionSpecifierFromPkg = (dir) => { - debug('looking for versionSpecifier %o', { dir }) - - const tryParent = () => { - const parentPath = path.resolve(dir, '..') - - if (parentPath === dir) { - debug('reached FS root with no versionSpecifier found') - - return - } - - return getVersionSpecifierFromPkg(parentPath) - } - - return fs.readJSON(path.join(dir, 'package.json')) - .catch(() => ({})) - .then((pkg) => { - const specifier = _.chain(['dependencies', 'devDependencies', 'optionalDependencies']) - .map((prop) => _.get(pkg, `${prop}.cypress`)) - .compact().first().value() - - return specifier || tryParent() - }) - } - - // recurse through parent directories until package.json with `cypress` is found - return getVersionSpecifierFromPkg(startDir) - .then((versionSpecifier) => { - debug('finished looking for versionSpecifier', { versionSpecifier }) - - return versionSpecifier - }) -} - -const betaNpmUrlRe = /^\/beta\/npm\/(?[0-9.]+)\/(?.+?)\/(?.+?)\/cypress\.tgz$/ - -// convert a prerelease NPM package .tgz URL to the corresponding binary .zip URL -const getBinaryUrlFromPrereleaseNpmUrl = (npmUrl) => { - let parsed - - try { - parsed = url.parse(npmUrl) - } catch (e) { - return - } - - const matches = betaNpmUrlRe.exec(parsed.pathname) - - if (parsed.hostname !== 'cdn.cypress.io' || !matches) { - return - } - - const { version, artifactSlug } = matches.groups - - parsed.pathname = `/beta/binary/${version}/${os.platform()}-${arch()}/${artifactSlug}/cypress.zip` - - return parsed.format() +function _getBinaryUrlFromBuildInfo ({ commitSha, commitBranch }) { + return `https://cdn.cypress.io/beta/binary/${version}/${os.platform()}-${arch()}/${commitBranch}-${commitSha}/cypress.zip` } const alreadyInstalledMsg = () => { @@ -227,43 +139,71 @@ const validateOS = () => { }) } -const start = (options = {}) => { - debug('installing with options %j', options) +/** + * Returns the version to install - either a string like `1.2.3` to be fetched + * from the download server or a file path or HTTP URL. + */ +function getVersionOverride ({ envVarVersion, buildInfo }) { + // let this environment variable reset the binary version we need + if (envVarVersion) { + return envVarVersion + } - _.defaults(options, { - force: false, - }) + if (buildInfo && !buildInfo.stable) { + logger.log( + chalk.yellow(stripIndent` + ${logSymbols.warning} Warning: You are installing a pre-release build of Cypress. - const pkgVersion = util.pkgVersion() - let needVersion = pkgVersion - let binaryUrlOverride + Bugs may be present which do not exist in production builds. - debug('version in package.json is', needVersion) + This build was created from: + * Commit SHA: ${buildInfo.commitSha} + * Commit Branch: ${buildInfo.commitBranch} + * Commit Timestamp: ${buildInfo.commitDate} + `), + ) - // let this environment variable reset the binary version we need - if (util.getEnv('CYPRESS_INSTALL_BINARY')) { - // because passed file paths are often double quoted - // and might have extra whitespace around, be robust and trim the string - const trimAndRemoveDoubleQuotes = true - const envVarVersion = util.getEnv('CYPRESS_INSTALL_BINARY', trimAndRemoveDoubleQuotes) - - debug('using environment variable CYPRESS_INSTALL_BINARY "%s"', envVarVersion) - - if (envVarVersion === '0') { - debug('environment variable CYPRESS_INSTALL_BINARY = 0, skipping install') - logger.log( - stripIndent` - ${chalk.yellow('Note:')} Skipping binary installation: Environment variable CYPRESS_INSTALL_BINARY = 0.`, - ) + logger.log() + + return _getBinaryUrlFromBuildInfo(buildInfo) + } +} - logger.log() +function getEnvVarVersion () { + if (!util.getEnv('CYPRESS_INSTALL_BINARY')) return - return Promise.resolve() - } + // because passed file paths are often double quoted + // and might have extra whitespace around, be robust and trim the string + const trimAndRemoveDoubleQuotes = true + const envVarVersion = util.getEnv('CYPRESS_INSTALL_BINARY', trimAndRemoveDoubleQuotes) + + debug('using environment variable CYPRESS_INSTALL_BINARY "%s"', envVarVersion) + + return envVarVersion +} + +const start = async (options = {}) => { + debug('installing with options %j', options) - binaryUrlOverride = envVarVersion + const envVarVersion = getEnvVarVersion() + + if (envVarVersion === '0') { + debug('environment variable CYPRESS_INSTALL_BINARY = 0, skipping install') + logger.log( + stripIndent` + ${chalk.yellow('Note:')} Skipping binary installation: Environment variable CYPRESS_INSTALL_BINARY = 0.`, + ) + + logger.log() + + return } + _.defaults(options, { + force: false, + buildInfo, + }) + if (util.getEnv('CYPRESS_CACHE_FOLDER')) { const envCache = util.getEnv('CYPRESS_CACHE_FOLDER') @@ -278,18 +218,21 @@ const start = (options = {}) => { logger.log() } - const installDir = state.getVersionDir(pkgVersion) + const pkgVersion = util.pkgVersion() + const versionOverride = getVersionOverride({ envVarVersion, buildInfo: options.buildInfo }) + const versionToInstall = versionOverride || pkgVersion + + debug('version in package.json is %s, version to install is %s', pkgVersion, versionToInstall) + + const installDir = state.getVersionDir(pkgVersion, options.buildInfo) const cacheDir = state.getCacheDir() const binaryDir = state.getBinaryDir(pkgVersion) - return validateOS().then((isValid) => { - if (!isValid) { - return throwFormErrorText(errors.invalidOS)() - } - }) - .then(() => { - return fs.ensureDirAsync(cacheDir) - }) + if (!(await validateOS())) { + return throwFormErrorText(errors.invalidOS)() + } + + await fs.ensureDirAsync(cacheDir) .catch({ code: 'EACCES' }, (err) => { return throwFormErrorText(errors.invalidCacheDirectory)(stripIndent` Failed to access ${chalk.cyan(cacheDir)}: @@ -297,26 +240,11 @@ const start = (options = {}) => { ${err.message} `) }) - .then(() => { - return Promise.all([ - state.getBinaryPkgAsync(binaryDir).then(state.getBinaryPkgVersion), - getVersionSpecifier(), - ]) - }) - .then(([binaryVersion, versionSpecifier]) => { - if (!binaryUrlOverride && versionSpecifier) { - const computedBinaryUrl = getBinaryUrlFromPrereleaseNpmUrl(versionSpecifier) - - if (computedBinaryUrl) { - debug('computed binary url from version specifier %o', { computedBinaryUrl, needVersion }) - binaryUrlOverride = computedBinaryUrl - } - } - - needVersion = binaryUrlOverride || needVersion - debug('installed version is', binaryVersion, 'version needed is', needVersion) + const binaryPkg = await state.getBinaryPkgAsync(binaryDir) + const binaryVersion = await state.getBinaryPkgVersion(binaryPkg) + const shouldInstall = () => { if (!binaryVersion) { debug('no binary installed under cli version') @@ -336,7 +264,7 @@ const start = (options = {}) => { return true } - if ((binaryVersion === needVersion) || !util.isSemver(needVersion)) { + if ((binaryVersion === versionToInstall) || !util.isSemver(versionToInstall)) { // our version matches, tell the user this is a noop alreadyInstalledMsg() @@ -344,96 +272,89 @@ const start = (options = {}) => { } return true - }) - .then((shouldInstall) => { - // noop if we've been told not to download - if (!shouldInstall) { - debug('Not downloading or installing binary') + } - return - } + // noop if we've been told not to download + if (!shouldInstall()) { + return debug('Not downloading or installing binary') + } + + if (envVarVersion) { + logger.log( + chalk.yellow(stripIndent` + ${logSymbols.warning} Warning: Forcing a binary version different than the default. - if (needVersion !== pkgVersion) { - logger.log( - chalk.yellow(stripIndent` - ${logSymbols.warning} Warning: Forcing a binary version different than the default. + The CLI expected to install version: ${chalk.green(pkgVersion)} - The CLI expected to install version: ${chalk.green(pkgVersion)} + Instead we will install version: ${chalk.green(versionToInstall)} - Instead we will install version: ${chalk.green(needVersion)} + These versions may not work properly together. + `), + ) - These versions may not work properly together. - `), - ) + logger.log() + } - logger.log() + const getLocalFilePath = async () => { + // see if version supplied is a path to a binary + if (await fs.pathExistsAsync(versionToInstall)) { + return path.extname(versionToInstall) === '.zip' ? versionToInstall : false } - // see if version supplied is a path to a binary - return fs.pathExistsAsync(needVersion) - .then((exists) => { - if (exists) { - return path.extname(needVersion) === '.zip' ? needVersion : false - } - - const possibleFile = util.formAbsolutePath(needVersion) - - debug('checking local file', possibleFile, 'cwd', process.cwd()) - - return fs.pathExistsAsync(possibleFile) - .then((exists) => { - // if this exists return the path to it - // else false - if (exists && path.extname(possibleFile) === '.zip') { - return possibleFile - } + const possibleFile = util.formAbsolutePath(versionToInstall) - return false - }) - }) - .then((pathToLocalFile) => { - if (pathToLocalFile) { - const absolutePath = path.resolve(needVersion) - - debug('found local file at', absolutePath) - debug('skipping download') - - const rendererOptions = getRendererOptions() - - return new Listr([unzipTask({ - progress: { - throttle: 100, - onProgress: null, - }, - zipFilePath: absolutePath, - installDir, - rendererOptions, - })], { rendererOptions }).run() - } - - if (options.force) { - debug('Cypress already installed at', installDir) - debug('but the installation was forced') - } - - debug('preparing to download and unzip version ', needVersion, 'to path', installDir) - - const downloadDir = os.tmpdir() - - return downloadAndUnzip({ version: needVersion, installDir, downloadDir }) - }) - // delay 1 sec for UX, unless we are testing - .then(() => { - return Promise.delay(1000) - }) - .then(displayCompletionMsg) - }) + debug('checking local file', possibleFile, 'cwd', process.cwd()) + + // if this exists return the path to it + // else false + if ((await fs.pathExistsAsync(possibleFile)) && path.extname(possibleFile) === '.zip') { + return possibleFile + } + + return false + } + + const pathToLocalFile = await getLocalFilePath() + + if (pathToLocalFile) { + const absolutePath = path.resolve(versionToInstall) + + debug('found local file at', absolutePath) + debug('skipping download') + + const rendererOptions = getRendererOptions() + + return new Listr([unzipTask({ + progress: { + throttle: 100, + onProgress: null, + }, + zipFilePath: absolutePath, + installDir, + rendererOptions, + })], { rendererOptions }).run() + } + + if (options.force) { + debug('Cypress already installed at', installDir) + debug('but the installation was forced') + } + + debug('preparing to download and unzip version ', versionToInstall, 'to path', installDir) + + const downloadDir = os.tmpdir() + + await downloadAndUnzip({ version: versionToInstall, installDir, downloadDir }) + + // delay 1 sec for UX, unless we are testing + await Promise.delay(1000) + + displayCompletionMsg() } module.exports = { start, - _getVersionSpecifier: getVersionSpecifier, - _getBinaryUrlFromPrereleaseNpmUrl: getBinaryUrlFromPrereleaseNpmUrl, + _getBinaryUrlFromBuildInfo, } const unzipTask = ({ zipFilePath, installDir, progress, rendererOptions }) => { diff --git a/cli/lib/tasks/state.js b/cli/lib/tasks/state.js index 475dfaeb94f3..2f3a46b377d0 100644 --- a/cli/lib/tasks/state.js +++ b/cli/lib/tasks/state.js @@ -50,7 +50,11 @@ const getBinaryDir = (version = util.pkgVersion()) => { return path.join(getVersionDir(version), getPlatFormBinaryFolder()) } -const getVersionDir = (version = util.pkgVersion()) => { +const getVersionDir = (version = util.pkgVersion(), buildInfo = util.pkgBuildInfo()) => { + if (buildInfo && !buildInfo.stable) { + version = ['beta', version, buildInfo.commitBranch, buildInfo.commitSha].join('-') + } + return path.join(getCacheDir(), version) } diff --git a/cli/lib/util.js b/cli/lib/util.js index 36dbb788d915..d9250a200dde 100644 --- a/cli/lib/util.js +++ b/cli/lib/util.js @@ -356,6 +356,10 @@ const util = { return process.cwd() }, + pkgBuildInfo () { + return pkg.buildInfo + }, + pkgVersion () { return pkg.version }, diff --git a/cli/scripts/build.js b/cli/scripts/build.js index 25f1e607295c..7ce6b3d9a8d5 100644 --- a/cli/scripts/build.js +++ b/cli/scripts/build.js @@ -1,5 +1,6 @@ const _ = require('lodash') const path = require('path') +const shell = require('shelljs') const fs = require('../lib/fs') @@ -19,6 +20,10 @@ const { const packageJsonSrc = path.join('package.json') const packageJsonDest = path.join('build', 'package.json') +function getStdout (cmd) { + return shell.exec(cmd).trim() +} + function preparePackageForNpmRelease (json) { // modify the existing package.json // to prepare it for releasing to npm @@ -29,6 +34,12 @@ function preparePackageForNpmRelease (json) { _.extend(json, { version, + buildInfo: { + commitBranch: process.env.CIRCLE_BRANCH || getStdout('git branch --show-current'), + commitSha: getStdout('git rev-parse HEAD'), + commitDate: new Date(getStdout('git show -s --format=%ci')).toISOString(), + stable: false, + }, description, homepage, license, diff --git a/cli/test/lib/build_spec.js b/cli/test/lib/build_spec.js index 74a27803dfa6..6f160ad469f0 100644 --- a/cli/test/lib/build_spec.js +++ b/cli/test/lib/build_spec.js @@ -10,7 +10,17 @@ const hasVersion = (json) => { return la(is.semver(json.version), 'cannot find version', json) } -const changeVersion = (o) => ({ ...o, version: 'x.y.z' }) +const normalizePackageJson = (o) => { + expect(o.buildInfo).to.include({ stable: false }) + expect(o.buildInfo.commitBranch).to.match(/.+/) + expect(o.buildInfo.commitSha).to.match(/[a-f0-9]+/) + + return { + ...o, + version: 'x.y.z', + buildInfo: 'replaced by normalizePackageJson', + } +} describe('package.json build', () => { beforeEach(function () { @@ -32,7 +42,7 @@ describe('package.json build', () => { it('outputs expected properties', () => { return makeUserPackageFile() - .then(changeVersion) + .then(normalizePackageJson) .then(snapshot) }) }) diff --git a/cli/test/lib/cli_spec.js b/cli/test/lib/cli_spec.js index 8821612e164f..8b621c0db927 100644 --- a/cli/test/lib/cli_spec.js +++ b/cli/test/lib/cli_spec.js @@ -28,6 +28,7 @@ describe('cli', () => { os.platform.returns('darwin') // sinon.stub(util, 'exit') sinon.stub(util, 'logErrorExit1') + sinon.stub(util, 'pkgBuildInfo').returns({ stable: true }) this.exec = (args) => { const cliArgs = `node test ${args}`.split(' ') diff --git a/cli/test/lib/exec/info_spec.js b/cli/test/lib/exec/info_spec.js index 495dddaa074b..fbece3e9eeec 100644 --- a/cli/test/lib/exec/info_spec.js +++ b/cli/test/lib/exec/info_spec.js @@ -25,6 +25,10 @@ describe('exec info', function () { .withArgs('browsers').returns('/user/app/data/path/to/browsers') .withArgs().returns('/user/app/data/path') + sinon.stub(util, 'pkgBuildInfo').returns({ + stable: true, + }) + sinon.stub(state, 'getCacheDir').returns('/user/path/to/binary/cache') }) @@ -68,4 +72,21 @@ describe('exec info', function () { await startInfoAndSnapshot('cypress redacts sensitive vars') }) + + it('logs additional info about pre-releases', async () => { + util.pkgBuildInfo.returns({ + stable: false, + commitSha: 'abc123', + commitBranch: 'someBranchName', + commitDate: new Date('02-02-2022').toISOString(), + }) + + await startInfoAndSnapshot('logs additional info about pre-releases') + }) + + it('logs if unbuilt development', async () => { + util.pkgBuildInfo.returns(undefined) + + await startInfoAndSnapshot('logs additional info about development') + }) }) diff --git a/cli/test/lib/exec/versions_spec.js b/cli/test/lib/exec/versions_spec.js index 7a9124ddfb41..287f32a2f924 100644 --- a/cli/test/lib/exec/versions_spec.js +++ b/cli/test/lib/exec/versions_spec.js @@ -18,6 +18,7 @@ describe('lib/exec/versions', function () { }) sinon.stub(util, 'pkgVersion').returns('4.5.6') + sinon.stub(util, 'pkgBuildInfo').returns({ stable: true }) }) describe('.getVersions', function () { @@ -50,6 +51,22 @@ describe('lib/exec/versions', function () { }) }) + it('appends pre-release if not stable', async function () { + util.pkgBuildInfo.returns({ stable: false }) + + const v = await versions.getVersions() + + expect(v.package).to.eql('4.5.6 (pre-release)') + }) + + it('appends development if missing buildInfo', async function () { + util.pkgBuildInfo.returns(undefined) + + const v = await versions.getVersions() + + expect(v.package).to.eql('4.5.6 (development)') + }) + it('reports default versions if not found', function () { // imagine package.json only has version there state.getBinaryPkgAsync.withArgs(binaryDir).resolves({ diff --git a/cli/test/lib/tasks/install_spec.js b/cli/test/lib/tasks/install_spec.js index ec1b91ac813f..f1966fe1897f 100644 --- a/cli/test/lib/tasks/install_spec.js +++ b/cli/test/lib/tasks/install_spec.js @@ -1,11 +1,9 @@ require('../../spec_helper') -const _ = require('lodash') const os = require('os') const path = require('path') const chalk = require('chalk') const Promise = require('bluebird') const mockfs = require('mock-fs') -const mockedEnv = require('mocked-env') const snapshot = require('../../support/snapshot') const stdout = require('../../support/stdout') @@ -75,6 +73,32 @@ describe('/lib/tasks/install', function () { }) }) + describe('non-stable builds', () => { + function runInstall () { + return install.start({ + buildInfo: { + stable: false, + commitSha: 'abc123', + commitBranch: 'aBranchName', + commitDate: new Date('11-27-1996').toISOString(), + }, + }) + } + + it('install from a constructed CDN URL', async function () { + await runInstall() + + expect(download.start).to.be.calledWithMatch({ + version: 'https://cdn.cypress.io/beta/binary/0.0.0-development/darwin-x64/aBranchName-abc123/cypress.zip', + }) + }) + + it('logs a warning about installing a pre-release', async function () { + await runInstall() + snapshot(normalize(this.stdout.toString())) + }) + }) + describe('override version', function () { it('warns when specifying cypress version in env', function () { const version = '0.12.1' @@ -460,145 +484,18 @@ describe('/lib/tasks/install', function () { }) }) - context('._getBinaryUrlFromPrereleaseNpmUrl', function () { - beforeEach(() => { + context('._getBinaryUrlFromBuildInfo', function () { + const buildInfo = { + commitSha: 'abc123', + commitBranch: 'aBranchName', + } + + it('generates the expected URL', () => { os.platform.returns('linux') sinon.stub(os, 'arch').returns('x64') - }) - - it('returns binary url for prerelease npm url', function () { - expect(install._getBinaryUrlFromPrereleaseNpmUrl('https://cdn.cypress.io/beta/npm/5.1.1/linux-x64/ciprovider-branchname-sha/cypress.tgz')) - .to.eq('https://cdn.cypress.io/beta/binary/5.1.1/linux-x64/ciprovider-branchname-sha/cypress.zip') - - expect(install._getBinaryUrlFromPrereleaseNpmUrl('https://cdn.cypress.io/beta/npm/5.1.1/inux-x64/circle-develop-3fdfc3b453eb38ad3c0b079531e4dde6668e3dd0-436710/cypress.tgz')) - .to.eq('https://cdn.cypress.io/beta/binary/5.1.1/linux-x64/circle-develop-3fdfc3b453eb38ad3c0b079531e4dde6668e3dd0-436710/cypress.zip') - - expect(install._getBinaryUrlFromPrereleaseNpmUrl('https://cdn.cypress.io/beta/npm/5.1.1/inux-x64/circle-develop/some/branch-3fdfc3b453eb38ad3c0b079531e4dde6668e3dd0-436710/cypress.tgz')) - .to.eq('https://cdn.cypress.io/beta/binary/5.1.1/linux-x64/circle-develop/some/branch-3fdfc3b453eb38ad3c0b079531e4dde6668e3dd0-436710/cypress.zip') - }) - - it('returns nothing for an invalid url', function () { - expect(install._getBinaryUrlFromPrereleaseNpmUrl('1.2.3')).to.be.undefined - expect(install._getBinaryUrlFromPrereleaseNpmUrl(null)).to.be.undefined - }) - }) - - context('._getVersionSpecifier', function () { - let restoreEnv - - beforeEach(function () { - sinon.stub(fs, 'readJSON').rejects() - restoreEnv && restoreEnv() - }) - - it('resolves undefined if no versionSpecifier found', async function () { - expect(await install._getVersionSpecifier('/foo/bar/baz')).to.be.undefined - }) - - it('resolves with cypress.tgz URL if specified in npm argv', async function () { - restoreEnv = mockedEnv({ - npm_config_argv: JSON.stringify({ - original: ['npm', 'i', 'https://foo.com/cypress.tgz'], - }), - }) - expect(await install._getVersionSpecifier('/foo/bar/baz')).to.eq('https://foo.com/cypress.tgz') - }) - - it('resolves with cypress.tgz URL if specified in npm env npm_package_resolved', async function () { - restoreEnv = mockedEnv({ - npm_package_resolved: 'https://foo.com/cypress.tgz', - }) - - expect(await install._getVersionSpecifier('/foo/bar/baz')).to.eq('https://foo.com/cypress.tgz') - }) - - it('resolves with versionSpecifier from parent pkg.json', async function () { - fs.readJSON.withArgs('/foo/bar/baz/package.json').resolves({ - dependencies: { - 'cypress': '1.2.3', - }, - }) - - fs.readJSON.withArgs('/foo/bar/package.json').resolves({ - dependencies: { - 'cypress': 'wrong', - }, - }) - - expect(await install._getVersionSpecifier('/foo/bar/baz')).to.eq('1.2.3') - }) - - it('resolves with devDependencies too', async function () { - fs.readJSON.withArgs('/foo/bar/baz/package.json').resolves({ - devDependencies: { - 'cypress': '4.5.6', - }, - }) - - expect(await install._getVersionSpecifier('/foo/bar/baz')).to.eq('4.5.6') - }) - - it('resolves with optionalDependencies too', async function () { - fs.readJSON.withArgs('/foo/bar/baz/package.json').resolves({ - optionalDependencies: { - 'cypress': '6.7.8', - }, - }) - - expect(await install._getVersionSpecifier('/foo/bar/baz')).to.eq('6.7.8') - }) - - context('with win32 path functions and paths', async function () { - const oldPath = _.clone(path) - - beforeEach(() => { - _.assign(path, path.win32) - }) - - afterEach(() => { - _.assign(path, oldPath) - }) - - it('resolves undefined if no versionSpecifier found', async function () { - expect(await install._getVersionSpecifier('C:\\foo\\bar\\baz')).to.be.undefined - }) - - it('resolves with versionSpecifier from parent pkg.json', async function () { - fs.readJSON.withArgs('C:\\foo\\bar\\baz\\package.json').resolves({ - dependencies: { - 'cypress': '1.2.3', - }, - }) - - fs.readJSON.withArgs('C:\\foo\\bar\\package.json').resolves({ - dependencies: { - 'cypress': 'wrong', - }, - }) - - expect(await install._getVersionSpecifier('C:\\foo\\bar\\baz')).to.eq('1.2.3') - }) - - it('resolves with devDependencies too', async function () { - fs.readJSON.withArgs('C:\\foo\\bar\\baz\\package.json').resolves({ - devDependencies: { - 'cypress': '4.5.6', - }, - }) - - expect(await install._getVersionSpecifier('C:\\foo\\bar\\baz')).to.eq('4.5.6') - }) - - it('resolves with optionalDependencies too', async function () { - fs.readJSON.withArgs('C:\\foo\\bar\\baz\\package.json').resolves({ - optionalDependencies: { - 'cypress': '6.7.8', - }, - }) - - expect(await install._getVersionSpecifier('C:\\foo\\bar\\baz')).to.eq('6.7.8') - }) + expect(install._getBinaryUrlFromBuildInfo(buildInfo)) + .to.eq(`https://cdn.cypress.io/beta/binary/0.0.0-development/linux-x64/aBranchName-abc123/cypress.zip`) }) }) }) diff --git a/guides/release-process.md b/guides/release-process.md index 0b5a6f6311e5..5c46e8a7c830 100644 --- a/guides/release-process.md +++ b/guides/release-process.md @@ -78,27 +78,24 @@ In the following instructions, "X.Y.Z" is used to denote the [next version of Cy 6. Log into AWS SSO with `aws sso login --profile `. The release scripts assumes you are using the `production` profile. If you have setup your credentials under a different profile, be sure to set the `AWS_PROFILE` environment variable. -7. Use the `move-binaries` script to move the binaries for `` from `beta` to the `desktop` folder for ``. This also purges the cloudflare cache for this version. +7. Use the `prepare-release-artifacts` script (Mac/Linux only) to prepare the latest commit to a stable release. When you run this script, the following happens: + * the binaries for `` are moved from `beta` to the `desktop` folder for `` in S3 + * the Cloudflare cache for this version is purged + * the pre-prod `cypress.tgz` NPM package is converted to a stable NPM package ready for release ```shell - yarn move-binaries --sha --version + yarn prepare-release-artifacts --sha --version ``` -8. Validate you are logged `npm` with `npm whoami`. Otherwise log in with `npm login`. + You can pass `--dry-run` to see the commands this would run under the hood. -9. Publish the new npm package under the `dev` tag, using your personal npm account. - - To find the link to the package file `cypress.tgz`: - 1. In GitHub, go to the latest commit (the one whose sha you used in the last step). - ![commit-link](https://user-images.githubusercontent.com/1157043/80608728-33fe6100-8a05-11ea-8b53-375303757b67.png) - 2. Scroll down past the changes to the comments. The first comment should be a `cypress-bot` comment that includes a line beginning `npm install ...`. Grab the `https://cdn.../npm/X.Y.Z///cypress.tgz` link. - ![commit-bot-comment](../assets/cypress-bot-pre-release-comment.png) - - Make sure the `linux-x64` binary and npm package are present at the commented locations. See [Before Publishing a New Version](#before-publishing-a-new-version). - - Publish the `linux-x64` distribution to the npm registry straight from the URL: +8. Validate you are logged in to `npm` with `npm whoami`. Otherwise log in with `npm login`. - ```shell - npm publish https://cdn.cypress.io/beta/npm/X.Y.Z//cypress.tgz --tag dev - ``` - :bangbang: Important :bangbang: Be sure to release the `linux-x64` distribution. +9. Publish the generated npm package under the `dev` tag, using your personal npm account. + + ```shell + npm publish /tmp/cypress-prod.tgz --tag dev + ``` 10. Double-check that the new version has been published under the `dev` tag using `npm info cypress` or [available-versions](https://github.com/bahmutov/available-versions). `latest` should still point to the previous version. Example output: diff --git a/package.json b/package.json index fd685f6fb07c..a5e7a556d843 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "jscodeshift": "jscodeshift -t ./node_modules/js-codemod/transforms/arrow-function-arguments.js", "lint": "eslint --ext .js,.jsx,.ts,.tsx,.json .", "lint-changed": "lint-changed", - "move-binaries": "node ./scripts/binary.js move-binaries", + "prepare-release-artifacts": "node ./scripts/prepare-release-artifacts.js", "npm-release": "node scripts/npm-release.js", "prestart": "yarn ensure-deps", "start": "cypress open --dev --global", diff --git a/packages/server/package.json b/packages/server/package.json index b108c715442e..8fc8ffcc3986 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -50,7 +50,7 @@ "data-uri-to-buffer": "2.0.1", "dayjs": "^1.9.3", "debug": "^4.3.2", - "dependency-tree": "8.1.0", + "dependency-tree": "8.1.2", "duplexify": "4.1.1", "electron-context-menu": "3.1.1", "errorhandler": "1.5.1", diff --git a/scripts/binary/build.ts b/scripts/binary/build.ts index 3280dc8ee0df..1f17dac4a2a6 100644 --- a/scripts/binary/build.ts +++ b/scripts/binary/build.ts @@ -114,6 +114,7 @@ export async function buildCypressApp (options: BuildCypressAppOpts) { meta.distDir('**', 'esprima', 'test'), meta.distDir('**', 'bmp-js', 'test'), meta.distDir('**', 'exif-parser', 'test'), + meta.distDir('**', 'app-module-path', 'test'), ], { force: true }) console.log('Deleted excess directories') diff --git a/scripts/binary/upload-build-artifact.js b/scripts/binary/upload-build-artifact.js index abaea6fc11de..c0aa28909e5e 100644 --- a/scripts/binary/upload-build-artifact.js +++ b/scripts/binary/upload-build-artifact.js @@ -23,9 +23,9 @@ const getUploadDirForPlatform = function (options) { // the artifact will be uploaded for every platform and uploaded into under a unique folder // https://cdn.cypress.io/beta/(binary|npm)////cypress.zip // For binary: -// beta/binary/9.4.2/win32-x64/circle-develop-219138ca4e952edc4af831f2ae16ce659ebdb50b/cypress.zip +// beta/binary/9.4.2/win32-x64/develop-219138ca4e952edc4af831f2ae16ce659ebdb50b/cypress.zip // For NPM package: -// beta/npm/9.4.2/circle-develop-219138ca4e952edc4af831f2ae16ce659ebdb50b/cypress.tgz +// beta/npm/9.4.2/develop-219138ca4e952edc4af831f2ae16ce659ebdb50b/cypress.tgz const getUploadPath = function (options) { const { hash, uploadFileName } = options diff --git a/scripts/binary/util/upload.js b/scripts/binary/util/upload.js index f9f53cf0c0fd..35bef0555f30 100644 --- a/scripts/binary/util/upload.js +++ b/scripts/binary/util/upload.js @@ -25,7 +25,7 @@ const formHashFromEnvironment = function () { } = process if (env.CIRCLECI) { - return `circle-${env.CIRCLE_BRANCH}-${env.CIRCLE_SHA1}` + return `${env.CIRCLE_BRANCH}-${env.CIRCLE_SHA1}` } throw new Error('Do not know how to form unique build hash on this CI') diff --git a/scripts/create-stable-npm-package.sh b/scripts/create-stable-npm-package.sh new file mode 100755 index 000000000000..355951336c94 --- /dev/null +++ b/scripts/create-stable-npm-package.sh @@ -0,0 +1,57 @@ +#!/bin/bash +set -e # exit on error + +PLATFORM=$(node -p 'process.platform') +if [[ $PLATFORM != "linux" && $PLATFORM != "darwin" ]]; then + echo "Currently, create-stable-npm-package is only supported on Linux and MacOS." + echo "See https://github.com/cypress-io/cypress/pull/20296#discussion_r817115583" + exit 1 +fi + +if [[ ! $1 ]]; then + echo "publish-npm-package takes the .tgz URL as the first argument" + exit 1 +fi + +if [[ $1 != *"linux-x64"* ]]; then + echo "Only publish the 'linux-x64' .tgz. A non-linux-x64 .tgz was passed." + exit 1 +fi + +set -x # log commands + +TGZ_URL=$1 +PREPROD_TGZ_PATH=/tmp/cypress-preprod.tgz +UNPACKED_PATH=/tmp/unpacked-cypress +PROD_TGZ_PATH=/tmp/cypress-prod.tgz + +echo "Downloading tgz from TGZ_URL=$TGZ_URL" +curl $TGZ_URL -o $PREPROD_TGZ_PATH + +echo "Untarring PREPROD_TGZ_PATH=$PREPROD_TGZ_PATH" +rm -rf $UNPACKED_PATH || true +mkdir $UNPACKED_PATH +tar -xzvf $PREPROD_TGZ_PATH -C $UNPACKED_PATH + +export PKG_JSON_PATH=$UNPACKED_PATH/package/package.json + +echo "Patching stable: true to package.json" +node < console.log('🏗', ...args) + +const exec = args['dry-run'] ? + (...args) => log('Dry run, not executing:', ...args) + : (...args) => shelljs.exec(...args) + +log('Running `move-binaries`...') +exec(`node ./scripts/binary.js move-binaries --sha ${args.sha} --version ${args.version}`) + +const prereleaseNpmUrl = `https://cdn.cypress.io/beta/npm/${args.version}/linux-x64/develop-${args.sha}/cypress.tgz` + +log('Running `create-stable-npm-package`...') +exec(`./scripts/create-stable-npm-package.sh ${prereleaseNpmUrl}`) diff --git a/scripts/unit/prepare-release-artifacts-spec.js b/scripts/unit/prepare-release-artifacts-spec.js new file mode 100644 index 000000000000..947b30e94eb6 --- /dev/null +++ b/scripts/unit/prepare-release-artifacts-spec.js @@ -0,0 +1,10 @@ +const shelljs = require('shelljs') +const snapshot = require('snap-shot-it') + +describe('prepare-release-artifacts', () => { + it('runs expected commands', () => { + const stdout = shelljs.exec('yarn prepare-release-artifacts --dry-run --sha 57d0a85108fad6f77b39db88b8a7d8a3bfdb51a2 --version 1.2.3') + + snapshot(stdout) + }) +}) diff --git a/yarn.lock b/yarn.lock index 7c706ef62f97..6ef6b5f74e78 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9404,10 +9404,10 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.18.0.tgz#bebe323f81f2a7e2e320fac9415e60856267584a" integrity sha512-/BRociARpj5E+9yQ7cwCF/SNOWwXJ3qhjurMuK2hIFUbr9vTuDeu476Zpu+ptxY2kSxUHDGLLKy+qGq2sOg37A== -"@typescript-eslint/types@4.23.0": - version "4.23.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.23.0.tgz#da1654c8a5332f4d1645b2d9a1c64193cae3aa3b" - integrity sha512-oqkNWyG2SLS7uTWLZf6Sr7Dm02gA5yxiz1RP87tvsmDsguVATdpVguHr4HoGOcFOpCvx9vtCSCyQUGfzq28YCw== +"@typescript-eslint/types@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72" + integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ== "@typescript-eslint/typescript-estree@2.34.0": version "2.34.0" @@ -9448,18 +9448,18 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@^4.8.2": - version "4.23.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.23.0.tgz#0753b292097523852428a6f5a1aa8ccc1aae6cd9" - integrity sha512-5Sty6zPEVZF5fbvrZczfmLCOcby3sfrSPu30qKoY1U3mca5/jvU5cwsPb/CO6Q3ByRjixTMIVsDkqwIxCf/dMw== +"@typescript-eslint/typescript-estree@^4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609" + integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA== dependencies: - "@typescript-eslint/types" "4.23.0" - "@typescript-eslint/visitor-keys" "4.23.0" - debug "^4.1.1" - globby "^11.0.1" + "@typescript-eslint/types" "4.33.0" + "@typescript-eslint/visitor-keys" "4.33.0" + debug "^4.3.1" + globby "^11.0.3" is-glob "^4.0.1" - semver "^7.3.2" - tsutils "^3.17.1" + semver "^7.3.5" + tsutils "^3.21.0" "@typescript-eslint/visitor-keys@4.16.1": version "4.16.1" @@ -9477,12 +9477,12 @@ "@typescript-eslint/types" "4.18.0" eslint-visitor-keys "^2.0.0" -"@typescript-eslint/visitor-keys@4.23.0": - version "4.23.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.23.0.tgz#7215cc977bd3b4ef22467b9023594e32f9e4e455" - integrity sha512-5PNe5cmX9pSifit0H+nPoQBXdbNzi5tOEec+3riK+ku4e3er37pKxMKDH5Ct5Y4fhWxcD4spnlYjxi9vXbSpwg== +"@typescript-eslint/visitor-keys@4.33.0": + version "4.33.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd" + integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg== dependencies: - "@typescript-eslint/types" "4.23.0" + "@typescript-eslint/types" "4.33.0" eslint-visitor-keys "^2.0.0" "@ungap/promise-all-settled@1.1.2": @@ -11532,11 +11532,16 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -ast-module-types@^2.3.2, ast-module-types@^2.4.0, ast-module-types@^2.7.0, ast-module-types@^2.7.1: +ast-module-types@^2.3.2, ast-module-types@^2.4.0, ast-module-types@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.7.1.tgz#3f7989ef8dfa1fdb82dfe0ab02bdfc7c77a57dd3" integrity sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw== +ast-module-types@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/ast-module-types/-/ast-module-types-3.0.0.tgz#9a6d8a80f438b6b8fe4995699d700297f398bf81" + integrity sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ== + ast-traverse@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ast-traverse/-/ast-traverse-0.1.1.tgz#69cf2b8386f19dcda1bb1e05d68fe359d8897de6" @@ -16840,7 +16845,7 @@ de-indent@^1.0.2: resolved "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d" integrity sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0= -debug@*, debug@4, debug@4.3.3, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@~4.3.1: +debug@*, debug@4, debug@4.3.3, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3, debug@~4.3.1: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== @@ -16945,13 +16950,6 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= -decomment@^0.9.3: - version "0.9.4" - resolved "https://registry.yarnpkg.com/decomment/-/decomment-0.9.4.tgz#fa40335bd90e3826d5c1984276e390525ff856d5" - integrity sha512-8eNlhyI5cSU4UbBlrtagWpR03dqXcE5IR9zpe7PnO6UzReXDskucsD8usgrzUmQ6qJ3N82aws/p/mu/jqbURWw== - dependencies: - esprima "4.0.1" - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -17272,15 +17270,15 @@ dependency-graph@^0.7.2: resolved "https://registry.yarnpkg.com/dependency-graph/-/dependency-graph-0.7.2.tgz#91db9de6eb72699209d88aea4c1fd5221cac1c49" integrity sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ== -dependency-tree@8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/dependency-tree/-/dependency-tree-8.1.0.tgz#1b896a0418bd7ba3e6d55c39bb664452a001579f" - integrity sha512-YKFK+1KXJOqVpsW6MkrIl/DyiW+KVG25V8NfRs27ANe+oSeCkQx2ROW1mBpp1bcm++5zj3Xv8wyFxHgX6TbM1w== +dependency-tree@8.1.2: + version "8.1.2" + resolved "https://registry.npmjs.org/dependency-tree/-/dependency-tree-8.1.2.tgz#c9e652984f53bd0239bc8a3e50cbd52f05b2e770" + integrity sha512-c4CL1IKxkKng0oT5xrg4uNiiMVFqTGOXqHSFx7XEFdgSsp6nw3AGGruICppzJUrfad/r7GLqt26rmWU4h4j39A== dependencies: commander "^2.20.3" debug "^4.3.1" - filing-cabinet "^3.0.0" - precinct "^7.0.0" + filing-cabinet "^3.0.1" + precinct "^8.0.0" typescript "^3.9.7" deprecation@^1.0.1: @@ -17407,15 +17405,15 @@ detect-port@^1.3.0: address "^1.0.1" debug "^2.6.0" -detective-amd@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-3.1.0.tgz#92daee3214a0ca4522646cf333cac90a3fca6373" - integrity sha512-G7wGWT6f0VErjUkE2utCm7IUshT7nBh7aBBH2VBOiY9Dqy2DMens5iiOvYCuhstoIxRKLrnOvVAz4/EyPIAjnw== +detective-amd@^3.1.0: + version "3.1.2" + resolved "https://registry.npmjs.org/detective-amd/-/detective-amd-3.1.2.tgz#bf55eb5291c218b76d6224a3d07932ef13a9a357" + integrity sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ== dependencies: - ast-module-types "^2.7.0" + ast-module-types "^3.0.0" escodegen "^2.0.0" get-amd-module-type "^3.0.0" - node-source-walk "^4.0.0" + node-source-walk "^4.2.0" detective-cjs@^3.1.1: version "3.1.1" @@ -17425,10 +17423,10 @@ detective-cjs@^3.1.1: ast-module-types "^2.4.0" node-source-walk "^4.0.0" -detective-es6@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-2.2.0.tgz#8f2baba3f8cd90a5cfd748f5ac436f0158ed2585" - integrity sha512-fSpNY0SLER7/sVgQZ1NxJPwmc9uCTzNgdkQDhAaj8NPYwr7Qji9QBcmbNvtMCnuuOGMuKn3O7jv0An+/WRWJZQ== +detective-es6@^2.2.1: + version "2.2.2" + resolved "https://registry.npmjs.org/detective-es6/-/detective-es6-2.2.2.tgz#ee5f880981d9fecae9a694007029a2f6f26d8d28" + integrity sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw== dependencies: node-source-walk "^4.0.0" @@ -17474,15 +17472,15 @@ detective-stylus@^1.0.0: resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-1.0.0.tgz#50aee7db8babb990381f010c63fabba5b58e54cd" integrity sha1-UK7n24uruZA4HwEMY/q7pbWOVM0= -detective-typescript@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-6.0.0.tgz#394062118d7c7da53425647ca41e0081169aa2b3" - integrity sha512-vTidcSDK3QostdbrH2Rwf9FhvrgJ4oIaVw5jbolgruTejexk6nNa9DShGpuS8CFVDb1IP86jct5BaZt1wSxpkA== +detective-typescript@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/detective-typescript/-/detective-typescript-7.0.2.tgz#c6e00b4c28764741ef719662250e6b014a5f3c8e" + integrity sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA== dependencies: - "@typescript-eslint/typescript-estree" "^4.8.2" + "@typescript-eslint/typescript-estree" "^4.33.0" ast-module-types "^2.7.1" node-source-walk "^4.2.0" - typescript "^3.9.7" + typescript "^3.9.10" detective@^4.0.0, detective@^4.3.1: version "4.7.1" @@ -18361,10 +18359,10 @@ enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0, enhanced-resolve@^4.3.0, enhan memory-fs "^0.5.0" tapable "^1.0.0" -enhanced-resolve@^5.3.2, enhanced-resolve@^5.7.0, enhanced-resolve@^5.8.0: - version "5.8.2" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.2.tgz#15ddc779345cbb73e97c611cd00c01c1e7bf4d8b" - integrity sha512-F27oB3WuHDzvR2DOGNTaYy0D5o0cnrv8TeI482VM4kYgQd/FT9lUQwuNsJ0oOHtBUq7eiW5ytqzp7nBFknL+GA== +enhanced-resolve@^5.7.0, enhanced-resolve@^5.8.0, enhanced-resolve@^5.8.3: + version "5.9.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.0.tgz#49ac24953ac8452ed8fed2ef1340fc8e043667ee" + integrity sha512-weDYmzbBygL7HzGGS26M3hGQx68vehdEg6VUmqSOaFzXExFqlnKuSvsEJCVGQHScS8CQMbrAqftT+AzzHNt/YA== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -19134,7 +19132,7 @@ esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= -esprima@4.0.1, esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: +esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -20084,20 +20082,19 @@ filesize@6.1.0: resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== -filing-cabinet@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/filing-cabinet/-/filing-cabinet-3.0.0.tgz#08f9ceec5134f4a662926dd45b8a26eca1b5f622" - integrity sha512-o8Qac5qxZ1uVidR4Sd7ZQbbqObFZlqXU4xu1suAYg9PQPcQFNTzOmxQa/MehIDMgIvXHTb42mWPNV9l3eHBPSw== +filing-cabinet@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/filing-cabinet/-/filing-cabinet-3.1.0.tgz#3f2a347f0392faad772744de099e25b6dd6f86fd" + integrity sha512-ZFutWTo14Z1xmog76UoQzDKEza1fSpqc+HvUN6K6GILrfhIn6NbR8fHQktltygF+wbt7PZ/EvfLK6yJnebd40A== dependencies: app-module-path "^2.2.0" commander "^2.20.3" - debug "^4.3.1" - decomment "^0.9.3" - enhanced-resolve "^5.3.2" + debug "^4.3.3" + enhanced-resolve "^5.8.3" is-relative-path "^1.0.2" module-definition "^3.3.1" - module-lookup-amd "^7.0.0" - resolve "^1.19.0" + module-lookup-amd "^7.0.1" + resolve "^1.21.0" resolve-dependency-path "^2.0.0" sass-lookup "^3.0.0" stylus-lookup "^3.0.1" @@ -21688,7 +21685,7 @@ globby@8.0.2: pify "^3.0.0" slash "^1.0.0" -globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@^11.1.0: +globby@^11.0.0, globby@^11.0.1, globby@^11.0.2, globby@^11.0.3, globby@^11.1.0: version "11.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== @@ -23613,10 +23610,10 @@ is-color-stop@^1.0.0, is-color-stop@^1.1.0: rgb-regex "^1.0.1" rgba-regex "^1.0.0" -is-core-module@^2.1.0, is-core-module@^2.2.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.4.0.tgz#8e9fc8e15027b011418026e98f0e6f4d86305cc1" - integrity sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A== +is-core-module@^2.1.0, is-core-module@^2.2.0, is-core-module@^2.8.1: + version "2.8.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211" + integrity sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA== dependencies: has "^1.0.3" @@ -28576,9 +28573,9 @@ module-deps@^6.0.0: through2 "^2.0.0" xtend "^4.0.0" -module-lookup-amd@^7.0.0: +module-lookup-amd@^7.0.1: version "7.0.1" - resolved "https://registry.yarnpkg.com/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz#d67c1a93f2ff8e38b8774b99a638e9a4395774b2" + resolved "https://registry.npmjs.org/module-lookup-amd/-/module-lookup-amd-7.0.1.tgz#d67c1a93f2ff8e38b8774b99a638e9a4395774b2" integrity sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ== dependencies: commander "^2.8.1" @@ -31040,10 +31037,10 @@ path-key@^3.0.0, path-key@^3.1.0: resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== +path-parse@^1.0.6, path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== path-platform@~0.11.15: version "0.11.15" @@ -32547,22 +32544,22 @@ prebuild-install@^5.2.4, prebuild-install@^5.3.5: tunnel-agent "^0.6.0" which-pm-runs "^1.0.0" -precinct@^7.0.0: - version "7.1.0" - resolved "https://registry.yarnpkg.com/precinct/-/precinct-7.1.0.tgz#a0311e0b59029647eaf57c2d30b8efa9c85d129a" - integrity sha512-I1RkW5PX51/q6Xl39//D7x9NgaKNGHpR5DCNaoxP/b2+KbzzXDNhauJUMV17KSYkJA41CSpwYUPRtRoNxbshWA== +precinct@^8.0.0: + version "8.3.1" + resolved "https://registry.npmjs.org/precinct/-/precinct-8.3.1.tgz#94b99b623df144eed1ce40e0801c86078466f0dc" + integrity sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q== dependencies: commander "^2.20.3" - debug "^4.3.1" - detective-amd "^3.0.1" + debug "^4.3.3" + detective-amd "^3.1.0" detective-cjs "^3.1.1" - detective-es6 "^2.2.0" + detective-es6 "^2.2.1" detective-less "^1.0.2" detective-postcss "^4.0.0" detective-sass "^3.0.1" detective-scss "^2.0.1" detective-stylus "^1.0.0" - detective-typescript "^6.0.0" + detective-typescript "^7.0.0" module-definition "^3.3.1" node-source-walk "^4.2.0" @@ -35240,7 +35237,7 @@ resolve@1.19.0: is-core-module "^2.1.0" path-parse "^1.0.6" -resolve@1.20.0, resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: +resolve@1.20.0: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -35253,6 +35250,15 @@ resolve@^0.6.3: resolved "https://registry.yarnpkg.com/resolve/-/resolve-0.6.3.tgz#dd957982e7e736debdf53b58a4dd91754575dd46" integrity sha1-3ZV5gufnNt699TtYpN2RdUV13UY= +resolve@^1.1.4, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.0, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.18.1, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.21.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: + version "1.22.0" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz#5e0b8c67c15df57a89bdbabe603a002f21731198" + integrity sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw== + dependencies: + is-core-module "^2.8.1" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" @@ -38127,6 +38133,11 @@ supports-hyperlinks@^2.1.0: has-flag "^4.0.0" supports-color "^7.0.0" +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + sver-compat@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/sver-compat/-/sver-compat-1.5.0.tgz#3cf87dfeb4d07b4a3f14827bc186b3fd0c645cd8" @@ -39306,10 +39317,10 @@ tsutils@^2.29.0: dependencies: tslib "^1.8.1" -tsutils@^3.17.1: - version "3.20.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.20.0.tgz#ea03ea45462e146b53d70ce0893de453ff24f698" - integrity sha512-RYbuQuvkhuqVeXweWT3tJLKOEJ/UUw9GjNEZGWdrLLlM+611o1gwLHBpxoFJKKl25fLprp2eVthtKs5JOrNeXg== +tsutils@^3.17.1, tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== dependencies: tslib "^1.8.1" @@ -39480,10 +39491,10 @@ typescript@4.2.4, typescript@~4.2.4: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== -typescript@^3.9.7: - version "3.9.9" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674" - integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== +typescript@^3.9.10, typescript@^3.9.7: + version "3.9.10" + resolved "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz#70f3910ac7a51ed6bef79da7800690b19bf778b8" + integrity sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q== typescript@^4.2.3, typescript@^4.4.4: version "4.4.4"