| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  | var chokidar = require('chokidar'); | 
					
						
							|  |  |  | var runSequence = require('run-sequence'); | 
					
						
							|  |  |  | var path = require('path'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function watch(globs, opts, tasks) { | 
					
						
							|  |  |  |   if (typeof opts !== 'object' || Array.isArray(opts)) { | 
					
						
							|  |  |  |     tasks = opts; | 
					
						
							|  |  |  |     opts = {}; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-14 02:39:04 -04:00
										 |  |  |   var triggerCount = 0; | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   var useRunSequence = typeof tasks !== 'function'; | 
					
						
							|  |  |  |   var runTasks; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (useRunSequence) { | 
					
						
							|  |  |  |     if (!Array.isArray(tasks)) tasks = [tasks]; | 
					
						
							|  |  |  |     tasks = tasks.slice(); | 
					
						
							|  |  |  |     tasks.push(tasksDone); | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |     runTasks = function runTaskSequence() { runSequence.apply(null, tasks); }; | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   } else { | 
					
						
							|  |  |  |     var sync = tasks.length === 0; | 
					
						
							|  |  |  |     runTasks = function runCallback() { | 
					
						
							|  |  |  |       try { | 
					
						
							|  |  |  |         tasks(tasksDone); | 
					
						
							|  |  |  |         if (sync) tasksDone(); | 
					
						
							|  |  |  |       } catch (e) { | 
					
						
							|  |  |  |         return tasksDone(e); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2017-09-22 19:51:03 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   var events = opts.events = opts.events || ['add', 'change', 'unlink']; | 
					
						
							| 
									
										
										
										
											2015-05-20 09:33:13 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Don't let chokidar call us while initializing because on large trees it might take too long for
 | 
					
						
							|  |  |  |   // all the add events to be emitted which causes the initial callback to be triggered more than
 | 
					
						
							|  |  |  |   // once. Instead, we call handleEvent directly.
 | 
					
						
							|  |  |  |   var ignoreInitial = opts.ignoreInitial; | 
					
						
							|  |  |  |   opts.ignoreInitial = true; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   var delay = opts.delay; | 
					
						
							|  |  |  |   if (delay === undefined) delay = 100; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |   var watcher = | 
					
						
							|  |  |  |       chokidar.watch(globs, opts).on('all', handleEvent).on('error', function(err) { throw err; }); | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-22 19:51:03 +02:00
										 |  |  |   var log = function watchLogger(triggerCount) { | 
					
						
							| 
									
										
										
										
											2015-06-02 13:07:36 -05:00
										 |  |  |     // Don't report change for initial event
 | 
					
						
							|  |  |  |     if (!ignoreInitial && !--triggerCount) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     process.stdout.write([ | 
					
						
							|  |  |  |       '', | 
					
						
							|  |  |  |       '==================================================', | 
					
						
							|  |  |  |       ' WATCH TRIGGERED BY FILE CHANGE #' + triggerCount, | 
					
						
							|  |  |  |       ' On: ' + prettyTime(), | 
					
						
							|  |  |  |       '==================================================\n', | 
					
						
							|  |  |  |     ].join('\n')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function prettyTime() { | 
					
						
							|  |  |  |       var now = new Date(); | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |       return now.toLocaleDateString() + ' at ' + now.toLocaleTimeString(); | 
					
						
							| 
									
										
										
										
											2015-06-02 13:07:36 -05:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-09-22 19:51:03 +02:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-06-02 13:07:36 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (opts.log !== undefined && !opts.log) { | 
					
						
							| 
									
										
										
										
											2017-09-22 19:51:03 +02:00
										 |  |  |     log = function noopLog(triggerCount) {}; | 
					
						
							| 
									
										
										
										
											2015-06-02 13:07:36 -05:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   var close = watcher.close.bind(watcher); | 
					
						
							|  |  |  |   watcher.close = function() { | 
					
						
							|  |  |  |     if (timeoutId !== null) clearTimeout(timeoutId); | 
					
						
							|  |  |  |     close(); | 
					
						
							| 
									
										
										
										
											2015-05-18 17:48:41 -07:00
										 |  |  |   }; | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-04 20:39:20 -07:00
										 |  |  |   var eventsRecorded = 0;  // Number of events recorded
 | 
					
						
							|  |  |  |   var timeoutId = null;    // If non-null, event capture window is open
 | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-20 09:33:13 -07:00
										 |  |  |   if (!ignoreInitial) { | 
					
						
							| 
									
										
										
										
											2015-06-02 13:07:36 -05:00
										 |  |  |     // synthetic event to kick off the first task run
 | 
					
						
							|  |  |  |     timeoutId = setTimeout(invokeCallback, delay); | 
					
						
							| 
									
										
										
										
											2015-05-20 09:33:13 -07:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   return watcher; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function handleEvent(event, filepath) { | 
					
						
							|  |  |  |     // Ignore unwatched events
 | 
					
						
							|  |  |  |     if (events.indexOf(event) < 0) return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Increment number of events captured in this window
 | 
					
						
							|  |  |  |     ++eventsRecorded; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (timeoutId === null) { | 
					
						
							|  |  |  |       timeoutId = setTimeout(invokeCallback, delay); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function invokeCallback() { | 
					
						
							|  |  |  |     eventsRecorded = 0; | 
					
						
							| 
									
										
										
										
											2015-05-14 02:39:04 -04:00
										 |  |  |     log(++triggerCount); | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |     runTasks(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function tasksDone(err) { | 
					
						
							|  |  |  |     if (eventsRecorded) { | 
					
						
							|  |  |  |       // eventsRecorded has increased during the run, run again on the next turn
 | 
					
						
							|  |  |  |       timeoutId = setTimeout(invokeCallback, 0); | 
					
						
							|  |  |  |     } else { | 
					
						
							|  |  |  |       timeoutId = null; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-05-18 17:48:41 -07:00
										 |  |  |     if (!useRunSequence && err) { | 
					
						
							| 
									
										
										
										
											2017-09-22 19:51:03 +02:00
										 |  |  |       // tslint:disable-next-line:no-console
 | 
					
						
							| 
									
										
										
										
											2015-05-18 17:48:41 -07:00
										 |  |  |       console.log('Watch task error:', err.toString()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2015-05-08 14:20:54 -04:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = watch; |