11import { resolve } from 'node:path'
2- import {
3- type MockInstance ,
4- afterEach ,
5- beforeEach ,
6- describe ,
7- expect ,
8- it ,
9- vi ,
10- } from 'vitest'
11- import chokidar from 'chokidar'
12- import { createServer } from '../index'
2+ import { fileURLToPath } from 'node:url'
3+ import { afterEach , describe , expect , it , vi } from 'vitest'
4+ import { type ViteDevServer , createServer } from '../index'
135
146const stubGetWatchedCode = / g e t W a t c h e d \( \) \{ .+ ?r e t u r n \{ \} ; .+ ?\} / s
157
16- let watchSpy : MockInstance <
17- Parameters < typeof chokidar . watch > ,
18- ReturnType < typeof chokidar . watch >
19- >
20-
21- vi . mock ( '../../config' , async ( ) => {
22- const config : typeof import ( '../../config' ) =
23- await vi . importActual ( '../../config' )
24- const resolveConfig = config . resolveConfig
25- vi . spyOn ( config , 'resolveConfig' ) . mockImplementation ( async ( ...args ) => {
26- const resolved : Awaited < ReturnType < typeof resolveConfig > > =
27- await resolveConfig . call ( config , ...args )
28- resolved . configFileDependencies . push (
29- resolve ( 'fake/config/dependency.js' ) . replace ( / \\ / g, '/' ) ,
30- )
31- return resolved
32- } )
33- return config
34- } )
35-
368describe ( 'watcher configuration' , ( ) => {
37- beforeEach ( ( ) => {
38- watchSpy = vi . spyOn ( chokidar , 'watch' )
39- } )
9+ let server : ViteDevServer | undefined
4010
41- afterEach ( ( ) => {
42- watchSpy . mockRestore ( )
11+ afterEach ( async ( ) => {
12+ if ( server ) {
13+ await server . close ( )
14+ server = undefined
15+ }
4316 } )
4417
4518 it ( 'when watcher is disabled, return noop watcher' , async ( ) => {
46- const server = await createServer ( {
19+ server = await createServer ( {
4720 server : {
4821 watch : null ,
4922 } ,
@@ -52,7 +25,7 @@ describe('watcher configuration', () => {
5225 } )
5326
5427 it ( 'when watcher is not disabled, return chokidar watcher' , async ( ) => {
55- const server = await createServer ( {
28+ server = await createServer ( {
5629 server : {
5730 watch : { } ,
5831 } ,
@@ -61,25 +34,23 @@ describe('watcher configuration', () => {
6134 } )
6235
6336 it ( 'should watch the root directory, config file dependencies, dotenv files, and the public directory' , async ( ) => {
64- await createServer ( {
65- server : {
66- watch : { } ,
67- } ,
68- publicDir : '__test_public__' ,
69- } )
70- expect ( watchSpy ) . toHaveBeenLastCalledWith (
71- expect . arrayContaining (
72- [
73- process . cwd ( ) ,
74- resolve ( 'fake/config/dependency.js' ) ,
75- resolve ( '.env' ) ,
76- resolve ( '.env.local' ) ,
77- resolve ( '.env.development' ) ,
78- resolve ( '.env.development.local' ) ,
79- resolve ( '__test_public__' ) ,
80- ] . map ( ( file ) => file . replace ( / \\ / g, '/' ) ) ,
81- ) ,
82- expect . anything ( ) ,
37+ const root = fileURLToPath (
38+ new URL ( './fixtures/watcher/nested-root' , import . meta. url ) ,
8339 )
40+ server = await createServer ( { root } )
41+ await new Promise ( ( resolve ) => server ! . watcher . once ( 'ready' , resolve ) )
42+ // Perform retries here as chokidar may still not be completely watching all directories
43+ // after the `ready` event
44+ await vi . waitFor ( ( ) => {
45+ const watchedDirs = Object . keys ( server ! . watcher . getWatched ( ) )
46+ expect ( watchedDirs ) . toEqual (
47+ expect . arrayContaining ( [
48+ root ,
49+ resolve ( root , '../config-deps' ) ,
50+ resolve ( root , '../custom-env' ) ,
51+ resolve ( root , '../custom-public' ) ,
52+ ] ) ,
53+ )
54+ } )
8455 } )
8556} )
0 commit comments