1
- import { promises } from 'fs' ;
1
+ import { existsSync , readFileSync , writeFileSync } from 'fs' ;
2
2
import { basename , join } from 'path' ;
3
3
import { BuilderContext , createBuilder , targetFromTargetString } from '@angular-devkit/architect' ;
4
- import { BrowserBuilderOptions } from '@angular-devkit/build-angular' ;
4
+ import { ApplicationBuilderOptions , BrowserBuilderOptions } from '@angular-devkit/build-angular' ;
5
5
import { json , JsonObject } from '@angular-devkit/core' ;
6
6
import { Ngssc } from 'angular-server-side-configuration' ;
7
- import { glob } from 'glob' ;
7
+ import * as glob from 'glob' ;
8
8
import { Schema } from './schema' ;
9
9
import { VariableDetector } from './variable-detector' ;
10
10
import { NgsscContext } from './ngssc-context' ;
11
11
12
12
export type NgsscBuildSchema = Schema ;
13
-
14
- const readFileAsync = promises . readFile ;
15
- const writeFileAsync = promises . writeFile ;
13
+ type BuilderOptions = ApplicationBuilderOptions | BrowserBuilderOptions ;
14
+ type ApplicationBuilderVariant = undefined | 'browser-only' | 'server' ;
16
15
17
16
export async function ngsscBuild ( options : NgsscBuildSchema , context : BuilderContext ) {
18
17
const buildTarget = targetFromTargetString ( options . buildTarget || options . browserTarget ) ;
19
- const rawBrowserOptions = await context . getTargetOptions ( buildTarget ) ;
20
- const browserName = await context . getBuilderNameForTarget ( buildTarget ) ;
21
- const browserOptions = await context . validateOptions < json . JsonObject & BrowserBuilderOptions > (
22
- rawBrowserOptions ,
23
- browserName ,
18
+ const rawBuilderOptions = await context . getTargetOptions ( buildTarget ) ;
19
+ const builderName = await context . getBuilderNameForTarget ( buildTarget ) ;
20
+ const builderOptions = await context . validateOptions < json . JsonObject & BuilderOptions > (
21
+ rawBuilderOptions ,
22
+ builderName ,
24
23
) ;
25
24
const scheduledTarget = await context . scheduleTarget ( buildTarget ) ;
26
25
const result = await scheduledTarget . result ;
@@ -32,20 +31,43 @@ export async function ngsscBuild(options: NgsscBuildSchema, context: BuilderCont
32
31
return result ;
33
32
}
34
33
35
- await detectVariablesAndBuildNgsscJson ( options , browserOptions , context ) ;
34
+ await detectVariablesAndBuildNgsscJson (
35
+ options ,
36
+ builderOptions ,
37
+ context ,
38
+ false ,
39
+ builderName !== '@angular-devkit/build-angular:application'
40
+ ? undefined
41
+ : 'server' in builderOptions && builderOptions . server
42
+ ? 'server'
43
+ : 'browser-only' ,
44
+ ) ;
45
+
36
46
return result ;
37
47
}
38
48
39
49
export async function detectVariablesAndBuildNgsscJson (
40
50
options : NgsscBuildSchema ,
41
- browserOptions : BrowserBuilderOptions ,
51
+ builderOptions : BuilderOptions ,
42
52
context : BuilderContext ,
43
53
multiple : boolean = false ,
54
+ applicationBuilderVariant : ApplicationBuilderVariant = undefined ,
44
55
) {
45
56
const ngsscContext = await detectVariables ( context , options . searchPattern ) ;
46
- const outputPath = join ( context . workspaceRoot , browserOptions . outputPath ) ;
47
- const ngssc = buildNgssc ( ngsscContext , options , browserOptions , multiple ) ;
48
- await writeFileAsync ( join ( outputPath , 'ngssc.json' ) , JSON . stringify ( ngssc , null , 2 ) , 'utf8' ) ;
57
+ let outputPath = join ( context . workspaceRoot , builderOptions . outputPath ) ;
58
+ const ngssc = buildNgssc (
59
+ ngsscContext ,
60
+ options ,
61
+ builderOptions ,
62
+ multiple ,
63
+ applicationBuilderVariant ,
64
+ ) ;
65
+
66
+ const browserOutputPath = join ( outputPath , 'browser' ) ;
67
+ if ( applicationBuilderVariant === 'browser-only' && existsSync ( browserOutputPath ) ) {
68
+ outputPath = browserOutputPath ;
69
+ }
70
+ writeFileSync ( join ( outputPath , 'ngssc.json' ) , JSON . stringify ( ngssc , null , 2 ) , 'utf8' ) ;
49
71
}
50
72
51
73
export async function detectVariables (
@@ -64,14 +86,14 @@ export async function detectVariables(
64
86
: '**/environments/environment*.ts' ;
65
87
66
88
const detector = new VariableDetector ( context . logger ) ;
67
- const typeScriptFiles = await glob ( searchPattern || defaultSearchPattern , {
89
+ const typeScriptFiles = await glob . glob ( searchPattern || defaultSearchPattern , {
68
90
absolute : true ,
69
91
cwd : context . workspaceRoot ,
70
92
ignore : [ '**/node_modules/**' , '**/*.spec.ts' , '**/*.d.ts' ] ,
71
93
} ) ;
72
94
let ngsscContext : NgsscContext | null = null ;
73
95
for ( const file of typeScriptFiles ) {
74
- const fileContent = await readFileAsync ( file , 'utf8' ) ;
96
+ const fileContent = readFileSync ( file , 'utf8' ) ;
75
97
const innerNgsscContext = detector . detect ( fileContent ) ;
76
98
if ( ! innerNgsscContext . variables . length ) {
77
99
continue ;
@@ -103,22 +125,34 @@ export async function detectVariables(
103
125
export function buildNgssc (
104
126
ngsscContext : NgsscContext ,
105
127
options : NgsscBuildSchema ,
106
- browserOptions ?: BrowserBuilderOptions ,
128
+ builderOptions ?: BuilderOptions ,
107
129
multiple : boolean = false ,
130
+ applicationBuilderVariant : ApplicationBuilderVariant = undefined ,
108
131
) : Ngssc {
109
132
return {
110
133
environmentVariables : [
111
134
...ngsscContext . variables ,
112
135
...( options . additionalEnvironmentVariables || [ ] ) ,
113
136
] ,
114
- filePattern : options . filePattern || extractFilePattern ( browserOptions ?. index , multiple ) ,
137
+ filePattern :
138
+ options . filePattern ||
139
+ extractFilePattern ( builderOptions , multiple , applicationBuilderVariant ) ,
115
140
variant : ngsscContext . variant ,
116
141
} ;
117
142
}
118
143
119
- function extractFilePattern ( index : BrowserBuilderOptions [ 'index' ] | undefined , multiple : boolean ) {
144
+ function extractFilePattern (
145
+ builderOptions : BuilderOptions | undefined ,
146
+ multiple : boolean ,
147
+ applicationBuilderVariant : ApplicationBuilderVariant = undefined ,
148
+ ) {
149
+ if ( builderOptions && applicationBuilderVariant === 'server' ) {
150
+ return '**/index{.,.server.}html' ;
151
+ }
152
+
153
+ const index = builderOptions ?. index ;
120
154
let result = '**/index.html' ;
121
- if ( ! index ) {
155
+ if ( ! index || typeof index === 'boolean' ) {
122
156
return result ;
123
157
} else if ( typeof index === 'string' ) {
124
158
result = basename ( index ) ;
0 commit comments