8
8
9
9
import { EmittedFiles } from '@angular-devkit/build-webpack' ;
10
10
import { Path , basename , getSystemPath , join , virtualFs } from '@angular-devkit/core' ;
11
- import { Observable } from 'rxjs' ;
11
+ import { Observable , of } from 'rxjs' ;
12
12
import { map , switchMap } from 'rxjs/operators' ;
13
13
import { ExtraEntryPoint } from '../../../browser/schema' ;
14
14
import { generateEntryPoints } from '../package-chunk-sort' ;
15
15
import { stripBom } from '../strip-bom' ;
16
16
import { FileInfo , augmentIndexHtml } from './augment-index-html' ;
17
17
18
+ type ExtensionFilter = '.js' | '.css' ;
19
+
18
20
export interface WriteIndexHtmlOptions {
19
21
host : virtualFs . Host ;
20
22
outputPath : Path ;
21
23
indexPath : Path ;
22
- ES5BuildFiles : EmittedFiles [ ] ;
23
- ES2015BuildFiles : EmittedFiles [ ] ;
24
+ files ?: EmittedFiles [ ] ;
25
+ noModuleFiles ?: EmittedFiles [ ] ;
26
+ moduleFiles ?: EmittedFiles [ ] ;
24
27
baseHref ?: string ;
25
28
deployUrl ?: string ;
26
29
sri ?: boolean ;
27
30
scripts ?: ExtraEntryPoint [ ] ;
28
31
styles ?: ExtraEntryPoint [ ] ;
32
+ postTransform ?: IndexHtmlTransform ;
29
33
}
30
34
35
+ export type IndexHtmlTransform = ( content : string ) => Promise < string > ;
36
+
31
37
export function writeIndexHtml ( {
32
38
host,
33
39
outputPath,
34
40
indexPath,
35
- ES5BuildFiles,
36
- ES2015BuildFiles,
41
+ files = [ ] ,
42
+ noModuleFiles = [ ] ,
43
+ moduleFiles = [ ] ,
37
44
baseHref,
38
45
deployUrl,
39
46
sri = false ,
40
47
scripts = [ ] ,
41
48
styles = [ ] ,
49
+ postTransform,
42
50
} : WriteIndexHtmlOptions ) : Observable < void > {
43
51
44
52
return host . read ( indexPath )
@@ -51,9 +59,9 @@ export function writeIndexHtml({
51
59
deployUrl,
52
60
sri,
53
61
entrypoints : generateEntryPoints ( { scripts, styles } ) ,
54
- files : filterAndMapBuildFiles ( ES5BuildFiles , '. css') ,
55
- noModuleFiles : filterAndMapBuildFiles ( ES5BuildFiles , '.js' ) ,
56
- moduleFiles : filterAndMapBuildFiles ( ES2015BuildFiles , '.js' ) ,
62
+ files : filterAndMapBuildFiles ( files , [ '.js' , '. css'] ) ,
63
+ noModuleFiles : filterAndMapBuildFiles ( noModuleFiles , '.js' ) ,
64
+ moduleFiles : filterAndMapBuildFiles ( moduleFiles , '.js' ) ,
57
65
loadOutputFile : async filePath => {
58
66
return host . read ( join ( outputPath , filePath ) )
59
67
. pipe (
@@ -63,18 +71,23 @@ export function writeIndexHtml({
63
71
} ,
64
72
} ) ,
65
73
) ,
66
- map ( content => virtualFs . stringToFileBuffer ( content . source ( ) ) ) ,
74
+ switchMap ( content => postTransform ? postTransform ( content ) : of ( content ) ) ,
75
+ map ( content => virtualFs . stringToFileBuffer ( content ) ) ,
67
76
switchMap ( content => host . write ( join ( outputPath , basename ( indexPath ) ) , content ) ) ,
68
77
) ;
69
78
}
70
79
71
80
function filterAndMapBuildFiles (
72
81
files : EmittedFiles [ ] ,
73
- extensionFilter : '.js' | '.css' ,
82
+ extensionFilter : ExtensionFilter | ExtensionFilter [ ] ,
74
83
) : FileInfo [ ] {
75
84
const filteredFiles : FileInfo [ ] = [ ] ;
85
+ const validExtensions : string [ ] = Array . isArray ( extensionFilter )
86
+ ? extensionFilter
87
+ : [ extensionFilter ] ;
88
+
76
89
for ( const { file, name, extension, initial } of files ) {
77
- if ( name && initial && extension === extensionFilter ) {
90
+ if ( name && initial && validExtensions . includes ( extension ) ) {
78
91
filteredFiles . push ( { file, extension, name } ) ;
79
92
}
80
93
}
0 commit comments