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