jgb-cli
Version:
```shell npm i -g jgb-cli #全局安装 ```
150 lines • 9.84 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
var FSWatcher = require("fswatcher-child");
var Path = require("path");
/**
* This watcher wraps chokidar so that we watch directories rather than individual files on macOS.
* This prevents us from hitting EMFILE errors when running out of file descriptors.
* Chokidar does not have support for watching directories on non-macOS platforms, so we disable
* this behavior in order to prevent watching more individual files than necessary (e.g. node_modules).
*/
var Watcher = /** @class */ (function () {
function Watcher() {
this.watchedDirectories = new Map();
this.stopped = false;
// FS events on macOS are flakey in the tests, which write lots of files very quickly
// See https://github.com/paulmillr/chokidar/issues/612
this.shouldWatchDirs =
process.platform === 'darwin' && process.env.NODE_ENV !== 'test';
this.watcher = new FSWatcher({
useFsEvents: this.shouldWatchDirs,
ignoreInitial: true,
ignorePermissionErrors: true,
ignored: /\.cache|\.git/
});
}
/**
* Find a parent directory of `path` which is already watched
*/
Watcher.prototype.getWatchedParent = function (path) {
path = Path.dirname(path);
var root = Path.parse(path).root;
while (path !== root) {
if (this.watchedDirectories.has(path)) {
return path;
}
path = Path.dirname(path);
}
return null;
};
/**
* Find a list of child directories of `path` which are already watched
*/
Watcher.prototype.getWatchedChildren = function (path) {
var e_1, _a;
path = Path.dirname(path) + Path.sep;
var res = [];
try {
for (var _b = tslib_1.__values(this.watchedDirectories.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
var dir = _c.value;
if (dir.startsWith(path)) {
res.push(dir);
}
}
}
catch (e_1_1) { e_1 = { error: e_1_1 }; }
finally {
try {
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
}
finally { if (e_1) throw e_1.error; }
}
return res;
};
/**
* Add a path to the watcher
*/
Watcher.prototype.watch = function (path) {
var e_2, _a;
if (this.shouldWatchDirs) {
// If there is no parent directory already watching this path, add a new watcher.
var parent_1 = this.getWatchedParent(path);
if (!parent_1) {
// Find watchers on child directories, and remove them. They will be handled by the new parent watcher.
var children = this.getWatchedChildren(path);
var count = 1;
try {
// tslint:disable-next-line:no-shadowed-variable
for (var children_1 = tslib_1.__values(children), children_1_1 = children_1.next(); !children_1_1.done; children_1_1 = children_1.next()) {
var dir_1 = children_1_1.value;
count += this.watchedDirectories.get(dir_1);
this.watcher._closePath(dir_1);
this.watchedDirectories.delete(dir_1);
}
}
catch (e_2_1) { e_2 = { error: e_2_1 }; }
finally {
try {
if (children_1_1 && !children_1_1.done && (_a = children_1.return)) _a.call(children_1);
}
finally { if (e_2) throw e_2.error; }
}
var dir = Path.dirname(path);
this.watcher.add(dir);
this.watchedDirectories.set(dir, count);
}
else {
// Otherwise, increment the reference count of the parent watcher.
this.watchedDirectories.set(parent_1, this.watchedDirectories.get(parent_1) + 1);
}
}
else {
this.watcher.add(path);
}
};
/**
* Remove a path from the watcher
*/
Watcher.prototype.unwatch = function (path) {
if (this.shouldWatchDirs) {
var dir = this.getWatchedParent(path);
if (dir) {
// When the count of files watching a directory reaches zero, unwatch it.
var count = this.watchedDirectories.get(dir) - 1;
if (count === 0) {
this.watchedDirectories.delete(dir);
this.watcher.unwatch(dir);
}
else {
this.watchedDirectories.set(dir, count);
}
}
}
else {
this.watcher.unwatch(path);
}
};
/**
* Add an event handler
*/
Watcher.prototype.on = function (event, callback) {
this.watcher.on(event, callback);
};
/**
* Add an event handler
*/
Watcher.prototype.once = function (event, callback) {
this.watcher.once(event, callback);
};
/**
* Stop watching all paths
*/
Watcher.prototype.stop = function () {
this.stopped = true;
this.watcher.close();
};
return Watcher;
}());
exports.default = Watcher;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9XYXRjaGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUE4QztBQUM5QywyQkFBNkI7QUFFN0I7Ozs7O0dBS0c7QUFDSDtJQUtFO1FBRkEsdUJBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMvQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWQscUZBQXFGO1FBQ3JGLHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsZUFBZTtZQUNsQixPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxNQUFNLENBQUM7UUFDbkUsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLFNBQVMsQ0FBQztZQUMzQixXQUFXLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDakMsYUFBYSxFQUFFLElBQUk7WUFDbkIsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixPQUFPLEVBQUUsZUFBZTtTQUN6QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxrQ0FBZ0IsR0FBaEIsVUFBaUIsSUFBWTtRQUMzQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUxQixJQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuQyxPQUFPLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDcEIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQzthQUNiO1lBRUQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILG9DQUFrQixHQUFsQixVQUFtQixJ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