minimatch 0.2.11 → 0.2.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/minimatch.js CHANGED
@@ -804,7 +804,7 @@ function makeRe () {
804
804
 
805
805
  // must match entire pattern
806
806
  // ending in a * or ** will make it less strict.
807
- re = "^" + re + "$"
807
+ re = "^(?:" + re + ")$"
808
808
 
809
809
  // can match anything, as long as it's not this.
810
810
  if (this.negate) re = "^(?!" + re + ").*$"
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me)",
3
3
  "name": "minimatch",
4
4
  "description": "a glob matcher in javascript",
5
- "version": "0.2.11",
5
+ "version": "0.2.12",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "git://github.com/isaacs/minimatch.git"
package/test/basic.js CHANGED
@@ -13,274 +13,376 @@ var tap = require("tap")
13
13
  , next = files.concat([ "a-b", "aXb"
14
14
  , ".x", ".y" ])
15
15
 
16
+
17
+ var patterns =
18
+ [ "http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test"
19
+ , ["a*", ["a", "abc", "abd", "abe"]]
20
+ , ["X*", ["X*"], {nonull: true}]
21
+
22
+ // allow null glob expansion
23
+ , ["X*", []]
24
+
25
+ // isaacs: Slightly different than bash/sh/ksh
26
+ // \\* is not un-escaped to literal "*" in a failed match,
27
+ // but it does make it get treated as a literal star
28
+ , ["\\*", ["\\*"], {nonull: true}]
29
+ , ["\\**", ["\\**"], {nonull: true}]
30
+ , ["\\*\\*", ["\\*\\*"], {nonull: true}]
31
+
32
+ , ["b*/", ["bdir/"]]
33
+ , ["c*", ["c", "ca", "cb"]]
34
+ , ["**", files]
35
+
36
+ , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}]
37
+ , ["s/\\..*//", ["s/\\..*//"], {nonull: true}]
38
+
39
+ , "legendary larry crashes bashes"
40
+ , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"
41
+ , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}]
42
+ , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"
43
+ , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}]
44
+
45
+ , "character classes"
46
+ , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]]
47
+ , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd",
48
+ "bdir/", "ca", "cb", "dd", "de"]]
49
+ , ["a*[^c]", ["abd", "abe"]]
50
+ , function () { files.push("a-b", "aXb") }
51
+ , ["a[X-]b", ["a-b", "aXb"]]
52
+ , function () { files.push(".x", ".y") }
53
+ , ["[^a-c]*", ["d", "dd", "de"]]
54
+ , function () { files.push("a*b/", "a*b/ooo") }
55
+ , ["a\\*b/*", ["a*b/ooo"]]
56
+ , ["a\\*?/*", ["a*b/ooo"]]
57
+ , ["*\\\\!*", [], {null: true}, ["echo !7"]]
58
+ , ["*\\!*", ["echo !7"], null, ["echo !7"]]
59
+ , ["*.\\*", ["r.*"], null, ["r.*"]]
60
+ , ["a[b]c", ["abc"]]
61
+ , ["a[\\b]c", ["abc"]]
62
+ , ["a?c", ["abc"]]
63
+ , ["a\\*c", [], {null: true}, ["abc"]]
64
+ , ["", [""], { null: true }, [""]]
65
+
66
+ , "http://www.opensource.apple.com/source/bash/bash-23/" +
67
+ "bash/tests/glob-test"
68
+ , function () { files.push("man/", "man/man1/", "man/man1/bash.1") }
69
+ , ["*/man*/bash.*", ["man/man1/bash.1"]]
70
+ , ["man/man1/bash.1", ["man/man1/bash.1"]]
71
+ , ["a***c", ["abc"], null, ["abc"]]
72
+ , ["a*****?c", ["abc"], null, ["abc"]]
73
+ , ["?*****??", ["abc"], null, ["abc"]]
74
+ , ["*****??", ["abc"], null, ["abc"]]
75
+ , ["?*****?c", ["abc"], null, ["abc"]]
76
+ , ["?***?****c", ["abc"], null, ["abc"]]
77
+ , ["?***?****?", ["abc"], null, ["abc"]]
78
+ , ["?***?****", ["abc"], null, ["abc"]]
79
+ , ["*******c", ["abc"], null, ["abc"]]
80
+ , ["*******?", ["abc"], null, ["abc"]]
81
+ , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
82
+ , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
83
+ , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]]
84
+ , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
85
+ , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]]
86
+ , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]]
87
+ , ["[-abc]", ["-"], null, ["-"]]
88
+ , ["[abc-]", ["-"], null, ["-"]]
89
+ , ["\\", ["\\"], null, ["\\"]]
90
+ , ["[\\\\]", ["\\"], null, ["\\"]]
91
+ , ["[[]", ["["], null, ["["]]
92
+ , ["[", ["["], null, ["["]]
93
+ , ["[*", ["[abc"], null, ["[abc"]]
94
+ , "a right bracket shall lose its special meaning and\n" +
95
+ "represent itself in a bracket expression if it occurs\n" +
96
+ "first in the list. -- POSIX.2 2.8.3.2"
97
+ , ["[]]", ["]"], null, ["]"]]
98
+ , ["[]-]", ["]"], null, ["]"]]
99
+ , ["[a-\z]", ["p"], null, ["p"]]
100
+ , ["??**********?****?", [], { null: true }, ["abc"]]
101
+ , ["??**********?****c", [], { null: true }, ["abc"]]
102
+ , ["?************c****?****", [], { null: true }, ["abc"]]
103
+ , ["*c*?**", [], { null: true }, ["abc"]]
104
+ , ["a*****c*?**", [], { null: true }, ["abc"]]
105
+ , ["a********???*******", [], { null: true }, ["abc"]]
106
+ , ["[]", [], { null: true }, ["a"]]
107
+ , ["[abc", [], { null: true }, ["["]]
108
+
109
+ , "nocase tests"
110
+ , ["XYZ", ["xYz"], { nocase: true, null: true }
111
+ , ["xYz", "ABC", "IjK"]]
112
+ , ["ab*", ["ABC"], { nocase: true, null: true }
113
+ , ["xYz", "ABC", "IjK"]]
114
+ , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true }
115
+ , ["xYz", "ABC", "IjK"]]
116
+
117
+ // [ pattern, [matches], MM opts, files, TAP opts]
118
+ , "onestar/twostar"
119
+ , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]]
120
+ , ["{/?,*}", ["/a", "bb"], {null: true}
121
+ , ["/a", "/b/b", "/a/b/c", "bb"]]
122
+
123
+ , "dots should not match unless requested"
124
+ , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]]
125
+
126
+ // .. and . can only match patterns starting with .,
127
+ // even when options.dot is set.
128
+ , function () {
129
+ files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"]
130
+ }
131
+ , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}]
132
+ , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}]
133
+ , ["a/*/b", ["a/c/b"], {dot:false}]
134
+ , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}]
135
+
136
+
137
+ // this also tests that changing the options needs
138
+ // to change the cache key, even if the pattern is
139
+ // the same!
140
+ , ["**", ["a/b","a/.d",".a/.d"], { dot: true }
141
+ , [ ".a/.d", "a/.d", "a/b"]]
142
+
143
+ , "paren sets cannot contain slashes"
144
+ , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]]
145
+
146
+ // brace sets trump all else.
147
+ //
148
+ // invalid glob pattern. fails on bash4 and bsdglob.
149
+ // however, in this implementation, it's easier just
150
+ // to do the intuitive thing, and let brace-expansion
151
+ // actually come before parsing any extglob patterns,
152
+ // like the documentation seems to say.
153
+ //
154
+ // XXX: if anyone complains about this, either fix it
155
+ // or tell them to grow up and stop complaining.
156
+ //
157
+ // bash/bsdglob says this:
158
+ // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]]
159
+ // but we do this instead:
160
+ , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]]
161
+
162
+ // test partial parsing in the presence of comment/negation chars
163
+ , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]]
164
+ , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]]
165
+
166
+ // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped.
167
+ , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g"
168
+ , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"]
169
+ , {}
170
+ , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]]
171
+
172
+
173
+ // crazy nested {,,} and *(||) tests.
174
+ , function () {
175
+ files = [ "a", "b", "c", "d"
176
+ , "ab", "ac", "ad"
177
+ , "bc", "cb"
178
+ , "bc,d", "c,db", "c,d"
179
+ , "d)", "(b|c", "*(b|c"
180
+ , "b|c", "b|cc", "cb|c"
181
+ , "x(a|b|c)", "x(a|c)"
182
+ , "(a|b|c)", "(a|c)"]
183
+ }
184
+ , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]]
185
+ , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]]
186
+ // a
187
+ // *(b|c)
188
+ // *(b|d)
189
+ , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]]
190
+ , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]]
191
+
192
+
193
+ // test various flag settings.
194
+ , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"]
195
+ , { noext: true } ]
196
+ , ["a?b", ["x/y/acb", "acb/"], {matchBase: true}
197
+ , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ]
198
+ , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]]
199
+
200
+
201
+ // begin channelling Boole and deMorgan...
202
+ , "negation tests"
203
+ , function () {
204
+ files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"]
205
+ }
206
+
207
+ // anything that is NOT a* matches.
208
+ , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]]
209
+
210
+ // anything that IS !a* matches.
211
+ , ["!a*", ["!ab", "!abc"], {nonegate: true}]
212
+
213
+ // anything that IS a* matches
214
+ , ["!!a*", ["a!b"]]
215
+
216
+ // anything that is NOT !a* matches
217
+ , ["!\\!a*", ["a!b", "d", "e", "\\!a"]]
218
+
219
+ // negation nestled within a pattern
220
+ , function () {
221
+ files = [ "foo.js"
222
+ , "foo.bar"
223
+ // can't match this one without negative lookbehind.
224
+ , "foo.js.js"
225
+ , "blar.js"
226
+ , "foo."
227
+ , "boo.js.boo" ]
228
+ }
229
+ , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ]
230
+
231
+ // https://github.com/isaacs/minimatch/issues/5
232
+ , function () {
233
+ files = [ 'a/b/.x/c'
234
+ , 'a/b/.x/c/d'
235
+ , 'a/b/.x/c/d/e'
236
+ , 'a/b/.x'
237
+ , 'a/b/.x/'
238
+ , 'a/.x/b'
239
+ , '.x'
240
+ , '.x/'
241
+ , '.x/a'
242
+ , '.x/a/b'
243
+ , 'a/.x/b/.x/c'
244
+ , '.x/.x' ]
245
+ }
246
+ , ["**/.x/**", [ '.x/'
247
+ , '.x/a'
248
+ , '.x/a/b'
249
+ , 'a/.x/b'
250
+ , 'a/b/.x/'
251
+ , 'a/b/.x/c'
252
+ , 'a/b/.x/c/d'
253
+ , 'a/b/.x/c/d/e' ] ]
254
+
255
+ ]
256
+
257
+ var regexps =
258
+ [ '/^(?:(?=.)a[^/]*?)$/',
259
+ '/^(?:(?=.)X[^/]*?)$/',
260
+ '/^(?:(?=.)X[^/]*?)$/',
261
+ '/^(?:\\*)$/',
262
+ '/^(?:(?=.)\\*[^/]*?)$/',
263
+ '/^(?:\\*\\*)$/',
264
+ '/^(?:(?=.)b[^/]*?\\/)$/',
265
+ '/^(?:(?=.)c[^/]*?)$/',
266
+ '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/',
267
+ '/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/',
268
+ '/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/',
269
+ '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/',
270
+ '/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/',
271
+ '/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/',
272
+ '/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/',
273
+ '/^(?:(?=.)a[^/]*?[^c])$/',
274
+ '/^(?:(?=.)a[X-]b)$/',
275
+ '/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/',
276
+ '/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/',
277
+ '/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/',
278
+ '/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/',
279
+ '/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/',
280
+ '/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/',
281
+ '/^(?:(?=.)a[b]c)$/',
282
+ '/^(?:(?=.)a[b]c)$/',
283
+ '/^(?:(?=.)a[^/]c)$/',
284
+ '/^(?:a\\*c)$/',
285
+ 'false',
286
+ '/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/',
287
+ '/^(?:man\\/man1\\/bash\\.1)$/',
288
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/',
289
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/',
290
+ '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/',
291
+ '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/',
292
+ '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/',
293
+ '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/',
294
+ '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/',
295
+ '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/',
296
+ '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/',
297
+ '/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/',
298
+ '/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/',
299
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/',
300
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/',
301
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/',
302
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/',
303
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/',
304
+ '/^(?:(?!\\.)(?=.)[-abc])$/',
305
+ '/^(?:(?!\\.)(?=.)[abc-])$/',
306
+ '/^(?:\\\\)$/',
307
+ '/^(?:(?!\\.)(?=.)[\\\\])$/',
308
+ '/^(?:(?!\\.)(?=.)[\\[])$/',
309
+ '/^(?:\\[)$/',
310
+ '/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/',
311
+ '/^(?:(?!\\.)(?=.)[\\]])$/',
312
+ '/^(?:(?!\\.)(?=.)[\\]-])$/',
313
+ '/^(?:(?!\\.)(?=.)[a-z])$/',
314
+ '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/',
315
+ '/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/',
316
+ '/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/',
317
+ '/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/',
318
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/',
319
+ '/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/',
320
+ '/^(?:\\[\\])$/',
321
+ '/^(?:\\[abc)$/',
322
+ '/^(?:(?=.)XYZ)$/i',
323
+ '/^(?:(?=.)ab[^/]*?)$/i',
324
+ '/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i',
325
+ '/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/',
326
+ '/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/',
327
+ '/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/',
328
+ '/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/',
329
+ '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/',
330
+ '/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/',
331
+ '/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/',
332
+ '/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/',
333
+ '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/',
334
+ '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/',
335
+ '/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/',
336
+ '/^(?:(?=.)\\[(?=.)#a[^/]*?)$/',
337
+ '/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/',
338
+ '/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/',
339
+ '/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/',
340
+ '/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/',
341
+ '/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/',
342
+ '/^(?:(?!\\.)(?=.)[^/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/',
343
+ '/^(?:(?=.)a[^/]b)$/',
344
+ '/^(?:(?=.)#[^/]*?)$/',
345
+ '/^(?!^(?:(?=.)a[^/]*?)$).*$/',
346
+ '/^(?:(?=.)\\!a[^/]*?)$/',
347
+ '/^(?:(?=.)a[^/]*?)$/',
348
+ '/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/',
349
+ '/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/',
350
+ '/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/' ]
351
+ var re = 0;
352
+
16
353
  tap.test("basic tests", function (t) {
17
354
  var start = Date.now()
18
355
 
19
356
  // [ pattern, [matches], MM opts, files, TAP opts]
20
- ; [ "http://www.bashcookbook.com/bashinfo" +
21
- "/source/bash-1.14.7/tests/glob-test"
22
- , ["a*", ["a", "abc", "abd", "abe"]]
23
- , ["X*", ["X*"], {nonull: true}]
24
-
25
- // allow null glob expansion
26
- , ["X*", []]
27
-
28
- // isaacs: Slightly different than bash/sh/ksh
29
- // \\* is not un-escaped to literal "*" in a failed match,
30
- // but it does make it get treated as a literal star
31
- , ["\\*", ["\\*"], {nonull: true}]
32
- , ["\\**", ["\\**"], {nonull: true}]
33
- , ["\\*\\*", ["\\*\\*"], {nonull: true}]
34
-
35
- , ["b*/", ["bdir/"]]
36
- , ["c*", ["c", "ca", "cb"]]
37
- , ["**", files]
38
-
39
- , ["\\.\\./*/", ["\\.\\./*/"], {nonull: true}]
40
- , ["s/\\..*//", ["s/\\..*//"], {nonull: true}]
41
-
42
- , "legendary larry crashes bashes"
43
- , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"
44
- , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/"], {nonull: true}]
45
- , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"
46
- , ["/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\1/"], {nonull: true}]
47
-
48
- , "character classes"
49
- , ["[a-c]b*", ["abc", "abd", "abe", "bb", "cb"]]
50
- , ["[a-y]*[^c]", ["abd", "abe", "bb", "bcd",
51
- "bdir/", "ca", "cb", "dd", "de"]]
52
- , ["a*[^c]", ["abd", "abe"]]
53
- , function () { files.push("a-b", "aXb") }
54
- , ["a[X-]b", ["a-b", "aXb"]]
55
- , function () { files.push(".x", ".y") }
56
- , ["[^a-c]*", ["d", "dd", "de"]]
57
- , function () { files.push("a*b/", "a*b/ooo") }
58
- , ["a\\*b/*", ["a*b/ooo"]]
59
- , ["a\\*?/*", ["a*b/ooo"]]
60
- , ["*\\\\!*", [], {null: true}, ["echo !7"]]
61
- , ["*\\!*", ["echo !7"], null, ["echo !7"]]
62
- , ["*.\\*", ["r.*"], null, ["r.*"]]
63
- , ["a[b]c", ["abc"]]
64
- , ["a[\\b]c", ["abc"]]
65
- , ["a?c", ["abc"]]
66
- , ["a\\*c", [], {null: true}, ["abc"]]
67
- , ["", [""], { null: true }, [""]]
68
-
69
- , "http://www.opensource.apple.com/source/bash/bash-23/" +
70
- "bash/tests/glob-test"
71
- , function () { files.push("man/", "man/man1/", "man/man1/bash.1") }
72
- , ["*/man*/bash.*", ["man/man1/bash.1"]]
73
- , ["man/man1/bash.1", ["man/man1/bash.1"]]
74
- , ["a***c", ["abc"], null, ["abc"]]
75
- , ["a*****?c", ["abc"], null, ["abc"]]
76
- , ["?*****??", ["abc"], null, ["abc"]]
77
- , ["*****??", ["abc"], null, ["abc"]]
78
- , ["?*****?c", ["abc"], null, ["abc"]]
79
- , ["?***?****c", ["abc"], null, ["abc"]]
80
- , ["?***?****?", ["abc"], null, ["abc"]]
81
- , ["?***?****", ["abc"], null, ["abc"]]
82
- , ["*******c", ["abc"], null, ["abc"]]
83
- , ["*******?", ["abc"], null, ["abc"]]
84
- , ["a*cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
85
- , ["a**?**cd**?**??k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
86
- , ["a**?**cd**?**??k***", ["abcdecdhjk"], null, ["abcdecdhjk"]]
87
- , ["a**?**cd**?**??***k", ["abcdecdhjk"], null, ["abcdecdhjk"]]
88
- , ["a**?**cd**?**??***k**", ["abcdecdhjk"], null, ["abcdecdhjk"]]
89
- , ["a****c**?**??*****", ["abcdecdhjk"], null, ["abcdecdhjk"]]
90
- , ["[-abc]", ["-"], null, ["-"]]
91
- , ["[abc-]", ["-"], null, ["-"]]
92
- , ["\\", ["\\"], null, ["\\"]]
93
- , ["[\\\\]", ["\\"], null, ["\\"]]
94
- , ["[[]", ["["], null, ["["]]
95
- , ["[", ["["], null, ["["]]
96
- , ["[*", ["[abc"], null, ["[abc"]]
97
- , "a right bracket shall lose its special meaning and\n" +
98
- "represent itself in a bracket expression if it occurs\n" +
99
- "first in the list. -- POSIX.2 2.8.3.2"
100
- , ["[]]", ["]"], null, ["]"]]
101
- , ["[]-]", ["]"], null, ["]"]]
102
- , ["[a-\z]", ["p"], null, ["p"]]
103
- , ["??**********?****?", [], { null: true }, ["abc"]]
104
- , ["??**********?****c", [], { null: true }, ["abc"]]
105
- , ["?************c****?****", [], { null: true }, ["abc"]]
106
- , ["*c*?**", [], { null: true }, ["abc"]]
107
- , ["a*****c*?**", [], { null: true }, ["abc"]]
108
- , ["a********???*******", [], { null: true }, ["abc"]]
109
- , ["[]", [], { null: true }, ["a"]]
110
- , ["[abc", [], { null: true }, ["["]]
111
-
112
- , "nocase tests"
113
- , ["XYZ", ["xYz"], { nocase: true, null: true }
114
- , ["xYz", "ABC", "IjK"]]
115
- , ["ab*", ["ABC"], { nocase: true, null: true }
116
- , ["xYz", "ABC", "IjK"]]
117
- , ["[ia]?[ck]", ["ABC", "IjK"], { nocase: true, null: true }
118
- , ["xYz", "ABC", "IjK"]]
119
-
120
- // [ pattern, [matches], MM opts, files, TAP opts]
121
- , "onestar/twostar"
122
- , ["{/*,*}", [], {null: true}, ["/asdf/asdf/asdf"]]
123
- , ["{/?,*}", ["/a", "bb"], {null: true}
124
- , ["/a", "/b/b", "/a/b/c", "bb"]]
125
-
126
- , "dots should not match unless requested"
127
- , ["**", ["a/b"], {}, ["a/b", "a/.d", ".a/.d"]]
128
-
129
- // .. and . can only match patterns starting with .,
130
- // even when options.dot is set.
131
- , function () {
132
- files = ["a/./b", "a/../b", "a/c/b", "a/.d/b"]
133
- }
134
- , ["a/*/b", ["a/c/b", "a/.d/b"], {dot: true}]
135
- , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: true}]
136
- , ["a/*/b", ["a/c/b"], {dot:false}]
137
- , ["a/.*/b", ["a/./b", "a/../b", "a/.d/b"], {dot: false}]
138
-
139
-
140
- // this also tests that changing the options needs
141
- // to change the cache key, even if the pattern is
142
- // the same!
143
- , ["**", ["a/b","a/.d",".a/.d"], { dot: true }
144
- , [ ".a/.d", "a/.d", "a/b"]]
145
-
146
- , "paren sets cannot contain slashes"
147
- , ["*(a/b)", ["*(a/b)"], {nonull: true}, ["a/b"]]
148
-
149
- // brace sets trump all else.
150
- //
151
- // invalid glob pattern. fails on bash4 and bsdglob.
152
- // however, in this implementation, it's easier just
153
- // to do the intuitive thing, and let brace-expansion
154
- // actually come before parsing any extglob patterns,
155
- // like the documentation seems to say.
156
- //
157
- // XXX: if anyone complains about this, either fix it
158
- // or tell them to grow up and stop complaining.
159
- //
160
- // bash/bsdglob says this:
161
- // , ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]]
162
- // but we do this instead:
163
- , ["*(a|{b),c)}", ["a", "ab", "ac"], {}, ["a", "ab", "ac", "ad"]]
164
-
165
- // test partial parsing in the presence of comment/negation chars
166
- , ["[!a*", ["[!ab"], {}, ["[!ab", "[ab"]]
167
- , ["[#a*", ["[#ab"], {}, ["[#ab", "[ab"]]
168
-
169
- // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped.
170
- , ["+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g"
171
- , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g"]
172
- , {}
173
- , ["+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g", "a", "b\\c"]]
174
-
175
-
176
- // crazy nested {,,} and *(||) tests.
177
- , function () {
178
- files = [ "a", "b", "c", "d"
179
- , "ab", "ac", "ad"
180
- , "bc", "cb"
181
- , "bc,d", "c,db", "c,d"
182
- , "d)", "(b|c", "*(b|c"
183
- , "b|c", "b|cc", "cb|c"
184
- , "x(a|b|c)", "x(a|c)"
185
- , "(a|b|c)", "(a|c)"]
186
- }
187
- , ["*(a|{b,c})", ["a", "b", "c", "ab", "ac"]]
188
- , ["{a,*(b|c,d)}", ["a","(b|c", "*(b|c", "d)"]]
189
- // a
190
- // *(b|c)
191
- // *(b|d)
192
- , ["{a,*(b|{c,d})}", ["a","b", "bc", "cb", "c", "d"]]
193
- , ["*(a|{b|c,c})", ["a", "b", "c", "ab", "ac", "bc", "cb"]]
194
-
195
-
196
- // test various flag settings.
197
- , [ "*(a|{b|c,c})", ["x(a|b|c)", "x(a|c)", "(a|b|c)", "(a|c)"]
198
- , { noext: true } ]
199
- , ["a?b", ["x/y/acb", "acb/"], {matchBase: true}
200
- , ["x/y/acb", "acb/", "acb/d/e", "x/y/acb/d"] ]
201
- , ["#*", ["#a", "#b"], {nocomment: true}, ["#a", "#b", "c#d"]]
202
-
203
-
204
- // begin channelling Boole and deMorgan...
205
- , "negation tests"
206
- , function () {
207
- files = ["d", "e", "!ab", "!abc", "a!b", "\\!a"]
208
- }
209
-
210
- // anything that is NOT a* matches.
211
- , ["!a*", ["\\!a", "d", "e", "!ab", "!abc"]]
212
-
213
- // anything that IS !a* matches.
214
- , ["!a*", ["!ab", "!abc"], {nonegate: true}]
215
-
216
- // anything that IS a* matches
217
- , ["!!a*", ["a!b"]]
218
-
219
- // anything that is NOT !a* matches
220
- , ["!\\!a*", ["a!b", "d", "e", "\\!a"]]
221
-
222
- // negation nestled within a pattern
223
- , function () {
224
- files = [ "foo.js"
225
- , "foo.bar"
226
- // can't match this one without negative lookbehind.
227
- , "foo.js.js"
228
- , "blar.js"
229
- , "foo."
230
- , "boo.js.boo" ]
231
- }
232
- , ["*.!(js)", ["foo.bar", "foo.", "boo.js.boo"] ]
233
-
234
- // https://github.com/isaacs/minimatch/issues/5
235
- , function () {
236
- files = [ 'a/b/.x/c'
237
- , 'a/b/.x/c/d'
238
- , 'a/b/.x/c/d/e'
239
- , 'a/b/.x'
240
- , 'a/b/.x/'
241
- , 'a/.x/b'
242
- , '.x'
243
- , '.x/'
244
- , '.x/a'
245
- , '.x/a/b'
246
- , 'a/.x/b/.x/c'
247
- , '.x/.x' ]
248
- }
249
- , ["**/.x/**", [ '.x/'
250
- , '.x/a'
251
- , '.x/a/b'
252
- , 'a/.x/b'
253
- , 'a/b/.x/'
254
- , 'a/b/.x/c'
255
- , 'a/b/.x/c/d'
256
- , 'a/b/.x/c/d/e' ] ]
257
-
258
- ].forEach(function (c) {
259
- if (typeof c === "function") return c()
260
- if (typeof c === "string") return t.comment(c)
261
-
262
- var pattern = c[0]
263
- , expect = c[1].sort(alpha)
264
- , options = c[2] || {}
265
- , f = c[3] || files
266
- , tapOpts = c[4] || {}
267
-
268
- // options.debug = true
269
- var m = new mm.Minimatch(pattern, options)
270
- var r = m.makeRe()
271
- tapOpts.re = String(r) || JSON.stringify(r)
272
- tapOpts.files = JSON.stringify(f)
273
- tapOpts.pattern = pattern
274
- tapOpts.set = m.set
275
- tapOpts.negated = m.negate
276
-
277
- var actual = mm.match(f, pattern, options)
278
- actual.sort(alpha)
279
-
280
- t.equivalent( actual, expect
281
- , JSON.stringify(pattern) + " " + JSON.stringify(expect)
282
- , tapOpts )
283
- })
357
+ patterns.forEach(function (c) {
358
+ if (typeof c === "function") return c()
359
+ if (typeof c === "string") return t.comment(c)
360
+
361
+ var pattern = c[0]
362
+ , expect = c[1].sort(alpha)
363
+ , options = c[2] || {}
364
+ , f = c[3] || files
365
+ , tapOpts = c[4] || {}
366
+
367
+ // options.debug = true
368
+ var m = new mm.Minimatch(pattern, options)
369
+ var r = m.makeRe()
370
+ var expectRe = regexps[re++]
371
+ tapOpts.re = String(r) || JSON.stringify(r)
372
+ tapOpts.files = JSON.stringify(f)
373
+ tapOpts.pattern = pattern
374
+ tapOpts.set = m.set
375
+ tapOpts.negated = m.negate
376
+
377
+ var actual = mm.match(f, pattern, options)
378
+ actual.sort(alpha)
379
+
380
+ t.equivalent( actual, expect
381
+ , JSON.stringify(pattern) + " " + JSON.stringify(expect)
382
+ , tapOpts )
383
+
384
+ t.equal(tapOpts.re, expectRe, tapOpts)
385
+ })
284
386
 
285
387
  t.comment("time=" + (Date.now() - start) + "ms")
286
388
  t.end()
package/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: node_js
2
- node_js:
3
- - 0.4
4
- - 0.6