| /** |
| * @fileoverview An inherited `glob.GlobSync` to support .gitignore patterns. |
| * @author Kael Zhang |
| */ |
| "use strict"; |
| |
| //------------------------------------------------------------------------------ |
| // Requirements |
| //------------------------------------------------------------------------------ |
| |
| const Sync = require("glob").GlobSync, |
| util = require("util"); |
| |
| //------------------------------------------------------------------------------ |
| // Private |
| //------------------------------------------------------------------------------ |
| |
| const IGNORE = Symbol("ignore"); |
| |
| /** |
| * Subclass of `glob.GlobSync` |
| * @param {string} pattern Pattern to be matched. |
| * @param {Object} options `options` for `glob` |
| * @param {function()} shouldIgnore Method to check whether a directory should be ignored. |
| * @constructor |
| */ |
| function GlobSync(pattern, options, shouldIgnore) { |
| |
| /** |
| * We don't put this thing to argument `options` to avoid |
| * further problems, such as `options` validation. |
| * |
| * Use `Symbol` as much as possible to avoid confliction. |
| */ |
| this[IGNORE] = shouldIgnore; |
| |
| Sync.call(this, pattern, options); |
| } |
| |
| util.inherits(GlobSync, Sync); |
| |
| /* eslint no-underscore-dangle: ["error", { "allow": ["_readdir", "_mark"] }] */ |
| |
| GlobSync.prototype._readdir = function(abs, inGlobStar) { |
| |
| /** |
| * `options.nodir` makes `options.mark` as `true`. |
| * Mark `abs` first |
| * to make sure `"node_modules"` will be ignored immediately with ignore pattern `"node_modules/"`. |
| * |
| * There is a built-in cache about marked `File.Stat` in `glob`, so that we could not worry about the extra invocation of `this._mark()` |
| */ |
| const marked = this._mark(abs); |
| |
| if (this[IGNORE](marked)) { |
| return null; |
| } |
| |
| return Sync.prototype._readdir.call(this, abs, inGlobStar); |
| }; |
| |
| |
| module.exports = GlobSync; |