Skip to content

Commit 1c3232d

Browse files
committed
Merge branch 'breaking/remove_angular_17_cursor' of github.com:cypress-io/cypress into breaking/remove_angular_17_cursor
2 parents 2faf5df + f6a14fe commit 1c3232d

File tree

121 files changed

+2902
-2318
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

121 files changed

+2902
-2318
lines changed

.circleci/cache-version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
# Bump this version to force CI to re-create the cache from scratch.
22

3-
4-7-2025-v1
3+
4-22-2025

.circleci/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: 2.1
22
setup: true
33

44
orbs:
5-
continuation: circleci/continuation@1.0.0
5+
continuation: circleci/continuation@1.1.0
66

77
jobs:
88
verify-ci-should-run:

.circleci/workflows.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
version: 2.1
22

3-
chrome-stable-version: &chrome-stable-version "135.0.7049.95"
3+
chrome-stable-version: &chrome-stable-version "135.0.7049.114"
44
chrome-beta-version: &chrome-beta-version "136.0.7103.33"
55
firefox-stable-version: &firefox-stable-version "137.0"
66

cli/CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,27 @@ _Released 07/01/2025 (PENDING)_
1010
- Removed support for [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol) with the [firefox](https://www.mozilla.org/) browser. Addresses [#31189](https://github.com/cypress-io/cypress/issues/31189).
1111
- The Cypress configuration wizard for Component Testing supports TypeScript 5.0 or greater. Addresses [#31187](https://github.com/cypress-io/cypress/issues/31187).
1212

13+
## 14.3.3
14+
15+
_Released 5/6/2025 (PENDING)_
16+
17+
**Misc:**
18+
19+
- The URL in the Cypress App no longer displays a white background when the URL is loading. Fixes [#31556](https://github.com/cypress-io/cypress/issues/31556).
20+
21+
## 14.3.2
22+
23+
_Released 4/22/2025_
24+
25+
**Bugfixes:**
26+
27+
- Fixed an issue where auto scroll in the Cypress Command Log was not scrolling correctly. Fixes [#31530](https://github.com/cypress-io/cypress/issues/31530).
28+
- Fixed an issue where a message pointing users to the Cypress Cloud was not displaying on runs with failures in CI. Fixes [#31550](https://github.com/cypress-io/cypress/issues/31550).
29+
30+
**Misc:**
31+
32+
- The URL in the Cypress App no longer displays a white background when the URL is loading. Fixes [#31556](https://github.com/cypress-io/cypress/issues/31556).
33+
1334
## 14.3.1
1435

1536
_Released 4/17/2025_

npm/react/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
"react-router-dom": "6.28.0",
2929
"semver": "^7.7.1",
3030
"typescript": "~5.4.5",
31-
"vite": "5.4.10",
31+
"vite": "5.4.18",
3232
"vite-plugin-require-transform": "1.0.12"
3333
},
3434
"peerDependencies": {

npm/vite-dev-server/cypress/e2e/react.cy.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ import dedent from 'dedent'
44

55
type ProjectDirs = typeof fixtureDirs
66

7-
const VITE_REACT: ProjectDirs[number][] = ['vite4.5.5-react', 'vite5.4.10-react', 'vite6.0.0-react']
7+
// These versions should reflect the latest versions of each major version of Vite - update as needed
8+
const VITE_REACT: ProjectDirs[number][] = ['vite4.5.12-react', 'vite5.4.18-react', 'vite6.2.5-react']
89

910
// Add to this list to focus on a particular permutation
1011
const ONLY_PROJECTS: ProjectDirs[number][] = []

npm/vite-dev-server/cypress/e2e/vite-dev-server.cy.ts

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ describe('Config options', () => {
4444
})
4545

4646
it('supports supportFile = false', () => {
47-
cy.scaffoldProject('vite6.0.0-react')
48-
cy.openProject('vite6.0.0-react', ['--config-file', 'cypress-vite-no-support.config.ts', '--component'])
47+
cy.scaffoldProject('vite6.2.5-react')
48+
cy.openProject('vite6.2.5-react', ['--config-file', 'cypress-vite-no-support.config.ts', '--component'])
4949
cy.startAppServer('component')
5050

5151
cy.visitApp()
@@ -59,8 +59,8 @@ describe('Config options', () => {
5959
it('supports serving files with whitespace', () => {
6060
const specWithWhitespace = 'spec with whitespace.cy.jsx'
6161

62-
cy.scaffoldProject('vite6.0.0-react')
63-
cy.openProject('vite6.0.0-react', ['--config-file', 'cypress-vite.config.ts', '--component'])
62+
cy.scaffoldProject('vite6.2.5-react')
63+
cy.openProject('vite6.2.5-react', ['--config-file', 'cypress-vite.config.ts', '--component'])
6464
cy.startAppServer('component')
6565

6666
cy.withCtx(async (ctx, { specWithWhitespace }) => {
@@ -77,8 +77,8 @@ describe('Config options', () => {
7777
})
7878

7979
it('supports @cypress/vite-dev-server', () => {
80-
cy.scaffoldProject('vite6.0.0-react')
81-
cy.openProject('vite6.0.0-react', ['--config-file', 'cypress-vite-dev-server-function.config.ts', '--component'])
80+
cy.scaffoldProject('vite6.2.5-react')
81+
cy.openProject('vite6.2.5-react', ['--config-file', 'cypress-vite-dev-server-function.config.ts', '--component'])
8282
cy.startAppServer('component')
8383

8484
cy.visitApp()
@@ -89,8 +89,8 @@ describe('Config options', () => {
8989
})
9090

9191
it('supports viteConfig as an async function', () => {
92-
cy.scaffoldProject('vite6.0.0-react')
93-
cy.openProject('vite6.0.0-react', ['--config-file', 'cypress-vite-async-function-config.config.ts', '--component'])
92+
cy.scaffoldProject('vite6.2.5-react')
93+
cy.openProject('vite6.2.5-react', ['--config-file', 'cypress-vite-async-function-config.config.ts', '--component'])
9494
cy.startAppServer('component')
9595

9696
cy.visitApp()
@@ -120,8 +120,8 @@ describe('sourcemaps', () => {
120120
})
121121
`
122122

123-
cy.scaffoldProject('vite6.0.0-react')
124-
cy.openProject('vite6.0.0-react', ['--config-file', 'cypress-vite.config.ts', '--component'])
123+
cy.scaffoldProject('vite6.2.5-react')
124+
cy.openProject('vite6.2.5-react', ['--config-file', 'cypress-vite.config.ts', '--component'])
125125
cy.startAppServer('component')
126126

127127
cy.withCtx(async (ctx, o) => {

npm/vite-dev-server/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@
2727
"mocha": "^9.2.2",
2828
"sinon": "^13.0.1",
2929
"ts-node": "^10.9.2",
30-
"vite-4": "npm:vite@^4.5.3",
31-
"vite-5": "npm:vite@^5.2.8",
32-
"vite-6": "npm:vite@^6.0.0",
30+
"vite-4": "npm:vite@^4.5.12",
31+
"vite-5": "npm:vite@^5.4.18",
32+
"vite-6": "npm:vite@^6.2.5",
3333
"vite-plugin-inspect": "0.8.4"
3434
},
3535
"peerDependencies": {

npm/vite-plugin-cypress-esm/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"react-dom": "18.3.1",
2525
"react-router": "6.28.0",
2626
"react-router-dom": "6.28.0",
27-
"vite": "5.2.11"
27+
"vite": "5.4.18"
2828
},
2929
"files": [
3030
"dist",

npm/vue/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"globby": "^11.0.1",
2626
"tailwindcss": "1.1.4",
2727
"typescript": "~5.4.5",
28-
"vite": "5.2.11",
28+
"vite": "5.4.18",
2929
"vue": "3.2.47",
3030
"vue-i18n": "9.13.1",
3131
"vue-router": "^4.0.0",

package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "cypress",
3-
"version": "14.3.1",
3+
"version": "14.3.2",
44
"description": "Cypress is a next generation front end testing tool built for the modern web",
55
"private": true,
66
"scripts": {
@@ -102,7 +102,6 @@
102102
"@types/bluebird": "3.5.29",
103103
"@types/chai-enzyme": "0.6.7",
104104
"@types/debug": "4.1.7",
105-
"@types/detect-port": "^1.3.5",
106105
"@types/enzyme-adapter-react-16": "1.0.5",
107106
"@types/fluent-ffmpeg": "^2.1.18",
108107
"@types/fs-extra": "^9.0.13",
@@ -141,7 +140,7 @@
141140
"debug": "^4.3.4",
142141
"dedent": "^0.7.0",
143142
"del": "3.0.0",
144-
"detect-port": "^1.6.1",
143+
"detect-port": "^2.1.0",
145144
"electron": "33.2.1",
146145
"electron-builder": "^25.1.8",
147146
"enzyme-adapter-react-16": "1.12.1",

packages/app/cypress/e2e/studio/helper.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,21 @@
1-
export function launchStudio ({ specName = 'spec.cy.js', createNewTest = false, cliArgs = [''], enableCloudStudio = false } = {}) {
2-
cy.scaffoldProject('experimental-studio')
3-
cy.openProject('experimental-studio', cliArgs, {
1+
import type { ProjectFixtureDir } from '@tooling/system-tests'
2+
3+
export function loadProjectAndRunSpec ({ projectName = 'experimental-studio' as ProjectFixtureDir, specName = 'spec.cy.js', cliArgs = [''], enableCloudStudio = false, specSelector = 'data-cy-row' } = {}) {
4+
cy.scaffoldProject(projectName)
5+
cy.openProject(projectName, cliArgs, {
46
cloudStudio: enableCloudStudio,
57
})
68

79
cy.startAppServer('e2e')
810
cy.visitApp()
911
cy.specsPageIsVisible()
10-
cy.get(`[data-cy-row="${specName}"]`).click()
12+
cy.get(`[${specSelector}="${specName}"]`).click()
1113

1214
cy.waitForSpecToFinish()
15+
}
16+
17+
export function launchStudio ({ specName = 'spec.cy.js', createNewTest = false, cliArgs = [''], enableCloudStudio = false } = {}) {
18+
loadProjectAndRunSpec({ specName, cliArgs, enableCloudStudio })
1319

1420
// Should not show "Studio Commands" until we've started a new Studio session.
1521
cy.get('[data-cy="hook-name-studio commands"]').should('not.exist')

packages/app/cypress/e2e/studio/studio.cy.ts

Lines changed: 60 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { launchStudio } from './helper'
1+
import { launchStudio, loadProjectAndRunSpec } from './helper'
22
import pDefer from 'p-defer'
33

44
describe('Cypress Studio', () => {
@@ -22,6 +22,34 @@ describe('Cypress Studio', () => {
2222
})
2323
}
2424

25+
function assertClosingPanelWithoutChanges () {
26+
// Cypress re-runs after you cancel Studio.
27+
// Original spec should pass
28+
cy.waitForSpecToFinish({ passCount: 1 })
29+
30+
cy.get('.command').should('have.length', 1)
31+
32+
// Assert the spec was executed without any new commands.
33+
cy.get('.command-name-visit').within(() => {
34+
cy.contains('visit')
35+
cy.contains('cypress/e2e/index.html')
36+
})
37+
38+
cy.findByTestId('hook-name-studio commands').should('not.exist')
39+
40+
cy.withCtx(async (ctx) => {
41+
const spec = await ctx.actions.file.readFileInProject('cypress/e2e/spec.cy.js')
42+
43+
// No change, since we closed studio
44+
expect(spec.trim().replace(/\r/g, '')).to.eq(`
45+
describe('studio functionality', () => {
46+
it('visits a basic html page', () => {
47+
cy.visit('cypress/e2e/index.html')
48+
})
49+
})`.trim())
50+
})
51+
}
52+
2553
context('cloud studio', () => {
2654
it('loads the studio page', () => {
2755
launchStudio({ enableCloudStudio: true })
@@ -33,28 +61,16 @@ describe('Cypress Studio', () => {
3361
})
3462
})
3563

36-
it('displays Studio header', () => {
37-
launchStudio({ enableCloudStudio: true })
64+
it('does not display Studio button when not using cloud studio', () => {
65+
loadProjectAndRunSpec({ })
3866

39-
cy.viewport(1500, 1000)
40-
cy.get('[data-cy="studio-toolbar"]').should('be.visible')
41-
cy.percySnapshot()
67+
cy.get('[data-cy="studio-button"]').should('not.exist')
4268
})
4369

4470
it('immediately loads the studio panel', () => {
4571
const deferred = pDefer()
4672

47-
cy.scaffoldProject('experimental-studio')
48-
cy.openProject('experimental-studio', [], {
49-
cloudStudio: true,
50-
})
51-
52-
cy.startAppServer('e2e')
53-
cy.visitApp()
54-
cy.specsPageIsVisible()
55-
cy.get('[data-cy-row="spec.cy.js"]').click()
56-
57-
cy.waitForSpecToFinish()
73+
loadProjectAndRunSpec({ enableCloudStudio: true })
5874

5975
cy.findByTestId('studio-panel').should('not.exist')
6076

@@ -73,6 +89,8 @@ describe('Cypress Studio', () => {
7389
cy.get('[data-cy="hook-name-studio commands"]').should('not.exist')
7490
// cloud studio is loaded immediately
7591
cy.findByTestId('studio-panel').then(() => {
92+
// check for the loading panel from the app first
93+
cy.get('[data-cy="loading-studio-panel"]').should('be.visible')
7694
// we've verified the studio panel is loaded, now resolve the promise so the test can finish
7795
deferred.resolve()
7896
})
@@ -86,6 +104,28 @@ describe('Cypress Studio', () => {
86104
cy.findByTestId('studio-panel')
87105
cy.get('[data-cy="hook-name-studio commands"]')
88106
})
107+
108+
it('closes studio panel when clicking studio button (from the cloud)', () => {
109+
launchStudio({ enableCloudStudio: true })
110+
111+
cy.get('[data-cy="studio-header-studio-button"]').click()
112+
113+
assertClosingPanelWithoutChanges()
114+
})
115+
116+
it('opens studio panel to new test when clicking on studio button (from the app) next to url', () => {
117+
cy.viewport(1500, 1000)
118+
loadProjectAndRunSpec({ enableCloudStudio: true })
119+
// studio button should be visible when using cloud studio
120+
cy.get('[data-cy="studio-button"]').should('be.visible').click()
121+
cy.get('[data-cy="studio-panel"]').should('be.visible')
122+
123+
cy.contains('New Test')
124+
125+
cy.get('[data-cy="studio-url-prompt"]').should('not.exist')
126+
127+
cy.percySnapshot()
128+
})
89129
})
90130

91131
it('updates an existing test with an action', () => {
@@ -364,31 +404,7 @@ describe('studio functionality', () => {
364404

365405
cy.findByTestId('studio-toolbar-controls').findByTestId('close-studio').click()
366406

367-
// Cypress re-runs after you cancel Studio.
368-
// Original spec should pass
369-
cy.waitForSpecToFinish({ passCount: 1 })
370-
371-
cy.get('.command').should('have.length', 1)
372-
373-
// Assert the spec was executed without any new commands.
374-
cy.get('.command-name-visit').within(() => {
375-
cy.contains('visit')
376-
cy.contains('cypress/e2e/index.html')
377-
})
378-
379-
cy.findByTestId('hook-name-studio commands').should('not.exist')
380-
381-
cy.withCtx(async (ctx) => {
382-
const spec = await ctx.actions.file.readFileInProject('cypress/e2e/spec.cy.js')
383-
384-
// No change, since we closed studio
385-
expect(spec.trim().replace(/\r/g, '')).to.eq(`
386-
describe('studio functionality', () => {
387-
it('visits a basic html page', () => {
388-
cy.visit('cypress/e2e/index.html')
389-
})
390-
})`.trim())
391-
})
407+
assertClosingPanelWithoutChanges()
392408
})
393409

394410
it('removes pending commands when restarting studio', () => {
@@ -434,14 +450,7 @@ describe('studio functionality', () => {
434450
})
435451

436452
it('creates a new test from an empty spec', () => {
437-
cy.scaffoldProject('experimental-studio')
438-
cy.openProject('experimental-studio')
439-
cy.startAppServer('e2e')
440-
cy.visitApp()
441-
cy.specsPageIsVisible()
442-
cy.get(`[title="empty.cy.js"]`).should('be.visible').click()
443-
444-
cy.waitForSpecToFinish()
453+
loadProjectAndRunSpec({ specName: 'empty.cy.js', specSelector: 'title' })
445454

446455
cy.contains('Create test with Cypress Studio').click()
447456
cy.findByTestId('aut-url').as('urlPrompt')
@@ -685,13 +694,7 @@ describe('studio functionality', () => {
685694
})
686695

687696
it('does not create a new test if the Save test modal is closed', () => {
688-
cy.scaffoldProject('experimental-studio')
689-
cy.openProject('experimental-studio')
690-
cy.startAppServer('e2e')
691-
cy.visitApp()
692-
cy.specsPageIsVisible()
693-
cy.get(`[title="empty.cy.js"]`).should('be.visible')
694-
cy.get(`[title="empty.cy.js"]`).click()
697+
loadProjectAndRunSpec({ specName: 'empty.cy.js', specSelector: 'title' })
695698

696699
cy.waitForSpecToFinish()
697700

0 commit comments

Comments
 (0)