@@ -49,6 +49,11 @@ interface OutputFileRecord {
4949 type : BuildOutputFileType ;
5050}
5151
52+ interface OutputAssetRecord {
53+ source : string ;
54+ updated : boolean ;
55+ }
56+
5257interface DevServerExternalResultMetadata extends Omit < ExternalResultMetadata , 'explicit' > {
5358 explicitBrowser : string [ ] ;
5459 explicitServer : string [ ] ;
@@ -168,7 +173,7 @@ export async function* serveWithVite(
168173 let serverUrl : URL | undefined ;
169174 let hadError = false ;
170175 const generatedFiles = new Map < string , OutputFileRecord > ( ) ;
171- const assetFiles = new Map < string , string > ( ) ;
176+ const assetFiles = new Map < string , OutputAssetRecord > ( ) ;
172177 const externalMetadata : DevServerExternalResultMetadata = {
173178 implicitBrowser : [ ] ,
174179 implicitServer : [ ] ,
@@ -229,19 +234,15 @@ export async function* serveWithVite(
229234 assetFiles . clear ( ) ;
230235 componentStyles . clear ( ) ;
231236 generatedFiles . clear ( ) ;
232- for ( const entry of Object . entries ( result . files ) ) {
233- const [ outputPath , file ] = entry ;
234- if ( file . origin === 'disk' ) {
235- assetFiles . set ( '/' + normalizePath ( outputPath ) , normalizePath ( file . inputPath ) ) ;
236- continue ;
237- }
238237
238+ for ( const [ outputPath , file ] of Object . entries ( result . files ) ) {
239239 updateResultRecord (
240240 outputPath ,
241241 file ,
242242 normalizePath ,
243243 htmlIndexPath ,
244244 generatedFiles ,
245+ assetFiles ,
245246 componentStyles ,
246247 // The initial build will not yet have a server setup
247248 ! server ,
@@ -265,23 +266,27 @@ export async function* serveWithVite(
265266 generatedFiles . delete ( filePath ) ;
266267 assetFiles . delete ( filePath ) ;
267268 }
269+
268270 for ( const modified of result . modified ) {
269271 updateResultRecord (
270272 modified ,
271273 result . files [ modified ] ,
272274 normalizePath ,
273275 htmlIndexPath ,
274276 generatedFiles ,
277+ assetFiles ,
275278 componentStyles ,
276279 ) ;
277280 }
281+
278282 for ( const added of result . added ) {
279283 updateResultRecord (
280284 added ,
281285 result . files [ added ] ,
282286 normalizePath ,
283287 htmlIndexPath ,
284288 generatedFiles ,
289+ assetFiles ,
285290 componentStyles ,
286291 ) ;
287292 }
@@ -352,12 +357,16 @@ export async function* serveWithVite(
352357 if ( server ) {
353358 // Update fs allow list to include any new assets from the build option.
354359 server . config . server . fs . allow = [
355- ...new Set ( [ ...server . config . server . fs . allow , ...assetFiles . values ( ) ] ) ,
360+ ...new Set ( [
361+ ...server . config . server . fs . allow ,
362+ ...[ ...assetFiles . values ( ) ] . map ( ( { source } ) => source ) ,
363+ ] ) ,
356364 ] ;
357365
358366 await handleUpdate (
359367 normalizePath ,
360368 generatedFiles ,
369+ assetFiles ,
361370 server ,
362371 serverOptions ,
363372 context . logger ,
@@ -471,15 +480,26 @@ export async function* serveWithVite(
471480async function handleUpdate (
472481 normalizePath : ( id : string ) => string ,
473482 generatedFiles : Map < string , OutputFileRecord > ,
483+ assetFiles : Map < string , OutputAssetRecord > ,
474484 server : ViteDevServer ,
475485 serverOptions : NormalizedDevServerOptions ,
476486 logger : BuilderContext [ 'logger' ] ,
477487 componentStyles : Map < string , ComponentStyleRecord > ,
478488) : Promise < void > {
479489 const updatedFiles : string [ ] = [ ] ;
480- let destroyAngularServerAppCalled = false ;
490+
491+ // Invalidate any updated asset
492+ for ( const [ file , record ] of assetFiles ) {
493+ if ( ! record . updated ) {
494+ continue ;
495+ }
496+
497+ record . updated = false ;
498+ updatedFiles . push ( file ) ;
499+ }
481500
482501 // Invalidate any updated files
502+ let destroyAngularServerAppCalled = false ;
483503 for ( const [ file , record ] of generatedFiles ) {
484504 if ( ! record . updated ) {
485505 continue ;
@@ -584,10 +604,16 @@ function updateResultRecord(
584604 normalizePath : ( id : string ) => string ,
585605 htmlIndexPath : string ,
586606 generatedFiles : Map < string , OutputFileRecord > ,
607+ assetFiles : Map < string , OutputAssetRecord > ,
587608 componentStyles : Map < string , ComponentStyleRecord > ,
588609 initial = false ,
589610) : void {
590611 if ( file . origin === 'disk' ) {
612+ assetFiles . set ( '/' + normalizePath ( outputPath ) , {
613+ source : normalizePath ( file . inputPath ) ,
614+ updated : ! initial ,
615+ } ) ;
616+
591617 return ;
592618 }
593619
@@ -644,7 +670,7 @@ function updateResultRecord(
644670export async function setupServer (
645671 serverOptions : NormalizedDevServerOptions ,
646672 outputFiles : Map < string , OutputFileRecord > ,
647- assets : Map < string , string > ,
673+ assets : Map < string , OutputAssetRecord > ,
648674 preserveSymlinks : boolean | undefined ,
649675 externalMetadata : DevServerExternalResultMetadata ,
650676 ssrMode : ServerSsrMode ,
@@ -743,7 +769,11 @@ export async function setupServer(
743769 // The first two are required for Vite to function in prebundling mode (the default) and to load
744770 // the Vite client-side code for browser reloading. These would be available by default but when
745771 // the `allow` option is explicitly configured, they must be included manually.
746- allow : [ cacheDir , join ( serverOptions . workspaceRoot , 'node_modules' ) , ...assets . values ( ) ] ,
772+ allow : [
773+ cacheDir ,
774+ join ( serverOptions . workspaceRoot , 'node_modules' ) ,
775+ ...[ ...assets . values ( ) ] . map ( ( { source } ) => source ) ,
776+ ] ,
747777 } ,
748778 // This is needed when `externalDependencies` is used to prevent Vite load errors.
749779 // NOTE: If Vite adds direct support for externals, this can be removed.
0 commit comments