@@ -5,19 +5,22 @@ import { pathToFileURL } from 'url'
5
5
import type { PresetHandlerResult , WebpackDevServerConfig } from '../devServer'
6
6
import { sourceDefaultWebpackDependencies } from './sourceRelativeWebpackModules'
7
7
8
+ type BuildOptions = Record < string , any >
9
+
10
+ type Configurations = {
11
+ configurations ?: {
12
+ [ configuration : string ] : BuildOptions
13
+ }
14
+ }
15
+
16
+ export type MyType = Extract < Cypress . DevServerConfigOptions , { framework : 'angular' } >
17
+
8
18
export type AngularJsonProjectConfig = {
9
19
projectType : string
10
20
root : string
11
21
sourceRoot : string
12
22
architect : {
13
- build : {
14
- options : { [ key : string ] : any } & { polyfills ?: string }
15
- configurations ?: {
16
- [ configuration : string ] : {
17
- [ key : string ] : any
18
- }
19
- }
20
- }
23
+ build : { options : BuildOptions } & Configurations
21
24
}
22
25
}
23
26
@@ -30,21 +33,7 @@ type AngularJson = {
30
33
31
34
const dynamicImport = new Function ( 'specifier' , 'return import(specifier)' )
32
35
33
- export async function angularHandler ( devServerConfig : WebpackDevServerConfig ) : Promise < PresetHandlerResult > {
34
- const webpackConfig = await getAngularCliWebpackConfig ( devServerConfig )
35
-
36
- return { frameworkConfig : webpackConfig , sourceWebpackModulesResult : sourceDefaultWebpackDependencies ( devServerConfig ) }
37
- }
38
-
39
- async function getAngularCliWebpackConfig ( devServerConfig : WebpackDevServerConfig ) {
40
- const { projectRoot } = devServerConfig . cypressConfig
41
-
42
- const {
43
- generateBrowserWebpackConfigFromContext,
44
- getCommonConfig,
45
- getStylesConfig,
46
- } = await getAngularCliModules ( projectRoot )
47
-
36
+ async function getProjectConfig ( projectRoot : string ) : Promise < Cypress . ProjectConfig > {
48
37
const angularJson = await getAngularJson ( projectRoot )
49
38
50
39
let { defaultProject } = angularJson
@@ -59,24 +48,20 @@ async function getAngularCliWebpackConfig (devServerConfig: WebpackDevServerConf
59
48
60
49
const defaultProjectConfig = angularJson . projects [ defaultProject ]
61
50
62
- const tsConfig = await generateTsConfig ( devServerConfig , defaultProjectConfig )
63
-
64
- const buildOptions = getAngularBuildOptions ( defaultProjectConfig , tsConfig )
65
-
66
- const context = createFakeContext ( projectRoot , defaultProject , defaultProjectConfig )
67
-
68
- const { config } = await generateBrowserWebpackConfigFromContext (
69
- buildOptions ,
70
- context ,
71
- ( wco : any ) => [ getCommonConfig ( wco ) , getStylesConfig ( wco ) ] ,
72
- )
73
-
74
- delete config . entry . main
51
+ const { architect, root, sourceRoot } = defaultProjectConfig
52
+ const { build } = architect
75
53
76
- return config
54
+ return {
55
+ root,
56
+ sourceRoot,
57
+ buildOptions : {
58
+ ...build . options ,
59
+ ...build . configurations ?. development || { } ,
60
+ } ,
61
+ }
77
62
}
78
63
79
- export function getAngularBuildOptions ( projectConfig : AngularJsonProjectConfig , tsConfig : string ) {
64
+ export function getAngularBuildOptions ( buildOptions : BuildOptions , tsConfig : string ) {
80
65
// Default options are derived from the @angular -devkit/build-angular browser builder, with some options from
81
66
// the serve builder thrown in for development.
82
67
// see: https://github.com/angular/angular-cli/blob/main/packages/angular_devkit/build_angular/src/builders/browser/schema.json
@@ -115,16 +100,15 @@ export function getAngularBuildOptions (projectConfig: AngularJsonProjectConfig,
115
100
extractLicenses : false ,
116
101
sourceMap : true ,
117
102
namedChunks : true ,
118
- ...projectConfig . architect . build . options ,
119
- ...projectConfig . architect . build . configurations ?. development || { } ,
103
+ ...buildOptions ,
120
104
tsConfig,
121
105
aot : false ,
122
106
outputHashing : 'none' ,
123
107
budgets : undefined ,
124
108
}
125
109
}
126
110
127
- export async function generateTsConfig ( devServerConfig : WebpackDevServerConfig , projectConfig : AngularJsonProjectConfig ) : Promise < string > {
111
+ export async function generateTsConfig ( devServerConfig : WebpackDevServerConfig , buildOptions : BuildOptions ) : Promise < string > {
128
112
const { cypressConfig } = devServerConfig
129
113
const { projectRoot } = cypressConfig
130
114
@@ -138,8 +122,8 @@ export async function generateTsConfig (devServerConfig: WebpackDevServerConfig,
138
122
includePaths . push ( toPosix ( cypressConfig . supportFile ) )
139
123
}
140
124
141
- if ( projectConfig . architect . build . options . polyfills ) {
142
- const polyfills = getProjectFilePath ( projectConfig . architect . build . options . polyfills )
125
+ if ( buildOptions ? .polyfills ) {
126
+ const polyfills = getProjectFilePath ( buildOptions ? .polyfills )
143
127
144
128
includePaths . push ( polyfills )
145
129
}
@@ -215,14 +199,14 @@ export async function getAngularJson (projectRoot: string): Promise<AngularJson>
215
199
return JSON . parse ( angularJson )
216
200
}
217
201
218
- function createFakeContext ( projectRoot : string , defaultProject : string , defaultProjectConfig : any ) {
202
+ function createFakeContext ( projectRoot : string , defaultProjectConfig : Cypress . ProjectConfig ) {
219
203
const logger = {
220
204
createChild : ( ) => ( { } ) ,
221
205
}
222
206
223
207
const context = {
224
208
target : {
225
- project : defaultProject ,
209
+ project : 'angular' ,
226
210
} ,
227
211
workspaceRoot : projectRoot ,
228
212
getProjectMetadata : ( ) => {
@@ -239,3 +223,38 @@ function createFakeContext (projectRoot: string, defaultProject: string, default
239
223
}
240
224
241
225
export const toPosix = ( filePath : string ) => filePath . split ( path . sep ) . join ( path . posix . sep )
226
+
227
+ async function getAngularCliWebpackConfig ( devServerConfig : WebpackDevServerConfig ) {
228
+ const { projectRoot } = devServerConfig . cypressConfig
229
+
230
+ const {
231
+ generateBrowserWebpackConfigFromContext,
232
+ getCommonConfig,
233
+ getStylesConfig,
234
+ } = await getAngularCliModules ( projectRoot )
235
+
236
+ // normalize
237
+ const projectConfig = devServerConfig . options ?. projectConfig || await getProjectConfig ( projectRoot )
238
+
239
+ const tsConfig = await generateTsConfig ( devServerConfig , projectConfig . buildOptions )
240
+
241
+ const buildOptions = getAngularBuildOptions ( projectConfig . buildOptions , tsConfig )
242
+
243
+ const context = createFakeContext ( projectRoot , projectConfig )
244
+
245
+ const { config } = await generateBrowserWebpackConfigFromContext (
246
+ buildOptions ,
247
+ context ,
248
+ ( wco : any ) => [ getCommonConfig ( wco ) , getStylesConfig ( wco ) ] ,
249
+ )
250
+
251
+ delete config . entry . main
252
+
253
+ return config
254
+ }
255
+
256
+ export async function angularHandler ( devServerConfig : WebpackDevServerConfig ) : Promise < PresetHandlerResult > {
257
+ const webpackConfig = await getAngularCliWebpackConfig ( devServerConfig )
258
+
259
+ return { frameworkConfig : webpackConfig , sourceWebpackModulesResult : sourceDefaultWebpackDependencies ( devServerConfig ) }
260
+ }
0 commit comments