From 65267ae2fd286d84f4ce3ef2702edb23af2e5737 Mon Sep 17 00:00:00 2001 From: "lucas.gontijo" Date: Thu, 6 Nov 2025 18:11:52 -0300 Subject: [PATCH 1/4] feat(vite-dev-server): migrate to async fs operations for better performance - Replace fs.readFileSync with async fs.readFile - Add proper error handling with debug logs - Improve performance by avoiding event loop blocking - Remove TODO comment about async fs methods This follows Node.js best practices and improves DX with faster build times. --- npm/vite-dev-server/src/plugins/cypress.ts | 26 +++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/npm/vite-dev-server/src/plugins/cypress.ts b/npm/vite-dev-server/src/plugins/cypress.ts index 49e16312ffe..7beee1f719f 100644 --- a/npm/vite-dev-server/src/plugins/cypress.ts +++ b/npm/vite-dev-server/src/plugins/cypress.ts @@ -2,7 +2,7 @@ import debugFn from 'debug' import type { ModuleNode, PluginOption, ViteDevServer } from 'vite-7' import type { Vite } from '../getVite.js' import { parse, HTMLElement } from 'node-html-parser' -import fs from 'fs' +import fs from 'fs/promises' import type { ViteDevServerConfig } from '../devServer.js' import path from 'path' @@ -33,6 +33,7 @@ export const Cypress = ( vite: Vite, ): PluginOption => { let base = '/' + let loaderPromise: Promise const projectRoot = options.cypressConfig.projectRoot const supportFilePath = options.cypressConfig.supportFile ? path.resolve(projectRoot, options.cypressConfig.supportFile) : false @@ -42,9 +43,21 @@ export const Cypress = ( const indexHtmlFile = options.cypressConfig.indexHtmlFile let specsPathsSet = getSpecsPathsSet(specs) - // TODO: use async fs methods here - // eslint-disable-next-line no-restricted-syntax - let loader = fs.readFileSync(INIT_FILEPATH, 'utf8') + + // Load the init file asynchronously with proper error handling + const loadInitFile = async (): Promise => { + try { + const content = await fs.readFile(INIT_FILEPATH, 'utf8') + debug(`Successfully loaded init file from ${INIT_FILEPATH}`) + return content + } catch (error) { + debug(`Failed to load init file from ${INIT_FILEPATH}:`, error) + throw new Error(`Failed to load Cypress init file: ${error instanceof Error ? error.message : 'Unknown error'}`) + } + } + + // Initialize loader promise + loaderPromise = loadInitFile() devServerEvents.on('dev-server:specs:changed', ({ specs, options }: { specs: Spec[], options?: { neededForJustInTimeCompile: boolean }}) => { if (options?.neededForJustInTimeCompile) { @@ -79,7 +92,7 @@ export const Cypress = ( debug('resolved the indexHtmlPath as', indexHtmlPath, 'from', indexHtmlFile) - let indexHtmlContent = await fs.promises.readFile(indexHtmlPath, { encoding: 'utf8' }) + let indexHtmlContent = await fs.readFile(indexHtmlPath, { encoding: 'utf8' }) // Inject the script tags indexHtmlContent = indexHtmlContent.replace( @@ -92,6 +105,9 @@ export const Cypress = ( // find last index const endOfBody = indexHtmlContent.lastIndexOf('') + // Get the loader content asynchronously + const loader = await loaderPromise + // insert the script in the end of the body const newHtml = ` ${indexHtmlContent.substring(0, endOfBody)} From 2531d567d4bf034204221fd07b59f8d8764a8d02 Mon Sep 17 00:00:00 2001 From: "lucas.gontijo" Date: Fri, 28 Nov 2025 14:14:33 -0300 Subject: [PATCH 2/4] feat: add debug logging for successful and failed loading of init file --- npm/vite-dev-server/src/plugins/cypress.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/npm/vite-dev-server/src/plugins/cypress.ts b/npm/vite-dev-server/src/plugins/cypress.ts index 7beee1f719f..7f1e8193c23 100644 --- a/npm/vite-dev-server/src/plugins/cypress.ts +++ b/npm/vite-dev-server/src/plugins/cypress.ts @@ -48,7 +48,9 @@ export const Cypress = ( const loadInitFile = async (): Promise => { try { const content = await fs.readFile(INIT_FILEPATH, 'utf8') + debug(`Successfully loaded init file from ${INIT_FILEPATH}`) + return content } catch (error) { debug(`Failed to load init file from ${INIT_FILEPATH}:`, error) From e4d266b8ef74c763bcc64585190e580e698269b4 Mon Sep 17 00:00:00 2001 From: "lucas.gontijo" Date: Mon, 1 Dec 2025 08:08:24 -0300 Subject: [PATCH 3/4] feat: initialize loaderPromise as null and create getLoaderPromise function for lazy loading --- npm/vite-dev-server/src/plugins/cypress.ts | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/npm/vite-dev-server/src/plugins/cypress.ts b/npm/vite-dev-server/src/plugins/cypress.ts index 7f1e8193c23..3d20cdf915b 100644 --- a/npm/vite-dev-server/src/plugins/cypress.ts +++ b/npm/vite-dev-server/src/plugins/cypress.ts @@ -33,7 +33,7 @@ export const Cypress = ( vite: Vite, ): PluginOption => { let base = '/' - let loaderPromise: Promise + let loaderPromise: Promise | null = null const projectRoot = options.cypressConfig.projectRoot const supportFilePath = options.cypressConfig.supportFile ? path.resolve(projectRoot, options.cypressConfig.supportFile) : false @@ -58,8 +58,13 @@ export const Cypress = ( } } - // Initialize loader promise - loaderPromise = loadInitFile() + const getLoaderPromise = () => { + if (!loaderPromise) { + loaderPromise = loadInitFile() + } + + return loaderPromise + } devServerEvents.on('dev-server:specs:changed', ({ specs, options }: { specs: Spec[], options?: { neededForJustInTimeCompile: boolean }}) => { if (options?.neededForJustInTimeCompile) { @@ -108,7 +113,7 @@ export const Cypress = ( const endOfBody = indexHtmlContent.lastIndexOf('') // Get the loader content asynchronously - const loader = await loaderPromise + const loader = await getLoaderPromise() // insert the script in the end of the body const newHtml = ` From 19359715bd9bef4ea72af14ad97bf619190916ea Mon Sep 17 00:00:00 2001 From: "lucas.gontijo" Date: Tue, 2 Dec 2025 09:12:37 -0300 Subject: [PATCH 4/4] feat: enhance error handling in getLoaderPromise for loadInitFile --- npm/vite-dev-server/src/plugins/cypress.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/npm/vite-dev-server/src/plugins/cypress.ts b/npm/vite-dev-server/src/plugins/cypress.ts index 3d20cdf915b..91e95b1f552 100644 --- a/npm/vite-dev-server/src/plugins/cypress.ts +++ b/npm/vite-dev-server/src/plugins/cypress.ts @@ -60,7 +60,10 @@ export const Cypress = ( const getLoaderPromise = () => { if (!loaderPromise) { - loaderPromise = loadInitFile() + loaderPromise = loadInitFile().catch((err) => { + loaderPromise = null + throw err + }) } return loaderPromise