@@ -15,15 +15,14 @@ import {
15
15
TmpDir ,
16
16
} from "builder-util"
17
17
import { CancellationToken } from "builder-util-runtime"
18
- import { EventEmitter } from "events"
19
18
import { chmod , mkdirs , outputFile } from "fs-extra"
20
19
import * as isCI from "is-ci"
21
20
import { Lazy } from "lazy-val"
22
21
import { release as getOsRelease } from "os"
23
22
import * as path from "path"
24
23
import { AppInfo } from "./appInfo"
25
24
import { readAsarJson } from "./asar/asar"
26
- import { AfterPackContext , Configuration } from "./configuration"
25
+ import { AfterExtractContext , AfterPackContext , BeforePackContext , Configuration , Hook } from "./configuration"
27
26
import { Platform , SourceRepositoryInfo , Target } from "./core"
28
27
import { createElectronFrameworkSupport } from "./electron/ElectronFramework"
29
28
import { Framework } from "./Framework"
@@ -41,10 +40,7 @@ import { getRepositoryInfo } from "./util/repositoryInfo"
41
40
import { resolveFunction } from "./util/resolve"
42
41
import { installOrRebuild , nodeGypRebuild } from "./util/yarn"
43
42
import { PACKAGE_VERSION } from "./version"
44
-
45
- function addHandler ( emitter : EventEmitter , event : string , handler : ( ...args : Array < any > ) => void ) {
46
- emitter . on ( event , handler )
47
- }
43
+ import { AsyncEventEmitter , HandlerType } from "./util/asyncEventEmitter"
48
44
49
45
async function createFrameworkInfo ( configuration : Configuration , packager : Packager ) : Promise < Framework > {
50
46
let framework = configuration . framework
@@ -72,6 +68,23 @@ async function createFrameworkInfo(configuration: Configuration, packager: Packa
72
68
}
73
69
}
74
70
71
+ type PackagerEvents = {
72
+ artifactBuildStarted : Hook < ArtifactBuildStarted , void >
73
+
74
+ beforePack : Hook < BeforePackContext , void >
75
+ afterExtract : Hook < AfterExtractContext , void >
76
+ afterPack : Hook < AfterPackContext , void >
77
+ afterSign : Hook < AfterPackContext , void >
78
+
79
+ artifactBuildCompleted : Hook < ArtifactCreated , void >
80
+
81
+ msiProjectCreated : Hook < string , void >
82
+ appxManifestCreated : Hook < string , void >
83
+
84
+ // internal-use only, prefer usage of `artifactBuildCompleted`
85
+ artifactCreated : Hook < ArtifactCreated , void >
86
+ }
87
+
75
88
export class Packager {
76
89
readonly projectDir : string
77
90
@@ -110,7 +123,7 @@ export class Packager {
110
123
111
124
isTwoPackageJsonProjectLayoutUsed = false
112
125
113
- readonly eventEmitter = new EventEmitter ( )
126
+ private readonly eventEmitter = new AsyncEventEmitter < PackagerEvents > ( )
114
127
115
128
_appInfo : AppInfo | null = null
116
129
get appInfo ( ) : AppInfo {
@@ -121,8 +134,6 @@ export class Packager {
121
134
122
135
private _repositoryInfo = new Lazy < SourceRepositoryInfo | null > ( ( ) => getRepositoryInfo ( this . projectDir , this . metadata , this . devMetadata ) )
123
136
124
- private readonly afterPackHandlers : Array < ( context : AfterPackContext ) => Promise < any > | null > = [ ]
125
-
126
137
readonly options : PackagerOptions
127
138
128
139
readonly debugLogger = new DebugLogger ( log . isDebugEnabled )
@@ -246,26 +257,42 @@ export class Packager {
246
257
prepackaged : options . prepackaged == null ? null : path . resolve ( this . projectDir , options . prepackaged ) ,
247
258
}
248
259
249
- try {
250
- log . info ( { version : PACKAGE_VERSION , os : getOsRelease ( ) } , "electron-builder" )
251
- } catch ( e : any ) {
252
- // error in dev mode without babel
253
- if ( ! ( e instanceof ReferenceError ) ) {
254
- throw e
255
- }
256
- }
260
+ log . info ( { version : PACKAGE_VERSION , os : getOsRelease ( ) } , "electron-builder" )
257
261
}
258
262
259
- addAfterPackHandler ( handler : ( context : AfterPackContext ) => Promise < any > | null ) {
260
- this . afterPackHandlers . push ( handler )
263
+ addPackagerEventHandlers ( ) {
264
+ const { type } = this . appInfo
265
+ this . eventEmitter . on ( "artifactBuildStarted" , resolveFunction ( type , this . config . artifactBuildStarted , "artifactBuildStarted" ) , "user" )
266
+ this . eventEmitter . on ( "artifactBuildCompleted" , resolveFunction ( type , this . config . artifactBuildCompleted , "artifactBuildCompleted" ) , "user" )
267
+
268
+ this . eventEmitter . on ( "appxManifestCreated" , resolveFunction ( type , this . config . appxManifestCreated , "appxManifestCreated" ) , "user" )
269
+ this . eventEmitter . on ( "msiProjectCreated" , resolveFunction ( type , this . config . msiProjectCreated , "msiProjectCreated" ) , "user" )
270
+
271
+ this . eventEmitter . on ( "beforePack" , resolveFunction ( type , this . config . beforePack , "beforePack" ) , "user" )
272
+ this . eventEmitter . on ( "afterExtract" , resolveFunction ( type , this . config . afterExtract , "afterExtract" ) , "user" )
273
+ this . eventEmitter . on ( "afterPack" , resolveFunction ( type , this . config . afterPack , "afterPack" ) , "user" )
274
+ this . eventEmitter . on ( "afterSign" , resolveFunction ( type , this . config . afterSign , "afterSign" ) , "user" )
261
275
}
262
276
263
- artifactCreated ( handler : ( event : ArtifactCreated ) => void ) : Packager {
264
- addHandler ( this . eventEmitter , "artifactCreated ", handler )
277
+ onAfterPack ( handler : PackagerEvents [ "afterPack" ] ) : Packager {
278
+ this . eventEmitter . on ( "afterPack ", handler )
265
279
return this
266
280
}
267
281
268
- async callArtifactBuildStarted ( event : ArtifactBuildStarted , logFields ?: any ) : Promise < void > {
282
+ onArtifactCreated ( handler : PackagerEvents [ "artifactCreated" ] ) : Packager {
283
+ this . eventEmitter . on ( "artifactCreated" , handler )
284
+ return this
285
+ }
286
+
287
+ filterPackagerEventListeners ( event : keyof PackagerEvents , type : HandlerType | undefined ) {
288
+ return this . eventEmitter . filterListeners ( event , type )
289
+ }
290
+
291
+ clearPackagerEventListeners ( ) {
292
+ this . eventEmitter . clear ( )
293
+ }
294
+
295
+ async emitArtifactBuildStarted ( event : ArtifactBuildStarted , logFields ?: any ) {
269
296
log . info (
270
297
logFields || {
271
298
target : event . targetPresentableName ,
@@ -274,40 +301,43 @@ export class Packager {
274
301
} ,
275
302
"building"
276
303
)
277
- const handler = await resolveFunction ( this . appInfo . type , this . config . artifactBuildStarted , "artifactBuildStarted" )
278
- if ( handler != null ) {
279
- await Promise . resolve ( handler ( event ) )
280
- }
304
+ await this . eventEmitter . emit ( "artifactBuildStarted" , event )
281
305
}
282
306
283
307
/**
284
308
* Only for sub artifacts (update info), for main artifacts use `callArtifactBuildCompleted`.
285
309
*/
286
- dispatchArtifactCreated ( event : ArtifactCreated ) : void {
287
- this . eventEmitter . emit ( "artifactCreated" , event )
310
+ async emitArtifactCreated ( event : ArtifactCreated ) {
311
+ await this . eventEmitter . emit ( "artifactCreated" , event )
288
312
}
289
313
290
- async callArtifactBuildCompleted ( event : ArtifactCreated ) : Promise < void > {
291
- const handler = await resolveFunction ( this . appInfo . type , this . config . artifactBuildCompleted , "artifactBuildCompleted" )
292
- if ( handler != null ) {
293
- await Promise . resolve ( handler ( event ) )
294
- }
314
+ async emitArtifactBuildCompleted ( event : ArtifactCreated ) {
315
+ await this . eventEmitter . emit ( "artifactBuildCompleted" , event )
316
+ await this . emitArtifactCreated ( event )
317
+ }
295
318
296
- this . dispatchArtifactCreated ( event )
319
+ async emitAppxManifestCreated ( path : string ) {
320
+ await this . eventEmitter . emit ( "appxManifestCreated" , path )
297
321
}
298
322
299
- async callAppxManifestCreated ( path : string ) : Promise < void > {
300
- const handler = await resolveFunction ( this . appInfo . type , this . config . appxManifestCreated , "appxManifestCreated" )
301
- if ( handler != null ) {
302
- await Promise . resolve ( handler ( path ) )
303
- }
323
+ async emitMsiProjectCreated ( path : string ) {
324
+ await this . eventEmitter . emit ( "msiProjectCreated" , path )
304
325
}
305
326
306
- async callMsiProjectCreated ( path : string ) : Promise < void > {
307
- const handler = await resolveFunction ( this . appInfo . type , this . config . msiProjectCreated , "msiProjectCreated" )
308
- if ( handler != null ) {
309
- await Promise . resolve ( handler ( path ) )
310
- }
327
+ async emitBeforePack ( context : BeforePackContext ) {
328
+ await this . eventEmitter . emit ( "beforePack" , context )
329
+ }
330
+
331
+ async emitAfterPack ( context : AfterPackContext ) {
332
+ await this . eventEmitter . emit ( "afterPack" , context )
333
+ }
334
+
335
+ async emitAfterSign ( context : AfterPackContext ) {
336
+ await this . eventEmitter . emit ( "afterSign" , context )
337
+ }
338
+
339
+ async emitAfterExtract ( context : AfterPackContext ) {
340
+ await this . eventEmitter . emit ( "afterExtract" , context )
311
341
}
312
342
313
343
async validateConfig ( ) : Promise < void > {
@@ -366,6 +396,8 @@ export class Packager {
366
396
}
367
397
368
398
this . _appInfo = new AppInfo ( this , null )
399
+ this . addPackagerEventHandlers ( )
400
+
369
401
this . _framework = await createFrameworkInfo ( this . config , this )
370
402
371
403
const commonOutDirWithoutPossibleOsMacro = path . resolve (
@@ -383,7 +415,7 @@ export class Packager {
383
415
384
416
// because artifact event maybe dispatched several times for different publish providers
385
417
const artifactPaths = new Set < string > ( )
386
- this . artifactCreated ( event => {
418
+ this . onArtifactCreated ( event => {
387
419
if ( event . file != null ) {
388
420
artifactPaths . add ( event . file )
389
421
}
@@ -547,19 +579,6 @@ export class Packager {
547
579
} )
548
580
}
549
581
}
550
-
551
- async afterPack ( context : AfterPackContext ) : Promise < any > {
552
- const afterPack = await resolveFunction ( this . appInfo . type , this . config . afterPack , "afterPack" )
553
- const handlers = this . afterPackHandlers . slice ( )
554
- if ( afterPack != null ) {
555
- // user handler should be last
556
- handlers . push ( afterPack )
557
- }
558
-
559
- for ( const handler of handlers ) {
560
- await Promise . resolve ( handler ( context ) )
561
- }
562
- }
563
582
}
564
583
565
584
function createOutDirIfNeed ( targetList : Array < Target > , createdOutDirs : Set < string > ) : Promise < any > {
0 commit comments