diff options
| author | Joel Kronqvist <joel.h.kronqvist@gmail.com> | 2022-03-05 19:02:27 +0200 | 
|---|---|---|
| committer | Joel Kronqvist <joel.h.kronqvist@gmail.com> | 2022-03-05 19:02:27 +0200 | 
| commit | 5d309ff52cd399a6b71968a6b9a70c8ac0b98981 (patch) | |
| tree | 360f7eb50f956e2367ef38fa1fc6ac7ac5258042 /node_modules/glob | |
| parent | b500a50f1b97d93c98b36ed9a980f8188d648147 (diff) | |
| download | LYLLRuoka-5d309ff52cd399a6b71968a6b9a70c8ac0b98981.tar.gz LYLLRuoka-5d309ff52cd399a6b71968a6b9a70c8ac0b98981.zip  | |
Added node_modules for the updating to work properly.
Diffstat (limited to 'node_modules/glob')
| -rw-r--r-- | node_modules/glob/LICENSE | 21 | ||||
| -rw-r--r-- | node_modules/glob/README.md | 378 | ||||
| -rw-r--r-- | node_modules/glob/common.js | 236 | ||||
| -rw-r--r-- | node_modules/glob/glob.js | 787 | ||||
| -rw-r--r-- | node_modules/glob/package.json | 52 | ||||
| -rw-r--r-- | node_modules/glob/sync.js | 483 | 
6 files changed, 1957 insertions, 0 deletions
diff --git a/node_modules/glob/LICENSE b/node_modules/glob/LICENSE new file mode 100644 index 0000000..42ca266 --- /dev/null +++ b/node_modules/glob/LICENSE @@ -0,0 +1,21 @@ +The ISC License + +Copyright (c) Isaac Z. Schlueter and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +## Glob Logo + +Glob's logo created by Tanya Brassie <http://tanyabrassie.com/>, licensed +under a Creative Commons Attribution-ShareAlike 4.0 International License +https://creativecommons.org/licenses/by-sa/4.0/ diff --git a/node_modules/glob/README.md b/node_modules/glob/README.md new file mode 100644 index 0000000..83f0c83 --- /dev/null +++ b/node_modules/glob/README.md @@ -0,0 +1,378 @@ +# Glob + +Match files using the patterns the shell uses, like stars and stuff. + +[](https://travis-ci.org/isaacs/node-glob/) [](https://ci.appveyor.com/project/isaacs/node-glob) [](https://coveralls.io/github/isaacs/node-glob?branch=master) + +This is a glob implementation in JavaScript.  It uses the `minimatch` +library to do its matching. + + + +## Usage + +Install with npm + +``` +npm i glob +``` + +```javascript +var glob = require("glob") + +// options is optional +glob("**/*.js", options, function (er, files) { +  // files is an array of filenames. +  // If the `nonull` option is set, and nothing +  // was found, then files is ["**/*.js"] +  // er is an error object or null. +}) +``` + +## Glob Primer + +"Globs" are the patterns you type when you do stuff like `ls *.js` on +the command line, or put `build/*` in a `.gitignore` file. + +Before parsing the path part patterns, braced sections are expanded +into a set.  Braced sections start with `{` and end with `}`, with any +number of comma-delimited sections within.  Braced sections may contain +slash characters, so `a{/b/c,bcd}` would expand into `a/b/c` and `abcd`. + +The following characters have special magic meaning when used in a +path portion: + +* `*` Matches 0 or more characters in a single path portion +* `?` Matches 1 character +* `[...]` Matches a range of characters, similar to a RegExp range. +  If the first character of the range is `!` or `^` then it matches +  any character not in the range. +* `!(pattern|pattern|pattern)` Matches anything that does not match +  any of the patterns provided. +* `?(pattern|pattern|pattern)` Matches zero or one occurrence of the +  patterns provided. +* `+(pattern|pattern|pattern)` Matches one or more occurrences of the +  patterns provided. +* `*(a|b|c)` Matches zero or more occurrences of the patterns provided +* `@(pattern|pat*|pat?erN)` Matches exactly one of the patterns +  provided +* `**` If a "globstar" is alone in a path portion, then it matches +  zero or more directories and subdirectories searching for matches. +  It does not crawl symlinked directories. + +### Dots + +If a file or directory path portion has a `.` as the first character, +then it will not match any glob pattern unless that pattern's +corresponding path part also has a `.` as its first character. + +For example, the pattern `a/.*/c` would match the file at `a/.b/c`. +However the pattern `a/*/c` would not, because `*` does not start with +a dot character. + +You can make glob treat dots as normal characters by setting +`dot:true` in the options. + +### Basename Matching + +If you set `matchBase:true` in the options, and the pattern has no +slashes in it, then it will seek for any file anywhere in the tree +with a matching basename.  For example, `*.js` would match +`test/simple/basic.js`. + +### Empty Sets + +If no matching files are found, then an empty array is returned.  This +differs from the shell, where the pattern itself is returned.  For +example: + +    $ echo a*s*d*f +    a*s*d*f + +To get the bash-style behavior, set the `nonull:true` in the options. + +### See Also: + +* `man sh` +* `man bash` (Search for "Pattern Matching") +* `man 3 fnmatch` +* `man 5 gitignore` +* [minimatch documentation](https://github.com/isaacs/minimatch) + +## glob.hasMagic(pattern, [options]) + +Returns `true` if there are any special characters in the pattern, and +`false` otherwise. + +Note that the options affect the results.  If `noext:true` is set in +the options object, then `+(a|b)` will not be considered a magic +pattern.  If the pattern has a brace expansion, like `a/{b/c,x/y}` +then that is considered magical, unless `nobrace:true` is set in the +options. + +## glob(pattern, [options], cb) + +* `pattern` `{String}` Pattern to be matched +* `options` `{Object}` +* `cb` `{Function}` +  * `err` `{Error | null}` +  * `matches` `{Array<String>}` filenames found matching the pattern + +Perform an asynchronous glob search. + +## glob.sync(pattern, [options]) + +* `pattern` `{String}` Pattern to be matched +* `options` `{Object}` +* return: `{Array<String>}` filenames found matching the pattern + +Perform a synchronous glob search. + +## Class: glob.Glob + +Create a Glob object by instantiating the `glob.Glob` class. + +```javascript +var Glob = require("glob").Glob +var mg = new Glob(pattern, options, cb) +``` + +It's an EventEmitter, and starts walking the filesystem to find matches +immediately. + +### new glob.Glob(pattern, [options], [cb]) + +* `pattern` `{String}` pattern to search for +* `options` `{Object}` +* `cb` `{Function}` Called when an error occurs, or matches are found +  * `err` `{Error | null}` +  * `matches` `{Array<String>}` filenames found matching the pattern + +Note that if the `sync` flag is set in the options, then matches will +be immediately available on the `g.found` member. + +### Properties + +* `minimatch` The minimatch object that the glob uses. +* `options` The options object passed in. +* `aborted` Boolean which is set to true when calling `abort()`.  There +  is no way at this time to continue a glob search after aborting, but +  you can re-use the statCache to avoid having to duplicate syscalls. +* `cache` Convenience object.  Each field has the following possible +  values: +  * `false` - Path does not exist +  * `true` - Path exists +  * `'FILE'` - Path exists, and is not a directory +  * `'DIR'` - Path exists, and is a directory +  * `[file, entries, ...]` - Path exists, is a directory, and the +    array value is the results of `fs.readdir` +* `statCache` Cache of `fs.stat` results, to prevent statting the same +  path multiple times. +* `symlinks` A record of which paths are symbolic links, which is +  relevant in resolving `**` patterns. +* `realpathCache` An optional object which is passed to `fs.realpath` +  to minimize unnecessary syscalls.  It is stored on the instantiated +  Glob object, and may be re-used. + +### Events + +* `end` When the matching is finished, this is emitted with all the +  matches found.  If the `nonull` option is set, and no match was found, +  then the `matches` list contains the original pattern.  The matches +  are sorted, unless the `nosort` flag is set. +* `match` Every time a match is found, this is emitted with the specific +  thing that matched. It is not deduplicated or resolved to a realpath. +* `error` Emitted when an unexpected error is encountered, or whenever +  any fs error occurs if `options.strict` is set. +* `abort` When `abort()` is called, this event is raised. + +### Methods + +* `pause` Temporarily stop the search +* `resume` Resume the search +* `abort` Stop the search forever + +### Options + +All the options that can be passed to Minimatch can also be passed to +Glob to change pattern matching behavior.  Also, some have been added, +or have glob-specific ramifications. + +All options are false by default, unless otherwise noted. + +All options are added to the Glob object, as well. + +If you are running many `glob` operations, you can pass a Glob object +as the `options` argument to a subsequent operation to shortcut some +`stat` and `readdir` calls.  At the very least, you may pass in shared +`symlinks`, `statCache`, `realpathCache`, and `cache` options, so that +parallel glob operations will be sped up by sharing information about +the filesystem. + +* `cwd` The current working directory in which to search.  Defaults +  to `process.cwd()`. +* `root` The place where patterns starting with `/` will be mounted +  onto.  Defaults to `path.resolve(options.cwd, "/")` (`/` on Unix +  systems, and `C:\` or some such on Windows.) +* `dot` Include `.dot` files in normal matches and `globstar` matches. +  Note that an explicit dot in a portion of the pattern will always +  match dot files. +* `nomount` By default, a pattern starting with a forward-slash will be +  "mounted" onto the root setting, so that a valid filesystem path is +  returned.  Set this flag to disable that behavior. +* `mark` Add a `/` character to directory matches.  Note that this +  requires additional stat calls. +* `nosort` Don't sort the results. +* `stat` Set to true to stat *all* results.  This reduces performance +  somewhat, and is completely unnecessary, unless `readdir` is presumed +  to be an untrustworthy indicator of file existence. +* `silent` When an unusual error is encountered when attempting to +  read a directory, a warning will be printed to stderr.  Set the +  `silent` option to true to suppress these warnings. +* `strict` When an unusual error is encountered when attempting to +  read a directory, the process will just continue on in search of +  other matches.  Set the `strict` option to raise an error in these +  cases. +* `cache` See `cache` property above.  Pass in a previously generated +  cache object to save some fs calls. +* `statCache` A cache of results of filesystem information, to prevent +  unnecessary stat calls.  While it should not normally be necessary +  to set this, you may pass the statCache from one glob() call to the +  options object of another, if you know that the filesystem will not +  change between calls.  (See "Race Conditions" below.) +* `symlinks` A cache of known symbolic links.  You may pass in a +  previously generated `symlinks` object to save `lstat` calls when +  resolving `**` matches. +* `sync` DEPRECATED: use `glob.sync(pattern, opts)` instead. +* `nounique` In some cases, brace-expanded patterns can result in the +  same file showing up multiple times in the result set.  By default, +  this implementation prevents duplicates in the result set.  Set this +  flag to disable that behavior. +* `nonull` Set to never return an empty set, instead returning a set +  containing the pattern itself.  This is the default in glob(3). +* `debug` Set to enable debug logging in minimatch and glob. +* `nobrace` Do not expand `{a,b}` and `{1..3}` brace sets. +* `noglobstar` Do not match `**` against multiple filenames.  (Ie, +  treat it as a normal `*` instead.) +* `noext` Do not match `+(a|b)` "extglob" patterns. +* `nocase` Perform a case-insensitive match.  Note: on +  case-insensitive filesystems, non-magic patterns will match by +  default, since `stat` and `readdir` will not raise errors. +* `matchBase` Perform a basename-only match if the pattern does not +  contain any slash characters.  That is, `*.js` would be treated as +  equivalent to `**/*.js`, matching all js files in all directories. +* `nodir` Do not match directories, only files.  (Note: to match +  *only* directories, simply put a `/` at the end of the pattern.) +* `ignore` Add a pattern or an array of glob patterns to exclude matches. +  Note: `ignore` patterns are *always* in `dot:true` mode, regardless +  of any other settings. +* `follow` Follow symlinked directories when expanding `**` patterns. +  Note that this can result in a lot of duplicate references in the +  presence of cyclic links. +* `realpath` Set to true to call `fs.realpath` on all of the results. +  In the case of a symlink that cannot be resolved, the full absolute +  path to the matched entry is returned (though it will usually be a +  broken symlink) +* `absolute` Set to true to always receive absolute paths for matched +  files.  Unlike `realpath`, this also affects the values returned in +  the `match` event. +* `fs` File-system object with Node's `fs` API. By default, the built-in +  `fs` module will be used. Set to a volume provided by a library like +  `memfs` to avoid using the "real" file-system. + +## Comparisons to other fnmatch/glob implementations + +While strict compliance with the existing standards is a worthwhile +goal, some discrepancies exist between node-glob and other +implementations, and are intentional. + +The double-star character `**` is supported by default, unless the +`noglobstar` flag is set.  This is supported in the manner of bsdglob +and bash 4.3, where `**` only has special significance if it is the only +thing in a path part.  That is, `a/**/b` will match `a/x/y/b`, but +`a/**b` will not. + +Note that symlinked directories are not crawled as part of a `**`, +though their contents may match against subsequent portions of the +pattern.  This prevents infinite loops and duplicates and the like. + +If an escaped pattern has no matches, and the `nonull` flag is set, +then glob returns the pattern as-provided, rather than +interpreting the character escapes.  For example, +`glob.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than +`"*a?"`.  This is akin to setting the `nullglob` option in bash, except +that it does not resolve escaped pattern characters. + +If brace expansion is not disabled, then it is performed before any +other interpretation of the glob pattern.  Thus, a pattern like +`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded +**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are +checked for validity.  Since those two are valid, matching proceeds. + +### Comments and Negation + +Previously, this module let you mark a pattern as a "comment" if it +started with a `#` character, or a "negated" pattern if it started +with a `!` character. + +These options were deprecated in version 5, and removed in version 6. + +To specify things that should not match, use the `ignore` option. + +## Windows + +**Please only use forward-slashes in glob expressions.** + +Though windows uses either `/` or `\` as its path separator, only `/` +characters are used by this glob implementation.  You must use +forward-slashes **only** in glob expressions.  Back-slashes will always +be interpreted as escape characters, not path separators. + +Results from absolute patterns such as `/foo/*` are mounted onto the +root setting using `path.join`.  On windows, this will by default result +in `/foo/*` matching `C:\foo\bar.txt`. + +## Race Conditions + +Glob searching, by its very nature, is susceptible to race conditions, +since it relies on directory walking and such. + +As a result, it is possible that a file that exists when glob looks for +it may have been deleted or modified by the time it returns the result. + +As part of its internal implementation, this program caches all stat +and readdir calls that it makes, in order to cut down on system +overhead.  However, this also makes it even more susceptible to races, +especially if the cache or statCache objects are reused between glob +calls. + +Users are thus advised not to use a glob result as a guarantee of +filesystem state in the face of rapid changes.  For the vast majority +of operations, this is never a problem. + +## Glob Logo +Glob's logo was created by [Tanya Brassie](http://tanyabrassie.com/). Logo files can be found [here](https://github.com/isaacs/node-glob/tree/master/logo). + +The logo is licensed under a [Creative Commons Attribution-ShareAlike 4.0 International License](https://creativecommons.org/licenses/by-sa/4.0/). + +## Contributing + +Any change to behavior (including bugfixes) must come with a test. + +Patches that fail tests or reduce performance will be rejected. + +``` +# to run tests +npm test + +# to re-generate test fixtures +npm run test-regen + +# to benchmark against bash/zsh +npm run bench + +# to profile javascript +npm run prof +``` + + diff --git a/node_modules/glob/common.js b/node_modules/glob/common.js new file mode 100644 index 0000000..8e363b6 --- /dev/null +++ b/node_modules/glob/common.js @@ -0,0 +1,236 @@ +exports.setopts = setopts +exports.ownProp = ownProp +exports.makeAbs = makeAbs +exports.finish = finish +exports.mark = mark +exports.isIgnored = isIgnored +exports.childrenIgnored = childrenIgnored + +function ownProp (obj, field) { +  return Object.prototype.hasOwnProperty.call(obj, field) +} + +var fs = require("fs") +var path = require("path") +var minimatch = require("minimatch") +var isAbsolute = require("path-is-absolute") +var Minimatch = minimatch.Minimatch + +function alphasort (a, b) { +  return a.localeCompare(b, 'en') +} + +function setupIgnores (self, options) { +  self.ignore = options.ignore || [] + +  if (!Array.isArray(self.ignore)) +    self.ignore = [self.ignore] + +  if (self.ignore.length) { +    self.ignore = self.ignore.map(ignoreMap) +  } +} + +// ignore patterns are always in dot:true mode. +function ignoreMap (pattern) { +  var gmatcher = null +  if (pattern.slice(-3) === '/**') { +    var gpattern = pattern.replace(/(\/\*\*)+$/, '') +    gmatcher = new Minimatch(gpattern, { dot: true }) +  } + +  return { +    matcher: new Minimatch(pattern, { dot: true }), +    gmatcher: gmatcher +  } +} + +function setopts (self, pattern, options) { +  if (!options) +    options = {} + +  // base-matching: just use globstar for that. +  if (options.matchBase && -1 === pattern.indexOf("/")) { +    if (options.noglobstar) { +      throw new Error("base matching requires globstar") +    } +    pattern = "**/" + pattern +  } + +  self.silent = !!options.silent +  self.pattern = pattern +  self.strict = options.strict !== false +  self.realpath = !!options.realpath +  self.realpathCache = options.realpathCache || Object.create(null) +  self.follow = !!options.follow +  self.dot = !!options.dot +  self.mark = !!options.mark +  self.nodir = !!options.nodir +  if (self.nodir) +    self.mark = true +  self.sync = !!options.sync +  self.nounique = !!options.nounique +  self.nonull = !!options.nonull +  self.nosort = !!options.nosort +  self.nocase = !!options.nocase +  self.stat = !!options.stat +  self.noprocess = !!options.noprocess +  self.absolute = !!options.absolute +  self.fs = options.fs || fs + +  self.maxLength = options.maxLength || Infinity +  self.cache = options.cache || Object.create(null) +  self.statCache = options.statCache || Object.create(null) +  self.symlinks = options.symlinks || Object.create(null) + +  setupIgnores(self, options) + +  self.changedCwd = false +  var cwd = process.cwd() +  if (!ownProp(options, "cwd")) +    self.cwd = cwd +  else { +    self.cwd = path.resolve(options.cwd) +    self.changedCwd = self.cwd !== cwd +  } + +  self.root = options.root || path.resolve(self.cwd, "/") +  self.root = path.resolve(self.root) +  if (process.platform === "win32") +    self.root = self.root.replace(/\\/g, "/") + +  // TODO: is an absolute `cwd` supposed to be resolved against `root`? +  // e.g. { cwd: '/test', root: __dirname } === path.join(__dirname, '/test') +  self.cwdAbs = isAbsolute(self.cwd) ? self.cwd : makeAbs(self, self.cwd) +  if (process.platform === "win32") +    self.cwdAbs = self.cwdAbs.replace(/\\/g, "/") +  self.nomount = !!options.nomount + +  // disable comments and negation in Minimatch. +  // Note that they are not supported in Glob itself anyway. +  options.nonegate = true +  options.nocomment = true + +  self.minimatch = new Minimatch(pattern, options) +  self.options = self.minimatch.options +} + +function finish (self) { +  var nou = self.nounique +  var all = nou ? [] : Object.create(null) + +  for (var i = 0, l = self.matches.length; i < l; i ++) { +    var matches = self.matches[i] +    if (!matches || Object.keys(matches).length === 0) { +      if (self.nonull) { +        // do like the shell, and spit out the literal glob +        var literal = self.minimatch.globSet[i] +        if (nou) +          all.push(literal) +        else +          all[literal] = true +      } +    } else { +      // had matches +      var m = Object.keys(matches) +      if (nou) +        all.push.apply(all, m) +      else +        m.forEach(function (m) { +          all[m] = true +        }) +    } +  } + +  if (!nou) +    all = Object.keys(all) + +  if (!self.nosort) +    all = all.sort(alphasort) + +  // at *some* point we statted all of these +  if (self.mark) { +    for (var i = 0; i < all.length; i++) { +      all[i] = self._mark(all[i]) +    } +    if (self.nodir) { +      all = all.filter(function (e) { +        var notDir = !(/\/$/.test(e)) +        var c = self.cache[e] || self.cache[makeAbs(self, e)] +        if (notDir && c) +          notDir = c !== 'DIR' && !Array.isArray(c) +        return notDir +      }) +    } +  } + +  if (self.ignore.length) +    all = all.filter(function(m) { +      return !isIgnored(self, m) +    }) + +  self.found = all +} + +function mark (self, p) { +  var abs = makeAbs(self, p) +  var c = self.cache[abs] +  var m = p +  if (c) { +    var isDir = c === 'DIR' || Array.isArray(c) +    var slash = p.slice(-1) === '/' + +    if (isDir && !slash) +      m += '/' +    else if (!isDir && slash) +      m = m.slice(0, -1) + +    if (m !== p) { +      var mabs = makeAbs(self, m) +      self.statCache[mabs] = self.statCache[abs] +      self.cache[mabs] = self.cache[abs] +    } +  } + +  return m +} + +// lotta situps... +function makeAbs (self, f) { +  var abs = f +  if (f.charAt(0) === '/') { +    abs = path.join(self.root, f) +  } else if (isAbsolute(f) || f === '') { +    abs = f +  } else if (self.changedCwd) { +    abs = path.resolve(self.cwd, f) +  } else { +    abs = path.resolve(f) +  } + +  if (process.platform === 'win32') +    abs = abs.replace(/\\/g, '/') + +  return abs +} + + +// Return true, if pattern ends with globstar '**', for the accompanying parent directory. +// Ex:- If node_modules/** is the pattern, add 'node_modules' to ignore list along with it's contents +function isIgnored (self, path) { +  if (!self.ignore.length) +    return false + +  return self.ignore.some(function(item) { +    return item.matcher.match(path) || !!(item.gmatcher && item.gmatcher.match(path)) +  }) +} + +function childrenIgnored (self, path) { +  if (!self.ignore.length) +    return false + +  return self.ignore.some(function(item) { +    return !!(item.gmatcher && item.gmatcher.match(path)) +  }) +} diff --git a/node_modules/glob/glob.js b/node_modules/glob/glob.js new file mode 100644 index 0000000..afcf827 --- /dev/null +++ b/node_modules/glob/glob.js @@ -0,0 +1,787 @@ +// Approach: +// +// 1. Get the minimatch set +// 2. For each pattern in the set, PROCESS(pattern, false) +// 3. Store matches per-set, then uniq them +// +// PROCESS(pattern, inGlobStar) +// Get the first [n] items from pattern that are all strings +// Join these together.  This is PREFIX. +//   If there is no more remaining, then stat(PREFIX) and +//   add to matches if it succeeds.  END. +// +// If inGlobStar and PREFIX is symlink and points to dir +//   set ENTRIES = [] +// else readdir(PREFIX) as ENTRIES +//   If fail, END +// +// with ENTRIES +//   If pattern[n] is GLOBSTAR +//     // handle the case where the globstar match is empty +//     // by pruning it out, and testing the resulting pattern +//     PROCESS(pattern[0..n] + pattern[n+1 .. $], false) +//     // handle other cases. +//     for ENTRY in ENTRIES (not dotfiles) +//       // attach globstar + tail onto the entry +//       // Mark that this entry is a globstar match +//       PROCESS(pattern[0..n] + ENTRY + pattern[n .. $], true) +// +//   else // not globstar +//     for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot) +//       Test ENTRY against pattern[n] +//       If fails, continue +//       If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $]) +// +// Caveat: +//   Cache all stats and readdirs results to minimize syscall.  Since all +//   we ever care about is existence and directory-ness, we can just keep +//   `true` for files, and [children,...] for directories, or `false` for +//   things that don't exist. + +module.exports = glob + +var rp = require('fs.realpath') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var inherits = require('inherits') +var EE = require('events').EventEmitter +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var globSync = require('./sync.js') +var common = require('./common.js') +var setopts = common.setopts +var ownProp = common.ownProp +var inflight = require('inflight') +var util = require('util') +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +var once = require('once') + +function glob (pattern, options, cb) { +  if (typeof options === 'function') cb = options, options = {} +  if (!options) options = {} + +  if (options.sync) { +    if (cb) +      throw new TypeError('callback provided to sync glob') +    return globSync(pattern, options) +  } + +  return new Glob(pattern, options, cb) +} + +glob.sync = globSync +var GlobSync = glob.GlobSync = globSync.GlobSync + +// old api surface +glob.glob = glob + +function extend (origin, add) { +  if (add === null || typeof add !== 'object') { +    return origin +  } + +  var keys = Object.keys(add) +  var i = keys.length +  while (i--) { +    origin[keys[i]] = add[keys[i]] +  } +  return origin +} + +glob.hasMagic = function (pattern, options_) { +  var options = extend({}, options_) +  options.noprocess = true + +  var g = new Glob(pattern, options) +  var set = g.minimatch.set + +  if (!pattern) +    return false + +  if (set.length > 1) +    return true + +  for (var j = 0; j < set[0].length; j++) { +    if (typeof set[0][j] !== 'string') +      return true +  } + +  return false +} + +glob.Glob = Glob +inherits(Glob, EE) +function Glob (pattern, options, cb) { +  if (typeof options === 'function') { +    cb = options +    options = null +  } + +  if (options && options.sync) { +    if (cb) +      throw new TypeError('callback provided to sync glob') +    return new GlobSync(pattern, options) +  } + +  if (!(this instanceof Glob)) +    return new Glob(pattern, options, cb) + +  setopts(this, pattern, options) +  this._didRealPath = false + +  // process each pattern in the minimatch set +  var n = this.minimatch.set.length + +  // The matches are stored as {<filename>: true,...} so that +  // duplicates are automagically pruned. +  // Later, we do an Object.keys() on these. +  // Keep them as a list so we can fill in when nonull is set. +  this.matches = new Array(n) + +  if (typeof cb === 'function') { +    cb = once(cb) +    this.on('error', cb) +    this.on('end', function (matches) { +      cb(null, matches) +    }) +  } + +  var self = this +  this._processing = 0 + +  this._emitQueue = [] +  this._processQueue = [] +  this.paused = false + +  if (this.noprocess) +    return this + +  if (n === 0) +    return done() + +  var sync = true +  for (var i = 0; i < n; i ++) { +    this._process(this.minimatch.set[i], i, false, done) +  } +  sync = false + +  function done () { +    --self._processing +    if (self._processing <= 0) { +      if (sync) { +        process.nextTick(function () { +          self._finish() +        }) +      } else { +        self._finish() +      } +    } +  } +} + +Glob.prototype._finish = function () { +  assert(this instanceof Glob) +  if (this.aborted) +    return + +  if (this.realpath && !this._didRealpath) +    return this._realpath() + +  common.finish(this) +  this.emit('end', this.found) +} + +Glob.prototype._realpath = function () { +  if (this._didRealpath) +    return + +  this._didRealpath = true + +  var n = this.matches.length +  if (n === 0) +    return this._finish() + +  var self = this +  for (var i = 0; i < this.matches.length; i++) +    this._realpathSet(i, next) + +  function next () { +    if (--n === 0) +      self._finish() +  } +} + +Glob.prototype._realpathSet = function (index, cb) { +  var matchset = this.matches[index] +  if (!matchset) +    return cb() + +  var found = Object.keys(matchset) +  var self = this +  var n = found.length + +  if (n === 0) +    return cb() + +  var set = this.matches[index] = Object.create(null) +  found.forEach(function (p, i) { +    // If there's a problem with the stat, then it means that +    // one or more of the links in the realpath couldn't be +    // resolved.  just return the abs value in that case. +    p = self._makeAbs(p) +    rp.realpath(p, self.realpathCache, function (er, real) { +      if (!er) +        set[real] = true +      else if (er.syscall === 'stat') +        set[p] = true +      else +        self.emit('error', er) // srsly wtf right here + +      if (--n === 0) { +        self.matches[index] = set +        cb() +      } +    }) +  }) +} + +Glob.prototype._mark = function (p) { +  return common.mark(this, p) +} + +Glob.prototype._makeAbs = function (f) { +  return common.makeAbs(this, f) +} + +Glob.prototype.abort = function () { +  this.aborted = true +  this.emit('abort') +} + +Glob.prototype.pause = function () { +  if (!this.paused) { +    this.paused = true +    this.emit('pause') +  } +} + +Glob.prototype.resume = function () { +  if (this.paused) { +    this.emit('resume') +    this.paused = false +    if (this._emitQueue.length) { +      var eq = this._emitQueue.slice(0) +      this._emitQueue.length = 0 +      for (var i = 0; i < eq.length; i ++) { +        var e = eq[i] +        this._emitMatch(e[0], e[1]) +      } +    } +    if (this._processQueue.length) { +      var pq = this._processQueue.slice(0) +      this._processQueue.length = 0 +      for (var i = 0; i < pq.length; i ++) { +        var p = pq[i] +        this._processing-- +        this._process(p[0], p[1], p[2], p[3]) +      } +    } +  } +} + +Glob.prototype._process = function (pattern, index, inGlobStar, cb) { +  assert(this instanceof Glob) +  assert(typeof cb === 'function') + +  if (this.aborted) +    return + +  this._processing++ +  if (this.paused) { +    this._processQueue.push([pattern, index, inGlobStar, cb]) +    return +  } + +  //console.error('PROCESS %d', this._processing, pattern) + +  // Get the first [n] parts of pattern that are all strings. +  var n = 0 +  while (typeof pattern[n] === 'string') { +    n ++ +  } +  // now n is the index of the first one that is *not* a string. + +  // see if there's anything else +  var prefix +  switch (n) { +    // if not, then this is rather simple +    case pattern.length: +      this._processSimple(pattern.join('/'), index, cb) +      return + +    case 0: +      // pattern *starts* with some non-trivial item. +      // going to readdir(cwd), but not include the prefix in matches. +      prefix = null +      break + +    default: +      // pattern has some string bits in the front. +      // whatever it starts with, whether that's 'absolute' like /foo/bar, +      // or 'relative' like '../baz' +      prefix = pattern.slice(0, n).join('/') +      break +  } + +  var remain = pattern.slice(n) + +  // get the list of entries. +  var read +  if (prefix === null) +    read = '.' +  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { +    if (!prefix || !isAbsolute(prefix)) +      prefix = '/' + prefix +    read = prefix +  } else +    read = prefix + +  var abs = this._makeAbs(read) + +  //if ignored, skip _processing +  if (childrenIgnored(this, read)) +    return cb() + +  var isGlobStar = remain[0] === minimatch.GLOBSTAR +  if (isGlobStar) +    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar, cb) +  else +    this._processReaddir(prefix, read, abs, remain, index, inGlobStar, cb) +} + +Glob.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar, cb) { +  var self = this +  this._readdir(abs, inGlobStar, function (er, entries) { +    return self._processReaddir2(prefix, read, abs, remain, index, inGlobStar, entries, cb) +  }) +} + +Glob.prototype._processReaddir2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { + +  // if the abs isn't a dir, then nothing can match! +  if (!entries) +    return cb() + +  // It will only match dot entries if it starts with a dot, or if +  // dot is set.  Stuff like @(.foo|.bar) isn't allowed. +  var pn = remain[0] +  var negate = !!this.minimatch.negate +  var rawGlob = pn._glob +  var dotOk = this.dot || rawGlob.charAt(0) === '.' + +  var matchedEntries = [] +  for (var i = 0; i < entries.length; i++) { +    var e = entries[i] +    if (e.charAt(0) !== '.' || dotOk) { +      var m +      if (negate && !prefix) { +        m = !e.match(pn) +      } else { +        m = e.match(pn) +      } +      if (m) +        matchedEntries.push(e) +    } +  } + +  //console.error('prd2', prefix, entries, remain[0]._glob, matchedEntries) + +  var len = matchedEntries.length +  // If there are no matched entries, then nothing matches. +  if (len === 0) +    return cb() + +  // if this is the last remaining pattern bit, then no need for +  // an additional stat *unless* the user has specified mark or +  // stat explicitly.  We know they exist, since readdir returned +  // them. + +  if (remain.length === 1 && !this.mark && !this.stat) { +    if (!this.matches[index]) +      this.matches[index] = Object.create(null) + +    for (var i = 0; i < len; i ++) { +      var e = matchedEntries[i] +      if (prefix) { +        if (prefix !== '/') +          e = prefix + '/' + e +        else +          e = prefix + e +      } + +      if (e.charAt(0) === '/' && !this.nomount) { +        e = path.join(this.root, e) +      } +      this._emitMatch(index, e) +    } +    // This was the last one, and no stats were needed +    return cb() +  } + +  // now test all matched entries as stand-ins for that part +  // of the pattern. +  remain.shift() +  for (var i = 0; i < len; i ++) { +    var e = matchedEntries[i] +    var newPattern +    if (prefix) { +      if (prefix !== '/') +        e = prefix + '/' + e +      else +        e = prefix + e +    } +    this._process([e].concat(remain), index, inGlobStar, cb) +  } +  cb() +} + +Glob.prototype._emitMatch = function (index, e) { +  if (this.aborted) +    return + +  if (isIgnored(this, e)) +    return + +  if (this.paused) { +    this._emitQueue.push([index, e]) +    return +  } + +  var abs = isAbsolute(e) ? e : this._makeAbs(e) + +  if (this.mark) +    e = this._mark(e) + +  if (this.absolute) +    e = abs + +  if (this.matches[index][e]) +    return + +  if (this.nodir) { +    var c = this.cache[abs] +    if (c === 'DIR' || Array.isArray(c)) +      return +  } + +  this.matches[index][e] = true + +  var st = this.statCache[abs] +  if (st) +    this.emit('stat', e, st) + +  this.emit('match', e) +} + +Glob.prototype._readdirInGlobStar = function (abs, cb) { +  if (this.aborted) +    return + +  // follow all symlinked directories forever +  // just proceed as if this is a non-globstar situation +  if (this.follow) +    return this._readdir(abs, false, cb) + +  var lstatkey = 'lstat\0' + abs +  var self = this +  var lstatcb = inflight(lstatkey, lstatcb_) + +  if (lstatcb) +    self.fs.lstat(abs, lstatcb) + +  function lstatcb_ (er, lstat) { +    if (er && er.code === 'ENOENT') +      return cb() + +    var isSym = lstat && lstat.isSymbolicLink() +    self.symlinks[abs] = isSym + +    // If it's not a symlink or a dir, then it's definitely a regular file. +    // don't bother doing a readdir in that case. +    if (!isSym && lstat && !lstat.isDirectory()) { +      self.cache[abs] = 'FILE' +      cb() +    } else +      self._readdir(abs, false, cb) +  } +} + +Glob.prototype._readdir = function (abs, inGlobStar, cb) { +  if (this.aborted) +    return + +  cb = inflight('readdir\0'+abs+'\0'+inGlobStar, cb) +  if (!cb) +    return + +  //console.error('RD %j %j', +inGlobStar, abs) +  if (inGlobStar && !ownProp(this.symlinks, abs)) +    return this._readdirInGlobStar(abs, cb) + +  if (ownProp(this.cache, abs)) { +    var c = this.cache[abs] +    if (!c || c === 'FILE') +      return cb() + +    if (Array.isArray(c)) +      return cb(null, c) +  } + +  var self = this +  self.fs.readdir(abs, readdirCb(this, abs, cb)) +} + +function readdirCb (self, abs, cb) { +  return function (er, entries) { +    if (er) +      self._readdirError(abs, er, cb) +    else +      self._readdirEntries(abs, entries, cb) +  } +} + +Glob.prototype._readdirEntries = function (abs, entries, cb) { +  if (this.aborted) +    return + +  // if we haven't asked to stat everything, then just +  // assume that everything in there exists, so we can avoid +  // having to stat it a second time. +  if (!this.mark && !this.stat) { +    for (var i = 0; i < entries.length; i ++) { +      var e = entries[i] +      if (abs === '/') +        e = abs + e +      else +        e = abs + '/' + e +      this.cache[e] = true +    } +  } + +  this.cache[abs] = entries +  return cb(null, entries) +} + +Glob.prototype._readdirError = function (f, er, cb) { +  if (this.aborted) +    return + +  // handle errors, and cache the information +  switch (er.code) { +    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 +    case 'ENOTDIR': // totally normal. means it *does* exist. +      var abs = this._makeAbs(f) +      this.cache[abs] = 'FILE' +      if (abs === this.cwdAbs) { +        var error = new Error(er.code + ' invalid cwd ' + this.cwd) +        error.path = this.cwd +        error.code = er.code +        this.emit('error', error) +        this.abort() +      } +      break + +    case 'ENOENT': // not terribly unusual +    case 'ELOOP': +    case 'ENAMETOOLONG': +    case 'UNKNOWN': +      this.cache[this._makeAbs(f)] = false +      break + +    default: // some unusual error.  Treat as failure. +      this.cache[this._makeAbs(f)] = false +      if (this.strict) { +        this.emit('error', er) +        // If the error is handled, then we abort +        // if not, we threw out of here +        this.abort() +      } +      if (!this.silent) +        console.error('glob error', er) +      break +  } + +  return cb() +} + +Glob.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar, cb) { +  var self = this +  this._readdir(abs, inGlobStar, function (er, entries) { +    self._processGlobStar2(prefix, read, abs, remain, index, inGlobStar, entries, cb) +  }) +} + + +Glob.prototype._processGlobStar2 = function (prefix, read, abs, remain, index, inGlobStar, entries, cb) { +  //console.error('pgs2', prefix, remain[0], entries) + +  // no entries means not a dir, so it can never have matches +  // foo.txt/** doesn't match foo.txt +  if (!entries) +    return cb() + +  // test without the globstar, and with every child both below +  // and replacing the globstar. +  var remainWithoutGlobStar = remain.slice(1) +  var gspref = prefix ? [ prefix ] : [] +  var noGlobStar = gspref.concat(remainWithoutGlobStar) + +  // the noGlobStar pattern exits the inGlobStar state +  this._process(noGlobStar, index, false, cb) + +  var isSym = this.symlinks[abs] +  var len = entries.length + +  // If it's a symlink, and we're in a globstar, then stop +  if (isSym && inGlobStar) +    return cb() + +  for (var i = 0; i < len; i++) { +    var e = entries[i] +    if (e.charAt(0) === '.' && !this.dot) +      continue + +    // these two cases enter the inGlobStar state +    var instead = gspref.concat(entries[i], remainWithoutGlobStar) +    this._process(instead, index, true, cb) + +    var below = gspref.concat(entries[i], remain) +    this._process(below, index, true, cb) +  } + +  cb() +} + +Glob.prototype._processSimple = function (prefix, index, cb) { +  // XXX review this.  Shouldn't it be doing the mounting etc +  // before doing stat?  kinda weird? +  var self = this +  this._stat(prefix, function (er, exists) { +    self._processSimple2(prefix, index, er, exists, cb) +  }) +} +Glob.prototype._processSimple2 = function (prefix, index, er, exists, cb) { + +  //console.error('ps2', prefix, exists) + +  if (!this.matches[index]) +    this.matches[index] = Object.create(null) + +  // If it doesn't exist, then just mark the lack of results +  if (!exists) +    return cb() + +  if (prefix && isAbsolute(prefix) && !this.nomount) { +    var trail = /[\/\\]$/.test(prefix) +    if (prefix.charAt(0) === '/') { +      prefix = path.join(this.root, prefix) +    } else { +      prefix = path.resolve(this.root, prefix) +      if (trail) +        prefix += '/' +    } +  } + +  if (process.platform === 'win32') +    prefix = prefix.replace(/\\/g, '/') + +  // Mark this as a match +  this._emitMatch(index, prefix) +  cb() +} + +// Returns either 'DIR', 'FILE', or false +Glob.prototype._stat = function (f, cb) { +  var abs = this._makeAbs(f) +  var needDir = f.slice(-1) === '/' + +  if (f.length > this.maxLength) +    return cb() + +  if (!this.stat && ownProp(this.cache, abs)) { +    var c = this.cache[abs] + +    if (Array.isArray(c)) +      c = 'DIR' + +    // It exists, but maybe not how we need it +    if (!needDir || c === 'DIR') +      return cb(null, c) + +    if (needDir && c === 'FILE') +      return cb() + +    // otherwise we have to stat, because maybe c=true +    // if we know it exists, but not what it is. +  } + +  var exists +  var stat = this.statCache[abs] +  if (stat !== undefined) { +    if (stat === false) +      return cb(null, stat) +    else { +      var type = stat.isDirectory() ? 'DIR' : 'FILE' +      if (needDir && type === 'FILE') +        return cb() +      else +        return cb(null, type, stat) +    } +  } + +  var self = this +  var statcb = inflight('stat\0' + abs, lstatcb_) +  if (statcb) +    self.fs.lstat(abs, statcb) + +  function lstatcb_ (er, lstat) { +    if (lstat && lstat.isSymbolicLink()) { +      // If it's a symlink, then treat it as the target, unless +      // the target does not exist, then treat it as a file. +      return self.fs.stat(abs, function (er, stat) { +        if (er) +          self._stat2(f, abs, null, lstat, cb) +        else +          self._stat2(f, abs, er, stat, cb) +      }) +    } else { +      self._stat2(f, abs, er, lstat, cb) +    } +  } +} + +Glob.prototype._stat2 = function (f, abs, er, stat, cb) { +  if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { +    this.statCache[abs] = false +    return cb() +  } + +  var needDir = f.slice(-1) === '/' +  this.statCache[abs] = stat + +  if (abs.slice(-1) === '/' && stat && !stat.isDirectory()) +    return cb(null, false, stat) + +  var c = true +  if (stat) +    c = stat.isDirectory() ? 'DIR' : 'FILE' +  this.cache[abs] = this.cache[abs] || c + +  if (needDir && c === 'FILE') +    return cb() + +  return cb(null, c, stat) +} diff --git a/node_modules/glob/package.json b/node_modules/glob/package.json new file mode 100644 index 0000000..cc1a57a --- /dev/null +++ b/node_modules/glob/package.json @@ -0,0 +1,52 @@ +{ +  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)", +  "name": "glob", +  "description": "a little globber", +  "version": "7.2.0", +  "repository": { +    "type": "git", +    "url": "git://github.com/isaacs/node-glob.git" +  }, +  "main": "glob.js", +  "files": [ +    "glob.js", +    "sync.js", +    "common.js" +  ], +  "engines": { +    "node": "*" +  }, +  "dependencies": { +    "fs.realpath": "^1.0.0", +    "inflight": "^1.0.4", +    "inherits": "2", +    "minimatch": "^3.0.4", +    "once": "^1.3.0", +    "path-is-absolute": "^1.0.0" +  }, +  "devDependencies": { +    "memfs": "^3.2.0", +    "mkdirp": "0", +    "rimraf": "^2.2.8", +    "tap": "^15.0.6", +    "tick": "0.0.6" +  }, +  "tap": { +    "before": "test/00-setup.js", +    "after": "test/zz-cleanup.js", +    "jobs": 1 +  }, +  "scripts": { +    "prepublish": "npm run benchclean", +    "profclean": "rm -f v8.log profile.txt", +    "test": "tap", +    "test-regen": "npm run profclean && TEST_REGEN=1 node test/00-setup.js", +    "bench": "bash benchmark.sh", +    "prof": "bash prof.sh && cat profile.txt", +    "benchclean": "node benchclean.js" +  }, +  "license": "ISC", +  "funding": { +    "url": "https://github.com/sponsors/isaacs" +  } +} diff --git a/node_modules/glob/sync.js b/node_modules/glob/sync.js new file mode 100644 index 0000000..4f46f90 --- /dev/null +++ b/node_modules/glob/sync.js @@ -0,0 +1,483 @@ +module.exports = globSync +globSync.GlobSync = GlobSync + +var rp = require('fs.realpath') +var minimatch = require('minimatch') +var Minimatch = minimatch.Minimatch +var Glob = require('./glob.js').Glob +var util = require('util') +var path = require('path') +var assert = require('assert') +var isAbsolute = require('path-is-absolute') +var common = require('./common.js') +var setopts = common.setopts +var ownProp = common.ownProp +var childrenIgnored = common.childrenIgnored +var isIgnored = common.isIgnored + +function globSync (pattern, options) { +  if (typeof options === 'function' || arguments.length === 3) +    throw new TypeError('callback provided to sync glob\n'+ +                        'See: https://github.com/isaacs/node-glob/issues/167') + +  return new GlobSync(pattern, options).found +} + +function GlobSync (pattern, options) { +  if (!pattern) +    throw new Error('must provide pattern') + +  if (typeof options === 'function' || arguments.length === 3) +    throw new TypeError('callback provided to sync glob\n'+ +                        'See: https://github.com/isaacs/node-glob/issues/167') + +  if (!(this instanceof GlobSync)) +    return new GlobSync(pattern, options) + +  setopts(this, pattern, options) + +  if (this.noprocess) +    return this + +  var n = this.minimatch.set.length +  this.matches = new Array(n) +  for (var i = 0; i < n; i ++) { +    this._process(this.minimatch.set[i], i, false) +  } +  this._finish() +} + +GlobSync.prototype._finish = function () { +  assert(this instanceof GlobSync) +  if (this.realpath) { +    var self = this +    this.matches.forEach(function (matchset, index) { +      var set = self.matches[index] = Object.create(null) +      for (var p in matchset) { +        try { +          p = self._makeAbs(p) +          var real = rp.realpathSync(p, self.realpathCache) +          set[real] = true +        } catch (er) { +          if (er.syscall === 'stat') +            set[self._makeAbs(p)] = true +          else +            throw er +        } +      } +    }) +  } +  common.finish(this) +} + + +GlobSync.prototype._process = function (pattern, index, inGlobStar) { +  assert(this instanceof GlobSync) + +  // Get the first [n] parts of pattern that are all strings. +  var n = 0 +  while (typeof pattern[n] === 'string') { +    n ++ +  } +  // now n is the index of the first one that is *not* a string. + +  // See if there's anything else +  var prefix +  switch (n) { +    // if not, then this is rather simple +    case pattern.length: +      this._processSimple(pattern.join('/'), index) +      return + +    case 0: +      // pattern *starts* with some non-trivial item. +      // going to readdir(cwd), but not include the prefix in matches. +      prefix = null +      break + +    default: +      // pattern has some string bits in the front. +      // whatever it starts with, whether that's 'absolute' like /foo/bar, +      // or 'relative' like '../baz' +      prefix = pattern.slice(0, n).join('/') +      break +  } + +  var remain = pattern.slice(n) + +  // get the list of entries. +  var read +  if (prefix === null) +    read = '.' +  else if (isAbsolute(prefix) || isAbsolute(pattern.join('/'))) { +    if (!prefix || !isAbsolute(prefix)) +      prefix = '/' + prefix +    read = prefix +  } else +    read = prefix + +  var abs = this._makeAbs(read) + +  //if ignored, skip processing +  if (childrenIgnored(this, read)) +    return + +  var isGlobStar = remain[0] === minimatch.GLOBSTAR +  if (isGlobStar) +    this._processGlobStar(prefix, read, abs, remain, index, inGlobStar) +  else +    this._processReaddir(prefix, read, abs, remain, index, inGlobStar) +} + + +GlobSync.prototype._processReaddir = function (prefix, read, abs, remain, index, inGlobStar) { +  var entries = this._readdir(abs, inGlobStar) + +  // if the abs isn't a dir, then nothing can match! +  if (!entries) +    return + +  // It will only match dot entries if it starts with a dot, or if +  // dot is set.  Stuff like @(.foo|.bar) isn't allowed. +  var pn = remain[0] +  var negate = !!this.minimatch.negate +  var rawGlob = pn._glob +  var dotOk = this.dot || rawGlob.charAt(0) === '.' + +  var matchedEntries = [] +  for (var i = 0; i < entries.length; i++) { +    var e = entries[i] +    if (e.charAt(0) !== '.' || dotOk) { +      var m +      if (negate && !prefix) { +        m = !e.match(pn) +      } else { +        m = e.match(pn) +      } +      if (m) +        matchedEntries.push(e) +    } +  } + +  var len = matchedEntries.length +  // If there are no matched entries, then nothing matches. +  if (len === 0) +    return + +  // if this is the last remaining pattern bit, then no need for +  // an additional stat *unless* the user has specified mark or +  // stat explicitly.  We know they exist, since readdir returned +  // them. + +  if (remain.length === 1 && !this.mark && !this.stat) { +    if (!this.matches[index]) +      this.matches[index] = Object.create(null) + +    for (var i = 0; i < len; i ++) { +      var e = matchedEntries[i] +      if (prefix) { +        if (prefix.slice(-1) !== '/') +          e = prefix + '/' + e +        else +          e = prefix + e +      } + +      if (e.charAt(0) === '/' && !this.nomount) { +        e = path.join(this.root, e) +      } +      this._emitMatch(index, e) +    } +    // This was the last one, and no stats were needed +    return +  } + +  // now test all matched entries as stand-ins for that part +  // of the pattern. +  remain.shift() +  for (var i = 0; i < len; i ++) { +    var e = matchedEntries[i] +    var newPattern +    if (prefix) +      newPattern = [prefix, e] +    else +      newPattern = [e] +    this._process(newPattern.concat(remain), index, inGlobStar) +  } +} + + +GlobSync.prototype._emitMatch = function (index, e) { +  if (isIgnored(this, e)) +    return + +  var abs = this._makeAbs(e) + +  if (this.mark) +    e = this._mark(e) + +  if (this.absolute) { +    e = abs +  } + +  if (this.matches[index][e]) +    return + +  if (this.nodir) { +    var c = this.cache[abs] +    if (c === 'DIR' || Array.isArray(c)) +      return +  } + +  this.matches[index][e] = true + +  if (this.stat) +    this._stat(e) +} + + +GlobSync.prototype._readdirInGlobStar = function (abs) { +  // follow all symlinked directories forever +  // just proceed as if this is a non-globstar situation +  if (this.follow) +    return this._readdir(abs, false) + +  var entries +  var lstat +  var stat +  try { +    lstat = this.fs.lstatSync(abs) +  } catch (er) { +    if (er.code === 'ENOENT') { +      // lstat failed, doesn't exist +      return null +    } +  } + +  var isSym = lstat && lstat.isSymbolicLink() +  this.symlinks[abs] = isSym + +  // If it's not a symlink or a dir, then it's definitely a regular file. +  // don't bother doing a readdir in that case. +  if (!isSym && lstat && !lstat.isDirectory()) +    this.cache[abs] = 'FILE' +  else +    entries = this._readdir(abs, false) + +  return entries +} + +GlobSync.prototype._readdir = function (abs, inGlobStar) { +  var entries + +  if (inGlobStar && !ownProp(this.symlinks, abs)) +    return this._readdirInGlobStar(abs) + +  if (ownProp(this.cache, abs)) { +    var c = this.cache[abs] +    if (!c || c === 'FILE') +      return null + +    if (Array.isArray(c)) +      return c +  } + +  try { +    return this._readdirEntries(abs, this.fs.readdirSync(abs)) +  } catch (er) { +    this._readdirError(abs, er) +    return null +  } +} + +GlobSync.prototype._readdirEntries = function (abs, entries) { +  // if we haven't asked to stat everything, then just +  // assume that everything in there exists, so we can avoid +  // having to stat it a second time. +  if (!this.mark && !this.stat) { +    for (var i = 0; i < entries.length; i ++) { +      var e = entries[i] +      if (abs === '/') +        e = abs + e +      else +        e = abs + '/' + e +      this.cache[e] = true +    } +  } + +  this.cache[abs] = entries + +  // mark and cache dir-ness +  return entries +} + +GlobSync.prototype._readdirError = function (f, er) { +  // handle errors, and cache the information +  switch (er.code) { +    case 'ENOTSUP': // https://github.com/isaacs/node-glob/issues/205 +    case 'ENOTDIR': // totally normal. means it *does* exist. +      var abs = this._makeAbs(f) +      this.cache[abs] = 'FILE' +      if (abs === this.cwdAbs) { +        var error = new Error(er.code + ' invalid cwd ' + this.cwd) +        error.path = this.cwd +        error.code = er.code +        throw error +      } +      break + +    case 'ENOENT': // not terribly unusual +    case 'ELOOP': +    case 'ENAMETOOLONG': +    case 'UNKNOWN': +      this.cache[this._makeAbs(f)] = false +      break + +    default: // some unusual error.  Treat as failure. +      this.cache[this._makeAbs(f)] = false +      if (this.strict) +        throw er +      if (!this.silent) +        console.error('glob error', er) +      break +  } +} + +GlobSync.prototype._processGlobStar = function (prefix, read, abs, remain, index, inGlobStar) { + +  var entries = this._readdir(abs, inGlobStar) + +  // no entries means not a dir, so it can never have matches +  // foo.txt/** doesn't match foo.txt +  if (!entries) +    return + +  // test without the globstar, and with every child both below +  // and replacing the globstar. +  var remainWithoutGlobStar = remain.slice(1) +  var gspref = prefix ? [ prefix ] : [] +  var noGlobStar = gspref.concat(remainWithoutGlobStar) + +  // the noGlobStar pattern exits the inGlobStar state +  this._process(noGlobStar, index, false) + +  var len = entries.length +  var isSym = this.symlinks[abs] + +  // If it's a symlink, and we're in a globstar, then stop +  if (isSym && inGlobStar) +    return + +  for (var i = 0; i < len; i++) { +    var e = entries[i] +    if (e.charAt(0) === '.' && !this.dot) +      continue + +    // these two cases enter the inGlobStar state +    var instead = gspref.concat(entries[i], remainWithoutGlobStar) +    this._process(instead, index, true) + +    var below = gspref.concat(entries[i], remain) +    this._process(below, index, true) +  } +} + +GlobSync.prototype._processSimple = function (prefix, index) { +  // XXX review this.  Shouldn't it be doing the mounting etc +  // before doing stat?  kinda weird? +  var exists = this._stat(prefix) + +  if (!this.matches[index]) +    this.matches[index] = Object.create(null) + +  // If it doesn't exist, then just mark the lack of results +  if (!exists) +    return + +  if (prefix && isAbsolute(prefix) && !this.nomount) { +    var trail = /[\/\\]$/.test(prefix) +    if (prefix.charAt(0) === '/') { +      prefix = path.join(this.root, prefix) +    } else { +      prefix = path.resolve(this.root, prefix) +      if (trail) +        prefix += '/' +    } +  } + +  if (process.platform === 'win32') +    prefix = prefix.replace(/\\/g, '/') + +  // Mark this as a match +  this._emitMatch(index, prefix) +} + +// Returns either 'DIR', 'FILE', or false +GlobSync.prototype._stat = function (f) { +  var abs = this._makeAbs(f) +  var needDir = f.slice(-1) === '/' + +  if (f.length > this.maxLength) +    return false + +  if (!this.stat && ownProp(this.cache, abs)) { +    var c = this.cache[abs] + +    if (Array.isArray(c)) +      c = 'DIR' + +    // It exists, but maybe not how we need it +    if (!needDir || c === 'DIR') +      return c + +    if (needDir && c === 'FILE') +      return false + +    // otherwise we have to stat, because maybe c=true +    // if we know it exists, but not what it is. +  } + +  var exists +  var stat = this.statCache[abs] +  if (!stat) { +    var lstat +    try { +      lstat = this.fs.lstatSync(abs) +    } catch (er) { +      if (er && (er.code === 'ENOENT' || er.code === 'ENOTDIR')) { +        this.statCache[abs] = false +        return false +      } +    } + +    if (lstat && lstat.isSymbolicLink()) { +      try { +        stat = this.fs.statSync(abs) +      } catch (er) { +        stat = lstat +      } +    } else { +      stat = lstat +    } +  } + +  this.statCache[abs] = stat + +  var c = true +  if (stat) +    c = stat.isDirectory() ? 'DIR' : 'FILE' + +  this.cache[abs] = this.cache[abs] || c + +  if (needDir && c === 'FILE') +    return false + +  return c +} + +GlobSync.prototype._mark = function (p) { +  return common.mark(this, p) +} + +GlobSync.prototype._makeAbs = function (f) { +  return common.makeAbs(this, f) +}  | 
