UrgentcareCLI 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +60 -25
  4. data/Notes +1 -1
  5. data/README.md +5 -5
  6. data/Rakefile +2 -0
  7. data/UrgentCare.gemspec +3 -3
  8. data/background.jpg +0 -0
  9. data/lib/UrgentCare.rb +3 -0
  10. data/lib/UrgentCare/CLI.rb +6 -2
  11. data/lib/UrgentCare/version.rb +1 -1
  12. data/lib/Urgentcare/Scraper.rb +65 -23
  13. data/node_modules/.bin/rimraf +1 -0
  14. data/node_modules/.package-lock.json +250 -0
  15. data/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  16. data/node_modules/balanced-match/LICENSE.md +21 -0
  17. data/node_modules/balanced-match/README.md +97 -0
  18. data/node_modules/balanced-match/index.js +62 -0
  19. data/node_modules/balanced-match/package.json +48 -0
  20. data/node_modules/brace-expansion/LICENSE +21 -0
  21. data/node_modules/brace-expansion/README.md +129 -0
  22. data/node_modules/brace-expansion/index.js +201 -0
  23. data/node_modules/brace-expansion/package.json +47 -0
  24. data/node_modules/concat-map/.travis.yml +4 -0
  25. data/node_modules/concat-map/LICENSE +18 -0
  26. data/node_modules/concat-map/README.markdown +62 -0
  27. data/node_modules/concat-map/example/map.js +6 -0
  28. data/node_modules/concat-map/index.js +13 -0
  29. data/node_modules/concat-map/package.json +43 -0
  30. data/node_modules/concat-map/test/map.js +39 -0
  31. data/node_modules/core-util-is/LICENSE +19 -0
  32. data/node_modules/core-util-is/README.md +3 -0
  33. data/node_modules/core-util-is/float.patch +604 -0
  34. data/node_modules/core-util-is/lib/util.js +107 -0
  35. data/node_modules/core-util-is/package.json +32 -0
  36. data/node_modules/core-util-is/test.js +68 -0
  37. data/node_modules/fs.realpath/LICENSE +43 -0
  38. data/node_modules/fs.realpath/README.md +33 -0
  39. data/node_modules/fs.realpath/index.js +66 -0
  40. data/node_modules/fs.realpath/old.js +303 -0
  41. data/node_modules/fs.realpath/package.json +26 -0
  42. data/node_modules/glob/LICENSE +21 -0
  43. data/node_modules/glob/README.md +375 -0
  44. data/node_modules/glob/changelog.md +67 -0
  45. data/node_modules/glob/common.js +234 -0
  46. data/node_modules/glob/glob.js +788 -0
  47. data/node_modules/glob/package.json +51 -0
  48. data/node_modules/glob/sync.js +484 -0
  49. data/node_modules/immediate/LICENSE.txt +20 -0
  50. data/node_modules/immediate/README.md +93 -0
  51. data/node_modules/immediate/dist/immediate.js +75 -0
  52. data/node_modules/immediate/dist/immediate.min.js +1 -0
  53. data/node_modules/immediate/lib/browser.js +69 -0
  54. data/node_modules/immediate/lib/index.js +73 -0
  55. data/node_modules/immediate/package.json +42 -0
  56. data/node_modules/inflight/LICENSE +15 -0
  57. data/node_modules/inflight/README.md +37 -0
  58. data/node_modules/inflight/inflight.js +54 -0
  59. data/node_modules/inflight/package.json +29 -0
  60. data/node_modules/inherits/LICENSE +16 -0
  61. data/node_modules/inherits/README.md +42 -0
  62. data/node_modules/inherits/inherits.js +9 -0
  63. data/node_modules/inherits/inherits_browser.js +27 -0
  64. data/node_modules/inherits/package.json +29 -0
  65. data/node_modules/isarray/.npmignore +1 -0
  66. data/node_modules/isarray/.travis.yml +4 -0
  67. data/node_modules/isarray/Makefile +6 -0
  68. data/node_modules/isarray/README.md +60 -0
  69. data/node_modules/isarray/component.json +19 -0
  70. data/node_modules/isarray/index.js +5 -0
  71. data/node_modules/isarray/package.json +45 -0
  72. data/node_modules/isarray/test.js +20 -0
  73. data/node_modules/jszip/.codeclimate.yml +16 -0
  74. data/node_modules/jszip/.editorconfig +8 -0
  75. data/node_modules/jszip/.jshintignore +1 -0
  76. data/node_modules/jszip/.jshintrc +21 -0
  77. data/node_modules/jszip/.travis.yml +17 -0
  78. data/node_modules/jszip/CHANGES.md +163 -0
  79. data/node_modules/jszip/LICENSE.markdown +651 -0
  80. data/node_modules/jszip/README.markdown +35 -0
  81. data/node_modules/jszip/dist/jszip.js +30 -0
  82. data/node_modules/jszip/dist/jszip.min.js +13 -0
  83. data/node_modules/jszip/index.d.ts +270 -0
  84. data/node_modules/jszip/lib/base64.js +106 -0
  85. data/node_modules/jszip/lib/compressedObject.js +74 -0
  86. data/node_modules/jszip/lib/compressions.js +14 -0
  87. data/node_modules/jszip/lib/crc32.js +77 -0
  88. data/node_modules/jszip/lib/defaults.js +11 -0
  89. data/node_modules/jszip/lib/external.js +19 -0
  90. data/node_modules/jszip/lib/flate.js +85 -0
  91. data/node_modules/jszip/lib/generate/ZipFileWorker.js +540 -0
  92. data/node_modules/jszip/lib/generate/index.js +57 -0
  93. data/node_modules/jszip/lib/index.js +52 -0
  94. data/node_modules/jszip/lib/license_header.js +11 -0
  95. data/node_modules/jszip/lib/load.js +81 -0
  96. data/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +74 -0
  97. data/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +42 -0
  98. data/node_modules/jszip/lib/nodejsUtils.js +57 -0
  99. data/node_modules/jszip/lib/object.js +389 -0
  100. data/node_modules/jszip/lib/readable-stream-browser.js +9 -0
  101. data/node_modules/jszip/lib/reader/ArrayReader.js +57 -0
  102. data/node_modules/jszip/lib/reader/DataReader.js +116 -0
  103. data/node_modules/jszip/lib/reader/NodeBufferReader.js +19 -0
  104. data/node_modules/jszip/lib/reader/StringReader.js +38 -0
  105. data/node_modules/jszip/lib/reader/Uint8ArrayReader.js +22 -0
  106. data/node_modules/jszip/lib/reader/readerFor.js +28 -0
  107. data/node_modules/jszip/lib/signature.js +7 -0
  108. data/node_modules/jszip/lib/stream/ConvertWorker.js +26 -0
  109. data/node_modules/jszip/lib/stream/Crc32Probe.js +24 -0
  110. data/node_modules/jszip/lib/stream/DataLengthProbe.js +29 -0
  111. data/node_modules/jszip/lib/stream/DataWorker.js +116 -0
  112. data/node_modules/jszip/lib/stream/GenericWorker.js +263 -0
  113. data/node_modules/jszip/lib/stream/StreamHelper.js +212 -0
  114. data/node_modules/jszip/lib/support.js +38 -0
  115. data/node_modules/jszip/lib/utf8.js +275 -0
  116. data/node_modules/jszip/lib/utils.js +476 -0
  117. data/node_modules/jszip/lib/zipEntries.js +262 -0
  118. data/node_modules/jszip/lib/zipEntry.js +294 -0
  119. data/node_modules/jszip/lib/zipObject.js +133 -0
  120. data/node_modules/jszip/package.json +63 -0
  121. data/node_modules/jszip/vendor/FileSaver.js +247 -0
  122. data/node_modules/lie/README.md +62 -0
  123. data/node_modules/lie/dist/lie.js +350 -0
  124. data/node_modules/lie/dist/lie.min.js +1 -0
  125. data/node_modules/lie/dist/lie.polyfill.js +358 -0
  126. data/node_modules/lie/dist/lie.polyfill.min.js +1 -0
  127. data/node_modules/lie/lib/browser.js +273 -0
  128. data/node_modules/lie/lib/index.js +298 -0
  129. data/node_modules/lie/license.md +7 -0
  130. data/node_modules/lie/lie.d.ts +244 -0
  131. data/node_modules/lie/package.json +69 -0
  132. data/node_modules/lie/polyfill.js +4 -0
  133. data/node_modules/minimatch/LICENSE +15 -0
  134. data/node_modules/minimatch/README.md +209 -0
  135. data/node_modules/minimatch/minimatch.js +923 -0
  136. data/node_modules/minimatch/package.json +30 -0
  137. data/node_modules/once/LICENSE +15 -0
  138. data/node_modules/once/README.md +79 -0
  139. data/node_modules/once/once.js +42 -0
  140. data/node_modules/once/package.json +33 -0
  141. data/node_modules/pako/CHANGELOG.md +164 -0
  142. data/node_modules/pako/LICENSE +21 -0
  143. data/node_modules/pako/README.md +191 -0
  144. data/node_modules/pako/dist/pako.js +6818 -0
  145. data/node_modules/pako/dist/pako.min.js +1 -0
  146. data/node_modules/pako/dist/pako_deflate.js +3997 -0
  147. data/node_modules/pako/dist/pako_deflate.min.js +1 -0
  148. data/node_modules/pako/dist/pako_inflate.js +3300 -0
  149. data/node_modules/pako/dist/pako_inflate.min.js +1 -0
  150. data/node_modules/pako/index.js +14 -0
  151. data/node_modules/pako/lib/deflate.js +400 -0
  152. data/node_modules/pako/lib/inflate.js +423 -0
  153. data/node_modules/pako/lib/utils/common.js +105 -0
  154. data/node_modules/pako/lib/utils/strings.js +187 -0
  155. data/node_modules/pako/lib/zlib/README +59 -0
  156. data/node_modules/pako/lib/zlib/adler32.js +51 -0
  157. data/node_modules/pako/lib/zlib/constants.js +68 -0
  158. data/node_modules/pako/lib/zlib/crc32.js +59 -0
  159. data/node_modules/pako/lib/zlib/deflate.js +1874 -0
  160. data/node_modules/pako/lib/zlib/gzheader.js +58 -0
  161. data/node_modules/pako/lib/zlib/inffast.js +345 -0
  162. data/node_modules/pako/lib/zlib/inflate.js +1556 -0
  163. data/node_modules/pako/lib/zlib/inftrees.js +343 -0
  164. data/node_modules/pako/lib/zlib/messages.js +32 -0
  165. data/node_modules/pako/lib/zlib/trees.js +1222 -0
  166. data/node_modules/pako/lib/zlib/zstream.js +47 -0
  167. data/node_modules/pako/package.json +44 -0
  168. data/node_modules/path-is-absolute/index.js +20 -0
  169. data/node_modules/path-is-absolute/license +21 -0
  170. data/node_modules/path-is-absolute/package.json +43 -0
  171. data/node_modules/path-is-absolute/readme.md +59 -0
  172. data/node_modules/process-nextick-args/index.js +45 -0
  173. data/node_modules/process-nextick-args/license.md +19 -0
  174. data/node_modules/process-nextick-args/package.json +25 -0
  175. data/node_modules/process-nextick-args/readme.md +18 -0
  176. data/node_modules/readable-stream/.travis.yml +34 -0
  177. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  178. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  179. data/node_modules/readable-stream/LICENSE +47 -0
  180. data/node_modules/readable-stream/README.md +58 -0
  181. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  182. data/node_modules/readable-stream/duplex-browser.js +1 -0
  183. data/node_modules/readable-stream/duplex.js +1 -0
  184. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  185. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  186. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  187. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  188. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  189. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  190. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  191. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  192. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  193. data/node_modules/readable-stream/package.json +52 -0
  194. data/node_modules/readable-stream/passthrough.js +1 -0
  195. data/node_modules/readable-stream/readable-browser.js +7 -0
  196. data/node_modules/readable-stream/readable.js +19 -0
  197. data/node_modules/readable-stream/transform.js +1 -0
  198. data/node_modules/readable-stream/writable-browser.js +1 -0
  199. data/node_modules/readable-stream/writable.js +8 -0
  200. data/node_modules/rimraf/LICENSE +15 -0
  201. data/node_modules/rimraf/README.md +101 -0
  202. data/node_modules/rimraf/bin.js +50 -0
  203. data/node_modules/rimraf/package.json +29 -0
  204. data/node_modules/rimraf/rimraf.js +372 -0
  205. data/node_modules/safe-buffer/LICENSE +21 -0
  206. data/node_modules/safe-buffer/README.md +584 -0
  207. data/node_modules/safe-buffer/index.d.ts +187 -0
  208. data/node_modules/safe-buffer/index.js +62 -0
  209. data/node_modules/safe-buffer/package.json +37 -0
  210. data/node_modules/selenium-webdriver/CHANGES.md +1114 -0
  211. data/node_modules/selenium-webdriver/LICENSE +202 -0
  212. data/node_modules/selenium-webdriver/NOTICE +2 -0
  213. data/node_modules/selenium-webdriver/README.md +229 -0
  214. data/node_modules/selenium-webdriver/chrome.js +295 -0
  215. data/node_modules/selenium-webdriver/chromium.js +829 -0
  216. data/node_modules/selenium-webdriver/devtools/CDPConnection.js +35 -0
  217. data/node_modules/selenium-webdriver/edge.js +224 -0
  218. data/node_modules/selenium-webdriver/example/chrome_android.js +45 -0
  219. data/node_modules/selenium-webdriver/example/chrome_mobile_emulation.js +46 -0
  220. data/node_modules/selenium-webdriver/example/firefox_channels.js +84 -0
  221. data/node_modules/selenium-webdriver/example/google_search.js +50 -0
  222. data/node_modules/selenium-webdriver/example/google_search_test.js +70 -0
  223. data/node_modules/selenium-webdriver/example/headless.js +63 -0
  224. data/node_modules/selenium-webdriver/example/logging.js +64 -0
  225. data/node_modules/selenium-webdriver/firefox.js +789 -0
  226. data/node_modules/selenium-webdriver/http/index.js +324 -0
  227. data/node_modules/selenium-webdriver/http/util.js +172 -0
  228. data/node_modules/selenium-webdriver/ie.js +503 -0
  229. data/node_modules/selenium-webdriver/index.js +825 -0
  230. data/node_modules/selenium-webdriver/io/exec.js +162 -0
  231. data/node_modules/selenium-webdriver/io/index.js +348 -0
  232. data/node_modules/selenium-webdriver/io/zip.js +223 -0
  233. data/node_modules/selenium-webdriver/lib/atoms/find-elements.js +123 -0
  234. data/node_modules/selenium-webdriver/lib/atoms/get-attribute.js +101 -0
  235. data/node_modules/selenium-webdriver/lib/atoms/is-displayed.js +101 -0
  236. data/node_modules/selenium-webdriver/lib/atoms/mutation-listener.js +55 -0
  237. data/node_modules/selenium-webdriver/lib/by.js +415 -0
  238. data/node_modules/selenium-webdriver/lib/capabilities.js +553 -0
  239. data/node_modules/selenium-webdriver/lib/command.js +206 -0
  240. data/node_modules/selenium-webdriver/lib/error.js +605 -0
  241. data/node_modules/selenium-webdriver/lib/http.js +704 -0
  242. data/node_modules/selenium-webdriver/lib/input.js +946 -0
  243. data/node_modules/selenium-webdriver/lib/logging.js +661 -0
  244. data/node_modules/selenium-webdriver/lib/promise.js +285 -0
  245. data/node_modules/selenium-webdriver/lib/proxy.js +212 -0
  246. data/node_modules/selenium-webdriver/lib/session.js +77 -0
  247. data/node_modules/selenium-webdriver/lib/symbols.js +37 -0
  248. data/node_modules/selenium-webdriver/lib/until.js +429 -0
  249. data/node_modules/selenium-webdriver/lib/webdriver.js +2919 -0
  250. data/node_modules/selenium-webdriver/net/index.js +107 -0
  251. data/node_modules/selenium-webdriver/net/portprober.js +75 -0
  252. data/node_modules/selenium-webdriver/opera.js +406 -0
  253. data/node_modules/selenium-webdriver/package.json +54 -0
  254. data/node_modules/selenium-webdriver/proxy.js +32 -0
  255. data/node_modules/selenium-webdriver/remote/index.js +624 -0
  256. data/node_modules/selenium-webdriver/safari.js +168 -0
  257. data/node_modules/selenium-webdriver/testing/index.js +504 -0
  258. data/node_modules/set-immediate-shim/index.js +7 -0
  259. data/node_modules/set-immediate-shim/package.json +34 -0
  260. data/node_modules/set-immediate-shim/readme.md +31 -0
  261. data/node_modules/string_decoder/.travis.yml +50 -0
  262. data/node_modules/string_decoder/LICENSE +48 -0
  263. data/node_modules/string_decoder/README.md +47 -0
  264. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  265. data/node_modules/string_decoder/package.json +31 -0
  266. data/node_modules/tmp/CHANGELOG.md +288 -0
  267. data/node_modules/tmp/LICENSE +21 -0
  268. data/node_modules/tmp/README.md +365 -0
  269. data/node_modules/tmp/lib/tmp.js +780 -0
  270. data/node_modules/tmp/node_modules/.bin/rimraf +1 -0
  271. data/node_modules/tmp/node_modules/rimraf/CHANGELOG.md +65 -0
  272. data/node_modules/tmp/node_modules/rimraf/LICENSE +15 -0
  273. data/node_modules/tmp/node_modules/rimraf/README.md +101 -0
  274. data/node_modules/tmp/node_modules/rimraf/bin.js +68 -0
  275. data/node_modules/tmp/node_modules/rimraf/package.json +32 -0
  276. data/node_modules/tmp/node_modules/rimraf/rimraf.js +360 -0
  277. data/node_modules/tmp/package.json +58 -0
  278. data/node_modules/util-deprecate/History.md +16 -0
  279. data/node_modules/util-deprecate/LICENSE +24 -0
  280. data/node_modules/util-deprecate/README.md +53 -0
  281. data/node_modules/util-deprecate/browser.js +67 -0
  282. data/node_modules/util-deprecate/node.js +6 -0
  283. data/node_modules/util-deprecate/package.json +27 -0
  284. data/node_modules/wrappy/LICENSE +15 -0
  285. data/node_modules/wrappy/README.md +36 -0
  286. data/node_modules/wrappy/package.json +29 -0
  287. data/node_modules/wrappy/wrappy.js +33 -0
  288. data/node_modules/ws/LICENSE +21 -0
  289. data/node_modules/ws/README.md +496 -0
  290. data/node_modules/ws/browser.js +8 -0
  291. data/node_modules/ws/index.js +10 -0
  292. data/node_modules/ws/lib/buffer-util.js +129 -0
  293. data/node_modules/ws/lib/constants.js +10 -0
  294. data/node_modules/ws/lib/event-target.js +184 -0
  295. data/node_modules/ws/lib/extension.js +223 -0
  296. data/node_modules/ws/lib/limiter.js +55 -0
  297. data/node_modules/ws/lib/permessage-deflate.js +517 -0
  298. data/node_modules/ws/lib/receiver.js +507 -0
  299. data/node_modules/ws/lib/sender.js +405 -0
  300. data/node_modules/ws/lib/stream.js +165 -0
  301. data/node_modules/ws/lib/validation.js +104 -0
  302. data/node_modules/ws/lib/websocket-server.js +418 -0
  303. data/node_modules/ws/lib/websocket.js +942 -0
  304. data/node_modules/ws/package.json +56 -0
  305. data/package-lock.json +458 -0
  306. data/package.json +5 -0
  307. data/selenium.log +1 -0
  308. metadata +314 -19
@@ -0,0 +1,923 @@
1
+ module.exports = minimatch
2
+ minimatch.Minimatch = Minimatch
3
+
4
+ var path = { sep: '/' }
5
+ try {
6
+ path = require('path')
7
+ } catch (er) {}
8
+
9
+ var GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
10
+ var expand = require('brace-expansion')
11
+
12
+ var plTypes = {
13
+ '!': { open: '(?:(?!(?:', close: '))[^/]*?)'},
14
+ '?': { open: '(?:', close: ')?' },
15
+ '+': { open: '(?:', close: ')+' },
16
+ '*': { open: '(?:', close: ')*' },
17
+ '@': { open: '(?:', close: ')' }
18
+ }
19
+
20
+ // any single thing other than /
21
+ // don't need to escape / when using new RegExp()
22
+ var qmark = '[^/]'
23
+
24
+ // * => any number of characters
25
+ var star = qmark + '*?'
26
+
27
+ // ** when dots are allowed. Anything goes, except .. and .
28
+ // not (^ or / followed by one or two dots followed by $ or /),
29
+ // followed by anything, any number of times.
30
+ var twoStarDot = '(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?'
31
+
32
+ // not a ^ or / followed by a dot,
33
+ // followed by anything, any number of times.
34
+ var twoStarNoDot = '(?:(?!(?:\\\/|^)\\.).)*?'
35
+
36
+ // characters that need to be escaped in RegExp.
37
+ var reSpecials = charSet('().*{}+?[]^$\\!')
38
+
39
+ // "abc" -> { a:true, b:true, c:true }
40
+ function charSet (s) {
41
+ return s.split('').reduce(function (set, c) {
42
+ set[c] = true
43
+ return set
44
+ }, {})
45
+ }
46
+
47
+ // normalizes slashes.
48
+ var slashSplit = /\/+/
49
+
50
+ minimatch.filter = filter
51
+ function filter (pattern, options) {
52
+ options = options || {}
53
+ return function (p, i, list) {
54
+ return minimatch(p, pattern, options)
55
+ }
56
+ }
57
+
58
+ function ext (a, b) {
59
+ a = a || {}
60
+ b = b || {}
61
+ var t = {}
62
+ Object.keys(b).forEach(function (k) {
63
+ t[k] = b[k]
64
+ })
65
+ Object.keys(a).forEach(function (k) {
66
+ t[k] = a[k]
67
+ })
68
+ return t
69
+ }
70
+
71
+ minimatch.defaults = function (def) {
72
+ if (!def || !Object.keys(def).length) return minimatch
73
+
74
+ var orig = minimatch
75
+
76
+ var m = function minimatch (p, pattern, options) {
77
+ return orig.minimatch(p, pattern, ext(def, options))
78
+ }
79
+
80
+ m.Minimatch = function Minimatch (pattern, options) {
81
+ return new orig.Minimatch(pattern, ext(def, options))
82
+ }
83
+
84
+ return m
85
+ }
86
+
87
+ Minimatch.defaults = function (def) {
88
+ if (!def || !Object.keys(def).length) return Minimatch
89
+ return minimatch.defaults(def).Minimatch
90
+ }
91
+
92
+ function minimatch (p, pattern, options) {
93
+ if (typeof pattern !== 'string') {
94
+ throw new TypeError('glob pattern string required')
95
+ }
96
+
97
+ if (!options) options = {}
98
+
99
+ // shortcut: comments match nothing.
100
+ if (!options.nocomment && pattern.charAt(0) === '#') {
101
+ return false
102
+ }
103
+
104
+ // "" only matches ""
105
+ if (pattern.trim() === '') return p === ''
106
+
107
+ return new Minimatch(pattern, options).match(p)
108
+ }
109
+
110
+ function Minimatch (pattern, options) {
111
+ if (!(this instanceof Minimatch)) {
112
+ return new Minimatch(pattern, options)
113
+ }
114
+
115
+ if (typeof pattern !== 'string') {
116
+ throw new TypeError('glob pattern string required')
117
+ }
118
+
119
+ if (!options) options = {}
120
+ pattern = pattern.trim()
121
+
122
+ // windows support: need to use /, not \
123
+ if (path.sep !== '/') {
124
+ pattern = pattern.split(path.sep).join('/')
125
+ }
126
+
127
+ this.options = options
128
+ this.set = []
129
+ this.pattern = pattern
130
+ this.regexp = null
131
+ this.negate = false
132
+ this.comment = false
133
+ this.empty = false
134
+
135
+ // make the set of regexps etc.
136
+ this.make()
137
+ }
138
+
139
+ Minimatch.prototype.debug = function () {}
140
+
141
+ Minimatch.prototype.make = make
142
+ function make () {
143
+ // don't do it more than once.
144
+ if (this._made) return
145
+
146
+ var pattern = this.pattern
147
+ var options = this.options
148
+
149
+ // empty patterns and comments match nothing.
150
+ if (!options.nocomment && pattern.charAt(0) === '#') {
151
+ this.comment = true
152
+ return
153
+ }
154
+ if (!pattern) {
155
+ this.empty = true
156
+ return
157
+ }
158
+
159
+ // step 1: figure out negation, etc.
160
+ this.parseNegate()
161
+
162
+ // step 2: expand braces
163
+ var set = this.globSet = this.braceExpand()
164
+
165
+ if (options.debug) this.debug = console.error
166
+
167
+ this.debug(this.pattern, set)
168
+
169
+ // step 3: now we have a set, so turn each one into a series of path-portion
170
+ // matching patterns.
171
+ // These will be regexps, except in the case of "**", which is
172
+ // set to the GLOBSTAR object for globstar behavior,
173
+ // and will not contain any / characters
174
+ set = this.globParts = set.map(function (s) {
175
+ return s.split(slashSplit)
176
+ })
177
+
178
+ this.debug(this.pattern, set)
179
+
180
+ // glob --> regexps
181
+ set = set.map(function (s, si, set) {
182
+ return s.map(this.parse, this)
183
+ }, this)
184
+
185
+ this.debug(this.pattern, set)
186
+
187
+ // filter out everything that didn't compile properly.
188
+ set = set.filter(function (s) {
189
+ return s.indexOf(false) === -1
190
+ })
191
+
192
+ this.debug(this.pattern, set)
193
+
194
+ this.set = set
195
+ }
196
+
197
+ Minimatch.prototype.parseNegate = parseNegate
198
+ function parseNegate () {
199
+ var pattern = this.pattern
200
+ var negate = false
201
+ var options = this.options
202
+ var negateOffset = 0
203
+
204
+ if (options.nonegate) return
205
+
206
+ for (var i = 0, l = pattern.length
207
+ ; i < l && pattern.charAt(i) === '!'
208
+ ; i++) {
209
+ negate = !negate
210
+ negateOffset++
211
+ }
212
+
213
+ if (negateOffset) this.pattern = pattern.substr(negateOffset)
214
+ this.negate = negate
215
+ }
216
+
217
+ // Brace expansion:
218
+ // a{b,c}d -> abd acd
219
+ // a{b,}c -> abc ac
220
+ // a{0..3}d -> a0d a1d a2d a3d
221
+ // a{b,c{d,e}f}g -> abg acdfg acefg
222
+ // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
223
+ //
224
+ // Invalid sets are not expanded.
225
+ // a{2..}b -> a{2..}b
226
+ // a{b}c -> a{b}c
227
+ minimatch.braceExpand = function (pattern, options) {
228
+ return braceExpand(pattern, options)
229
+ }
230
+
231
+ Minimatch.prototype.braceExpand = braceExpand
232
+
233
+ function braceExpand (pattern, options) {
234
+ if (!options) {
235
+ if (this instanceof Minimatch) {
236
+ options = this.options
237
+ } else {
238
+ options = {}
239
+ }
240
+ }
241
+
242
+ pattern = typeof pattern === 'undefined'
243
+ ? this.pattern : pattern
244
+
245
+ if (typeof pattern === 'undefined') {
246
+ throw new TypeError('undefined pattern')
247
+ }
248
+
249
+ if (options.nobrace ||
250
+ !pattern.match(/\{.*\}/)) {
251
+ // shortcut. no need to expand.
252
+ return [pattern]
253
+ }
254
+
255
+ return expand(pattern)
256
+ }
257
+
258
+ // parse a component of the expanded set.
259
+ // At this point, no pattern may contain "/" in it
260
+ // so we're going to return a 2d array, where each entry is the full
261
+ // pattern, split on '/', and then turned into a regular expression.
262
+ // A regexp is made at the end which joins each array with an
263
+ // escaped /, and another full one which joins each regexp with |.
264
+ //
265
+ // Following the lead of Bash 4.1, note that "**" only has special meaning
266
+ // when it is the *only* thing in a path portion. Otherwise, any series
267
+ // of * is equivalent to a single *. Globstar behavior is enabled by
268
+ // default, and can be disabled by setting options.noglobstar.
269
+ Minimatch.prototype.parse = parse
270
+ var SUBPARSE = {}
271
+ function parse (pattern, isSub) {
272
+ if (pattern.length > 1024 * 64) {
273
+ throw new TypeError('pattern is too long')
274
+ }
275
+
276
+ var options = this.options
277
+
278
+ // shortcuts
279
+ if (!options.noglobstar && pattern === '**') return GLOBSTAR
280
+ if (pattern === '') return ''
281
+
282
+ var re = ''
283
+ var hasMagic = !!options.nocase
284
+ var escaping = false
285
+ // ? => one single character
286
+ var patternListStack = []
287
+ var negativeLists = []
288
+ var stateChar
289
+ var inClass = false
290
+ var reClassStart = -1
291
+ var classStart = -1
292
+ // . and .. never match anything that doesn't start with .,
293
+ // even when options.dot is set.
294
+ var patternStart = pattern.charAt(0) === '.' ? '' // anything
295
+ // not (start or / followed by . or .. followed by / or end)
296
+ : options.dot ? '(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))'
297
+ : '(?!\\.)'
298
+ var self = this
299
+
300
+ function clearStateChar () {
301
+ if (stateChar) {
302
+ // we had some state-tracking character
303
+ // that wasn't consumed by this pass.
304
+ switch (stateChar) {
305
+ case '*':
306
+ re += star
307
+ hasMagic = true
308
+ break
309
+ case '?':
310
+ re += qmark
311
+ hasMagic = true
312
+ break
313
+ default:
314
+ re += '\\' + stateChar
315
+ break
316
+ }
317
+ self.debug('clearStateChar %j %j', stateChar, re)
318
+ stateChar = false
319
+ }
320
+ }
321
+
322
+ for (var i = 0, len = pattern.length, c
323
+ ; (i < len) && (c = pattern.charAt(i))
324
+ ; i++) {
325
+ this.debug('%s\t%s %s %j', pattern, i, re, c)
326
+
327
+ // skip over any that are escaped.
328
+ if (escaping && reSpecials[c]) {
329
+ re += '\\' + c
330
+ escaping = false
331
+ continue
332
+ }
333
+
334
+ switch (c) {
335
+ case '/':
336
+ // completely not allowed, even escaped.
337
+ // Should already be path-split by now.
338
+ return false
339
+
340
+ case '\\':
341
+ clearStateChar()
342
+ escaping = true
343
+ continue
344
+
345
+ // the various stateChar values
346
+ // for the "extglob" stuff.
347
+ case '?':
348
+ case '*':
349
+ case '+':
350
+ case '@':
351
+ case '!':
352
+ this.debug('%s\t%s %s %j <-- stateChar', pattern, i, re, c)
353
+
354
+ // all of those are literals inside a class, except that
355
+ // the glob [!a] means [^a] in regexp
356
+ if (inClass) {
357
+ this.debug(' in class')
358
+ if (c === '!' && i === classStart + 1) c = '^'
359
+ re += c
360
+ continue
361
+ }
362
+
363
+ // if we already have a stateChar, then it means
364
+ // that there was something like ** or +? in there.
365
+ // Handle the stateChar, then proceed with this one.
366
+ self.debug('call clearStateChar %j', stateChar)
367
+ clearStateChar()
368
+ stateChar = c
369
+ // if extglob is disabled, then +(asdf|foo) isn't a thing.
370
+ // just clear the statechar *now*, rather than even diving into
371
+ // the patternList stuff.
372
+ if (options.noext) clearStateChar()
373
+ continue
374
+
375
+ case '(':
376
+ if (inClass) {
377
+ re += '('
378
+ continue
379
+ }
380
+
381
+ if (!stateChar) {
382
+ re += '\\('
383
+ continue
384
+ }
385
+
386
+ patternListStack.push({
387
+ type: stateChar,
388
+ start: i - 1,
389
+ reStart: re.length,
390
+ open: plTypes[stateChar].open,
391
+ close: plTypes[stateChar].close
392
+ })
393
+ // negation is (?:(?!js)[^/]*)
394
+ re += stateChar === '!' ? '(?:(?!(?:' : '(?:'
395
+ this.debug('plType %j %j', stateChar, re)
396
+ stateChar = false
397
+ continue
398
+
399
+ case ')':
400
+ if (inClass || !patternListStack.length) {
401
+ re += '\\)'
402
+ continue
403
+ }
404
+
405
+ clearStateChar()
406
+ hasMagic = true
407
+ var pl = patternListStack.pop()
408
+ // negation is (?:(?!js)[^/]*)
409
+ // The others are (?:<pattern>)<type>
410
+ re += pl.close
411
+ if (pl.type === '!') {
412
+ negativeLists.push(pl)
413
+ }
414
+ pl.reEnd = re.length
415
+ continue
416
+
417
+ case '|':
418
+ if (inClass || !patternListStack.length || escaping) {
419
+ re += '\\|'
420
+ escaping = false
421
+ continue
422
+ }
423
+
424
+ clearStateChar()
425
+ re += '|'
426
+ continue
427
+
428
+ // these are mostly the same in regexp and glob
429
+ case '[':
430
+ // swallow any state-tracking char before the [
431
+ clearStateChar()
432
+
433
+ if (inClass) {
434
+ re += '\\' + c
435
+ continue
436
+ }
437
+
438
+ inClass = true
439
+ classStart = i
440
+ reClassStart = re.length
441
+ re += c
442
+ continue
443
+
444
+ case ']':
445
+ // a right bracket shall lose its special
446
+ // meaning and represent itself in
447
+ // a bracket expression if it occurs
448
+ // first in the list. -- POSIX.2 2.8.3.2
449
+ if (i === classStart + 1 || !inClass) {
450
+ re += '\\' + c
451
+ escaping = false
452
+ continue
453
+ }
454
+
455
+ // handle the case where we left a class open.
456
+ // "[z-a]" is valid, equivalent to "\[z-a\]"
457
+ if (inClass) {
458
+ // split where the last [ was, make sure we don't have
459
+ // an invalid re. if so, re-walk the contents of the
460
+ // would-be class to re-translate any characters that
461
+ // were passed through as-is
462
+ // TODO: It would probably be faster to determine this
463
+ // without a try/catch and a new RegExp, but it's tricky
464
+ // to do safely. For now, this is safe and works.
465
+ var cs = pattern.substring(classStart + 1, i)
466
+ try {
467
+ RegExp('[' + cs + ']')
468
+ } catch (er) {
469
+ // not a valid class!
470
+ var sp = this.parse(cs, SUBPARSE)
471
+ re = re.substr(0, reClassStart) + '\\[' + sp[0] + '\\]'
472
+ hasMagic = hasMagic || sp[1]
473
+ inClass = false
474
+ continue
475
+ }
476
+ }
477
+
478
+ // finish up the class.
479
+ hasMagic = true
480
+ inClass = false
481
+ re += c
482
+ continue
483
+
484
+ default:
485
+ // swallow any state char that wasn't consumed
486
+ clearStateChar()
487
+
488
+ if (escaping) {
489
+ // no need
490
+ escaping = false
491
+ } else if (reSpecials[c]
492
+ && !(c === '^' && inClass)) {
493
+ re += '\\'
494
+ }
495
+
496
+ re += c
497
+
498
+ } // switch
499
+ } // for
500
+
501
+ // handle the case where we left a class open.
502
+ // "[abc" is valid, equivalent to "\[abc"
503
+ if (inClass) {
504
+ // split where the last [ was, and escape it
505
+ // this is a huge pita. We now have to re-walk
506
+ // the contents of the would-be class to re-translate
507
+ // any characters that were passed through as-is
508
+ cs = pattern.substr(classStart + 1)
509
+ sp = this.parse(cs, SUBPARSE)
510
+ re = re.substr(0, reClassStart) + '\\[' + sp[0]
511
+ hasMagic = hasMagic || sp[1]
512
+ }
513
+
514
+ // handle the case where we had a +( thing at the *end*
515
+ // of the pattern.
516
+ // each pattern list stack adds 3 chars, and we need to go through
517
+ // and escape any | chars that were passed through as-is for the regexp.
518
+ // Go through and escape them, taking care not to double-escape any
519
+ // | chars that were already escaped.
520
+ for (pl = patternListStack.pop(); pl; pl = patternListStack.pop()) {
521
+ var tail = re.slice(pl.reStart + pl.open.length)
522
+ this.debug('setting tail', re, pl)
523
+ // maybe some even number of \, then maybe 1 \, followed by a |
524
+ tail = tail.replace(/((?:\\{2}){0,64})(\\?)\|/g, function (_, $1, $2) {
525
+ if (!$2) {
526
+ // the | isn't already escaped, so escape it.
527
+ $2 = '\\'
528
+ }
529
+
530
+ // need to escape all those slashes *again*, without escaping the
531
+ // one that we need for escaping the | character. As it works out,
532
+ // escaping an even number of slashes can be done by simply repeating
533
+ // it exactly after itself. That's why this trick works.
534
+ //
535
+ // I am sorry that you have to see this.
536
+ return $1 + $1 + $2 + '|'
537
+ })
538
+
539
+ this.debug('tail=%j\n %s', tail, tail, pl, re)
540
+ var t = pl.type === '*' ? star
541
+ : pl.type === '?' ? qmark
542
+ : '\\' + pl.type
543
+
544
+ hasMagic = true
545
+ re = re.slice(0, pl.reStart) + t + '\\(' + tail
546
+ }
547
+
548
+ // handle trailing things that only matter at the very end.
549
+ clearStateChar()
550
+ if (escaping) {
551
+ // trailing \\
552
+ re += '\\\\'
553
+ }
554
+
555
+ // only need to apply the nodot start if the re starts with
556
+ // something that could conceivably capture a dot
557
+ var addPatternStart = false
558
+ switch (re.charAt(0)) {
559
+ case '.':
560
+ case '[':
561
+ case '(': addPatternStart = true
562
+ }
563
+
564
+ // Hack to work around lack of negative lookbehind in JS
565
+ // A pattern like: *.!(x).!(y|z) needs to ensure that a name
566
+ // like 'a.xyz.yz' doesn't match. So, the first negative
567
+ // lookahead, has to look ALL the way ahead, to the end of
568
+ // the pattern.
569
+ for (var n = negativeLists.length - 1; n > -1; n--) {
570
+ var nl = negativeLists[n]
571
+
572
+ var nlBefore = re.slice(0, nl.reStart)
573
+ var nlFirst = re.slice(nl.reStart, nl.reEnd - 8)
574
+ var nlLast = re.slice(nl.reEnd - 8, nl.reEnd)
575
+ var nlAfter = re.slice(nl.reEnd)
576
+
577
+ nlLast += nlAfter
578
+
579
+ // Handle nested stuff like *(*.js|!(*.json)), where open parens
580
+ // mean that we should *not* include the ) in the bit that is considered
581
+ // "after" the negated section.
582
+ var openParensBefore = nlBefore.split('(').length - 1
583
+ var cleanAfter = nlAfter
584
+ for (i = 0; i < openParensBefore; i++) {
585
+ cleanAfter = cleanAfter.replace(/\)[+*?]?/, '')
586
+ }
587
+ nlAfter = cleanAfter
588
+
589
+ var dollar = ''
590
+ if (nlAfter === '' && isSub !== SUBPARSE) {
591
+ dollar = '$'
592
+ }
593
+ var newRe = nlBefore + nlFirst + nlAfter + dollar + nlLast
594
+ re = newRe
595
+ }
596
+
597
+ // if the re is not "" at this point, then we need to make sure
598
+ // it doesn't match against an empty path part.
599
+ // Otherwise a/* will match a/, which it should not.
600
+ if (re !== '' && hasMagic) {
601
+ re = '(?=.)' + re
602
+ }
603
+
604
+ if (addPatternStart) {
605
+ re = patternStart + re
606
+ }
607
+
608
+ // parsing just a piece of a larger pattern.
609
+ if (isSub === SUBPARSE) {
610
+ return [re, hasMagic]
611
+ }
612
+
613
+ // skip the regexp for non-magical patterns
614
+ // unescape anything in it, though, so that it'll be
615
+ // an exact match against a file etc.
616
+ if (!hasMagic) {
617
+ return globUnescape(pattern)
618
+ }
619
+
620
+ var flags = options.nocase ? 'i' : ''
621
+ try {
622
+ var regExp = new RegExp('^' + re + '$', flags)
623
+ } catch (er) {
624
+ // If it was an invalid regular expression, then it can't match
625
+ // anything. This trick looks for a character after the end of
626
+ // the string, which is of course impossible, except in multi-line
627
+ // mode, but it's not a /m regex.
628
+ return new RegExp('$.')
629
+ }
630
+
631
+ regExp._glob = pattern
632
+ regExp._src = re
633
+
634
+ return regExp
635
+ }
636
+
637
+ minimatch.makeRe = function (pattern, options) {
638
+ return new Minimatch(pattern, options || {}).makeRe()
639
+ }
640
+
641
+ Minimatch.prototype.makeRe = makeRe
642
+ function makeRe () {
643
+ if (this.regexp || this.regexp === false) return this.regexp
644
+
645
+ // at this point, this.set is a 2d array of partial
646
+ // pattern strings, or "**".
647
+ //
648
+ // It's better to use .match(). This function shouldn't
649
+ // be used, really, but it's pretty convenient sometimes,
650
+ // when you just want to work with a regex.
651
+ var set = this.set
652
+
653
+ if (!set.length) {
654
+ this.regexp = false
655
+ return this.regexp
656
+ }
657
+ var options = this.options
658
+
659
+ var twoStar = options.noglobstar ? star
660
+ : options.dot ? twoStarDot
661
+ : twoStarNoDot
662
+ var flags = options.nocase ? 'i' : ''
663
+
664
+ var re = set.map(function (pattern) {
665
+ return pattern.map(function (p) {
666
+ return (p === GLOBSTAR) ? twoStar
667
+ : (typeof p === 'string') ? regExpEscape(p)
668
+ : p._src
669
+ }).join('\\\/')
670
+ }).join('|')
671
+
672
+ // must match entire pattern
673
+ // ending in a * or ** will make it less strict.
674
+ re = '^(?:' + re + ')$'
675
+
676
+ // can match anything, as long as it's not this.
677
+ if (this.negate) re = '^(?!' + re + ').*$'
678
+
679
+ try {
680
+ this.regexp = new RegExp(re, flags)
681
+ } catch (ex) {
682
+ this.regexp = false
683
+ }
684
+ return this.regexp
685
+ }
686
+
687
+ minimatch.match = function (list, pattern, options) {
688
+ options = options || {}
689
+ var mm = new Minimatch(pattern, options)
690
+ list = list.filter(function (f) {
691
+ return mm.match(f)
692
+ })
693
+ if (mm.options.nonull && !list.length) {
694
+ list.push(pattern)
695
+ }
696
+ return list
697
+ }
698
+
699
+ Minimatch.prototype.match = match
700
+ function match (f, partial) {
701
+ this.debug('match', f, this.pattern)
702
+ // short-circuit in the case of busted things.
703
+ // comments, etc.
704
+ if (this.comment) return false
705
+ if (this.empty) return f === ''
706
+
707
+ if (f === '/' && partial) return true
708
+
709
+ var options = this.options
710
+
711
+ // windows: need to use /, not \
712
+ if (path.sep !== '/') {
713
+ f = f.split(path.sep).join('/')
714
+ }
715
+
716
+ // treat the test path as a set of pathparts.
717
+ f = f.split(slashSplit)
718
+ this.debug(this.pattern, 'split', f)
719
+
720
+ // just ONE of the pattern sets in this.set needs to match
721
+ // in order for it to be valid. If negating, then just one
722
+ // match means that we have failed.
723
+ // Either way, return on the first hit.
724
+
725
+ var set = this.set
726
+ this.debug(this.pattern, 'set', set)
727
+
728
+ // Find the basename of the path by looking for the last non-empty segment
729
+ var filename
730
+ var i
731
+ for (i = f.length - 1; i >= 0; i--) {
732
+ filename = f[i]
733
+ if (filename) break
734
+ }
735
+
736
+ for (i = 0; i < set.length; i++) {
737
+ var pattern = set[i]
738
+ var file = f
739
+ if (options.matchBase && pattern.length === 1) {
740
+ file = [filename]
741
+ }
742
+ var hit = this.matchOne(file, pattern, partial)
743
+ if (hit) {
744
+ if (options.flipNegate) return true
745
+ return !this.negate
746
+ }
747
+ }
748
+
749
+ // didn't get any hits. this is success if it's a negative
750
+ // pattern, failure otherwise.
751
+ if (options.flipNegate) return false
752
+ return this.negate
753
+ }
754
+
755
+ // set partial to true to test if, for example,
756
+ // "/a/b" matches the start of "/*/b/*/d"
757
+ // Partial means, if you run out of file before you run
758
+ // out of pattern, then that's fine, as long as all
759
+ // the parts match.
760
+ Minimatch.prototype.matchOne = function (file, pattern, partial) {
761
+ var options = this.options
762
+
763
+ this.debug('matchOne',
764
+ { 'this': this, file: file, pattern: pattern })
765
+
766
+ this.debug('matchOne', file.length, pattern.length)
767
+
768
+ for (var fi = 0,
769
+ pi = 0,
770
+ fl = file.length,
771
+ pl = pattern.length
772
+ ; (fi < fl) && (pi < pl)
773
+ ; fi++, pi++) {
774
+ this.debug('matchOne loop')
775
+ var p = pattern[pi]
776
+ var f = file[fi]
777
+
778
+ this.debug(pattern, p, f)
779
+
780
+ // should be impossible.
781
+ // some invalid regexp stuff in the set.
782
+ if (p === false) return false
783
+
784
+ if (p === GLOBSTAR) {
785
+ this.debug('GLOBSTAR', [pattern, p, f])
786
+
787
+ // "**"
788
+ // a/**/b/**/c would match the following:
789
+ // a/b/x/y/z/c
790
+ // a/x/y/z/b/c
791
+ // a/b/x/b/x/c
792
+ // a/b/c
793
+ // To do this, take the rest of the pattern after
794
+ // the **, and see if it would match the file remainder.
795
+ // If so, return success.
796
+ // If not, the ** "swallows" a segment, and try again.
797
+ // This is recursively awful.
798
+ //
799
+ // a/**/b/**/c matching a/b/x/y/z/c
800
+ // - a matches a
801
+ // - doublestar
802
+ // - matchOne(b/x/y/z/c, b/**/c)
803
+ // - b matches b
804
+ // - doublestar
805
+ // - matchOne(x/y/z/c, c) -> no
806
+ // - matchOne(y/z/c, c) -> no
807
+ // - matchOne(z/c, c) -> no
808
+ // - matchOne(c, c) yes, hit
809
+ var fr = fi
810
+ var pr = pi + 1
811
+ if (pr === pl) {
812
+ this.debug('** at the end')
813
+ // a ** at the end will just swallow the rest.
814
+ // We have found a match.
815
+ // however, it will not swallow /.x, unless
816
+ // options.dot is set.
817
+ // . and .. are *never* matched by **, for explosively
818
+ // exponential reasons.
819
+ for (; fi < fl; fi++) {
820
+ if (file[fi] === '.' || file[fi] === '..' ||
821
+ (!options.dot && file[fi].charAt(0) === '.')) return false
822
+ }
823
+ return true
824
+ }
825
+
826
+ // ok, let's see if we can swallow whatever we can.
827
+ while (fr < fl) {
828
+ var swallowee = file[fr]
829
+
830
+ this.debug('\nglobstar while', file, fr, pattern, pr, swallowee)
831
+
832
+ // XXX remove this slice. Just pass the start index.
833
+ if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
834
+ this.debug('globstar found match!', fr, fl, swallowee)
835
+ // found a match.
836
+ return true
837
+ } else {
838
+ // can't swallow "." or ".." ever.
839
+ // can only swallow ".foo" when explicitly asked.
840
+ if (swallowee === '.' || swallowee === '..' ||
841
+ (!options.dot && swallowee.charAt(0) === '.')) {
842
+ this.debug('dot detected!', file, fr, pattern, pr)
843
+ break
844
+ }
845
+
846
+ // ** swallows a segment, and continue.
847
+ this.debug('globstar swallow a segment, and continue')
848
+ fr++
849
+ }
850
+ }
851
+
852
+ // no match was found.
853
+ // However, in partial mode, we can't say this is necessarily over.
854
+ // If there's more *pattern* left, then
855
+ if (partial) {
856
+ // ran out of file
857
+ this.debug('\n>>> no match, partial?', file, fr, pattern, pr)
858
+ if (fr === fl) return true
859
+ }
860
+ return false
861
+ }
862
+
863
+ // something other than **
864
+ // non-magic patterns just have to match exactly
865
+ // patterns with magic have been turned into regexps.
866
+ var hit
867
+ if (typeof p === 'string') {
868
+ if (options.nocase) {
869
+ hit = f.toLowerCase() === p.toLowerCase()
870
+ } else {
871
+ hit = f === p
872
+ }
873
+ this.debug('string match', p, f, hit)
874
+ } else {
875
+ hit = f.match(p)
876
+ this.debug('pattern match', p, f, hit)
877
+ }
878
+
879
+ if (!hit) return false
880
+ }
881
+
882
+ // Note: ending in / means that we'll get a final ""
883
+ // at the end of the pattern. This can only match a
884
+ // corresponding "" at the end of the file.
885
+ // If the file ends in /, then it can only match a
886
+ // a pattern that ends in /, unless the pattern just
887
+ // doesn't have any more for it. But, a/b/ should *not*
888
+ // match "a/b/*", even though "" matches against the
889
+ // [^/]*? pattern, except in partial mode, where it might
890
+ // simply not be reached yet.
891
+ // However, a/b/ should still satisfy a/*
892
+
893
+ // now either we fell off the end of the pattern, or we're done.
894
+ if (fi === fl && pi === pl) {
895
+ // ran out of pattern and filename at the same time.
896
+ // an exact hit!
897
+ return true
898
+ } else if (fi === fl) {
899
+ // ran out of file, but still had pattern left.
900
+ // this is ok if we're doing the match as part of
901
+ // a glob fs traversal.
902
+ return partial
903
+ } else if (pi === pl) {
904
+ // ran out of pattern, still have file left.
905
+ // this is only acceptable if we're on the very last
906
+ // empty segment of a file with a trailing slash.
907
+ // a/* should match a/b/
908
+ var emptyFileEnd = (fi === fl - 1) && (file[fi] === '')
909
+ return emptyFileEnd
910
+ }
911
+
912
+ // should be unreachable.
913
+ throw new Error('wtf?')
914
+ }
915
+
916
+ // replace stuff like \* with *
917
+ function globUnescape (s) {
918
+ return s.replace(/\\(.)/g, '$1')
919
+ }
920
+
921
+ function regExpEscape (s) {
922
+ return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')
923
+ }