mirror of
https://github.com/cypress-io/cypress.git
synced 2026-04-23 15:39:28 -05:00
fix: custom reporter and experimentalSessionAndOrigin crashes (#24630)
This commit is contained in:
@@ -36,22 +36,23 @@ async function removeEmptyDirectories (directory) {
|
||||
}
|
||||
}
|
||||
|
||||
const getDependencyPathsToKeep = async () => {
|
||||
const getDependencyPathsToKeep = async (buildAppDir) => {
|
||||
const unixBuildAppDir = buildAppDir.split(path.sep).join(path.posix.sep)
|
||||
const startingEntryPoints = [
|
||||
'packages/server/index.js',
|
||||
'packages/server/hook-require.js',
|
||||
'packages/server/lib/plugins/child/require_async_child.js',
|
||||
'packages/server/lib/plugins/child/register_ts_node.js',
|
||||
'packages/rewriter/lib/threads/worker.js',
|
||||
'node_modules/webpack/lib/webpack.js',
|
||||
'node_modules/webpack-dev-server/lib/Server.js',
|
||||
'node_modules/html-webpack-plugin-4/index.js',
|
||||
'node_modules/html-webpack-plugin-5/index.js',
|
||||
'node_modules/mocha-7.0.1/index.js',
|
||||
]
|
||||
|
||||
let entryPoints = new Set([
|
||||
// This is the entry point for the server bundle. It will not have access to the snapshot yet. It needs to be kept in the binary
|
||||
require.resolve('@packages/server/index.js'),
|
||||
// This is a dynamic import that is used to load the snapshot require logic. It will not have access to the snapshot yet. It needs to be kept in the binary
|
||||
require.resolve('@packages/server/hook-require.js'),
|
||||
// These dependencies are started in a new process or thread and will not have access to the snapshot. They need to be kept in the binary
|
||||
require.resolve('@packages/server/lib/plugins/child/require_async_child.js'),
|
||||
require.resolve('@packages/server/lib/plugins/child/register_ts_node.js'),
|
||||
require.resolve('@packages/rewriter/lib/threads/worker.ts'),
|
||||
// These dependencies use the `require.resolve(<dependency>, { paths: [<path>] })` pattern where <path> is a path within the cypress monorepo. These will not be
|
||||
// pulled in by esbuild but still need to be kept in the binary.
|
||||
require.resolve('webpack'),
|
||||
require.resolve('webpack-dev-server', { paths: [path.join(__dirname, '..', '..', 'npm', 'webpack-dev-server')] }),
|
||||
require.resolve('html-webpack-plugin-4', { paths: [path.join(__dirname, '..', '..', 'npm', 'webpack-dev-server')] }),
|
||||
require.resolve('html-webpack-plugin-5', { paths: [path.join(__dirname, '..', '..', 'npm', 'webpack-dev-server')] }),
|
||||
...startingEntryPoints.map((entryPoint) => path.join(unixBuildAppDir, entryPoint)),
|
||||
// These dependencies are completely dynamic using the pattern `require(`./${name}`)` and will not be pulled in by esbuild but still need to be kept in the binary.
|
||||
...['ibmi',
|
||||
'sunos',
|
||||
@@ -61,7 +62,7 @@ const getDependencyPathsToKeep = async () => {
|
||||
'linux',
|
||||
'openbsd',
|
||||
'sunos',
|
||||
'win32'].map((platform) => require.resolve(`default-gateway/${platform}`)),
|
||||
'win32'].map((platform) => path.join(unixBuildAppDir, `node_modules/default-gateway/${platform}.js`)),
|
||||
])
|
||||
let esbuildResult
|
||||
let newEntryPointsFound = true
|
||||
@@ -77,8 +78,10 @@ const getDependencyPathsToKeep = async () => {
|
||||
outdir: workingDir,
|
||||
platform: 'node',
|
||||
metafile: true,
|
||||
absWorkingDir: unixBuildAppDir,
|
||||
external: [
|
||||
'./packages/server/server-entry',
|
||||
'./transpile-ts',
|
||||
'./server-entry',
|
||||
'fsevents',
|
||||
'pnpapi',
|
||||
'@swc/core',
|
||||
@@ -95,9 +98,9 @@ const getDependencyPathsToKeep = async () => {
|
||||
let entryPoint
|
||||
|
||||
if (warningSubject.startsWith('.')) {
|
||||
entryPoint = path.join(__dirname, '..', '..', path.dirname(warning.location.file), warningSubject)
|
||||
entryPoint = path.join(unixBuildAppDir, path.dirname(warning.location.file), warningSubject)
|
||||
} else {
|
||||
entryPoint = require.resolve(warningSubject)
|
||||
entryPoint = require.resolve(warningSubject, { paths: [path.join(unixBuildAppDir, path.dirname(warning.location.file))] })
|
||||
}
|
||||
|
||||
if (path.extname(entryPoint) !== '' && !entryPoints.has(entryPoint)) {
|
||||
@@ -114,16 +117,18 @@ const getDependencyPathsToKeep = async () => {
|
||||
const cleanup = async (buildAppDir) => {
|
||||
// 1. Retrieve all dependencies that still need to be kept in the binary. In theory, we could use the bundles generated here as single files within the binary,
|
||||
// but for now, we just track on the dependencies that get pulled in
|
||||
const keptDependencies = [...await getDependencyPathsToKeep(), 'package.json', 'packages/server/server-entry.js']
|
||||
const keptDependencies = [...await getDependencyPathsToKeep(buildAppDir), 'package.json', 'packages/server/server-entry.js']
|
||||
|
||||
// 2. Gather the dependencies that could potentially be removed from the binary due to being in the snapshot
|
||||
const potentiallyRemovedDependencies = [...snapshotMetadata.healthy, ...snapshotMetadata.deferred, ...snapshotMetadata.norewrite]
|
||||
|
||||
// 3. Remove all dependencies that are in the snapshot but not in the list of kept dependencies from the binary
|
||||
await Promise.all(potentiallyRemovedDependencies.map(async (dependency) => {
|
||||
// marionette-client requires all of its dependencies in a very non-standard dynamic way. We will keep anything in marionette-client
|
||||
if (!keptDependencies.includes(dependency.slice(2)) && !dependency.includes('marionette-client')) {
|
||||
await fs.remove(path.join(buildAppDir, dependency.replace(/.ts$/, '.js')))
|
||||
const typeScriptlessDependency = dependency.replace(/\.ts$/, '.js')
|
||||
|
||||
// marionette-client and babel/runtime require all of their dependencies in a very non-standard dynamic way. We will keep anything in marionette-client and babel/runtime
|
||||
if (!keptDependencies.includes(typeScriptlessDependency.slice(2)) && !typeScriptlessDependency.includes('marionette-client') && !typeScriptlessDependency.includes('@babel/runtime')) {
|
||||
await fs.remove(path.join(buildAppDir, typeScriptlessDependency))
|
||||
}
|
||||
}))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user