From a19c4565542c2c3575ab47642f80737a3bf26f3a Mon Sep 17 00:00:00 2001 From: Evan You Date: Mon, 25 Jan 2021 12:46:10 -0500 Subject: [PATCH] fix(watcher): ensure only add normalized file paths --- packages/vite/src/node/server/index.ts | 6 +----- .../vite/src/node/server/pluginContainer.ts | 6 ++---- .../vite/src/node/server/transformRequest.ts | 13 +++---------- packages/vite/src/node/utils.ts | 19 +++++++++++++++++++ 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/packages/vite/src/node/server/index.ts b/packages/vite/src/node/server/index.ts index c8c4429c34df14..ffe932c3c4ed5c 100644 --- a/packages/vite/src/node/server/index.ts +++ b/packages/vite/src/node/server/index.ts @@ -257,11 +257,7 @@ export async function createServer( const { ignored = [], ...watchOptions } = serverConfig.watch || {} const watcher = chokidar.watch(root, { - ignored: [ - '**/node_modules/**', - '**/.git/**', - ...ignored - ], + ignored: ['**/node_modules/**', '**/.git/**', ...ignored], ignoreInitial: true, ignorePermissionErrors: true, ...watchOptions diff --git a/packages/vite/src/node/server/pluginContainer.ts b/packages/vite/src/node/server/pluginContainer.ts index 5bca2d20f28f5d..afac54347ed98d 100644 --- a/packages/vite/src/node/server/pluginContainer.ts +++ b/packages/vite/src/node/server/pluginContainer.ts @@ -58,6 +58,7 @@ import MagicString from 'magic-string' import { FSWatcher } from 'chokidar' import { createDebugger, + ensureWatchedFile, generateCodeFrame, isExternalUrl, normalizePath, @@ -205,10 +206,7 @@ export async function createPluginContainer( addWatchFile(id: string) { watchFiles.add(id) - // only need to add it if file is out of root. - if (watcher && !id.startsWith(root)) { - watcher.add(id) - } + if (watcher) ensureWatchedFile(watcher, id, root) } getWatchFiles() { diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index 6c042377c60e07..d7c54eaedc6c9d 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -10,7 +10,8 @@ import { cleanUrl, prettifyUrl, removeTimestampQuery, - timeFrom + timeFrom, + ensureWatchedFile } from '../utils' import { checkPublicFile } from '../plugins/asset' import { ssrTransform } from '../ssr/ssrTransform' @@ -112,15 +113,7 @@ export async function transformRequest( // ensure module in graph after successful load const mod = await moduleGraph.ensureEntryFromUrl(url) - // file is out of root, add it to the watch list - if ( - mod.file && - !mod.file.startsWith(root + '/') && - // some rollup plugins use null bytes for private resolved Ids - !mod.file.includes('\0') - ) { - watcher.add(mod.file) - } + ensureWatchedFile(watcher, mod.file, root) // transform const transformStart = Date.now() diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index e8744b2cb67d48..92c0b0615b0ecc 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -8,6 +8,7 @@ import slash from 'slash' import { FS_PREFIX, SUPPORTED_EXTS } from './constants' import resolve from 'resolve' import builtins from 'builtin-modules' +import { FSWatcher } from 'chokidar' export function isBuiltin(id: string): boolean { return builtins.includes(id) @@ -320,3 +321,21 @@ export function copyDir(srcDir: string, destDir: string) { } } } + +export function ensureWatchedFile( + watcher: FSWatcher, + file: string | null, + root: string +) { + if ( + file && + // only need to watch if out of root + !file.startsWith(root + '/') && + // some rollup plugins use null bytes for private resolved Ids + !file.includes('\0') && + fs.existsSync(file) + ) { + // resolve file to normalized system path + watcher.add(path.resolve(file)) + } +}