mirror of https://gitee.com/bigwinds/arangodb
Added minimatch for globbing.
This commit is contained in:
parent
3dda5e5b90
commit
3c089a6d50
|
@ -0,0 +1,23 @@
|
||||||
|
Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person
|
||||||
|
obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without
|
||||||
|
restriction, including without limitation the rights to use,
|
||||||
|
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the
|
||||||
|
Software is furnished to do so, subject to the following
|
||||||
|
conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be
|
||||||
|
included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||||
|
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||||
|
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||||
|
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
@ -0,0 +1,216 @@
|
||||||
|
# minimatch
|
||||||
|
|
||||||
|
A minimal matching utility.
|
||||||
|
|
||||||
|
[](http://travis-ci.org/isaacs/minimatch)
|
||||||
|
|
||||||
|
|
||||||
|
This is the matching library used internally by npm.
|
||||||
|
|
||||||
|
It works by converting glob expressions into JavaScript `RegExp`
|
||||||
|
objects.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var minimatch = require("minimatch")
|
||||||
|
|
||||||
|
minimatch("bar.foo", "*.foo") // true!
|
||||||
|
minimatch("bar.foo", "*.bar") // false!
|
||||||
|
minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
|
||||||
|
```
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
Supports these glob features:
|
||||||
|
|
||||||
|
* Brace Expansion
|
||||||
|
* Extended glob matching
|
||||||
|
* "Globstar" `**` matching
|
||||||
|
|
||||||
|
See:
|
||||||
|
|
||||||
|
* `man sh`
|
||||||
|
* `man bash`
|
||||||
|
* `man 3 fnmatch`
|
||||||
|
* `man 5 gitignore`
|
||||||
|
|
||||||
|
## Minimatch Class
|
||||||
|
|
||||||
|
Create a minimatch object by instanting the `minimatch.Minimatch` class.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var Minimatch = require("minimatch").Minimatch
|
||||||
|
var mm = new Minimatch(pattern, options)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Properties
|
||||||
|
|
||||||
|
* `pattern` The original pattern the minimatch object represents.
|
||||||
|
* `options` The options supplied to the constructor.
|
||||||
|
* `set` A 2-dimensional array of regexp or string expressions.
|
||||||
|
Each row in the
|
||||||
|
array corresponds to a brace-expanded pattern. Each item in the row
|
||||||
|
corresponds to a single path-part. For example, the pattern
|
||||||
|
`{a,b/c}/d` would expand to a set of patterns like:
|
||||||
|
|
||||||
|
[ [ a, d ]
|
||||||
|
, [ b, c, d ] ]
|
||||||
|
|
||||||
|
If a portion of the pattern doesn't have any "magic" in it
|
||||||
|
(that is, it's something like `"foo"` rather than `fo*o?`), then it
|
||||||
|
will be left as a string rather than converted to a regular
|
||||||
|
expression.
|
||||||
|
|
||||||
|
* `regexp` Created by the `makeRe` method. A single regular expression
|
||||||
|
expressing the entire pattern. This is useful in cases where you wish
|
||||||
|
to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
|
||||||
|
* `negate` True if the pattern is negated.
|
||||||
|
* `comment` True if the pattern is a comment.
|
||||||
|
* `empty` True if the pattern is `""`.
|
||||||
|
|
||||||
|
### Methods
|
||||||
|
|
||||||
|
* `makeRe` Generate the `regexp` member if necessary, and return it.
|
||||||
|
Will return `false` if the pattern is invalid.
|
||||||
|
* `match(fname)` Return true if the filename matches the pattern, or
|
||||||
|
false otherwise.
|
||||||
|
* `matchOne(fileArray, patternArray, partial)` Take a `/`-split
|
||||||
|
filename, and match it against a single row in the `regExpSet`. This
|
||||||
|
method is mainly for internal use, but is exposed so that it can be
|
||||||
|
used by a glob-walker that needs to avoid excessive filesystem calls.
|
||||||
|
|
||||||
|
All other methods are internal, and will be called as necessary.
|
||||||
|
|
||||||
|
## Functions
|
||||||
|
|
||||||
|
The top-level exported function has a `cache` property, which is an LRU
|
||||||
|
cache set to store 100 items. So, calling these methods repeatedly
|
||||||
|
with the same pattern and options will use the same Minimatch object,
|
||||||
|
saving the cost of parsing it multiple times.
|
||||||
|
|
||||||
|
### minimatch(path, pattern, options)
|
||||||
|
|
||||||
|
Main export. Tests a path against the pattern using the options.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var isJS = minimatch(file, "*.js", { matchBase: true })
|
||||||
|
```
|
||||||
|
|
||||||
|
### minimatch.filter(pattern, options)
|
||||||
|
|
||||||
|
Returns a function that tests its
|
||||||
|
supplied argument, suitable for use with `Array.filter`. Example:
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
|
||||||
|
```
|
||||||
|
|
||||||
|
### minimatch.match(list, pattern, options)
|
||||||
|
|
||||||
|
Match against the list of
|
||||||
|
files, in the style of fnmatch or glob. If nothing is matched, and
|
||||||
|
options.nonull is set, then return a list containing the pattern itself.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
|
||||||
|
```
|
||||||
|
|
||||||
|
### minimatch.makeRe(pattern, options)
|
||||||
|
|
||||||
|
Make a regular expression object from the pattern.
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
All options are `false` by default.
|
||||||
|
|
||||||
|
### debug
|
||||||
|
|
||||||
|
Dump a ton of stuff to stderr.
|
||||||
|
|
||||||
|
### nobrace
|
||||||
|
|
||||||
|
Do not expand `{a,b}` and `{1..3}` brace sets.
|
||||||
|
|
||||||
|
### noglobstar
|
||||||
|
|
||||||
|
Disable `**` matching against multiple folder names.
|
||||||
|
|
||||||
|
### dot
|
||||||
|
|
||||||
|
Allow patterns to match filenames starting with a period, even if
|
||||||
|
the pattern does not explicitly have a period in that spot.
|
||||||
|
|
||||||
|
Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
|
||||||
|
is set.
|
||||||
|
|
||||||
|
### noext
|
||||||
|
|
||||||
|
Disable "extglob" style patterns like `+(a|b)`.
|
||||||
|
|
||||||
|
### nocase
|
||||||
|
|
||||||
|
Perform a case-insensitive match.
|
||||||
|
|
||||||
|
### nonull
|
||||||
|
|
||||||
|
When a match is not found by `minimatch.match`, return a list containing
|
||||||
|
the pattern itself if this option is set. When not set, an empty list
|
||||||
|
is returned if there are no matches.
|
||||||
|
|
||||||
|
### matchBase
|
||||||
|
|
||||||
|
If set, then patterns without slashes will be matched
|
||||||
|
against the basename of the path if it contains slashes. For example,
|
||||||
|
`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
|
||||||
|
|
||||||
|
### nocomment
|
||||||
|
|
||||||
|
Suppress the behavior of treating `#` at the start of a pattern as a
|
||||||
|
comment.
|
||||||
|
|
||||||
|
### nonegate
|
||||||
|
|
||||||
|
Suppress the behavior of treating a leading `!` character as negation.
|
||||||
|
|
||||||
|
### flipNegate
|
||||||
|
|
||||||
|
Returns from negate expressions the same as if they were not negated.
|
||||||
|
(Ie, true on a hit, false on a miss.)
|
||||||
|
|
||||||
|
|
||||||
|
## Comparisons to other fnmatch/glob implementations
|
||||||
|
|
||||||
|
While strict compliance with the existing standards is a worthwhile
|
||||||
|
goal, some discrepancies exist between minimatch and other
|
||||||
|
implementations, and are intentional.
|
||||||
|
|
||||||
|
If the pattern starts with a `!` character, then it is negated. Set the
|
||||||
|
`nonegate` flag to suppress this behavior, and treat leading `!`
|
||||||
|
characters normally. This is perhaps relevant if you wish to start the
|
||||||
|
pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
|
||||||
|
characters at the start of a pattern will negate the pattern multiple
|
||||||
|
times.
|
||||||
|
|
||||||
|
If a pattern starts with `#`, then it is treated as a comment, and
|
||||||
|
will not match anything. Use `\#` to match a literal `#` at the
|
||||||
|
start of a line, or set the `nocomment` flag to suppress this behavior.
|
||||||
|
|
||||||
|
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.1, 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.
|
||||||
|
|
||||||
|
If an escaped pattern has no matches, and the `nonull` flag is set,
|
||||||
|
then minimatch.match returns the pattern as-provided, rather than
|
||||||
|
interpreting the character escapes. For example,
|
||||||
|
`minimatch.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.
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,868 @@
|
||||||
|
module.exports = minimatch
|
||||||
|
minimatch.Minimatch = Minimatch
|
||||||
|
|
||||||
|
var isWindows = false
|
||||||
|
if (typeof process !== 'undefined' && process.platform === 'win32')
|
||||||
|
isWindows = true
|
||||||
|
|
||||||
|
var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
|
||||||
|
, expand = require("brace-expansion")
|
||||||
|
|
||||||
|
// any single thing other than /
|
||||||
|
// don't need to escape / when using new RegExp()
|
||||||
|
, qmark = "[^/]"
|
||||||
|
|
||||||
|
// * => any number of characters
|
||||||
|
, star = qmark + "*?"
|
||||||
|
|
||||||
|
// ** when dots are allowed. Anything goes, except .. and .
|
||||||
|
// not (^ or / followed by one or two dots followed by $ or /),
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
, twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?"
|
||||||
|
|
||||||
|
// not a ^ or / followed by a dot,
|
||||||
|
// followed by anything, any number of times.
|
||||||
|
, twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?"
|
||||||
|
|
||||||
|
// characters that need to be escaped in RegExp.
|
||||||
|
, reSpecials = charSet("().*{}+?[]^$\\!")
|
||||||
|
|
||||||
|
// "abc" -> { a:true, b:true, c:true }
|
||||||
|
function charSet (s) {
|
||||||
|
return s.split("").reduce(function (set, c) {
|
||||||
|
set[c] = true
|
||||||
|
return set
|
||||||
|
}, {})
|
||||||
|
}
|
||||||
|
|
||||||
|
// normalizes slashes.
|
||||||
|
var slashSplit = /\/+/
|
||||||
|
|
||||||
|
minimatch.filter = filter
|
||||||
|
function filter (pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
return function (p, i, list) {
|
||||||
|
return minimatch(p, pattern, options)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ext (a, b) {
|
||||||
|
a = a || {}
|
||||||
|
b = b || {}
|
||||||
|
var t = {}
|
||||||
|
Object.keys(b).forEach(function (k) {
|
||||||
|
t[k] = b[k]
|
||||||
|
})
|
||||||
|
Object.keys(a).forEach(function (k) {
|
||||||
|
t[k] = a[k]
|
||||||
|
})
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.defaults = function (def) {
|
||||||
|
if (!def || !Object.keys(def).length) return minimatch
|
||||||
|
|
||||||
|
var orig = minimatch
|
||||||
|
|
||||||
|
var m = function minimatch (p, pattern, options) {
|
||||||
|
return orig.minimatch(p, pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
m.Minimatch = function Minimatch (pattern, options) {
|
||||||
|
return new orig.Minimatch(pattern, ext(def, options))
|
||||||
|
}
|
||||||
|
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.defaults = function (def) {
|
||||||
|
if (!def || !Object.keys(def).length) return Minimatch
|
||||||
|
return minimatch.defaults(def).Minimatch
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function minimatch (p, pattern, options) {
|
||||||
|
if (typeof pattern !== "string") {
|
||||||
|
throw new TypeError("glob pattern string required")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
|
||||||
|
// shortcut: comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === "#") {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// "" only matches ""
|
||||||
|
if (pattern.trim() === "") return p === ""
|
||||||
|
|
||||||
|
return new Minimatch(pattern, options).match(p)
|
||||||
|
}
|
||||||
|
|
||||||
|
function Minimatch (pattern, options) {
|
||||||
|
if (!(this instanceof Minimatch)) {
|
||||||
|
return new Minimatch(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof pattern !== "string") {
|
||||||
|
throw new TypeError("glob pattern string required")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!options) options = {}
|
||||||
|
pattern = pattern.trim()
|
||||||
|
|
||||||
|
// windows support: need to use /, not \
|
||||||
|
if (isWindows)
|
||||||
|
pattern = pattern.split("\\").join("/")
|
||||||
|
|
||||||
|
this.options = options
|
||||||
|
this.set = []
|
||||||
|
this.pattern = pattern
|
||||||
|
this.regexp = null
|
||||||
|
this.negate = false
|
||||||
|
this.comment = false
|
||||||
|
this.empty = false
|
||||||
|
|
||||||
|
// make the set of regexps etc.
|
||||||
|
this.make()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.debug = function() {}
|
||||||
|
|
||||||
|
Minimatch.prototype.make = make
|
||||||
|
function make () {
|
||||||
|
// don't do it more than once.
|
||||||
|
if (this._made) return
|
||||||
|
|
||||||
|
var pattern = this.pattern
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// empty patterns and comments match nothing.
|
||||||
|
if (!options.nocomment && pattern.charAt(0) === "#") {
|
||||||
|
this.comment = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (!pattern) {
|
||||||
|
this.empty = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// step 1: figure out negation, etc.
|
||||||
|
this.parseNegate()
|
||||||
|
|
||||||
|
// step 2: expand braces
|
||||||
|
var set = this.globSet = this.braceExpand()
|
||||||
|
|
||||||
|
if (options.debug) this.debug = console.error
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// step 3: now we have a set, so turn each one into a series of path-portion
|
||||||
|
// matching patterns.
|
||||||
|
// These will be regexps, except in the case of "**", which is
|
||||||
|
// set to the GLOBSTAR object for globstar behavior,
|
||||||
|
// and will not contain any / characters
|
||||||
|
set = this.globParts = set.map(function (s) {
|
||||||
|
return s.split(slashSplit)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// glob --> regexps
|
||||||
|
set = set.map(function (s, si, set) {
|
||||||
|
return s.map(this.parse, this)
|
||||||
|
}, this)
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
// filter out everything that didn't compile properly.
|
||||||
|
set = set.filter(function (s) {
|
||||||
|
return -1 === s.indexOf(false)
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug(this.pattern, set)
|
||||||
|
|
||||||
|
this.set = set
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.parseNegate = parseNegate
|
||||||
|
function parseNegate () {
|
||||||
|
var pattern = this.pattern
|
||||||
|
, negate = false
|
||||||
|
, options = this.options
|
||||||
|
, negateOffset = 0
|
||||||
|
|
||||||
|
if (options.nonegate) return
|
||||||
|
|
||||||
|
for ( var i = 0, l = pattern.length
|
||||||
|
; i < l && pattern.charAt(i) === "!"
|
||||||
|
; i ++) {
|
||||||
|
negate = !negate
|
||||||
|
negateOffset ++
|
||||||
|
}
|
||||||
|
|
||||||
|
if (negateOffset) this.pattern = pattern.substr(negateOffset)
|
||||||
|
this.negate = negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// Brace expansion:
|
||||||
|
// a{b,c}d -> abd acd
|
||||||
|
// a{b,}c -> abc ac
|
||||||
|
// a{0..3}d -> a0d a1d a2d a3d
|
||||||
|
// a{b,c{d,e}f}g -> abg acdfg acefg
|
||||||
|
// a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
|
||||||
|
//
|
||||||
|
// Invalid sets are not expanded.
|
||||||
|
// a{2..}b -> a{2..}b
|
||||||
|
// a{b}c -> a{b}c
|
||||||
|
minimatch.braceExpand = function (pattern, options) {
|
||||||
|
return braceExpand(pattern, options)
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.braceExpand = braceExpand
|
||||||
|
|
||||||
|
function braceExpand (pattern, options) {
|
||||||
|
if (!options) {
|
||||||
|
if (this instanceof Minimatch)
|
||||||
|
options = this.options
|
||||||
|
else
|
||||||
|
options = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
pattern = typeof pattern === "undefined"
|
||||||
|
? this.pattern : pattern
|
||||||
|
|
||||||
|
if (typeof pattern === "undefined") {
|
||||||
|
throw new Error("undefined pattern")
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.nobrace ||
|
||||||
|
!pattern.match(/\{.*\}/)) {
|
||||||
|
// shortcut. no need to expand.
|
||||||
|
return [pattern]
|
||||||
|
}
|
||||||
|
|
||||||
|
return expand(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
// parse a component of the expanded set.
|
||||||
|
// At this point, no pattern may contain "/" in it
|
||||||
|
// so we're going to return a 2d array, where each entry is the full
|
||||||
|
// pattern, split on '/', and then turned into a regular expression.
|
||||||
|
// A regexp is made at the end which joins each array with an
|
||||||
|
// escaped /, and another full one which joins each regexp with |.
|
||||||
|
//
|
||||||
|
// Following the lead of Bash 4.1, note that "**" only has special meaning
|
||||||
|
// when it is the *only* thing in a path portion. Otherwise, any series
|
||||||
|
// of * is equivalent to a single *. Globstar behavior is enabled by
|
||||||
|
// default, and can be disabled by setting options.noglobstar.
|
||||||
|
Minimatch.prototype.parse = parse
|
||||||
|
var SUBPARSE = {}
|
||||||
|
function parse (pattern, isSub) {
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// shortcuts
|
||||||
|
if (!options.noglobstar && pattern === "**") return GLOBSTAR
|
||||||
|
if (pattern === "") return ""
|
||||||
|
|
||||||
|
var re = ""
|
||||||
|
, hasMagic = !!options.nocase
|
||||||
|
, escaping = false
|
||||||
|
// ? => one single character
|
||||||
|
, patternListStack = []
|
||||||
|
, plType
|
||||||
|
, stateChar
|
||||||
|
, inClass = false
|
||||||
|
, reClassStart = -1
|
||||||
|
, classStart = -1
|
||||||
|
// . and .. never match anything that doesn't start with .,
|
||||||
|
// even when options.dot is set.
|
||||||
|
, patternStart = pattern.charAt(0) === "." ? "" // anything
|
||||||
|
// not (start or / followed by . or .. followed by / or end)
|
||||||
|
: options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
|
||||||
|
: "(?!\\.)"
|
||||||
|
, self = this
|
||||||
|
|
||||||
|
function clearStateChar () {
|
||||||
|
if (stateChar) {
|
||||||
|
// we had some state-tracking character
|
||||||
|
// that wasn't consumed by this pass.
|
||||||
|
switch (stateChar) {
|
||||||
|
case "*":
|
||||||
|
re += star
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
case "?":
|
||||||
|
re += qmark
|
||||||
|
hasMagic = true
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
re += "\\"+stateChar
|
||||||
|
break
|
||||||
|
}
|
||||||
|
self.debug('clearStateChar %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for ( var i = 0, len = pattern.length, c
|
||||||
|
; (i < len) && (c = pattern.charAt(i))
|
||||||
|
; i ++ ) {
|
||||||
|
|
||||||
|
this.debug("%s\t%s %s %j", pattern, i, re, c)
|
||||||
|
|
||||||
|
// skip over any that are escaped.
|
||||||
|
if (escaping && reSpecials[c]) {
|
||||||
|
re += "\\" + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
SWITCH: switch (c) {
|
||||||
|
case "/":
|
||||||
|
// completely not allowed, even escaped.
|
||||||
|
// Should already be path-split by now.
|
||||||
|
return false
|
||||||
|
|
||||||
|
case "\\":
|
||||||
|
clearStateChar()
|
||||||
|
escaping = true
|
||||||
|
continue
|
||||||
|
|
||||||
|
// the various stateChar values
|
||||||
|
// for the "extglob" stuff.
|
||||||
|
case "?":
|
||||||
|
case "*":
|
||||||
|
case "+":
|
||||||
|
case "@":
|
||||||
|
case "!":
|
||||||
|
this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
|
||||||
|
|
||||||
|
// all of those are literals inside a class, except that
|
||||||
|
// the glob [!a] means [^a] in regexp
|
||||||
|
if (inClass) {
|
||||||
|
this.debug(' in class')
|
||||||
|
if (c === "!" && i === classStart + 1) c = "^"
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we already have a stateChar, then it means
|
||||||
|
// that there was something like ** or +? in there.
|
||||||
|
// Handle the stateChar, then proceed with this one.
|
||||||
|
self.debug('call clearStateChar %j', stateChar)
|
||||||
|
clearStateChar()
|
||||||
|
stateChar = c
|
||||||
|
// if extglob is disabled, then +(asdf|foo) isn't a thing.
|
||||||
|
// just clear the statechar *now*, rather than even diving into
|
||||||
|
// the patternList stuff.
|
||||||
|
if (options.noext) clearStateChar()
|
||||||
|
continue
|
||||||
|
|
||||||
|
case "(":
|
||||||
|
if (inClass) {
|
||||||
|
re += "("
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stateChar) {
|
||||||
|
re += "\\("
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
plType = stateChar
|
||||||
|
patternListStack.push({ type: plType
|
||||||
|
, start: i - 1
|
||||||
|
, reStart: re.length })
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
re += stateChar === "!" ? "(?:(?!" : "(?:"
|
||||||
|
this.debug('plType %j %j', stateChar, re)
|
||||||
|
stateChar = false
|
||||||
|
continue
|
||||||
|
|
||||||
|
case ")":
|
||||||
|
if (inClass || !patternListStack.length) {
|
||||||
|
re += "\\)"
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
hasMagic = true
|
||||||
|
re += ")"
|
||||||
|
plType = patternListStack.pop().type
|
||||||
|
// negation is (?:(?!js)[^/]*)
|
||||||
|
// The others are (?:<pattern>)<type>
|
||||||
|
switch (plType) {
|
||||||
|
case "!":
|
||||||
|
re += "[^/]*?)"
|
||||||
|
break
|
||||||
|
case "?":
|
||||||
|
case "+":
|
||||||
|
case "*": re += plType
|
||||||
|
case "@": break // the default anyway
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
|
||||||
|
case "|":
|
||||||
|
if (inClass || !patternListStack.length || escaping) {
|
||||||
|
re += "\\|"
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
clearStateChar()
|
||||||
|
re += "|"
|
||||||
|
continue
|
||||||
|
|
||||||
|
// these are mostly the same in regexp and glob
|
||||||
|
case "[":
|
||||||
|
// swallow any state-tracking char before the [
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (inClass) {
|
||||||
|
re += "\\" + c
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
inClass = true
|
||||||
|
classStart = i
|
||||||
|
reClassStart = re.length
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
case "]":
|
||||||
|
// a right bracket shall lose its special
|
||||||
|
// meaning and represent itself in
|
||||||
|
// a bracket expression if it occurs
|
||||||
|
// first in the list. -- POSIX.2 2.8.3.2
|
||||||
|
if (i === classStart + 1 || !inClass) {
|
||||||
|
re += "\\" + c
|
||||||
|
escaping = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[z-a]" is valid, equivalent to "\[z-a\]"
|
||||||
|
if (inClass) {
|
||||||
|
// split where the last [ was, make sure we don't have
|
||||||
|
// an invalid re. if so, re-walk the contents of the
|
||||||
|
// would-be class to re-translate any characters that
|
||||||
|
// were passed through as-is
|
||||||
|
// TODO: It would probably be faster to determine this
|
||||||
|
// without a try/catch and a new RegExp, but it's tricky
|
||||||
|
// to do safely. For now, this is safe and works.
|
||||||
|
var cs = pattern.substring(classStart + 1, i)
|
||||||
|
try {
|
||||||
|
new RegExp('[' + cs + ']')
|
||||||
|
} catch (er) {
|
||||||
|
// not a valid class!
|
||||||
|
var sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + "\\[" + sp[0] + '\\]'
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
inClass = false
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// finish up the class.
|
||||||
|
hasMagic = true
|
||||||
|
inClass = false
|
||||||
|
re += c
|
||||||
|
continue
|
||||||
|
|
||||||
|
default:
|
||||||
|
// swallow any state char that wasn't consumed
|
||||||
|
clearStateChar()
|
||||||
|
|
||||||
|
if (escaping) {
|
||||||
|
// no need
|
||||||
|
escaping = false
|
||||||
|
} else if (reSpecials[c]
|
||||||
|
&& !(c === "^" && inClass)) {
|
||||||
|
re += "\\"
|
||||||
|
}
|
||||||
|
|
||||||
|
re += c
|
||||||
|
|
||||||
|
} // switch
|
||||||
|
} // for
|
||||||
|
|
||||||
|
|
||||||
|
// handle the case where we left a class open.
|
||||||
|
// "[abc" is valid, equivalent to "\[abc"
|
||||||
|
if (inClass) {
|
||||||
|
// split where the last [ was, and escape it
|
||||||
|
// this is a huge pita. We now have to re-walk
|
||||||
|
// the contents of the would-be class to re-translate
|
||||||
|
// any characters that were passed through as-is
|
||||||
|
var cs = pattern.substr(classStart + 1)
|
||||||
|
, sp = this.parse(cs, SUBPARSE)
|
||||||
|
re = re.substr(0, reClassStart) + "\\[" + sp[0]
|
||||||
|
hasMagic = hasMagic || sp[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle the case where we had a +( thing at the *end*
|
||||||
|
// of the pattern.
|
||||||
|
// each pattern list stack adds 3 chars, and we need to go through
|
||||||
|
// and escape any | chars that were passed through as-is for the regexp.
|
||||||
|
// Go through and escape them, taking care not to double-escape any
|
||||||
|
// | chars that were already escaped.
|
||||||
|
var pl
|
||||||
|
while (pl = patternListStack.pop()) {
|
||||||
|
var tail = re.slice(pl.reStart + 3)
|
||||||
|
// maybe some even number of \, then maybe 1 \, followed by a |
|
||||||
|
tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) {
|
||||||
|
if (!$2) {
|
||||||
|
// the | isn't already escaped, so escape it.
|
||||||
|
$2 = "\\"
|
||||||
|
}
|
||||||
|
|
||||||
|
// need to escape all those slashes *again*, without escaping the
|
||||||
|
// one that we need for escaping the | character. As it works out,
|
||||||
|
// escaping an even number of slashes can be done by simply repeating
|
||||||
|
// it exactly after itself. That's why this trick works.
|
||||||
|
//
|
||||||
|
// I am sorry that you have to see this.
|
||||||
|
return $1 + $1 + $2 + "|"
|
||||||
|
})
|
||||||
|
|
||||||
|
this.debug("tail=%j\n %s", tail, tail)
|
||||||
|
var t = pl.type === "*" ? star
|
||||||
|
: pl.type === "?" ? qmark
|
||||||
|
: "\\" + pl.type
|
||||||
|
|
||||||
|
hasMagic = true
|
||||||
|
re = re.slice(0, pl.reStart)
|
||||||
|
+ t + "\\("
|
||||||
|
+ tail
|
||||||
|
}
|
||||||
|
|
||||||
|
// handle trailing things that only matter at the very end.
|
||||||
|
clearStateChar()
|
||||||
|
if (escaping) {
|
||||||
|
// trailing \\
|
||||||
|
re += "\\\\"
|
||||||
|
}
|
||||||
|
|
||||||
|
// only need to apply the nodot start if the re starts with
|
||||||
|
// something that could conceivably capture a dot
|
||||||
|
var addPatternStart = false
|
||||||
|
switch (re.charAt(0)) {
|
||||||
|
case ".":
|
||||||
|
case "[":
|
||||||
|
case "(": addPatternStart = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// if the re is not "" at this point, then we need to make sure
|
||||||
|
// it doesn't match against an empty path part.
|
||||||
|
// Otherwise a/* will match a/, which it should not.
|
||||||
|
if (re !== "" && hasMagic) re = "(?=.)" + re
|
||||||
|
|
||||||
|
if (addPatternStart) re = patternStart + re
|
||||||
|
|
||||||
|
// parsing just a piece of a larger pattern.
|
||||||
|
if (isSub === SUBPARSE) {
|
||||||
|
return [ re, hasMagic ]
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip the regexp for non-magical patterns
|
||||||
|
// unescape anything in it, though, so that it'll be
|
||||||
|
// an exact match against a file etc.
|
||||||
|
if (!hasMagic) {
|
||||||
|
return globUnescape(pattern)
|
||||||
|
}
|
||||||
|
|
||||||
|
var flags = options.nocase ? "i" : ""
|
||||||
|
, regExp = new RegExp("^" + re + "$", flags)
|
||||||
|
|
||||||
|
regExp._glob = pattern
|
||||||
|
regExp._src = re
|
||||||
|
|
||||||
|
return regExp
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.makeRe = function (pattern, options) {
|
||||||
|
return new Minimatch(pattern, options || {}).makeRe()
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.makeRe = makeRe
|
||||||
|
function makeRe () {
|
||||||
|
if (this.regexp || this.regexp === false) return this.regexp
|
||||||
|
|
||||||
|
// at this point, this.set is a 2d array of partial
|
||||||
|
// pattern strings, or "**".
|
||||||
|
//
|
||||||
|
// It's better to use .match(). This function shouldn't
|
||||||
|
// be used, really, but it's pretty convenient sometimes,
|
||||||
|
// when you just want to work with a regex.
|
||||||
|
var set = this.set
|
||||||
|
|
||||||
|
if (!set.length) return this.regexp = false
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
var twoStar = options.noglobstar ? star
|
||||||
|
: options.dot ? twoStarDot
|
||||||
|
: twoStarNoDot
|
||||||
|
, flags = options.nocase ? "i" : ""
|
||||||
|
|
||||||
|
var re = set.map(function (pattern) {
|
||||||
|
return pattern.map(function (p) {
|
||||||
|
return (p === GLOBSTAR) ? twoStar
|
||||||
|
: (typeof p === "string") ? regExpEscape(p)
|
||||||
|
: p._src
|
||||||
|
}).join("\\\/")
|
||||||
|
}).join("|")
|
||||||
|
|
||||||
|
// must match entire pattern
|
||||||
|
// ending in a * or ** will make it less strict.
|
||||||
|
re = "^(?:" + re + ")$"
|
||||||
|
|
||||||
|
// can match anything, as long as it's not this.
|
||||||
|
if (this.negate) re = "^(?!" + re + ").*$"
|
||||||
|
|
||||||
|
try {
|
||||||
|
return this.regexp = new RegExp(re, flags)
|
||||||
|
} catch (ex) {
|
||||||
|
return this.regexp = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
minimatch.match = function (list, pattern, options) {
|
||||||
|
options = options || {}
|
||||||
|
var mm = new Minimatch(pattern, options)
|
||||||
|
list = list.filter(function (f) {
|
||||||
|
return mm.match(f)
|
||||||
|
})
|
||||||
|
if (mm.options.nonull && !list.length) {
|
||||||
|
list.push(pattern)
|
||||||
|
}
|
||||||
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
Minimatch.prototype.match = match
|
||||||
|
function match (f, partial) {
|
||||||
|
this.debug("match", f, this.pattern)
|
||||||
|
// short-circuit in the case of busted things.
|
||||||
|
// comments, etc.
|
||||||
|
if (this.comment) return false
|
||||||
|
if (this.empty) return f === ""
|
||||||
|
|
||||||
|
if (f === "/" && partial) return true
|
||||||
|
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
// windows: need to use /, not \
|
||||||
|
if (isWindows)
|
||||||
|
f = f.split("\\").join("/")
|
||||||
|
|
||||||
|
// treat the test path as a set of pathparts.
|
||||||
|
f = f.split(slashSplit)
|
||||||
|
this.debug(this.pattern, "split", f)
|
||||||
|
|
||||||
|
// just ONE of the pattern sets in this.set needs to match
|
||||||
|
// in order for it to be valid. If negating, then just one
|
||||||
|
// match means that we have failed.
|
||||||
|
// Either way, return on the first hit.
|
||||||
|
|
||||||
|
var set = this.set
|
||||||
|
this.debug(this.pattern, "set", set)
|
||||||
|
|
||||||
|
// Find the basename of the path by looking for the last non-empty segment
|
||||||
|
var filename;
|
||||||
|
for (var i = f.length - 1; i >= 0; i--) {
|
||||||
|
filename = f[i]
|
||||||
|
if (filename) break
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0, l = set.length; i < l; i ++) {
|
||||||
|
var pattern = set[i], file = f
|
||||||
|
if (options.matchBase && pattern.length === 1) {
|
||||||
|
file = [filename]
|
||||||
|
}
|
||||||
|
var hit = this.matchOne(file, pattern, partial)
|
||||||
|
if (hit) {
|
||||||
|
if (options.flipNegate) return true
|
||||||
|
return !this.negate
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// didn't get any hits. this is success if it's a negative
|
||||||
|
// pattern, failure otherwise.
|
||||||
|
if (options.flipNegate) return false
|
||||||
|
return this.negate
|
||||||
|
}
|
||||||
|
|
||||||
|
// set partial to true to test if, for example,
|
||||||
|
// "/a/b" matches the start of "/*/b/*/d"
|
||||||
|
// Partial means, if you run out of file before you run
|
||||||
|
// out of pattern, then that's fine, as long as all
|
||||||
|
// the parts match.
|
||||||
|
Minimatch.prototype.matchOne = function (file, pattern, partial) {
|
||||||
|
var options = this.options
|
||||||
|
|
||||||
|
this.debug("matchOne",
|
||||||
|
{ "this": this
|
||||||
|
, file: file
|
||||||
|
, pattern: pattern })
|
||||||
|
|
||||||
|
this.debug("matchOne", file.length, pattern.length)
|
||||||
|
|
||||||
|
for ( var fi = 0
|
||||||
|
, pi = 0
|
||||||
|
, fl = file.length
|
||||||
|
, pl = pattern.length
|
||||||
|
; (fi < fl) && (pi < pl)
|
||||||
|
; fi ++, pi ++ ) {
|
||||||
|
|
||||||
|
this.debug("matchOne loop")
|
||||||
|
var p = pattern[pi]
|
||||||
|
, f = file[fi]
|
||||||
|
|
||||||
|
this.debug(pattern, p, f)
|
||||||
|
|
||||||
|
// should be impossible.
|
||||||
|
// some invalid regexp stuff in the set.
|
||||||
|
if (p === false) return false
|
||||||
|
|
||||||
|
if (p === GLOBSTAR) {
|
||||||
|
this.debug('GLOBSTAR', [pattern, p, f])
|
||||||
|
|
||||||
|
// "**"
|
||||||
|
// a/**/b/**/c would match the following:
|
||||||
|
// a/b/x/y/z/c
|
||||||
|
// a/x/y/z/b/c
|
||||||
|
// a/b/x/b/x/c
|
||||||
|
// a/b/c
|
||||||
|
// To do this, take the rest of the pattern after
|
||||||
|
// the **, and see if it would match the file remainder.
|
||||||
|
// If so, return success.
|
||||||
|
// If not, the ** "swallows" a segment, and try again.
|
||||||
|
// This is recursively awful.
|
||||||
|
//
|
||||||
|
// a/**/b/**/c matching a/b/x/y/z/c
|
||||||
|
// - a matches a
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(b/x/y/z/c, b/**/c)
|
||||||
|
// - b matches b
|
||||||
|
// - doublestar
|
||||||
|
// - matchOne(x/y/z/c, c) -> no
|
||||||
|
// - matchOne(y/z/c, c) -> no
|
||||||
|
// - matchOne(z/c, c) -> no
|
||||||
|
// - matchOne(c, c) yes, hit
|
||||||
|
var fr = fi
|
||||||
|
, pr = pi + 1
|
||||||
|
if (pr === pl) {
|
||||||
|
this.debug('** at the end')
|
||||||
|
// a ** at the end will just swallow the rest.
|
||||||
|
// We have found a match.
|
||||||
|
// however, it will not swallow /.x, unless
|
||||||
|
// options.dot is set.
|
||||||
|
// . and .. are *never* matched by **, for explosively
|
||||||
|
// exponential reasons.
|
||||||
|
for ( ; fi < fl; fi ++) {
|
||||||
|
if (file[fi] === "." || file[fi] === ".." ||
|
||||||
|
(!options.dot && file[fi].charAt(0) === ".")) return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// ok, let's see if we can swallow whatever we can.
|
||||||
|
WHILE: while (fr < fl) {
|
||||||
|
var swallowee = file[fr]
|
||||||
|
|
||||||
|
this.debug('\nglobstar while',
|
||||||
|
file, fr, pattern, pr, swallowee)
|
||||||
|
|
||||||
|
// XXX remove this slice. Just pass the start index.
|
||||||
|
if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
|
||||||
|
this.debug('globstar found match!', fr, fl, swallowee)
|
||||||
|
// found a match.
|
||||||
|
return true
|
||||||
|
} else {
|
||||||
|
// can't swallow "." or ".." ever.
|
||||||
|
// can only swallow ".foo" when explicitly asked.
|
||||||
|
if (swallowee === "." || swallowee === ".." ||
|
||||||
|
(!options.dot && swallowee.charAt(0) === ".")) {
|
||||||
|
this.debug("dot detected!", file, fr, pattern, pr)
|
||||||
|
break WHILE
|
||||||
|
}
|
||||||
|
|
||||||
|
// ** swallows a segment, and continue.
|
||||||
|
this.debug('globstar swallow a segment, and continue')
|
||||||
|
fr ++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// no match was found.
|
||||||
|
// However, in partial mode, we can't say this is necessarily over.
|
||||||
|
// If there's more *pattern* left, then
|
||||||
|
if (partial) {
|
||||||
|
// ran out of file
|
||||||
|
this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
|
||||||
|
if (fr === fl) return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// something other than **
|
||||||
|
// non-magic patterns just have to match exactly
|
||||||
|
// patterns with magic have been turned into regexps.
|
||||||
|
var hit
|
||||||
|
if (typeof p === "string") {
|
||||||
|
if (options.nocase) {
|
||||||
|
hit = f.toLowerCase() === p.toLowerCase()
|
||||||
|
} else {
|
||||||
|
hit = f === p
|
||||||
|
}
|
||||||
|
this.debug("string match", p, f, hit)
|
||||||
|
} else {
|
||||||
|
hit = f.match(p)
|
||||||
|
this.debug("pattern match", p, f, hit)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!hit) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: ending in / means that we'll get a final ""
|
||||||
|
// at the end of the pattern. This can only match a
|
||||||
|
// corresponding "" at the end of the file.
|
||||||
|
// If the file ends in /, then it can only match a
|
||||||
|
// a pattern that ends in /, unless the pattern just
|
||||||
|
// doesn't have any more for it. But, a/b/ should *not*
|
||||||
|
// match "a/b/*", even though "" matches against the
|
||||||
|
// [^/]*? pattern, except in partial mode, where it might
|
||||||
|
// simply not be reached yet.
|
||||||
|
// However, a/b/ should still satisfy a/*
|
||||||
|
|
||||||
|
// now either we fell off the end of the pattern, or we're done.
|
||||||
|
if (fi === fl && pi === pl) {
|
||||||
|
// ran out of pattern and filename at the same time.
|
||||||
|
// an exact hit!
|
||||||
|
return true
|
||||||
|
} else if (fi === fl) {
|
||||||
|
// ran out of file, but still had pattern left.
|
||||||
|
// this is ok if we're doing the match as part of
|
||||||
|
// a glob fs traversal.
|
||||||
|
return partial
|
||||||
|
} else if (pi === pl) {
|
||||||
|
// ran out of pattern, still have file left.
|
||||||
|
// this is only acceptable if we're on the very last
|
||||||
|
// empty segment of a file with a trailing slash.
|
||||||
|
// a/* should match a/b/
|
||||||
|
var emptyFileEnd = (fi === fl - 1) && (file[fi] === "")
|
||||||
|
return emptyFileEnd
|
||||||
|
}
|
||||||
|
|
||||||
|
// should be unreachable.
|
||||||
|
throw new Error("wtf?")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// replace stuff like \* with *
|
||||||
|
function globUnescape (s) {
|
||||||
|
return s.replace(/\\(.)/g, "$1")
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function regExpEscape (s) {
|
||||||
|
return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
|
||||||
|
}
|
2
js/node/node_modules/minimatch/node_modules/brace-expansion/.npmignore
generated
vendored
Normal file
2
js/node/node_modules/minimatch/node_modules/brace-expansion/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules
|
||||||
|
*.sw*
|
3
js/node/node_modules/minimatch/node_modules/brace-expansion/.travis.yml
generated
vendored
Normal file
3
js/node/node_modules/minimatch/node_modules/brace-expansion/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "0.10"
|
121
js/node/node_modules/minimatch/node_modules/brace-expansion/README.md
generated
vendored
Normal file
121
js/node/node_modules/minimatch/node_modules/brace-expansion/README.md
generated
vendored
Normal file
|
@ -0,0 +1,121 @@
|
||||||
|
# brace-expansion
|
||||||
|
|
||||||
|
[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
|
||||||
|
as known from sh/bash, in JavaScript.
|
||||||
|
|
||||||
|
[](http://travis-ci.org/juliangruber/brace-expansion)
|
||||||
|
|
||||||
|
[](https://ci.testling.com/juliangruber/brace-expansion)
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
```js
|
||||||
|
var expand = require('brace-expansion');
|
||||||
|
|
||||||
|
expand('file-{a,b,c}.jpg')
|
||||||
|
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
||||||
|
|
||||||
|
expand('-v{,,}')
|
||||||
|
// => ['-v', '-v', '-v']
|
||||||
|
|
||||||
|
expand('file{0..2}.jpg')
|
||||||
|
// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
|
||||||
|
|
||||||
|
expand('file-{a..c}.jpg')
|
||||||
|
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
||||||
|
|
||||||
|
expand('file{2..0}.jpg')
|
||||||
|
// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
|
||||||
|
|
||||||
|
expand('file{0..4..2}.jpg')
|
||||||
|
// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
|
||||||
|
|
||||||
|
expand('file-{a..e..2}.jpg')
|
||||||
|
// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
|
||||||
|
|
||||||
|
expand('file{00..10..5}.jpg')
|
||||||
|
// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
|
||||||
|
|
||||||
|
expand('{{A..C},{a..c}}')
|
||||||
|
// => ['A', 'B', 'C', 'a', 'b', 'c']
|
||||||
|
|
||||||
|
expand('ppp{,config,oe{,conf}}')
|
||||||
|
// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
```js
|
||||||
|
var expand = require('brace-expansion');
|
||||||
|
```
|
||||||
|
|
||||||
|
### var expanded = expand(str)
|
||||||
|
|
||||||
|
Return an array of all possible and valid expansions of `str`. If none are
|
||||||
|
found, `[str]` is returned.
|
||||||
|
|
||||||
|
Valid expansions are:
|
||||||
|
|
||||||
|
```js
|
||||||
|
/^(.*,)+(.+)?$/
|
||||||
|
// {a,b,...}
|
||||||
|
```
|
||||||
|
|
||||||
|
A comma seperated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
||||||
|
// {x..y[..incr]}
|
||||||
|
```
|
||||||
|
|
||||||
|
A numeric sequence from `x` to `y` inclusive, with optional increment.
|
||||||
|
If `x` or `y` start with a leading `0`, all the numbers will be padded
|
||||||
|
to have equal length. Negative numbers and backwards iteration work too.
|
||||||
|
|
||||||
|
```js
|
||||||
|
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
||||||
|
// {x..y[..incr]}
|
||||||
|
```
|
||||||
|
|
||||||
|
An alphabetic sequence from `x` to `y` inclusive, with optional increment.
|
||||||
|
`x` and `y` must be exactly one character, and if given, `incr` must be a
|
||||||
|
number.
|
||||||
|
|
||||||
|
For compatibility reasons, the string `${` is not eligible for brace expansion.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
With [npm](https://npmjs.org) do:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install brace-expansion
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributors
|
||||||
|
|
||||||
|
- [Julian Gruber](https://github.com/juliangruber)
|
||||||
|
- [Isaac Z. Schlueter](https://github.com/isaacs)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
(MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
8
js/node/node_modules/minimatch/node_modules/brace-expansion/example.js
generated
vendored
Normal file
8
js/node/node_modules/minimatch/node_modules/brace-expansion/example.js
generated
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
var expand = require('./');
|
||||||
|
|
||||||
|
console.log(expand('http://any.org/archive{1996..1999}/vol{1..4}/part{a,b,c}.html'));
|
||||||
|
console.log(expand('http://www.numericals.com/file{1..100..10}.txt'));
|
||||||
|
console.log(expand('http://www.letters.com/file{a..z..2}.txt'));
|
||||||
|
console.log(expand('mkdir /usr/local/src/bash/{old,new,dist,bugs}'));
|
||||||
|
console.log(expand('chown root /usr/{ucb/{ex,edit},lib/{ex?.?*,how_ex}}'));
|
||||||
|
|
191
js/node/node_modules/minimatch/node_modules/brace-expansion/index.js
generated
vendored
Normal file
191
js/node/node_modules/minimatch/node_modules/brace-expansion/index.js
generated
vendored
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
var concatMap = require('concat-map');
|
||||||
|
var balanced = require('balanced-match');
|
||||||
|
|
||||||
|
module.exports = expandTop;
|
||||||
|
|
||||||
|
var escSlash = '\0SLASH'+Math.random()+'\0';
|
||||||
|
var escOpen = '\0OPEN'+Math.random()+'\0';
|
||||||
|
var escClose = '\0CLOSE'+Math.random()+'\0';
|
||||||
|
var escComma = '\0COMMA'+Math.random()+'\0';
|
||||||
|
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
||||||
|
|
||||||
|
function numeric(str) {
|
||||||
|
return parseInt(str, 10) == str
|
||||||
|
? parseInt(str, 10)
|
||||||
|
: str.charCodeAt(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function escapeBraces(str) {
|
||||||
|
return str.split('\\\\').join(escSlash)
|
||||||
|
.split('\\{').join(escOpen)
|
||||||
|
.split('\\}').join(escClose)
|
||||||
|
.split('\\,').join(escComma)
|
||||||
|
.split('\\.').join(escPeriod);
|
||||||
|
}
|
||||||
|
|
||||||
|
function unescapeBraces(str) {
|
||||||
|
return str.split(escSlash).join('\\')
|
||||||
|
.split(escOpen).join('{')
|
||||||
|
.split(escClose).join('}')
|
||||||
|
.split(escComma).join(',')
|
||||||
|
.split(escPeriod).join('.');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Basically just str.split(","), but handling cases
|
||||||
|
// where we have nested braced sections, which should be
|
||||||
|
// treated as individual members, like {a,{b,c},d}
|
||||||
|
function parseCommaParts(str) {
|
||||||
|
if (!str)
|
||||||
|
return [''];
|
||||||
|
|
||||||
|
var parts = [];
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
|
||||||
|
if (!m)
|
||||||
|
return str.split(',');
|
||||||
|
|
||||||
|
var pre = m.pre;
|
||||||
|
var body = m.body;
|
||||||
|
var post = m.post;
|
||||||
|
var p = pre.split(',');
|
||||||
|
|
||||||
|
p[p.length-1] += '{' + body + '}';
|
||||||
|
var postParts = parseCommaParts(post);
|
||||||
|
if (post.length) {
|
||||||
|
p[p.length-1] += postParts.shift();
|
||||||
|
p.push.apply(p, postParts);
|
||||||
|
}
|
||||||
|
|
||||||
|
parts.push.apply(parts, p);
|
||||||
|
|
||||||
|
return parts;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expandTop(str) {
|
||||||
|
if (!str)
|
||||||
|
return [];
|
||||||
|
|
||||||
|
return expand(escapeBraces(str), true).map(unescapeBraces);
|
||||||
|
}
|
||||||
|
|
||||||
|
function identity(e) {
|
||||||
|
return e;
|
||||||
|
}
|
||||||
|
|
||||||
|
function embrace(str) {
|
||||||
|
return '{' + str + '}';
|
||||||
|
}
|
||||||
|
function isPadded(el) {
|
||||||
|
return /^-?0\d/.test(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
function lte(i, y) {
|
||||||
|
return i <= y;
|
||||||
|
}
|
||||||
|
function gte(i, y) {
|
||||||
|
return i >= y;
|
||||||
|
}
|
||||||
|
|
||||||
|
function expand(str, isTop) {
|
||||||
|
var expansions = [];
|
||||||
|
|
||||||
|
var m = balanced('{', '}', str);
|
||||||
|
if (!m || /\$$/.test(m.pre)) return [str];
|
||||||
|
|
||||||
|
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
||||||
|
var isSequence = isNumericSequence || isAlphaSequence;
|
||||||
|
var isOptions = /^(.*,)+(.+)?$/.test(m.body);
|
||||||
|
if (!isSequence && !isOptions) {
|
||||||
|
// {a},b}
|
||||||
|
if (m.post.match(/,.*}/)) {
|
||||||
|
str = m.pre + '{' + m.body + escClose + m.post;
|
||||||
|
return expand(str);
|
||||||
|
}
|
||||||
|
return [str];
|
||||||
|
}
|
||||||
|
|
||||||
|
var n;
|
||||||
|
if (isSequence) {
|
||||||
|
n = m.body.split(/\.\./);
|
||||||
|
} else {
|
||||||
|
n = parseCommaParts(m.body);
|
||||||
|
if (n.length === 1) {
|
||||||
|
// x{{a,b}}y ==> x{a}y x{b}y
|
||||||
|
n = expand(n[0], false).map(embrace);
|
||||||
|
if (n.length === 1) {
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
return post.map(function(p) {
|
||||||
|
return m.pre + n[0] + p;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// at this point, n is the parts, and we know it's not a comma set
|
||||||
|
// with a single entry.
|
||||||
|
|
||||||
|
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
||||||
|
var pre = m.pre;
|
||||||
|
var post = m.post.length
|
||||||
|
? expand(m.post, false)
|
||||||
|
: [''];
|
||||||
|
|
||||||
|
var N;
|
||||||
|
|
||||||
|
if (isSequence) {
|
||||||
|
var x = numeric(n[0]);
|
||||||
|
var y = numeric(n[1]);
|
||||||
|
var width = Math.max(n[0].length, n[1].length)
|
||||||
|
var incr = n.length == 3
|
||||||
|
? Math.abs(numeric(n[2]))
|
||||||
|
: 1;
|
||||||
|
var test = lte;
|
||||||
|
var reverse = y < x;
|
||||||
|
if (reverse) {
|
||||||
|
incr *= -1;
|
||||||
|
test = gte;
|
||||||
|
}
|
||||||
|
var pad = n.some(isPadded);
|
||||||
|
|
||||||
|
N = [];
|
||||||
|
|
||||||
|
for (var i = x; test(i, y); i += incr) {
|
||||||
|
var c;
|
||||||
|
if (isAlphaSequence) {
|
||||||
|
c = String.fromCharCode(i);
|
||||||
|
if (c === '\\')
|
||||||
|
c = '';
|
||||||
|
} else {
|
||||||
|
c = String(i);
|
||||||
|
if (pad) {
|
||||||
|
var need = width - c.length;
|
||||||
|
if (need > 0) {
|
||||||
|
var z = new Array(need + 1).join('0');
|
||||||
|
if (i < 0)
|
||||||
|
c = '-' + z + c.slice(1);
|
||||||
|
else
|
||||||
|
c = z + c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
N.push(c);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
N = concatMap(n, function(el) { return expand(el, false) });
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var j = 0; j < N.length; j++) {
|
||||||
|
for (var k = 0; k < post.length; k++) {
|
||||||
|
var expansion = pre + N[j] + post[k];
|
||||||
|
if (!isTop || isSequence || expansion)
|
||||||
|
expansions.push(expansion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return expansions;
|
||||||
|
}
|
||||||
|
|
2
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore
generated
vendored
Normal file
2
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.npmignore
generated
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
node_modules
|
||||||
|
.DS_Store
|
4
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml
generated
vendored
Normal file
4
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- "0.8"
|
||||||
|
- "0.10"
|
80
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md
generated
vendored
Normal file
80
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/README.md
generated
vendored
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
# balanced-match
|
||||||
|
|
||||||
|
Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`.
|
||||||
|
|
||||||
|
[](http://travis-ci.org/juliangruber/balanced-match)
|
||||||
|
[](https://www.npmjs.org/package/balanced-match)
|
||||||
|
|
||||||
|
[](https://ci.testling.com/juliangruber/balanced-match)
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
Get the first matching pair of braces:
|
||||||
|
|
||||||
|
```js
|
||||||
|
var balanced = require('balanced-match');
|
||||||
|
|
||||||
|
console.log(balanced('{', '}', 'pre{in{nested}}post'));
|
||||||
|
console.log(balanced('{', '}', 'pre{first}between{second}post'));
|
||||||
|
```
|
||||||
|
|
||||||
|
The matches are:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ node example.js
|
||||||
|
{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
|
||||||
|
{ start: 3,
|
||||||
|
end: 9,
|
||||||
|
pre: 'pre',
|
||||||
|
body: 'first',
|
||||||
|
post: 'between{second}post' }
|
||||||
|
```
|
||||||
|
|
||||||
|
## API
|
||||||
|
|
||||||
|
### var m = balanced(a, b, str)
|
||||||
|
|
||||||
|
For the first non-nested matching pair of `a` and `b` in `str`, return an
|
||||||
|
object with those keys:
|
||||||
|
|
||||||
|
* **start** the index of the first match of `a`
|
||||||
|
* **end** the index of the matching `b`
|
||||||
|
* **pre** the preamble, `a` and `b` not included
|
||||||
|
* **body** the match, `a` and `b` not included
|
||||||
|
* **post** the postscript, `a` and `b` not included
|
||||||
|
|
||||||
|
If there's no match, `undefined` will be returned.
|
||||||
|
|
||||||
|
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']`.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
With [npm](https://npmjs.org) do:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm install balanced-match
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
(MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
of the Software, and to permit persons to whom the Software is furnished to do
|
||||||
|
so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
5
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js
generated
vendored
Normal file
5
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/example.js
generated
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
var balanced = require('./');
|
||||||
|
|
||||||
|
console.log(balanced('{', '}', 'pre{in{nested}}post'));
|
||||||
|
console.log(balanced('{', '}', 'pre{first}between{second}post'));
|
||||||
|
|
38
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
generated
vendored
Normal file
38
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/index.js
generated
vendored
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
module.exports = balanced;
|
||||||
|
function balanced(a, b, str) {
|
||||||
|
var bal = 0;
|
||||||
|
var m = {};
|
||||||
|
var ended = false;
|
||||||
|
|
||||||
|
for (var i = 0; i < str.length; i++) {
|
||||||
|
if (a == str.substr(i, a.length)) {
|
||||||
|
if (!('start' in m)) m.start = i;
|
||||||
|
bal++;
|
||||||
|
}
|
||||||
|
else if (b == str.substr(i, b.length) && 'start' in m) {
|
||||||
|
ended = true;
|
||||||
|
bal--;
|
||||||
|
if (!bal) {
|
||||||
|
m.end = i;
|
||||||
|
m.pre = str.substr(0, m.start);
|
||||||
|
m.body = (m.end - m.start > 1)
|
||||||
|
? str.substring(m.start + a.length, m.end)
|
||||||
|
: '';
|
||||||
|
m.post = str.slice(m.end + b.length);
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we opened more than we closed, find the one we closed
|
||||||
|
if (bal && ended) {
|
||||||
|
var start = m.start + a.length;
|
||||||
|
m = balanced(a, b, str.substr(start));
|
||||||
|
if (m) {
|
||||||
|
m.start += start;
|
||||||
|
m.end += start;
|
||||||
|
m.pre = str.slice(0, start) + m.pre;
|
||||||
|
}
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
}
|
73
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json
generated
vendored
Normal file
73
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/package.json
generated
vendored
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
{
|
||||||
|
"name": "balanced-match",
|
||||||
|
"description": "Match balanced character pairs, like \"{\" and \"}\"",
|
||||||
|
"version": "0.2.0",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/juliangruber/balanced-match.git"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/juliangruber/balanced-match",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "make test"
|
||||||
|
},
|
||||||
|
"dependencies": {},
|
||||||
|
"devDependencies": {
|
||||||
|
"tape": "~1.1.1"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"match",
|
||||||
|
"regexp",
|
||||||
|
"test",
|
||||||
|
"balanced",
|
||||||
|
"parse"
|
||||||
|
],
|
||||||
|
"author": {
|
||||||
|
"name": "Julian Gruber",
|
||||||
|
"email": "mail@juliangruber.com",
|
||||||
|
"url": "http://juliangruber.com"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"testling": {
|
||||||
|
"files": "test/*.js",
|
||||||
|
"browsers": [
|
||||||
|
"ie/8..latest",
|
||||||
|
"firefox/20..latest",
|
||||||
|
"firefox/nightly",
|
||||||
|
"chrome/25..latest",
|
||||||
|
"chrome/canary",
|
||||||
|
"opera/12..latest",
|
||||||
|
"opera/next",
|
||||||
|
"safari/5.1..latest",
|
||||||
|
"ipad/6.0..latest",
|
||||||
|
"iphone/6.0..latest",
|
||||||
|
"android-browser/4.2..latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gitHead": "ba40ed78e7114a4a67c51da768a100184dead39c",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/juliangruber/balanced-match/issues"
|
||||||
|
},
|
||||||
|
"_id": "balanced-match@0.2.0",
|
||||||
|
"_shasum": "38f6730c03aab6d5edbb52bd934885e756d71674",
|
||||||
|
"_from": "balanced-match@>=0.2.0 <0.3.0",
|
||||||
|
"_npmVersion": "2.1.8",
|
||||||
|
"_nodeVersion": "0.10.32",
|
||||||
|
"_npmUser": {
|
||||||
|
"name": "juliangruber",
|
||||||
|
"email": "julian@juliangruber.com"
|
||||||
|
},
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "juliangruber",
|
||||||
|
"email": "julian@juliangruber.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dist": {
|
||||||
|
"shasum": "38f6730c03aab6d5edbb52bd934885e756d71674",
|
||||||
|
"tarball": "http://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz"
|
||||||
|
},
|
||||||
|
"directories": {},
|
||||||
|
"_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.2.0.tgz",
|
||||||
|
"readme": "ERROR: No README data found!"
|
||||||
|
}
|
56
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js
generated
vendored
Normal file
56
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match/test/balanced.js
generated
vendored
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var balanced = require('..');
|
||||||
|
|
||||||
|
test('balanced', function(t) {
|
||||||
|
t.deepEqual(balanced('{', '}', 'pre{in{nest}}post'), {
|
||||||
|
start: 3,
|
||||||
|
end: 12,
|
||||||
|
pre: 'pre',
|
||||||
|
body: 'in{nest}',
|
||||||
|
post: 'post'
|
||||||
|
});
|
||||||
|
t.deepEqual(balanced('{', '}', '{{{{{{{{{in}post'), {
|
||||||
|
start: 8,
|
||||||
|
end: 11,
|
||||||
|
pre: '{{{{{{{{',
|
||||||
|
body: 'in',
|
||||||
|
post: 'post'
|
||||||
|
});
|
||||||
|
t.deepEqual(balanced('{', '}', 'pre{body{in}post'), {
|
||||||
|
start: 8,
|
||||||
|
end: 11,
|
||||||
|
pre: 'pre{body',
|
||||||
|
body: 'in',
|
||||||
|
post: 'post'
|
||||||
|
});
|
||||||
|
t.deepEqual(balanced('{', '}', 'pre}{in{nest}}post'), {
|
||||||
|
start: 4,
|
||||||
|
end: 13,
|
||||||
|
pre: 'pre}',
|
||||||
|
body: 'in{nest}',
|
||||||
|
post: 'post'
|
||||||
|
});
|
||||||
|
t.deepEqual(balanced('{', '}', 'pre{body}between{body2}post'), {
|
||||||
|
start: 3,
|
||||||
|
end: 8,
|
||||||
|
pre: 'pre',
|
||||||
|
body: 'body',
|
||||||
|
post: 'between{body2}post'
|
||||||
|
});
|
||||||
|
t.notOk(balanced('{', '}', 'nope'), 'should be notOk');
|
||||||
|
t.deepEqual(balanced('<b>', '</b>', 'pre<b>in<b>nest</b></b>post'), {
|
||||||
|
start: 3,
|
||||||
|
end: 19,
|
||||||
|
pre: 'pre',
|
||||||
|
body: 'in<b>nest</b>',
|
||||||
|
post: 'post'
|
||||||
|
});
|
||||||
|
t.deepEqual(balanced('<b>', '</b>', 'pre</b><b>in<b>nest</b></b>post'), {
|
||||||
|
start: 7,
|
||||||
|
end: 23,
|
||||||
|
pre: 'pre</b>',
|
||||||
|
body: 'in<b>nest</b>',
|
||||||
|
post: 'post'
|
||||||
|
});
|
||||||
|
t.end();
|
||||||
|
});
|
4
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml
generated
vendored
Normal file
4
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/.travis.yml
generated
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
language: node_js
|
||||||
|
node_js:
|
||||||
|
- 0.4
|
||||||
|
- 0.6
|
18
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE
generated
vendored
Normal file
18
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
This software is released under the MIT license:
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
62
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown
generated
vendored
Normal file
62
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/README.markdown
generated
vendored
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
concat-map
|
||||||
|
==========
|
||||||
|
|
||||||
|
Concatenative mapdashery.
|
||||||
|
|
||||||
|
[](http://ci.testling.com/substack/node-concat-map)
|
||||||
|
|
||||||
|
[](http://travis-ci.org/substack/node-concat-map)
|
||||||
|
|
||||||
|
example
|
||||||
|
=======
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var concatMap = require('concat-map');
|
||||||
|
var xs = [ 1, 2, 3, 4, 5, 6 ];
|
||||||
|
var ys = concatMap(xs, function (x) {
|
||||||
|
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
|
||||||
|
});
|
||||||
|
console.dir(ys);
|
||||||
|
```
|
||||||
|
|
||||||
|
***
|
||||||
|
|
||||||
|
```
|
||||||
|
[ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]
|
||||||
|
```
|
||||||
|
|
||||||
|
methods
|
||||||
|
=======
|
||||||
|
|
||||||
|
``` js
|
||||||
|
var concatMap = require('concat-map')
|
||||||
|
```
|
||||||
|
|
||||||
|
concatMap(xs, fn)
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Return an array of concatenated elements by calling `fn(x, i)` for each element
|
||||||
|
`x` and each index `i` in the array `xs`.
|
||||||
|
|
||||||
|
When `fn(x, i)` returns an array, its result will be concatenated with the
|
||||||
|
result array. If `fn(x, i)` returns anything else, that value will be pushed
|
||||||
|
onto the end of the result array.
|
||||||
|
|
||||||
|
install
|
||||||
|
=======
|
||||||
|
|
||||||
|
With [npm](http://npmjs.org) do:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install concat-map
|
||||||
|
```
|
||||||
|
|
||||||
|
license
|
||||||
|
=======
|
||||||
|
|
||||||
|
MIT
|
||||||
|
|
||||||
|
notes
|
||||||
|
=====
|
||||||
|
|
||||||
|
This module was written while sitting high above the ground in a tree.
|
6
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js
generated
vendored
Normal file
6
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/example/map.js
generated
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
var concatMap = require('../');
|
||||||
|
var xs = [ 1, 2, 3, 4, 5, 6 ];
|
||||||
|
var ys = concatMap(xs, function (x) {
|
||||||
|
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
|
||||||
|
});
|
||||||
|
console.dir(ys);
|
13
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js
generated
vendored
Normal file
13
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/index.js
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
module.exports = function (xs, fn) {
|
||||||
|
var res = [];
|
||||||
|
for (var i = 0; i < xs.length; i++) {
|
||||||
|
var x = fn(xs[i], i);
|
||||||
|
if (isArray(x)) res.push.apply(res, x);
|
||||||
|
else res.push(x);
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
|
var isArray = Array.isArray || function (xs) {
|
||||||
|
return Object.prototype.toString.call(xs) === '[object Array]';
|
||||||
|
};
|
83
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json
generated
vendored
Normal file
83
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/package.json
generated
vendored
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
{
|
||||||
|
"name": "concat-map",
|
||||||
|
"description": "concatenative mapdashery",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/substack/node-concat-map.git"
|
||||||
|
},
|
||||||
|
"main": "index.js",
|
||||||
|
"keywords": [
|
||||||
|
"concat",
|
||||||
|
"concatMap",
|
||||||
|
"map",
|
||||||
|
"functional",
|
||||||
|
"higher-order"
|
||||||
|
],
|
||||||
|
"directories": {
|
||||||
|
"example": "example",
|
||||||
|
"test": "test"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"test": "tape test/*.js"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tape": "~2.4.0"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"author": {
|
||||||
|
"name": "James Halliday",
|
||||||
|
"email": "mail@substack.net",
|
||||||
|
"url": "http://substack.net"
|
||||||
|
},
|
||||||
|
"testling": {
|
||||||
|
"files": "test/*.js",
|
||||||
|
"browsers": {
|
||||||
|
"ie": [
|
||||||
|
6,
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
9
|
||||||
|
],
|
||||||
|
"ff": [
|
||||||
|
3.5,
|
||||||
|
10,
|
||||||
|
15
|
||||||
|
],
|
||||||
|
"chrome": [
|
||||||
|
10,
|
||||||
|
22
|
||||||
|
],
|
||||||
|
"safari": [
|
||||||
|
5.1
|
||||||
|
],
|
||||||
|
"opera": [
|
||||||
|
12
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/substack/node-concat-map/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/substack/node-concat-map",
|
||||||
|
"_id": "concat-map@0.0.1",
|
||||||
|
"dist": {
|
||||||
|
"shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
|
||||||
|
"tarball": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
|
||||||
|
},
|
||||||
|
"_from": "concat-map@0.0.1",
|
||||||
|
"_npmVersion": "1.3.21",
|
||||||
|
"_npmUser": {
|
||||||
|
"name": "substack",
|
||||||
|
"email": "mail@substack.net"
|
||||||
|
},
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "substack",
|
||||||
|
"email": "mail@substack.net"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"_shasum": "d8a96bd77fd68df7793a73036a3ba0d5405d477b",
|
||||||
|
"_resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
|
||||||
|
"readme": "ERROR: No README data found!"
|
||||||
|
}
|
39
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js
generated
vendored
Normal file
39
js/node/node_modules/minimatch/node_modules/brace-expansion/node_modules/concat-map/test/map.js
generated
vendored
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
var concatMap = require('../');
|
||||||
|
var test = require('tape');
|
||||||
|
|
||||||
|
test('empty or not', function (t) {
|
||||||
|
var xs = [ 1, 2, 3, 4, 5, 6 ];
|
||||||
|
var ixes = [];
|
||||||
|
var ys = concatMap(xs, function (x, ix) {
|
||||||
|
ixes.push(ix);
|
||||||
|
return x % 2 ? [ x - 0.1, x, x + 0.1 ] : [];
|
||||||
|
});
|
||||||
|
t.same(ys, [ 0.9, 1, 1.1, 2.9, 3, 3.1, 4.9, 5, 5.1 ]);
|
||||||
|
t.same(ixes, [ 0, 1, 2, 3, 4, 5 ]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('always something', function (t) {
|
||||||
|
var xs = [ 'a', 'b', 'c', 'd' ];
|
||||||
|
var ys = concatMap(xs, function (x) {
|
||||||
|
return x === 'b' ? [ 'B', 'B', 'B' ] : [ x ];
|
||||||
|
});
|
||||||
|
t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('scalars', function (t) {
|
||||||
|
var xs = [ 'a', 'b', 'c', 'd' ];
|
||||||
|
var ys = concatMap(xs, function (x) {
|
||||||
|
return x === 'b' ? [ 'B', 'B', 'B' ] : x;
|
||||||
|
});
|
||||||
|
t.same(ys, [ 'a', 'B', 'B', 'B', 'c', 'd' ]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('undefs', function (t) {
|
||||||
|
var xs = [ 'a', 'b', 'c', 'd' ];
|
||||||
|
var ys = concatMap(xs, function () {});
|
||||||
|
t.same(ys, [ undefined, undefined, undefined, undefined ]);
|
||||||
|
t.end();
|
||||||
|
});
|
75
js/node/node_modules/minimatch/node_modules/brace-expansion/package.json
generated
vendored
Normal file
75
js/node/node_modules/minimatch/node_modules/brace-expansion/package.json
generated
vendored
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
{
|
||||||
|
"name": "brace-expansion",
|
||||||
|
"description": "Brace expansion as known from sh/bash",
|
||||||
|
"version": "1.1.0",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/juliangruber/brace-expansion.git"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/juliangruber/brace-expansion",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tape test/*.js",
|
||||||
|
"gentest": "bash test/generate.sh"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"balanced-match": "^0.2.0",
|
||||||
|
"concat-map": "0.0.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tape": "^3.0.3"
|
||||||
|
},
|
||||||
|
"keywords": [],
|
||||||
|
"author": {
|
||||||
|
"name": "Julian Gruber",
|
||||||
|
"email": "mail@juliangruber.com",
|
||||||
|
"url": "http://juliangruber.com"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"testling": {
|
||||||
|
"files": "test/*.js",
|
||||||
|
"browsers": [
|
||||||
|
"ie/8..latest",
|
||||||
|
"firefox/20..latest",
|
||||||
|
"firefox/nightly",
|
||||||
|
"chrome/25..latest",
|
||||||
|
"chrome/canary",
|
||||||
|
"opera/12..latest",
|
||||||
|
"opera/next",
|
||||||
|
"safari/5.1..latest",
|
||||||
|
"ipad/6.0..latest",
|
||||||
|
"iphone/6.0..latest",
|
||||||
|
"android-browser/4.2..latest"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"gitHead": "b5fa3b1c74e5e2dba2d0efa19b28335641bc1164",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/juliangruber/brace-expansion/issues"
|
||||||
|
},
|
||||||
|
"_id": "brace-expansion@1.1.0",
|
||||||
|
"_shasum": "c9b7d03c03f37bc704be100e522b40db8f6cfcd9",
|
||||||
|
"_from": "brace-expansion@>=1.0.0 <2.0.0",
|
||||||
|
"_npmVersion": "2.1.10",
|
||||||
|
"_nodeVersion": "0.10.32",
|
||||||
|
"_npmUser": {
|
||||||
|
"name": "juliangruber",
|
||||||
|
"email": "julian@juliangruber.com"
|
||||||
|
},
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "juliangruber",
|
||||||
|
"email": "julian@juliangruber.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "isaacs",
|
||||||
|
"email": "isaacs@npmjs.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dist": {
|
||||||
|
"shasum": "c9b7d03c03f37bc704be100e522b40db8f6cfcd9",
|
||||||
|
"tarball": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz"
|
||||||
|
},
|
||||||
|
"directories": {},
|
||||||
|
"_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.0.tgz",
|
||||||
|
"readme": "ERROR: No README data found!"
|
||||||
|
}
|
32
js/node/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js
generated
vendored
Normal file
32
js/node/node_modules/minimatch/node_modules/brace-expansion/test/bash-comparison.js
generated
vendored
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
var fs = require('fs');
|
||||||
|
var resfile = __dirname + '/bash-results.txt';
|
||||||
|
var cases = fs.readFileSync(resfile, 'utf8').split('><><><><');
|
||||||
|
|
||||||
|
// throw away the EOF marker
|
||||||
|
cases.pop()
|
||||||
|
|
||||||
|
test('matches bash expansions', function(t) {
|
||||||
|
cases.forEach(function(testcase) {
|
||||||
|
var set = testcase.split('\n');
|
||||||
|
var pattern = set.shift();
|
||||||
|
var actual = expand(pattern);
|
||||||
|
|
||||||
|
// If it expands to the empty string, then it's actually
|
||||||
|
// just nothing, but Bash is a singly typed language, so
|
||||||
|
// "nothing" is the same as "".
|
||||||
|
if (set.length === 1 && set[0] === '') {
|
||||||
|
set = []
|
||||||
|
} else {
|
||||||
|
// otherwise, strip off the [] that were added so that
|
||||||
|
// "" expansions would be preserved properly.
|
||||||
|
set = set.map(function (s) {
|
||||||
|
return s.replace(/^\[|\]$/g, '')
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
t.same(actual, set, pattern);
|
||||||
|
});
|
||||||
|
t.end();
|
||||||
|
})
|
1075
js/node/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt
generated
vendored
Normal file
1075
js/node/node_modules/minimatch/node_modules/brace-expansion/test/bash-results.txt
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
182
js/node/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt
generated
vendored
Normal file
182
js/node/node_modules/minimatch/node_modules/brace-expansion/test/cases.txt
generated
vendored
Normal file
|
@ -0,0 +1,182 @@
|
||||||
|
# skip quotes for now
|
||||||
|
# "{x,x}"
|
||||||
|
# {"x,x"}
|
||||||
|
# {x","x}
|
||||||
|
# '{a,b}{{a,b},a,b}'
|
||||||
|
A{b,{d,e},{f,g}}Z
|
||||||
|
PRE-{a,b}{{a,b},a,b}-POST
|
||||||
|
\\{a,b}{{a,b},a,b}
|
||||||
|
{{a,b}
|
||||||
|
{a,b}}
|
||||||
|
{,}
|
||||||
|
a{,}
|
||||||
|
{,}b
|
||||||
|
a{,}b
|
||||||
|
a{b}c
|
||||||
|
a{1..5}b
|
||||||
|
a{01..5}b
|
||||||
|
a{-01..5}b
|
||||||
|
a{-01..5..3}b
|
||||||
|
a{001..9}b
|
||||||
|
a{b,c{d,e},{f,g}h}x{y,z
|
||||||
|
a{b,c{d,e},{f,g}h}x{y,z\\}
|
||||||
|
a{b,c{d,e},{f,g}h}x{y,z}
|
||||||
|
a{b{c{d,e}f{x,y{{g}h
|
||||||
|
a{b{c{d,e}f{x,y{}g}h
|
||||||
|
a{b{c{d,e}f{x,y}}g}h
|
||||||
|
a{b{c{d,e}f}g}h
|
||||||
|
a{{x,y},z}b
|
||||||
|
f{x,y{g,z}}h
|
||||||
|
f{x,y{{g,z}}h
|
||||||
|
f{x,y{{g,z}}h}
|
||||||
|
f{x,y{{g}h
|
||||||
|
f{x,y{{g}}h
|
||||||
|
f{x,y{}g}h
|
||||||
|
z{a,b{,c}d
|
||||||
|
z{a,b},c}d
|
||||||
|
{-01..5}
|
||||||
|
{-05..100..5}
|
||||||
|
{-05..100}
|
||||||
|
{0..5..2}
|
||||||
|
{0001..05..2}
|
||||||
|
{0001..-5..2}
|
||||||
|
{0001..-5..-2}
|
||||||
|
{0001..5..-2}
|
||||||
|
{01..5}
|
||||||
|
{1..05}
|
||||||
|
{1..05..3}
|
||||||
|
{05..100}
|
||||||
|
{0a..0z}
|
||||||
|
{a,b\\}c,d}
|
||||||
|
{a,b{c,d}
|
||||||
|
{a,b}c,d}
|
||||||
|
{a..F}
|
||||||
|
{A..f}
|
||||||
|
{a..Z}
|
||||||
|
{A..z}
|
||||||
|
{z..A}
|
||||||
|
{Z..a}
|
||||||
|
{a..F..2}
|
||||||
|
{A..f..02}
|
||||||
|
{a..Z..5}
|
||||||
|
d{a..Z..5}b
|
||||||
|
{A..z..10}
|
||||||
|
{z..A..-2}
|
||||||
|
{Z..a..20}
|
||||||
|
{a{,b}
|
||||||
|
{a},b}
|
||||||
|
{x,y{,}g}
|
||||||
|
{x,y{}g}
|
||||||
|
{{a,b}
|
||||||
|
{{a,b},c}
|
||||||
|
{{a,b}c}
|
||||||
|
{{a,b},}
|
||||||
|
X{{a,b},}X
|
||||||
|
{{a,b},}c
|
||||||
|
{{a,b}.}
|
||||||
|
{{a,b}}
|
||||||
|
X{a..#}X
|
||||||
|
# this next one is an empty string
|
||||||
|
|
||||||
|
{-10..00}
|
||||||
|
# Need to escape slashes in here for reasons i guess.
|
||||||
|
{a,\\\\{a,b}c}
|
||||||
|
{a,\\{a,b}c}
|
||||||
|
a,\\{b,c}
|
||||||
|
{-10.\\.00}
|
||||||
|
#### bash tests/braces.tests
|
||||||
|
# Note that some tests are edited out because some features of
|
||||||
|
# bash are intentionally not supported in this brace expander.
|
||||||
|
ff{c,b,a}
|
||||||
|
f{d,e,f}g
|
||||||
|
{l,n,m}xyz
|
||||||
|
{abc\\,def}
|
||||||
|
{abc}
|
||||||
|
{x\\,y,\\{abc\\},trie}
|
||||||
|
# not impementing back-ticks obviously
|
||||||
|
# XXXX\\{`echo a b c | tr ' ' ','`\\}
|
||||||
|
{}
|
||||||
|
# We only ever have to worry about parsing a single argument,
|
||||||
|
# not a command line, so spaces have a different meaning than bash.
|
||||||
|
# { }
|
||||||
|
}
|
||||||
|
{
|
||||||
|
abcd{efgh
|
||||||
|
# spaces
|
||||||
|
# foo {1,2} bar
|
||||||
|
# not impementing back-ticks obviously
|
||||||
|
# `zecho foo {1,2} bar`
|
||||||
|
# $(zecho foo {1,2} bar)
|
||||||
|
# ${var} is not a variable here, like it is in bash. omit.
|
||||||
|
# foo{bar,${var}.}
|
||||||
|
# foo{bar,${var}}
|
||||||
|
# isaacs: skip quotes for now
|
||||||
|
# "${var}"{x,y}
|
||||||
|
# $var{x,y}
|
||||||
|
# ${var}{x,y}
|
||||||
|
# new sequence brace operators
|
||||||
|
{1..10}
|
||||||
|
# this doesn't work yet
|
||||||
|
{0..10,braces}
|
||||||
|
# but this does
|
||||||
|
{{0..10},braces}
|
||||||
|
x{{0..10},braces}y
|
||||||
|
{3..3}
|
||||||
|
x{3..3}y
|
||||||
|
{10..1}
|
||||||
|
{10..1}y
|
||||||
|
x{10..1}y
|
||||||
|
{a..f}
|
||||||
|
{f..a}
|
||||||
|
{a..A}
|
||||||
|
{A..a}
|
||||||
|
{f..f}
|
||||||
|
# mixes are incorrectly-formed brace expansions
|
||||||
|
{1..f}
|
||||||
|
{f..1}
|
||||||
|
# spaces
|
||||||
|
# 0{1..9} {10..20}
|
||||||
|
# do negative numbers work?
|
||||||
|
{-1..-10}
|
||||||
|
{-20..0}
|
||||||
|
# weirdly-formed brace expansions -- fixed in post-bash-3.1
|
||||||
|
a-{b{d,e}}-c
|
||||||
|
a-{bdef-{g,i}-c
|
||||||
|
# isaacs: skip quotes for now
|
||||||
|
# {"klklkl"}{1,2,3}
|
||||||
|
# isaacs: this is a valid test, though
|
||||||
|
{klklkl}{1,2,3}
|
||||||
|
# {"x,x"}
|
||||||
|
{1..10..2}
|
||||||
|
{-1..-10..2}
|
||||||
|
{-1..-10..-2}
|
||||||
|
{10..1..-2}
|
||||||
|
{10..1..2}
|
||||||
|
{1..20..2}
|
||||||
|
{1..20..20}
|
||||||
|
{100..0..5}
|
||||||
|
{100..0..-5}
|
||||||
|
{a..z}
|
||||||
|
{a..z..2}
|
||||||
|
{z..a..-2}
|
||||||
|
# make sure brace expansion handles ints > 2**31 - 1 using intmax_t
|
||||||
|
{2147483645..2147483649}
|
||||||
|
# unwanted zero-padding -- fixed post-bash-4.0
|
||||||
|
{10..0..2}
|
||||||
|
{10..0..-2}
|
||||||
|
{-50..-0..5}
|
||||||
|
# bad
|
||||||
|
{1..10.f}
|
||||||
|
{1..ff}
|
||||||
|
{1..10..ff}
|
||||||
|
{1.20..2}
|
||||||
|
{1..20..f2}
|
||||||
|
{1..20..2f}
|
||||||
|
{1..2f..2}
|
||||||
|
{1..ff..2}
|
||||||
|
{1..ff}
|
||||||
|
{1..f}
|
||||||
|
{1..0f}
|
||||||
|
{1..10f}
|
||||||
|
{1..10.f}
|
||||||
|
{1..10.f}
|
9
js/node/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js
generated
vendored
Normal file
9
js/node/node_modules/minimatch/node_modules/brace-expansion/test/dollar.js
generated
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('ignores ${', function(t) {
|
||||||
|
t.deepEqual(expand('${1..3}'), ['${1..3}']);
|
||||||
|
t.deepEqual(expand('${a,b}${c,d}'), ['${a,b}${c,d}']);
|
||||||
|
t.deepEqual(expand('x${a,b}x${c,d}x'), ['x${a,b}x${c,d}x']);
|
||||||
|
t.end();
|
||||||
|
});
|
10
js/node/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js
generated
vendored
Normal file
10
js/node/node_modules/minimatch/node_modules/brace-expansion/test/empty-option.js
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('empty option', function(t) {
|
||||||
|
t.deepEqual(expand('-v{,,,,}'), [
|
||||||
|
'-v', '-v', '-v', '-v', '-v'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
24
js/node/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh
generated
vendored
Normal file
24
js/node/node_modules/minimatch/node_modules/brace-expansion/test/generate.sh
generated
vendored
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Bash 4.3 because of arbitrary need to pick a single standard.
|
||||||
|
|
||||||
|
if [ "${BASH_VERSINFO[0]}" != "4" ] || [ "${BASH_VERSINFO[1]}" != "3" ]; then
|
||||||
|
echo "this script requires bash 4.3" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
CDPATH= cd "$(dirname "$0")"
|
||||||
|
|
||||||
|
js='require("./")(process.argv[1]).join(" ")'
|
||||||
|
|
||||||
|
cat cases.txt | \
|
||||||
|
while read case; do
|
||||||
|
if [ "${case:0:1}" = "#" ]; then
|
||||||
|
continue;
|
||||||
|
fi;
|
||||||
|
b="$($BASH -c 'for c in '"$case"'; do echo ["$c"]; done')"
|
||||||
|
echo "$case"
|
||||||
|
echo -n "$b><><><><";
|
||||||
|
done > bash-results.txt
|
15
js/node/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js
generated
vendored
Normal file
15
js/node/node_modules/minimatch/node_modules/brace-expansion/test/negative-increment.js
generated
vendored
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('negative increment', function(t) {
|
||||||
|
t.deepEqual(expand('{3..1}'), ['3', '2', '1']);
|
||||||
|
t.deepEqual(expand('{10..8}'), ['10', '9', '8']);
|
||||||
|
t.deepEqual(expand('{10..08}'), ['10', '09', '08']);
|
||||||
|
t.deepEqual(expand('{c..a}'), ['c', 'b', 'a']);
|
||||||
|
|
||||||
|
t.deepEqual(expand('{4..0..2}'), ['4', '2', '0']);
|
||||||
|
t.deepEqual(expand('{4..0..-2}'), ['4', '2', '0']);
|
||||||
|
t.deepEqual(expand('{e..a..2}'), ['e', 'c', 'a']);
|
||||||
|
|
||||||
|
t.end();
|
||||||
|
});
|
16
js/node/node_modules/minimatch/node_modules/brace-expansion/test/nested.js
generated
vendored
Normal file
16
js/node/node_modules/minimatch/node_modules/brace-expansion/test/nested.js
generated
vendored
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('nested', function(t) {
|
||||||
|
t.deepEqual(expand('{a,b{1..3},c}'), [
|
||||||
|
'a', 'b1', 'b2', 'b3', 'c'
|
||||||
|
]);
|
||||||
|
t.deepEqual(expand('{{A..Z},{a..z}}'),
|
||||||
|
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('')
|
||||||
|
);
|
||||||
|
t.deepEqual(expand('ppp{,config,oe{,conf}}'), [
|
||||||
|
'ppp', 'pppconfig', 'pppoe', 'pppoeconf'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
10
js/node/node_modules/minimatch/node_modules/brace-expansion/test/order.js
generated
vendored
Normal file
10
js/node/node_modules/minimatch/node_modules/brace-expansion/test/order.js
generated
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('order', function(t) {
|
||||||
|
t.deepEqual(expand('a{d,c,b}e'), [
|
||||||
|
'ade', 'ace', 'abe'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
13
js/node/node_modules/minimatch/node_modules/brace-expansion/test/pad.js
generated
vendored
Normal file
13
js/node/node_modules/minimatch/node_modules/brace-expansion/test/pad.js
generated
vendored
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('pad', function(t) {
|
||||||
|
t.deepEqual(expand('{9..11}'), [
|
||||||
|
'9', '10', '11'
|
||||||
|
]);
|
||||||
|
t.deepEqual(expand('{09..11}'), [
|
||||||
|
'09', '10', '11'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
7
js/node/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js
generated
vendored
Normal file
7
js/node/node_modules/minimatch/node_modules/brace-expansion/test/same-type.js
generated
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('x and y of same type', function(t) {
|
||||||
|
t.deepEqual(expand('{a..9}'), ['{a..9}']);
|
||||||
|
t.end();
|
||||||
|
});
|
50
js/node/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js
generated
vendored
Normal file
50
js/node/node_modules/minimatch/node_modules/brace-expansion/test/sequence.js
generated
vendored
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
var test = require('tape');
|
||||||
|
var expand = require('..');
|
||||||
|
|
||||||
|
test('numeric sequences', function(t) {
|
||||||
|
t.deepEqual(expand('a{1..2}b{2..3}c'), [
|
||||||
|
'a1b2c', 'a1b3c', 'a2b2c', 'a2b3c'
|
||||||
|
]);
|
||||||
|
t.deepEqual(expand('{1..2}{2..3}'), [
|
||||||
|
'12', '13', '22', '23'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('numeric sequences with step count', function(t) {
|
||||||
|
t.deepEqual(expand('{0..8..2}'), [
|
||||||
|
'0', '2', '4', '6', '8'
|
||||||
|
]);
|
||||||
|
t.deepEqual(expand('{1..8..2}'), [
|
||||||
|
'1', '3', '5', '7'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('numeric sequence with negative x / y', function(t) {
|
||||||
|
t.deepEqual(expand('{3..-2}'), [
|
||||||
|
'3', '2', '1', '0', '-1', '-2'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('alphabetic sequences', function(t) {
|
||||||
|
t.deepEqual(expand('1{a..b}2{b..c}3'), [
|
||||||
|
'1a2b3', '1a2c3', '1b2b3', '1b2c3'
|
||||||
|
]);
|
||||||
|
t.deepEqual(expand('{a..b}{b..c}'), [
|
||||||
|
'ab', 'ac', 'bb', 'bc'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('alphabetic sequences with step count', function(t) {
|
||||||
|
t.deepEqual(expand('{a..k..2}'), [
|
||||||
|
'a', 'c', 'e', 'g', 'i', 'k'
|
||||||
|
]);
|
||||||
|
t.deepEqual(expand('{b..k..2}'), [
|
||||||
|
'b', 'd', 'f', 'h', 'j'
|
||||||
|
]);
|
||||||
|
t.end();
|
||||||
|
});
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
{
|
||||||
|
"author": {
|
||||||
|
"name": "Isaac Z. Schlueter",
|
||||||
|
"email": "i@izs.me",
|
||||||
|
"url": "http://blog.izs.me"
|
||||||
|
},
|
||||||
|
"name": "minimatch",
|
||||||
|
"description": "a glob matcher in javascript",
|
||||||
|
"version": "2.0.4",
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git://github.com/isaacs/minimatch.git"
|
||||||
|
},
|
||||||
|
"main": "minimatch.js",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tap test/*.js",
|
||||||
|
"prepublish": "browserify -o browser.js -e minimatch.js --bare"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "*"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"brace-expansion": "^1.0.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"browserify": "^9.0.3",
|
||||||
|
"tap": ""
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"type": "MIT",
|
||||||
|
"url": "http://github.com/isaacs/minimatch/raw/master/LICENSE"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"minimatch.js",
|
||||||
|
"browser.js"
|
||||||
|
],
|
||||||
|
"gitHead": "c75d17c23df3b6050338ee654a58490255b36ebc",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/isaacs/minimatch/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/isaacs/minimatch",
|
||||||
|
"_id": "minimatch@2.0.4",
|
||||||
|
"_shasum": "83bea115803e7a097a78022427287edb762fafed",
|
||||||
|
"_from": "minimatch@*",
|
||||||
|
"_npmVersion": "2.7.1",
|
||||||
|
"_nodeVersion": "1.4.2",
|
||||||
|
"_npmUser": {
|
||||||
|
"name": "isaacs",
|
||||||
|
"email": "i@izs.me"
|
||||||
|
},
|
||||||
|
"maintainers": [
|
||||||
|
{
|
||||||
|
"name": "isaacs",
|
||||||
|
"email": "i@izs.me"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dist": {
|
||||||
|
"shasum": "83bea115803e7a097a78022427287edb762fafed",
|
||||||
|
"tarball": "http://registry.npmjs.org/minimatch/-/minimatch-2.0.4.tgz"
|
||||||
|
},
|
||||||
|
"directories": {},
|
||||||
|
"_resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.4.tgz",
|
||||||
|
"readme": "ERROR: No README data found!"
|
||||||
|
}
|
|
@ -16,6 +16,7 @@
|
||||||
"joi": "6.0.8",
|
"joi": "6.0.8",
|
||||||
"jshint": "2.6.3",
|
"jshint": "2.6.3",
|
||||||
"marked": "0.3.3",
|
"marked": "0.3.3",
|
||||||
|
"minimatch": "2.0.4",
|
||||||
"mocha": "^2.2.1",
|
"mocha": "^2.2.1",
|
||||||
"moment": "2.9.0",
|
"moment": "2.9.0",
|
||||||
"numeral": "1.5.3",
|
"numeral": "1.5.3",
|
||||||
|
|
Loading…
Reference in New Issue