mirror of
https://github.com/cypress-io/cypress.git
synced 2026-04-29 11:32:15 -05:00
29841f32b9
* chore: rename errors.js -> errors.ts * refactor: type safety on errors * refactor: add err_template for consistent error formatting * fix a few system tests * fix tests; update snapshots * Fix types * normalize snapshot - remove chalk ansi colors * more unit test fixes * more system test fixes * circleci build * backtick always in stdout, fix error formatting and failing snapshots * refactor: create @packages/errors * fix import * fix import * fixing build / tests * remove extraneous file * move warnIfExplicitCiBuildId * fix build / tests * Fix * error, type fixes, documentation, standardize child process error serialization * fix import * build errors on install * wrote specs generating visual images of all errors * remove unused dep * sanitize stack traces * add image diffing - if base images don't exist, create them - if base images don't match and local, overwrite them, if in CI throw - if base images are stale and local, delete them, if in CI throw * remove Courier New + MesloLGS NF font * type fixes, remove Bluebird, general cleanup * TS Cleanup * skip typecheck on tests for now * yarn.lock * fix @types/chai version * fix yarn.lock * Different version of mocha types so it isnt patched * errors spec snapshot * CI fix * fixes * store snapshot images in circle artifacts * dont change artifact destination prefix * use Courier Prime * antialias the text * decrease pixelmatch threshold, fail in CI only when changed pixels > 100 * increase timeout * overflow: hidden, remove new Promise, add debug logging Co-Authored-By: Tim Griesser <tgriesser@gmail.com> * run unit tests w/ concurrency=1 * unique window per file * disable app hardware acceleration + use in process gpu + single process * do not do image diffing - conditionally convert html to images - store html snapshots - do not store images in git * store snapshot html * Merge branch 'tgriesser/chore/refactor-errors' of https://github.com/cypress-io/cypress into tgriesser/chore/refactor-errors * remove concurrency * fix assertion * fixing ci * Link in readme * pass the browsers to listItems * fix: build @packages/errors in CI, defer import to prevent errors locally * Merge branch 'develop' into tgriesser/chore/refactor-errors * develop: chore: fix cypress npm package artifact upload path (#20023) chore(driver): move cy.within logic into it's own file (#20036) chore: update automerge workflows (#19982) fix(selectFile): use target window's File/DataTransfer classes (#20003) chore: Update Chrome (stable) to 98.0.4758.80 and Chrome (beta) to 98.0.4758.80 (#19995) fix: Adjust ffmpeg CLI args for performance (#19983) build: allow unified to run cypress on Apple Silicon (arm64) (backport #19067 to 9.x) (#19968) * fix run-if-ci.sh * remove dead code * Mark the .html files as generated in gitattributes * fix running single error case, slice out more of the brittle stack * remove additional brittle stack line * firefox web security error * nest inside of describe * reformat and redesign errors * more error cleanup and standardization * additional formatting of errors, code cleanup, refactoring * update ansi colors to match terminal colors * cleanup remaining loose ends, update several errors, compact excess formatters * fix types * additional formatting, remove TODO's, ensure no [object Object] in output * add test for 412 server response on invalid schema * update unknown dashboard error on creating run * use fs.access instead of fs.stat for perf * added PLUGINS_FILE_NOT_FOUND error - separated out from PLUGINS_FILE_ERROR - add system tests for both cases - update snapshots - remove stack trace from PLUGINS_FILE_NOT_FOUND fka PLUGINS_FILE_ERROR * add plugins system test around plugins synchronously throwing on require * remove forcing process.cwd() to be packages/server, update affected code - this was a long needed hangover from very old code that was doing unnecessary things due to respawning electron from node and handling various entrypoints into booting cypress - this also makes the root yarn dev and dev-debug work correctly because options.cwd is set correctly now * perf: lazy load chalk * remove excessive line since the file exists but is invalid * fix types * add system test when plugins function throws a synchronous error * create new PLUGINS_INVALID_EVENT_ERROR, wire it up correctly for error template use - properly pass error instance from child to ensure proper user stack frames - move error display code into the right place * only show a single stack trace, either originalError or internal cypressError * push error html snapshots * fix tests, types * fix test * fix failing tests * fix tests * fixes lots of broken tests * more test fixes * fixes more tests * fix type checking * wip: consistent handling of interpolated values * feat: fixing up errors, added simple error comparison tool * wrapping up error formatting * Fixes for unit tests * fix PLUGINS_VALIDATION_ERROR * fix fs.readdir bug, show rows even if there's only markdown formatting [SKIP CI] * when in base-list, show full width of errors * Fix type errors * added searching and filtering for files based on error name * fix: system tests * updated NO_SPECS_FOUND error to properly join searched folder + pattern - join patterns off of process.cwd, not projectRoot - highlight original specPattern in yellow, baseDir in blue - add tests * fixes failing tests * fix test * preserve original spec pattern, display relative to projectRoot for terminal banner * make the nodeVersion path display in gray, not white * fix tests, pass right variables * fix chrome:canary snapshots * update snapshots * update snapshot * strip newlines caused by "Still waiting to connect to {browser}..." * don't remove the snapshotHtmlFolder in CI, add additional verification snapshots match to error keys symmetrically * update snapshot * update snapshot * update snapshot * update snapshot * update snapshot * update snapshot * update gitignore * fix snapshot * update snapshot html * update logic for parsing the resolve pattern matching, add tests * update snapshots * update snapshot * update snapshot * update snapshot * fix failing test * fix: error_message_spec * fix snapshot * run each variant through an it(...) so multiple failures are received * add newlines to multiline formatters, add fmt.stringify, allow format overrides * stringify invalid return values from plugins * move config validation errors into packages/errors, properly highlight and stringify values * add component testing yarn commands * fix the arrow not showing on details * fix typescript error * fixed lots of poorly written tests that weren't actually testing anything. created settings validation error when given a string validation result. * fixes tests * fixes tests, adds new error template for validating within an array list (for browser validation) * remove dupe line * fix copy for consistency, update snapshots * remove redundant errors, standardize formatting and phrasing * more formatting * remove excess snapshots * prune out excessive error snapshot html files when not in CI * add missing tests, add case for when config validation fails without a fileType * fixes test * update snapshot * update snapshot * update snapshot * sort uniqErrors + errorKeys prior to assertion - assert one by one * add system test for binding to an event with the wrong handler * fixes tests * set more descriptive errors when setting invalid plugin events, or during plugin event validation * remove duplicate PLUGINS_EVENT_ERROR, collapse into existing error * use the same multiline formatting as @packages/errors * standardize verbiage and highlighting for consistency * fix incorrect error path * fixes tests, standardized and condensed more language * Update packages/errors/src/errors.ts Co-authored-by: Ryan Manuel <ryanm@cypress.io> * Update guides/error-handling.md Co-authored-by: Ryan Manuel <ryanm@cypress.io> * Update guides/error-handling.md Co-authored-by: Ryan Manuel <ryanm@cypress.io> * added some final todo's * fix types Co-authored-by: Tim Griesser <tgriesser10@gmail.com> Co-authored-by: Tim Griesser <tgriesser@gmail.com> Co-authored-by: Ryan Manuel <ryanm@cypress.io>
156 lines
4.2 KiB
TypeScript
156 lines
4.2 KiB
TypeScript
import Debug from 'debug'
|
|
import path from 'path'
|
|
import { CYPRESS_CONFIG_FILES } from './configFiles'
|
|
import errors from './errors'
|
|
import { escapeFilenameInUrl } from './util/escape_filename'
|
|
import { fs } from './util/fs'
|
|
|
|
const debug = Debug('cypress:server:project_utils')
|
|
|
|
const multipleForwardSlashesRe = /[^:\/\/](\/{2,})/g
|
|
const backSlashesRe = /\\/g
|
|
|
|
const normalizeSpecUrl = (browserUrl: string, specUrl: string) => {
|
|
const replacer = (match: string) => match.replace('//', '/')
|
|
|
|
return [
|
|
browserUrl,
|
|
'#/tests',
|
|
escapeFilenameInUrl(specUrl),
|
|
].join('/')
|
|
.replace(multipleForwardSlashesRe, replacer)
|
|
}
|
|
|
|
const getPrefixedPathToSpec = ({
|
|
integrationFolder,
|
|
componentFolder,
|
|
projectRoot,
|
|
type,
|
|
pathToSpec,
|
|
}: {
|
|
integrationFolder: string
|
|
componentFolder: string
|
|
projectRoot: string
|
|
type: string
|
|
pathToSpec: string
|
|
}) => {
|
|
type ??= 'integration'
|
|
|
|
// for now hard code the 'type' as integration
|
|
// but in the future accept something different here
|
|
|
|
// strip out the integration folder and prepend with "/"
|
|
// example:
|
|
//
|
|
// /Users/bmann/Dev/cypress-app/.projects/cypress/integration
|
|
// /Users/bmann/Dev/cypress-app/.projects/cypress/integration/foo.js
|
|
//
|
|
// becomes /integration/foo.js
|
|
|
|
const folderToUse = type === 'integration' ? integrationFolder : componentFolder
|
|
|
|
// To avoid having invalid urls from containing backslashes,
|
|
// we normalize specUrls to posix by replacing backslash by slash
|
|
// Indeed, path.realtive will return something different on windows
|
|
// than on posix systems which can lead to problems
|
|
const url = `/${path.join(type, path.relative(
|
|
folderToUse,
|
|
path.resolve(projectRoot, pathToSpec),
|
|
)).replace(backSlashesRe, '/')}`
|
|
|
|
debug('prefixed path for spec %o', { pathToSpec, type, url })
|
|
|
|
return url
|
|
}
|
|
|
|
export const getSpecUrl = ({
|
|
absoluteSpecPath,
|
|
specType,
|
|
browserUrl,
|
|
integrationFolder,
|
|
componentFolder,
|
|
projectRoot,
|
|
}: {
|
|
absoluteSpecPath?: string
|
|
browserUrl?: string
|
|
integrationFolder: string
|
|
componentFolder: string
|
|
projectRoot: string
|
|
specType?: 'integration' | 'component'
|
|
}) => {
|
|
specType ??= 'integration'
|
|
browserUrl ??= ''
|
|
|
|
debug('get spec url: %s for spec type %s', absoluteSpecPath, specType)
|
|
|
|
// if we don't have a absoluteSpecPath or its __all
|
|
if (!absoluteSpecPath || (absoluteSpecPath === '__all')) {
|
|
const url = normalizeSpecUrl(browserUrl, '/__all')
|
|
|
|
debug('returning url to run all specs: %s', url)
|
|
|
|
return url
|
|
}
|
|
|
|
// TODO:
|
|
// to handle both unit + integration tests we need
|
|
// to figure out (based on the config) where this absoluteSpecPath
|
|
// lives. does it live in the integrationFolder or
|
|
// the unit folder?
|
|
// once we determine that we can then prefix it correctly
|
|
// with either integration or unit
|
|
const prefixedPath = getPrefixedPathToSpec({
|
|
integrationFolder,
|
|
componentFolder,
|
|
projectRoot,
|
|
pathToSpec: absoluteSpecPath,
|
|
type: specType,
|
|
})
|
|
const url = normalizeSpecUrl(browserUrl, prefixedPath)
|
|
|
|
debug('return path to spec %o', { specType, absoluteSpecPath, prefixedPath, url })
|
|
|
|
return url
|
|
}
|
|
|
|
export const checkSupportFile = async ({
|
|
supportFile,
|
|
configFile,
|
|
}: {
|
|
supportFile?: string | boolean
|
|
configFile?: string | false
|
|
}) => {
|
|
if (supportFile && typeof supportFile === 'string') {
|
|
const found = await fs.pathExists(supportFile)
|
|
|
|
if (!found) {
|
|
errors.throw('SUPPORT_FILE_NOT_FOUND', supportFile)
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
export async function getDefaultConfigFilePath (projectRoot: string, returnDefaultValueIfNotFound: boolean = true): Promise<string | undefined> {
|
|
const filesInProjectDir = await fs.readdir(projectRoot)
|
|
|
|
const foundConfigFiles = CYPRESS_CONFIG_FILES.filter((file) => filesInProjectDir.includes(file))
|
|
|
|
// if we only found one default file, it is the one
|
|
if (foundConfigFiles.length === 1) {
|
|
return foundConfigFiles[0]
|
|
}
|
|
|
|
// if we found more than one, throw a language conflict
|
|
if (foundConfigFiles.length > 1) {
|
|
throw errors.throw('CONFIG_FILES_LANGUAGE_CONFLICT', projectRoot, foundConfigFiles[0], foundConfigFiles[1])
|
|
}
|
|
|
|
if (returnDefaultValueIfNotFound) {
|
|
// Default is to create a new `cypress.json` file if one does not exist.
|
|
return CYPRESS_CONFIG_FILES[0]
|
|
}
|
|
|
|
throw errors.get('NO_DEFAULT_CONFIG_FILE_FOUND', projectRoot)
|
|
}
|