nuclide-watchman-helpers
Advanced tools
Comparing version
@@ -1,3 +0,1 @@ | ||
'use babel'; | ||
/* @flow */ | ||
@@ -12,9 +10,5 @@ /* | ||
var {fsPromise} = require('nuclide-commons'); | ||
var WATCHMAN_DEFAULT_PATH = '/usr/local/bin/watchman'; | ||
async function getWatchmanBinaryPath(): Promise<string> { | ||
var getWatchmanBinaryPath = _asyncToGenerator(function* () { | ||
try { | ||
var stats = await fsPromise.stat(WATCHMAN_DEFAULT_PATH); | ||
var stats = yield fsPromise.stat(WATCHMAN_DEFAULT_PATH); | ||
// `stats` contains a `mode` property, a number which can be used to determine | ||
@@ -25,20 +19,39 @@ // whether this file is executable. However, the number is platform-dependent. | ||
} | ||
} catch (e) { | ||
// Suppress the error. | ||
} | ||
} catch (e) {} | ||
// Suppress the error. | ||
// Let the watchman Client find the watchman binary via the default env PATH. | ||
return 'watchman'; | ||
} | ||
}); | ||
module.exports = { | ||
getWatchmanBinaryPath, | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } | ||
get WatchmanClient() { | ||
return require('./WatchmanClient'); | ||
var _require = require('nuclide-commons'); | ||
var fsPromise = _require.fsPromise; | ||
var WATCHMAN_DEFAULT_PATH = '/usr/local/bin/watchman'; | ||
module.exports = Object.defineProperties({ | ||
getWatchmanBinaryPath: getWatchmanBinaryPath | ||
}, { | ||
WatchmanClient: { | ||
get: function get() { | ||
return require('./WatchmanClient'); | ||
}, | ||
configurable: true, | ||
enumerable: true | ||
}, | ||
WatchmanSubscription: { | ||
// Exposed for testing. | ||
get WatchmanSubscription() { | ||
return require('./WatchmanSubscription'); | ||
}, | ||
}; | ||
// Exposed for testing. | ||
get: function get() { | ||
return require('./WatchmanSubscription'); | ||
}, | ||
configurable: true, | ||
enumerable: true | ||
} | ||
}); | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi92YXIvZm9sZGVycy93MS9fMm1jNm0wNTBxbjIzMm5wc2Y5ejNoZnNoNThfamgvVC90bXBKbjRvcUdwdWJsaXNoX3BhY2thZ2VzL25wbS9udWNsaWRlLXdhdGNobWFuLWhlbHBlcnMvbGliL21haW4uanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsV0FBVyxDQUFDOzs7Ozs7Ozs7O0lBZUcscUJBQXFCLHFCQUFwQyxhQUF3RDtBQUN0RCxNQUFJO0FBQ0YsUUFBSSxLQUFLLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUM7OztBQUd4RCxRQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUU7QUFDM0IsYUFBTyxxQkFBcUIsQ0FBQztLQUM5QjtHQUNGLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFFWDs7OztBQUFBLEFBRUQsU0FBTyxVQUFVLENBQUM7Q0FDbkI7Ozs7ZUFqQmlCLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQzs7SUFBdkMsU0FBUyxZQUFULFNBQVM7O0FBRWQsSUFBSSxxQkFBcUIsR0FBRyx5QkFBeUIsQ0FBQzs7QUFpQnRELE1BQU0sQ0FBQyxPQUFPLDJCQUFHO0FBQ2YsdUJBQXFCLEVBQXJCLHFCQUFxQjs7Q0FVdEI7QUFSSyxnQkFBYztTQUFBLGVBQUc7QUFDbkIsYUFBTyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQztLQUNwQzs7OztBQUdHLHNCQUFvQjs7OztTQUFBLGVBQUc7QUFDekIsYUFBTyxPQUFPLENBQUMsd0JBQXdCLENBQUMsQ0FBQztLQUMxQzs7OztFQUNGLENBQUMiLCJmaWxlIjoiL3Zhci9mb2xkZXJzL3cxL18ybWM2bTA1MHFuMjMybnBzZjl6M2hmc2g1OF9qaC9UL3RtcEpuNG9xR3B1Ymxpc2hfcGFja2FnZXMvbnBtL251Y2xpZGUtd2F0Y2htYW4taGVscGVycy9saWIvbWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgYmFiZWwnO1xuLyogQGZsb3cgKi9cblxuLypcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW5cbiAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciB7ZnNQcm9taXNlfSA9IHJlcXVpcmUoJ251Y2xpZGUtY29tbW9ucycpO1xuXG52YXIgV0FUQ0hNQU5fREVGQVVMVF9QQVRIID0gJy91c3IvbG9jYWwvYmluL3dhdGNobWFuJztcblxuYXN5bmMgZnVuY3Rpb24gZ2V0V2F0Y2htYW5CaW5hcnlQYXRoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHRyeSB7XG4gICAgdmFyIHN0YXRzID0gYXdhaXQgZnNQcm9taXNlLnN0YXQoV0FUQ0hNQU5fREVGQVVMVF9QQVRIKTtcbiAgICAvLyBgc3RhdHNgIGNvbnRhaW5zIGEgYG1vZGVgIHByb3BlcnR5LCBhIG51bWJlciB3aGljaCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmVcbiAgICAvLyB3aGV0aGVyIHRoaXMgZmlsZSBpcyBleGVjdXRhYmxlLiBIb3dldmVyLCB0aGUgbnVtYmVyIGlzIHBsYXRmb3JtLWRlcGVuZGVudC5cbiAgICBpZiAoc3RhdHMgJiYgc3RhdHMuaXNGaWxlKCkpIHtcbiAgICAgIHJldHVybiBXQVRDSE1BTl9ERUZBVUxUX1BBVEg7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gU3VwcHJlc3MgdGhlIGVycm9yLlxuICB9XG4gIC8vIExldCB0aGUgd2F0Y2htYW4gQ2xpZW50IGZpbmQgdGhlIHdhdGNobWFuIGJpbmFyeSB2aWEgdGhlIGRlZmF1bHQgZW52IFBBVEguXG4gIHJldHVybiAnd2F0Y2htYW4nO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgZ2V0V2F0Y2htYW5CaW5hcnlQYXRoLFxuXG4gIGdldCBXYXRjaG1hbkNsaWVudCgpIHtcbiAgICByZXR1cm4gcmVxdWlyZSgnLi9XYXRjaG1hbkNsaWVudCcpO1xuICB9LFxuXG4gIC8vIEV4cG9zZWQgZm9yIHRlc3RpbmcuXG4gIGdldCBXYXRjaG1hblN1YnNjcmlwdGlvbigpIHtcbiAgICByZXR1cm4gcmVxdWlyZSgnLi9XYXRjaG1hblN1YnNjcmlwdGlvbicpO1xuICB9LFxufTtcbiJdfQ== |
@@ -1,3 +0,1 @@ | ||
'use babel'; | ||
/* @flow */ | ||
@@ -12,23 +10,23 @@ /* | ||
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { var callNext = step.bind(null, 'next'); var callThrow = step.bind(null, 'throw'); function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(callNext, callThrow); } } callNext(); }); }; } | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
var watchman = require('fb-watchman'); | ||
var WatchmanSubscription = require('./WatchmanSubscription'); | ||
var {ensureTrailingSeparator} = require('nuclide-commons').paths; | ||
var ensureTrailingSeparator = require('nuclide-commons').paths.ensureTrailingSeparator; | ||
var logger = require('nuclide-logging').getLogger(); | ||
var {getWatchmanBinaryPath} = require('./main'); | ||
type WatchmanSubscriptionResponse = { | ||
root: string; | ||
subscription: string; | ||
files: Array<FileChange>; | ||
}; | ||
var _require = require('./main'); | ||
type FileChange = { | ||
name: string; | ||
new: boolean; | ||
exists: boolean; | ||
mode: number; | ||
}; | ||
var getWatchmanBinaryPath = _require.getWatchmanBinaryPath; | ||
class WatchmanClient { | ||
constructor() { | ||
var WatchmanClient = (function () { | ||
function WatchmanClient() { | ||
_classCallCheck(this, WatchmanClient); | ||
this._initWatchmanClient(); | ||
@@ -39,168 +37,220 @@ this._subscriptions = {}; | ||
dispose() { | ||
if (this._clientPromise) { | ||
this._clientPromise.then(client => client.end()); | ||
_createClass(WatchmanClient, [{ | ||
key: 'dispose', | ||
value: function dispose() { | ||
if (this._clientPromise) { | ||
this._clientPromise.then(function (client) { | ||
return client.end(); | ||
}); | ||
} | ||
} | ||
} | ||
}, { | ||
key: '_initWatchmanClient', | ||
value: function _initWatchmanClient() { | ||
var _this = this; | ||
_initWatchmanClient() { | ||
this._clientPromise = this._createClientPromise(); | ||
this._clientPromise.then(client => { | ||
client.on('end', () => this._onClientEnd()); | ||
client.on('error', error => logger.error('Error while talking to watchman: ', error)); | ||
client.on('subscription', response => this._onSubscriptionResult(response)); | ||
}); | ||
} | ||
async _createClientPromise(): Promise<watchman.Client> { | ||
return new watchman.Client({ | ||
watchmanBinaryPath: await getWatchmanBinaryPath(), | ||
}); | ||
} | ||
_onClientEnd() { | ||
logger.warn('Watchman client ended, creating a new client!'); | ||
this._clientPromise.then(client => { | ||
client.removeAllListeners('end'); | ||
client.removeAllListeners('error'); | ||
client.removeAllListeners('subscription'); | ||
}); | ||
this._initWatchmanClient(); | ||
this._restoreSubscriptions(); | ||
} | ||
async _restoreSubscriptions() { | ||
var watchPromises = []; | ||
for (var key in this._subscriptions) { | ||
watchPromises.push(this._subscriptions[key]); | ||
this._clientPromise = this._createClientPromise(); | ||
this._clientPromise.then(function (client) { | ||
client.on('end', function () { | ||
return _this._onClientEnd(); | ||
}); | ||
client.on('error', function (error) { | ||
return logger.error('Error while talking to watchman: ', error); | ||
}); | ||
client.on('subscription', function (response) { | ||
return _this._onSubscriptionResult(response); | ||
}); | ||
}); | ||
} | ||
await Promise.all(watchPromises.map(async (subscription) => { | ||
subscription.options.since = await this._clock(subscription.root); | ||
await this._watchProject(subscription.path); | ||
await this._subscribe(subscription.root, subscription.name, subscription.options); | ||
})); | ||
} | ||
_onSubscriptionResult(response: WatchmanSubscriptionResponse) { | ||
var subscription = this._subscriptions[response.subscription]; | ||
if (!subscription) { | ||
return logger.error('Subscription not found for response:!', response); | ||
}, { | ||
key: '_createClientPromise', | ||
value: _asyncToGenerator(function* () { | ||
return new watchman.Client({ | ||
watchmanBinaryPath: yield getWatchmanBinaryPath() | ||
}); | ||
}) | ||
}, { | ||
key: '_onClientEnd', | ||
value: function _onClientEnd() { | ||
logger.warn('Watchman client ended, creating a new client!'); | ||
this._clientPromise.then(function (client) { | ||
client.removeAllListeners('end'); | ||
client.removeAllListeners('error'); | ||
client.removeAllListeners('subscription'); | ||
}); | ||
this._initWatchmanClient(); | ||
this._restoreSubscriptions(); | ||
} | ||
subscription.emit('change', response.files); | ||
} | ||
}, { | ||
key: '_restoreSubscriptions', | ||
value: _asyncToGenerator(function* () { | ||
var _this2 = this; | ||
async watchDirectoryRecursive(localDirectoryPath: string) : Promise<WatchmanSubscription> { | ||
var directoryPath = ensureTrailingSeparator(localDirectoryPath); | ||
var existingSubscription = this._subscriptions[directoryPath]; | ||
if (existingSubscription) { | ||
existingSubscription.subscriptionCount++; | ||
return existingSubscription; | ||
} else { | ||
var {watch: watchRoot, relative_path: relativePath} = await this._watchProject(directoryPath); | ||
var clock = await this._clock(watchRoot); | ||
var options = { | ||
fields: ['name', 'new', 'exists', 'mode'], | ||
since: clock, | ||
}; | ||
if (relativePath) { | ||
// Passing an 'undefined' expression causes an exception in fb-watchman. | ||
options.expression = ['dirname', relativePath]; | ||
var watchPromises = []; | ||
for (var key in this._subscriptions) { | ||
watchPromises.push(this._subscriptions[key]); | ||
} | ||
// relativePath is undefined if watchRoot is the same as directoryPath. | ||
var subscription = this._subscriptions[directoryPath] = | ||
new WatchmanSubscription( | ||
/*subscriptionRoot*/ watchRoot, | ||
/*pathFromSubscriptionRootToSubscriptionPath*/ relativePath, | ||
/*subscriptionPath*/ directoryPath, | ||
/*subscriptionCount*/ 1, | ||
/*subscriptionOptions*/ options | ||
); | ||
await this._subscribe(watchRoot, directoryPath, options); | ||
return subscription; | ||
yield Promise.all(watchPromises.map(_asyncToGenerator(function* (subscription) { | ||
subscription.options.since = yield _this2._clock(subscription.root); | ||
yield _this2._watchProject(subscription.path); | ||
yield _this2._subscribe(subscription.root, subscription.name, subscription.options); | ||
}))); | ||
}) | ||
}, { | ||
key: '_onSubscriptionResult', | ||
value: function _onSubscriptionResult(response) { | ||
var subscription = this._subscriptions[response.subscription]; | ||
if (!subscription) { | ||
return logger.error('Subscription not found for response:!', response); | ||
} | ||
subscription.emit('change', response.files); | ||
} | ||
} | ||
}, { | ||
key: 'watchDirectoryRecursive', | ||
value: _asyncToGenerator(function* (localDirectoryPath) { | ||
var directoryPath = ensureTrailingSeparator(localDirectoryPath); | ||
var existingSubscription = this._subscriptions[directoryPath]; | ||
if (existingSubscription) { | ||
existingSubscription.subscriptionCount++; | ||
return existingSubscription; | ||
} else { | ||
var _ref = yield this._watchProject(directoryPath); | ||
hasSubscription(entryPath: string): boolean { | ||
return !!this._subscriptions[entryPath]; | ||
} | ||
var watchRoot = _ref.watch; | ||
var relativePath = _ref.relative_path; | ||
async unwatch(entryPath: string): Promise { | ||
if (!this._subscriptions[entryPath]) { | ||
return logger.error('No watcher entity found with path:', entryPath); | ||
var clock = yield this._clock(watchRoot); | ||
var options = { | ||
fields: ['name', 'new', 'exists', 'mode'], | ||
since: clock | ||
}; | ||
if (relativePath) { | ||
// Passing an 'undefined' expression causes an exception in fb-watchman. | ||
options.expression = ['dirname', relativePath]; | ||
} | ||
// relativePath is undefined if watchRoot is the same as directoryPath. | ||
var subscription = this._subscriptions[directoryPath] = new WatchmanSubscription( | ||
/*subscriptionRoot*/watchRoot, | ||
/*pathFromSubscriptionRootToSubscriptionPath*/relativePath, | ||
/*subscriptionPath*/directoryPath, | ||
/*subscriptionCount*/1, | ||
/*subscriptionOptions*/options); | ||
yield this._subscribe(watchRoot, directoryPath, options); | ||
return subscription; | ||
} | ||
}) | ||
}, { | ||
key: 'hasSubscription', | ||
value: function hasSubscription(entryPath) { | ||
return !!this._subscriptions[entryPath]; | ||
} | ||
var subscription = this._subscriptions[entryPath]; | ||
if (--subscription.subscriptionCount === 0) { | ||
}, { | ||
key: 'unwatch', | ||
value: _asyncToGenerator(function* (entryPath) { | ||
if (!this._subscriptions[entryPath]) { | ||
return logger.error('No watcher entity found with path:', entryPath); | ||
} | ||
var subscription = this._subscriptions[entryPath]; | ||
if (--subscription.subscriptionCount === 0) { | ||
await this._unsubscribe(subscription.path, subscription.name); | ||
// Don't delete the watcher if there are other users for it. | ||
if (!subscription.pathFromSubscriptionRootToSubscriptionPath) { | ||
await this._deleteWatcher(entryPath); | ||
yield this._unsubscribe(subscription.path, subscription.name); | ||
// Don't delete the watcher if there are other users for it. | ||
if (!subscription.pathFromSubscriptionRootToSubscriptionPath) { | ||
yield this._deleteWatcher(entryPath); | ||
} | ||
delete this._subscriptions[entryPath]; | ||
} | ||
delete this._subscriptions[entryPath]; | ||
}) | ||
}, { | ||
key: '_watchList', | ||
value: _asyncToGenerator(function* () { | ||
var _ref2 = yield this._command('watch-list'); | ||
var roots = _ref2.roots; | ||
return roots; | ||
}) | ||
}, { | ||
key: '_deleteWatcher', | ||
value: function _deleteWatcher(entryPath) { | ||
return this._command('watch-del', entryPath); | ||
} | ||
} | ||
}, { | ||
key: '_unsubscribe', | ||
value: function _unsubscribe(subscriptionPath, subscriptionName) { | ||
return this._command('unsubscribe', subscriptionPath, subscriptionName); | ||
} | ||
}, { | ||
key: '_watch', | ||
value: _asyncToGenerator(function* (directoryPath) { | ||
var response = yield this._command('watch', directoryPath); | ||
if (response.warning) { | ||
logger.log('watchman warning: ', response.warning); | ||
} | ||
}) | ||
}, { | ||
key: '_watchProject', | ||
value: _asyncToGenerator(function* (directoryPath) { | ||
var watchmanVersion = yield this._watchmanVersionPromise; | ||
if (!watchmanVersion || watchmanVersion < '3.1.0') { | ||
throw new Error('Watchman version: ' + watchmanVersion + ' does not support watch-project'); | ||
} | ||
var response = yield this._command('watch-project', directoryPath); | ||
if (response.warning) { | ||
logger.log('watchman warning: ', response.warning); | ||
} | ||
return response; | ||
}) | ||
}, { | ||
key: '_clock', | ||
value: _asyncToGenerator(function* (directoryPath) { | ||
var _ref3 = yield this._command('clock', directoryPath); | ||
async _watchList(): Promise<Array<string>> { | ||
var {roots} = await this._command('watch-list'); | ||
return roots; | ||
} | ||
var clock = _ref3.clock; | ||
_deleteWatcher(entryPath: string): Promise { | ||
return this._command('watch-del', entryPath); | ||
} | ||
return clock; | ||
}) | ||
}, { | ||
key: 'version', | ||
value: _asyncToGenerator(function* () { | ||
var _ref4 = yield this._command('version'); | ||
_unsubscribe(subscriptionPath: string, subscriptionName: string) { | ||
return this._command('unsubscribe', subscriptionPath, subscriptionName); | ||
} | ||
var version = _ref4.version; | ||
async _watch(directoryPath: string): Promise { | ||
var response = await this._command('watch', directoryPath); | ||
if (response.warning) { | ||
logger.log('watchman warning: ', response.warning); | ||
} | ||
} | ||
return version; | ||
}) | ||
}, { | ||
key: '_subscribe', | ||
value: function _subscribe(watchRoot, subscriptionName) { | ||
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; | ||
async _watchProject(directoryPath: string): Promise<any> { | ||
var watchmanVersion = await this._watchmanVersionPromise; | ||
if (!watchmanVersion || watchmanVersion < '3.1.0') { | ||
throw new Error('Watchman version: ' + watchmanVersion + ' does not support watch-project'); | ||
return this._command('subscribe', watchRoot, subscriptionName, options); | ||
} | ||
var response = await this._command('watch-project', directoryPath); | ||
if (response.warning) { | ||
logger.log('watchman warning: ', response.warning); | ||
} | ||
return response; | ||
} | ||
async _clock(directoryPath: string): Promise<string> { | ||
var {clock} = await this._command('clock', directoryPath); | ||
return clock; | ||
} | ||
/* | ||
* Promisify calls to watchman client. | ||
*/ | ||
}, { | ||
key: '_command', | ||
value: function _command() { | ||
var _this3 = this; | ||
async version(): Promise<string> { | ||
var {version} = await this._command('version'); | ||
return version; | ||
} | ||
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { | ||
args[_key] = arguments[_key]; | ||
} | ||
_subscribe( | ||
watchRoot: string, | ||
subscriptionName: ?string, | ||
options: ?WatchmanSubscriptionOptions = {} | ||
): Promise<WatchmanSubscription> { | ||
return this._command('subscribe', watchRoot, subscriptionName, options); | ||
} | ||
return new Promise(function (resolve, reject) { | ||
_this3._clientPromise.then(function (client) { | ||
client.command(args, function (error, response) { | ||
return error ? reject(error) : resolve(response); | ||
}); | ||
})['catch'](reject); | ||
}); | ||
} | ||
}]); | ||
/* | ||
* Promisify calls to watchman client. | ||
*/ | ||
_command(...args): Promise<any> { | ||
return new Promise((resolve, reject) => { | ||
this._clientPromise.then(client => { | ||
client.command(args, (error, response) => | ||
error ? reject(error) : resolve(response)); | ||
}).catch(reject); | ||
}); | ||
} | ||
} | ||
return WatchmanClient; | ||
})(); | ||
module.exports = WatchmanClient; | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi92YXIvZm9sZGVycy93MS9fMm1jNm0wNTBxbjIzMm5wc2Y5ejNoZnNoNThfamgvVC90bXBKbjRvcUdwdWJsaXNoX3BhY2thZ2VzL25wbS9udWNsaWRlLXdhdGNobWFuLWhlbHBlcnMvbGliL1dhdGNobWFuQ2xpZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQVdaLElBQUksUUFBUSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUN0QyxJQUFJLG9CQUFvQixHQUFHLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDOztJQUN4RCx1QkFBdUIsR0FBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxLQUFLLENBQTNELHVCQUF1Qjs7QUFDNUIsSUFBSSxNQUFNLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7O2VBQ3RCLE9BQU8sQ0FBQyxRQUFRLENBQUM7O0lBQTFDLHFCQUFxQixZQUFyQixxQkFBcUI7O0lBZXBCLGNBQWM7QUFDUCxXQURQLGNBQWMsR0FDSjswQkFEVixjQUFjOztBQUVoQixRQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztBQUMzQixRQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUN6QixRQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0dBQy9DOztlQUxHLGNBQWM7O1dBT1gsbUJBQUc7QUFDUixVQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7QUFDdkIsWUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsVUFBQSxNQUFNO2lCQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUU7U0FBQSxDQUFDLENBQUM7T0FDbEQ7S0FDRjs7O1dBRWtCLCtCQUFHOzs7QUFDcEIsVUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztBQUNsRCxVQUFJLENBQUMsY0FBYyxDQUFD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ci9mb2xkZXJzL3cxL18ybWM2bTA1MHFuMjMybnBzZjl6M2hmc2g1OF9qaC9UL3RtcEpuNG9xR3B1Ymxpc2hfcGFja2FnZXMvbnBtL251Y2xpZGUtd2F0Y2htYW4taGVscGVycy9saWIvV2F0Y2htYW5DbGllbnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGJhYmVsJztcbi8qIEBmbG93ICovXG5cbi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTUtcHJlc2VudCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgbGljZW5zZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGluXG4gKiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgd2F0Y2htYW4gPSByZXF1aXJlKCdmYi13YXRjaG1hbicpO1xudmFyIFdhdGNobWFuU3Vic2NyaXB0aW9uID0gcmVxdWlyZSgnLi9XYXRjaG1hblN1YnNjcmlwdGlvbicpO1xudmFyIHtlbnN1cmVUcmFpbGluZ1NlcGFyYXRvcn0gPSByZXF1aXJlKCdudWNsaWRlLWNvbW1vbnMnKS5wYXRocztcbnZhciBsb2dnZXIgPSByZXF1aXJlKCdudWNsaWRlLWxvZ2dpbmcnKS5nZXRMb2dnZXIoKTtcbnZhciB7Z2V0V2F0Y2htYW5CaW5hcnlQYXRofSA9IHJlcXVpcmUoJy4vbWFpbicpO1xuXG50eXBlIFdhdGNobWFuU3Vic2NyaXB0aW9uUmVzcG9uc2UgPSB7XG4gIHJvb3Q6IHN0cmluZztcbiAgc3Vic2NyaXB0aW9uOiBzdHJpbmc7XG4gIGZpbGVzOiBBcnJheTxGaWxlQ2hhbmdlPjtcbn07XG5cbnR5cGUgRmlsZUNoYW5nZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICBuZXc6IGJvb2xlYW47XG4gIGV4aXN0czogYm9vbGVhbjtcbiAgbW9kZTogbnVtYmVyO1xufTtcblxuY2xhc3MgV2F0Y2htYW5DbGllbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9pbml0V2F0Y2htYW5DbGllbnQoKTtcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0ge307XG4gICAgdGhpcy5fd2F0Y2htYW5WZXJzaW9uUHJvbWlzZSA9IHRoaXMudmVyc2lvbigpO1xuICB9XG5cbiAgZGlzcG9zZSgpIHtcbiAgICBpZiAodGhpcy5fY2xpZW50UHJvbWlzZSkge1xuICAgICAgdGhpcy5fY2xpZW50UHJvbWlzZS50aGVuKGNsaWVudCA9PiBjbGllbnQuZW5kKCkpO1xuICAgIH1cbiAgfVxuXG4gIF9pbml0V2F0Y2htYW5DbGllbnQoKSB7XG4gICAgdGhpcy5fY2xpZW50UHJvbWlzZSA9IHRoaXMuX2NyZWF0ZUNsaWVudFByb21pc2UoKTtcbiAgICB0aGlzLl9jbGllbnRQcm9taXNlLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5vbignZW5kJywgKCkgPT4gdGhpcy5fb25DbGllbnRFbmQoKSk7XG4gICAgICBjbGllbnQub24oJ2Vycm9yJywgZXJyb3IgPT4gbG9nZ2VyLmVycm9yKCdFcnJvciB3aGlsZSB0YWxraW5nIHRvIHdhdGNobWFuOiAnLCBlcnJvcikpO1xuICAgICAgY2xpZW50Lm9uKCdzdWJzY3JpcHRpb24nLCByZXNwb25zZSA9PiB0aGlzLl9vblN1YnNjcmlwdGlvblJlc3VsdChyZXNwb25zZSkpO1xuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgX2NyZWF0ZUNsaWVudFByb21pc2UoKTogUHJvbWlzZTx3YXRjaG1hbi5DbGllbnQ+IHtcbiAgICByZXR1cm4gbmV3IHdhdGNobWFuLkNsaWVudCh7XG4gICAgICB3YXRjaG1hbkJpbmFyeVBhdGg6IGF3YWl0IGdldFdhdGNobWFuQmluYXJ5UGF0aCgpLFxuICAgIH0pO1xuICB9XG5cbiAgX29uQ2xpZW50RW5kKCkge1xuICAgIGxvZ2dlci53YXJuKCdXYXRjaG1hbiBjbGllbnQgZW5kZWQsIGNyZWF0aW5nIGEgbmV3IGNsaWVudCEnKTtcbiAgICB0aGlzLl9jbGllbnRQcm9taXNlLnRoZW4oY2xpZW50ID0+IHtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ2VuZCcpO1xuICAgICAgY2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZXJyb3InKTtcbiAgICAgIGNsaWVudC5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3N1YnNjcmlwdGlvbicpO1xuICAgIH0pO1xuICAgIHRoaXMuX2luaXRXYXRjaG1hbkNsaWVudCgpO1xuICAgIHRoaXMuX3Jlc3RvcmVTdWJzY3JpcHRpb25zKCk7XG4gIH1cblxuICBhc3luYyBfcmVzdG9yZVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgdmFyIHdhdGNoUHJvbWlzZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5fc3Vic2NyaXB0aW9ucykge1xuICAgICAgd2F0Y2hQcm9taXNlcy5wdXNoKHRoaXMuX3N1YnNjcmlwdGlvbnNba2V5XSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHdhdGNoUHJvbWlzZXMubWFwKGFzeW5jIChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi5vcHRpb25zLnNpbmNlID0gYXdhaXQgdGhpcy5fY2xvY2soc3Vic2NyaXB0aW9uLnJvb3QpO1xuICAgICAgYXdhaXQgdGhpcy5fd2F0Y2hQcm9qZWN0KHN1YnNjcmlwdGlvbi5wYXRoKTtcbiAgICAgIGF3YWl0IHRoaXMuX3N1YnNjcmliZShzdWJzY3JpcHRpb24ucm9vdCwgc3Vic2NyaXB0aW9uLm5hbWUsIHN1YnNjcmlwdGlvbi5vcHRpb25zKTtcbiAgICB9KSk7XG4gIH1cblxuICBfb25TdWJzY3JpcHRpb25SZXN1bHQocmVzcG9uc2U6IFdhdGNobWFuU3Vic2NyaXB0aW9uUmVzcG9uc2UpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fc3Vic2NyaXB0aW9uc1tyZXNwb25zZS5zdWJzY3JpcHRpb25dO1xuICAgIGlmICghc3Vic2NyaXB0aW9uKSB7XG4gICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdTdWJzY3JpcHRpb24gbm90IGZvdW5kIGZvciByZXNwb25zZTohJywgcmVzcG9uc2UpO1xuICAgIH1cbiAgICBzdWJzY3JpcHRpb24uZW1pdCgnY2hhbmdlJywgcmVzcG9uc2UuZmlsZXMpO1xuICB9XG5cbiAgYXN5bmMgd2F0Y2hEaXJlY3RvcnlSZWN1cnNpdmUobG9jYWxEaXJlY3RvcnlQYXRoOiBzdHJpbmcpIDogUHJvbWlzZTxXYXRjaG1hblN1YnNjcmlwdGlvbj4ge1xuICAgIHZhciBkaXJlY3RvcnlQYXRoID0gZW5zdXJlVHJhaWxpbmdTZXBhcmF0b3IobG9jYWxEaXJlY3RvcnlQYXRoKTtcbiAgICB2YXIgZXhpc3RpbmdTdWJzY3JpcHRpb24gPSB0aGlzLl9zdWJzY3JpcHRpb25zW2RpcmVjdG9yeVBhdGhdO1xuICAgIGlmIChleGlzdGluZ1N1YnNjcmlwdGlvbikge1xuICAgICAgZXhpc3RpbmdTdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uQ291bnQrKztcbiAgICAgIHJldHVybiBleGlzdGluZ1N1YnNjcmlwdGlvbjtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHt3YXRjaDogd2F0Y2hSb290LCByZWxhdGl2ZV9wYXRoOiByZWxhdGl2ZVBhdGh9ID0gYXdhaXQgdGhpcy5fd2F0Y2hQcm9qZWN0KGRpcmVjdG9yeVBhdGgpO1xuICAgICAgdmFyIGNsb2NrID0gYXdhaXQgdGhpcy5fY2xvY2sod2F0Y2hSb290KTtcbiAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICBmaWVsZHM6IFsnbmFtZScsICduZXcnLCAnZXhpc3RzJywgJ21vZGUnXSxcbiAgICAgICAgc2luY2U6IGNsb2NrLFxuICAgICAgfTtcbiAgICAgIGlmIChyZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgLy8gUGFzc2luZyBhbiAndW5kZWZpbmVkJyBleHByZXNzaW9uIGNhdXNlcyBhbiBleGNlcHRpb24gaW4gZmItd2F0Y2htYW4uXG4gICAgICAgIG9wdGlvbnMuZXhwcmVzc2lvbiA9IFsnZGlybmFtZScsIHJlbGF0aXZlUGF0aF07XG4gICAgICB9XG4gICAgICAvLyByZWxhdGl2ZVBhdGggaXMgdW5kZWZpbmVkIGlmIHdhdGNoUm9vdCBpcyB0aGUgc2FtZSBhcyBkaXJlY3RvcnlQYXRoLlxuICAgICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbZGlyZWN0b3J5UGF0aF0gPVxuICAgICAgICAgIG5ldyBXYXRjaG1hblN1YnNjcmlwdGlvbihcbiAgICAgICAgICAgIC8qc3Vic2NyaXB0aW9uUm9vdCovIHdhdGNoUm9vdCxcbiAgICAgICAgICAgIC8qcGF0aEZyb21TdWJzY3JpcHRpb25Sb290VG9TdWJzY3JpcHRpb25QYXRoKi8gcmVsYXRpdmVQYXRoLFxuICAgICAgICAgICAgLypzdWJzY3JpcHRpb25QYXRoKi8gZGlyZWN0b3J5UGF0aCxcbiAgICAgICAgICAgIC8qc3Vic2NyaXB0aW9uQ291bnQqLyAxLFxuICAgICAgICAgICAgLypzdWJzY3JpcHRpb25PcHRpb25zKi8gb3B0aW9uc1xuICAgICAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLl9zdWJzY3JpYmUod2F0Y2hSb290LCBkaXJlY3RvcnlQYXRoLCBvcHRpb25zKTtcbiAgICAgIHJldHVybiBzdWJzY3JpcHRpb247XG4gICAgfVxuICB9XG5cbiAgaGFzU3Vic2NyaXB0aW9uKGVudHJ5UGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5fc3Vic2NyaXB0aW9uc1tlbnRyeVBhdGhdO1xuICB9XG5cbiAgYXN5bmMgdW53YXRjaChlbnRyeVBhdGg6IHN0cmluZyk6IFByb21pc2Uge1xuICAgIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uc1tlbnRyeVBhdGhdKSB7XG4gICAgICByZXR1cm4gbG9nZ2VyLmVycm9yKCdObyB3YXRjaGVyIGVudGl0eSBmb3VuZCB3aXRoIHBhdGg6JywgZW50cnlQYXRoKTtcbiAgICB9XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3N1YnNjcmlwdGlvbnNbZW50cnlQYXRoXTtcbiAgICBpZiAoLS1zdWJzY3JpcHRpb24uc3Vic2NyaXB0aW9uQ291bnQgPT09IDApIHtcblxuICAgICAgYXdhaXQgdGhpcy5fdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uLnBhdGgsIHN1YnNjcmlwdGlvbi5uYW1lKTtcbiAgICAgIC8vIERvbid0IGRlbGV0ZSB0aGUgd2F0Y2hlciBpZiB0aGVyZSBhcmUgb3RoZXIgdXNlcnMgZm9yIGl0LlxuICAgICAgaWYgKCFzdWJzY3JpcHRpb24ucGF0aEZyb21TdWJzY3JpcHRpb25Sb290VG9TdWJzY3JpcHRpb25QYXRoKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuX2RlbGV0ZVdhdGNoZXIoZW50cnlQYXRoKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSB0aGlzLl9zdWJzY3JpcHRpb25zW2VudHJ5UGF0aF07XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3dhdGNoTGlzdCgpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICB2YXIge3Jvb3RzfSA9IGF3YWl0IHRoaXMuX2NvbW1hbmQoJ3dhdGNoLWxpc3QnKTtcbiAgICByZXR1cm4gcm9vdHM7XG4gIH1cblxuICBfZGVsZXRlV2F0Y2hlcihlbnRyeVBhdGg6IHN0cmluZyk6IFByb21pc2Uge1xuICAgIHJldHVybiB0aGlzLl9jb21tYW5kKCd3YXRjaC1kZWwnLCBlbnRyeVBhdGgpO1xuICB9XG5cbiAgX3Vuc3Vic2NyaWJlKHN1YnNjcmlwdGlvblBhdGg6IHN0cmluZywgc3Vic2NyaXB0aW9uTmFtZTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbW1hbmQoJ3Vuc3Vic2NyaWJlJywgc3Vic2NyaXB0aW9uUGF0aCwgc3Vic2NyaXB0aW9uTmFtZSk7XG4gIH1cblxuICBhc3luYyBfd2F0Y2goZGlyZWN0b3J5UGF0aDogc3RyaW5nKTogUHJvbWlzZSB7XG4gICAgdmFyIHJlc3BvbnNlID0gYXdhaXQgdGhpcy5fY29tbWFuZCgnd2F0Y2gnLCBkaXJlY3RvcnlQYXRoKTtcbiAgICBpZiAocmVzcG9uc2Uud2FybmluZykge1xuICAgICAgbG9nZ2VyLmxvZygnd2F0Y2htYW4gd2FybmluZzogJywgcmVzcG9uc2Uud2FybmluZyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgX3dhdGNoUHJvamVjdChkaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHZhciB3YXRjaG1hblZlcnNpb24gPSBhd2FpdCB0aGlzLl93YXRjaG1hblZlcnNpb25Qcm9taXNlO1xuICAgIGlmICghd2F0Y2htYW5WZXJzaW9uIHx8IHdhdGNobWFuVmVyc2lvbiA8ICczLjEuMCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignV2F0Y2htYW4gdmVyc2lvbjogJyArIHdhdGNobWFuVmVyc2lvbiArICcgZG9lcyBub3Qgc3VwcG9ydCB3YXRjaC1wcm9qZWN0Jyk7XG4gICAgfVxuICAgIHZhciByZXNwb25zZSA9IGF3YWl0IHRoaXMuX2NvbW1hbmQoJ3dhdGNoLXByb2plY3QnLCBkaXJlY3RvcnlQYXRoKTtcbiAgICBpZiAocmVzcG9uc2Uud2FybmluZykge1xuICAgICAgbG9nZ2VyLmxvZygnd2F0Y2htYW4gd2FybmluZzogJywgcmVzcG9uc2Uud2FybmluZyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZTtcbiAgfVxuXG4gIGFzeW5jIF9jbG9jayhkaXJlY3RvcnlQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHZhciB7Y2xvY2t9ID0gYXdhaXQgdGhpcy5fY29tbWFuZCgnY2xvY2snLCBkaXJlY3RvcnlQYXRoKTtcbiAgICByZXR1cm4gY2xvY2s7XG4gIH1cblxuICBhc3luYyB2ZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdmFyIHt2ZXJzaW9ufSA9IGF3YWl0IHRoaXMuX2NvbW1hbmQoJ3ZlcnNpb24nKTtcbiAgICByZXR1cm4gdmVyc2lvbjtcbiAgfVxuXG4gIF9zdWJzY3JpYmUoXG4gICAgICAgIHdhdGNoUm9vdDogc3RyaW5nLFxuICAgICAgICBzdWJzY3JpcHRpb25OYW1lOiA/c3RyaW5nLFxuICAgICAgICBvcHRpb25zOiA/V2F0Y2htYW5TdWJzY3JpcHRpb25PcHRpb25zID0ge31cbiAgICAgICk6IFByb21pc2U8V2F0Y2htYW5TdWJzY3JpcHRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fY29tbWFuZCgnc3Vic2NyaWJlJywgd2F0Y2hSb290LCBzdWJzY3JpcHRpb25OYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb21pc2lmeSBjYWxscyB0byB3YXRjaG1hbiBjbGllbnQuXG4gICAqL1xuICBfY29tbWFuZCguLi5hcmdzKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fY2xpZW50UHJvbWlzZS50aGVuKGNsaWVudCA9PiB7XG4gICAgICAgIGNsaWVudC5jb21tYW5kKGFyZ3MsIChlcnJvciwgcmVzcG9uc2UpID0+XG4gICAgICAgICAgICBlcnJvciA/IHJlamVjdChlcnJvcikgOiByZXNvbHZlKHJlc3BvbnNlKSk7XG4gICAgICB9KS5jYXRjaChyZWplY3QpO1xuICAgIH0pO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gV2F0Y2htYW5DbGllbnQ7XG4iXX0= |
@@ -1,3 +0,1 @@ | ||
'use babel'; | ||
/* @flow */ | ||
@@ -12,9 +10,13 @@ /* | ||
var {EventEmitter} = require('events'); | ||
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; desc = parent = getter = undefined; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; | ||
type WatchmanSubscriptionOptions = { | ||
expression: ?Array<string>; // e.g. ['match', '*.js'], | ||
fields: ?Array<string>; // e.g. ['name', 'size', 'exists', 'mode'] | ||
}; | ||
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | ||
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } | ||
var _require = require('events'); | ||
var EventEmitter = _require.EventEmitter; | ||
// e.g. ['name', 'size', 'exists', 'mode'] | ||
/** | ||
@@ -27,11 +29,10 @@ * @param pathFromSubscriptionRootToSubscriptionPath The relative path from | ||
*/ | ||
class WatchmanSubscription extends EventEmitter { | ||
constructor( | ||
subscriptionRoot: string, | ||
pathFromSubscriptionRootToSubscriptionPath: ?string, | ||
subscriptionPath: string, | ||
subscriptionCount: number, | ||
subscriptionOptions: WatchmanSubscriptionOptions | ||
) { | ||
super(); | ||
var WatchmanSubscription = (function (_EventEmitter) { | ||
_inherits(WatchmanSubscription, _EventEmitter); | ||
function WatchmanSubscription(subscriptionRoot, pathFromSubscriptionRootToSubscriptionPath, subscriptionPath, subscriptionCount, subscriptionOptions) { | ||
_classCallCheck(this, WatchmanSubscription); | ||
_get(Object.getPrototypeOf(WatchmanSubscription.prototype), 'constructor', this).call(this); | ||
this.root = subscriptionRoot; | ||
@@ -43,4 +44,8 @@ this.pathFromSubscriptionRootToSubscriptionPath = pathFromSubscriptionRootToSubscriptionPath; | ||
} | ||
} | ||
return WatchmanSubscription; | ||
})(EventEmitter); | ||
module.exports = WatchmanSubscription; | ||
// e.g. ['match', '*.js'], | ||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi92YXIvZm9sZGVycy93MS9fMm1jNm0wNTBxbjIzMm5wc2Y5ejNoZnNoNThfamgvVC90bXBKbjRvcUdwdWJsaXNoX3BhY2thZ2VzL25wbS9udWNsaWRlLXdhdGNobWFuLWhlbHBlcnMvbGliL1dhdGNobWFuU3Vic2NyaXB0aW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztlQVdTLE9BQU8sQ0FBQyxRQUFRLENBQUM7O0lBQWpDLFlBQVksWUFBWixZQUFZOzs7Ozs7Ozs7OztJQWNYLG9CQUFvQjtZQUFwQixvQkFBb0I7O0FBQ2IsV0FEUCxvQkFBb0IsQ0FFcEIsZ0JBQXdCLEVBQ3hCLDBDQUFtRCxFQUNuRCxnQkFBd0IsRUFDeEIsaUJBQXlCLEVBQ3pCLG1CQUFnRCxFQUM5QzswQkFQRixvQkFBb0I7O0FBUXRCLCtCQVJFLG9CQUFvQiw2Q0FRZDtBQUNSLFFBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7QUFDN0IsUUFBSSxDQUFDLDBDQUEwQyxHQUFHLDBDQUEwQyxDQUFDO0FBQzdGLFFBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztBQUN6QyxRQUFJLENBQUMsaUJBQWlCLEdBQUcsaUJBQWlCLENBQUM7QUFDM0MsUUFBSSxDQUFDLE9BQU8sR0FBRyxtQkFBbUIsQ0FBQztHQUNwQzs7U0FkRyxvQkFBb0I7R0FBUyxZQUFZOztBQWlCL0MsTUFBTSxDQUFDLE9BQU8sR0FBRyxvQkFBb0IsQ0FBQyIsImZpbGUiOiIvdmFyL2ZvbGRlcnMvdzEvXzJtYzZtMDUwcW4yMzJucHNmOXozaGZzaDU4X2poL1QvdG1wSm40b3FHcHVibGlzaF9wYWNrYWdlcy9ucG0vbnVjbGlkZS13YXRjaG1hbi1oZWxwZXJzL2xpYi9XYXRjaG1hblN1YnNjcmlwdGlvbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIid1c2UgYmFiZWwnO1xuLyogQGZsb3cgKi9cblxuLypcbiAqIENvcHlyaWdodCAoYykgMjAxNS1wcmVzZW50LCBGYWNlYm9vaywgSW5jLlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBsaWNlbnNlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW5cbiAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvdXJjZSB0cmVlLlxuICovXG5cbnZhciB7RXZlbnRFbWl0dGVyfSA9IHJlcXVpcmUoJ2V2ZW50cycpO1xuXG50eXBlIFdhdGNobWFuU3Vic2NyaXB0aW9uT3B0aW9ucyA9IHtcbiAgZXhwcmVzc2lvbjogP0FycmF5PHN0cmluZz47IC8vIGUuZy4gWydtYXRjaCcsICcqLmpzJ10sXG4gIGZpZWxkczogP0FycmF5PHN0cmluZz47IC8vIGUuZy4gWyduYW1lJywgJ3NpemUnLCAnZXhpc3RzJywgJ21vZGUnXVxufTtcblxuLyoqXG4gKiBAcGFyYW0gcGF0aEZyb21TdWJzY3JpcHRpb25Sb290VG9TdWJzY3JpcHRpb25QYXRoIFRoZSByZWxhdGl2ZSBwYXRoIGZyb21cbiAqICAgc3Vic2NyaXB0aW9uUm9vdCB0byBzdWJzY3JpcHRpb25QYXRoLiBUaGlzIGlzIHRoZSAncmVsYXRpdmVfcGF0aCcgYXMgZGVzY3JpYmVkIGF0XG4gKiAgIGh0dHBzOi8vZmFjZWJvb2suZ2l0aHViLmlvL3dhdGNobWFuL2RvY3MvY21kL3dhdGNoLXByb2plY3QuaHRtbCN1c2luZy13YXRjaC1wcm9qZWN0LlxuICogICBOb3RhYmx5LCB0aGlzIHZhbHVlIHNob3VsZCBiZSB1bmRlZmluZWQgaWYgc3Vic2NyaXB0aW9uUm9vdCBpcyB0aGUgc2FtZSBhc1xuICogICBzdWJzY3JpcHRpb25QYXRoLlxuICovXG5jbGFzcyBXYXRjaG1hblN1YnNjcmlwdGlvbiBleHRlbmRzIEV2ZW50RW1pdHRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgICAgc3Vic2NyaXB0aW9uUm9vdDogc3RyaW5nLFxuICAgICAgcGF0aEZyb21TdWJzY3JpcHRpb25Sb290VG9TdWJzY3JpcHRpb25QYXRoOiA/c3RyaW5nLFxuICAgICAgc3Vic2NyaXB0aW9uUGF0aDogc3RyaW5nLFxuICAgICAgc3Vic2NyaXB0aW9uQ291bnQ6IG51bWJlcixcbiAgICAgIHN1YnNjcmlwdGlvbk9wdGlvbnM6IFdhdGNobWFuU3Vic2NyaXB0aW9uT3B0aW9uc1xuICAgICAgKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnJvb3QgPSBzdWJzY3JpcHRpb25Sb290O1xuICAgIHRoaXMucGF0aEZyb21TdWJzY3JpcHRpb25Sb290VG9TdWJzY3JpcHRpb25QYXRoID0gcGF0aEZyb21TdWJzY3JpcHRpb25Sb290VG9TdWJzY3JpcHRpb25QYXRoO1xuICAgIHRoaXMucGF0aCA9IHRoaXMubmFtZSA9IHN1YnNjcmlwdGlvblBhdGg7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25Db3VudCA9IHN1YnNjcmlwdGlvbkNvdW50O1xuICAgIHRoaXMub3B0aW9ucyA9IHN1YnNjcmlwdGlvbk9wdGlvbnM7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBXYXRjaG1hblN1YnNjcmlwdGlvbjtcbiJdfQ== |
{ | ||
"dependencies": { | ||
"fb-watchman": "1.1.0", | ||
"nuclide-commons": "0.0.26", | ||
"nuclide-logging": "0.0.26" | ||
"nuclide-commons": "0.0.28", | ||
"nuclide-logging": "0.0.28" | ||
}, | ||
"description": "Helper methods for interacting with fb-watchman", | ||
"devDependencies": { | ||
"nuclide-jasmine": "0.0.26", | ||
"nuclide-jasmine": "0.0.28", | ||
"temp": "0.8.1" | ||
@@ -22,3 +22,3 @@ }, | ||
}, | ||
"version": "0.0.26" | ||
"version": "0.0.28" | ||
} |
42291
174.49%506
40.17%+ Added
+ Added
+ Added
- Removed
- Removed
- Removed
Updated
Updated