@@ -41,33 +41,52 @@ export default Task.extend({
41
41
42
42
let webpackConfig = new NgCliWebpackConfig ( serveTaskOptions ) . config ;
43
43
44
- // This allows for live reload of page when changes are made to repo.
45
- // https://webpack.github.io/docs/webpack-dev-server.html#inline-mode
46
- let entryPoints = [
47
- `webpack-dev-server/client?http://${ serveTaskOptions . host } :${ serveTaskOptions . port } /`
48
- ] ;
49
- if ( serveTaskOptions . hmr ) {
50
- const webpackHmrLink = 'https://webpack.github.io/docs/hot-module-replacement.html' ;
51
- ui . writeLine ( oneLine `
52
- ${ chalk . yellow ( 'NOTICE' ) } Hot Module Replacement (HMR) is enabled for the dev server.
53
- ` ) ;
54
- ui . writeLine ( ' The project will still live reload when HMR is enabled,' ) ;
55
- ui . writeLine ( ' but to take advantage of HMR additional application code is required' ) ;
56
- ui . writeLine ( ' (not included in an Angular CLI project by default).' ) ;
57
- ui . writeLine ( ` See ${ chalk . blue ( webpackHmrLink ) } ` ) ;
58
- ui . writeLine ( ' for information on working with HMR for Webpack.' ) ;
59
- entryPoints . push ( 'webpack/hot/dev-server' ) ;
60
- webpackConfig . plugins . push ( new webpack . HotModuleReplacementPlugin ( ) ) ;
61
- webpackConfig . plugins . push ( new webpack . NamedModulesPlugin ( ) ) ;
62
- if ( serveTaskOptions . extractCss ) {
44
+ const serverAddress = url . format ( {
45
+ protocol : serveTaskOptions . ssl ? 'https' : 'http' ,
46
+ hostname : serveTaskOptions . host ,
47
+ port : serveTaskOptions . port . toString ( )
48
+ } ) ;
49
+ let clientAddress = serverAddress ;
50
+ if ( serveTaskOptions . liveReloadClient ) {
51
+ const clientUrl = url . parse ( serveTaskOptions . liveReloadClient ) ;
52
+ // very basic sanity check
53
+ if ( ! clientUrl . host ) {
54
+ return Promise . reject ( new SilentError ( `'live-reload-client' must be a full URL.` ) ) ;
55
+ }
56
+ clientAddress = clientUrl . href ;
57
+ }
58
+
59
+ if ( serveTaskOptions . liveReload ) {
60
+ // This allows for live reload of page when changes are made to repo.
61
+ // https://webpack.github.io/docs/webpack-dev-server.html#inline-mode
62
+ let entryPoints = [
63
+ `webpack-dev-server/client?${ clientAddress } `
64
+ ] ;
65
+ if ( serveTaskOptions . hmr ) {
66
+ const webpackHmrLink = 'https://webpack.github.io/docs/hot-module-replacement.html' ;
63
67
ui . writeLine ( oneLine `
64
- ${ chalk . yellow ( 'NOTICE' ) } (HMR) does not allow for CSS hot reload when used
65
- together with '--extract-css'.
68
+ ${ chalk . yellow ( 'NOTICE' ) } Hot Module Replacement (HMR) is enabled for the dev server.
66
69
` ) ;
70
+ ui . writeLine ( ' The project will still live reload when HMR is enabled,' ) ;
71
+ ui . writeLine ( ' but to take advantage of HMR additional application code is required' ) ;
72
+ ui . writeLine ( ' (not included in an Angular CLI project by default).' ) ;
73
+ ui . writeLine ( ` See ${ chalk . blue ( webpackHmrLink ) } ` ) ;
74
+ ui . writeLine ( ' for information on working with HMR for Webpack.' ) ;
75
+ entryPoints . push ( 'webpack/hot/dev-server' ) ;
76
+ webpackConfig . plugins . push ( new webpack . HotModuleReplacementPlugin ( ) ) ;
77
+ webpackConfig . plugins . push ( new webpack . NamedModulesPlugin ( ) ) ;
78
+ if ( serveTaskOptions . extractCss ) {
79
+ ui . writeLine ( oneLine `
80
+ ${ chalk . yellow ( 'NOTICE' ) } (HMR) does not allow for CSS hot reload when used
81
+ together with '--extract-css'.
82
+ ` ) ;
83
+ }
67
84
}
85
+ if ( ! webpackConfig . entry . main ) { webpackConfig . entry . main = [ ] ; }
86
+ webpackConfig . entry . main . unshift ( ...entryPoints ) ;
87
+ } else if ( serveTaskOptions . hmr ) {
88
+ ui . writeLine ( chalk . yellow ( 'Live reload is disabled. HMR option ignored.' ) ) ;
68
89
}
69
- if ( ! webpackConfig . entry . main ) { webpackConfig . entry . main = [ ] ; }
70
- webpackConfig . entry . main . unshift ( ...entryPoints ) ;
71
90
72
91
if ( ! serveTaskOptions . watch ) {
73
92
// There's no option to turn off file watching in webpack-dev-server, but
@@ -151,26 +170,26 @@ export default Task.extend({
151
170
152
171
ui . writeLine ( chalk . green ( oneLine `
153
172
**
154
- NG Live Development Server is running on
155
- http${ serveTaskOptions . ssl ? 's' : '' } ://${ serveTaskOptions . host } :${ serveTaskOptions . port } .
173
+ NG Live Development Server is running on ${ serverAddress }
156
174
**
157
175
` ) ) ;
158
176
159
177
const server = new WebpackDevServer ( webpackCompiler , webpackDevServerConfiguration ) ;
160
178
return new Promise ( ( resolve , reject ) => {
161
- server . listen ( serveTaskOptions . port , ` ${ serveTaskOptions . host } ` , ( err : any , stats : any ) => {
179
+ server . listen ( serveTaskOptions . port , serveTaskOptions . host , ( err : any , stats : any ) => {
162
180
if ( err ) {
163
- console . error ( err . stack || err ) ;
164
- if ( err . details ) { console . error ( err . details ) ; }
165
- reject ( err . details ) ;
166
- } else {
167
- const { open, ssl, host, port } = serveTaskOptions ;
168
- if ( open ) {
169
- let protocol = ssl ? 'https' : 'http' ;
170
- opn ( url . format ( { protocol : protocol , hostname : host , port : port . toString ( ) } ) ) ;
171
- }
181
+ return reject ( err ) ;
182
+ }
183
+ if ( serveTaskOptions . open ) {
184
+ opn ( serverAddress ) ;
172
185
}
173
186
} ) ;
187
+ } )
188
+ . catch ( ( err : Error ) => {
189
+ if ( err ) {
190
+ this . ui . writeError ( '\nAn error occured during the build:\n' + ( ( err && err . stack ) || err ) ) ;
191
+ }
192
+ throw err ;
174
193
} ) ;
175
194
}
176
195
} ) ;
0 commit comments