Hans 601f9b38f8 feat(@angular/cli): move angular-cli to @angular/cli (#4328)
This release is otherwise identical to beta.28.
2017-02-01 18:19:50 -08:00

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;