@@ -2,7 +2,7 @@ import { existsSync, promises } from "fs";
2
2
import { dirname , resolve } from "path" ;
3
3
import Piscina from "piscina" ;
4
4
import { CompileStatus } from "./constants" ;
5
- import { CliOptions } from "./options" ;
5
+ import { Callbacks , CliOptions } from "./options" ;
6
6
import { exists , getDest } from "./util" ;
7
7
import handleCompile from "./dirWorker" ;
8
8
import {
@@ -53,7 +53,11 @@ async function beforeStartCompilation(cliOptions: CliOptions) {
53
53
}
54
54
}
55
55
56
- async function initialCompilation ( cliOptions : CliOptions , swcOptions : Options ) {
56
+ async function initialCompilation (
57
+ cliOptions : CliOptions ,
58
+ swcOptions : Options ,
59
+ callbacks ?: Callbacks
60
+ ) {
57
61
const {
58
62
includeDotfiles,
59
63
filenames,
@@ -70,6 +74,7 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
70
74
} = cliOptions ;
71
75
72
76
const results = new Map < string , CompileStatus > ( ) ;
77
+ const reasons = new Map < string , string > ( ) ;
73
78
74
79
const start = process . hrtime ( ) ;
75
80
const sourceFiles = await globSources (
@@ -83,7 +88,6 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
83
88
extensions ,
84
89
copyFiles
85
90
) ;
86
-
87
91
if ( sync ) {
88
92
for ( const filename of compilable ) {
89
93
try {
@@ -97,7 +101,9 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
97
101
} ) ;
98
102
results . set ( filename , result ) ;
99
103
} catch ( err : any ) {
100
- console . error ( err . message ) ;
104
+ if ( ! callbacks ?. onFail ) {
105
+ console . error ( err . message ) ;
106
+ }
101
107
results . set ( filename , CompileStatus . Failed ) ;
102
108
}
103
109
}
@@ -110,7 +116,9 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
110
116
) ;
111
117
results . set ( filename , result ) ;
112
118
} catch ( err : any ) {
113
- console . error ( err . message ) ;
119
+ if ( ! callbacks ?. onFail ) {
120
+ console . error ( err . message ) ;
121
+ }
114
122
results . set ( filename , CompileStatus . Failed ) ;
115
123
}
116
124
}
@@ -134,7 +142,9 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
134
142
outFileExtension,
135
143
} )
136
144
. catch ( err => {
137
- console . error ( err . message ) ;
145
+ if ( ! callbacks ?. onFail ) {
146
+ console . error ( err . message ) ;
147
+ }
138
148
throw err ;
139
149
} )
140
150
)
@@ -151,6 +161,7 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
151
161
results . set ( filename , result . value ) ;
152
162
} else {
153
163
results . set ( filename , CompileStatus . Failed ) ;
164
+ reasons . set ( filename , result . reason . message ) ;
154
165
}
155
166
} ) ;
156
167
@@ -182,8 +193,9 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
182
193
break ;
183
194
}
184
195
}
196
+ const duration = end [ 1 ] / 1000000 ;
185
197
186
- if ( ! quiet && compiled + copied ) {
198
+ if ( compiled + copied ) {
187
199
let message = "" ;
188
200
if ( compiled ) {
189
201
message += `Successfully compiled: ${ compiled } ${
@@ -198,26 +210,40 @@ async function initialCompilation(cliOptions: CliOptions, swcOptions: Options) {
198
210
}
199
211
message += ` with swc (%dms)` ;
200
212
201
- console . log ( message , ( end [ 1 ] / 1000000 ) . toFixed ( 2 ) ) ;
213
+ if ( callbacks ?. onSuccess ) {
214
+ if ( ! failed ) {
215
+ callbacks . onSuccess ( { duration, compiled, copied } ) ;
216
+ }
217
+ } else if ( ! quiet ) {
218
+ console . log ( message , duration . toFixed ( 2 ) ) ;
219
+ }
202
220
}
203
221
204
222
if ( failed ) {
205
- console . log (
206
- `Failed to compile ${ failed } ${
207
- failed !== 1 ? "files" : "file"
208
- } with swc.`
209
- ) ;
210
- if ( ! watch ) {
211
- const files = Array . from ( results . entries ( ) )
212
- . filter ( ( [ , status ] ) => status === CompileStatus . Failed )
213
- . map ( ( [ filename , _ ] ) => filename )
214
- . join ( "\n" ) ;
215
- throw new Error ( `Failed to compile:\n${ files } ` ) ;
223
+ if ( callbacks ?. onFail ) {
224
+ callbacks . onFail ( { duration, reasons } ) ;
225
+ } else {
226
+ console . log (
227
+ `Failed to compile ${ failed } ${
228
+ failed !== 1 ? "files" : "file"
229
+ } with swc.`
230
+ ) ;
231
+ if ( ! watch ) {
232
+ const files = Array . from ( results . entries ( ) )
233
+ . filter ( ( [ , status ] ) => status === CompileStatus . Failed )
234
+ . map ( ( [ filename , _ ] ) => filename )
235
+ . join ( "\n" ) ;
236
+ throw new Error ( `Failed to compile:\n${ files } ` ) ;
237
+ }
216
238
}
217
239
}
218
240
}
219
241
220
- async function watchCompilation ( cliOptions : CliOptions , swcOptions : Options ) {
242
+ async function watchCompilation (
243
+ cliOptions : CliOptions ,
244
+ swcOptions : Options ,
245
+ callbacks ?: Callbacks
246
+ ) {
221
247
const {
222
248
includeDotfiles,
223
249
filenames,
@@ -232,7 +258,9 @@ async function watchCompilation(cliOptions: CliOptions, swcOptions: Options) {
232
258
233
259
const watcher = await watchSources ( filenames , includeDotfiles ) ;
234
260
watcher . on ( "ready" , ( ) => {
235
- if ( ! quiet ) {
261
+ if ( callbacks ?. onWatchReady ) {
262
+ callbacks . onWatchReady ( ) ;
263
+ } else if ( ! quiet ) {
236
264
console . info ( "Watching for file changes." ) ;
237
265
}
238
266
} ) ;
@@ -264,8 +292,13 @@ async function watchCompilation(cliOptions: CliOptions, swcOptions: Options) {
264
292
for ( const type of [ "add" , "change" ] ) {
265
293
watcher . on ( type , async filename => {
266
294
if ( isCompilableExtension ( filename , extensions ) ) {
295
+ const start = process . hrtime ( ) ;
296
+ const getDuration = ( ) => {
297
+ const end = process . hrtime ( start ) ;
298
+ const duration = end [ 1 ] / 1000000 ;
299
+ return duration ;
300
+ } ;
267
301
try {
268
- const start = process . hrtime ( ) ;
269
302
const result = await handleCompile ( {
270
303
filename,
271
304
outDir,
@@ -274,34 +307,67 @@ async function watchCompilation(cliOptions: CliOptions, swcOptions: Options) {
274
307
swcOptions,
275
308
outFileExtension,
276
309
} ) ;
277
- if ( ! quiet && result === CompileStatus . Compiled ) {
278
- const end = process . hrtime ( start ) ;
279
- console . log (
280
- `Successfully compiled ${ filename } with swc (%dms)` ,
281
- ( end [ 1 ] / 1000000 ) . toFixed ( 2 )
282
- ) ;
310
+ const duration = getDuration ( ) ;
311
+ if ( result === CompileStatus . Compiled ) {
312
+ if ( callbacks ?. onSuccess ) {
313
+ callbacks . onSuccess ( {
314
+ duration,
315
+ compiled : 1 ,
316
+ filename,
317
+ } ) ;
318
+ } else if ( ! quiet ) {
319
+ console . log (
320
+ `Successfully compiled ${ filename } with swc (%dms)` ,
321
+ duration . toFixed ( 2 )
322
+ ) ;
323
+ }
324
+ }
325
+ } catch ( error : any ) {
326
+ if ( callbacks ?. onFail ) {
327
+ const reasons = new Map < string , string > ( ) ;
328
+ reasons . set ( filename , error . message ) ;
329
+ callbacks . onFail ( { duration : getDuration ( ) , reasons } ) ;
330
+ } else {
331
+ console . error ( error . message ) ;
283
332
}
284
- } catch ( err : any ) {
285
- console . error ( err . message ) ;
286
333
}
287
334
} else if ( copyFiles ) {
335
+ const start = process . hrtime ( ) ;
336
+ const getDuration = ( ) => {
337
+ const end = process . hrtime ( start ) ;
338
+ const duration = end [ 1 ] / 1000000 ;
339
+ return duration ;
340
+ } ;
288
341
try {
289
- const start = process . hrtime ( ) ;
290
342
const result = await handleCopy (
291
343
filename ,
292
344
outDir ,
293
345
stripLeadingPaths
294
346
) ;
295
- if ( ! quiet && result === CompileStatus . Copied ) {
296
- const end = process . hrtime ( start ) ;
297
- console . log (
298
- `Successfully copied ${ filename } with swc (%dms)` ,
299
- ( end [ 1 ] / 1000000 ) . toFixed ( 2 )
300
- ) ;
347
+ if ( result === CompileStatus . Copied ) {
348
+ const duration = getDuration ( ) ;
349
+ if ( callbacks ?. onSuccess ) {
350
+ callbacks . onSuccess ( {
351
+ duration,
352
+ copied : 1 ,
353
+ filename,
354
+ } ) ;
355
+ } else if ( ! quiet ) {
356
+ console . log (
357
+ `Successfully copied ${ filename } with swc (%dms)` ,
358
+ duration . toFixed ( 2 )
359
+ ) ;
360
+ }
361
+ }
362
+ } catch ( error : any ) {
363
+ if ( callbacks ?. onFail ) {
364
+ const reasons = new Map < string , string > ( ) ;
365
+ reasons . set ( filename , error . message ) ;
366
+ callbacks . onFail ( { duration : getDuration ( ) , reasons } ) ;
367
+ } else {
368
+ console . error ( `Failed to copy ${ filename } ` ) ;
369
+ console . error ( error . message ) ;
301
370
}
302
- } catch ( err : any ) {
303
- console . error ( `Failed to copy ${ filename } ` ) ;
304
- console . error ( err . message ) ;
305
371
}
306
372
}
307
373
} ) ;
@@ -311,16 +377,18 @@ async function watchCompilation(cliOptions: CliOptions, swcOptions: Options) {
311
377
export default async function dir ( {
312
378
cliOptions,
313
379
swcOptions,
380
+ callbacks,
314
381
} : {
315
382
cliOptions : CliOptions ;
316
383
swcOptions : Options ;
384
+ callbacks ?: Callbacks ;
317
385
} ) {
318
386
const { watch } = cliOptions ;
319
387
320
388
await beforeStartCompilation ( cliOptions ) ;
321
- await initialCompilation ( cliOptions , swcOptions ) ;
389
+ await initialCompilation ( cliOptions , swcOptions , callbacks ) ;
322
390
323
391
if ( watch ) {
324
- await watchCompilation ( cliOptions , swcOptions ) ;
392
+ await watchCompilation ( cliOptions , swcOptions , callbacks ) ;
325
393
}
326
394
}
0 commit comments