From 105ff7181eeff6712e930a4980c07eb312d15db4 Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Tue, 4 Nov 2025 12:32:23 -0500 Subject: [PATCH] fix(vite-plugin): prevent Windows file locking by excluding project root from static directories Previously, the plugin was passing the entire Vite project root to Netlify's static file handler, which caused it to stat() files in Vite's internal directories (e.g., node_modules/.vite/deps). On Windows, this creates file locks that prevent Vite from atomically renaming temporary dependency files during prebundling, resulting in EPERM errors when opening Sanity Studio or other apps that trigger Vite's dependency optimization. The fix is to only include viteDevServer.config.publicDir in the static directories list, not the entire project root. This aligns with Vite's contract that only the public directory contains static assets that should be served verbatim, while everything else (including Vite's internal prebundles, virtual modules, etc.) is Vite's private implementation detail. This change ensures Netlify's static handler never touches Vite's internal files, eliminating the file locking race condition on Windows while maintaining correct behavior for actual static assets. Fixes #408 --- packages/vite-plugin/src/main.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/packages/vite-plugin/src/main.ts b/packages/vite-plugin/src/main.ts index d34b4501..24baf130 100644 --- a/packages/vite-plugin/src/main.ts +++ b/packages/vite-plugin/src/main.ts @@ -72,6 +72,16 @@ export default function netlify(options: NetlifyPluginOptions = {}): any { staticFiles, } = options + // Only include publicDir in static directories, not the entire project root. + // Including the root causes Netlify's static handler to interfere with Vite's + // internal files (e.g., prebundled deps in node_modules/.vite), leading to file + // locking issues on Windows when Vite tries to rename temporary dependency files. + const publicDir = viteDevServer.config.publicDir + const staticDirectories = [ + ...(staticFiles?.directories ?? []), + ...(typeof publicDir === 'string' ? [publicDir] : []), + ] + const netlifyDev = new NetlifyDev({ blobs, edgeFunctions, @@ -83,7 +93,7 @@ export default function netlify(options: NetlifyPluginOptions = {}): any { serverAddress: null, staticFiles: { ...staticFiles, - directories: [viteDevServer.config.root, viteDevServer.config.publicDir], + directories: staticDirectories.length > 0 ? staticDirectories : undefined, }, projectRoot: viteDevServer.config.root, })