@@ -51,7 +51,11 @@ import { ssrManifestPlugin } from './ssr/ssrManifestPlugin'
51
51
import { loadFallbackPlugin } from './plugins/loadFallback'
52
52
import { findNearestPackageData } from './packages'
53
53
import type { PackageCache } from './packages'
54
- import { resolveChokidarOptions } from './watch'
54
+ import {
55
+ getResolvedOutDirs ,
56
+ resolveChokidarOptions ,
57
+ resolveEmptyOutDir ,
58
+ } from './watch'
55
59
import { completeSystemWrapPlugin } from './plugins/completeSystemWrap'
56
60
import { mergeConfig } from './publicUtils'
57
61
import { webWorkerPostPlugin } from './plugins/worker'
@@ -655,7 +659,17 @@ export async function build(
655
659
normalizedOutputs . push ( buildOutputOptions ( outputs ) )
656
660
}
657
661
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
+ )
659
673
660
674
// watch file changes with rollup
661
675
if ( config . build . watch ) {
@@ -664,6 +678,8 @@ export async function build(
664
678
const resolvedChokidarOptions = resolveChokidarOptions (
665
679
config ,
666
680
config . build . watch . chokidar ,
681
+ resolvedOutDirs ,
682
+ emptyOutDir ,
667
683
)
668
684
669
685
const { watch } = await import ( 'rollup' )
@@ -680,7 +696,7 @@ export async function build(
680
696
if ( event . code === 'BUNDLE_START' ) {
681
697
config . logger . info ( colors . cyan ( `\nbuild started...` ) )
682
698
if ( options . write ) {
683
- prepareOutDir ( outDirs , options . emptyOutDir , config )
699
+ prepareOutDir ( resolvedOutDirs , emptyOutDir , config )
684
700
}
685
701
} else if ( event . code === 'BUNDLE_END' ) {
686
702
event . result . close ( )
@@ -699,7 +715,7 @@ export async function build(
699
715
bundle = await rollup ( rollupOptions )
700
716
701
717
if ( options . write ) {
702
- prepareOutDir ( outDirs , options . emptyOutDir , config )
718
+ prepareOutDir ( resolvedOutDirs , emptyOutDir , config )
703
719
}
704
720
705
721
const res : RollupOutput [ ] = [ ]
@@ -726,36 +742,15 @@ export async function build(
726
742
}
727
743
728
744
function prepareOutDir (
729
- outDirs : string [ ] ,
745
+ outDirs : Set < string > ,
730
746
emptyOutDir : boolean | null ,
731
747
config : ResolvedConfig ,
732
748
) {
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 ) ) {
757
752
// skip those other outDirs which are nested in current outDir
758
- const skipDirs = outDirs
753
+ const skipDirs = outDirsArray
759
754
. map ( ( dir ) => {
760
755
const relative = path . relative ( outDir , dir )
761
756
if (
0 commit comments