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",
|
||||
"jshint": "2.6.3",
|
||||
"marked": "0.3.3",
|
||||
"minimatch": "2.0.4",
|
||||
"mocha": "^2.2.1",
|
||||
"moment": "2.9.0",
|
||||
"numeral": "1.5.3",
|
||||
|
|
Loading…
Reference in New Issue