stylus-source 0.31.0 → 0.32.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +7 -0
  2. data/VERSION +1 -1
  3. data/vendor/lib/nodes/unit.js +1 -1
  4. data/vendor/lib/parser.js +0 -1
  5. data/vendor/lib/renderer.js +2 -0
  6. data/vendor/lib/visitor/compiler.js +6 -0
  7. data/vendor/node_modules/cssom/README.mdown +34 -0
  8. data/vendor/node_modules/cssom/package.json +2 -1
  9. data/vendor/node_modules/debug/History.md +15 -0
  10. data/vendor/node_modules/debug/Readme.md +3 -18
  11. data/vendor/node_modules/debug/component.json +9 -0
  12. data/vendor/node_modules/debug/debug.js +10 -2
  13. data/vendor/node_modules/debug/index.js +5 -2
  14. data/vendor/node_modules/debug/lib/debug.js +5 -6
  15. data/vendor/node_modules/debug/package.json +11 -6
  16. data/vendor/node_modules/mkdirp/package.json +6 -9
  17. data/vendor/node_modules/mkdirp/{README.markdown → readme.markdown} +26 -24
  18. data/vendor/node_modules/mocha/History.md +140 -58
  19. data/vendor/node_modules/mocha/LICENSE +2 -2
  20. data/vendor/node_modules/mocha/Makefile +20 -5
  21. data/vendor/node_modules/mocha/Readme.md +110 -22
  22. data/vendor/node_modules/mocha/_mocha.js +574 -182
  23. data/vendor/node_modules/mocha/bin/_mocha +39 -22
  24. data/vendor/node_modules/mocha/bin/mocha +6 -2
  25. data/vendor/node_modules/mocha/component.json +16 -0
  26. data/vendor/node_modules/mocha/lib/browser/debug.js +1 -2
  27. data/vendor/node_modules/mocha/lib/browser/diff.js +287 -0
  28. data/vendor/node_modules/mocha/lib/browser/tty.js +7 -2
  29. data/vendor/node_modules/mocha/lib/hook.js +0 -1
  30. data/vendor/node_modules/mocha/lib/interfaces/bdd.js +3 -3
  31. data/vendor/node_modules/mocha/lib/interfaces/exports.js +5 -5
  32. data/vendor/node_modules/mocha/lib/interfaces/qunit.js +38 -9
  33. data/vendor/node_modules/mocha/lib/interfaces/tdd.js +15 -2
  34. data/vendor/node_modules/mocha/lib/mocha.js +20 -4
  35. data/vendor/node_modules/mocha/lib/reporters/base.js +57 -37
  36. data/vendor/node_modules/mocha/lib/reporters/html.js +2 -4
  37. data/vendor/node_modules/mocha/lib/reporters/json-stream.js +4 -14
  38. data/vendor/node_modules/mocha/lib/reporters/json.js +9 -19
  39. data/vendor/node_modules/mocha/lib/reporters/markdown.js +0 -1
  40. data/vendor/node_modules/mocha/lib/reporters/min.js +2 -2
  41. data/vendor/node_modules/mocha/lib/reporters/nyan.js +33 -39
  42. data/vendor/node_modules/mocha/lib/reporters/tap.js +12 -2
  43. data/vendor/node_modules/mocha/lib/reporters/templates/coverage.jade +3 -3
  44. data/vendor/node_modules/mocha/lib/reporters/templates/menu.jade +1 -1
  45. data/vendor/node_modules/mocha/lib/reporters/xunit.js +4 -4
  46. data/vendor/node_modules/mocha/lib/runnable.js +7 -9
  47. data/vendor/node_modules/mocha/lib/runner.js +24 -9
  48. data/vendor/node_modules/mocha/lib/template.html +2 -1
  49. data/vendor/node_modules/mocha/lib/utils.js +3 -3
  50. data/vendor/node_modules/mocha/mocha.css +37 -13
  51. data/vendor/node_modules/mocha/mocha.js +661 -253
  52. data/vendor/node_modules/mocha/node_modules/commander/package.json +5 -1
  53. data/vendor/node_modules/mocha/node_modules/diff/package.json +5 -1
  54. data/vendor/node_modules/mocha/node_modules/glob/LICENSE +27 -0
  55. data/vendor/node_modules/mocha/node_modules/glob/README.md +250 -0
  56. data/vendor/node_modules/mocha/node_modules/glob/examples/g.js +9 -0
  57. data/vendor/node_modules/mocha/node_modules/glob/examples/usr-local.js +9 -0
  58. data/vendor/node_modules/mocha/node_modules/glob/glob.js +675 -0
  59. data/vendor/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/LICENSE +27 -0
  60. data/vendor/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/README.md +33 -0
  61. data/vendor/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/graceful-fs.js +442 -0
  62. data/vendor/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/package.json +49 -0
  63. data/vendor/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/open.js +46 -0
  64. data/vendor/node_modules/mocha/node_modules/glob/node_modules/graceful-fs/test/ulimit.js +158 -0
  65. data/vendor/node_modules/mocha/node_modules/glob/node_modules/inherits/README.md +51 -0
  66. data/vendor/node_modules/mocha/node_modules/glob/node_modules/inherits/inherits.js +29 -0
  67. data/vendor/node_modules/mocha/node_modules/glob/node_modules/inherits/package.json +26 -0
  68. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/LICENSE +23 -0
  69. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/README.md +218 -0
  70. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/minimatch.js +1079 -0
  71. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/AUTHORS +8 -0
  72. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
  73. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
  74. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +257 -0
  75. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/package.json +59 -0
  76. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/s.js +25 -0
  77. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/basic.js +329 -0
  78. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
  79. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
  80. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
  81. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
  82. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
  83. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/package.json +38 -0
  84. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
  85. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
  86. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/package.json +36 -0
  87. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/basic.js +399 -0
  88. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/brace-expand.js +33 -0
  89. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/caching.js +14 -0
  90. data/vendor/node_modules/mocha/node_modules/glob/node_modules/minimatch/test/defaults.js +274 -0
  91. data/vendor/node_modules/mocha/node_modules/glob/package.json +40 -0
  92. data/vendor/node_modules/mocha/node_modules/glob/test/00-setup.js +176 -0
  93. data/vendor/node_modules/mocha/node_modules/glob/test/bash-comparison.js +63 -0
  94. data/vendor/node_modules/mocha/node_modules/glob/test/bash-results.json +350 -0
  95. data/vendor/node_modules/mocha/node_modules/glob/test/cwd-test.js +55 -0
  96. data/vendor/node_modules/mocha/node_modules/glob/test/globstar-match.js +19 -0
  97. data/vendor/node_modules/mocha/node_modules/glob/test/mark.js +74 -0
  98. data/vendor/node_modules/mocha/node_modules/glob/test/nocase-nomagic.js +113 -0
  99. data/vendor/node_modules/mocha/node_modules/glob/test/pause-resume.js +73 -0
  100. data/vendor/node_modules/mocha/node_modules/glob/test/root-nomount.js +39 -0
  101. data/vendor/node_modules/mocha/node_modules/glob/test/root.js +46 -0
  102. data/vendor/node_modules/mocha/node_modules/glob/test/stat.js +32 -0
  103. data/vendor/node_modules/mocha/node_modules/glob/test/zz-cleanup.js +11 -0
  104. data/vendor/node_modules/mocha/node_modules/growl/History.md +5 -0
  105. data/vendor/node_modules/mocha/node_modules/growl/lib/growl.js +2 -0
  106. data/vendor/node_modules/mocha/node_modules/growl/package.json +7 -3
  107. data/vendor/node_modules/mocha/node_modules/jade/node_modules/mkdirp/package.json +5 -1
  108. data/vendor/node_modules/mocha/node_modules/jade/package.json +5 -1
  109. data/vendor/node_modules/mocha/node_modules/ms/package.json +5 -1
  110. data/vendor/node_modules/mocha/package.json +13 -7
  111. data/vendor/node_modules/mocha/test.js +10 -21
  112. data/vendor/node_modules/should/History.md +5 -0
  113. data/vendor/node_modules/should/Readme.md +172 -172
  114. data/vendor/node_modules/should/lib/eql.js +2 -0
  115. data/vendor/node_modules/should/lib/should.js +4 -3
  116. data/vendor/node_modules/should/package.json +8 -4
  117. data/vendor/node_modules/should/test/should.test.js +27 -0
  118. data/vendor/package.json +1 -1
  119. metadata +61 -35
  120. data/vendor/node_modules/debug/Makefile +0 -4
  121. data/vendor/node_modules/debug/debug.component.js +0 -120
  122. data/vendor/node_modules/debug/head.js +0 -1
  123. data/vendor/node_modules/debug/tail.js +0 -4
  124. data/vendor/node_modules/mocha/node_modules/mkdirp/LICENSE +0 -21
  125. data/vendor/node_modules/mocha/node_modules/mkdirp/README.markdown +0 -61
  126. data/vendor/node_modules/mocha/node_modules/mkdirp/examples/pow.js +0 -6
  127. data/vendor/node_modules/mocha/node_modules/mkdirp/examples/pow.js.orig +0 -6
  128. data/vendor/node_modules/mocha/node_modules/mkdirp/examples/pow.js.rej +0 -19
  129. data/vendor/node_modules/mocha/node_modules/mkdirp/index.js +0 -94
  130. data/vendor/node_modules/mocha/node_modules/mkdirp/package.json +0 -33
  131. data/vendor/node_modules/mocha/node_modules/mkdirp/test/chmod.js +0 -38
  132. data/vendor/node_modules/mocha/node_modules/mkdirp/test/clobber.js +0 -37
  133. data/vendor/node_modules/mocha/node_modules/mkdirp/test/mkdirp.js +0 -28
  134. data/vendor/node_modules/mocha/node_modules/mkdirp/test/perm.js +0 -32
  135. data/vendor/node_modules/mocha/node_modules/mkdirp/test/perm_sync.js +0 -39
  136. data/vendor/node_modules/mocha/node_modules/mkdirp/test/race.js +0 -41
  137. data/vendor/node_modules/mocha/node_modules/mkdirp/test/rel.js +0 -32
  138. data/vendor/node_modules/mocha/node_modules/mkdirp/test/return.js +0 -25
  139. data/vendor/node_modules/mocha/node_modules/mkdirp/test/return_sync.js +0 -24
  140. data/vendor/node_modules/mocha/node_modules/mkdirp/test/root.js +0 -18
  141. data/vendor/node_modules/mocha/node_modules/mkdirp/test/sync.js +0 -32
  142. data/vendor/node_modules/mocha/node_modules/mkdirp/test/umask.js +0 -28
  143. data/vendor/node_modules/mocha/node_modules/mkdirp/test/umask_sync.js +0 -32
@@ -0,0 +1,675 @@
1
+ // Approach:
2
+ //
3
+ // 1. Get the minimatch set
4
+ // 2. For each pattern in the set, PROCESS(pattern)
5
+ // 3. Store matches per-set, then uniq them
6
+ //
7
+ // PROCESS(pattern)
8
+ // Get the first [n] items from pattern that are all strings
9
+ // Join these together. This is PREFIX.
10
+ // If there is no more remaining, then stat(PREFIX) and
11
+ // add to matches if it succeeds. END.
12
+ // readdir(PREFIX) as ENTRIES
13
+ // If fails, END
14
+ // If pattern[n] is GLOBSTAR
15
+ // // handle the case where the globstar match is empty
16
+ // // by pruning it out, and testing the resulting pattern
17
+ // PROCESS(pattern[0..n] + pattern[n+1 .. $])
18
+ // // handle other cases.
19
+ // for ENTRY in ENTRIES (not dotfiles)
20
+ // // attach globstar + tail onto the entry
21
+ // PROCESS(pattern[0..n] + ENTRY + pattern[n .. $])
22
+ //
23
+ // else // not globstar
24
+ // for ENTRY in ENTRIES (not dotfiles, unless pattern[n] is dot)
25
+ // Test ENTRY against pattern[n]
26
+ // If fails, continue
27
+ // If passes, PROCESS(pattern[0..n] + item + pattern[n+1 .. $])
28
+ //
29
+ // Caveat:
30
+ // Cache all stats and readdirs results to minimize syscall. Since all
31
+ // we ever care about is existence and directory-ness, we can just keep
32
+ // `true` for files, and [children,...] for directories, or `false` for
33
+ // things that don't exist.
34
+
35
+
36
+
37
+ module.exports = glob
38
+
39
+ var fs = require("graceful-fs")
40
+ , minimatch = require("minimatch")
41
+ , Minimatch = minimatch.Minimatch
42
+ , inherits = require("inherits")
43
+ , EE = require("events").EventEmitter
44
+ , path = require("path")
45
+ , isDir = {}
46
+ , assert = require("assert").ok
47
+
48
+ function glob (pattern, options, cb) {
49
+ if (typeof options === "function") cb = options, options = {}
50
+ if (!options) options = {}
51
+
52
+ if (typeof options === "number") {
53
+ deprecated()
54
+ return
55
+ }
56
+
57
+ var g = new Glob(pattern, options, cb)
58
+ return g.sync ? g.found : g
59
+ }
60
+
61
+ glob.fnmatch = deprecated
62
+
63
+ function deprecated () {
64
+ throw new Error("glob's interface has changed. Please see the docs.")
65
+ }
66
+
67
+ glob.sync = globSync
68
+ function globSync (pattern, options) {
69
+ if (typeof options === "number") {
70
+ deprecated()
71
+ return
72
+ }
73
+
74
+ options = options || {}
75
+ options.sync = true
76
+ return glob(pattern, options)
77
+ }
78
+
79
+
80
+ glob.Glob = Glob
81
+ inherits(Glob, EE)
82
+ function Glob (pattern, options, cb) {
83
+ if (!(this instanceof Glob)) {
84
+ return new Glob(pattern, options, cb)
85
+ }
86
+
87
+ if (typeof cb === "function") {
88
+ this.on("error", cb)
89
+ this.on("end", function (matches) {
90
+ cb(null, matches)
91
+ })
92
+ }
93
+
94
+ options = options || {}
95
+
96
+ this.EOF = {}
97
+ this._emitQueue = []
98
+
99
+ this.maxDepth = options.maxDepth || 1000
100
+ this.maxLength = options.maxLength || Infinity
101
+ this.cache = options.cache || {}
102
+ this.statCache = options.statCache || {}
103
+
104
+ this.changedCwd = false
105
+ var cwd = process.cwd()
106
+ if (!options.hasOwnProperty("cwd")) this.cwd = cwd
107
+ else {
108
+ this.cwd = options.cwd
109
+ this.changedCwd = path.resolve(options.cwd) !== cwd
110
+ }
111
+
112
+ this.root = options.root || path.resolve(this.cwd, "/")
113
+ this.root = path.resolve(this.root)
114
+ if (process.platform === "win32")
115
+ this.root = this.root.replace(/\\/g, "/")
116
+
117
+ this.nomount = !!options.nomount
118
+
119
+ if (!pattern) {
120
+ throw new Error("must provide pattern")
121
+ }
122
+
123
+ // base-matching: just use globstar for that.
124
+ if (options.matchBase && -1 === pattern.indexOf("/")) {
125
+ if (options.noglobstar) {
126
+ throw new Error("base matching requires globstar")
127
+ }
128
+ pattern = "**/" + pattern
129
+ }
130
+
131
+ this.strict = options.strict !== false
132
+ this.dot = !!options.dot
133
+ this.mark = !!options.mark
134
+ this.sync = !!options.sync
135
+ this.nounique = !!options.nounique
136
+ this.nonull = !!options.nonull
137
+ this.nosort = !!options.nosort
138
+ this.nocase = !!options.nocase
139
+ this.stat = !!options.stat
140
+
141
+ this.debug = !!options.debug || !!options.globDebug
142
+ if (this.debug)
143
+ this.log = console.error
144
+
145
+ this.silent = !!options.silent
146
+
147
+ var mm = this.minimatch = new Minimatch(pattern, options)
148
+ this.options = mm.options
149
+ pattern = this.pattern = mm.pattern
150
+
151
+ this.error = null
152
+ this.aborted = false
153
+
154
+ // list of all the patterns that ** has resolved do, so
155
+ // we can avoid visiting multiple times.
156
+ this._globstars = {}
157
+
158
+ EE.call(this)
159
+
160
+ // process each pattern in the minimatch set
161
+ var n = this.minimatch.set.length
162
+
163
+ // The matches are stored as {<filename>: true,...} so that
164
+ // duplicates are automagically pruned.
165
+ // Later, we do an Object.keys() on these.
166
+ // Keep them as a list so we can fill in when nonull is set.
167
+ this.matches = new Array(n)
168
+
169
+ this.minimatch.set.forEach(iterator.bind(this))
170
+ function iterator (pattern, i, set) {
171
+ this._process(pattern, 0, i, function (er) {
172
+ if (er) this.emit("error", er)
173
+ if (-- n <= 0) this._finish()
174
+ })
175
+ }
176
+ }
177
+
178
+ Glob.prototype.log = function () {}
179
+
180
+ Glob.prototype._finish = function () {
181
+ assert(this instanceof Glob)
182
+
183
+ var nou = this.nounique
184
+ , all = nou ? [] : {}
185
+
186
+ for (var i = 0, l = this.matches.length; i < l; i ++) {
187
+ var matches = this.matches[i]
188
+ this.log("matches[%d] =", i, matches)
189
+ // do like the shell, and spit out the literal glob
190
+ if (!matches) {
191
+ if (this.nonull) {
192
+ var literal = this.minimatch.globSet[i]
193
+ if (nou) all.push(literal)
194
+ else all[literal] = true
195
+ }
196
+ } else {
197
+ // had matches
198
+ var m = Object.keys(matches)
199
+ if (nou) all.push.apply(all, m)
200
+ else m.forEach(function (m) {
201
+ all[m] = true
202
+ })
203
+ }
204
+ }
205
+
206
+ if (!nou) all = Object.keys(all)
207
+
208
+ if (!this.nosort) {
209
+ all = all.sort(this.nocase ? alphasorti : alphasort)
210
+ }
211
+
212
+ if (this.mark) {
213
+ // at *some* point we statted all of these
214
+ all = all.map(function (m) {
215
+ var sc = this.cache[m]
216
+ if (!sc)
217
+ return m
218
+ var isDir = (Array.isArray(sc) || sc === 2)
219
+ if (isDir && m.slice(-1) !== "/") {
220
+ return m + "/"
221
+ }
222
+ if (!isDir && m.slice(-1) === "/") {
223
+ return m.replace(/\/+$/, "")
224
+ }
225
+ return m
226
+ }, this)
227
+ }
228
+
229
+ this.log("emitting end", all)
230
+
231
+ this.EOF = this.found = all
232
+ this.emitMatch(this.EOF)
233
+ }
234
+
235
+ function alphasorti (a, b) {
236
+ a = a.toLowerCase()
237
+ b = b.toLowerCase()
238
+ return alphasort(a, b)
239
+ }
240
+
241
+ function alphasort (a, b) {
242
+ return a > b ? 1 : a < b ? -1 : 0
243
+ }
244
+
245
+ Glob.prototype.abort = function () {
246
+ this.aborted = true
247
+ this.emit("abort")
248
+ }
249
+
250
+ Glob.prototype.pause = function () {
251
+ if (this.paused) return
252
+ if (this.sync)
253
+ this.emit("error", new Error("Can't pause/resume sync glob"))
254
+ this.paused = true
255
+ this.emit("pause")
256
+ }
257
+
258
+ Glob.prototype.resume = function () {
259
+ if (!this.paused) return
260
+ if (this.sync)
261
+ this.emit("error", new Error("Can't pause/resume sync glob"))
262
+ this.paused = false
263
+ this.emit("resume")
264
+ this._processEmitQueue()
265
+ //process.nextTick(this.emit.bind(this, "resume"))
266
+ }
267
+
268
+ Glob.prototype.emitMatch = function (m) {
269
+ if (!this.stat || this.statCache[m] || m === this.EOF) {
270
+ this._emitQueue.push(m)
271
+ this._processEmitQueue()
272
+ } else {
273
+ this._stat(m, function(exists, isDir) {
274
+ if (exists) {
275
+ this._emitQueue.push(m)
276
+ this._processEmitQueue()
277
+ }
278
+ })
279
+ }
280
+ }
281
+
282
+ Glob.prototype._processEmitQueue = function (m) {
283
+ while (!this._processingEmitQueue &&
284
+ !this.paused) {
285
+ this._processingEmitQueue = true
286
+ var m = this._emitQueue.shift()
287
+ if (!m) {
288
+ this._processingEmitQueue = false
289
+ break
290
+ }
291
+
292
+ this.log('emit!', m === this.EOF ? "end" : "match")
293
+
294
+ this.emit(m === this.EOF ? "end" : "match", m)
295
+ this._processingEmitQueue = false
296
+ }
297
+ }
298
+
299
+ Glob.prototype._process = function (pattern, depth, index, cb_) {
300
+ assert(this instanceof Glob)
301
+
302
+ var cb = function cb (er, res) {
303
+ assert(this instanceof Glob)
304
+ if (this.paused) {
305
+ if (!this._processQueue) {
306
+ this._processQueue = []
307
+ this.once("resume", function () {
308
+ var q = this._processQueue
309
+ this._processQueue = null
310
+ q.forEach(function (cb) { cb() })
311
+ })
312
+ }
313
+ this._processQueue.push(cb_.bind(this, er, res))
314
+ } else {
315
+ cb_.call(this, er, res)
316
+ }
317
+ }.bind(this)
318
+
319
+ if (this.aborted) return cb()
320
+
321
+ if (depth > this.maxDepth) return cb()
322
+
323
+ // Get the first [n] parts of pattern that are all strings.
324
+ var n = 0
325
+ while (typeof pattern[n] === "string") {
326
+ n ++
327
+ }
328
+ // now n is the index of the first one that is *not* a string.
329
+
330
+ // see if there's anything else
331
+ var prefix
332
+ switch (n) {
333
+ // if not, then this is rather simple
334
+ case pattern.length:
335
+ prefix = pattern.join("/")
336
+ this._stat(prefix, function (exists, isDir) {
337
+ // either it's there, or it isn't.
338
+ // nothing more to do, either way.
339
+ if (exists) {
340
+ if (prefix && isAbsolute(prefix) && !this.nomount) {
341
+ if (prefix.charAt(0) === "/") {
342
+ prefix = path.join(this.root, prefix)
343
+ } else {
344
+ prefix = path.resolve(this.root, prefix)
345
+ }
346
+ }
347
+
348
+ if (process.platform === "win32")
349
+ prefix = prefix.replace(/\\/g, "/")
350
+
351
+ this.matches[index] = this.matches[index] || {}
352
+ this.matches[index][prefix] = true
353
+ this.emitMatch(prefix)
354
+ }
355
+ return cb()
356
+ })
357
+ return
358
+
359
+ case 0:
360
+ // pattern *starts* with some non-trivial item.
361
+ // going to readdir(cwd), but not include the prefix in matches.
362
+ prefix = null
363
+ break
364
+
365
+ default:
366
+ // pattern has some string bits in the front.
367
+ // whatever it starts with, whether that's "absolute" like /foo/bar,
368
+ // or "relative" like "../baz"
369
+ prefix = pattern.slice(0, n)
370
+ prefix = prefix.join("/")
371
+ break
372
+ }
373
+
374
+ // get the list of entries.
375
+ var read
376
+ if (prefix === null) read = "."
377
+ else if (isAbsolute(prefix) || isAbsolute(pattern.join("/"))) {
378
+ if (!prefix || !isAbsolute(prefix)) {
379
+ prefix = path.join("/", prefix)
380
+ }
381
+ read = prefix = path.resolve(prefix)
382
+
383
+ // if (process.platform === "win32")
384
+ // read = prefix = prefix.replace(/^[a-zA-Z]:|\\/g, "/")
385
+
386
+ this.log('absolute: ', prefix, this.root, pattern, read)
387
+ } else {
388
+ read = prefix
389
+ }
390
+
391
+ this.log('readdir(%j)', read, this.cwd, this.root)
392
+
393
+ return this._readdir(read, function (er, entries) {
394
+ if (er) {
395
+ // not a directory!
396
+ // this means that, whatever else comes after this, it can never match
397
+ return cb()
398
+ }
399
+
400
+ // globstar is special
401
+ if (pattern[n] === minimatch.GLOBSTAR) {
402
+ // test without the globstar, and with every child both below
403
+ // and replacing the globstar.
404
+ var s = [ pattern.slice(0, n).concat(pattern.slice(n + 1)) ]
405
+ entries.forEach(function (e) {
406
+ if (e.charAt(0) === "." && !this.dot) return
407
+ // instead of the globstar
408
+ s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1)))
409
+ // below the globstar
410
+ s.push(pattern.slice(0, n).concat(e).concat(pattern.slice(n)))
411
+ }, this)
412
+
413
+ s = s.filter(function (pattern) {
414
+ var key = gsKey(pattern)
415
+ var seen = !this._globstars[key]
416
+ this._globstars[key] = true
417
+ return seen
418
+ }, this)
419
+
420
+ if (!s.length)
421
+ return cb()
422
+
423
+ // now asyncForEach over this
424
+ var l = s.length
425
+ , errState = null
426
+ s.forEach(function (gsPattern) {
427
+ this._process(gsPattern, depth + 1, index, function (er) {
428
+ if (errState) return
429
+ if (er) return cb(errState = er)
430
+ if (--l <= 0) return cb()
431
+ })
432
+ }, this)
433
+
434
+ return
435
+ }
436
+
437
+ // not a globstar
438
+ // It will only match dot entries if it starts with a dot, or if
439
+ // dot is set. Stuff like @(.foo|.bar) isn't allowed.
440
+ var pn = pattern[n]
441
+ var rawGlob = pattern[n]._glob
442
+ , dotOk = this.dot || rawGlob.charAt(0) === "."
443
+
444
+ entries = entries.filter(function (e) {
445
+ return (e.charAt(0) !== "." || dotOk) &&
446
+ e.match(pattern[n])
447
+ })
448
+
449
+ // If n === pattern.length - 1, then there's no need for the extra stat
450
+ // *unless* the user has specified "mark" or "stat" explicitly.
451
+ // We know that they exist, since the readdir returned them.
452
+ if (n === pattern.length - 1 &&
453
+ !this.mark &&
454
+ !this.stat) {
455
+ entries.forEach(function (e) {
456
+ if (prefix) {
457
+ if (prefix !== "/") e = prefix + "/" + e
458
+ else e = prefix + e
459
+ }
460
+ if (e.charAt(0) === "/" && !this.nomount) {
461
+ e = path.join(this.root, e)
462
+ }
463
+
464
+ if (process.platform === "win32")
465
+ e = e.replace(/\\/g, "/")
466
+
467
+ this.matches[index] = this.matches[index] || {}
468
+ this.matches[index][e] = true
469
+ this.emitMatch(e)
470
+ }, this)
471
+ return cb.call(this)
472
+ }
473
+
474
+
475
+ // now test all the remaining entries as stand-ins for that part
476
+ // of the pattern.
477
+ var l = entries.length
478
+ , errState = null
479
+ if (l === 0) return cb() // no matches possible
480
+ entries.forEach(function (e) {
481
+ var p = pattern.slice(0, n).concat(e).concat(pattern.slice(n + 1))
482
+ this._process(p, depth + 1, index, function (er) {
483
+ if (errState) return
484
+ if (er) return cb(errState = er)
485
+ if (--l === 0) return cb.call(this)
486
+ })
487
+ }, this)
488
+ })
489
+
490
+ }
491
+
492
+ function gsKey (pattern) {
493
+ return '**' + pattern.map(function (p) {
494
+ return (p === minimatch.GLOBSTAR) ? '**' : (''+p)
495
+ }).join('/')
496
+ }
497
+
498
+ Glob.prototype._stat = function (f, cb) {
499
+ assert(this instanceof Glob)
500
+ var abs = f
501
+ if (f.charAt(0) === "/") {
502
+ abs = path.join(this.root, f)
503
+ } else if (this.changedCwd) {
504
+ abs = path.resolve(this.cwd, f)
505
+ }
506
+
507
+ if (f.length > this.maxLength) {
508
+ var er = new Error("Path name too long")
509
+ er.code = "ENAMETOOLONG"
510
+ er.path = f
511
+ return this._afterStat(f, abs, cb, er)
512
+ }
513
+
514
+ this.log('stat', [this.cwd, f, '=', abs])
515
+
516
+ if (!this.stat && this.cache.hasOwnProperty(f)) {
517
+ var exists = this.cache[f]
518
+ , isDir = exists && (Array.isArray(exists) || exists === 2)
519
+ if (this.sync) return cb.call(this, !!exists, isDir)
520
+ return process.nextTick(cb.bind(this, !!exists, isDir))
521
+ }
522
+
523
+ var stat = this.statCache[abs]
524
+ if (this.sync || stat) {
525
+ var er
526
+ try {
527
+ stat = fs.statSync(abs)
528
+ } catch (e) {
529
+ er = e
530
+ }
531
+ this._afterStat(f, abs, cb, er, stat)
532
+ } else {
533
+ fs.stat(abs, this._afterStat.bind(this, f, abs, cb))
534
+ }
535
+ }
536
+
537
+ Glob.prototype._afterStat = function (f, abs, cb, er, stat) {
538
+ var exists
539
+ assert(this instanceof Glob)
540
+
541
+ if (abs.slice(-1) === "/" && stat && !stat.isDirectory()) {
542
+ this.log("should be ENOTDIR, fake it")
543
+
544
+ er = new Error("ENOTDIR, not a directory '" + abs + "'")
545
+ er.path = abs
546
+ er.code = "ENOTDIR"
547
+ stat = null
548
+ }
549
+
550
+ var emit = !this.statCache[abs]
551
+ this.statCache[abs] = stat
552
+
553
+ if (er || !stat) {
554
+ exists = false
555
+ } else {
556
+ exists = stat.isDirectory() ? 2 : 1
557
+ if (emit)
558
+ this.emit('stat', f, stat)
559
+ }
560
+ this.cache[f] = this.cache[f] || exists
561
+ cb.call(this, !!exists, exists === 2)
562
+ }
563
+
564
+ Glob.prototype._readdir = function (f, cb) {
565
+ assert(this instanceof Glob)
566
+ var abs = f
567
+ if (f.charAt(0) === "/") {
568
+ abs = path.join(this.root, f)
569
+ } else if (isAbsolute(f)) {
570
+ abs = f
571
+ } else if (this.changedCwd) {
572
+ abs = path.resolve(this.cwd, f)
573
+ }
574
+
575
+ if (f.length > this.maxLength) {
576
+ var er = new Error("Path name too long")
577
+ er.code = "ENAMETOOLONG"
578
+ er.path = f
579
+ return this._afterReaddir(f, abs, cb, er)
580
+ }
581
+
582
+ this.log('readdir', [this.cwd, f, abs])
583
+ if (this.cache.hasOwnProperty(f)) {
584
+ var c = this.cache[f]
585
+ if (Array.isArray(c)) {
586
+ if (this.sync) return cb.call(this, null, c)
587
+ return process.nextTick(cb.bind(this, null, c))
588
+ }
589
+
590
+ if (!c || c === 1) {
591
+ // either ENOENT or ENOTDIR
592
+ var code = c ? "ENOTDIR" : "ENOENT"
593
+ , er = new Error((c ? "Not a directory" : "Not found") + ": " + f)
594
+ er.path = f
595
+ er.code = code
596
+ this.log(f, er)
597
+ if (this.sync) return cb.call(this, er)
598
+ return process.nextTick(cb.bind(this, er))
599
+ }
600
+
601
+ // at this point, c === 2, meaning it's a dir, but we haven't
602
+ // had to read it yet, or c === true, meaning it's *something*
603
+ // but we don't have any idea what. Need to read it, either way.
604
+ }
605
+
606
+ if (this.sync) {
607
+ var er, entries
608
+ try {
609
+ entries = fs.readdirSync(abs)
610
+ } catch (e) {
611
+ er = e
612
+ }
613
+ return this._afterReaddir(f, abs, cb, er, entries)
614
+ }
615
+
616
+ fs.readdir(abs, this._afterReaddir.bind(this, f, abs, cb))
617
+ }
618
+
619
+ Glob.prototype._afterReaddir = function (f, abs, cb, er, entries) {
620
+ assert(this instanceof Glob)
621
+ if (entries && !er) {
622
+ this.cache[f] = entries
623
+ // if we haven't asked to stat everything for suresies, then just
624
+ // assume that everything in there exists, so we can avoid
625
+ // having to stat it a second time. This also gets us one step
626
+ // further into ELOOP territory.
627
+ if (!this.mark && !this.stat) {
628
+ entries.forEach(function (e) {
629
+ if (f === "/") e = f + e
630
+ else e = f + "/" + e
631
+ this.cache[e] = true
632
+ }, this)
633
+ }
634
+
635
+ return cb.call(this, er, entries)
636
+ }
637
+
638
+ // now handle errors, and cache the information
639
+ if (er) switch (er.code) {
640
+ case "ENOTDIR": // totally normal. means it *does* exist.
641
+ this.cache[f] = 1
642
+ return cb.call(this, er)
643
+ case "ENOENT": // not terribly unusual
644
+ case "ELOOP":
645
+ case "ENAMETOOLONG":
646
+ case "UNKNOWN":
647
+ this.cache[f] = false
648
+ return cb.call(this, er)
649
+ default: // some unusual error. Treat as failure.
650
+ this.cache[f] = false
651
+ if (this.strict) this.emit("error", er)
652
+ if (!this.silent) console.error("glob error", er)
653
+ return cb.call(this, er)
654
+ }
655
+ }
656
+
657
+ var isAbsolute = process.platform === "win32" ? absWin : absUnix
658
+
659
+ function absWin (p) {
660
+ if (absUnix(p)) return true
661
+ // pull off the device/UNC bit from a windows path.
662
+ // from node's lib/path.js
663
+ var splitDeviceRe =
664
+ /^([a-zA-Z]:|[\\\/]{2}[^\\\/]+[\\\/]+[^\\\/]+)?([\\\/])?([\s\S]*?)$/
665
+ , result = splitDeviceRe.exec(p)
666
+ , device = result[1] || ''
667
+ , isUnc = device && device.charAt(1) !== ':'
668
+ , isAbsolute = !!result[2] || isUnc // UNC paths are always absolute
669
+
670
+ return isAbsolute
671
+ }
672
+
673
+ function absUnix (p) {
674
+ return p.charAt(0) === "/" || p === ""
675
+ }
@@ -0,0 +1,27 @@
1
+ Copyright (c) Isaac Z. Schlueter ("Author")
2
+ All rights reserved.
3
+
4
+ The BSD License
5
+
6
+ Redistribution and use in source and binary forms, with or without
7
+ modification, are permitted provided that the following conditions
8
+ are met:
9
+
10
+ 1. Redistributions of source code must retain the above copyright
11
+ notice, this list of conditions and the following disclaimer.
12
+
13
+ 2. Redistributions in binary form must reproduce the above copyright
14
+ notice, this list of conditions and the following disclaimer in the
15
+ documentation and/or other materials provided with the distribution.
16
+
17
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20
+ PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
21
+ BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27
+ IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.