> | string[]
},
options?: MountingOptions & Record
-): Cypress.Chainable>>
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}>
// Class component - no props
export function mount(
@@ -148,7 +154,10 @@ export function mount(
registerHooks(keys: string[]): void
},
options?: MountingOptions & Record
-): Cypress.Chainable>>
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}>
// Class component - props
export function mount(
@@ -158,13 +167,19 @@ export function mount(
registerHooks(keys: string[]): void
},
options?: MountingOptions & Record
-): Cypress.Chainable>>
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}>
// Functional component with emits
export function mount(
originalComponent: FunctionalComponent,
options?: MountingOptions & Record
-): Cypress.Chainable>>
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}>
// Component declared with defineComponent
export function mount<
@@ -200,8 +215,8 @@ export function mount<
D
> &
Record
-): Cypress.Chainable<
- VueWrapper<
+): Cypress.Chainable<{
+ wrapper: VueWrapper<
InstanceType<
DefineComponent<
PropsOrPropOptions,
@@ -219,13 +234,34 @@ export function mount<
>
>
>
+ component: VueWrapper<
+ InstanceType<
+ DefineComponent<
+ PropsOrPropOptions,
+ RawBindings,
+ D,
+ C,
+ M,
+ Mixin,
+ Extends,
+ E,
+ EE,
+ PP,
+ Props,
+ Defaults
+ >
+ >
+ >['vm']}
>
// component declared by vue-tsc ScriptSetup
export function mount>(
component: T,
options?: ComponentMountingOptions
-): Cypress.Chainable>>
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}>
// Component declared with no props
export function mount<
@@ -251,7 +287,10 @@ export function mount<
EE
>,
options?: MountingOptions
-): Cypress.Chainable>> & Record
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}> & Record
// Component declared with { props: [] }
export function mount<
@@ -281,7 +320,10 @@ export function mount<
Props
>,
options?: MountingOptions
-): Cypress.Chainable>>
+): Cypress.Chainable<{
+ wrapper: VueWrapper>
+ component: VueWrapper>['vm']
+}>
// Component declared with { props: { ... } }
export function mount<
@@ -309,8 +351,8 @@ export function mount<
EE
>,
options?: MountingOptions & PublicProps, D>
-): Cypress.Chainable<
- VueWrapper<
+): Cypress.Chainable<{
+ wrapper: VueWrapper<
ComponentPublicInstance<
ExtractPropTypes,
RawBindings,
@@ -321,7 +363,18 @@ export function mount<
VNodeProps & ExtractPropTypes
>
>
->
+ component: VueWrapper<
+ ComponentPublicInstance<
+ ExtractPropTypes,
+ RawBindings,
+ D,
+ C,
+ M,
+ E,
+ VNodeProps & ExtractPropTypes
+ >
+ >['vm']
+}>
// implementation
export function mount (componentOptions: any, options: any = {}) {
@@ -367,7 +420,6 @@ export function mount (componentOptions: any, options: any = {}) {
Cypress.vue = wrapper.vm as ComponentPublicInstance
return cy
- .wrap(wrapper, { log: false })
.wait(1, { log: false })
.then(() => {
if (logInstance) {
@@ -377,7 +429,10 @@ export function mount (componentOptions: any, options: any = {}) {
// by returning undefined we keep the previous subject
// which is the mounted component
- return undefined
+ return {
+ wrapper,
+ component: wrapper.vm,
+ }
})
})
}
diff --git a/npm/vue2/src/index.ts b/npm/vue2/src/index.ts
index 86d94af09d2b..d65d72fbfeea 100644
--- a/npm/vue2/src/index.ts
+++ b/npm/vue2/src/index.ts
@@ -332,7 +332,10 @@ function getComponentDisplayName (componentOptions: any): string {
export const mount = (
component: VueComponent,
optionsOrProps: MountOptionsArgument = {},
-) => {
+): Cypress.Chainable<{
+ wrapper: Wrapper
+ component: Wrapper['vm']
+}> => {
const options: Partial = Cypress._.pick(
optionsOrProps,
defaultOptions,
@@ -410,6 +413,11 @@ export const mount = (
Cypress.vue = VTUWrapper.vm
Cypress.vueWrapper = VTUWrapper
+
+ return {
+ wrapper: VTUWrapper,
+ component: VTUWrapper.vm,
+ }
})
}
diff --git a/system-tests/project-fixtures/vue2-cli/src/components/HelloWorld.cy.js b/system-tests/project-fixtures/vue2-cli/src/components/HelloWorld.cy.js
index 6226c3920657..c705937e5ea9 100644
--- a/system-tests/project-fixtures/vue2-cli/src/components/HelloWorld.cy.js
+++ b/system-tests/project-fixtures/vue2-cli/src/components/HelloWorld.cy.js
@@ -9,6 +9,15 @@ describe('', () => {
propsData: {
msg: slotContent,
},
+ data () {
+ return {
+ foo: 'bar'
+ }
+ }
+ })
+ .then(({ wrapper, component }) => {
+ expect(wrapper.find('.hello').text()).to.contain(slotContent)
+ expect(component.$data.foo).to.eq('bar')
})
cy.contains('h1', slotContent)
From f39eb1c19e0923bda7ae263168fc6448da942d54 Mon Sep 17 00:00:00 2001
From: Zachary Williams
Date: Thu, 3 Nov 2022 12:19:29 -0500
Subject: [PATCH 06/26] fix: remove last mounted component upon subsequent
mount calls (#24470)
BREAKING CHANGE: remove last mounted component upon subsequent mount calls of mount
---
npm/angular/src/mount.ts | 53 ++-
npm/angular/tsconfig.json | 6 +-
npm/mount-utils/create-rollup-entry.mjs | 15 +-
npm/react/src/mount.ts | 3 +
npm/react18/src/index.ts | 4 +
npm/svelte/src/mount.ts | 3 +
npm/vue/src/index.ts | 30 +-
npm/vue2/src/index.ts | 18 +-
npm/webpack-dev-server/src/devServer.ts | 2 +-
packages/app/src/runs/RunResults.cy.tsx | 25 +-
packages/app/src/specs/SpecsListHeader.cy.tsx | 18 +-
.../src/components/Alert.cy.tsx | 7 +-
.../component_testing_spec.ts.js | 212 ++++++++--
.../vite_dev_server_fresh_spec.ts.js | 171 ++++++--
.../webpack_dev_server_fresh_spec.ts.js | 234 ++++++++---
.../angular/src/app/mount.cy.ts | 22 +-
.../project-fixtures/react/src/mount.cy.jsx | 27 ++
.../project-fixtures/svelte/src/mount.cy.js | 101 +++--
.../project-fixtures/vue/cypress.config.js | 10 +
.../vue/cypress/support/component-index.html | 12 +
.../vue/cypress/support/component.js | 3 +
system-tests/project-fixtures/vue/index.html | 13 +
system-tests/project-fixtures/vue/src/App.vue | 12 +
.../vue/src/components/HelloWorld.vue | 22 ++
system-tests/project-fixtures/vue/src/main.js | 4 +
.../project-fixtures/vue/src/mount.cy.js | 26 ++
.../vue2/cypress/support/component.js | 3 +
system-tests/projects/vue2/package.json | 19 +
system-tests/projects/vue2/vite.config.js | 7 +
system-tests/projects/vue2/yarn.lock | 264 +++++++++++++
system-tests/projects/vue3/package.json | 19 +
system-tests/projects/vue3/vite.config.js | 7 +
system-tests/projects/vue3/yarn.lock | 365 ++++++++++++++++++
system-tests/test/component_testing_spec.ts | 24 +-
.../cache/dev-darwin/snapshot-meta.cache.json | 2 +-
35 files changed, 1528 insertions(+), 235 deletions(-)
create mode 100644 system-tests/project-fixtures/react/src/mount.cy.jsx
create mode 100644 system-tests/project-fixtures/vue/cypress.config.js
create mode 100644 system-tests/project-fixtures/vue/cypress/support/component-index.html
create mode 100644 system-tests/project-fixtures/vue/cypress/support/component.js
create mode 100644 system-tests/project-fixtures/vue/index.html
create mode 100644 system-tests/project-fixtures/vue/src/App.vue
create mode 100644 system-tests/project-fixtures/vue/src/components/HelloWorld.vue
create mode 100644 system-tests/project-fixtures/vue/src/main.js
create mode 100644 system-tests/project-fixtures/vue/src/mount.cy.js
create mode 100644 system-tests/projects/vue2/cypress/support/component.js
create mode 100644 system-tests/projects/vue2/package.json
create mode 100644 system-tests/projects/vue2/vite.config.js
create mode 100644 system-tests/projects/vue2/yarn.lock
create mode 100644 system-tests/projects/vue3/package.json
create mode 100644 system-tests/projects/vue3/vite.config.js
create mode 100644 system-tests/projects/vue3/yarn.lock
diff --git a/npm/angular/src/mount.ts b/npm/angular/src/mount.ts
index 68da248d0646..a79ecce89769 100644
--- a/npm/angular/src/mount.ts
+++ b/npm/angular/src/mount.ts
@@ -8,7 +8,7 @@ window.Mocha['__zone_patch__'] = false
import 'zone.js/testing'
import { CommonModule } from '@angular/common'
-import { Component, ErrorHandler, EventEmitter, Injectable, SimpleChange, SimpleChanges, Type } from '@angular/core'
+import { Component, ErrorHandler, EventEmitter, Injectable, SimpleChange, SimpleChanges, Type, OnChanges } from '@angular/core'
import {
ComponentFixture,
getTestBed,
@@ -72,6 +72,23 @@ export interface MountConfig extends TestModuleMetadata {
componentProperties?: Partial<{ [P in keyof T]: T[P] }>
}
+let activeFixture: ComponentFixture | null = null
+
+function cleanup () {
+ // Not public, we need to call this to remove the last component from the DOM
+ try {
+ (getTestBed() as any).tearDownTestingModule()
+ } catch (e) {
+ const notSupportedError = new Error(`Failed to teardown component. The version of Angular you are using may not be officially supported.`)
+
+ ;(notSupportedError as any).docsUrl = 'https://on.cypress.io/component-framework-configuration'
+ throw notSupportedError
+ }
+
+ getTestBed().resetTestingModule()
+ activeFixture = null
+}
+
/**
* Type that the `mount` function returns
* @type MountResponse
@@ -209,6 +226,8 @@ function setupFixture (
): ComponentFixture {
const fixture = getTestBed().createComponent(component)
+ setupComponent(config, fixture)
+
fixture.whenStable().then(() => {
fixture.autoDetectChanges(config.autoDetectChanges ?? true)
})
@@ -223,17 +242,18 @@ function setupFixture (
* @param {ComponentFixture} fixture Fixture for debugging and testing a component.
* @returns {T} Component being mounted
*/
-function setupComponent (
+function setupComponent (
config: MountConfig,
- fixture: ComponentFixture): T {
- let component: T = fixture.componentInstance
+ fixture: ComponentFixture,
+): void {
+ let component = fixture.componentInstance as unknown as { [key: string]: any } & Partial
if (config?.componentProperties) {
component = Object.assign(component, config.componentProperties)
}
if (config.autoSpyOutputs) {
- Object.keys(component).forEach((key: string, index: number, keys: string[]) => {
+ Object.keys(component).forEach((key) => {
const property = component[key]
if (property instanceof EventEmitter) {
@@ -252,14 +272,12 @@ function setupComponent 0) {
component.ngOnChanges(simpleChanges)
}
}
-
- return component
}
/**
@@ -295,13 +313,18 @@ export function mount (
component: Type | string,
config: MountConfig = { },
): Cypress.Chainable> {
+ // Remove last mounted component if cy.mount is called more than once in a test
+ if (activeFixture) {
+ cleanup()
+ }
+
const componentFixture = initTestBed(component, config)
- const fixture = setupFixture(componentFixture, config)
- const componentInstance = setupComponent(config, fixture)
+
+ activeFixture = setupFixture(componentFixture, config)
const mountResponse: MountResponse = {
- fixture,
- component: componentInstance,
+ fixture: activeFixture,
+ component: activeFixture.componentInstance,
}
const logMessage = typeof component === 'string' ? 'Component' : componentFixture.name
@@ -338,8 +361,4 @@ getTestBed().initTestEnvironment(
},
)
-setupHooks(() => {
- // Not public, we need to call this to remove the last component from the DOM
- getTestBed()['tearDownTestingModule']()
- getTestBed().resetTestingModule()
-})
+setupHooks(cleanup)
diff --git a/npm/angular/tsconfig.json b/npm/angular/tsconfig.json
index b21ac64dacea..a73e01dcecc9 100644
--- a/npm/angular/tsconfig.json
+++ b/npm/angular/tsconfig.json
@@ -11,15 +11,15 @@
"allowJs": true,
"declaration": true,
"outDir": "dist",
- "strict": false,
- "noImplicitAny": false,
+ "strict": true,
"baseUrl": "./",
"types": [
"cypress"
],
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
- "moduleResolution": "node"
+ "moduleResolution": "node",
+ "noPropertyAccessFromIndexSignature": true,
},
"include": ["src/**/*.*"],
"exclude": ["src/**/*-spec.*"]
diff --git a/npm/mount-utils/create-rollup-entry.mjs b/npm/mount-utils/create-rollup-entry.mjs
index 3b230760b69a..f3b0de4d610c 100644
--- a/npm/mount-utils/create-rollup-entry.mjs
+++ b/npm/mount-utils/create-rollup-entry.mjs
@@ -68,10 +68,19 @@ export function createEntries (options) {
console.log(`Building ${format}: ${finalConfig.output.file}`)
return finalConfig
- }).concat({
+ }).concat([{
input,
output: [{ file: 'dist/index.d.ts', format: 'es' }],
- plugins: [dts({ respectExternal: true })],
+ plugins: [
+ dts({ respectExternal: true }),
+ {
+ name: 'cypress-types-reference',
+ // rollup-plugin-dts does not add '// ' like rollup-plugin-typescript2 did so we add it here.
+ renderChunk (...[code]) {
+ return `/// \n\n${code}`
+ },
+ },
+ ],
external: config.external || [],
- })
+ }])
}
diff --git a/npm/react/src/mount.ts b/npm/react/src/mount.ts
index 11f7d458cc4b..1de9b091e717 100644
--- a/npm/react/src/mount.ts
+++ b/npm/react/src/mount.ts
@@ -33,6 +33,9 @@ export function mount (jsx: React.ReactNode, options: MountOptions = {}, rerende
Cypress.log({ name: 'warning', message })
}
+ // Remove last mounted component if cy.mount is called more than once in a test
+ cleanup()
+
const internalOptions: InternalMountOptions = {
reactDom: ReactDOM,
render: (reactComponent: ReturnType, el: HTMLElement, reactDomToUse: typeof ReactDOM) => {
diff --git a/npm/react18/src/index.ts b/npm/react18/src/index.ts
index ba402fe21a4d..250da700f854 100644
--- a/npm/react18/src/index.ts
+++ b/npm/react18/src/index.ts
@@ -26,6 +26,10 @@ const cleanup = () => {
}
export function mount (jsx: React.ReactNode, options: MountOptions = {}, rerenderKey?: string) {
+ // Remove last mounted component if cy.mount is called more than once in a test
+ // React by default removes the last component when calling render, but we should remove the root
+ // to wipe away any state
+ cleanup()
const internalOptions: InternalMountOptions = {
reactDom: ReactDOM,
render: (reactComponent: ReturnType, el: HTMLElement) => {
diff --git a/npm/svelte/src/mount.ts b/npm/svelte/src/mount.ts
index 3fad1ac21274..2b37d56118bb 100644
--- a/npm/svelte/src/mount.ts
+++ b/npm/svelte/src/mount.ts
@@ -62,6 +62,9 @@ export function mount (
options: MountOptions = {},
): Cypress.Chainable> {
return cy.then(() => {
+ // Remove last mounted component if cy.mount is called more than once in a test
+ cleanup()
+
const target = getContainerEl()
injectStylesBeforeElement(options, document, target)
diff --git a/npm/vue/src/index.ts b/npm/vue/src/index.ts
index e8d09dd337c0..22bd74be68d8 100644
--- a/npm/vue/src/index.ts
+++ b/npm/vue/src/index.ts
@@ -44,6 +44,7 @@ const {
export { VueTestUtils }
const DEFAULT_COMP_NAME = 'unknown'
+const VUE_ROOT = '__cy_vue_root'
type GlobalMountOptions = Required>['global']
@@ -72,24 +73,14 @@ type MountingOptions = Omit, '
export type CyMountOptions = MountingOptions
-Cypress.on('run:start', () => {
- // `mount` is designed to work with component testing only.
- // it assumes ROOT_SELECTOR exists, which is not the case in e2e.
- // if the user registers a custom command that imports `cypress/vue`,
- // this event will be registered and cause an error when the user
- // launches e2e (since it's common to use Cypress for both CT and E2E.
- // https://github.com/cypress-io/cypress/issues/17438
- if (Cypress.testingType !== 'component') {
- return
- }
+const cleanup = () => {
+ Cypress.vueWrapper?.unmount()
+ Cypress.$(`#${VUE_ROOT}`).remove()
- Cypress.on('test:before:run', () => {
- Cypress.vueWrapper?.unmount()
- const el = getContainerEl()
+ ;(Cypress as any).vueWrapper = null
- el.innerHTML = ''
- })
-})
+ ;(Cypress as any).vue = null
+}
/**
* The types for mount have been copied directly from the VTU mount
@@ -378,6 +369,9 @@ export function mount<
// implementation
export function mount (componentOptions: any, options: any = {}) {
+ // Remove last mounted component if cy.mount is called more than once in a test
+ cleanup()
+
// TODO: get the real displayName and props from VTU shallowMount
const componentName = getComponentDisplayName(componentOptions)
@@ -409,7 +403,7 @@ export function mount (componentOptions: any, options: any = {}) {
const componentNode = document.createElement('div')
- componentNode.id = '__cy_vue_root'
+ componentNode.id = VUE_ROOT
el.append(componentNode)
@@ -484,4 +478,4 @@ export function mountCallback (
// import { registerCT } from 'cypress/'
// registerCT()
// Note: This would be a breaking change
-setupHooks()
+setupHooks(cleanup)
diff --git a/npm/vue2/src/index.ts b/npm/vue2/src/index.ts
index d65d72fbfeea..c7d6a5dc9b15 100644
--- a/npm/vue2/src/index.ts
+++ b/npm/vue2/src/index.ts
@@ -5,7 +5,6 @@ import {
mount as testUtilsMount,
VueTestUtilsConfigOptions,
Wrapper,
- enableAutoDestroy,
} from '@vue/test-utils'
import {
injectStylesBeforeElement,
@@ -266,6 +265,10 @@ declare global {
}
}
+const cleanup = () => {
+ Cypress.vueWrapper?.destroy()
+}
+
/**
* Direct Vue errors to the top error handler
* where they will fail Cypress test
@@ -280,14 +283,6 @@ function failTestOnVueError (err, vm, info) {
})
}
-function registerAutoDestroy ($destroy: () => void) {
- Cypress.on('test:before:run', () => {
- $destroy()
- })
-}
-
-enableAutoDestroy(registerAutoDestroy)
-
const injectStyles = (options: StyleOptions) => {
return injectStylesBeforeElement(options, document, getContainerEl())
}
@@ -336,6 +331,9 @@ export const mount = (
wrapper: Wrapper
component: Wrapper['vm']
}> => {
+ // Remove last mounted component if cy.mount is called more than once in a test
+ cleanup()
+
const options: Partial = Cypress._.pick(
optionsOrProps,
defaultOptions,
@@ -442,4 +440,4 @@ export const mountCallback = (
// import { registerCT } from 'cypress/'
// registerCT()
// Note: This would be a breaking change
-setupHooks()
+setupHooks(cleanup)
diff --git a/npm/webpack-dev-server/src/devServer.ts b/npm/webpack-dev-server/src/devServer.ts
index 7efd91fe6994..e7cabad50c17 100644
--- a/npm/webpack-dev-server/src/devServer.ts
+++ b/npm/webpack-dev-server/src/devServer.ts
@@ -137,7 +137,7 @@ async function getPreset (devServerConfig: WebpackDevServerConfig): Promise', { viewportHeight: 150, viewportWidth: 250 }, () => {
it('shows number of passed, skipped, pending and failed tests', () => {
- cy.wrap(Object.keys(CloudRunStubs)).each((cloudRunStub: string) => {
- const res = CloudRunStubs[cloudRunStub]
+ const cloudRuns = Object.values(CloudRunStubs)
- cy.mountFragment(RunCardFragmentDoc, {
- onResult (result) {
- Object.keys(result).forEach((key) => {
- result[key] = res[key]
- })
- },
- render (props) {
- return
- },
- })
+ cy.mount(() => cloudRuns.map((cloudRun, i) => ()))
- cy.get(`[title=${defaultMessages.runs.results.passed}]`).should('contain.text', res.totalPassed)
- cy.get(`[title=${defaultMessages.runs.results.failed}]`).should('contain.text', res.totalFailed)
- cy.get(`[title=${defaultMessages.runs.results.skipped}]`).should('contain.text', res.totalSkipped)
- cy.get(`[title=${defaultMessages.runs.results.pending}`).should('contain.text', res.totalPending)
+ cloudRuns.forEach((cloudRun, i) => {
+ cy.get(`[data-cy=run-result-${i}]`).within(() => {
+ cy.get(`[title=${defaultMessages.runs.results.passed}]`).should('contain.text', cloudRun.totalPassed)
+ cy.get(`[title=${defaultMessages.runs.results.failed}]`).should('contain.text', cloudRun.totalFailed)
+ cy.get(`[title=${defaultMessages.runs.results.skipped}]`).should('contain.text', cloudRun.totalSkipped)
+ cy.get(`[title=${defaultMessages.runs.results.pending}]`).should('contain.text', cloudRun.totalPending)
+ })
})
cy.percySnapshot()
diff --git a/packages/app/src/specs/SpecsListHeader.cy.tsx b/packages/app/src/specs/SpecsListHeader.cy.tsx
index 478f7dedbfe8..981355fcbb68 100644
--- a/packages/app/src/specs/SpecsListHeader.cy.tsx
+++ b/packages/app/src/specs/SpecsListHeader.cy.tsx
@@ -110,27 +110,19 @@ describe('', { keystrokeDelay: 0 }, () => {
})
it('shows the count correctly while searching', () => {
- const mountWithCounts = (resultCount = 0, specCount = 0) => {
- cy.mount(() => ( counts.map(([resultCount, specCount]) => (
+
))
- }
+ /> )))
- mountWithCounts(0, 0)
cy.contains('No matches')
-
- mountWithCounts(0, 22)
cy.contains('0 of 22 matches')
-
- mountWithCounts(0, 1)
cy.contains('0 of 1 match').should('be.visible')
-
- mountWithCounts(1, 1)
cy.contains('1 of 1 match').should('be.visible')
-
- mountWithCounts(5, 22)
cy.contains('5 of 22 matches').should('be.visible')
cy.percySnapshot()
diff --git a/packages/frontend-shared/src/components/Alert.cy.tsx b/packages/frontend-shared/src/components/Alert.cy.tsx
index 52703bfce039..11982e30a313 100644
--- a/packages/frontend-shared/src/components/Alert.cy.tsx
+++ b/packages/frontend-shared/src/components/Alert.cy.tsx
@@ -40,8 +40,11 @@ const suffixIcon = () => test)
- cy.mount(() => test)
+ cy.mount(() =>
+ ())
cy.percySnapshot()
})
diff --git a/system-tests/__snapshots__/component_testing_spec.ts.js b/system-tests/__snapshots__/component_testing_spec.ts.js
index bc67ca486f76..a8c09d0840e4 100644
--- a/system-tests/__snapshots__/component_testing_spec.ts.js
+++ b/system-tests/__snapshots__/component_testing_spec.ts.js
@@ -7,16 +7,17 @@ exports['React major versions with Webpack executes all of the tests for React v
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 4 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx) │
+ │ Specs: 5 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx, │
+ │ mount.cy.jsx) │
│ Searched: src/App.cy.jsx, src/Unmount.cy.jsx, src/UsingLegacyMount.cy.jsx, src/Rerendering.c │
- │ y.jsx │
+ │ y.jsx, src/mount.cy.jsx │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 4)
- 48 modules
+ Running: App.cy.jsx (1 of 5)
+ 49 modules
✓ renders hello world
@@ -48,7 +49,7 @@ exports['React major versions with Webpack executes all of the tests for React v
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (2 of 4)
+ Running: Unmount.cy.jsx (2 of 5)
Comp with componentWillUnmount
@@ -85,7 +86,7 @@ exports['React major versions with Webpack executes all of the tests for React v
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: UsingLegacyMount.cy.jsx (3 of 4)
+ Running: UsingLegacyMount.cy.jsx (3 of 5)
using legacy mount
@@ -118,7 +119,7 @@ exports['React major versions with Webpack executes all of the tests for React v
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (4 of 4)
+ Running: Rerendering.cy.jsx (4 of 5)
re-render
@@ -149,6 +150,41 @@ exports['React major versions with Webpack executes all of the tests for React v
- Finished processing: /XXX/XXX/XXX/cypress/videos/Rerendering.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (5 of 5)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -163,8 +199,10 @@ exports['React major versions with Webpack executes all of the tests for React v
│ ✔ UsingLegacyMount.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✔ All specs passed! XX:XX 7 7 - - -
+ ✔ All specs passed! XX:XX 9 9 - - -
`
@@ -178,16 +216,17 @@ exports['React major versions with Webpack executes all of the tests for React v
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 4 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx) │
+ │ Specs: 5 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx, │
+ │ mount.cy.jsx) │
│ Searched: src/App.cy.jsx, src/Unmount.cy.jsx, src/UsingLegacyMount.cy.jsx, src/Rerendering.c │
- │ y.jsx │
+ │ y.jsx, src/mount.cy.jsx │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 4)
- 45 modules
+ Running: App.cy.jsx (1 of 5)
+ 46 modules
✓ renders hello world
@@ -219,7 +258,7 @@ exports['React major versions with Webpack executes all of the tests for React v
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (2 of 4)
+ Running: Unmount.cy.jsx (2 of 5)
Comp with componentWillUnmount
@@ -256,7 +295,7 @@ exports['React major versions with Webpack executes all of the tests for React v
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: UsingLegacyMount.cy.jsx (3 of 4)
+ Running: UsingLegacyMount.cy.jsx (3 of 5)
using legacy mount
@@ -289,7 +328,7 @@ exports['React major versions with Webpack executes all of the tests for React v
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (4 of 4)
+ Running: Rerendering.cy.jsx (4 of 5)
re-render
@@ -320,6 +359,41 @@ exports['React major versions with Webpack executes all of the tests for React v
- Finished processing: /XXX/XXX/XXX/cypress/videos/Rerendering.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (5 of 5)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -334,8 +408,10 @@ exports['React major versions with Webpack executes all of the tests for React v
│ ✔ UsingLegacyMount.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✔ All specs passed! XX:XX 7 7 - - -
+ ✔ All specs passed! XX:XX 9 9 - - -
`
@@ -349,15 +425,16 @@ exports['React major versions with Vite executes all of the tests for React v17
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 4 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx) │
+ │ Specs: 5 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx, │
+ │ mount.cy.jsx) │
│ Searched: src/App.cy.jsx, src/Unmount.cy.jsx, src/UsingLegacyMount.cy.jsx, src/Rerendering.c │
- │ y.jsx │
+ │ y.jsx, src/mount.cy.jsx │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 4)
+ Running: App.cy.jsx (1 of 5)
✓ renders hello world
@@ -389,7 +466,7 @@ exports['React major versions with Vite executes all of the tests for React v17
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (2 of 4)
+ Running: Unmount.cy.jsx (2 of 5)
Comp with componentWillUnmount
@@ -426,7 +503,7 @@ exports['React major versions with Vite executes all of the tests for React v17
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: UsingLegacyMount.cy.jsx (3 of 4)
+ Running: UsingLegacyMount.cy.jsx (3 of 5)
using legacy mount
@@ -459,7 +536,7 @@ exports['React major versions with Vite executes all of the tests for React v17
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (4 of 4)
+ Running: Rerendering.cy.jsx (4 of 5)
re-render
@@ -490,6 +567,41 @@ exports['React major versions with Vite executes all of the tests for React v17
- Finished processing: /XXX/XXX/XXX/cypress/videos/Rerendering.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (5 of 5)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -504,8 +616,10 @@ exports['React major versions with Vite executes all of the tests for React v17
│ ✔ UsingLegacyMount.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✔ All specs passed! XX:XX 7 7 - - -
+ ✔ All specs passed! XX:XX 9 9 - - -
`
@@ -519,15 +633,16 @@ exports['React major versions with Vite executes all of the tests for React v18
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 4 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx) │
+ │ Specs: 5 found (App.cy.jsx, Unmount.cy.jsx, UsingLegacyMount.cy.jsx, Rerendering.cy.jsx, │
+ │ mount.cy.jsx) │
│ Searched: src/App.cy.jsx, src/Unmount.cy.jsx, src/UsingLegacyMount.cy.jsx, src/Rerendering.c │
- │ y.jsx │
+ │ y.jsx, src/mount.cy.jsx │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 4)
+ Running: App.cy.jsx (1 of 5)
✓ renders hello world
@@ -559,7 +674,7 @@ exports['React major versions with Vite executes all of the tests for React v18
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (2 of 4)
+ Running: Unmount.cy.jsx (2 of 5)
Comp with componentWillUnmount
@@ -596,7 +711,7 @@ exports['React major versions with Vite executes all of the tests for React v18
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: UsingLegacyMount.cy.jsx (3 of 4)
+ Running: UsingLegacyMount.cy.jsx (3 of 5)
using legacy mount
@@ -629,7 +744,7 @@ exports['React major versions with Vite executes all of the tests for React v18
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (4 of 4)
+ Running: Rerendering.cy.jsx (4 of 5)
re-render
@@ -660,6 +775,41 @@ exports['React major versions with Vite executes all of the tests for React v18
- Finished processing: /XXX/XXX/XXX/cypress/videos/Rerendering.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (5 of 5)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -674,8 +824,10 @@ exports['React major versions with Vite executes all of the tests for React v18
│ ✔ UsingLegacyMount.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✔ All specs passed! XX:XX 7 7 - - -
+ ✔ All specs passed! XX:XX 9 9 - - -
`
diff --git a/system-tests/__snapshots__/vite_dev_server_fresh_spec.ts.js b/system-tests/__snapshots__/vite_dev_server_fresh_spec.ts.js
index a847bb3725e6..8e0d03dcf76a 100644
--- a/system-tests/__snapshots__/vite_dev_server_fresh_spec.ts.js
+++ b/system-tests/__snapshots__/vite_dev_server_fresh_spec.ts.js
@@ -7,15 +7,15 @@ exports['@cypress/vite-dev-server react executes all of the tests for vite3.0.2-
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
+ Running: App.cy.jsx (1 of 8)
✓ renders hello world
@@ -47,7 +47,7 @@ exports['@cypress/vite-dev-server react executes all of the tests for vite3.0.2-
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -99,7 +99,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -193,7 +193,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -245,7 +245,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -289,7 +289,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -322,7 +322,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -357,6 +357,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -377,8 +412,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
@@ -392,15 +429,15 @@ exports['@cypress/vite-dev-server react executes all of the tests for vite2.8.6-
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
+ Running: App.cy.jsx (1 of 8)
✓ renders hello world
@@ -432,7 +469,7 @@ exports['@cypress/vite-dev-server react executes all of the tests for vite2.8.6-
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -484,7 +521,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -578,7 +615,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -630,7 +667,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -674,7 +711,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -707,7 +744,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -742,6 +779,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -762,8 +834,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
@@ -777,15 +851,15 @@ exports['@cypress/vite-dev-server react executes all of the tests for vite2.9.1-
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
+ Running: App.cy.jsx (1 of 8)
✓ renders hello world
@@ -817,7 +891,7 @@ exports['@cypress/vite-dev-server react executes all of the tests for vite2.9.1-
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -869,7 +943,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -963,7 +1037,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -1015,7 +1089,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -1059,7 +1133,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -1092,7 +1166,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -1127,6 +1201,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -1147,8 +1256,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
diff --git a/system-tests/__snapshots__/webpack_dev_server_fresh_spec.ts.js b/system-tests/__snapshots__/webpack_dev_server_fresh_spec.ts.js
index d10123e554e8..b6822aac2175 100644
--- a/system-tests/__snapshots__/webpack_dev_server_fresh_spec.ts.js
+++ b/system-tests/__snapshots__/webpack_dev_server_fresh_spec.ts.js
@@ -10,15 +10,15 @@ exports['@cypress/webpack-dev-server react executes all of the tests for webpack
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
+ Running: App.cy.jsx (1 of 8)
✓ renders hello world
@@ -50,7 +50,7 @@ exports['@cypress/webpack-dev-server react executes all of the tests for webpack
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -110,7 +110,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -204,7 +204,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -256,7 +256,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -300,7 +300,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -333,7 +333,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -368,6 +368,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -388,8 +423,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
@@ -403,16 +440,16 @@ exports['@cypress/webpack-dev-server react executes all of the tests for webpack
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
- 49 modules
+ Running: App.cy.jsx (1 of 8)
+ 50 modules
ERROR in ./src/AppCompilationError.cy.jsx
Module build failed (from [..]):
@@ -455,7 +492,7 @@ SyntaxError: /foo/bar/.projects/webpack4_wds4-react/src/AppCompilationError.cy.j
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -515,7 +552,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -609,7 +646,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -661,7 +698,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -705,7 +742,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -738,7 +775,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -773,6 +810,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -793,8 +865,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
@@ -811,15 +885,15 @@ exports['@cypress/webpack-dev-server react executes all of the tests for webpack
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
+ Running: App.cy.jsx (1 of 8)
✓ renders hello world
@@ -851,7 +925,7 @@ exports['@cypress/webpack-dev-server react executes all of the tests for webpack
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -911,7 +985,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -1005,7 +1079,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -1057,7 +1131,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -1101,7 +1175,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -1134,7 +1208,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -1169,6 +1243,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -1189,8 +1298,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
@@ -1204,17 +1315,17 @@ exports['@cypress/webpack-dev-server react executes all of the tests for webpack
┌────────────────────────────────────────────────────────────────────────────────────────────────┐
│ Cypress: 1.2.3 │
│ Browser: FooBrowser 88 │
- │ Specs: 7 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
- │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx) │
+ │ Specs: 8 found (App.cy.jsx, AppCompilationError.cy.jsx, Errors.cy.jsx, MissingReact.cy.js │
+ │ x, MissingReactInSpec.cy.jsx, Rerendering.cy.jsx, Unmount.cy.jsx, mount.cy.jsx) │
│ Searched: **/*.cy.{js,jsx,ts,tsx} │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: App.cy.jsx (1 of 7)
-14 assets
-65 modules
+ Running: App.cy.jsx (1 of 8)
+15 assets
+66 modules
ERROR in ./src/AppCompilationError.cy.jsx
Module build failed (from [..]):
@@ -1259,7 +1370,7 @@ webpack x.x.x compiled with x errors in xxx ms
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: AppCompilationError.cy.jsx (2 of 7)
+ Running: AppCompilationError.cy.jsx (2 of 8)
1) An uncaught error was detected outside of a test
@@ -1319,7 +1430,7 @@ We dynamically generated a new test to display this failure.
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Errors.cy.jsx (3 of 7)
+ Running: Errors.cy.jsx (3 of 8)
Errors
@@ -1413,7 +1524,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReact.cy.jsx (4 of 7)
+ Running: MissingReact.cy.jsx (4 of 8)
1) is missing React
@@ -1465,7 +1576,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: MissingReactInSpec.cy.jsx (5 of 7)
+ Running: MissingReactInSpec.cy.jsx (5 of 8)
1) is missing React in this file
@@ -1509,7 +1620,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Rerendering.cy.jsx (6 of 7)
+ Running: Rerendering.cy.jsx (6 of 8)
re-render
@@ -1542,7 +1653,7 @@ https://on.cypress.io/uncaught-exception-from-application
────────────────────────────────────────────────────────────────────────────────────────────────────
- Running: Unmount.cy.jsx (7 of 7)
+ Running: Unmount.cy.jsx (7 of 8)
Comp with componentWillUnmount
@@ -1577,6 +1688,41 @@ https://on.cypress.io/uncaught-exception-from-application
- Finished processing: /XXX/XXX/XXX/cypress/videos/Unmount.cy.jsx.mp4 (X second)
+────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Running: mount.cy.jsx (8 of 8)
+
+
+ mount
+ teardown
+ ✓ should mount
+ ✓ should remove previous mounted component
+
+
+ 2 passing
+
+
+ (Results)
+
+ ┌────────────────────────────────────────────────────────────────────────────────────────────────┐
+ │ Tests: 2 │
+ │ Passing: 2 │
+ │ Failing: 0 │
+ │ Pending: 0 │
+ │ Skipped: 0 │
+ │ Screenshots: 0 │
+ │ Video: true │
+ │ Duration: X seconds │
+ │ Spec Ran: mount.cy.jsx │
+ └────────────────────────────────────────────────────────────────────────────────────────────────┘
+
+
+ (Video)
+
+ - Started processing: Compressing to 32 CRF
+ - Finished processing: /XXX/XXX/XXX/cypress/videos/mount.cy.jsx.mp4 (X second)
+
+
====================================================================================================
(Run Finished)
@@ -1597,8 +1743,10 @@ https://on.cypress.io/uncaught-exception-from-application
│ ✔ Rerendering.cy.jsx XX:XX 1 1 - - - │
├────────────────────────────────────────────────────────────────────────────────────────────────┤
│ ✔ Unmount.cy.jsx XX:XX 3 3 - - - │
+ ├────────────────────────────────────────────────────────────────────────────────────────────────┤
+ │ ✔ mount.cy.jsx XX:XX 2 2 - - - │
└────────────────────────────────────────────────────────────────────────────────────────────────┘
- ✖ 4 of 7 failed (57%) XX:XX 13 6 7 - -
+ ✖ 4 of 8 failed (50%) XX:XX 15 8 7 - -
`
diff --git a/system-tests/project-fixtures/angular/src/app/mount.cy.ts b/system-tests/project-fixtures/angular/src/app/mount.cy.ts
index abfe151c3a79..1c152d217c9b 100644
--- a/system-tests/project-fixtures/angular/src/app/mount.cy.ts
+++ b/system-tests/project-fixtures/angular/src/app/mount.cy.ts
@@ -430,11 +430,21 @@ describe('angular mount', () => {
describe('teardown', () => {
beforeEach(() => {
- cy.get('[id^=root]').should('not.exist')
- })
+ cy.get("[id^=root]").should("not.exist");
+ });
+
+ it("should mount", () => {
+ cy.mount(ButtonOutputComponent);
+ });
+
+ it('should remove previous mounted component', () => {
+ cy.mount(ChildComponent, {componentProperties: { msg: 'Render 1' }})
+ cy.contains('Render 1')
+ cy.mount(ChildComponent, {componentProperties: { msg: 'Render 2' }})
+ cy.contains('Render 2')
- it('should mount', () => {
- cy.mount(ButtonOutputComponent)
+ cy.contains('Render 1').should('not.exist')
+ cy.get('[id^=root]').children().should('have.length', 1)
})
- })
-})
+ });
+});
diff --git a/system-tests/project-fixtures/react/src/mount.cy.jsx b/system-tests/project-fixtures/react/src/mount.cy.jsx
new file mode 100644
index 000000000000..52d5afa6cd82
--- /dev/null
+++ b/system-tests/project-fixtures/react/src/mount.cy.jsx
@@ -0,0 +1,27 @@
+import React from 'react'
+
+const HelloWorld = ({ msg }) => {
+ return {msg}
+}
+
+describe('mount', () => {
+ context('teardown', () => {
+ beforeEach(() => {
+ cy.get('[data-cy-root]').children().should('have.length', 0)
+ });
+
+ it('should mount', () => {
+ cy.mount()
+ });
+
+ it('should remove previous mounted component', () => {
+ cy.mount()
+ cy.contains('Render 1')
+ cy.mount()
+ cy.contains('Render 2')
+
+ cy.contains('Render 1').should('not.exist')
+ cy.get('[data-cy-root]').children().should('have.length', 1)
+ })
+ });
+})
\ No newline at end of file
diff --git a/system-tests/project-fixtures/svelte/src/mount.cy.js b/system-tests/project-fixtures/svelte/src/mount.cy.js
index d5e004820438..7faa41290063 100644
--- a/system-tests/project-fixtures/svelte/src/mount.cy.js
+++ b/system-tests/project-fixtures/svelte/src/mount.cy.js
@@ -1,86 +1,107 @@
-import Counter from "./Counter.svelte";
-import Context from "./Context.svelte";
-import Store from "./Store.svelte";
-import { messageStore } from "./store";
+import Counter from './Counter.svelte';
+import Context from './Context.svelte';
+import Store from './Store.svelte';
+import { messageStore } from './store';
-describe("Svelte mount", () => {
- it("mounts", () => {
+describe('Svelte mount', () => {
+ it('mounts', () => {
cy.mount(Counter)
- cy.contains("h1", "Count is 0");
+ cy.contains('h1', 'Count is 0');
});
- it("reacts to state changes", () => {
+ it('reacts to state changes', () => {
cy.mount(Counter);
- cy.contains("h1", "Count is 0");
- cy.get("button").click();
- cy.contains("h1", "Count is 1");
+ cy.contains('h1', 'Count is 0');
+ cy.get('button').click();
+ cy.contains('h1', 'Count is 1');
});
- it("accepts props", () => {
+ it('accepts props', () => {
cy.mount(Counter, { props: { count: 42 } });
- cy.contains("h1", "Count is 42");
+ cy.contains('h1', 'Count is 42');
});
- it("accepts context", () => {
- const payload = { msg: "This value came from context!" };
+ it('accepts context', () => {
+ const payload = { msg: 'This value came from context!' };
const context = new Map();
- context.set("myKey", payload);
+ context.set('myKey', payload);
cy.mount(Context, { context });
- cy.contains("h1", payload.msg);
+ cy.contains('h1', payload.msg);
});
- it("spies on outputs", () => {
+ it('spies on outputs', () => {
cy.mount(Counter).then(({ component }) => {
- component.$on("change", cy.spy().as("changeSpy"));
- cy.get("button").click();
- cy.get("@changeSpy").should("have.been.called");
+ component.$on('change', cy.spy().as('changeSpy'));
+ cy.get('button').click();
+ cy.get('@changeSpy').should('have.been.called');
});
});
- it("anchors mounted component", () => {
- cy.mount(Counter, { anchor: document.getElementById("anchor") });
- cy.get("[data-cy-root]").children().last().should("have.id", "anchor");
+ it('anchors mounted component', () => {
+ cy.mount(Counter, { anchor: document.getElementById('anchor') });
+ cy.get('[data-cy-root]').children().last().should('have.id', 'anchor');
});
- it("reactive to writables", () => {
+ it('reactive to writables', () => {
cy.mount(Store);
- cy.contains("h1", "Hello World!");
+ cy.contains('h1', 'Hello World!');
- cy.get("input").clear().type("New Message");
- cy.contains("h1", "New Message");
+ cy.get('input').clear().type('New Message');
+ cy.contains('h1', 'New Message');
- cy.then(() => messageStore.set("Written from spec"));
- cy.contains("h1", "Written from spec");
+ cy.then(() => messageStore.set('Written from spec'));
+ cy.contains('h1', 'Written from spec');
});
- context("log", () => {
- it("displays component name in mount log", () => {
+ context('log', () => {
+ it('displays component name in mount log', () => {
cy.mount(Counter);
cy.wrap(Cypress.$(window.top.document.body)).within(() =>
cy
- .contains("displays component name in mount log")
- .closest(".collapsible")
+ .contains('displays component name in mount log')
+ .closest('.collapsible')
.click()
.within(() =>
cy
- .get(".command-name-mount")
- .should("contain", "mount")
+ .get('.command-name-mount')
+ .should('contain', 'mount')
)
);
});
- it("does not display mount log", () => {
+ it('does not display mount log', () => {
cy.mount(Counter, { log: false });
cy.wrap(Cypress.$(window.top.document.body)).within(() =>
cy
- .contains("does not display mount log")
- .closest(".collapsible")
+ .contains('does not display mount log')
+ .closest('.collapsible')
.click()
- .within(() => cy.get(".command-name-mount").should("not.exist"))
+ .within(() => cy.get('.command-name-mount').should('not.exist'))
);
});
});
+
+ context('teardown', () => {
+ beforeEach(() => {
+ // component-index.html has anchor element within [data-cy-root] so base # of elements is 1
+ cy.get('[data-cy-root]').children().should('have.length', 1)
+ })
+
+ it('should mount', () => {
+ cy.mount(Counter);
+ });
+
+ it('should remove previous mounted component', () => {
+ cy.mount(Counter);
+ cy.contains('h1', 'Count is 0')
+ cy.mount(Counter, {props: { count: 42 }})
+ cy.contains('h1', 'Count is 42')
+
+ cy.contains('h1', 'Count is 0').should('not.exist')
+ cy.get('[data-cy-root]').children().should('have.length', 2)
+ })
+ })
});
diff --git a/system-tests/project-fixtures/vue/cypress.config.js b/system-tests/project-fixtures/vue/cypress.config.js
new file mode 100644
index 000000000000..00667cbf4ba5
--- /dev/null
+++ b/system-tests/project-fixtures/vue/cypress.config.js
@@ -0,0 +1,10 @@
+import { defineConfig } from 'cypress'
+
+export default defineConfig({
+ component: {
+ devServer: {
+ framework: 'vue',
+ bundler: 'vite'
+ }
+ },
+})
\ No newline at end of file
diff --git a/system-tests/project-fixtures/vue/cypress/support/component-index.html b/system-tests/project-fixtures/vue/cypress/support/component-index.html
new file mode 100644
index 000000000000..ac6e79fd83df
--- /dev/null
+++ b/system-tests/project-fixtures/vue/cypress/support/component-index.html
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ Components App
+
+
+
+
+
\ No newline at end of file
diff --git a/system-tests/project-fixtures/vue/cypress/support/component.js b/system-tests/project-fixtures/vue/cypress/support/component.js
new file mode 100644
index 000000000000..02df2616980b
--- /dev/null
+++ b/system-tests/project-fixtures/vue/cypress/support/component.js
@@ -0,0 +1,3 @@
+import { mount } from 'cypress/vue'
+
+Cypress.Commands.add('mount', mount)
\ No newline at end of file
diff --git a/system-tests/project-fixtures/vue/index.html b/system-tests/project-fixtures/vue/index.html
new file mode 100644
index 000000000000..795e4fbadb88
--- /dev/null
+++ b/system-tests/project-fixtures/vue/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+ Vite + Vue
+
+
+
+
+
+
diff --git a/system-tests/project-fixtures/vue/src/App.vue b/system-tests/project-fixtures/vue/src/App.vue
new file mode 100644
index 000000000000..54ae4a6ed7b6
--- /dev/null
+++ b/system-tests/project-fixtures/vue/src/App.vue
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
diff --git a/system-tests/project-fixtures/vue/src/components/HelloWorld.vue b/system-tests/project-fixtures/vue/src/components/HelloWorld.vue
new file mode 100644
index 000000000000..1f3ce021da8a
--- /dev/null
+++ b/system-tests/project-fixtures/vue/src/components/HelloWorld.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
{{ msg }}
+
+
+
+
+
diff --git a/system-tests/project-fixtures/vue/src/main.js b/system-tests/project-fixtures/vue/src/main.js
new file mode 100644
index 000000000000..b670de8b8da5
--- /dev/null
+++ b/system-tests/project-fixtures/vue/src/main.js
@@ -0,0 +1,4 @@
+import { createApp } from "vue";
+import App from "./App.vue";
+
+createApp(App).mount("#app");
diff --git a/system-tests/project-fixtures/vue/src/mount.cy.js b/system-tests/project-fixtures/vue/src/mount.cy.js
new file mode 100644
index 000000000000..8f206ded0e05
--- /dev/null
+++ b/system-tests/project-fixtures/vue/src/mount.cy.js
@@ -0,0 +1,26 @@
+import HelloWorld from "./components/HelloWorld.vue";
+
+describe("mount", () => {
+ context("teardown", () => {
+ beforeEach(() => {
+ cy.get("[data-cy-root]").children().should("have.length", 0);
+ });
+
+ it("should mount", () => {
+ cy.mount(HelloWorld);
+ });
+
+ it("should remove previous mounted component", () => {
+ // hack for vue2 vs vue mount
+ const props = (props) => ({props, propsData: props})
+
+ cy.mount(HelloWorld, props({ msg: "Render 1" }));
+ cy.contains("h1", "Render 1");
+ cy.mount(HelloWorld, props({ msg: "Render 2" }));
+ cy.contains("h1", "Render 2");
+
+ cy.contains("h1", "Render 1").should("not.exist");
+ cy.get("[data-cy-root]").children().should("have.length", 1);
+ });
+ });
+});
diff --git a/system-tests/projects/vue2/cypress/support/component.js b/system-tests/projects/vue2/cypress/support/component.js
new file mode 100644
index 000000000000..abf5ce5089a0
--- /dev/null
+++ b/system-tests/projects/vue2/cypress/support/component.js
@@ -0,0 +1,3 @@
+import { mount } from 'cypress/vue2'
+
+Cypress.Commands.add('mount', mount)
diff --git a/system-tests/projects/vue2/package.json b/system-tests/projects/vue2/package.json
new file mode 100644
index 000000000000..c92d69a5f109
--- /dev/null
+++ b/system-tests/projects/vue2/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "vue-vite",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "vue": "^2.7.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue2": "^2.0.0",
+ "vite": "^3.2.0"
+ },
+ "type": "module",
+ "projectFixtureDirectory": "vue"
+}
diff --git a/system-tests/projects/vue2/vite.config.js b/system-tests/projects/vue2/vite.config.js
new file mode 100644
index 000000000000..7b7b5cd9b579
--- /dev/null
+++ b/system-tests/projects/vue2/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue2'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [vue()],
+})
diff --git a/system-tests/projects/vue2/yarn.lock b/system-tests/projects/vue2/yarn.lock
new file mode 100644
index 000000000000..8a1d49278310
--- /dev/null
+++ b/system-tests/projects/vue2/yarn.lock
@@ -0,0 +1,264 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/parser@^7.18.4":
+ version "7.20.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.0.tgz#b26133c888da4d79b0d3edcf42677bcadc783046"
+ integrity sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg==
+
+"@esbuild/android-arm@0.15.12":
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769"
+ integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==
+
+"@esbuild/linux-loong64@0.15.12":
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1"
+ integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==
+
+"@vitejs/plugin-vue2@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue2/-/plugin-vue2-2.0.0.tgz#f7477daa494e5cd2ec3566bcadd601f5d6ec43bc"
+ integrity sha512-VJOCDtBNcRv7kYLQRbbERDP0OqW0EKgMQp6wwbqZRpU3kg38OP891avx6Xl3szntGkf9mK4i8k3TjsAlmkzWFg==
+
+"@vue/compiler-sfc@2.7.13":
+ version "2.7.13"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-2.7.13.tgz#818944f4a9616b752d48dac6a56bffe2db88bdff"
+ integrity sha512-zzu2rLRZlgIU+OT3Atbr7Y6PG+LW4wVQpPfNRrGDH3dM9PsrcVfa+1pKb8bW467bGM3aDOvAnsYLWVpYIv3GRg==
+ dependencies:
+ "@babel/parser" "^7.18.4"
+ postcss "^8.4.14"
+ source-map "^0.6.1"
+
+csstype@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9"
+ integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==
+
+esbuild-android-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc"
+ integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==
+
+esbuild-android-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666"
+ integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==
+
+esbuild-darwin-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25"
+ integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==
+
+esbuild-darwin-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04"
+ integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==
+
+esbuild-freebsd-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0"
+ integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==
+
+esbuild-freebsd-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e"
+ integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==
+
+esbuild-linux-32@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4"
+ integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==
+
+esbuild-linux-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931"
+ integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==
+
+esbuild-linux-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5"
+ integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==
+
+esbuild-linux-arm@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67"
+ integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==
+
+esbuild-linux-mips64le@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2"
+ integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==
+
+esbuild-linux-ppc64le@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7"
+ integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==
+
+esbuild-linux-riscv64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693"
+ integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==
+
+esbuild-linux-s390x@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f"
+ integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==
+
+esbuild-netbsd-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42"
+ integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==
+
+esbuild-openbsd-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae"
+ integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==
+
+esbuild-sunos-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e"
+ integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==
+
+esbuild-windows-32@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0"
+ integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==
+
+esbuild-windows-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6"
+ integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==
+
+esbuild-windows-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328"
+ integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==
+
+esbuild@^0.15.9:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c"
+ integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.15.12"
+ "@esbuild/linux-loong64" "0.15.12"
+ esbuild-android-64 "0.15.12"
+ esbuild-android-arm64 "0.15.12"
+ esbuild-darwin-64 "0.15.12"
+ esbuild-darwin-arm64 "0.15.12"
+ esbuild-freebsd-64 "0.15.12"
+ esbuild-freebsd-arm64 "0.15.12"
+ esbuild-linux-32 "0.15.12"
+ esbuild-linux-64 "0.15.12"
+ esbuild-linux-arm "0.15.12"
+ esbuild-linux-arm64 "0.15.12"
+ esbuild-linux-mips64le "0.15.12"
+ esbuild-linux-ppc64le "0.15.12"
+ esbuild-linux-riscv64 "0.15.12"
+ esbuild-linux-s390x "0.15.12"
+ esbuild-netbsd-64 "0.15.12"
+ esbuild-openbsd-64 "0.15.12"
+ esbuild-sunos-64 "0.15.12"
+ esbuild-windows-32 "0.15.12"
+ esbuild-windows-64 "0.15.12"
+ esbuild-windows-arm64 "0.15.12"
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+is-core-module@^2.9.0:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
+ integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+ dependencies:
+ has "^1.0.3"
+
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+postcss@^8.4.14, postcss@^8.4.18:
+ version "8.4.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2"
+ integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+resolve@^1.22.1:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^2.79.1:
+ version "2.79.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
+ integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+vite@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.1.tgz#dc1f54568300a7acdd89c8611e2719c21f1334f4"
+ integrity sha512-ADtMkfHuWq4tskJsri2n2FZkORO8ZyhI+zIz7zTrDAgDEtct1jdxOg3YsZBfHhKjmMoWLOSCr+64qrEDGo/DbQ==
+ dependencies:
+ esbuild "^0.15.9"
+ postcss "^8.4.18"
+ resolve "^1.22.1"
+ rollup "^2.79.1"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+vue@^2.7.0:
+ version "2.7.13"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-2.7.13.tgz#e9e499cc6da46dc7941c2510193b15aa6a84a79f"
+ integrity sha512-QnM6ULTNnPmn71eUO+4hdjfBIA3H0GLsBnchnI/kS678tjI45GOUZhXd0oP/gX9isikXz1PAzSnkPspp9EUNfQ==
+ dependencies:
+ "@vue/compiler-sfc" "2.7.13"
+ csstype "^3.1.0"
diff --git a/system-tests/projects/vue3/package.json b/system-tests/projects/vue3/package.json
new file mode 100644
index 000000000000..c5871df55c92
--- /dev/null
+++ b/system-tests/projects/vue3/package.json
@@ -0,0 +1,19 @@
+{
+ "name": "vue-vite",
+ "version": "0.0.0",
+ "private": true,
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "vue": "^3.2.41"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-vue": "^3.2.0",
+ "vite": "^3.2.0"
+ },
+ "type": "module",
+ "projectFixtureDirectory": "vue"
+}
diff --git a/system-tests/projects/vue3/vite.config.js b/system-tests/projects/vue3/vite.config.js
new file mode 100644
index 000000000000..05c17402a4a9
--- /dev/null
+++ b/system-tests/projects/vue3/vite.config.js
@@ -0,0 +1,7 @@
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [vue()],
+})
diff --git a/system-tests/projects/vue3/yarn.lock b/system-tests/projects/vue3/yarn.lock
new file mode 100644
index 000000000000..7617da456de6
--- /dev/null
+++ b/system-tests/projects/vue3/yarn.lock
@@ -0,0 +1,365 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@babel/parser@^7.16.4":
+ version "7.20.0"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.0.tgz#b26133c888da4d79b0d3edcf42677bcadc783046"
+ integrity sha512-G9VgAhEaICnz8iiJeGJQyVl6J2nTjbW0xeisva0PK6XcKsga7BIaqm4ZF8Rg1Wbaqmy6znspNqhPaPkyukujzg==
+
+"@esbuild/android-arm@0.15.12":
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz#e548b10a5e55b9e10537a049ebf0bc72c453b769"
+ integrity sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==
+
+"@esbuild/linux-loong64@0.15.12":
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz#475b33a2631a3d8ca8aa95ee127f9a61d95bf9c1"
+ integrity sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==
+
+"@vitejs/plugin-vue@^3.2.0":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz#a1484089dd85d6528f435743f84cdd0d215bbb54"
+ integrity sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==
+
+"@vue/compiler-core@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-core/-/compiler-core-3.2.41.tgz#fb5b25f23817400f44377d878a0cdead808453ef"
+ integrity sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/shared" "3.2.41"
+ estree-walker "^2.0.2"
+ source-map "^0.6.1"
+
+"@vue/compiler-dom@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz#dc63dcd3ce8ca8a8721f14009d498a7a54380299"
+ integrity sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==
+ dependencies:
+ "@vue/compiler-core" "3.2.41"
+ "@vue/shared" "3.2.41"
+
+"@vue/compiler-sfc@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz#238fb8c48318408c856748f4116aff8cc1dc2a73"
+ integrity sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/compiler-core" "3.2.41"
+ "@vue/compiler-dom" "3.2.41"
+ "@vue/compiler-ssr" "3.2.41"
+ "@vue/reactivity-transform" "3.2.41"
+ "@vue/shared" "3.2.41"
+ estree-walker "^2.0.2"
+ magic-string "^0.25.7"
+ postcss "^8.1.10"
+ source-map "^0.6.1"
+
+"@vue/compiler-ssr@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz#344f564d68584b33367731c04ffc949784611fcb"
+ integrity sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==
+ dependencies:
+ "@vue/compiler-dom" "3.2.41"
+ "@vue/shared" "3.2.41"
+
+"@vue/reactivity-transform@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz#9ff938877600c97f646e09ac1959b5150fb11a0c"
+ integrity sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==
+ dependencies:
+ "@babel/parser" "^7.16.4"
+ "@vue/compiler-core" "3.2.41"
+ "@vue/shared" "3.2.41"
+ estree-walker "^2.0.2"
+ magic-string "^0.25.7"
+
+"@vue/reactivity@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/reactivity/-/reactivity-3.2.41.tgz#0ad3bdf76d76822da1502dc9f394dafd02642963"
+ integrity sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==
+ dependencies:
+ "@vue/shared" "3.2.41"
+
+"@vue/runtime-core@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-core/-/runtime-core-3.2.41.tgz#775bfc00b3fadbaddab77138f23322aee3517a76"
+ integrity sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==
+ dependencies:
+ "@vue/reactivity" "3.2.41"
+ "@vue/shared" "3.2.41"
+
+"@vue/runtime-dom@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz#cdf86be7410f7b15c29632a96ce879e5b4c9ab92"
+ integrity sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==
+ dependencies:
+ "@vue/runtime-core" "3.2.41"
+ "@vue/shared" "3.2.41"
+ csstype "^2.6.8"
+
+"@vue/server-renderer@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/server-renderer/-/server-renderer-3.2.41.tgz#ca64552c05878f94e8d191ac439141c06c0fb2ad"
+ integrity sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==
+ dependencies:
+ "@vue/compiler-ssr" "3.2.41"
+ "@vue/shared" "3.2.41"
+
+"@vue/shared@3.2.41":
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.41.tgz#fbc95422df654ea64e8428eced96ba6ad555d2bb"
+ integrity sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw==
+
+csstype@^2.6.8:
+ version "2.6.21"
+ resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e"
+ integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==
+
+esbuild-android-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz#5e8151d5f0a748c71a7fbea8cee844ccf008e6fc"
+ integrity sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==
+
+esbuild-android-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz#5ee72a6baa444bc96ffcb472a3ba4aba2cc80666"
+ integrity sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==
+
+esbuild-darwin-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz#70047007e093fa1b3ba7ef86f9b3fa63db51fe25"
+ integrity sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==
+
+esbuild-darwin-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz#41c951f23d9a70539bcca552bae6e5196696ae04"
+ integrity sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==
+
+esbuild-freebsd-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz#a761b5afd12bbedb7d56c612e9cfa4d2711f33f0"
+ integrity sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==
+
+esbuild-freebsd-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz#6b0839d4d58deabc6cbd96276eb8cbf94f7f335e"
+ integrity sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==
+
+esbuild-linux-32@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz#bd50bfe22514d434d97d5150977496e2631345b4"
+ integrity sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==
+
+esbuild-linux-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz#074bb2b194bf658245f8490f29c01ffcdfa8c931"
+ integrity sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==
+
+esbuild-linux-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz#3bf789c4396dc032875a122988efd6f3733f28f5"
+ integrity sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==
+
+esbuild-linux-arm@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz#b91b5a8d470053f6c2c9c8a5e67ec10a71fe4a67"
+ integrity sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==
+
+esbuild-linux-mips64le@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz#2fb54099ada3c950a7536dfcba46172c61e580e2"
+ integrity sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==
+
+esbuild-linux-ppc64le@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz#9e3b8c09825fb27886249dfb3142a750df29a1b7"
+ integrity sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==
+
+esbuild-linux-riscv64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz#923d0f5b6e12ee0d1fe116b08e4ae4478fe40693"
+ integrity sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==
+
+esbuild-linux-s390x@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz#3b1620220482b96266a0c6d9d471d451a1eab86f"
+ integrity sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==
+
+esbuild-netbsd-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz#276730f80da646859b1af5a740e7802d8cd73e42"
+ integrity sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==
+
+esbuild-openbsd-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz#bd0eea1dd2ca0722ed489d88c26714034429f8ae"
+ integrity sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==
+
+esbuild-sunos-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz#5e56bf9eef3b2d92360d6d29dcde7722acbecc9e"
+ integrity sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==
+
+esbuild-windows-32@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz#a4f1a301c1a2fa7701fcd4b91ef9d2620cf293d0"
+ integrity sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==
+
+esbuild-windows-64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz#bc2b467541744d653be4fe64eaa9b0dbbf8e07f6"
+ integrity sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==
+
+esbuild-windows-arm64@0.15.12:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz#9a7266404334a86be800957eaee9aef94c3df328"
+ integrity sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==
+
+esbuild@^0.15.9:
+ version "0.15.12"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.15.12.tgz#6c8e22d6d3b7430d165c33848298d3fc9a1f251c"
+ integrity sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==
+ optionalDependencies:
+ "@esbuild/android-arm" "0.15.12"
+ "@esbuild/linux-loong64" "0.15.12"
+ esbuild-android-64 "0.15.12"
+ esbuild-android-arm64 "0.15.12"
+ esbuild-darwin-64 "0.15.12"
+ esbuild-darwin-arm64 "0.15.12"
+ esbuild-freebsd-64 "0.15.12"
+ esbuild-freebsd-arm64 "0.15.12"
+ esbuild-linux-32 "0.15.12"
+ esbuild-linux-64 "0.15.12"
+ esbuild-linux-arm "0.15.12"
+ esbuild-linux-arm64 "0.15.12"
+ esbuild-linux-mips64le "0.15.12"
+ esbuild-linux-ppc64le "0.15.12"
+ esbuild-linux-riscv64 "0.15.12"
+ esbuild-linux-s390x "0.15.12"
+ esbuild-netbsd-64 "0.15.12"
+ esbuild-openbsd-64 "0.15.12"
+ esbuild-sunos-64 "0.15.12"
+ esbuild-windows-32 "0.15.12"
+ esbuild-windows-64 "0.15.12"
+ esbuild-windows-arm64 "0.15.12"
+
+estree-walker@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac"
+ integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+is-core-module@^2.9.0:
+ version "2.11.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144"
+ integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==
+ dependencies:
+ has "^1.0.3"
+
+magic-string@^0.25.7:
+ version "0.25.9"
+ resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.9.tgz#de7f9faf91ef8a1c91d02c2e5314c8277dbcdd1c"
+ integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==
+ dependencies:
+ sourcemap-codec "^1.4.8"
+
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+postcss@^8.1.10, postcss@^8.4.18:
+ version "8.4.18"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.18.tgz#6d50046ea7d3d66a85e0e782074e7203bc7fbca2"
+ integrity sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+resolve@^1.22.1:
+ version "1.22.1"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rollup@^2.79.1:
+ version "2.79.1"
+ resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.79.1.tgz#bedee8faef7c9f93a2647ac0108748f497f081c7"
+ integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+sourcemap-codec@^1.4.8:
+ version "1.4.8"
+ resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
+ integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+vite@^3.2.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/vite/-/vite-3.2.1.tgz#dc1f54568300a7acdd89c8611e2719c21f1334f4"
+ integrity sha512-ADtMkfHuWq4tskJsri2n2FZkORO8ZyhI+zIz7zTrDAgDEtct1jdxOg3YsZBfHhKjmMoWLOSCr+64qrEDGo/DbQ==
+ dependencies:
+ esbuild "^0.15.9"
+ postcss "^8.4.18"
+ resolve "^1.22.1"
+ rollup "^2.79.1"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+vue@^3.2.41:
+ version "3.2.41"
+ resolved "https://registry.yarnpkg.com/vue/-/vue-3.2.41.tgz#ed452b8a0f7f2b962f055c8955139c28b1c06806"
+ integrity sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==
+ dependencies:
+ "@vue/compiler-dom" "3.2.41"
+ "@vue/compiler-sfc" "3.2.41"
+ "@vue/runtime-dom" "3.2.41"
+ "@vue/server-renderer" "3.2.41"
+ "@vue/shared" "3.2.41"
diff --git a/system-tests/test/component_testing_spec.ts b/system-tests/test/component_testing_spec.ts
index 708379675c32..600e670e0379 100644
--- a/system-tests/test/component_testing_spec.ts
+++ b/system-tests/test/component_testing_spec.ts
@@ -79,7 +79,7 @@ describe(`React major versions with Vite`, function () {
return systemTests.exec(this, {
project: `react${majorVersion}`,
configFile: 'cypress-vite.config.ts',
- spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx,src/Rerendering.cy.jsx',
+ spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx,src/Rerendering.cy.jsx,src/mount.cy.jsx',
testingType: 'component',
browser: 'chrome',
snapshot: true,
@@ -97,7 +97,7 @@ describe(`React major versions with Webpack`, function () {
return systemTests.exec(this, {
project: `react${majorVersion}`,
configFile: 'cypress-webpack.config.ts',
- spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx,src/Rerendering.cy.jsx',
+ spec: 'src/App.cy.jsx,src/Unmount.cy.jsx,src/UsingLegacyMount.cy.jsx,src/Rerendering.cy.jsx,src/mount.cy.jsx',
testingType: 'component',
browser: 'chrome',
snapshot: true,
@@ -151,6 +151,26 @@ describe('svelte component testing', () => {
}
})
+describe('Vue major versions with Vite', () => {
+ systemTests.setup()
+
+ systemTests.it('vue 2', {
+ project: `vue2`,
+ testingType: 'component',
+ spec: '**/*.cy.js',
+ browser: 'chrome',
+ expectedExitCode: 0,
+ })
+
+ systemTests.it('vue 3', {
+ project: `vue3`,
+ testingType: 'component',
+ spec: '**/*.cy.js',
+ browser: 'chrome',
+ expectedExitCode: 0,
+ })
+})
+
describe('experimentalSingleTabRunMode', function () {
systemTests.setup()
diff --git a/tooling/v8-snapshot/cache/dev-darwin/snapshot-meta.cache.json b/tooling/v8-snapshot/cache/dev-darwin/snapshot-meta.cache.json
index 20db9f9d0778..27b13e5d82dc 100644
--- a/tooling/v8-snapshot/cache/dev-darwin/snapshot-meta.cache.json
+++ b/tooling/v8-snapshot/cache/dev-darwin/snapshot-meta.cache.json
@@ -3528,5 +3528,5 @@
"./tooling/v8-snapshot/cache/dev-darwin/snapshot-entry.js"
],
"deferredHashFile": "yarn.lock",
- "deferredHash": "b23274a95457555a9102f7f660744b1a8f08324bfcfa01be64771c12fcb3ae35"
+ "deferredHash": "6bc8f0abbe39ed0c00fd889d9dc07a5ddd40e8c0298a7b870968fedf57037a49"
}
\ No newline at end of file
From 294985f8b3e0fa00ed66d25f88c8814603766074 Mon Sep 17 00:00:00 2001
From: Adam Stone
Date: Fri, 4 Nov 2022 01:05:26 -0400
Subject: [PATCH 07/26] fix: remove some CT functions and props (#24419)
* fix: remove mountHook function for React
* fix: remove `unmount` from @cypress/react exports
* fix: remove `unmount` from the @cypress/react readme
* fix: don't alias React components on mount
* fix: remove `mountCallback` from Vue adapters
* fix: remove style injection utility functions from `mount-utils`
* fix: fix React tests
* fix: fix more React tests
* fix: fix more tests
* fix: fix screenshot test styles
* fix: update documentation around mount-utils styles; fix tests
* fix: update Vue docs to use `props` key rather than `propsData`
* fix: add test styles back in
* update unmount test and export getContainerEl for back compat
* better errors
* docs
* error for unmount
* test for error
* fix last test
* adjust language to reflect removed methods
* one last deprecation
* fix error
* wip - [skip ci]
* use proxy to catch errors
* deprecate alias
* update tests
* update on link
* use on links properly
* revert changes
Co-authored-by: Lachlan Miller
---
npm/mount-utils/README.md | 28 +--
npm/mount-utils/src/index.ts | 226 ++++--------------
npm/react/README.md | 24 +-
.../component/advanced/hooks/README.md | 7 +-
.../component/advanced/hooks/images/hook.png | Bin 162516 -> 0 bytes
.../advanced/hooks/use-counter.cy.jsx | 25 --
.../advanced/renderless/mouse.cy.jsx | 5 +-
.../loading-indicator.cy.jsx | 6 +-
.../timers/card-without-effect.cy.jsx | 8 +-
.../component/advanced/tutorial/square.cy.jsx | 6 +-
.../advanced/tutorial/tic-tac-toe.cy.jsx | 5 +-
.../cypress/component/basic/alias/README.md | 5 -
.../component/basic/alias/alias.cy.jsx | 31 ---
.../component/basic/alias/images/alias.png | Bin 336819 -> 0 bytes
.../component/basic/enzyme/props.cy.jsx | 3 +-
.../component/basic/hello-world.cy.jsx | 7 +-
.../component/basic/rerender/effects.cy.jsx | 9 +-
.../cypress/component/basic/styles/README.md | 11 -
.../component/basic/styles/style/style.cy.jsx | 95 --------
.../component/basic/unmount/comp.cy.jsx | 14 +-
.../component/basic/unmount/unmount.cy.jsx | 8 +-
.../component/removedMountingOptions.cy.jsx | 30 +++
npm/react/cypress/support/component.jsx | 3 +
npm/react/docs/styles.md | 85 ++-----
npm/react/src/createMount.ts | 46 ++--
npm/react/src/getDisplayName.ts | 2 +-
npm/react/src/mount.ts | 18 +-
npm/react/src/mountHook.ts | 86 +------
npm/react/src/types.ts | 9 +-
npm/react18/package.json | 1 +
npm/react18/src/index.ts | 18 +-
npm/svelte/src/mount.ts | 10 +-
npm/vue/README.md | 12 +-
.../component/basic/components/README.md | 2 +-
.../cypress/component/basic/props/README.md | 4 +-
.../component/basic/style-in-spec/todo.cy.js | 4 +-
.../component/removedMountingOptions.cy.js | 22 ++
.../test-utils-api/TestUtilsApi.cy.ts | 9 +
npm/vue/docs/styles.md | 69 +++---
npm/vue/src/index.ts | 32 ++-
npm/vue2/README.md | 10 +-
npm/vue2/docs/styles.md | 69 +++---
npm/vue2/src/index.ts | 30 +--
.../examples/react-app/src/App.spec.js | 10 +-
.../examples/react-app/src/Todo.spec.js | 48 +---
.../src/runner/screenshot/screenshot.cy.tsx | 106 +-------
.../app/src/runner/screenshot/screenshot.scss | 68 ++++++
packages/driver/src/cypress/error_messages.ts | 36 +++
packages/driver/src/cypress/utils.ts | 7 +
.../react/cypress/support/component.js | 5 +-
.../project-fixtures/react/src/Unmount.cy.jsx | 6 +-
.../runner-specs/cypress/support/component.js | 3 +-
.../project-fixtures/svelte/src/mount.cy.js | 12 +
.../react17/cypress/support/component.js | 3 +-
.../react18/cypress/support/component.js | 3 +-
.../src/components/HelloWorld.cy.js | 10 +
56 files changed, 495 insertions(+), 916 deletions(-)
delete mode 100644 npm/react/cypress/component/advanced/hooks/images/hook.png
delete mode 100644 npm/react/cypress/component/advanced/hooks/use-counter.cy.jsx
delete mode 100644 npm/react/cypress/component/basic/alias/README.md
delete mode 100644 npm/react/cypress/component/basic/alias/alias.cy.jsx
delete mode 100644 npm/react/cypress/component/basic/alias/images/alias.png
delete mode 100644 npm/react/cypress/component/basic/styles/README.md
delete mode 100644 npm/react/cypress/component/basic/styles/style/style.cy.jsx
create mode 100644 npm/react/cypress/component/removedMountingOptions.cy.jsx
create mode 100644 npm/vue/cypress/component/removedMountingOptions.cy.js
create mode 100644 packages/app/src/runner/screenshot/screenshot.scss
diff --git a/npm/mount-utils/README.md b/npm/mount-utils/README.md
index 014e4f3052d4..b789cf73af8b 100644
--- a/npm/mount-utils/README.md
+++ b/npm/mount-utils/README.md
@@ -25,11 +25,7 @@ All the functionality used to create the first party Mount adapters is available
In addition, we recommend that Mount Adapters:
-- receive a second argument that extends `StyleOptions` from `@cypress/mount-utils`
-- calls `injectStylesBeforeElement` from `@cypress/mount-utils` before mounting the component
-- calls `setupHooks` to register the required lifecycle hooks for `@cypress/mount-utils` to work
-
-This will let the user inject styles `` and stylesheets ``, which is very useful for developing components.
+- call `setupHooks` to register the required lifecycle hooks for `@cypress/mount-utils` to work
### Example Mount Adapter: Web Components
@@ -39,9 +35,7 @@ Here's a simple yet realistic example of Mount Adapter targeting Web Components.
import {
ROOT_SELECTOR,
setupHooks,
- injectStylesBeforeElement,
- getContainerEl,
- StyleOptions
+ getContainerEl
} from "@cypress/mount-utils";
Cypress.on("run:start", () => {
@@ -69,8 +63,7 @@ function maybeRegisterComponent(
}
export function mount(
- webComponent: CustomElementConstructor,
- options?: Partial
+ webComponent: CustomElementConstructor
): Cypress.Chainable {
// Get root selector defined in `cypress/support.component-index.html
const $root = document.querySelector(ROOT_SELECTOR)!;
@@ -83,9 +76,6 @@ export function mount(
/// Register Web Component
maybeRegisterComponent(name, webComponent);
- // Inject user styles before mounting the component
- injectStylesBeforeElement(options ?? {}, document, getContainerEl())
-
// Render HTML containing component.
$root.innerHTML = `<${name} id="root">${name}>`;
@@ -100,8 +90,7 @@ export function mount(
return cy.wrap(document.querySelector("#root"), { log: false });
}
-// Setup Cypress lifecycle hooks. This tears down any styles
-// injected by injectStylesBeforeElement, etc.
+// Setup Cypress lifecycle hooks.
setupHooks();
```
@@ -131,14 +120,7 @@ export class WebCounter extends HTMLElement {
describe('web-component.cy.ts', () => {
it('playground', () => {
- cy.mount(WebCounter, {
- styles: `
- button {
- background: lightblue;
- color: white;
- }
- `
- })
+ cy.mount(WebCounter)
})
})
```
diff --git a/npm/mount-utils/src/index.ts b/npm/mount-utils/src/index.ts
index 5593110bd505..fda0c68f2096 100644
--- a/npm/mount-utils/src/index.ts
+++ b/npm/mount-utils/src/index.ts
@@ -1,42 +1,3 @@
-/**
- * Additional styles to inject into the document.
- * A component might need 3rd party libraries from CDN,
- * local CSS files and custom styles.
- */
-export interface StyleOptions {
- /**
- * Creates element for each stylesheet
- * @alias stylesheet
- */
- stylesheets: string | string[]
- /**
- * Creates element for each stylesheet
- * @alias stylesheets
- */
- stylesheet: string | string[]
- /**
- * Creates element and inserts given CSS.
- * @alias styles
- */
- style: string | string[]
- /**
- * Creates element for each given CSS text.
- * @alias style
- */
- styles: string | string[]
- /**
- * Loads each file and creates a element
- * with the loaded CSS
- * @alias cssFile
- */
- cssFiles: string | string[]
- /**
- * Single CSS file to load into a element
- * @alias cssFile
- */
- cssFile: string | string[]
-}
-
export const ROOT_SELECTOR = '[data-cy-root]'
export const getContainerEl = (): HTMLElement => {
@@ -49,154 +10,12 @@ export const getContainerEl = (): HTMLElement => {
throw Error(`No element found that matches selector ${ROOT_SELECTOR}. Please add a root element with data-cy-root attribute to your "component-index.html" file so that Cypress can attach your component to the DOM.`)
}
-/**
- * Remove any style or extra link elements from the iframe placeholder
- * left from any previous test
- *
- */
-export function cleanupStyles () {
- const styles = document.body.querySelectorAll('[data-cy=injected-style-tag]')
-
- styles.forEach((styleElement) => {
- if (styleElement.parentElement) {
- styleElement.parentElement.removeChild(styleElement)
+export function checkForRemovedStyleOptions (mountingOptions: Record) {
+ for (const key of ['cssFile', 'cssFiles', 'style', 'styles', 'stylesheet', 'stylesheets'] as const) {
+ if (mountingOptions[key]) {
+ Cypress.utils.throwErrByPath('mount.removed_style_mounting_options', key)
}
- })
-
- const links = document.body.querySelectorAll('[data-cy=injected-stylesheet]')
-
- links.forEach((link) => {
- if (link.parentElement) {
- link.parentElement.removeChild(link)
- }
- })
-}
-
-/**
- * Insert links to external style resources.
- */
-function insertStylesheets (
- stylesheets: string[],
- document: Document,
- el: HTMLElement | null,
-) {
- stylesheets.forEach((href) => {
- const link = document.createElement('link')
-
- link.type = 'text/css'
- link.rel = 'stylesheet'
- link.href = href
- link.dataset.cy = 'injected-stylesheet'
- document.body.insertBefore(link, el)
- })
-}
-
-/**
- * Inserts a single stylesheet element
- */
-function insertStyles (styles: string[], document: Document, el: HTMLElement | null) {
- styles.forEach((style) => {
- const styleElement = document.createElement('style')
-
- styleElement.dataset.cy = 'injected-style-tag'
- styleElement.appendChild(document.createTextNode(style))
- document.body.insertBefore(styleElement, el)
- })
-}
-
-function insertSingleCssFile (
- cssFilename: string,
- document: Document,
- el: HTMLElement | null,
- log?: boolean,
-) {
- return cy.readFile(cssFilename, { log }).then((css) => {
- const style = document.createElement('style')
-
- style.appendChild(document.createTextNode(css))
- document.body.insertBefore(style, el)
- })
-}
-
-/**
- * Reads the given CSS file from local file system
- * and adds the loaded style text as an element.
- */
-function insertLocalCssFiles (
- cssFilenames: string[],
- document: Document,
- el: HTMLElement | null,
- log?: boolean,
-) {
- return Cypress.Promise.mapSeries(cssFilenames, (cssFilename) => {
- return insertSingleCssFile(cssFilename, document, el, log)
- })
-}
-
-/**
- * Injects custom style text or CSS file or 3rd party style resources
- * into the given document.
- */
-export const injectStylesBeforeElement = (
- options: Partial,
- document: Document,
- el: HTMLElement | null,
-): HTMLElement => {
- if (!el) return
-
- // first insert all stylesheets as Link elements
- let stylesheets: string[] = []
-
- if (typeof options.stylesheet === 'string') {
- stylesheets.push(options.stylesheet)
- } else if (Array.isArray(options.stylesheet)) {
- stylesheets = stylesheets.concat(options.stylesheet)
}
-
- if (typeof options.stylesheets === 'string') {
- options.stylesheets = [options.stylesheets]
- }
-
- if (options.stylesheets) {
- stylesheets = stylesheets.concat(options.stylesheets)
- }
-
- insertStylesheets(stylesheets, document, el)
-
- // insert any styles as elements
- let styles: string[] = []
-
- if (typeof options.style === 'string') {
- styles.push(options.style)
- } else if (Array.isArray(options.style)) {
- styles = styles.concat(options.style)
- }
-
- if (typeof options.styles === 'string') {
- styles.push(options.styles)
- } else if (Array.isArray(options.styles)) {
- styles = styles.concat(options.styles)
- }
-
- insertStyles(styles, document, el)
-
- // now load any css files by path and add their content
- // as elements
- let cssFiles: string[] = []
-
- if (typeof options.cssFile === 'string') {
- cssFiles.push(options.cssFile)
- } else if (Array.isArray(options.cssFile)) {
- cssFiles = cssFiles.concat(options.cssFile)
- }
-
- if (typeof options.cssFiles === 'string') {
- cssFiles.push(options.cssFiles)
- } else if (Array.isArray(options.cssFiles)) {
- cssFiles = cssFiles.concat(options.cssFiles)
- }
-
- return insertLocalCssFiles(cssFiles, document, el, options.log)
}
export function setupHooks (optionalCallback?: Function) {
@@ -220,6 +39,41 @@ export function setupHooks (optionalCallback?: Function) {
// @ts-ignore
Cypress.on('test:before:run', () => {
optionalCallback?.()
- cleanupStyles()
})
}
+
+/**
+ * Remove any style or extra link elements from the iframe placeholder
+ * left from any previous test
+ *
+ * Removed as of Cypress 11.0.0
+ * @see https://on.cypress.io/migration-11-0-0-component-testing-updates
+ */
+export function cleanupStyles () {
+ Cypress.utils.throwErrByPath('mount.cleanup_styles')
+}
+
+/**
+ * Additional styles to inject into the document.
+ * A component might need 3rd party libraries from CDN,
+ * local CSS files and custom styles.
+ *
+ * Removed as of Cypress 11.0.0.
+ * @see https://on.cypress.io/migration-11-0-0-component-testing-updates
+ */
+export type StyleOptions = unknown
+
+/**
+ * Injects custom style text or CSS file or 3rd party style resources
+ * into the given document.
+ *
+ * Removed as of Cypress 11.0.0.
+ * @see https://on.cypress.io/migration-11-0-0-component-testing-updates
+ */
+export const injectStylesBeforeElement = (
+ options: Partial,
+ document: Document,
+ el: HTMLElement | null,
+) => {
+ Cypress.utils.throwErrByPath('mount.inject_styles_before_element')
+}
diff --git a/npm/react/README.md b/npm/react/README.md
index 23582443e447..cc2793fedd9b 100644
--- a/npm/react/README.md
+++ b/npm/react/README.md
@@ -31,8 +31,6 @@ For more information, please check the official docs for [running Cypress](https
- `mount` is the most important function, allows to mount a given React component as a mini web application and interact with it using Cypress commands
- `createMount` factory function that creates new `mount` function with default options
-- `unmount` removes previously mounted component, mostly useful to test how the component cleans up after itself
-- `mountHook` mounts a given React Hook in a test component for full testing, see `hooks` example
## Examples
@@ -65,20 +63,7 @@ it('looks right', () => {
})
```
-### Extra styles
-
-You can pass additional styles, css files and external stylesheets to load, see [docs/styles.md](./docs/styles.md) for the full list of options.
-
-```js
-const todo = {
- id: '123',
- title: 'Write more tests',
-}
-mount(, {
- stylesheets: [
- 'https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.css',
- ],
-})
+See [docs/styles.md](./docs/styles.md) for full list of options.
```
You may also specify the `ReactDOM` package to use. This can be useful in complex monorepo setups that have different versions of React and React DOM installed. If you see an error relating to [mismatching versions of React or React DOM](https://reactjs.org/warnings/invalid-hook-call-warning.html#mismatching-versions-of-react-and-react-dom), this may be the solution. You can do this using the `ReactDom` option:
@@ -87,12 +72,7 @@ You may also specify the `ReactDOM` package to use. This can be useful in comple
// if you have multiple versions of ReactDom in your monorepo
import ReactDom from 'react-dom'
-mount(, {
- stylesheets: [
- 'https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.css',
- ],
- ReactDom
-})
+mount(, { reactDom: ReactDom })
```
## Compatibility
diff --git a/npm/react/cypress/component/advanced/hooks/README.md b/npm/react/cypress/component/advanced/hooks/README.md
index 053f08b3336f..4d849faa2d34 100644
--- a/npm/react/cypress/component/advanced/hooks/README.md
+++ b/npm/react/cypress/component/advanced/hooks/README.md
@@ -1,8 +1,3 @@
# testing React hooks
-- [counter-with-hooks.spec.js](counter-with-hooks.spec.js) and [counter2-with-hooks.spec.js](counter2-with-hooks.spec.js) test React components that uses hooks
-- [use-counter.spec.js](use-counter.spec.js) shows how to test a React hook using `mountHook` function
-
-![Hook test](images/hook.png)
-
-Note: hooks are mounted inside a test component following the approach shown in [react-hooks-testing-library](https://github.com/testing-library/react-hooks-testing-library/blob/master/src/pure.js)
+- [counter-with-hooks.spec.js](counter-with-hooks.spec.js) and [counter2-with-hooks.spec.js](counter2-with-hooks.spec.js) test React components that uses hooks
\ No newline at end of file
diff --git a/npm/react/cypress/component/advanced/hooks/images/hook.png b/npm/react/cypress/component/advanced/hooks/images/hook.png
deleted file mode 100644
index e9d9077e60d54bab2523f72d09a73d999108140f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 162516
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