mirror of
https://github.com/angular/angular-cli.git
synced 2025-05-25 08:41:39 +08:00
115 lines
3.5 KiB
JavaScript
115 lines
3.5 KiB
JavaScript
'use strict';
|
|
|
|
var chalk = require('chalk');
|
|
var Task = require('./task');
|
|
var debug = require('debug')('ember-cli:watcher');
|
|
var Promise = require('../ext/promise');
|
|
var exec = Promise.denodeify(require('child_process').exec);
|
|
var isWin = /^win/.test(process.platform);
|
|
|
|
var Watcher = Task.extend({
|
|
verbose: true,
|
|
|
|
init: function() {
|
|
var options = this.buildOptions();
|
|
|
|
debug('initialize %o', options);
|
|
},
|
|
|
|
didError: function(error) {
|
|
debug('didError %o', error);
|
|
this.ui.writeError(error);
|
|
},
|
|
|
|
then: function() {
|
|
// return this.watcher.then.apply(this.watcher, arguments);
|
|
},
|
|
|
|
didChange: function(results) {
|
|
debug('didChange %o', results);
|
|
var totalTime = results.totalTime / 1e6;
|
|
|
|
this.ui.writeLine('');
|
|
this.ui.writeLine(chalk.green('Build successful - ' + Math.round(totalTime) + 'ms.'));
|
|
},
|
|
|
|
on: function() {
|
|
// this.watcher.on.apply(this.watcher, arguments);
|
|
},
|
|
|
|
off: function() {
|
|
// this.watcher.off.apply(this.watcher, arguments);
|
|
},
|
|
buildOptions: function() {
|
|
var watcher = this.options && this.options.watcher;
|
|
|
|
if (watcher && ['polling', 'watchman', 'node', 'events'].indexOf(watcher) === -1) {
|
|
throw new Error('Unknown watcher type --watcher=[polling|watchman|node] but was: ' + watcher);
|
|
}
|
|
|
|
return {
|
|
verbose: this.verbose,
|
|
poll: watcher === 'polling',
|
|
watchman: watcher === 'watchman' || watcher === 'events',
|
|
node: watcher === 'node'
|
|
};
|
|
}
|
|
});
|
|
|
|
Watcher.detectWatcher = function(ui, _options) {
|
|
var options = _options || {};
|
|
var watchmanInfo = 'Visit http://ember-cli.com/user-guide/#watchman for more info.';
|
|
|
|
if (options.watcher === 'polling') {
|
|
debug('skip detecting watchman, poll instead');
|
|
return Promise.resolve(options);
|
|
} else if (options.watcher === 'node') {
|
|
debug('skip detecting watchman, node instead');
|
|
return Promise.resolve(options);
|
|
} else if (isWin) {
|
|
debug('watchman isn\'t supported on windows, node instead');
|
|
options.watcher = 'node';
|
|
return Promise.resolve(options);
|
|
} else {
|
|
debug('detecting watchman');
|
|
return exec('watchman version').then(function(output) {
|
|
var version;
|
|
try {
|
|
version = JSON.parse(output).version;
|
|
} catch (e) {
|
|
options.watcher = 'node';
|
|
ui.writeLine('Looks like you have a different program called watchman, falling back to NodeWatcher.');
|
|
ui.writeLine(watchmanInfo);
|
|
return options;
|
|
}
|
|
debug('detected watchman: %s', version);
|
|
|
|
var semver = require('semver');
|
|
if (semver.satisfies(version, '>= 3.0.0')) {
|
|
debug('watchman %s does satisfy: %s', version, '>= 3.0.0');
|
|
options.watcher = 'watchman';
|
|
options._watchmanInfo = {
|
|
enabled: true,
|
|
version: version,
|
|
canNestRoots: semver.satisfies(version, '>= 3.7.0')
|
|
};
|
|
} else {
|
|
debug('watchman %s does NOT satisfy: %s', version, '>= 3.0.0');
|
|
ui.writeLine('Invalid watchman found, version: [' + version + '] did not satisfy [>= 3.0.0], falling back to NodeWatcher.');
|
|
ui.writeLine(watchmanInfo);
|
|
options.watcher = 'node';
|
|
}
|
|
|
|
return options;
|
|
}, function(reason) {
|
|
debug('detecting watchman failed %o', reason);
|
|
ui.writeLine('Could not start watchman; falling back to NodeWatcher for file system events.');
|
|
ui.writeLine(watchmanInfo);
|
|
options.watcher = 'node';
|
|
return options;
|
|
});
|
|
}
|
|
};
|
|
|
|
module.exports = Watcher;
|