@@ -15,7 +15,7 @@ const karma = require('karma');
15
15
16
16
// Gulp plugins.
17
17
const gulpClean = require ( 'gulp-clean' ) ;
18
- const gulpLiveServer = require ( 'gulp-live- server' ) ;
18
+ const gulpServer = require ( 'gulp-server-livereload ' ) ;
19
19
const gulpMerge = require ( 'merge2' ) ;
20
20
const gulpRunSequence = require ( 'run-sequence' ) ;
21
21
const gulpSass = require ( 'gulp-sass' ) ;
@@ -81,15 +81,37 @@ function makeSassBuildTask(options) {
81
81
}
82
82
83
83
84
+ /**
85
+ * Create a Gulp task that executes a process.
86
+ */
87
+ function makeExecTask ( packageName , executable , args ) {
88
+ if ( ! args ) {
89
+ args = executable ;
90
+ executable = undefined ;
91
+ }
92
+ return function ( done ) {
93
+ resolveBin ( packageName , { executable : executable } , function ( err , binPath ) {
94
+ child_process . exec ( `${ binPath } ${ args . join ( ' ' ) } ` , function ( error ) {
95
+ if ( error ) {
96
+ console . error ( error ) ;
97
+ throw error ;
98
+ } else {
99
+ done ( ) ;
100
+ }
101
+ } ) ;
102
+ } ) ;
103
+ }
104
+ }
105
+
84
106
/***************************************************************************************************
85
107
* Components Build Tasks.
86
108
*/
87
- gulp . task ( 'build:components:ts' , makeTsBuildTask ( { tsConfigPath : componentsDir } ) ) ;
88
- gulp . task ( 'build:components:assets' , function ( ) {
109
+ gulp . task ( ': build:components:ts' , makeTsBuildTask ( { tsConfigPath : componentsDir } ) ) ;
110
+ gulp . task ( ': build:components:assets' , function ( ) {
89
111
return gulp . src ( path . join ( componentsDir , '*/**/*.!(ts|spec.ts)' ) )
90
112
. pipe ( gulp . dest ( outLibDir ) ) ;
91
113
} ) ;
92
- gulp . task ( 'build:components:scss' , function ( ) {
114
+ gulp . task ( ': build:components:scss' , function ( ) {
93
115
const cssTask = makeSassBuildTask ( {
94
116
dest : outLibDir ,
95
117
root : componentsDir ,
@@ -103,36 +125,22 @@ gulp.task('build:components:scss', function() {
103
125
] ) ;
104
126
} ) ;
105
127
gulp . task ( 'build:components' , [
106
- 'build:components:ts' ,
107
- 'build:components:assets' ,
108
- 'build:components:scss'
128
+ ': build:components:ts' ,
129
+ ': build:components:assets' ,
130
+ ': build:components:scss'
109
131
] , function ( ) {
110
132
inlineResources ( [ outLibDir ] ) ;
111
133
} ) ;
112
- gulp . task ( 'build:components:ngc' , [ 'build:components' ] , function ( done ) {
113
- resolveBin ( '@angular/compiler-cli' , { executable : 'ngc' } , function ( err , cliPath ) {
114
- if ( err ) {
115
- console . error ( err ) ;
116
- process . exit ( 1 ) ;
117
- }
118
-
119
- child_process . exec ( `${ cliPath } -p ${ path . relative ( __dirname , componentsDir ) } ` , function ( error ) {
120
- console . log ( arguments ) ;
121
- if ( error ) {
122
- console . error ( error ) ;
123
- process . exit ( 1 ) ;
124
- }
125
-
126
- done ( ) ;
127
- } ) ;
128
- } ) ;
129
- } ) ;
134
+ gulp . task ( ':build:components:ngc' , [ 'build:components' ] , makeExecTask (
135
+ '@angular/compiler-cli' , 'ngc' , [ '-p' , path . relative ( __dirname , componentsDir ) ]
136
+ ) ) ;
137
+
130
138
131
139
/***************************************************************************************************
132
140
* DevApp Build Tasks.
133
141
*/
134
- gulp . task ( 'build:devapp:ts' , [ 'build:components:ts' ] , makeTsBuildTask ( { tsConfigPath : devAppDir } ) ) ;
135
- gulp . task ( 'build:devapp:scss' , [ 'build:components:scss' ] , makeSassBuildTask ( {
142
+ gulp . task ( ': build:devapp:ts' , [ ': build:components:ts' ] , makeTsBuildTask ( { tsConfigPath : devAppDir } ) ) ;
143
+ gulp . task ( ': build:devapp:scss' , [ ': build:components:scss' ] , makeSassBuildTask ( {
136
144
dest : outDir ,
137
145
root : devAppDir ,
138
146
// Change this once we have a better strategy for releasing SCSS files.
@@ -141,11 +149,11 @@ gulp.task('build:devapp:scss', ['build:components:scss'], makeSassBuildTask({
141
149
componentsDir
142
150
]
143
151
} ) ) ;
144
- gulp . task ( 'build:devapp:assets' , function ( ) {
152
+ gulp . task ( ': build:devapp:assets' , function ( ) {
145
153
return gulp . src ( path . join ( devAppDir , '**/*' ) )
146
154
. pipe ( gulp . dest ( outDir ) ) ;
147
155
} ) ;
148
- gulp . task ( 'build:devapp:vendor' , function ( ) {
156
+ gulp . task ( ': build:devapp:vendor' , function ( ) {
149
157
const npmVendorFiles = [
150
158
'core-js/client' , 'zone.js/dist' , 'hammerjs' , 'systemjs/dist' , 'rxjs' , '@angular' , 'hammerjs'
151
159
] ;
@@ -160,17 +168,17 @@ gulp.task('build:devapp:vendor', function() {
160
168
161
169
gulp . task ( 'build:devapp' , [
162
170
'build:components' ,
163
- 'build:devapp:vendor' ,
164
- 'build:devapp:ts' ,
165
- 'build:devapp:scss' ,
166
- 'build:devapp:assets'
171
+ ': build:devapp:vendor' ,
172
+ ': build:devapp:ts' ,
173
+ ': build:devapp:scss' ,
174
+ ': build:devapp:assets'
167
175
] ) ;
168
176
169
177
/***************************************************************************************************
170
178
* DevApp Build Tasks.
171
179
*/
172
- gulp . task ( 'build:e2eapp:ts' , [ 'build:components:ts' ] , makeTsBuildTask ( { tsConfigPath : e2eAppDir } ) ) ;
173
- gulp . task ( 'build:e2eapp:scss' , [ 'build:components:scss' ] , makeSassBuildTask ( {
180
+ gulp . task ( ': build:e2eapp:ts' , [ ': build:components:ts' ] , makeTsBuildTask ( { tsConfigPath : e2eAppDir } ) ) ;
181
+ gulp . task ( ': build:e2eapp:scss' , [ ': build:components:scss' ] , makeSassBuildTask ( {
174
182
dest : outDir ,
175
183
root : e2eAppDir ,
176
184
// Change this once we have a better strategy for releasing SCSS files.
@@ -179,11 +187,11 @@ gulp.task('build:e2eapp:scss', ['build:components:scss'], makeSassBuildTask({
179
187
componentsDir
180
188
]
181
189
} ) ) ;
182
- gulp . task ( 'build:e2eapp:assets' , function ( ) {
190
+ gulp . task ( ': build:e2eapp:assets' , function ( ) {
183
191
return gulp . src ( path . join ( e2eAppDir , '**/*' ) )
184
192
. pipe ( gulp . dest ( outDir ) ) ;
185
193
} ) ;
186
- gulp . task ( 'build:e2eapp:vendor' , function ( ) {
194
+ gulp . task ( ': build:e2eapp:vendor' , function ( ) {
187
195
const npmVendorFiles = [
188
196
'core-js/client' , 'zone.js/dist' , 'hammerjs' , 'systemjs/dist' , 'rxjs' , '@angular' , 'hammerjs'
189
197
] ;
@@ -198,18 +206,26 @@ gulp.task('build:e2eapp:vendor', function() {
198
206
199
207
gulp . task ( 'build:e2eapp' , [
200
208
'build:components' ,
201
- 'build:e2eapp:vendor' ,
202
- 'build:e2eapp:ts' ,
203
- 'build:e2eapp:scss' ,
204
- 'build:e2eapp:assets'
209
+ ': build:e2eapp:vendor' ,
210
+ ': build:e2eapp:ts' ,
211
+ ': build:e2eapp:scss' ,
212
+ ': build:e2eapp:assets'
205
213
] ) ;
206
214
207
215
208
216
/***************************************************************************************************
209
217
* Global tasks.
210
218
*/
211
- gulp . task ( 'default' , function ( ) {
212
- console . log ( `You're probably looking for "build" or "serve:devapp".` ) ;
219
+ gulp . task ( 'default' , [ 'help' ] ) ;
220
+
221
+ gulp . task ( 'help' , function ( ) {
222
+ const tasks = Object . keys ( gulp . tasks )
223
+ . filter ( x => ! x . startsWith ( ':' ) )
224
+ . filter ( x => x != 'default' )
225
+ . sort ( ) ;
226
+
227
+ console . log ( `\nHere's a list of supported tasks:\n ` , tasks . join ( '\n ' ) ) ;
228
+ console . log ( `\nYou're probably looking for "test" or "serve:devapp".\n\n` ) ;
213
229
} ) ;
214
230
215
231
gulp . task ( 'build' , [ 'build:devapp' ] ) ;
@@ -218,11 +234,11 @@ gulp.task('clean', function() {
218
234
return gulp . src ( 'dist' , { read : false } )
219
235
. pipe ( gulpClean ( ) ) ;
220
236
} ) ;
221
- gulp . task ( 'clean:spec' , function ( ) {
237
+ gulp . task ( ': clean:spec' , function ( ) {
222
238
return gulp . src ( 'dist/**/*.spec.*' , { read : false } )
223
239
. pipe ( gulpClean ( ) ) ;
224
240
} ) ;
225
- gulp . task ( 'clean:assets' , function ( ) {
241
+ gulp . task ( ': clean:assets' , function ( ) {
226
242
return gulp . src ( 'dist/**/*+(.html|.css)' , { read : false } )
227
243
. pipe ( gulpClean ( ) ) ;
228
244
} ) ;
@@ -231,66 +247,105 @@ gulp.task('clean:assets', function() {
231
247
/***************************************************************************************************
232
248
* Watch Tasks.
233
249
*/
234
- gulp . task ( 'watch:components' , [ 'build:components' ] , function ( ) {
235
- gulp . watch ( path . join ( componentsDir , '**/*' ) , [ 'build:components' ] ) ;
236
- } ) ;
237
-
238
- gulp . task ( 'watch:devapp' , [ 'watch:components' , 'build:devapp' ] , function ( ) {
239
- gulp . watch ( path . join ( devAppDir , '**/*' ) , [ 'build:devapp' ] ) ;
250
+ gulp . task ( ':watch:components' , [ 'build:components' ] , function ( ) {
251
+ return gulp . watch ( path . join ( componentsDir , '**/*' ) , [ 'build:components' ] ) ;
240
252
} ) ;
241
253
242
254
243
255
/***************************************************************************************************
244
256
* Serve Tasks.
245
257
*/
246
258
gulp . task ( 'serve:devapp' , [ 'build:devapp' ] , function ( ) {
247
- const server = gulpLiveServer ( 'scripts/serve-dist.js' ) ;
259
+ const stream = gulp . src ( 'dist' )
260
+ . pipe ( gulpServer ( {
261
+ livereload : true ,
262
+ fallback : 'index.html' ,
263
+ port : 4200
264
+ } ) ) ;
248
265
249
- server . start ( ) ;
250
- function reload ( file ) {
251
- server . notify ( file ) ;
252
- }
266
+ gulp . watch ( path . join ( componentsDir , '**/*.ts' ) , [ ':build:components:ts' ] ) ;
267
+ gulp . watch ( path . join ( componentsDir , '**/*.scss' ) , [ ':build:components:scss' ] ) ;
268
+ gulp . watch ( path . join ( componentsDir , '**/*.html' ) , [ ':build:components:assets' ] ) ;
269
+ gulp . watch ( path . join ( devAppDir , '**/*.ts' ) , [ ':build:devapp:ts' ] ) ;
270
+ gulp . watch ( path . join ( devAppDir , '**/*.scss' ) , [ ':build:devapp:scss' ] ) ;
271
+ gulp . watch ( path . join ( devAppDir , '**/*.html' ) , [ ':build:devapp:assets' ] ) ;
253
272
254
- gulp . watch ( path . join ( componentsDir , '**/*.ts' ) , [ 'build:components:ts' ] , reload ) ;
255
- gulp . watch ( path . join ( componentsDir , '**/*.scss' ) , [ 'build:components:scss' ] , reload ) ;
256
- gulp . watch ( path . join ( componentsDir , '**/*.html' ) , [ 'build:components:assets' ] , reload ) ;
257
- gulp . watch ( path . join ( devAppDir , '**/*.ts' ) , [ 'build:devapp:ts' ] , reload ) ;
258
- gulp . watch ( path . join ( devAppDir , '**/*.scss' ) , [ 'build:devapp:scss' ] , reload ) ;
259
- gulp . watch ( path . join ( devAppDir , '**/*.html' ) , [ 'build:devapp:assets' ] , reload ) ;
273
+ return stream ;
260
274
} ) ;
261
275
262
- gulp . task ( 'serve:e2eapp' , [ 'build:e2eapp' ] , function ( ) {
263
- const server = gulpLiveServer ( 'scripts/serve-dist.js' ) ;
264
276
265
- server . start ( ) ;
266
- function reload ( file ) {
267
- server . notify . apply ( server , [ file ] ) ;
268
- }
277
+ let stopE2eServer = null ;
278
+ gulp . task ( 'serve:e2eapp' , [ 'build:e2eapp' ] , function ( done ) {
279
+ const stream = gulp . src ( 'dist' )
280
+ . pipe ( gulpServer ( {
281
+ livereload : false ,
282
+ fallback : 'index.html' ,
283
+ port : 4200
284
+ } ) ) ;
285
+
286
+ gulp . watch ( path . join ( componentsDir , '**/*.ts' ) , [ ':build:components:ts' ] ) ;
287
+ gulp . watch ( path . join ( componentsDir , '**/*.scss' ) , [ ':build:components:scss' ] ) ;
288
+ gulp . watch ( path . join ( componentsDir , '**/*.html' ) , [ ':build:components:assets' ] ) ;
289
+ gulp . watch ( path . join ( e2eAppDir , '**/*.ts' ) , [ ':build:devapp:ts' ] ) ;
290
+ gulp . watch ( path . join ( e2eAppDir , '**/*.scss' ) , [ ':build:devapp:scss' ] ) ;
291
+ gulp . watch ( path . join ( e2eAppDir , '**/*.html' ) , [ ':build:devapp:assets' ] ) ;
269
292
270
- gulp . watch ( path . join ( componentsDir , '**/*.ts' ) , [ 'build:components:ts' ] , reload ) ;
271
- gulp . watch ( path . join ( componentsDir , '**/*.scss' ) , [ 'build:components:scss' ] , reload ) ;
272
- gulp . watch ( path . join ( componentsDir , '**/*.html' ) , [ 'build:components:assets' ] , reload ) ;
273
- gulp . watch ( path . join ( e2eAppDir , '**/*.ts' ) , [ 'build:e2eapp:ts' ] , reload ) ;
274
- gulp . watch ( path . join ( e2eAppDir , '**/*.scss' ) , [ 'build:e2eapp:scss' ] , reload ) ;
275
- gulp . watch ( path . join ( e2eAppDir , '**/*.html' ) , [ 'build:e2eapp:assets' ] , reload ) ;
293
+ stopE2eServer = function ( ) {
294
+ stream . emit ( 'kill' ) ;
295
+ done ( ) ;
296
+ } ;
297
+ } ) ;
298
+
299
+ gulp . task ( ':serve:e2eapp:stop' , function ( ) {
300
+ if ( stopE2eServer ) {
301
+ stopE2eServer ( ) ;
302
+ }
276
303
} ) ;
277
304
278
305
279
306
/***************************************************************************************************
280
- * Release builds .
307
+ * Tests .
281
308
*/
282
309
gulp . task ( 'test' , function ( done ) {
283
310
new karma . Server ( {
284
311
configFile : path . join ( __dirname , 'test/karma.conf.js' )
285
312
} , done ) . start ( ) ;
286
313
} ) ;
314
+
287
315
gulp . task ( 'test:single-run' , function ( done ) {
288
316
new karma . Server ( {
289
317
configFile : path . join ( __dirname , 'test/karma.conf.js' ) ,
290
318
singleRun : true
291
319
} , done ) . start ( ) ;
292
320
} ) ;
293
321
322
+ gulp . task ( ':test:protractor:setup' , makeExecTask ( 'protractor' , 'webdriver-manager' , [ 'update' ] ) ) ;
323
+
324
+ gulp . task ( ':test:protractor' , makeExecTask (
325
+ 'protractor' , [ path . join ( __dirname , 'test/protractor.conf.js' ) ]
326
+ ) ) ;
327
+
328
+ gulp . task ( ':test:protractor:and-stop' , function ( done ) {
329
+ gulpRunSequence (
330
+ ':test:protractor' ,
331
+ ':serve:e2eapp:stop' ,
332
+ done
333
+ ) ;
334
+ } ) ;
335
+
336
+ gulp . task ( ':e2e:done' , function ( ) {
337
+ process . exit ( 0 ) ;
338
+ } ) ;
339
+
340
+ gulp . task ( 'e2e' , function ( done ) {
341
+ gulpRunSequence (
342
+ ':test:protractor:setup' ,
343
+ [ 'serve:e2eapp' , ':test:protractor:and-stop' ] ,
344
+ ':e2e:done' ,
345
+ done
346
+ ) ;
347
+ } ) ;
348
+
294
349
295
350
/***************************************************************************************************
296
351
* Release builds.
@@ -299,8 +354,8 @@ gulp.task('build:release', function(done) {
299
354
// Synchronously run those tasks.
300
355
gulpRunSequence (
301
356
'clean' ,
302
- 'build:components:ngc' ,
303
- [ 'clean:spec' , 'clean:assets' ] ,
357
+ ': build:components:ngc' ,
358
+ [ ': clean:spec' , ': clean:assets' ] ,
304
359
done
305
360
) ;
306
361
} ) ;
0 commit comments