batman-rails-flo 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +29 -0
  3. data/Rakefile +2 -0
  4. data/lib/batman-rails-flo.rb +5 -0
  5. data/lib/batman_rails_flo/railtie.rb +9 -0
  6. data/lib/batman_rails_flo/tasks.rake +14 -0
  7. data/lib/batman_rails_flo/version.rb +3 -0
  8. data/vendor/assets/javascripts/batman_rails_flo/flo_server.js +67 -0
  9. data/vendor/assets/javascripts/batman_rails_flo/live_reload.js.coffee +129 -0
  10. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/CNAME +1 -0
  11. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/CONTRIBUTING.md +9 -0
  12. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/LICENSE +22 -0
  13. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/README +50 -0
  14. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/bin/cake +7 -0
  15. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/bin/coffee +7 -0
  16. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/browser.js +134 -0
  17. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/cake.js +112 -0
  18. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/coffee-script.js +335 -0
  19. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/command.js +569 -0
  20. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/grammar.js +631 -0
  21. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/helpers.js +252 -0
  22. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/index.js +11 -0
  23. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/lexer.js +926 -0
  24. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/nodes.js +3158 -0
  25. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/optparse.js +139 -0
  26. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/parser.js +724 -0
  27. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/register.js +66 -0
  28. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/repl.js +163 -0
  29. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/rewriter.js +475 -0
  30. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/scope.js +146 -0
  31. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/lib/coffee-script/sourcemap.js +161 -0
  32. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/LICENSE +21 -0
  33. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/examples/pow.js +6 -0
  34. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/index.js +82 -0
  35. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/package.json +34 -0
  36. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/readme.markdown +63 -0
  37. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/chmod.js +38 -0
  38. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/clobber.js +37 -0
  39. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/mkdirp.js +28 -0
  40. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/perm.js +32 -0
  41. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/perm_sync.js +39 -0
  42. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/race.js +41 -0
  43. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/rel.js +32 -0
  44. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/return.js +25 -0
  45. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/return_sync.js +24 -0
  46. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/root.js +18 -0
  47. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/sync.js +32 -0
  48. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/umask.js +28 -0
  49. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/node_modules/mkdirp/test/umask_sync.js +32 -0
  50. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/package.json +50 -0
  51. data/vendor/assets/javascripts/batman_rails_flo/node_modules/coffee-script/register.js +1 -0
  52. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/LICENSE +30 -0
  53. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/PATENTS +23 -0
  54. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/README.md +124 -0
  55. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/bin/flo +26 -0
  56. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/configure.html +57 -0
  57. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/configure.js +205 -0
  58. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/configure/style.css +334 -0
  59. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/connection.js +235 -0
  60. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/devtools.html +12 -0
  61. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/index.js +323 -0
  62. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/logger.js +42 -0
  63. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/logo.png +0 -0
  64. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/manifest.json +13 -0
  65. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/client/session.js +305 -0
  66. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/index.js +10 -0
  67. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/lib/flo.js +226 -0
  68. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/lib/server.js +94 -0
  69. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/README.md +66 -0
  70. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/index.js +437 -0
  71. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/LICENSE +23 -0
  72. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/README.md +218 -0
  73. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/minimatch.js +1055 -0
  74. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/CONTRIBUTORS +14 -0
  75. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/LICENSE +23 -0
  76. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/README.md +97 -0
  77. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/lib/lru-cache.js +252 -0
  78. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/package.json +33 -0
  79. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/basic.js +369 -0
  80. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/foreach.js +52 -0
  81. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/lru-cache/test/memory-leak.js +50 -0
  82. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/LICENSE +27 -0
  83. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/README.md +53 -0
  84. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/bench.js +283 -0
  85. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/package.json +42 -0
  86. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/sigmund.js +39 -0
  87. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/node_modules/sigmund/test/basic.js +24 -0
  88. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/package.json +40 -0
  89. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/basic.js +399 -0
  90. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/brace-expand.js +33 -0
  91. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/caching.js +14 -0
  92. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/defaults.js +274 -0
  93. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/minimatch/test/extglob-ending-with-state-char.js +8 -0
  94. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/lib/walker.js +111 -0
  95. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/license +13 -0
  96. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/lib/makeerror.js +87 -0
  97. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/lib/tmpl.js +17 -0
  98. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/package.json +31 -0
  99. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/node_modules/tmpl/readme.md +10 -0
  100. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/package.json +34 -0
  101. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/node_modules/makeerror/readme.md +77 -0
  102. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/package.json +36 -0
  103. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/walker/readme.md +52 -0
  104. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/LICENSE +55 -0
  105. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/main.js +128 -0
  106. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/package.json +34 -0
  107. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/readme.mkd +72 -0
  108. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/d/d/t +0 -0
  109. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/d/t +0 -0
  110. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_monitor.js +31 -0
  111. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_monitorRootDirectory.js +28 -0
  112. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/node_modules/watch/test/test_watchTree.js +20 -0
  113. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/package.json +45 -0
  114. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/sane/test/test.js +243 -0
  115. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/CHANGELOG.md +81 -0
  116. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/LICENSE +177 -0
  117. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/Makefile +11 -0
  118. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/README.md +245 -0
  119. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/binding.gyp +14 -0
  120. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Makefile +355 -0
  121. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/linker.lock +0 -0
  122. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/obj.target/validation/src/validation.o +0 -0
  123. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/obj.target/xor/src/xor.o +0 -0
  124. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/validation.node +0 -0
  125. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/Release/xor.node +0 -0
  126. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/binding.Makefile +6 -0
  127. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/config.gypi +115 -0
  128. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/gyp-mac-tool +512 -0
  129. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/validation.target.mk +154 -0
  130. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/build/xor.target.mk +154 -0
  131. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/index.js +1 -0
  132. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/install.js +31 -0
  133. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Constants.js +23 -0
  134. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Deprecation.js +38 -0
  135. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Validation.fallback.js +12 -0
  136. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/Validation.js +18 -0
  137. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketClient.js +359 -0
  138. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketConnection.js +717 -0
  139. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketFrame.js +282 -0
  140. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRequest.js +478 -0
  141. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRouter.js +154 -0
  142. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketRouterRequest.js +59 -0
  143. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/WebSocketServer.js +216 -0
  144. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/utils.js +7 -0
  145. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/websocket.js +11 -0
  146. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/xor.fallback.js +13 -0
  147. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/lib/xor.js +18 -0
  148. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/package.json +43 -0
  149. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/src/validation.cc +144 -0
  150. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/src/xor.cpp +86 -0
  151. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/FastBufferList.js +192 -0
  152. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/node-ctype/LICENSE +18 -0
  153. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/node_modules/websocket/vendor/node-ctype/ctio-faster.js +1126 -0
  154. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/package.json +25 -0
  155. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/browser_websocket.js +63 -0
  156. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/connection_test.js +57 -0
  157. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/logger_mock.js +15 -0
  158. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/client/session_test.js +194 -0
  159. data/vendor/assets/javascripts/batman_rails_flo/node_modules/fb-flo/test/server/flo_test.js +211 -0
  160. data/vendor/assets/javascripts/batman_rails_flo/package.json +15 -0
  161. data/vendor/assets/javascripts/batman_rails_flo/reload_event_handler.js.coffee +56 -0
  162. metadata +232 -0
@@ -0,0 +1,23 @@
1
+ Copyright 2009, 2010, 2011 Isaac Z. Schlueter.
2
+ All rights reserved.
3
+
4
+ Permission is hereby granted, free of charge, to any person
5
+ obtaining a copy of this software and associated documentation
6
+ files (the "Software"), to deal in the Software without
7
+ restriction, including without limitation the rights to use,
8
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the
10
+ Software is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
+ OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,218 @@
1
+ # minimatch
2
+
3
+ A minimal matching utility.
4
+
5
+ [![Build Status](https://secure.travis-ci.org/isaacs/minimatch.png)](http://travis-ci.org/isaacs/minimatch)
6
+
7
+
8
+ This is the matching library used internally by npm.
9
+
10
+ Eventually, it will replace the C binding in node-glob.
11
+
12
+ It works by converting glob expressions into JavaScript `RegExp`
13
+ objects.
14
+
15
+ ## Usage
16
+
17
+ ```javascript
18
+ var minimatch = require("minimatch")
19
+
20
+ minimatch("bar.foo", "*.foo") // true!
21
+ minimatch("bar.foo", "*.bar") // false!
22
+ minimatch("bar.foo", "*.+(bar|foo)", { debug: true }) // true, and noisy!
23
+ ```
24
+
25
+ ## Features
26
+
27
+ Supports these glob features:
28
+
29
+ * Brace Expansion
30
+ * Extended glob matching
31
+ * "Globstar" `**` matching
32
+
33
+ See:
34
+
35
+ * `man sh`
36
+ * `man bash`
37
+ * `man 3 fnmatch`
38
+ * `man 5 gitignore`
39
+
40
+ ## Minimatch Class
41
+
42
+ Create a minimatch object by instanting the `minimatch.Minimatch` class.
43
+
44
+ ```javascript
45
+ var Minimatch = require("minimatch").Minimatch
46
+ var mm = new Minimatch(pattern, options)
47
+ ```
48
+
49
+ ### Properties
50
+
51
+ * `pattern` The original pattern the minimatch object represents.
52
+ * `options` The options supplied to the constructor.
53
+ * `set` A 2-dimensional array of regexp or string expressions.
54
+ Each row in the
55
+ array corresponds to a brace-expanded pattern. Each item in the row
56
+ corresponds to a single path-part. For example, the pattern
57
+ `{a,b/c}/d` would expand to a set of patterns like:
58
+
59
+ [ [ a, d ]
60
+ , [ b, c, d ] ]
61
+
62
+ If a portion of the pattern doesn't have any "magic" in it
63
+ (that is, it's something like `"foo"` rather than `fo*o?`), then it
64
+ will be left as a string rather than converted to a regular
65
+ expression.
66
+
67
+ * `regexp` Created by the `makeRe` method. A single regular expression
68
+ expressing the entire pattern. This is useful in cases where you wish
69
+ to use the pattern somewhat like `fnmatch(3)` with `FNM_PATH` enabled.
70
+ * `negate` True if the pattern is negated.
71
+ * `comment` True if the pattern is a comment.
72
+ * `empty` True if the pattern is `""`.
73
+
74
+ ### Methods
75
+
76
+ * `makeRe` Generate the `regexp` member if necessary, and return it.
77
+ Will return `false` if the pattern is invalid.
78
+ * `match(fname)` Return true if the filename matches the pattern, or
79
+ false otherwise.
80
+ * `matchOne(fileArray, patternArray, partial)` Take a `/`-split
81
+ filename, and match it against a single row in the `regExpSet`. This
82
+ method is mainly for internal use, but is exposed so that it can be
83
+ used by a glob-walker that needs to avoid excessive filesystem calls.
84
+
85
+ All other methods are internal, and will be called as necessary.
86
+
87
+ ## Functions
88
+
89
+ The top-level exported function has a `cache` property, which is an LRU
90
+ cache set to store 100 items. So, calling these methods repeatedly
91
+ with the same pattern and options will use the same Minimatch object,
92
+ saving the cost of parsing it multiple times.
93
+
94
+ ### minimatch(path, pattern, options)
95
+
96
+ Main export. Tests a path against the pattern using the options.
97
+
98
+ ```javascript
99
+ var isJS = minimatch(file, "*.js", { matchBase: true })
100
+ ```
101
+
102
+ ### minimatch.filter(pattern, options)
103
+
104
+ Returns a function that tests its
105
+ supplied argument, suitable for use with `Array.filter`. Example:
106
+
107
+ ```javascript
108
+ var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true}))
109
+ ```
110
+
111
+ ### minimatch.match(list, pattern, options)
112
+
113
+ Match against the list of
114
+ files, in the style of fnmatch or glob. If nothing is matched, and
115
+ options.nonull is set, then return a list containing the pattern itself.
116
+
117
+ ```javascript
118
+ var javascripts = minimatch.match(fileList, "*.js", {matchBase: true}))
119
+ ```
120
+
121
+ ### minimatch.makeRe(pattern, options)
122
+
123
+ Make a regular expression object from the pattern.
124
+
125
+ ## Options
126
+
127
+ All options are `false` by default.
128
+
129
+ ### debug
130
+
131
+ Dump a ton of stuff to stderr.
132
+
133
+ ### nobrace
134
+
135
+ Do not expand `{a,b}` and `{1..3}` brace sets.
136
+
137
+ ### noglobstar
138
+
139
+ Disable `**` matching against multiple folder names.
140
+
141
+ ### dot
142
+
143
+ Allow patterns to match filenames starting with a period, even if
144
+ the pattern does not explicitly have a period in that spot.
145
+
146
+ Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot`
147
+ is set.
148
+
149
+ ### noext
150
+
151
+ Disable "extglob" style patterns like `+(a|b)`.
152
+
153
+ ### nocase
154
+
155
+ Perform a case-insensitive match.
156
+
157
+ ### nonull
158
+
159
+ When a match is not found by `minimatch.match`, return a list containing
160
+ the pattern itself. When set, an empty list is returned if there are
161
+ no matches.
162
+
163
+ ### matchBase
164
+
165
+ If set, then patterns without slashes will be matched
166
+ against the basename of the path if it contains slashes. For example,
167
+ `a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`.
168
+
169
+ ### nocomment
170
+
171
+ Suppress the behavior of treating `#` at the start of a pattern as a
172
+ comment.
173
+
174
+ ### nonegate
175
+
176
+ Suppress the behavior of treating a leading `!` character as negation.
177
+
178
+ ### flipNegate
179
+
180
+ Returns from negate expressions the same as if they were not negated.
181
+ (Ie, true on a hit, false on a miss.)
182
+
183
+
184
+ ## Comparisons to other fnmatch/glob implementations
185
+
186
+ While strict compliance with the existing standards is a worthwhile
187
+ goal, some discrepancies exist between minimatch and other
188
+ implementations, and are intentional.
189
+
190
+ If the pattern starts with a `!` character, then it is negated. Set the
191
+ `nonegate` flag to suppress this behavior, and treat leading `!`
192
+ characters normally. This is perhaps relevant if you wish to start the
193
+ pattern with a negative extglob pattern like `!(a|B)`. Multiple `!`
194
+ characters at the start of a pattern will negate the pattern multiple
195
+ times.
196
+
197
+ If a pattern starts with `#`, then it is treated as a comment, and
198
+ will not match anything. Use `\#` to match a literal `#` at the
199
+ start of a line, or set the `nocomment` flag to suppress this behavior.
200
+
201
+ The double-star character `**` is supported by default, unless the
202
+ `noglobstar` flag is set. This is supported in the manner of bsdglob
203
+ and bash 4.1, where `**` only has special significance if it is the only
204
+ thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but
205
+ `a/**b` will not.
206
+
207
+ If an escaped pattern has no matches, and the `nonull` flag is set,
208
+ then minimatch.match returns the pattern as-provided, rather than
209
+ interpreting the character escapes. For example,
210
+ `minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than
211
+ `"*a?"`. This is akin to setting the `nullglob` option in bash, except
212
+ that it does not resolve escaped pattern characters.
213
+
214
+ If brace expansion is not disabled, then it is performed before any
215
+ other interpretation of the glob pattern. Thus, a pattern like
216
+ `+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded
217
+ **first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are
218
+ checked for validity. Since those two are valid, matching proceeds.
@@ -0,0 +1,1055 @@
1
+ ;(function (require, exports, module, platform) {
2
+
3
+ if (module) module.exports = minimatch
4
+ else exports.minimatch = minimatch
5
+
6
+ if (!require) {
7
+ require = function (id) {
8
+ switch (id) {
9
+ case "sigmund": return function sigmund (obj) {
10
+ return JSON.stringify(obj)
11
+ }
12
+ case "path": return { basename: function (f) {
13
+ f = f.split(/[\/\\]/)
14
+ var e = f.pop()
15
+ if (!e) e = f.pop()
16
+ return e
17
+ }}
18
+ case "lru-cache": return function LRUCache () {
19
+ // not quite an LRU, but still space-limited.
20
+ var cache = {}
21
+ var cnt = 0
22
+ this.set = function (k, v) {
23
+ cnt ++
24
+ if (cnt >= 100) cache = {}
25
+ cache[k] = v
26
+ }
27
+ this.get = function (k) { return cache[k] }
28
+ }
29
+ }
30
+ }
31
+ }
32
+
33
+ minimatch.Minimatch = Minimatch
34
+
35
+ var LRU = require("lru-cache")
36
+ , cache = minimatch.cache = new LRU({max: 100})
37
+ , GLOBSTAR = minimatch.GLOBSTAR = Minimatch.GLOBSTAR = {}
38
+ , sigmund = require("sigmund")
39
+
40
+ var path = require("path")
41
+ // any single thing other than /
42
+ // don't need to escape / when using new RegExp()
43
+ , qmark = "[^/]"
44
+
45
+ // * => any number of characters
46
+ , star = qmark + "*?"
47
+
48
+ // ** when dots are allowed. Anything goes, except .. and .
49
+ // not (^ or / followed by one or two dots followed by $ or /),
50
+ // followed by anything, any number of times.
51
+ , twoStarDot = "(?:(?!(?:\\\/|^)(?:\\.{1,2})($|\\\/)).)*?"
52
+
53
+ // not a ^ or / followed by a dot,
54
+ // followed by anything, any number of times.
55
+ , twoStarNoDot = "(?:(?!(?:\\\/|^)\\.).)*?"
56
+
57
+ // characters that need to be escaped in RegExp.
58
+ , reSpecials = charSet("().*{}+?[]^$\\!")
59
+
60
+ // "abc" -> { a:true, b:true, c:true }
61
+ function charSet (s) {
62
+ return s.split("").reduce(function (set, c) {
63
+ set[c] = true
64
+ return set
65
+ }, {})
66
+ }
67
+
68
+ // normalizes slashes.
69
+ var slashSplit = /\/+/
70
+
71
+ minimatch.filter = filter
72
+ function filter (pattern, options) {
73
+ options = options || {}
74
+ return function (p, i, list) {
75
+ return minimatch(p, pattern, options)
76
+ }
77
+ }
78
+
79
+ function ext (a, b) {
80
+ a = a || {}
81
+ b = b || {}
82
+ var t = {}
83
+ Object.keys(b).forEach(function (k) {
84
+ t[k] = b[k]
85
+ })
86
+ Object.keys(a).forEach(function (k) {
87
+ t[k] = a[k]
88
+ })
89
+ return t
90
+ }
91
+
92
+ minimatch.defaults = function (def) {
93
+ if (!def || !Object.keys(def).length) return minimatch
94
+
95
+ var orig = minimatch
96
+
97
+ var m = function minimatch (p, pattern, options) {
98
+ return orig.minimatch(p, pattern, ext(def, options))
99
+ }
100
+
101
+ m.Minimatch = function Minimatch (pattern, options) {
102
+ return new orig.Minimatch(pattern, ext(def, options))
103
+ }
104
+
105
+ return m
106
+ }
107
+
108
+ Minimatch.defaults = function (def) {
109
+ if (!def || !Object.keys(def).length) return Minimatch
110
+ return minimatch.defaults(def).Minimatch
111
+ }
112
+
113
+
114
+ function minimatch (p, pattern, options) {
115
+ if (typeof pattern !== "string") {
116
+ throw new TypeError("glob pattern string required")
117
+ }
118
+
119
+ if (!options) options = {}
120
+
121
+ // shortcut: comments match nothing.
122
+ if (!options.nocomment && pattern.charAt(0) === "#") {
123
+ return false
124
+ }
125
+
126
+ // "" only matches ""
127
+ if (pattern.trim() === "") return p === ""
128
+
129
+ return new Minimatch(pattern, options).match(p)
130
+ }
131
+
132
+ function Minimatch (pattern, options) {
133
+ if (!(this instanceof Minimatch)) {
134
+ return new Minimatch(pattern, options, cache)
135
+ }
136
+
137
+ if (typeof pattern !== "string") {
138
+ throw new TypeError("glob pattern string required")
139
+ }
140
+
141
+ if (!options) options = {}
142
+ pattern = pattern.trim()
143
+
144
+ // windows: need to use /, not \
145
+ // On other platforms, \ is a valid (albeit bad) filename char.
146
+ if (platform === "win32") {
147
+ pattern = pattern.split("\\").join("/")
148
+ }
149
+
150
+ // lru storage.
151
+ // these things aren't particularly big, but walking down the string
152
+ // and turning it into a regexp can get pretty costly.
153
+ var cacheKey = pattern + "\n" + sigmund(options)
154
+ var cached = minimatch.cache.get(cacheKey)
155
+ if (cached) return cached
156
+ minimatch.cache.set(cacheKey, this)
157
+
158
+ this.options = options
159
+ this.set = []
160
+ this.pattern = pattern
161
+ this.regexp = null
162
+ this.negate = false
163
+ this.comment = false
164
+ this.empty = false
165
+
166
+ // make the set of regexps etc.
167
+ this.make()
168
+ }
169
+
170
+ Minimatch.prototype.debug = function() {}
171
+
172
+ Minimatch.prototype.make = make
173
+ function make () {
174
+ // don't do it more than once.
175
+ if (this._made) return
176
+
177
+ var pattern = this.pattern
178
+ var options = this.options
179
+
180
+ // empty patterns and comments match nothing.
181
+ if (!options.nocomment && pattern.charAt(0) === "#") {
182
+ this.comment = true
183
+ return
184
+ }
185
+ if (!pattern) {
186
+ this.empty = true
187
+ return
188
+ }
189
+
190
+ // step 1: figure out negation, etc.
191
+ this.parseNegate()
192
+
193
+ // step 2: expand braces
194
+ var set = this.globSet = this.braceExpand()
195
+
196
+ if (options.debug) this.debug = console.error
197
+
198
+ this.debug(this.pattern, set)
199
+
200
+ // step 3: now we have a set, so turn each one into a series of path-portion
201
+ // matching patterns.
202
+ // These will be regexps, except in the case of "**", which is
203
+ // set to the GLOBSTAR object for globstar behavior,
204
+ // and will not contain any / characters
205
+ set = this.globParts = set.map(function (s) {
206
+ return s.split(slashSplit)
207
+ })
208
+
209
+ this.debug(this.pattern, set)
210
+
211
+ // glob --> regexps
212
+ set = set.map(function (s, si, set) {
213
+ return s.map(this.parse, this)
214
+ }, this)
215
+
216
+ this.debug(this.pattern, set)
217
+
218
+ // filter out everything that didn't compile properly.
219
+ set = set.filter(function (s) {
220
+ return -1 === s.indexOf(false)
221
+ })
222
+
223
+ this.debug(this.pattern, set)
224
+
225
+ this.set = set
226
+ }
227
+
228
+ Minimatch.prototype.parseNegate = parseNegate
229
+ function parseNegate () {
230
+ var pattern = this.pattern
231
+ , negate = false
232
+ , options = this.options
233
+ , negateOffset = 0
234
+
235
+ if (options.nonegate) return
236
+
237
+ for ( var i = 0, l = pattern.length
238
+ ; i < l && pattern.charAt(i) === "!"
239
+ ; i ++) {
240
+ negate = !negate
241
+ negateOffset ++
242
+ }
243
+
244
+ if (negateOffset) this.pattern = pattern.substr(negateOffset)
245
+ this.negate = negate
246
+ }
247
+
248
+ // Brace expansion:
249
+ // a{b,c}d -> abd acd
250
+ // a{b,}c -> abc ac
251
+ // a{0..3}d -> a0d a1d a2d a3d
252
+ // a{b,c{d,e}f}g -> abg acdfg acefg
253
+ // a{b,c}d{e,f}g -> abdeg acdeg abdeg abdfg
254
+ //
255
+ // Invalid sets are not expanded.
256
+ // a{2..}b -> a{2..}b
257
+ // a{b}c -> a{b}c
258
+ minimatch.braceExpand = function (pattern, options) {
259
+ return new Minimatch(pattern, options).braceExpand()
260
+ }
261
+
262
+ Minimatch.prototype.braceExpand = braceExpand
263
+ function braceExpand (pattern, options) {
264
+ options = options || this.options
265
+ pattern = typeof pattern === "undefined"
266
+ ? this.pattern : pattern
267
+
268
+ if (typeof pattern === "undefined") {
269
+ throw new Error("undefined pattern")
270
+ }
271
+
272
+ if (options.nobrace ||
273
+ !pattern.match(/\{.*\}/)) {
274
+ // shortcut. no need to expand.
275
+ return [pattern]
276
+ }
277
+
278
+ var escaping = false
279
+
280
+ // examples and comments refer to this crazy pattern:
281
+ // a{b,c{d,e},{f,g}h}x{y,z}
282
+ // expected:
283
+ // abxy
284
+ // abxz
285
+ // acdxy
286
+ // acdxz
287
+ // acexy
288
+ // acexz
289
+ // afhxy
290
+ // afhxz
291
+ // aghxy
292
+ // aghxz
293
+
294
+ // everything before the first \{ is just a prefix.
295
+ // So, we pluck that off, and work with the rest,
296
+ // and then prepend it to everything we find.
297
+ if (pattern.charAt(0) !== "{") {
298
+ this.debug(pattern)
299
+ var prefix = null
300
+ for (var i = 0, l = pattern.length; i < l; i ++) {
301
+ var c = pattern.charAt(i)
302
+ this.debug(i, c)
303
+ if (c === "\\") {
304
+ escaping = !escaping
305
+ } else if (c === "{" && !escaping) {
306
+ prefix = pattern.substr(0, i)
307
+ break
308
+ }
309
+ }
310
+
311
+ // actually no sets, all { were escaped.
312
+ if (prefix === null) {
313
+ this.debug("no sets")
314
+ return [pattern]
315
+ }
316
+
317
+ var tail = braceExpand.call(this, pattern.substr(i), options)
318
+ return tail.map(function (t) {
319
+ return prefix + t
320
+ })
321
+ }
322
+
323
+ // now we have something like:
324
+ // {b,c{d,e},{f,g}h}x{y,z}
325
+ // walk through the set, expanding each part, until
326
+ // the set ends. then, we'll expand the suffix.
327
+ // If the set only has a single member, then'll put the {} back
328
+
329
+ // first, handle numeric sets, since they're easier
330
+ var numset = pattern.match(/^\{(-?[0-9]+)\.\.(-?[0-9]+)\}/)
331
+ if (numset) {
332
+ this.debug("numset", numset[1], numset[2])
333
+ var suf = braceExpand.call(this, pattern.substr(numset[0].length), options)
334
+ , start = +numset[1]
335
+ , end = +numset[2]
336
+ , inc = start > end ? -1 : 1
337
+ , set = []
338
+ for (var i = start; i != (end + inc); i += inc) {
339
+ // append all the suffixes
340
+ for (var ii = 0, ll = suf.length; ii < ll; ii ++) {
341
+ set.push(i + suf[ii])
342
+ }
343
+ }
344
+ return set
345
+ }
346
+
347
+ // ok, walk through the set
348
+ // We hope, somewhat optimistically, that there
349
+ // will be a } at the end.
350
+ // If the closing brace isn't found, then the pattern is
351
+ // interpreted as braceExpand("\\" + pattern) so that
352
+ // the leading \{ will be interpreted literally.
353
+ var i = 1 // skip the \{
354
+ , depth = 1
355
+ , set = []
356
+ , member = ""
357
+ , sawEnd = false
358
+ , escaping = false
359
+
360
+ function addMember () {
361
+ set.push(member)
362
+ member = ""
363
+ }
364
+
365
+ this.debug("Entering for")
366
+ FOR: for (i = 1, l = pattern.length; i < l; i ++) {
367
+ var c = pattern.charAt(i)
368
+ this.debug("", i, c)
369
+
370
+ if (escaping) {
371
+ escaping = false
372
+ member += "\\" + c
373
+ } else {
374
+ switch (c) {
375
+ case "\\":
376
+ escaping = true
377
+ continue
378
+
379
+ case "{":
380
+ depth ++
381
+ member += "{"
382
+ continue
383
+
384
+ case "}":
385
+ depth --
386
+ // if this closes the actual set, then we're done
387
+ if (depth === 0) {
388
+ addMember()
389
+ // pluck off the close-brace
390
+ i ++
391
+ break FOR
392
+ } else {
393
+ member += c
394
+ continue
395
+ }
396
+
397
+ case ",":
398
+ if (depth === 1) {
399
+ addMember()
400
+ } else {
401
+ member += c
402
+ }
403
+ continue
404
+
405
+ default:
406
+ member += c
407
+ continue
408
+ } // switch
409
+ } // else
410
+ } // for
411
+
412
+ // now we've either finished the set, and the suffix is
413
+ // pattern.substr(i), or we have *not* closed the set,
414
+ // and need to escape the leading brace
415
+ if (depth !== 0) {
416
+ this.debug("didn't close", pattern)
417
+ return braceExpand.call(this, "\\" + pattern, options)
418
+ }
419
+
420
+ // x{y,z} -> ["xy", "xz"]
421
+ this.debug("set", set)
422
+ this.debug("suffix", pattern.substr(i))
423
+ var suf = braceExpand.call(this, pattern.substr(i), options)
424
+ // ["b", "c{d,e}","{f,g}h"] ->
425
+ // [["b"], ["cd", "ce"], ["fh", "gh"]]
426
+ var addBraces = set.length === 1
427
+ this.debug("set pre-expanded", set)
428
+ set = set.map(function (p) {
429
+ return braceExpand.call(this, p, options)
430
+ }, this)
431
+ this.debug("set expanded", set)
432
+
433
+
434
+ // [["b"], ["cd", "ce"], ["fh", "gh"]] ->
435
+ // ["b", "cd", "ce", "fh", "gh"]
436
+ set = set.reduce(function (l, r) {
437
+ return l.concat(r)
438
+ })
439
+
440
+ if (addBraces) {
441
+ set = set.map(function (s) {
442
+ return "{" + s + "}"
443
+ })
444
+ }
445
+
446
+ // now attach the suffixes.
447
+ var ret = []
448
+ for (var i = 0, l = set.length; i < l; i ++) {
449
+ for (var ii = 0, ll = suf.length; ii < ll; ii ++) {
450
+ ret.push(set[i] + suf[ii])
451
+ }
452
+ }
453
+ return ret
454
+ }
455
+
456
+ // parse a component of the expanded set.
457
+ // At this point, no pattern may contain "/" in it
458
+ // so we're going to return a 2d array, where each entry is the full
459
+ // pattern, split on '/', and then turned into a regular expression.
460
+ // A regexp is made at the end which joins each array with an
461
+ // escaped /, and another full one which joins each regexp with |.
462
+ //
463
+ // Following the lead of Bash 4.1, note that "**" only has special meaning
464
+ // when it is the *only* thing in a path portion. Otherwise, any series
465
+ // of * is equivalent to a single *. Globstar behavior is enabled by
466
+ // default, and can be disabled by setting options.noglobstar.
467
+ Minimatch.prototype.parse = parse
468
+ var SUBPARSE = {}
469
+ function parse (pattern, isSub) {
470
+ var options = this.options
471
+
472
+ // shortcuts
473
+ if (!options.noglobstar && pattern === "**") return GLOBSTAR
474
+ if (pattern === "") return ""
475
+
476
+ var re = ""
477
+ , hasMagic = !!options.nocase
478
+ , escaping = false
479
+ // ? => one single character
480
+ , patternListStack = []
481
+ , plType
482
+ , stateChar
483
+ , inClass = false
484
+ , reClassStart = -1
485
+ , classStart = -1
486
+ // . and .. never match anything that doesn't start with .,
487
+ // even when options.dot is set.
488
+ , patternStart = pattern.charAt(0) === "." ? "" // anything
489
+ // not (start or / followed by . or .. followed by / or end)
490
+ : options.dot ? "(?!(?:^|\\\/)\\.{1,2}(?:$|\\\/))"
491
+ : "(?!\\.)"
492
+ , self = this
493
+
494
+ function clearStateChar () {
495
+ if (stateChar) {
496
+ // we had some state-tracking character
497
+ // that wasn't consumed by this pass.
498
+ switch (stateChar) {
499
+ case "*":
500
+ re += star
501
+ hasMagic = true
502
+ break
503
+ case "?":
504
+ re += qmark
505
+ hasMagic = true
506
+ break
507
+ default:
508
+ re += "\\"+stateChar
509
+ break
510
+ }
511
+ self.debug('clearStateChar %j %j', stateChar, re)
512
+ stateChar = false
513
+ }
514
+ }
515
+
516
+ for ( var i = 0, len = pattern.length, c
517
+ ; (i < len) && (c = pattern.charAt(i))
518
+ ; i ++ ) {
519
+
520
+ this.debug("%s\t%s %s %j", pattern, i, re, c)
521
+
522
+ // skip over any that are escaped.
523
+ if (escaping && reSpecials[c]) {
524
+ re += "\\" + c
525
+ escaping = false
526
+ continue
527
+ }
528
+
529
+ SWITCH: switch (c) {
530
+ case "/":
531
+ // completely not allowed, even escaped.
532
+ // Should already be path-split by now.
533
+ return false
534
+
535
+ case "\\":
536
+ clearStateChar()
537
+ escaping = true
538
+ continue
539
+
540
+ // the various stateChar values
541
+ // for the "extglob" stuff.
542
+ case "?":
543
+ case "*":
544
+ case "+":
545
+ case "@":
546
+ case "!":
547
+ this.debug("%s\t%s %s %j <-- stateChar", pattern, i, re, c)
548
+
549
+ // all of those are literals inside a class, except that
550
+ // the glob [!a] means [^a] in regexp
551
+ if (inClass) {
552
+ this.debug(' in class')
553
+ if (c === "!" && i === classStart + 1) c = "^"
554
+ re += c
555
+ continue
556
+ }
557
+
558
+ // if we already have a stateChar, then it means
559
+ // that there was something like ** or +? in there.
560
+ // Handle the stateChar, then proceed with this one.
561
+ self.debug('call clearStateChar %j', stateChar)
562
+ clearStateChar()
563
+ stateChar = c
564
+ // if extglob is disabled, then +(asdf|foo) isn't a thing.
565
+ // just clear the statechar *now*, rather than even diving into
566
+ // the patternList stuff.
567
+ if (options.noext) clearStateChar()
568
+ continue
569
+
570
+ case "(":
571
+ if (inClass) {
572
+ re += "("
573
+ continue
574
+ }
575
+
576
+ if (!stateChar) {
577
+ re += "\\("
578
+ continue
579
+ }
580
+
581
+ plType = stateChar
582
+ patternListStack.push({ type: plType
583
+ , start: i - 1
584
+ , reStart: re.length })
585
+ // negation is (?:(?!js)[^/]*)
586
+ re += stateChar === "!" ? "(?:(?!" : "(?:"
587
+ this.debug('plType %j %j', stateChar, re)
588
+ stateChar = false
589
+ continue
590
+
591
+ case ")":
592
+ if (inClass || !patternListStack.length) {
593
+ re += "\\)"
594
+ continue
595
+ }
596
+
597
+ clearStateChar()
598
+ hasMagic = true
599
+ re += ")"
600
+ plType = patternListStack.pop().type
601
+ // negation is (?:(?!js)[^/]*)
602
+ // The others are (?:<pattern>)<type>
603
+ switch (plType) {
604
+ case "!":
605
+ re += "[^/]*?)"
606
+ break
607
+ case "?":
608
+ case "+":
609
+ case "*": re += plType
610
+ case "@": break // the default anyway
611
+ }
612
+ continue
613
+
614
+ case "|":
615
+ if (inClass || !patternListStack.length || escaping) {
616
+ re += "\\|"
617
+ escaping = false
618
+ continue
619
+ }
620
+
621
+ clearStateChar()
622
+ re += "|"
623
+ continue
624
+
625
+ // these are mostly the same in regexp and glob
626
+ case "[":
627
+ // swallow any state-tracking char before the [
628
+ clearStateChar()
629
+
630
+ if (inClass) {
631
+ re += "\\" + c
632
+ continue
633
+ }
634
+
635
+ inClass = true
636
+ classStart = i
637
+ reClassStart = re.length
638
+ re += c
639
+ continue
640
+
641
+ case "]":
642
+ // a right bracket shall lose its special
643
+ // meaning and represent itself in
644
+ // a bracket expression if it occurs
645
+ // first in the list. -- POSIX.2 2.8.3.2
646
+ if (i === classStart + 1 || !inClass) {
647
+ re += "\\" + c
648
+ escaping = false
649
+ continue
650
+ }
651
+
652
+ // finish up the class.
653
+ hasMagic = true
654
+ inClass = false
655
+ re += c
656
+ continue
657
+
658
+ default:
659
+ // swallow any state char that wasn't consumed
660
+ clearStateChar()
661
+
662
+ if (escaping) {
663
+ // no need
664
+ escaping = false
665
+ } else if (reSpecials[c]
666
+ && !(c === "^" && inClass)) {
667
+ re += "\\"
668
+ }
669
+
670
+ re += c
671
+
672
+ } // switch
673
+ } // for
674
+
675
+
676
+ // handle the case where we left a class open.
677
+ // "[abc" is valid, equivalent to "\[abc"
678
+ if (inClass) {
679
+ // split where the last [ was, and escape it
680
+ // this is a huge pita. We now have to re-walk
681
+ // the contents of the would-be class to re-translate
682
+ // any characters that were passed through as-is
683
+ var cs = pattern.substr(classStart + 1)
684
+ , sp = this.parse(cs, SUBPARSE)
685
+ re = re.substr(0, reClassStart) + "\\[" + sp[0]
686
+ hasMagic = hasMagic || sp[1]
687
+ }
688
+
689
+ // handle the case where we had a +( thing at the *end*
690
+ // of the pattern.
691
+ // each pattern list stack adds 3 chars, and we need to go through
692
+ // and escape any | chars that were passed through as-is for the regexp.
693
+ // Go through and escape them, taking care not to double-escape any
694
+ // | chars that were already escaped.
695
+ var pl
696
+ while (pl = patternListStack.pop()) {
697
+ var tail = re.slice(pl.reStart + 3)
698
+ // maybe some even number of \, then maybe 1 \, followed by a |
699
+ tail = tail.replace(/((?:\\{2})*)(\\?)\|/g, function (_, $1, $2) {
700
+ if (!$2) {
701
+ // the | isn't already escaped, so escape it.
702
+ $2 = "\\"
703
+ }
704
+
705
+ // need to escape all those slashes *again*, without escaping the
706
+ // one that we need for escaping the | character. As it works out,
707
+ // escaping an even number of slashes can be done by simply repeating
708
+ // it exactly after itself. That's why this trick works.
709
+ //
710
+ // I am sorry that you have to see this.
711
+ return $1 + $1 + $2 + "|"
712
+ })
713
+
714
+ this.debug("tail=%j\n %s", tail, tail)
715
+ var t = pl.type === "*" ? star
716
+ : pl.type === "?" ? qmark
717
+ : "\\" + pl.type
718
+
719
+ hasMagic = true
720
+ re = re.slice(0, pl.reStart)
721
+ + t + "\\("
722
+ + tail
723
+ }
724
+
725
+ // handle trailing things that only matter at the very end.
726
+ clearStateChar()
727
+ if (escaping) {
728
+ // trailing \\
729
+ re += "\\\\"
730
+ }
731
+
732
+ // only need to apply the nodot start if the re starts with
733
+ // something that could conceivably capture a dot
734
+ var addPatternStart = false
735
+ switch (re.charAt(0)) {
736
+ case ".":
737
+ case "[":
738
+ case "(": addPatternStart = true
739
+ }
740
+
741
+ // if the re is not "" at this point, then we need to make sure
742
+ // it doesn't match against an empty path part.
743
+ // Otherwise a/* will match a/, which it should not.
744
+ if (re !== "" && hasMagic) re = "(?=.)" + re
745
+
746
+ if (addPatternStart) re = patternStart + re
747
+
748
+ // parsing just a piece of a larger pattern.
749
+ if (isSub === SUBPARSE) {
750
+ return [ re, hasMagic ]
751
+ }
752
+
753
+ // skip the regexp for non-magical patterns
754
+ // unescape anything in it, though, so that it'll be
755
+ // an exact match against a file etc.
756
+ if (!hasMagic) {
757
+ return globUnescape(pattern)
758
+ }
759
+
760
+ var flags = options.nocase ? "i" : ""
761
+ , regExp = new RegExp("^" + re + "$", flags)
762
+
763
+ regExp._glob = pattern
764
+ regExp._src = re
765
+
766
+ return regExp
767
+ }
768
+
769
+ minimatch.makeRe = function (pattern, options) {
770
+ return new Minimatch(pattern, options || {}).makeRe()
771
+ }
772
+
773
+ Minimatch.prototype.makeRe = makeRe
774
+ function makeRe () {
775
+ if (this.regexp || this.regexp === false) return this.regexp
776
+
777
+ // at this point, this.set is a 2d array of partial
778
+ // pattern strings, or "**".
779
+ //
780
+ // It's better to use .match(). This function shouldn't
781
+ // be used, really, but it's pretty convenient sometimes,
782
+ // when you just want to work with a regex.
783
+ var set = this.set
784
+
785
+ if (!set.length) return this.regexp = false
786
+ var options = this.options
787
+
788
+ var twoStar = options.noglobstar ? star
789
+ : options.dot ? twoStarDot
790
+ : twoStarNoDot
791
+ , flags = options.nocase ? "i" : ""
792
+
793
+ var re = set.map(function (pattern) {
794
+ return pattern.map(function (p) {
795
+ return (p === GLOBSTAR) ? twoStar
796
+ : (typeof p === "string") ? regExpEscape(p)
797
+ : p._src
798
+ }).join("\\\/")
799
+ }).join("|")
800
+
801
+ // must match entire pattern
802
+ // ending in a * or ** will make it less strict.
803
+ re = "^(?:" + re + ")$"
804
+
805
+ // can match anything, as long as it's not this.
806
+ if (this.negate) re = "^(?!" + re + ").*$"
807
+
808
+ try {
809
+ return this.regexp = new RegExp(re, flags)
810
+ } catch (ex) {
811
+ return this.regexp = false
812
+ }
813
+ }
814
+
815
+ minimatch.match = function (list, pattern, options) {
816
+ var mm = new Minimatch(pattern, options)
817
+ list = list.filter(function (f) {
818
+ return mm.match(f)
819
+ })
820
+ if (options.nonull && !list.length) {
821
+ list.push(pattern)
822
+ }
823
+ return list
824
+ }
825
+
826
+ Minimatch.prototype.match = match
827
+ function match (f, partial) {
828
+ this.debug("match", f, this.pattern)
829
+ // short-circuit in the case of busted things.
830
+ // comments, etc.
831
+ if (this.comment) return false
832
+ if (this.empty) return f === ""
833
+
834
+ if (f === "/" && partial) return true
835
+
836
+ var options = this.options
837
+
838
+ // windows: need to use /, not \
839
+ // On other platforms, \ is a valid (albeit bad) filename char.
840
+ if (platform === "win32") {
841
+ f = f.split("\\").join("/")
842
+ }
843
+
844
+ // treat the test path as a set of pathparts.
845
+ f = f.split(slashSplit)
846
+ this.debug(this.pattern, "split", f)
847
+
848
+ // just ONE of the pattern sets in this.set needs to match
849
+ // in order for it to be valid. If negating, then just one
850
+ // match means that we have failed.
851
+ // Either way, return on the first hit.
852
+
853
+ var set = this.set
854
+ this.debug(this.pattern, "set", set)
855
+
856
+ var splitFile = path.basename(f.join("/")).split("/")
857
+
858
+ for (var i = 0, l = set.length; i < l; i ++) {
859
+ var pattern = set[i], file = f
860
+ if (options.matchBase && pattern.length === 1) {
861
+ file = splitFile
862
+ }
863
+ var hit = this.matchOne(file, pattern, partial)
864
+ if (hit) {
865
+ if (options.flipNegate) return true
866
+ return !this.negate
867
+ }
868
+ }
869
+
870
+ // didn't get any hits. this is success if it's a negative
871
+ // pattern, failure otherwise.
872
+ if (options.flipNegate) return false
873
+ return this.negate
874
+ }
875
+
876
+ // set partial to true to test if, for example,
877
+ // "/a/b" matches the start of "/*/b/*/d"
878
+ // Partial means, if you run out of file before you run
879
+ // out of pattern, then that's fine, as long as all
880
+ // the parts match.
881
+ Minimatch.prototype.matchOne = function (file, pattern, partial) {
882
+ var options = this.options
883
+
884
+ this.debug("matchOne",
885
+ { "this": this
886
+ , file: file
887
+ , pattern: pattern })
888
+
889
+ this.debug("matchOne", file.length, pattern.length)
890
+
891
+ for ( var fi = 0
892
+ , pi = 0
893
+ , fl = file.length
894
+ , pl = pattern.length
895
+ ; (fi < fl) && (pi < pl)
896
+ ; fi ++, pi ++ ) {
897
+
898
+ this.debug("matchOne loop")
899
+ var p = pattern[pi]
900
+ , f = file[fi]
901
+
902
+ this.debug(pattern, p, f)
903
+
904
+ // should be impossible.
905
+ // some invalid regexp stuff in the set.
906
+ if (p === false) return false
907
+
908
+ if (p === GLOBSTAR) {
909
+ this.debug('GLOBSTAR', [pattern, p, f])
910
+
911
+ // "**"
912
+ // a/**/b/**/c would match the following:
913
+ // a/b/x/y/z/c
914
+ // a/x/y/z/b/c
915
+ // a/b/x/b/x/c
916
+ // a/b/c
917
+ // To do this, take the rest of the pattern after
918
+ // the **, and see if it would match the file remainder.
919
+ // If so, return success.
920
+ // If not, the ** "swallows" a segment, and try again.
921
+ // This is recursively awful.
922
+ //
923
+ // a/**/b/**/c matching a/b/x/y/z/c
924
+ // - a matches a
925
+ // - doublestar
926
+ // - matchOne(b/x/y/z/c, b/**/c)
927
+ // - b matches b
928
+ // - doublestar
929
+ // - matchOne(x/y/z/c, c) -> no
930
+ // - matchOne(y/z/c, c) -> no
931
+ // - matchOne(z/c, c) -> no
932
+ // - matchOne(c, c) yes, hit
933
+ var fr = fi
934
+ , pr = pi + 1
935
+ if (pr === pl) {
936
+ this.debug('** at the end')
937
+ // a ** at the end will just swallow the rest.
938
+ // We have found a match.
939
+ // however, it will not swallow /.x, unless
940
+ // options.dot is set.
941
+ // . and .. are *never* matched by **, for explosively
942
+ // exponential reasons.
943
+ for ( ; fi < fl; fi ++) {
944
+ if (file[fi] === "." || file[fi] === ".." ||
945
+ (!options.dot && file[fi].charAt(0) === ".")) return false
946
+ }
947
+ return true
948
+ }
949
+
950
+ // ok, let's see if we can swallow whatever we can.
951
+ WHILE: while (fr < fl) {
952
+ var swallowee = file[fr]
953
+
954
+ this.debug('\nglobstar while',
955
+ file, fr, pattern, pr, swallowee)
956
+
957
+ // XXX remove this slice. Just pass the start index.
958
+ if (this.matchOne(file.slice(fr), pattern.slice(pr), partial)) {
959
+ this.debug('globstar found match!', fr, fl, swallowee)
960
+ // found a match.
961
+ return true
962
+ } else {
963
+ // can't swallow "." or ".." ever.
964
+ // can only swallow ".foo" when explicitly asked.
965
+ if (swallowee === "." || swallowee === ".." ||
966
+ (!options.dot && swallowee.charAt(0) === ".")) {
967
+ this.debug("dot detected!", file, fr, pattern, pr)
968
+ break WHILE
969
+ }
970
+
971
+ // ** swallows a segment, and continue.
972
+ this.debug('globstar swallow a segment, and continue')
973
+ fr ++
974
+ }
975
+ }
976
+ // no match was found.
977
+ // However, in partial mode, we can't say this is necessarily over.
978
+ // If there's more *pattern* left, then
979
+ if (partial) {
980
+ // ran out of file
981
+ this.debug("\n>>> no match, partial?", file, fr, pattern, pr)
982
+ if (fr === fl) return true
983
+ }
984
+ return false
985
+ }
986
+
987
+ // something other than **
988
+ // non-magic patterns just have to match exactly
989
+ // patterns with magic have been turned into regexps.
990
+ var hit
991
+ if (typeof p === "string") {
992
+ if (options.nocase) {
993
+ hit = f.toLowerCase() === p.toLowerCase()
994
+ } else {
995
+ hit = f === p
996
+ }
997
+ this.debug("string match", p, f, hit)
998
+ } else {
999
+ hit = f.match(p)
1000
+ this.debug("pattern match", p, f, hit)
1001
+ }
1002
+
1003
+ if (!hit) return false
1004
+ }
1005
+
1006
+ // Note: ending in / means that we'll get a final ""
1007
+ // at the end of the pattern. This can only match a
1008
+ // corresponding "" at the end of the file.
1009
+ // If the file ends in /, then it can only match a
1010
+ // a pattern that ends in /, unless the pattern just
1011
+ // doesn't have any more for it. But, a/b/ should *not*
1012
+ // match "a/b/*", even though "" matches against the
1013
+ // [^/]*? pattern, except in partial mode, where it might
1014
+ // simply not be reached yet.
1015
+ // However, a/b/ should still satisfy a/*
1016
+
1017
+ // now either we fell off the end of the pattern, or we're done.
1018
+ if (fi === fl && pi === pl) {
1019
+ // ran out of pattern and filename at the same time.
1020
+ // an exact hit!
1021
+ return true
1022
+ } else if (fi === fl) {
1023
+ // ran out of file, but still had pattern left.
1024
+ // this is ok if we're doing the match as part of
1025
+ // a glob fs traversal.
1026
+ return partial
1027
+ } else if (pi === pl) {
1028
+ // ran out of pattern, still have file left.
1029
+ // this is only acceptable if we're on the very last
1030
+ // empty segment of a file with a trailing slash.
1031
+ // a/* should match a/b/
1032
+ var emptyFileEnd = (fi === fl - 1) && (file[fi] === "")
1033
+ return emptyFileEnd
1034
+ }
1035
+
1036
+ // should be unreachable.
1037
+ throw new Error("wtf?")
1038
+ }
1039
+
1040
+
1041
+ // replace stuff like \* with *
1042
+ function globUnescape (s) {
1043
+ return s.replace(/\\(.)/g, "$1")
1044
+ }
1045
+
1046
+
1047
+ function regExpEscape (s) {
1048
+ return s.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&")
1049
+ }
1050
+
1051
+ })( typeof require === "function" ? require : null,
1052
+ this,
1053
+ typeof module === "object" ? module : null,
1054
+ typeof process === "object" ? process.platform : "win32"
1055
+ )