mirror of
https://github.com/cypress-io/cypress.git
synced 2026-04-28 19:00:03 -05:00
test(system-tests): support npm for test projects (#20664)
This commit is contained in:
@@ -101,7 +101,6 @@ system-tests/fixtures/large-img
|
||||
|
||||
# Building app binary
|
||||
scripts/support
|
||||
package-lock.json
|
||||
binary-url.json
|
||||
|
||||
# Allows us to dynamically create eslint rules that override the default for Decaffeinate scripts
|
||||
|
||||
Vendored
+2
@@ -39,4 +39,6 @@
|
||||
// These are commented out because they slow down node development
|
||||
// "volar.autoCompleteRefs": false,
|
||||
"volar.takeOverMode.enabled": true,
|
||||
|
||||
"editor.tabSize": 2,
|
||||
}
|
||||
|
||||
@@ -312,6 +312,7 @@ commands:
|
||||
key: v{{ .Environment.CACHE_VERSION }}-{{ checksum "platform_key" }}-deps-root-weekly-{{ checksum "cache_date" }}
|
||||
paths:
|
||||
- ~/.yarn
|
||||
- ~/.cy-npm-cache
|
||||
|
||||
verify-build-setup:
|
||||
description: Common commands run when setting up for build or yarn install
|
||||
|
||||
@@ -2,13 +2,14 @@ require('../spec_helper')
|
||||
|
||||
const plugins = require('../../lib/plugins')
|
||||
const Fixtures = require('@tooling/system-tests/lib/fixtures')
|
||||
const { scaffoldCommonNodeModules } = require('@tooling/system-tests/lib/dep-installer')
|
||||
|
||||
const pluginsFile = Fixtures.projectPath('plugin-before-browser-launch-deprecation/cypress/plugins/index.js')
|
||||
|
||||
describe('lib/plugins', () => {
|
||||
beforeEach(async () => {
|
||||
Fixtures.scaffoldProject('plugin-before-browser-launch-deprecation')
|
||||
await Fixtures.scaffoldCommonNodeModules()
|
||||
await scaffoldCommonNodeModules()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
|
||||
@@ -7,6 +7,7 @@ const Promise = require('bluebird')
|
||||
const os = require('os')
|
||||
const verify = require('../../cli/lib/tasks/verify')
|
||||
const Fixtures = require('@tooling/system-tests/lib/fixtures')
|
||||
const { scaffoldCommonNodeModules } = require('@tooling/system-tests/lib/dep-installer')
|
||||
|
||||
const fs = Promise.promisifyAll(fse)
|
||||
|
||||
@@ -160,7 +161,7 @@ const runFailingProjectTest = function (buildAppExecutable, e2e) {
|
||||
}
|
||||
|
||||
const test = async function (buildAppExecutable) {
|
||||
await Fixtures.scaffoldCommonNodeModules()
|
||||
await scaffoldCommonNodeModules()
|
||||
Fixtures.scaffoldProject('e2e')
|
||||
const e2e = Fixtures.projectPath('e2e')
|
||||
|
||||
|
||||
@@ -103,20 +103,20 @@ SNAPSHOT_UPDATE=1 yarn test go_spec
|
||||
|
||||
Every folder in [`./projects`](./lib/projects) represents a self-contained Cypress project. When you pass the `project` property to `systemTests.it` or `systemTests.exec`, Cypress launches using this project.
|
||||
|
||||
If a test project has a `package.json` file, the `systemTests.exec` helper will attempt to install the correct `node_modules` by running `yarn install` against the project. This is cached in CI and locally to speed up test times.
|
||||
If a test project has a `package.json` file, the `systemTests.exec` helper will attempt to install the correct `node_modules` by running `yarn install` or `npm install` (depending on which lockfile is present) against the project. This is cached in CI and locally to speed up test times.
|
||||
|
||||
`systemTests.exec` *copies* the project directory to a temporary folder outside of the monorepo root. This means that temporary projects will not inherit the `node_modules` from this package or the monorepo. So, you must add the dependencies required for your project in `dependencies` or `devDependencies`.
|
||||
|
||||
The exception is some commonly used packages that are scaffolded for all projects, like `lodash` and `debug`. You can see the list by looking at `scaffoldCommonNodeModules` in [`./lib/fixtures.ts`](./lib/fixtures.ts) These packages do not need to be added to a test project's `package.json`.
|
||||
|
||||
You can also set special properties in a test project's `package.json` to influence the helper's behavior when running `yarn`:
|
||||
You can also set special properties in a test project's `package.json` to influence the helper's behavior when running `yarn` or `npm`:
|
||||
|
||||
`package.json` Property Name | Type | Description
|
||||
--- | --- | ---
|
||||
`_cySkipYarnInstall` | `boolean` | If `true`, skip the automatic `yarn install` for this package, even though it has a `package.json`.
|
||||
`_cySkipDepInstall` | `boolean` | If `true`, skip the automatic `yarn install` or `npm install` for this package, even though it has a `package.json`.
|
||||
`_cyYarnV311` | `boolean` | Run the yarn v3.1.1-style install command instead of yarn v1-style.
|
||||
`_cyRunScripts` | `boolean` | By default, the automatic `yarn install` will not run postinstall scripts. This option, if set, will cause postinstall scripts to run for this project.
|
||||
`_cyRunScripts` | `boolean` | By default, the automatic install will not run postinstall scripts. This option, if set, will cause postinstall scripts to run for this project.
|
||||
|
||||
Run `yarn projects:yarn:install` to run `yarn install` for all projects with a `package.json`.
|
||||
Run `yarn projects:yarn:install` to run `yarn install`/`npm install` for all applicable projects.
|
||||
|
||||
Use the `UPDATE_YARN_LOCK=1` environment variable with `yarn test` or `yarn projects:yarn:install` to allow the `yarn.lock` to be updated and synced back to the monorepo from the temp dir.
|
||||
Use the `UPDATE_LOCK_FILE=1` environment variable with `yarn test` or `yarn projects:yarn:install` to allow the `yarn.lock` or `package-lock.json` to be updated and synced back to the monorepo from the temp dir.
|
||||
|
||||
@@ -0,0 +1,310 @@
|
||||
import fs from 'fs-extra'
|
||||
import path from 'path'
|
||||
import cachedir from 'cachedir'
|
||||
import execa from 'execa'
|
||||
import { cyTmpDir, projectPath, projects, root } from '../fixtures'
|
||||
import { getYarnCommand } from './yarn'
|
||||
import { getNpmCommand } from './npm'
|
||||
|
||||
type Dependencies = Record<string, string>
|
||||
|
||||
/**
|
||||
* Type for package.json files for system-tests example projects.
|
||||
*/
|
||||
type SystemTestPkgJson = {
|
||||
/**
|
||||
* By default, scaffolding will run install if there is a `package.json`.
|
||||
* This option, if set, disables that.
|
||||
*/
|
||||
_cySkipDepInstall?: boolean
|
||||
/**
|
||||
* Run the yarn v3-style install command instead of yarn v1-style.
|
||||
*/
|
||||
_cyYarnV311?: boolean
|
||||
/**
|
||||
* By default, the automatic install will not run postinstall scripts. This
|
||||
* option, if set, will cause postinstall scripts to run for this project.
|
||||
*/
|
||||
_cyRunScripts?: boolean
|
||||
dependencies?: Dependencies
|
||||
devDependencies?: Dependencies
|
||||
optionalDependencies?: Dependencies
|
||||
}
|
||||
|
||||
const log = (...args) => console.log('📦', ...args)
|
||||
|
||||
/**
|
||||
* Given a package name, returns the path to the module directory on disk.
|
||||
*/
|
||||
function pathToPackage (pkg: string): string {
|
||||
return path.dirname(require.resolve(`${pkg}/package.json`))
|
||||
}
|
||||
|
||||
async function ensureCacheDir (cacheDir: string) {
|
||||
try {
|
||||
await fs.stat(cacheDir)
|
||||
} catch (err) {
|
||||
log(`Creating a new node_modules cache dir at ${cacheDir}`)
|
||||
await fs.mkdirp(cacheDir)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Symlink the cached `node_modules` directory to the temp project directory's `node_modules`.
|
||||
*/
|
||||
async function symlinkNodeModulesFromCache (tmpNodeModulesDir: string, cacheDir: string): Promise<void> {
|
||||
await fs.symlink(cacheDir, tmpNodeModulesDir, 'junction')
|
||||
|
||||
log(`node_modules symlink created at ${tmpNodeModulesDir}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy the cached `node_modules` to the temp project directory's `node_modules`.
|
||||
*
|
||||
* @returns a callback that will copy changed `node_modules` back to the cached `node_modules`.
|
||||
*/
|
||||
async function copyNodeModulesFromCache (tmpNodeModulesDir: string, cacheDir: string): Promise<() => Promise<void>> {
|
||||
await fs.copy(cacheDir, tmpNodeModulesDir, { dereference: true })
|
||||
|
||||
log(`node_modules copied to ${tmpNodeModulesDir} from cache dir ${cacheDir}`)
|
||||
|
||||
return async () => {
|
||||
try {
|
||||
await fs.copy(tmpNodeModulesDir, cacheDir, { dereference: true })
|
||||
} catch (err) {
|
||||
if (err.message === 'Source and destination must not be the same') return
|
||||
|
||||
throw err
|
||||
}
|
||||
|
||||
log(`node_modules copied from ${tmpNodeModulesDir} to cache dir ${cacheDir}`)
|
||||
}
|
||||
}
|
||||
|
||||
async function getLockFilename (dir: string) {
|
||||
const hasYarnLock = !!await fs.stat(path.join(dir, 'yarn.lock')).catch(() => false)
|
||||
const hasNpmLock = !!await fs.stat(path.join(dir, 'package-lock.json')).catch(() => false)
|
||||
|
||||
if (hasYarnLock && hasNpmLock) throw new Error(`The example project at '${dir}' has conflicting lockfiles. Only use one package manager's lockfile per project.`)
|
||||
|
||||
if (hasNpmLock) return 'package-lock.json'
|
||||
|
||||
// default to yarn
|
||||
return 'yarn.lock'
|
||||
}
|
||||
|
||||
function getRelativePathToProjectDir (projectDir: string) {
|
||||
return path.relative(projectDir, path.join(root, '..'))
|
||||
}
|
||||
|
||||
async function restoreLockFileRelativePaths (opts: { projectDir: string, lockFilePath: string, relativePathToMonorepoRoot: string }) {
|
||||
const relativePathToProjectDir = getRelativePathToProjectDir(opts.projectDir)
|
||||
const lockFileContents = (await fs.readFile(opts.lockFilePath, 'utf8'))
|
||||
.replaceAll(opts.relativePathToMonorepoRoot, relativePathToProjectDir)
|
||||
|
||||
await fs.writeFile(opts.lockFilePath, lockFileContents)
|
||||
}
|
||||
|
||||
async function normalizeLockFileRelativePaths (opts: { project: string, projectDir: string, lockFilePath: string, lockFilename: string, relativePathToMonorepoRoot: string }) {
|
||||
const relativePathToProjectDir = getRelativePathToProjectDir(opts.projectDir)
|
||||
const lockFileContents = (await fs.readFile(opts.lockFilePath, 'utf8'))
|
||||
.replaceAll(relativePathToProjectDir, opts.relativePathToMonorepoRoot)
|
||||
|
||||
// write back to the original project dir, not the tmp copy
|
||||
await fs.writeFile(path.join(projects, opts.project, opts.lockFilename), lockFileContents)
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a path to a `package.json`, convert any references to development
|
||||
* versions of packages to absolute paths, so `yarn`/`npm` will not reach out to
|
||||
* the Internet to obtain these packages once it runs in the temp dir.
|
||||
* @returns a list of dependency names that were updated
|
||||
*/
|
||||
async function makeWorkspacePackagesAbsolute (pathToPkgJson: string): Promise<string[]> {
|
||||
const pkgJson = await fs.readJson(pathToPkgJson)
|
||||
const updatedDeps: string[] = []
|
||||
|
||||
for (const deps of [pkgJson.dependencies, pkgJson.devDependencies, pkgJson.optionalDependencies]) {
|
||||
for (const dep in deps) {
|
||||
const version = deps[dep]
|
||||
|
||||
if (version.startsWith('file:')) {
|
||||
const absPath = pathToPackage(dep)
|
||||
|
||||
log(`Setting absolute path in package.json for ${dep}: ${absPath}.`)
|
||||
|
||||
deps[dep] = `file:${absPath}`
|
||||
updatedDeps.push(dep)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await fs.writeJson(pathToPkgJson, pkgJson)
|
||||
|
||||
return updatedDeps
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a `system-tests` project name, detect and install the `node_modules`
|
||||
* specified in the project's `package.json`. No-op if no `package.json` is found.
|
||||
* Will use `yarn` or `npm` based on the lockfile present.
|
||||
*/
|
||||
export async function scaffoldProjectNodeModules (project: string, updateLockFile: boolean = !!process.env.UPDATE_LOCK_FILE): Promise<void> {
|
||||
const projectDir = projectPath(project)
|
||||
const relativePathToMonorepoRoot = path.relative(
|
||||
path.join(projects, project),
|
||||
path.join(root, '..'),
|
||||
)
|
||||
const projectPkgJsonPath = path.join(projectDir, 'package.json')
|
||||
|
||||
const runCmd = async (cmd) => {
|
||||
log(`Running "${cmd}" in ${projectDir}`)
|
||||
await execa(cmd, { cwd: projectDir, stdio: 'inherit', shell: true })
|
||||
}
|
||||
|
||||
const cacheNodeModulesDir = path.join(cachedir('cy-system-tests-node-modules'), project, 'node_modules')
|
||||
const tmpNodeModulesDir = path.join(projectPath(project), 'node_modules')
|
||||
|
||||
async function removeWorkspacePackages (packages: string[]): Promise<void> {
|
||||
for (const dep of packages) {
|
||||
const depDir = path.join(tmpNodeModulesDir, dep)
|
||||
|
||||
log('Removing', depDir)
|
||||
await fs.remove(depDir)
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// this will throw and exit early if the package.json does not exist
|
||||
const pkgJson: SystemTestPkgJson = require(projectPkgJsonPath)
|
||||
|
||||
log(`Found package.json for project ${project}.`)
|
||||
|
||||
if (pkgJson._cySkipDepInstall) {
|
||||
return log(`_cySkipDepInstall set in package.json, skipping dep-installer steps`)
|
||||
}
|
||||
|
||||
if (!pkgJson.dependencies && !pkgJson.devDependencies && !pkgJson.optionalDependencies) {
|
||||
return log(`No dependencies found, skipping dep-installer steps`)
|
||||
}
|
||||
|
||||
const lockFilename = await getLockFilename(projectDir)
|
||||
const hasYarnLock = lockFilename === 'yarn.lock'
|
||||
|
||||
// 1. Ensure there is a cache directory set up for this test project's `node_modules`.
|
||||
await ensureCacheDir(cacheNodeModulesDir)
|
||||
|
||||
let persistCacheCb: () => Promise<void>
|
||||
|
||||
if (hasYarnLock) {
|
||||
await symlinkNodeModulesFromCache(tmpNodeModulesDir, cacheNodeModulesDir)
|
||||
} else {
|
||||
// due to an issue in NPM, we cannot have `node_modules` be a symlink. fall back to copying.
|
||||
// https://github.com/npm/npm/issues/10013
|
||||
persistCacheCb = await copyNodeModulesFromCache(tmpNodeModulesDir, cacheNodeModulesDir)
|
||||
}
|
||||
|
||||
// 2. Before running the package installer, resolve workspace deps to absolute paths.
|
||||
// This is required to fix install for workspace-only packages.
|
||||
const workspaceDeps = await makeWorkspacePackagesAbsolute(projectPkgJsonPath)
|
||||
|
||||
// 3. Delete cached workspace packages since the pkg manager will create a fresh symlink during install.
|
||||
await removeWorkspacePackages(workspaceDeps)
|
||||
|
||||
// 4. Fix relative paths in temp dir's lockfile.
|
||||
const lockFilePath = path.join(projectDir, lockFilename)
|
||||
|
||||
log(`Writing ${lockFilename} with fixed relative paths to temp dir`)
|
||||
await restoreLockFileRelativePaths({ projectDir, lockFilePath, relativePathToMonorepoRoot })
|
||||
|
||||
// 5. Run `yarn/npm install`.
|
||||
const getCommandFn = hasYarnLock ? getYarnCommand : getNpmCommand
|
||||
const cmd = getCommandFn({
|
||||
updateLockFile,
|
||||
yarnV311: pkgJson._cyYarnV311,
|
||||
isCI: !!process.env.CI,
|
||||
runScripts: pkgJson._cyRunScripts,
|
||||
})
|
||||
|
||||
await runCmd(cmd)
|
||||
|
||||
// 6. Now that the lockfile is up to date, update workspace dependency paths in the lockfile with monorepo
|
||||
// relative paths so it can be the same for all developers
|
||||
log(`Copying ${lockFilename} and fixing relative paths for ${project}`)
|
||||
await normalizeLockFileRelativePaths({ project, projectDir, lockFilePath, lockFilename, relativePathToMonorepoRoot })
|
||||
|
||||
// 7. After install, we must now symlink *over* all workspace dependencies, or else
|
||||
// `require` calls from installed workspace deps to peer deps will fail.
|
||||
await removeWorkspacePackages(workspaceDeps)
|
||||
for (const dep of workspaceDeps) {
|
||||
const destDir = path.join(tmpNodeModulesDir, dep)
|
||||
const targetDir = pathToPackage(dep)
|
||||
|
||||
log(`Symlinking workspace dependency: ${dep} (${destDir} -> ${targetDir})`)
|
||||
|
||||
await fs.mkdir(path.dirname(destDir), { recursive: true })
|
||||
await fs.symlink(targetDir, destDir, 'junction')
|
||||
}
|
||||
|
||||
// 8. If necessary, ensure that the `node_modules` cache is updated by copying `node_modules` back.
|
||||
if (persistCacheCb) await persistCacheCb()
|
||||
} catch (err) {
|
||||
if (err.code === 'MODULE_NOT_FOUND') return
|
||||
|
||||
console.error(`⚠ An error occurred while installing the node_modules for ${project}.`)
|
||||
console.error(err)
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create symlinks to very commonly used (in example projects) `node_modules`.
|
||||
*
|
||||
* This is done because many `projects` use the same modules, like `lodash`, and it's not worth it
|
||||
* to increase CI install times just to have it explicitly specified by `package.json`. A symlink
|
||||
* is faster than a real `npm install`.
|
||||
*
|
||||
* Adding modules here *decreases the quality of test coverage* because it allows test projects
|
||||
* to make assumptions about what modules are available that don't hold true in the real world. So
|
||||
* *do not add a module here* unless you are really sure that it should be available in every
|
||||
* single test project.
|
||||
*/
|
||||
export async function scaffoldCommonNodeModules () {
|
||||
await Promise.all([
|
||||
'@cypress/code-coverage',
|
||||
'@cypress/webpack-dev-server',
|
||||
'@packages/socket',
|
||||
'@packages/ts',
|
||||
'@tooling/system-tests',
|
||||
'bluebird',
|
||||
'chai',
|
||||
'dayjs',
|
||||
'debug',
|
||||
'execa',
|
||||
'fs-extra',
|
||||
'https-proxy-agent',
|
||||
'jimp',
|
||||
'lazy-ass',
|
||||
'lodash',
|
||||
'proxyquire',
|
||||
'react',
|
||||
'semver',
|
||||
'systeminformation',
|
||||
'tslib',
|
||||
'typescript',
|
||||
].map(symlinkNodeModule))
|
||||
}
|
||||
|
||||
async function symlinkNodeModule (pkg) {
|
||||
const from = path.join(cyTmpDir, 'node_modules', pkg)
|
||||
const to = pathToPackage(pkg)
|
||||
|
||||
await fs.ensureDir(path.dirname(from))
|
||||
try {
|
||||
await fs.symlink(to, from, 'junction')
|
||||
} catch (err) {
|
||||
if (err.code === 'EEXIST') return
|
||||
|
||||
throw err
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,23 @@
|
||||
import path from 'path'
|
||||
import tempDir from 'temp-dir'
|
||||
import { homedir } from 'os'
|
||||
|
||||
export function getNpmCommand (opts: {
|
||||
yarnV311: boolean
|
||||
updateLockFile: boolean
|
||||
isCI: boolean
|
||||
runScripts: boolean
|
||||
}): string {
|
||||
// `npm ci` is undesirable here since it won't use our `node_modules` cache
|
||||
// https://github.com/npm/cli/issues/564
|
||||
let cmd = 'npm install --force'
|
||||
|
||||
if (opts.yarnV311) throw new Error('_cyYarnV311 is not supported with NPM.')
|
||||
|
||||
if (!opts.runScripts) cmd += ' --ignore-scripts'
|
||||
|
||||
if (opts.isCI) cmd += ` --cache=${homedir()}/.cy-npm-cache`
|
||||
else cmd += ` --cache=${path.join(tempDir, 'cy-system-tests-npm-cache', String(Date.now()))}`
|
||||
|
||||
return cmd
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
import path from 'path'
|
||||
import tempDir from 'temp-dir'
|
||||
import { homedir } from 'os'
|
||||
|
||||
export function getYarnCommand (opts: {
|
||||
yarnV311: boolean
|
||||
updateLockFile: boolean
|
||||
isCI: boolean
|
||||
runScripts: boolean
|
||||
}): string {
|
||||
let cmd = `yarn install`
|
||||
|
||||
if (opts.yarnV311) {
|
||||
// @see https://yarnpkg.com/cli/install
|
||||
if (!opts.runScripts) cmd += ' --mode=skip-build'
|
||||
|
||||
if (!opts.updateLockFile) cmd += ' --immutable'
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
cmd += ' --prefer-offline'
|
||||
|
||||
if (!opts.runScripts) cmd += ' --ignore-scripts'
|
||||
|
||||
if (!opts.updateLockFile) cmd += ' --frozen-lockfile'
|
||||
|
||||
// yarn v1 has a bug with integrity checking and local cache/dependencies
|
||||
// @see https://github.com/yarnpkg/yarn/issues/6407
|
||||
cmd += ' --update-checksums'
|
||||
|
||||
// in CircleCI, this offline cache can be used
|
||||
if (opts.isCI) cmd += ` --cache-folder=${homedir()}/.yarn`
|
||||
else cmd += ` --cache-folder=${path.join(tempDir, 'cy-system-tests-yarn-cache', String(Date.now()))}`
|
||||
|
||||
return cmd
|
||||
}
|
||||
@@ -1,14 +1,13 @@
|
||||
import fs from 'fs-extra'
|
||||
import _path from 'path'
|
||||
import chokidar from 'chokidar'
|
||||
import cachedir from 'cachedir'
|
||||
import execa from 'execa'
|
||||
import tempDir from 'temp-dir'
|
||||
|
||||
const root = _path.join(__dirname, '..')
|
||||
export const root = _path.join(__dirname, '..')
|
||||
|
||||
const serverRoot = _path.join(__dirname, '../../packages/server/')
|
||||
const projects = _path.join(root, 'projects')
|
||||
|
||||
export const projects = _path.join(root, 'projects')
|
||||
|
||||
export const cyTmpDir = _path.join(tempDir, 'cy-projects')
|
||||
|
||||
@@ -43,266 +42,6 @@ export function scaffoldProject (project: string): void {
|
||||
fs.copySync(from, to)
|
||||
}
|
||||
|
||||
/**
|
||||
* Symlink the cached `node_modules` directory to the temp project directory's `node_modules`.
|
||||
*/
|
||||
async function symlinkNodeModulesFromCache (project: string, cacheDir: string): Promise<void> {
|
||||
const from = _path.join(projectPath(project), 'node_modules')
|
||||
|
||||
try {
|
||||
await fs.stat(cacheDir)
|
||||
} catch (err) {
|
||||
console.log(`📦 Creating a new node_modules cache dir at ${cacheDir}`)
|
||||
await fs.mkdirp(cacheDir)
|
||||
}
|
||||
|
||||
try {
|
||||
await fs.symlink(cacheDir, from, 'junction')
|
||||
} catch (err) {
|
||||
if (err.code !== 'EEXIST') return
|
||||
}
|
||||
console.log(`📦 node_modules symlink created at ${from}`)
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a package name, returns the path to the module directory on disk.
|
||||
*/
|
||||
function pathToPackage (pkg: string): string {
|
||||
return _path.dirname(require.resolve(`${pkg}/package.json`))
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a path to a `package.json`, convert any references to development
|
||||
* versions of packages to absolute paths, so `yarn` will not reach out to
|
||||
* the Internet to obtain these packages once it runs in the temp dir.
|
||||
* @returns a list of dependency names that were updated
|
||||
*/
|
||||
async function makeWorkspacePackagesAbsolute (pathToPkgJson: string): Promise<string[]> {
|
||||
const pkgJson = await fs.readJson(pathToPkgJson)
|
||||
const updatedDeps: string[] = []
|
||||
|
||||
for (const deps of [pkgJson.dependencies, pkgJson.devDependencies, pkgJson.optionalDependencies]) {
|
||||
for (const dep in deps) {
|
||||
const version = deps[dep]
|
||||
|
||||
if (version.startsWith('file:')) {
|
||||
const absPath = pathToPackage(dep)
|
||||
|
||||
console.log(`📦 Setting absolute path in package.json for ${dep}: ${absPath}.`)
|
||||
|
||||
deps[dep] = `file:${absPath}`
|
||||
updatedDeps.push(dep)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
await fs.writeJson(pathToPkgJson, pkgJson)
|
||||
|
||||
return updatedDeps
|
||||
}
|
||||
|
||||
function getYarnCommand (opts: {
|
||||
yarnV311: boolean
|
||||
updateYarnLock: boolean
|
||||
isCI: boolean
|
||||
runScripts: boolean
|
||||
}): string {
|
||||
let cmd = `yarn install`
|
||||
|
||||
if (opts.yarnV311) {
|
||||
// @see https://yarnpkg.com/cli/install
|
||||
if (!opts.runScripts) cmd += ' --mode=skip-build'
|
||||
|
||||
if (!opts.updateYarnLock) cmd += ' --immutable'
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
cmd += ' --prefer-offline'
|
||||
|
||||
if (!opts.runScripts) cmd += ' --ignore-scripts'
|
||||
|
||||
if (!opts.updateYarnLock) cmd += ' --frozen-lockfile'
|
||||
|
||||
// yarn v1 has a bug with integrity checking and local cache/dependencies
|
||||
// @see https://github.com/yarnpkg/yarn/issues/6407
|
||||
cmd += ' --update-checksums'
|
||||
|
||||
// in CircleCI, this offline cache can be used
|
||||
if (opts.isCI) cmd += ` --cache-folder=~/.yarn-${process.platform} `
|
||||
else cmd += ` --cache-folder=${_path.join(tempDir, 'cy-system-tests-yarn-cache', String(Date.now()))}`
|
||||
|
||||
return cmd
|
||||
}
|
||||
|
||||
type Dependencies = Record<string, string>
|
||||
|
||||
/**
|
||||
* Type for package.json files for system-tests example projects.
|
||||
*/
|
||||
type SystemTestPkgJson = {
|
||||
/**
|
||||
* By default, scaffolding will run `yarn install` if there is a `package.json`.
|
||||
* This option, if set, disables that.
|
||||
*/
|
||||
_cySkipYarnInstall?: boolean
|
||||
/**
|
||||
* Run the yarn v2-style install command instead of yarn v1-style.
|
||||
*/
|
||||
_cyYarnV311?: boolean
|
||||
/**
|
||||
* By default, the automatic `yarn install` will not run postinstall scripts. This
|
||||
* option, if set, will cause postinstall scripts to run for this project.
|
||||
*/
|
||||
_cyRunScripts?: boolean
|
||||
dependencies?: Dependencies
|
||||
devDependencies?: Dependencies
|
||||
optionalDependencies?: Dependencies
|
||||
}
|
||||
|
||||
/**
|
||||
* Given a `system-tests` project name, detect and install the `node_modules`
|
||||
* specified in the project's `package.json`. No-op if no `package.json` is found.
|
||||
*/
|
||||
export async function scaffoldProjectNodeModules (project: string, updateYarnLock: boolean = !!process.env.UPDATE_YARN_LOCK): Promise<void> {
|
||||
const projectDir = projectPath(project)
|
||||
const relativePathToMonorepoRoot = _path.relative(
|
||||
_path.join(projects, project),
|
||||
_path.join(root, '..'),
|
||||
)
|
||||
const projectPkgJsonPath = _path.join(projectDir, 'package.json')
|
||||
|
||||
const runCmd = async (cmd) => {
|
||||
console.log(`📦 Running "${cmd}" in ${projectDir}`)
|
||||
await execa(cmd, { cwd: projectDir, stdio: 'inherit', shell: true })
|
||||
}
|
||||
|
||||
const cacheDir = _path.join(cachedir('cy-system-tests-node-modules'), project, 'node_modules')
|
||||
|
||||
async function removeWorkspacePackages (packages: string[]): Promise<void> {
|
||||
for (const dep of packages) {
|
||||
const depDir = _path.join(cacheDir, dep)
|
||||
|
||||
await fs.remove(depDir)
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
// this will throw and exit early if the package.json does not exist
|
||||
const pkgJson: SystemTestPkgJson = require(projectPkgJsonPath)
|
||||
|
||||
console.log(`📦 Found package.json for project ${project}.`)
|
||||
|
||||
if (pkgJson._cySkipYarnInstall) {
|
||||
return console.log(`📦 cySkipYarnInstall set in package.json, skipping yarn steps`)
|
||||
}
|
||||
|
||||
if (!pkgJson.dependencies && !pkgJson.devDependencies && !pkgJson.optionalDependencies) {
|
||||
return console.log(`📦 No dependencies found, skipping yarn steps`)
|
||||
}
|
||||
|
||||
// 1. Ensure there is a cache directory set up for this test project's `node_modules`.
|
||||
await symlinkNodeModulesFromCache(project, cacheDir)
|
||||
|
||||
// 2. Before running `yarn`, resolve workspace deps to absolute paths.
|
||||
// This is required to fix `yarn install` for workspace-only packages.
|
||||
const workspaceDeps = await makeWorkspacePackagesAbsolute(projectPkgJsonPath)
|
||||
|
||||
await removeWorkspacePackages(workspaceDeps)
|
||||
|
||||
// 3. Fix relative paths in temp dir's `yarn.lock`.
|
||||
const relativePathToProjectDir = _path.relative(projectDir, _path.join(root, '..'))
|
||||
const yarnLockPath = _path.join(projectDir, 'yarn.lock')
|
||||
|
||||
console.log('📦 Writing yarn.lock with fixed relative paths to temp dir')
|
||||
try {
|
||||
const yarnLock = (await fs.readFile(yarnLockPath, 'utf8'))
|
||||
.replaceAll(relativePathToMonorepoRoot, relativePathToProjectDir)
|
||||
|
||||
await fs.writeFile(yarnLockPath, yarnLock)
|
||||
} catch (err) {
|
||||
if (err.code !== 'ENOENT' || !updateYarnLock) throw err
|
||||
|
||||
console.log('📦 No yarn.lock found, continuing')
|
||||
}
|
||||
|
||||
// 4. Run `yarn install`.
|
||||
const cmd = getYarnCommand({
|
||||
updateYarnLock,
|
||||
yarnV311: pkgJson._cyYarnV311,
|
||||
isCI: !!process.env.CI,
|
||||
runScripts: pkgJson._cyRunScripts,
|
||||
})
|
||||
|
||||
await runCmd(cmd)
|
||||
|
||||
console.log(`📦 Copying yarn.lock and fixing relative paths for ${project}`)
|
||||
|
||||
// Replace workspace dependency paths in `yarn.lock` with tokens so it can be the same
|
||||
// for all developers
|
||||
const yarnLock = (await fs.readFile(yarnLockPath, 'utf8'))
|
||||
.replaceAll(relativePathToProjectDir, relativePathToMonorepoRoot)
|
||||
|
||||
await fs.writeFile(_path.join(projects, project, 'yarn.lock'), yarnLock)
|
||||
|
||||
// 5. After `yarn install`, we must now symlink *over* all workspace dependencies, or else
|
||||
// `require` calls from `yarn install`'d workspace deps to peer deps will fail.
|
||||
await removeWorkspacePackages(workspaceDeps)
|
||||
for (const dep of workspaceDeps) {
|
||||
console.log(`📦 Symlinking workspace dependency: ${dep}`)
|
||||
const depDir = _path.join(cacheDir, dep)
|
||||
|
||||
await fs.symlink(pathToPackage(dep), depDir, 'junction')
|
||||
}
|
||||
} catch (err) {
|
||||
if (err.code === 'MODULE_NOT_FOUND') return
|
||||
|
||||
console.error(`⚠ An error occurred while installing the node_modules for ${project}.`)
|
||||
console.error([err.message, err.stack].join('\n'))
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
export async function scaffoldCommonNodeModules () {
|
||||
await Promise.all([
|
||||
'@cypress/code-coverage',
|
||||
'@cypress/webpack-dev-server',
|
||||
'@packages/socket',
|
||||
'@packages/ts',
|
||||
'@tooling/system-tests',
|
||||
'bluebird',
|
||||
'chai',
|
||||
'dayjs',
|
||||
'debug',
|
||||
'execa',
|
||||
'fs-extra',
|
||||
'https-proxy-agent',
|
||||
'jimp',
|
||||
'lazy-ass',
|
||||
'lodash',
|
||||
'proxyquire',
|
||||
'react',
|
||||
'semver',
|
||||
'systeminformation',
|
||||
'tslib',
|
||||
'typescript',
|
||||
].map(symlinkNodeModule))
|
||||
}
|
||||
|
||||
export async function symlinkNodeModule (pkg) {
|
||||
const from = _path.join(cyTmpDir, 'node_modules', pkg)
|
||||
const to = pathToPackage(pkg)
|
||||
|
||||
await fs.ensureDir(_path.dirname(from))
|
||||
try {
|
||||
await fs.symlink(to, from, 'junction')
|
||||
} catch (err) {
|
||||
if (err.code === 'EEXIST') return
|
||||
|
||||
throw err
|
||||
}
|
||||
}
|
||||
|
||||
export function scaffoldWatch () {
|
||||
const watchdir = _path.resolve(__dirname, '../projects')
|
||||
|
||||
|
||||
@@ -5,6 +5,8 @@ import stream from 'stream'
|
||||
import { expect } from './spec_helper'
|
||||
import { dockerSpawner } from './docker'
|
||||
import Express from 'express'
|
||||
import Fixtures from './fixtures'
|
||||
import * as DepInstaller from './dep-installer'
|
||||
|
||||
require('mocha-banner').register()
|
||||
const chalk = require('chalk').default
|
||||
@@ -17,7 +19,6 @@ const morgan = require('morgan')
|
||||
const Bluebird = require('bluebird')
|
||||
const debug = require('debug')('cypress:system-tests')
|
||||
const httpsProxy = require('@packages/https-proxy')
|
||||
const Fixtures = require('./fixtures')
|
||||
|
||||
const { allowDestroy } = require(`@packages/server/lib/util/server_destroy`)
|
||||
const screenshots = require(`@packages/server/lib/screenshots`)
|
||||
@@ -701,10 +702,6 @@ const systemTests = {
|
||||
|
||||
setup (options: SetupOptions = {}) {
|
||||
beforeEach(async function () {
|
||||
// // after installing node modules copying all of the fixtures
|
||||
// // can take a long time (5-15 secs)
|
||||
// this.timeout(human('2 minutes'))
|
||||
|
||||
Fixtures.remove()
|
||||
|
||||
sinon.stub(process, 'exit')
|
||||
@@ -932,9 +929,9 @@ const systemTests = {
|
||||
|
||||
if (!options.skipScaffold) {
|
||||
// symlinks won't work via docker
|
||||
options.dockerImage || await Fixtures.scaffoldCommonNodeModules()
|
||||
options.dockerImage || await DepInstaller.scaffoldCommonNodeModules()
|
||||
Fixtures.scaffoldProject(options.project)
|
||||
await Fixtures.scaffoldProjectNodeModules(options.project)
|
||||
await DepInstaller.scaffoldProjectNodeModules(options.project)
|
||||
}
|
||||
|
||||
if (process.env.NO_EXIT) {
|
||||
|
||||
+2236
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@
|
||||
"@babel/preset-env": "7.9.0",
|
||||
"@cypress/webpack-preprocessor": "file:../../../npm/webpack-preprocessor",
|
||||
"babel-loader": "8.1.0",
|
||||
"cypress": "file:../../../cli",
|
||||
"cypress": "file:../../../cli/build",
|
||||
"ts-loader": "7.0.4",
|
||||
"typescript": "4.2.3"
|
||||
}
|
||||
|
||||
@@ -728,10 +728,10 @@
|
||||
"@babel/helper-validator-identifier" "^7.15.7"
|
||||
to-fast-properties "^2.0.0"
|
||||
|
||||
"@cypress/request@^2.88.7":
|
||||
version "2.88.7"
|
||||
resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.7.tgz#386d960ab845a96953723348088525d5a75aaac4"
|
||||
integrity "sha1-OG2WCrhFqWlTcjNICIUl1adaqsQ= sha512-FTULIP2rnDJvZDT9t6B4nSfYR40ue19tVmv3wUcY05R9/FPCoMl1nAPJkzWzBCo7ltVn5ThQTbxiMoGBN7k0ig=="
|
||||
"@cypress/request@^2.88.10":
|
||||
version "2.88.10"
|
||||
resolved "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz#b66d76b07f860d3a4b8d7a0604d020c662752cce"
|
||||
integrity "sha1-tm12sH+GDTpLjXoGBNAgxmJ1LM4= sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg=="
|
||||
dependencies:
|
||||
aws-sign2 "~0.7.0"
|
||||
aws4 "^1.8.0"
|
||||
@@ -740,8 +740,7 @@
|
||||
extend "~3.0.2"
|
||||
forever-agent "~0.6.1"
|
||||
form-data "~2.3.2"
|
||||
har-validator "~5.1.3"
|
||||
http-signature "~1.2.0"
|
||||
http-signature "~1.3.6"
|
||||
is-typedarray "~1.0.0"
|
||||
isstream "~0.1.2"
|
||||
json-stringify-safe "~5.0.1"
|
||||
@@ -756,8 +755,8 @@
|
||||
"@cypress/webpack-preprocessor@file:../../../npm/webpack-preprocessor":
|
||||
version "0.0.0-development"
|
||||
dependencies:
|
||||
bluebird "^3.7.1"
|
||||
debug "4.3.2"
|
||||
bluebird "3.7.1"
|
||||
debug "^4.3.2"
|
||||
lodash "^4.17.20"
|
||||
|
||||
"@cypress/xvfb@^1.2.4":
|
||||
@@ -783,10 +782,10 @@
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-14.17.33.tgz#011ee28e38dc7aee1be032ceadf6332a0ab15b12"
|
||||
integrity "sha1-AR7ijjjceu4b4DLOrfYzKgqxWxI= sha512-noEeJ06zbn3lOh4gqe2v7NMGS33jrulfNqYFDjjEbhpDEHR5VTxgYNQSBqBlJIsBJW3uEYDgD6kvMnrrhGzq8g=="
|
||||
|
||||
"@types/sinonjs__fake-timers@^6.0.2":
|
||||
version "6.0.4"
|
||||
resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.4.tgz#0ecc1b9259b76598ef01942f547904ce61a6a77d"
|
||||
integrity "sha1-Dswbklm3ZZjvAZQvVHkEzmGmp30= sha512-IFQTJARgMUBF+xVd2b+hIgXWrZEjND3vJtRCvIelcFB5SIXfjV4bOHbHJ0eXKh+0COrBRc8MqteKAz/j88rE0A=="
|
||||
"@types/sinonjs__fake-timers@8.1.1":
|
||||
version "8.1.1"
|
||||
resolved "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz#b49c2c70150141a15e0fa7e79cf1f92a72934ce3"
|
||||
integrity "sha1-tJwscBUBQaFeD6fnnPH5KnKTTOM= sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g=="
|
||||
|
||||
"@types/sizzle@^2.3.2":
|
||||
version "2.3.3"
|
||||
@@ -813,7 +812,7 @@ ajv-keywords@^3.5.2:
|
||||
resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
|
||||
integrity "sha1-MfKdpatuANHC0yms97WSlhTVAU0= sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ=="
|
||||
|
||||
ajv@^6.12.3, ajv@^6.12.4:
|
||||
ajv@^6.12.4:
|
||||
version "6.12.6"
|
||||
resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
|
||||
integrity "sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
|
||||
@@ -924,6 +923,11 @@ balanced-match@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
|
||||
integrity "sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
|
||||
|
||||
base64-js@^1.3.1:
|
||||
version "1.5.1"
|
||||
resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
|
||||
integrity "sha1-GxtEAWClv3rUC2UPCVljSBkDkwo= sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
|
||||
|
||||
bcrypt-pbkdf@^1.0.0:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
|
||||
@@ -941,7 +945,12 @@ blob-util@^2.0.2:
|
||||
resolved "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz#3b4e3c281111bb7f11128518006cdc60b403a1eb"
|
||||
integrity "sha1-O048KBERu38REoUYAGzcYLQDoes= sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ=="
|
||||
|
||||
bluebird@^3.7.1, bluebird@^3.7.2:
|
||||
bluebird@3.7.1:
|
||||
version "3.7.1"
|
||||
resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.1.tgz#df70e302b471d7473489acf26a93d63b53f874de"
|
||||
integrity "sha1-33DjArRx10c0iazyapPWO1P4dN4= sha512-DdmyoGCleJnkbp3nkbxTLJ18rjDsE4yCggEwKNXkeV123sPNfOCYeDoeuOY+F2FrSjO1YXcTU+dsy96KMy+gcg=="
|
||||
|
||||
bluebird@^3.7.2:
|
||||
version "3.7.2"
|
||||
resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
|
||||
integrity "sha1-nyKcFb4nJFT/qXOs4NvueaGww28= sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="
|
||||
@@ -977,6 +986,14 @@ buffer-crc32@~0.2.3:
|
||||
resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
|
||||
integrity "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="
|
||||
|
||||
buffer@^5.6.0:
|
||||
version "5.7.1"
|
||||
resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
|
||||
integrity "sha1-umLnwTEzBTWCGXFghRqPZI6Z7tA= sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="
|
||||
dependencies:
|
||||
base64-js "^1.3.1"
|
||||
ieee754 "^1.1.13"
|
||||
|
||||
cachedir@^2.3.0:
|
||||
version "2.3.0"
|
||||
resolved "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz#0c75892a052198f0b21c7c1804d8331edfcae0e8"
|
||||
@@ -1039,10 +1056,14 @@ cli-cursor@^3.1.0:
|
||||
dependencies:
|
||||
restore-cursor "^3.1.0"
|
||||
|
||||
cli-table3@~0.6.0:
|
||||
version "0.6.0"
|
||||
resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz#b7b1bc65ca8e7b5cef9124e13dc2b21e2ce4faee"
|
||||
integrity "sha1-2jmj7l5rSw0yVb/vlWAYkK/YBwk= sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg=="
|
||||
cli-table3@~0.6.1:
|
||||
version "0.6.1"
|
||||
resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8"
|
||||
integrity "sha1-Ns6bevSEfyiNPN0IH70Jv3vSN7g= sha512-w0q/enDHhPLq44ovMGdQeeDLvwxwavsJX7oQGYt/LrBlYsyaxyDnp6z3QzFut/6kLLKnlcUVJLrpB7KBfgG/RA=="
|
||||
dependencies:
|
||||
string-width "^4.2.0"
|
||||
optionalDependencies:
|
||||
colors "1.4.0"
|
||||
|
||||
cli-truncate@^2.1.0:
|
||||
version "2.1.0"
|
||||
@@ -1086,6 +1107,11 @@ colorette@^2.0.16:
|
||||
resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz#713b9af84fdb000139f04546bd4a93f62a5085da"
|
||||
integrity "sha1-cTua+E/bAAE58EVGvUqT9ipQhdo= sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g=="
|
||||
|
||||
colors@1.4.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78"
|
||||
integrity "sha1-xQSRR51MG9rtLJztMs98fcI2D3g= sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
|
||||
|
||||
combined-stream@^1.0.6, combined-stream@~1.0.6:
|
||||
version "1.0.8"
|
||||
resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
|
||||
@@ -1096,7 +1122,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
|
||||
commander@^5.1.0:
|
||||
version "5.1.0"
|
||||
resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz#46abbd1652f8e059bddaef99bbdcb2ad9cf179ae"
|
||||
integrity "sha1-2jmj7l5rSw0yVb/vlWAYkK/YBwk= sha512-z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg=="
|
||||
integrity "sha1-Rqu9FlL44Fm92u+Zu9yyrZzxea4= sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg=="
|
||||
|
||||
common-tags@^1.8.0:
|
||||
version "1.8.1"
|
||||
@@ -1145,19 +1171,20 @@ cross-spawn@^7.0.0:
|
||||
"cypress@file:../../../cli":
|
||||
version "0.0.0-development"
|
||||
dependencies:
|
||||
"@cypress/request" "^2.88.7"
|
||||
"@cypress/request" "^2.88.10"
|
||||
"@cypress/xvfb" "^1.2.4"
|
||||
"@types/node" "^14.14.31"
|
||||
"@types/sinonjs__fake-timers" "^6.0.2"
|
||||
"@types/sinonjs__fake-timers" "8.1.1"
|
||||
"@types/sizzle" "^2.3.2"
|
||||
arch "^2.2.0"
|
||||
blob-util "^2.0.2"
|
||||
bluebird "^3.7.2"
|
||||
buffer "^5.6.0"
|
||||
cachedir "^2.3.0"
|
||||
chalk "^4.1.0"
|
||||
check-more-types "^2.24.0"
|
||||
cli-cursor "^3.1.0"
|
||||
cli-table3 "~0.6.0"
|
||||
cli-table3 "~0.6.1"
|
||||
commander "^5.1.0"
|
||||
common-tags "^1.8.0"
|
||||
dayjs "^1.10.4"
|
||||
@@ -1181,10 +1208,10 @@ cross-spawn@^7.0.0:
|
||||
pretty-bytes "^5.6.0"
|
||||
proxy-from-env "1.0.0"
|
||||
request-progress "^3.0.0"
|
||||
semver "^7.3.2"
|
||||
supports-color "^8.1.1"
|
||||
tmp "~0.2.1"
|
||||
untildify "^4.0.0"
|
||||
url "^0.11.0"
|
||||
yauzl "^2.10.0"
|
||||
|
||||
dashdash@^1.12.0:
|
||||
@@ -1199,13 +1226,6 @@ dayjs@^1.10.4:
|
||||
resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468"
|
||||
integrity "sha1-LPX5Gt0oEWdIRAhmoKHSbzps5Gg= sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig=="
|
||||
|
||||
debug@4.3.2, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
|
||||
integrity "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos= sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw=="
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
debug@^3.1.0:
|
||||
version "3.2.7"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
|
||||
@@ -1213,6 +1233,13 @@ debug@^3.1.0:
|
||||
dependencies:
|
||||
ms "^2.1.1"
|
||||
|
||||
debug@^4.1.0, debug@^4.1.1, debug@^4.3.2:
|
||||
version "4.3.2"
|
||||
resolved "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b"
|
||||
integrity "sha1-8KScGKyHeeMdSgxgKd+3aHPHQos= sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw=="
|
||||
dependencies:
|
||||
ms "2.1.2"
|
||||
|
||||
define-properties@^1.1.3:
|
||||
version "1.1.3"
|
||||
resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
|
||||
@@ -1491,19 +1518,6 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
|
||||
integrity "sha1-5BK40z9eAGWTy9PO5t+fLOu+gCo= sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
|
||||
|
||||
har-schema@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
|
||||
integrity "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
|
||||
|
||||
har-validator@~5.1.3:
|
||||
version "5.1.5"
|
||||
resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
|
||||
integrity "sha1-HwgDufjLIMD6E4It8ezds2veHv0= sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w=="
|
||||
dependencies:
|
||||
ajv "^6.12.3"
|
||||
har-schema "^2.0.0"
|
||||
|
||||
has-flag@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
|
||||
@@ -1526,20 +1540,25 @@ has@^1.0.3:
|
||||
dependencies:
|
||||
function-bind "^1.1.1"
|
||||
|
||||
http-signature@~1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
|
||||
integrity "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="
|
||||
http-signature@~1.3.6:
|
||||
version "1.3.6"
|
||||
resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz#cb6fbfdf86d1c974f343be94e87f7fc128662cf9"
|
||||
integrity "sha1-y2+/34bRyXTzQ76U6H9/wShmLPk= sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw=="
|
||||
dependencies:
|
||||
assert-plus "^1.0.0"
|
||||
jsprim "^1.2.2"
|
||||
sshpk "^1.7.0"
|
||||
jsprim "^2.0.2"
|
||||
sshpk "^1.14.1"
|
||||
|
||||
human-signals@^1.1.1:
|
||||
version "1.1.1"
|
||||
resolved "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
|
||||
integrity "sha1-xbHNFPUK6uCatsWf5jujOV/k36M= sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw=="
|
||||
|
||||
ieee754@^1.1.13:
|
||||
version "1.2.1"
|
||||
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
|
||||
integrity "sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I= sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
|
||||
|
||||
indent-string@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251"
|
||||
@@ -1662,10 +1681,10 @@ json-schema-traverse@^0.4.1:
|
||||
resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
|
||||
integrity "sha1-afaofZUTq4u4/mO9sJecRI5oRmA= sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
|
||||
|
||||
json-schema@0.2.3:
|
||||
version "0.2.3"
|
||||
resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
|
||||
integrity "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= sha512-a3xHnILGMtk+hDOqNwHzF6e2fNbiMrXZvxKQiEv2MlgQP+pjIOzqAmKYD2mDpXYE/44M7g+n9p2bKkYWDUcXCQ=="
|
||||
json-schema@0.4.0:
|
||||
version "0.4.0"
|
||||
resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
|
||||
integrity "sha1-995M9u+rg4666zI2R0y7paGTCrU= sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
|
||||
|
||||
json-stringify-safe@~5.0.1:
|
||||
version "5.0.1"
|
||||
@@ -1695,14 +1714,14 @@ jsonfile@^6.0.1:
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
jsprim@^1.2.2:
|
||||
version "1.4.1"
|
||||
resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
|
||||
integrity "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= sha512-4Dj8Rf+fQ+/Pn7C5qeEX02op1WfOss3PKTE9Nsop3Dx+6UPxlm1dr/og7o2cRa5hNN07CACr4NFzRLtj/rjWog=="
|
||||
jsprim@^2.0.2:
|
||||
version "2.0.2"
|
||||
resolved "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz#77ca23dbcd4135cd364800d22ff82c2185803d4d"
|
||||
integrity "sha1-d8oj281BNc02SADSL/gsIYWAPU0= sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ=="
|
||||
dependencies:
|
||||
assert-plus "1.0.0"
|
||||
extsprintf "1.3.0"
|
||||
json-schema "0.2.3"
|
||||
json-schema "0.4.0"
|
||||
verror "1.10.0"
|
||||
|
||||
lazy-ass@^1.6.0:
|
||||
@@ -1788,6 +1807,13 @@ loose-envify@^1.0.0:
|
||||
dependencies:
|
||||
js-tokens "^3.0.0 || ^4.0.0"
|
||||
|
||||
lru-cache@^6.0.0:
|
||||
version "6.0.0"
|
||||
resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
|
||||
integrity "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ= sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA=="
|
||||
dependencies:
|
||||
yallist "^4.0.0"
|
||||
|
||||
make-dir@^2.0.0:
|
||||
version "2.1.0"
|
||||
resolved "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
|
||||
@@ -2025,11 +2051,6 @@ pump@^3.0.0:
|
||||
end-of-stream "^1.1.0"
|
||||
once "^1.3.1"
|
||||
|
||||
punycode@1.3.2:
|
||||
version "1.3.2"
|
||||
resolved "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
|
||||
integrity "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
|
||||
|
||||
punycode@^2.1.0, punycode@^2.1.1:
|
||||
version "2.1.1"
|
||||
resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
|
||||
@@ -2040,11 +2061,6 @@ qs@~6.5.2:
|
||||
resolved "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
|
||||
integrity "sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
|
||||
|
||||
querystring@0.2.0:
|
||||
version "0.2.0"
|
||||
resolved "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||
integrity "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="
|
||||
|
||||
readable-stream@^2.0.1:
|
||||
version "2.3.7"
|
||||
resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
|
||||
@@ -2182,6 +2198,13 @@ semver@^6.0.0, semver@^6.3.0:
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
|
||||
integrity "sha1-7gpkyK9ejO6mdoexM3YeG+y9HT0= sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
|
||||
|
||||
semver@^7.3.2:
|
||||
version "7.3.5"
|
||||
resolved "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
|
||||
integrity "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc= sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ=="
|
||||
dependencies:
|
||||
lru-cache "^6.0.0"
|
||||
|
||||
shebang-command@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
|
||||
@@ -2222,10 +2245,10 @@ source-map@^0.5.0:
|
||||
resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
|
||||
integrity "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="
|
||||
|
||||
sshpk@^1.7.0:
|
||||
version "1.16.1"
|
||||
resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
|
||||
integrity "sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg=="
|
||||
sshpk@^1.14.1:
|
||||
version "1.17.0"
|
||||
resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz#578082d92d4fe612b13007496e543fa0fbcbe4c5"
|
||||
integrity "sha1-V4CC2S1P5hKxMAdJblQ/oPvL5MU= sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ=="
|
||||
dependencies:
|
||||
asn1 "~0.2.3"
|
||||
assert-plus "^1.0.0"
|
||||
@@ -2406,14 +2429,6 @@ uri-js@^4.2.2:
|
||||
dependencies:
|
||||
punycode "^2.1.0"
|
||||
|
||||
url@^0.11.0:
|
||||
version "0.11.0"
|
||||
resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
|
||||
integrity "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ=="
|
||||
dependencies:
|
||||
punycode "1.3.2"
|
||||
querystring "0.2.0"
|
||||
|
||||
util-deprecate@~1.0.1:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
|
||||
@@ -2463,6 +2478,11 @@ wrappy@1:
|
||||
resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
|
||||
integrity "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
|
||||
|
||||
yallist@^4.0.0:
|
||||
version "4.0.0"
|
||||
resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
|
||||
integrity "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI= sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
|
||||
|
||||
yauzl@^2.10.0:
|
||||
version "2.10.0"
|
||||
resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
|
||||
|
||||
@@ -3,6 +3,7 @@ const path = require('path')
|
||||
const { promisify } = require('util')
|
||||
const glob = promisify(require('glob'))
|
||||
const Fixtures = require('../lib/fixtures')
|
||||
const { scaffoldProjectNodeModules } = require('../lib/dep-installer')
|
||||
|
||||
const logTag = '[update-cache.js]'
|
||||
const log = (...args) => console.log(logTag, ...args)
|
||||
@@ -29,7 +30,7 @@ const log = (...args) => console.log(logTag, ...args)
|
||||
log('Scaffolding node_modules for', project)
|
||||
|
||||
Fixtures.scaffoldProject(project)
|
||||
await Fixtures.scaffoldProjectNodeModules(project)
|
||||
await scaffoldProjectNodeModules(project)
|
||||
console.timeEnd(timeTag)
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@ import * as fs from 'fs'
|
||||
import * as path from 'path'
|
||||
import systemTests from '../lib/system-tests'
|
||||
import Fixtures from '../lib/fixtures'
|
||||
import { scaffoldCommonNodeModules } from '@tooling/system-tests/lib/dep-installer'
|
||||
|
||||
describe('e2e readonly fs', function () {
|
||||
systemTests.setup()
|
||||
@@ -24,7 +25,7 @@ describe('e2e readonly fs', function () {
|
||||
|
||||
const onRun = async (exec) => {
|
||||
Fixtures.scaffoldProject('read-only-project-root')
|
||||
await Fixtures.scaffoldCommonNodeModules()
|
||||
await scaffoldCommonNodeModules()
|
||||
chmodr(projectPath, 0o500)
|
||||
|
||||
await exec()
|
||||
|
||||
Reference in New Issue
Block a user