diff --git a/npm/react/cypress/component/advanced/timers/card-spec.js b/npm/react/cypress/component/advanced/timers/card-spec.js
index becdf5caaff0..7611c2d5e53c 100644
--- a/npm/react/cypress/component/advanced/timers/card-spec.js
+++ b/npm/react/cypress/component/advanced/timers/card-spec.js
@@ -8,7 +8,7 @@ it('should select null after timing out', () => {
const onSelect = cy.stub().as('selected')
mount()
- cy.get('@selected', { timeout: 5500 }).should('have.been.calledWith', null)
+ cy.get('@selected', { timeout: 6000 }).should('have.been.calledWith', null)
})
it('should accept selections', () => {
diff --git a/npm/webpack-dev-server/src/loader.ts b/npm/webpack-dev-server/src/loader.ts
index be6f2b3ae41a..e5803b6b4665 100644
--- a/npm/webpack-dev-server/src/loader.ts
+++ b/npm/webpack-dev-server/src/loader.ts
@@ -1,8 +1,10 @@
/* global Cypress */
///
+import debugFn from 'debug'
import * as path from 'path'
import { CypressCTWebpackContext } from './plugin'
+const debug = debugFn('cypress:webpack-dev-server:webpack')
/**
* @param {ComponentSpec} file spec to create import string from.
@@ -15,8 +17,8 @@ const makeImport = (file: Cypress.Cypress['spec'], filename: string, chunkName:
const magicComments = chunkName ? `/* webpackChunkName: "${chunkName}" */` : ''
return `"${filename}": {
- shouldLoad: () => document.location.pathname.includes(${JSON.stringify(file.relative)}),
- load: () => import(${JSON.stringify(path.resolve(projectRoot, file.relative))} ${magicComments}),
+ shouldLoad: () => document.location.pathname.includes("${file.absolute}"),
+ load: () => import("${file.absolute}" ${magicComments}),
chunkName: "${chunkName}",
}`
}
@@ -39,6 +41,8 @@ const makeImport = (file: Cypress.Cypress['spec'], filename: string, chunkName:
function buildSpecs (projectRoot: string, files: Cypress.Cypress['spec'][] = []): string {
if (!Array.isArray(files)) return `{}`
+ debug(`projectRoot: ${projectRoot}, files: ${files.map((f) => f.absolute).join(',')}`)
+
return `{${files.map((f, i) => {
return makeImport(f, f.name, `spec-${i}`, projectRoot)
}).join(',')}}`
diff --git a/npm/webpack-dev-server/src/startServer.ts b/npm/webpack-dev-server/src/startServer.ts
index 7c9a54736e14..e3059d8c5b5e 100644
--- a/npm/webpack-dev-server/src/startServer.ts
+++ b/npm/webpack-dev-server/src/startServer.ts
@@ -46,12 +46,12 @@ export async function start ({ webpackConfig: userWebpackConfig, options, ...use
debug('starting webpack dev server')
- const webpackDevServerConfig = {
+ const webpackDevServerConfig: WebpackDevServer.Configuration = {
...userWebpackConfig.devServer,
hot: false,
inline: false,
publicPath: devServerPublicPathRoute,
- noInfo: true,
+ noInfo: false,
}
return new WebpackDevServer(compiler, webpackDevServerConfig)
diff --git a/packages/runner-ct/src/app/RunnerCt.tsx b/packages/runner-ct/src/app/RunnerCt.tsx
index 16f8f024559a..9d1ba9571f26 100644
--- a/packages/runner-ct/src/app/RunnerCt.tsx
+++ b/packages/runner-ct/src/app/RunnerCt.tsx
@@ -81,6 +81,8 @@ const buildNavItems = (eventManager: typeof EventManager, toggleIsSetListOpen: (
},
]
+const removeRelativeRegexp = /\.\.\//gi
+
const RunnerCt = namedObserver('RunnerCt',
(props: RunnerCtProps) => {
const searchRef = React.useRef(null)
@@ -92,7 +94,10 @@ const RunnerCt = namedObserver('RunnerCt',
const runSpec = React.useCallback((file: FileNode) => {
setActiveIndex(0)
- const selectedSpec = props.state.specs.find((spec) => spec.absolute.includes(file.relative))
+ // We request an absolute path from the dev server but the spec list displays relative paths
+ // For this reason to match the spec we remove leading relative paths. Eg ../../foo.js -> foo.js.
+ const filePath = file.relative.replace(removeRelativeRegexp, '')
+ const selectedSpec = props.state.specs.find((spec) => spec.absolute.includes(filePath))
if (!selectedSpec) {
throw Error(`Could not find spec matching ${file.relative}.`)
diff --git a/packages/runner-ct/src/iframe/iframes.jsx b/packages/runner-ct/src/iframe/iframes.jsx
index 9d9b4ccfcb48..0335b0059153 100644
--- a/packages/runner-ct/src/iframe/iframes.jsx
+++ b/packages/runner-ct/src/iframe/iframes.jsx
@@ -14,7 +14,7 @@ import styles from '../app/RunnerCt.module.scss'
import './iframes.scss'
export function getSpecUrl ({ namespace, spec }, prefix = '') {
- return spec ? `${prefix}/${namespace}/iframes/${spec.relative}` : ''
+ return spec ? `${prefix}/${namespace}/iframes/${spec.absolute}` : ''
}
@observer
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/component-files/greet.js b/packages/server-ct/test/fixtures/projects/nested-config/component-files/greet.js
new file mode 100644
index 000000000000..48753a56e425
--- /dev/null
+++ b/packages/server-ct/test/fixtures/projects/nested-config/component-files/greet.js
@@ -0,0 +1,5 @@
+export function greet() {
+ const el = document.createElement('div')
+ el.textContent = 'Hello world'
+ document.body.appendChild(el)
+}
\ No newline at end of file
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/component-files/greet.spec.js b/packages/server-ct/test/fixtures/projects/nested-config/component-files/greet.spec.js
new file mode 100644
index 000000000000..7d9c19685c52
--- /dev/null
+++ b/packages/server-ct/test/fixtures/projects/nested-config/component-files/greet.spec.js
@@ -0,0 +1,6 @@
+import { greet } from './greet'
+
+it('greets', () => {
+ greet()
+ cy.get('div').contains('Hello world')
+})
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress.json b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress.json
new file mode 100644
index 000000000000..e89c33b9d515
--- /dev/null
+++ b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress.json
@@ -0,0 +1,6 @@
+{
+ "component": {
+ "componentFolder": "../component-files",
+ "testFiles": "**/*.spec.js"
+ }
+}
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/fixtures/.keep b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/fixtures/.keep
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/integration/.keep b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/integration/.keep
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/plugins/index.js b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/plugins/index.js
new file mode 100644
index 000000000000..62eadc2e03f5
--- /dev/null
+++ b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/plugins/index.js
@@ -0,0 +1,7 @@
+const { startDevServer } = require('@cypress/webpack-dev-server')
+
+module.exports = (on, config) => {
+ on('dev-server:start', (options) => startDevServer({ options, webpackConfig: {} }))
+
+ return config
+}
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/support/.keep b/packages/server-ct/test/fixtures/projects/nested-config/configuration/cypress/support/.keep
new file mode 100644
index 000000000000..e69de29bb2d1
diff --git a/packages/server-ct/test/fixtures/projects/nested-config/package.json b/packages/server-ct/test/fixtures/projects/nested-config/package.json
new file mode 100644
index 000000000000..4c0a6498e657
--- /dev/null
+++ b/packages/server-ct/test/fixtures/projects/nested-config/package.json
@@ -0,0 +1,6 @@
+{
+ "scripts": {
+ "cy:run": "node ../../../../../../scripts/cypress.js run-ct --project configuration",
+ "cy:open": "node ../../../../../../scripts/cypress.js open-ct --project configuration"
+ }
+}