New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

nuclide-watchman-helpers

Package Overview
Dependencies
Maintainers
1
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

nuclide-watchman-helpers - npm Package Compare versions

Comparing version

to
0.0.28

55

lib/main.js

@@ -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"
}