@@ -793,6 +793,57 @@ if (import.meta.hot) {
793
793
)
794
794
} )
795
795
796
+ test ( 'delete file should not break hmr' , async ( ) => {
797
+ await page . goto ( viteTestUrl )
798
+
799
+ await untilUpdated (
800
+ ( ) => page . textContent ( '.intermediate-file-delete-display' ) ,
801
+ 'count is 1' ,
802
+ )
803
+
804
+ // add state
805
+ await page . click ( '.intermediate-file-delete-increment' )
806
+ await untilUpdated (
807
+ ( ) => page . textContent ( '.intermediate-file-delete-display' ) ,
808
+ 'count is 2' ,
809
+ )
810
+
811
+ // update import, hmr works
812
+ editFile ( 'intermediate-file-delete/index.js' , ( code ) =>
813
+ code . replace ( "from './re-export.js'" , "from './display.js'" ) ,
814
+ )
815
+ editFile ( 'intermediate-file-delete/display.js' , ( code ) =>
816
+ code . replace ( 'count is ${count}' , 'count is ${count}!' ) ,
817
+ )
818
+ await untilUpdated (
819
+ ( ) => page . textContent ( '.intermediate-file-delete-display' ) ,
820
+ 'count is 2!' ,
821
+ )
822
+
823
+ // remove unused file, page reload because it's considered entry point now
824
+ removeFile ( 'intermediate-file-delete/re-export.js' )
825
+ await untilUpdated (
826
+ ( ) => page . textContent ( '.intermediate-file-delete-display' ) ,
827
+ 'count is 1!' ,
828
+ )
829
+
830
+ // re-add state
831
+ await page . click ( '.intermediate-file-delete-increment' )
832
+ await untilUpdated (
833
+ ( ) => page . textContent ( '.intermediate-file-delete-display' ) ,
834
+ 'count is 2!' ,
835
+ )
836
+
837
+ // hmr works after file deletion
838
+ editFile ( 'intermediate-file-delete/display.js' , ( code ) =>
839
+ code . replace ( 'count is ${count}!' , 'count is ${count}' ) ,
840
+ )
841
+ await untilUpdated (
842
+ ( ) => page . textContent ( '.intermediate-file-delete-display' ) ,
843
+ 'count is 2' ,
844
+ )
845
+ } )
846
+
796
847
test ( 'import.meta.hot?.accept' , async ( ) => {
797
848
const el = await page . $ ( '.optional-chaining' )
798
849
await untilBrowserLogAfter (
0 commit comments