mirror of
https://github.com/cypress-io/cypress.git
synced 2026-02-04 14:19:55 -06:00
* add webpack * fix build proccess * fix reporter build and test * fix reporter test .css * use apply(window, ...) since strict mode in webpack * temp 05/13/19 [skip ci] resolver * temp 05/14/19 [skip ci] webpack w/ root level symlinks * run ci * minor fixes * fix link-packages script * hopefully fix mac build * re-add build-prod script in reporter * fix typo in link-packages script * fix lint errors * fix node-version * namespace files in webpack * bust circle ci cache * bust circle ci cache 2 * remove deps * bust circle ci cache 3 * bust circle ci cache (launcher) * ok circleci, you win. I will change all the cache keys * update snapshot: not sure why added stack lines * add mocha to reporter devDeps * separate build file for reporter * remove unneeded code * node-sass-globbing use relative imports for appveyor * add debugging for appveyor failure * node-sass-globbing force unix paths for windows * node-sass-globbing force unix paths for windows 2 * node-sass-globbing force unix paths for windows in runner * run ci * add checksum to packages caches * bust circle ci cache (sub packages) * testing code for appveyor env vars * fix appveyor env vars for branchname 06-00000026 * fix binary build script, smoke test catch errors, include pkg mains 03-0000000a * build binary in appveyor for this branch 07-00000047 * fix binary unit test, revert mocha upgrade in root, fix e2e specs 02-00000004 * statically replace symlinks at build time, add test, remove proxy packages code 03-00000002 * oops, update snapshot 04-00000049 * bump circle packages cache 02-00000005 * fix path.win32 on windows, add test for it 00-00000058 * for some reason packages ci cache is not including `rebuild-node-sass` in node_modules/.bin, and npm does not recreate .bin links if a node_modules folder already exists. so Im bumping all the npm caches, again 00-00000003 * emit during webpack-dev-server watch mode 02-00000020 * try revert circle.yml 02-0000002f * try revert everything 03-0000003b * Revert "try revert everything" This reverts commitbe125b88ff. * no circle cache now 02-00000013 * remove logging in reporter build 06-00002a41 * Merge branch develop of github.com:cypress-io/cypress into webpack-runner 02-0000089b * make build scripts DRY 04-00000a7f * fix missing fonts, better watch mode 06-00003053 * use webpack --progress in watch mode 00-00000582 * move webpack config files into dedicated package 05-000023bf * build desktop-gui with webpack, use relative scss url()s 03-00001801 * add timings info, fix configs 07-00005582 * enable sourcemaps "eval", fix desktopgui test 04-00005a08 * try 2: fix desktopgui test 01-0000058e * fix lint 03-00000b10 * fix snapshot (very minor do not worry) 04-000014a4 * code cleanup 00-00007a4f * try disable devtool 07-0000a97a * remove cypress:// devtool sourceURL mapping to prevent cross-domain on electron 00-000056e4 * re-enable eval sourcemap in dev and prod 06-000051e6 * code cleanup 02-000056ae * refactor node-jsdom setup for tests 00-000041a2 * re-enable sourceURL protocol, enable crossorigin script on runner to appease electron * smoke tests for static assets in binary build script, disable sourceURL protocol mapping, more consistent dev/prod webpack builds * use cross-env for desktop-gui * desktop-dui: expect development NODE_ENV during build script (as has been in past) * fix build script unit test * fix build script unit test for real * fix sourcemaps for dev/prod, add comments, add build static asset tests * add cross-env to runner devDeps * fix unit tests for build binary script * fix whitespace * add postcss autoprefixer + staticAsset tets * add eslintrc to scripts/unit * tabs -> spaces * tabs -> spaces * fix binary/util scripts * fix testStaticAssets in build script * fix extension requiring node socket * fix unit-test for binary build script * fix unit test for runner/reporter * disable sourcemaps/eval in production * fix disable sourcemaps in prod code * resort jsons w/ new lint * linting fixes * runner/package.json add back rebuild-node-sass * no circle cache again * fix circle.yml * try appveyor again * fix binary build: remove "timers" from server/package.json.files * fix testStaticAssets false-positive sourcemap detection (due to diff package) * fix 2 failing e2e tests (run in chrome for now) use build-prod scripts in binary-build script add build-prod scripts to all packages * a string is no regex * correct merge: global_mode_spec * fix all snapshot screenshot dimensions * fix all snapshot screenshot dimensions (again) * fix testStaticAssets development -> production * Revert "fix all snapshot screenshot dimensions (again)" This reverts commitd9022ef950. * Revert "fix all snapshot screenshot dimensions" This reverts commit4f7628a051. * helpers/e2e: only normalize screenshot dimensions NOT on electron * post-task: windows build don't build on this branch * post-task: un-bump circleci cache * post-task: bump circleci cache packages/node_modules to v9 * cleanup: fix eol-newline, remove unneeded eslintrc * bump circleci cache * run rebuild-node-sass inside webpack build config * bump circleci cache * use cache version from env variable on circle * use custom command to save cache for most packages * add custom restore cache command * restore 2 packages separately * allow passing package path to restore * pass explicit path to package to restore * add restore-caches and save-caches * print name for restoring cache commands * print name when storing cache * print .bin when saving cache * fix path to .bin * print launcher .bin * show .bin for desktop-gui * print bins * update npm version * update npm version - try 2 * update npm version - try 3 * remove circleci debugging print commands * Revert "remove circleci debugging print commands" This reverts commit248966efcd. * add TERM=xterm to Circle * Revert "Revert "remove circleci debugging print commands"" This reverts commitcf77273b10. * Revert "add TERM=xterm to Circle" This reverts commitdc77c94c57. * remove --serial arg from run all scripts * add web-config package to cache * simplify circleci build job * circleci: try rmrf node_modules/@packages before install * appveyor: try removing --serial from install script * Revert "appveyor: try removing --serial from install script" This reverts commit7ef619ff30. * use appveyor from develop * use preinstall removing subpackage symlinks fix webpack config typescript errors fix path to rebuild-node-sass in packages/web-config assert replace minimum number of symlink requires * test binary build [build binary] * fix transformRequires code [build binary]
246 lines
5.5 KiB
JavaScript
246 lines
5.5 KiB
JavaScript
/* eslint-disable no-console */
|
|
|
|
const log = require('debug')('cypress:run')
|
|
const _ = require('lodash')
|
|
const path = require('path')
|
|
const AsciiTable = require('ascii-table')
|
|
const glob = require('glob')
|
|
const chalk = require('chalk')
|
|
const Promise = require('bluebird')
|
|
const runAll = require('@cypress/npm-run-all')
|
|
const through = require('through')
|
|
const fs = require('fs')
|
|
const prefixedList = require('prefixed-list')
|
|
|
|
const globAsync = Promise.promisify(glob)
|
|
|
|
const packageNameFromPath = (fullPath) => {
|
|
return fullPath
|
|
.replace(`${process.cwd()}${path.sep}`, '')
|
|
.replace(`packages${path.sep}`, '')
|
|
}
|
|
|
|
const nonPackageDirs = ['cli/']
|
|
|
|
const getDirs = () => {
|
|
const logDirs = (dirs) => {
|
|
log('found packages\n%s', dirs.join('\n'))
|
|
|
|
return dirs
|
|
}
|
|
|
|
return globAsync('packages/*/')
|
|
.then(logDirs)
|
|
.then((dirs) => {
|
|
return dirs.concat(nonPackageDirs)
|
|
})
|
|
.map((dir) => {
|
|
return path.join(process.cwd(), dir).replace(/(\/|\\)$/, '')
|
|
})
|
|
}
|
|
|
|
const packageNameInArray = (dir, packages) => {
|
|
const packageName = packageNameFromPath(dir)
|
|
|
|
return _.includes(packages, packageName)
|
|
}
|
|
|
|
const filterDirsByPackage = (dirs, filter) => {
|
|
if (!filter) return dirs
|
|
|
|
return dirs.filter((dir) => {
|
|
return packageNameInArray(dir, filter)
|
|
})
|
|
}
|
|
|
|
const rejectDirsByPackage = (dirs, rejected) => {
|
|
if (!rejected) return dirs
|
|
|
|
if (rejected && rejected.length) {
|
|
return _.reject(dirs, (dir) => {
|
|
return packageNameInArray(dir, rejected)
|
|
})
|
|
}
|
|
}
|
|
|
|
const filterDirsByCmd = (dirs, cmd) => {
|
|
switch (cmd) {
|
|
case 'install': case 'i': case 'prune':
|
|
return dirs
|
|
default:
|
|
return dirs.filter((dir) => {
|
|
const packageJson = require(path.resolve(dir, 'package'))
|
|
|
|
return !!packageJson.scripts && !!packageJson.scripts[cmd]
|
|
})
|
|
}
|
|
}
|
|
|
|
const checkDirsLength = (dirs, errMessage) => {
|
|
if (dirs.length) {
|
|
return dirs
|
|
}
|
|
|
|
const err = new Error(errMessage)
|
|
|
|
err.noPackages = true
|
|
throw err
|
|
}
|
|
|
|
const mapTasks = (cmd, packages) => {
|
|
const colors = 'green yellow blue magenta cyan white gray bgGreen bgBlue bgMagenta bgCyan bgYellow bgWhite'.split(' ')
|
|
|
|
let runCommand
|
|
|
|
const command = cmd.split(' ', 2)[0]
|
|
|
|
switch (command) {
|
|
case 'install':
|
|
case 'i':
|
|
case 'test':
|
|
case 't':
|
|
case 'prune':
|
|
runCommand = cmd
|
|
break
|
|
default:
|
|
runCommand = `run ${cmd}`
|
|
}
|
|
|
|
console.log('filtered packages:', prefixedList(packages))
|
|
|
|
return packages.map((dir, index) => {
|
|
const packageName = packageNameFromPath(dir)
|
|
|
|
return {
|
|
command: runCommand,
|
|
options: {
|
|
cwd: dir,
|
|
label: {
|
|
name: `${packageName.replace(/\/$/, '')}:${cmd}`,
|
|
color: colors[index],
|
|
},
|
|
},
|
|
}
|
|
})
|
|
}
|
|
|
|
let stderrOutput = ''
|
|
const collectStderr = through(function (data) {
|
|
stderrOutput += data.toString()
|
|
|
|
return this.queue(data)
|
|
})
|
|
|
|
collectStderr.pipe(process.stderr)
|
|
|
|
const noPackagesError = (err) => {
|
|
return err.noPackages
|
|
}
|
|
// only consider printing a list of errors
|
|
const resultsError = (err) => {
|
|
return Array.isArray(err.results)
|
|
}
|
|
const failProcess = () => {
|
|
return process.exit(1)
|
|
}
|
|
|
|
const printOtherErrors = (err) => {
|
|
console.error(err.message)
|
|
console.error('run with DEBUG=cypress:run ... to see more details')
|
|
log(err.stack)
|
|
throw err
|
|
}
|
|
|
|
function hasPackageJson (dir) {
|
|
const packagePath = path.join(dir, 'package.json')
|
|
|
|
return fs.existsSync(packagePath)
|
|
}
|
|
|
|
function keepDirsWithPackageJson (dirs) {
|
|
return dirs.filter(hasPackageJson)
|
|
}
|
|
|
|
module.exports = (cmd, options) => {
|
|
const packagesFilter = options.package || options.packages
|
|
const packagesReject = options['skip-package'] || options['skip-packages']
|
|
|
|
if (packagesFilter === 'none') return
|
|
|
|
return getDirs()
|
|
.then(keepDirsWithPackageJson)
|
|
.then((dirs) => {
|
|
return filterDirsByPackage(dirs, packagesFilter)
|
|
})
|
|
.then((dirs) => {
|
|
return rejectDirsByPackage(dirs, packagesReject)
|
|
})
|
|
.then((dirs) => {
|
|
return checkDirsLength(dirs, `No packages were found with the filter '${packagesFilter}'`)
|
|
})
|
|
.then((dirs) => {
|
|
return filterDirsByCmd(dirs, cmd)
|
|
})
|
|
.then((dirs) => {
|
|
let errMessage = `No packages were found with the task '${cmd}'`
|
|
|
|
if (packagesFilter) {
|
|
errMessage += ` and the filter '${packagesFilter}'`
|
|
}
|
|
|
|
return checkDirsLength(dirs, errMessage)
|
|
})
|
|
.then((dirs) => {
|
|
if (options.args) {
|
|
cmd += ` ${options.args}`
|
|
}
|
|
|
|
return mapTasks(cmd, dirs)
|
|
})
|
|
.then((tasks) => {
|
|
const runSerially = Boolean(options.serial)
|
|
|
|
if (runSerially) {
|
|
console.log('⚠️ running jobs serially')
|
|
}
|
|
|
|
const parallel = !runSerially
|
|
|
|
return runAll(tasks, {
|
|
parallel,
|
|
printLabel: tasks.length > 1,
|
|
stdout: process.stdout,
|
|
stderr: collectStderr,
|
|
})
|
|
})
|
|
.then(() => {
|
|
console.log(chalk.green('\nAll tasks completed successfully'))
|
|
})
|
|
// using Bluebird filtered catch
|
|
// http://bluebirdjs.com/docs/api/catch.html#filtered-catch
|
|
.catch(noPackagesError, (err) => {
|
|
console.error(chalk.red(`\n${err.message}`))
|
|
|
|
return failProcess()
|
|
})
|
|
.catch(resultsError, (err) => {
|
|
const results = AsciiTable.factory({
|
|
heading: ['package', 'exit code'],
|
|
rows: err.results.map((result) => {
|
|
return [result.name.replace(`:${cmd}`, ''), result.code]
|
|
}),
|
|
}).toString()
|
|
|
|
console.error(chalk.red(`\nOne or more tasks failed running 'npm run all ${cmd}'.`))
|
|
console.error('\nResults:\n')
|
|
console.error(results)
|
|
|
|
console.error('\nstderr:\n')
|
|
console.error(stderrOutput)
|
|
|
|
return failProcess()
|
|
})
|
|
.catch(printOtherErrors)
|
|
.catch(failProcess)
|
|
}
|