You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.6 KiB
114 lines
2.6 KiB
// vendored from https://github.com/amasad/sane/blob/64ff3a870c42e84f744086884bf55a4f9c22d376/src/common.js |
|
'use strict'; |
|
|
|
const platform = require('os').platform(); |
|
|
|
const path = require('path'); |
|
|
|
const anymatch = require('anymatch'); |
|
|
|
const micromatch = require('micromatch'); |
|
|
|
const walker = require('walker'); |
|
/** |
|
* Constants |
|
*/ |
|
|
|
exports.DEFAULT_DELAY = 100; |
|
exports.CHANGE_EVENT = 'change'; |
|
exports.DELETE_EVENT = 'delete'; |
|
exports.ADD_EVENT = 'add'; |
|
exports.ALL_EVENT = 'all'; |
|
/** |
|
* Assigns options to the watcher. |
|
* |
|
* @param {NodeWatcher|PollWatcher|WatchmanWatcher} watcher |
|
* @param {?object} opts |
|
* @return {boolean} |
|
* @public |
|
*/ |
|
|
|
exports.assignOptions = function (watcher, opts) { |
|
opts = opts || {}; |
|
watcher.globs = opts.glob || []; |
|
watcher.dot = opts.dot || false; |
|
watcher.ignored = opts.ignored || false; |
|
|
|
if (!Array.isArray(watcher.globs)) { |
|
watcher.globs = [watcher.globs]; |
|
} |
|
|
|
watcher.hasIgnore = |
|
Boolean(opts.ignored) && !(Array.isArray(opts) && opts.length > 0); |
|
watcher.doIgnore = opts.ignored ? anymatch(opts.ignored) : () => false; |
|
|
|
if (opts.watchman && opts.watchmanPath) { |
|
watcher.watchmanPath = opts.watchmanPath; |
|
} |
|
|
|
return opts; |
|
}; |
|
/** |
|
* Checks a file relative path against the globs array. |
|
* |
|
* @param {array} globs |
|
* @param {string} relativePath |
|
* @return {boolean} |
|
* @public |
|
*/ |
|
|
|
exports.isFileIncluded = function (globs, dot, doIgnore, relativePath) { |
|
if (doIgnore(relativePath)) { |
|
return false; |
|
} |
|
|
|
return globs.length |
|
? micromatch.some(relativePath, globs, { |
|
dot |
|
}) |
|
: dot || micromatch.some(relativePath, '**/*'); |
|
}; |
|
/** |
|
* Traverse a directory recursively calling `callback` on every directory. |
|
* |
|
* @param {string} dir |
|
* @param {function} dirCallback |
|
* @param {function} fileCallback |
|
* @param {function} endCallback |
|
* @param {*} ignored |
|
* @public |
|
*/ |
|
|
|
exports.recReaddir = function ( |
|
dir, |
|
dirCallback, |
|
fileCallback, |
|
endCallback, |
|
errorCallback, |
|
ignored |
|
) { |
|
walker(dir) |
|
.filterDir(currentDir => !anymatch(ignored, currentDir)) |
|
.on('dir', normalizeProxy(dirCallback)) |
|
.on('file', normalizeProxy(fileCallback)) |
|
.on('error', errorCallback) |
|
.on('end', () => { |
|
if (platform === 'win32') { |
|
setTimeout(endCallback, 1000); |
|
} else { |
|
endCallback(); |
|
} |
|
}); |
|
}; |
|
/** |
|
* Returns a callback that when called will normalize a path and call the |
|
* original callback |
|
* |
|
* @param {function} callback |
|
* @return {function} |
|
* @private |
|
*/ |
|
|
|
function normalizeProxy(callback) { |
|
return (filepath, stats) => callback(path.normalize(filepath), stats); |
|
}
|
|
|