@@ -48,6 +48,7 @@ export function execute(
48
48
res : http . ServerResponse ,
49
49
next : ( err ?: unknown ) => void ,
50
50
) => void ) [ ] ;
51
+ builderSelector ?: ( info : BuilderSelectorInfo , logger : BuilderContext [ 'logger' ] ) => string ;
51
52
} ,
52
53
) : Observable < DevServerBuilderOutput > {
53
54
// Determine project name from builder context target
@@ -58,28 +59,16 @@ export function execute(
58
59
return EMPTY ;
59
60
}
60
61
61
- return defer ( ( ) => initialize ( options , projectName , context ) ) . pipe (
62
+ return defer ( ( ) => initialize ( options , projectName , context , extensions ?. builderSelector ) ) . pipe (
62
63
switchMap ( ( { builderName, normalizedOptions } ) => {
63
64
// Use vite-based development server for esbuild-based builds
64
- if (
65
- builderName === '@angular-devkit/build-angular:application' ||
66
- builderName === '@angular-devkit/build-angular:browser-esbuild' ||
67
- normalizedOptions . forceEsbuild
68
- ) {
65
+ if ( isEsbuildBased ( builderName ) ) {
69
66
if ( transforms ?. logging || transforms ?. webpackConfiguration ) {
70
67
throw new Error (
71
68
'The `application` and `browser-esbuild` builders do not support Webpack transforms.' ,
72
69
) ;
73
70
}
74
71
75
- if (
76
- normalizedOptions . forceEsbuild &&
77
- builderName === '@angular-devkit/build-angular:browser'
78
- ) {
79
- // The compatibility builder should be used if esbuild is force enabled with the official Webpack-based builder.
80
- builderName = '@angular-devkit/build-angular:browser-esbuild' ;
81
- }
82
-
83
72
return defer ( ( ) => import ( './vite-server' ) ) . pipe (
84
73
switchMap ( ( { serveWithVite } ) =>
85
74
serveWithVite ( normalizedOptions , builderName , context , transforms , extensions ) ,
@@ -110,6 +99,7 @@ async function initialize(
110
99
initialOptions : DevServerBuilderOptions ,
111
100
projectName : string ,
112
101
context : BuilderContext ,
102
+ builderSelector = defaultBuilderSelector ,
113
103
) {
114
104
// Purge old build disk cache.
115
105
await purgeStaleBuildCache ( context ) ;
@@ -140,14 +130,56 @@ case.
140
130
) ;
141
131
}
142
132
143
- if ( normalizedOptions . forceEsbuild && ! builderName . startsWith ( '@angular-devkit/build-angular:' ) ) {
144
- context . logger . warn (
145
- 'Warning: Forcing the use of the esbuild-based build system with third-party builders' +
146
- ' may cause unexpected behavior and/or build failures.' ,
147
- ) ;
133
+ normalizedOptions . port = await checkPort ( normalizedOptions . port , normalizedOptions . host ) ;
134
+
135
+ return {
136
+ builderName : builderSelector (
137
+ { builderName, forceEsbuild : ! ! normalizedOptions . forceEsbuild } ,
138
+ context . logger ,
139
+ ) ,
140
+ normalizedOptions,
141
+ } ;
142
+ }
143
+
144
+ function isEsbuildBased (
145
+ builderName : string ,
146
+ ) : builderName is
147
+ | '@angular-devkit/build-angular:application'
148
+ | '@angular-devkit/build-angular:browser-esbuild' {
149
+ if (
150
+ builderName === '@angular-devkit/build-angular:application' ||
151
+ builderName === '@angular-devkit/build-angular:browser-esbuild'
152
+ ) {
153
+ return true ;
148
154
}
149
155
150
- normalizedOptions . port = await checkPort ( normalizedOptions . port , normalizedOptions . host ) ;
156
+ return false ;
157
+ }
158
+
159
+ interface BuilderSelectorInfo {
160
+ builderName : string ;
161
+ forceEsbuild : boolean ;
162
+ }
163
+
164
+ function defaultBuilderSelector (
165
+ info : BuilderSelectorInfo ,
166
+ logger : BuilderContext [ 'logger' ] ,
167
+ ) : string {
168
+ if ( isEsbuildBased ( info . builderName ) ) {
169
+ return info . builderName ;
170
+ }
171
+
172
+ if ( info . forceEsbuild ) {
173
+ if ( ! info . builderName . startsWith ( '@angular-devkit/build-angular:' ) ) {
174
+ logger . warn (
175
+ 'Warning: Forcing the use of the esbuild-based build system with third-party builders' +
176
+ ' may cause unexpected behavior and/or build failures.' ,
177
+ ) ;
178
+ }
179
+
180
+ // The compatibility builder should be used if esbuild is force enabled.
181
+ return '@angular-devkit/build-angular:browser-esbuild' ;
182
+ }
151
183
152
- return { builderName, normalizedOptions } ;
184
+ return info . builderName ;
153
185
}
0 commit comments