@@ -51,7 +51,11 @@ import { ssrManifestPlugin } from './ssr/ssrManifestPlugin'
5151import { loadFallbackPlugin } from './plugins/loadFallback'
5252import { findNearestPackageData } from './packages'
5353import type { PackageCache } from './packages'
54- import { resolveChokidarOptions } from './watch'
54+ import {
55+ getResolvedOutDirs ,
56+ resolveChokidarOptions ,
57+ resolveEmptyOutDir ,
58+ } from './watch'
5559import { completeSystemWrapPlugin } from './plugins/completeSystemWrap'
5660import { mergeConfig } from './publicUtils'
5761import { webWorkerPostPlugin } from './plugins/worker'
@@ -655,7 +659,17 @@ export async function build(
655659 normalizedOutputs . push ( buildOutputOptions ( outputs ) )
656660 }
657661
658- const outDirs = normalizedOutputs . map ( ( { dir } ) => resolve ( dir ! ) )
662+ const resolvedOutDirs = getResolvedOutDirs (
663+ config . root ,
664+ options . outDir ,
665+ options . rollupOptions ?. output ,
666+ )
667+ const emptyOutDir = resolveEmptyOutDir (
668+ options . emptyOutDir ,
669+ config . root ,
670+ resolvedOutDirs ,
671+ config . logger ,
672+ )
659673
660674 // watch file changes with rollup
661675 if ( config . build . watch ) {
@@ -664,6 +678,8 @@ export async function build(
664678 const resolvedChokidarOptions = resolveChokidarOptions (
665679 config ,
666680 config . build . watch . chokidar ,
681+ resolvedOutDirs ,
682+ emptyOutDir ,
667683 )
668684
669685 const { watch } = await import ( 'rollup' )
@@ -680,7 +696,7 @@ export async function build(
680696 if ( event . code === 'BUNDLE_START' ) {
681697 config . logger . info ( colors . cyan ( `\nbuild started...` ) )
682698 if ( options . write ) {
683- prepareOutDir ( outDirs , options . emptyOutDir , config )
699+ prepareOutDir ( resolvedOutDirs , emptyOutDir , config )
684700 }
685701 } else if ( event . code === 'BUNDLE_END' ) {
686702 event . result . close ( )
@@ -699,7 +715,7 @@ export async function build(
699715 bundle = await rollup ( rollupOptions )
700716
701717 if ( options . write ) {
702- prepareOutDir ( outDirs , options . emptyOutDir , config )
718+ prepareOutDir ( resolvedOutDirs , emptyOutDir , config )
703719 }
704720
705721 const res : RollupOutput [ ] = [ ]
@@ -726,36 +742,15 @@ export async function build(
726742}
727743
728744function prepareOutDir (
729- outDirs : string [ ] ,
745+ outDirs : Set < string > ,
730746 emptyOutDir : boolean | null ,
731747 config : ResolvedConfig ,
732748) {
733- const nonDuplicateDirs = new Set ( outDirs )
734- let outside = false
735- if ( emptyOutDir == null ) {
736- for ( const outDir of nonDuplicateDirs ) {
737- if (
738- fs . existsSync ( outDir ) &&
739- ! normalizePath ( outDir ) . startsWith ( withTrailingSlash ( config . root ) )
740- ) {
741- // warn if outDir is outside of root
742- config . logger . warn (
743- colors . yellow (
744- `\n${ colors . bold ( `(!)` ) } outDir ${ colors . white (
745- colors . dim ( outDir ) ,
746- ) } is not inside project root and will not be emptied.\n` +
747- `Use --emptyOutDir to override.\n` ,
748- ) ,
749- )
750- outside = true
751- break
752- }
753- }
754- }
755- for ( const outDir of nonDuplicateDirs ) {
756- if ( ! outside && emptyOutDir !== false && fs . existsSync ( outDir ) ) {
749+ const outDirsArray = [ ...outDirs ]
750+ for ( const outDir of outDirs ) {
751+ if ( emptyOutDir !== false && fs . existsSync ( outDir ) ) {
757752 // skip those other outDirs which are nested in current outDir
758- const skipDirs = outDirs
753+ const skipDirs = outDirsArray
759754 . map ( ( dir ) => {
760755 const relative = path . relative ( outDir , dir )
761756 if (
0 commit comments