@@ -104,7 +104,6 @@ export async function buildSingle(
104
104
let ab : AbortController | undefined
105
105
106
106
const { hooks, context } = await createHooks ( config )
107
- let watcher : RolldownWatcher
108
107
109
108
await hooks . callHook ( 'build:prepare' , context )
110
109
ab ?. abort ( )
@@ -113,8 +112,9 @@ export async function buildSingle(
113
112
114
113
const isMultiFormat = formats . length > 1
115
114
const chunks : TsdownChunks = { }
115
+ const watchers : RolldownWatcher [ ] = [ ]
116
116
117
- async function buildByFormat ( format : NormalizedFormat ) {
117
+ async function buildOptionsByFormat ( format : NormalizedFormat ) {
118
118
const buildOptions = await getBuildOptions (
119
119
config ,
120
120
format ,
@@ -129,9 +129,13 @@ export async function buildSingle(
129
129
buildOptions,
130
130
} )
131
131
132
- const buildOptionsList = [ buildOptions ]
132
+ const buildOptionsList : [
133
+ format : NormalizedFormat ,
134
+ buildOptions : BuildOptions ,
135
+ ] [ ] = [ [ format , buildOptions ] ]
133
136
if ( format === 'cjs' && dts ) {
134
- buildOptionsList . push (
137
+ buildOptionsList . push ( [
138
+ format ,
135
139
await getBuildOptions (
136
140
config ,
137
141
format ,
@@ -141,72 +145,85 @@ export async function buildSingle(
141
145
isMultiFormat ,
142
146
true ,
143
147
) ,
144
- )
148
+ ] )
145
149
}
146
150
147
- if ( watch ) {
148
- watcher = rolldownWatch ( buildOptionsList )
149
- const changedFile : string [ ] = [ ]
150
- let hasError = false
151
- watcher . on ( 'change' , ( id , event ) => {
152
- if ( event . event === 'update' ) {
153
- changedFile . push ( id )
154
- }
155
- } )
156
- watcher . on ( 'event' , async ( event ) => {
157
- switch ( event . code ) {
158
- case 'START' : {
151
+ return buildOptionsList
152
+ }
153
+ const buildOptionsList = (
154
+ await Promise . all ( formats . map ( buildOptionsByFormat ) )
155
+ ) . flat ( )
156
+
157
+ if ( watch ) {
158
+ const watcher = rolldownWatch ( buildOptionsList . map ( ( item ) => item [ 1 ] ) )
159
+ const changedFile : string [ ] = [ ]
160
+ let hasError = false
161
+ watcher . on ( 'change' , ( id , event ) => {
162
+ if ( event . event === 'update' ) {
163
+ changedFile . push ( id )
164
+ }
165
+ } )
166
+ watcher . on ( 'event' , async ( event ) => {
167
+ switch ( event . code ) {
168
+ case 'START' : {
169
+ for ( const format of formats ) {
159
170
chunks [ format ] ! . length = 0
160
- hasError = false
161
- break
162
171
}
172
+ hasError = false
173
+ break
174
+ }
163
175
164
- case 'END' : {
165
- if ( ! hasError ) {
166
- await postBuild ( )
167
- }
168
- break
176
+ case 'END' : {
177
+ if ( ! hasError ) {
178
+ await postBuild ( )
169
179
}
180
+ break
181
+ }
170
182
171
- case 'BUNDLE_START' : {
172
- if ( changedFile . length > 0 ) {
173
- console . info ( '' )
174
- logger . info (
175
- `Found ${ bold ( changedFile . join ( ', ' ) ) } changed, rebuilding...` ,
176
- )
177
- }
178
- changedFile . length = 0
179
- break
183
+ case 'BUNDLE_START' : {
184
+ if ( changedFile . length > 0 ) {
185
+ console . info ( '' )
186
+ logger . info (
187
+ `Found ${ bold ( changedFile . join ( ', ' ) ) } changed, rebuilding...` ,
188
+ )
180
189
}
190
+ changedFile . length = 0
191
+ break
192
+ }
181
193
182
- case 'BUNDLE_END' : {
183
- await event . result . close ( )
184
- logger . success ( `Rebuilt in ${ event . duration } ms.` )
185
- break
186
- }
194
+ case 'BUNDLE_END' : {
195
+ await event . result . close ( )
196
+ logger . success ( `Rebuilt in ${ event . duration } ms.` )
197
+ break
198
+ }
187
199
188
- case 'ERROR' : {
189
- await event . result . close ( )
190
- logger . error ( event . error )
191
- hasError = true
192
- break
193
- }
200
+ case 'ERROR' : {
201
+ await event . result . close ( )
202
+ logger . error ( event . error )
203
+ hasError = true
204
+ break
194
205
}
195
- } )
196
- } else {
197
- const output = ( await rolldownBuild ( buildOptionsList ) ) . flatMap (
198
- ( { output } ) => output ,
199
- )
200
- chunks [ format ] = output
206
+ }
207
+ } )
208
+ watchers . push ( watcher )
209
+ } else {
210
+ const outputs = (
211
+ await rolldownBuild ( buildOptionsList . map ( ( item ) => item [ 1 ] ) )
212
+ ) . map ( ( { output } ) => output )
213
+ for ( const [ i , output ] of outputs . entries ( ) ) {
214
+ const format = buildOptionsList [ i ] [ 0 ]
215
+ chunks [ format ] ||= [ ]
216
+ chunks [ format ] . push ( ...output )
201
217
}
202
218
}
203
- await Promise . all ( formats . map ( buildByFormat ) )
204
219
205
220
if ( watch ) {
206
221
return {
207
222
async [ Symbol . asyncDispose ] ( ) {
208
223
ab ?. abort ( )
209
- await watcher . close ( )
224
+ for ( const watcher of watchers ) {
225
+ await watcher . close ( )
226
+ }
210
227
} ,
211
228
}
212
229
} else {
0 commit comments