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 @@
1
+ ../rimraf/bin.js
@@ -0,0 +1,65 @@
1
+ # v3.0
2
+
3
+ - Add `--preserve-root` option to executable (default true)
4
+ - Drop support for Node.js below version 6
5
+
6
+ # v2.7
7
+
8
+ - Make `glob` an optional dependency
9
+
10
+ # 2.6
11
+
12
+ - Retry on EBUSY on non-windows platforms as well
13
+ - Make `rimraf.sync` 10000% more reliable on Windows
14
+
15
+ # 2.5
16
+
17
+ - Handle Windows EPERM when lstat-ing read-only dirs
18
+ - Add glob option to pass options to glob
19
+
20
+ # 2.4
21
+
22
+ - Add EPERM to delay/retry loop
23
+ - Add `disableGlob` option
24
+
25
+ # 2.3
26
+
27
+ - Make maxBusyTries and emfileWait configurable
28
+ - Handle weird SunOS unlink-dir issue
29
+ - Glob the CLI arg for better Windows support
30
+
31
+ # 2.2
32
+
33
+ - Handle ENOENT properly on Windows
34
+ - Allow overriding fs methods
35
+ - Treat EPERM as indicative of non-empty dir
36
+ - Remove optional graceful-fs dep
37
+ - Consistently return null error instead of undefined on success
38
+ - win32: Treat ENOTEMPTY the same as EBUSY
39
+ - Add `rimraf` binary
40
+
41
+ # 2.1
42
+
43
+ - Fix SunOS error code for a non-empty directory
44
+ - Try rmdir before readdir
45
+ - Treat EISDIR like EPERM
46
+ - Remove chmod
47
+ - Remove lstat polyfill, node 0.7 is not supported
48
+
49
+ # 2.0
50
+
51
+ - Fix myGid call to check process.getgid
52
+ - Simplify the EBUSY backoff logic.
53
+ - Use fs.lstat in node >= 0.7.9
54
+ - Remove gently option
55
+ - remove fiber implementation
56
+ - Delete files that are marked read-only
57
+
58
+ # 1.0
59
+
60
+ - Allow ENOENT in sync method
61
+ - Throw when no callback is provided
62
+ - Make opts.gently an absolute path
63
+ - use 'stat' if 'lstat' is not available
64
+ - Consistent error naming, and rethrow non-ENOENT stat errors
65
+ - add fiber implementation
@@ -0,0 +1,15 @@
1
+ The ISC License
2
+
3
+ Copyright (c) Isaac Z. Schlueter and Contributors
4
+
5
+ Permission to use, copy, modify, and/or distribute this software for any
6
+ purpose with or without fee is hereby granted, provided that the above
7
+ copyright notice and this permission notice appear in all copies.
8
+
9
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
15
+ IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,101 @@
1
+ [![Build Status](https://travis-ci.org/isaacs/rimraf.svg?branch=master)](https://travis-ci.org/isaacs/rimraf) [![Dependency Status](https://david-dm.org/isaacs/rimraf.svg)](https://david-dm.org/isaacs/rimraf) [![devDependency Status](https://david-dm.org/isaacs/rimraf/dev-status.svg)](https://david-dm.org/isaacs/rimraf#info=devDependencies)
2
+
3
+ The [UNIX command](http://en.wikipedia.org/wiki/Rm_(Unix)) `rm -rf` for node.
4
+
5
+ Install with `npm install rimraf`, or just drop rimraf.js somewhere.
6
+
7
+ ## API
8
+
9
+ `rimraf(f, [opts], callback)`
10
+
11
+ The first parameter will be interpreted as a globbing pattern for files. If you
12
+ want to disable globbing you can do so with `opts.disableGlob` (defaults to
13
+ `false`). This might be handy, for instance, if you have filenames that contain
14
+ globbing wildcard characters.
15
+
16
+ The callback will be called with an error if there is one. Certain
17
+ errors are handled for you:
18
+
19
+ * Windows: `EBUSY` and `ENOTEMPTY` - rimraf will back off a maximum of
20
+ `opts.maxBusyTries` times before giving up, adding 100ms of wait
21
+ between each attempt. The default `maxBusyTries` is 3.
22
+ * `ENOENT` - If the file doesn't exist, rimraf will return
23
+ successfully, since your desired outcome is already the case.
24
+ * `EMFILE` - Since `readdir` requires opening a file descriptor, it's
25
+ possible to hit `EMFILE` if too many file descriptors are in use.
26
+ In the sync case, there's nothing to be done for this. But in the
27
+ async case, rimraf will gradually back off with timeouts up to
28
+ `opts.emfileWait` ms, which defaults to 1000.
29
+
30
+ ## options
31
+
32
+ * unlink, chmod, stat, lstat, rmdir, readdir,
33
+ unlinkSync, chmodSync, statSync, lstatSync, rmdirSync, readdirSync
34
+
35
+ In order to use a custom file system library, you can override
36
+ specific fs functions on the options object.
37
+
38
+ If any of these functions are present on the options object, then
39
+ the supplied function will be used instead of the default fs
40
+ method.
41
+
42
+ Sync methods are only relevant for `rimraf.sync()`, of course.
43
+
44
+ For example:
45
+
46
+ ```javascript
47
+ var myCustomFS = require('some-custom-fs')
48
+
49
+ rimraf('some-thing', myCustomFS, callback)
50
+ ```
51
+
52
+ * maxBusyTries
53
+
54
+ If an `EBUSY`, `ENOTEMPTY`, or `EPERM` error code is encountered
55
+ on Windows systems, then rimraf will retry with a linear backoff
56
+ wait of 100ms longer on each try. The default maxBusyTries is 3.
57
+
58
+ Only relevant for async usage.
59
+
60
+ * emfileWait
61
+
62
+ If an `EMFILE` error is encountered, then rimraf will retry
63
+ repeatedly with a linear backoff of 1ms longer on each try, until
64
+ the timeout counter hits this max. The default limit is 1000.
65
+
66
+ If you repeatedly encounter `EMFILE` errors, then consider using
67
+ [graceful-fs](http://npm.im/graceful-fs) in your program.
68
+
69
+ Only relevant for async usage.
70
+
71
+ * glob
72
+
73
+ Set to `false` to disable [glob](http://npm.im/glob) pattern
74
+ matching.
75
+
76
+ Set to an object to pass options to the glob module. The default
77
+ glob options are `{ nosort: true, silent: true }`.
78
+
79
+ Glob version 6 is used in this module.
80
+
81
+ Relevant for both sync and async usage.
82
+
83
+ * disableGlob
84
+
85
+ Set to any non-falsey value to disable globbing entirely.
86
+ (Equivalent to setting `glob: false`.)
87
+
88
+ ## rimraf.sync
89
+
90
+ It can remove stuff synchronously, too. But that's not so good. Use
91
+ the async API. It's better.
92
+
93
+ ## CLI
94
+
95
+ If installed with `npm install rimraf -g` it can be used as a global
96
+ command `rimraf <path> [<path> ...]` which is useful for cross platform support.
97
+
98
+ ## mkdirp
99
+
100
+ If you need to create a directory recursively, check out
101
+ [mkdirp](https://github.com/substack/node-mkdirp).
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env node
2
+
3
+ const rimraf = require('./')
4
+
5
+ const path = require('path')
6
+
7
+ const isRoot = arg => /^(\/|[a-zA-Z]:\\)$/.test(path.resolve(arg))
8
+ const filterOutRoot = arg => {
9
+ const ok = preserveRoot === false || !isRoot(arg)
10
+ if (!ok) {
11
+ console.error(`refusing to remove ${arg}`)
12
+ console.error('Set --no-preserve-root to allow this')
13
+ }
14
+ return ok
15
+ }
16
+
17
+ let help = false
18
+ let dashdash = false
19
+ let noglob = false
20
+ let preserveRoot = true
21
+ const args = process.argv.slice(2).filter(arg => {
22
+ if (dashdash)
23
+ return !!arg
24
+ else if (arg === '--')
25
+ dashdash = true
26
+ else if (arg === '--no-glob' || arg === '-G')
27
+ noglob = true
28
+ else if (arg === '--glob' || arg === '-g')
29
+ noglob = false
30
+ else if (arg.match(/^(-+|\/)(h(elp)?|\?)$/))
31
+ help = true
32
+ else if (arg === '--preserve-root')
33
+ preserveRoot = true
34
+ else if (arg === '--no-preserve-root')
35
+ preserveRoot = false
36
+ else
37
+ return !!arg
38
+ }).filter(arg => !preserveRoot || filterOutRoot(arg))
39
+
40
+ const go = n => {
41
+ if (n >= args.length)
42
+ return
43
+ const options = noglob ? { glob: false } : {}
44
+ rimraf(args[n], options, er => {
45
+ if (er)
46
+ throw er
47
+ go(n+1)
48
+ })
49
+ }
50
+
51
+ if (help || args.length === 0) {
52
+ // If they didn't ask for help, then this is not a "success"
53
+ const log = help ? console.log : console.error
54
+ log('Usage: rimraf <path> [<path> ...]')
55
+ log('')
56
+ log(' Deletes all files and folders at "path" recursively.')
57
+ log('')
58
+ log('Options:')
59
+ log('')
60
+ log(' -h, --help Display this usage info')
61
+ log(' -G, --no-glob Do not expand glob patterns in arguments')
62
+ log(' -g, --glob Expand glob patterns in arguments (default)')
63
+ log(' --preserve-root Do not remove \'/\' (default)')
64
+ log(' --no-preserve-root Do not treat \'/\' specially')
65
+ log(' -- Stop parsing flags')
66
+ process.exit(help ? 0 : 1)
67
+ } else
68
+ go(0)
@@ -0,0 +1,32 @@
1
+ {
2
+ "name": "rimraf",
3
+ "version": "3.0.2",
4
+ "main": "rimraf.js",
5
+ "description": "A deep deletion module for node (like `rm -rf`)",
6
+ "author": "Isaac Z. Schlueter <i@izs.me> (http://blog.izs.me/)",
7
+ "license": "ISC",
8
+ "repository": "git://github.com/isaacs/rimraf.git",
9
+ "scripts": {
10
+ "preversion": "npm test",
11
+ "postversion": "npm publish",
12
+ "postpublish": "git push origin --follow-tags",
13
+ "test": "tap test/*.js"
14
+ },
15
+ "bin": "./bin.js",
16
+ "dependencies": {
17
+ "glob": "^7.1.3"
18
+ },
19
+ "files": [
20
+ "LICENSE",
21
+ "README.md",
22
+ "bin.js",
23
+ "rimraf.js"
24
+ ],
25
+ "devDependencies": {
26
+ "mkdirp": "^0.5.1",
27
+ "tap": "^12.1.1"
28
+ },
29
+ "funding": {
30
+ "url": "https://github.com/sponsors/isaacs"
31
+ }
32
+ }
@@ -0,0 +1,360 @@
1
+ const assert = require("assert")
2
+ const path = require("path")
3
+ const fs = require("fs")
4
+ let glob = undefined
5
+ try {
6
+ glob = require("glob")
7
+ } catch (_err) {
8
+ // treat glob as optional.
9
+ }
10
+
11
+ const defaultGlobOpts = {
12
+ nosort: true,
13
+ silent: true
14
+ }
15
+
16
+ // for EMFILE handling
17
+ let timeout = 0
18
+
19
+ const isWindows = (process.platform === "win32")
20
+
21
+ const defaults = options => {
22
+ const methods = [
23
+ 'unlink',
24
+ 'chmod',
25
+ 'stat',
26
+ 'lstat',
27
+ 'rmdir',
28
+ 'readdir'
29
+ ]
30
+ methods.forEach(m => {
31
+ options[m] = options[m] || fs[m]
32
+ m = m + 'Sync'
33
+ options[m] = options[m] || fs[m]
34
+ })
35
+
36
+ options.maxBusyTries = options.maxBusyTries || 3
37
+ options.emfileWait = options.emfileWait || 1000
38
+ if (options.glob === false) {
39
+ options.disableGlob = true
40
+ }
41
+ if (options.disableGlob !== true && glob === undefined) {
42
+ throw Error('glob dependency not found, set `options.disableGlob = true` if intentional')
43
+ }
44
+ options.disableGlob = options.disableGlob || false
45
+ options.glob = options.glob || defaultGlobOpts
46
+ }
47
+
48
+ const rimraf = (p, options, cb) => {
49
+ if (typeof options === 'function') {
50
+ cb = options
51
+ options = {}
52
+ }
53
+
54
+ assert(p, 'rimraf: missing path')
55
+ assert.equal(typeof p, 'string', 'rimraf: path should be a string')
56
+ assert.equal(typeof cb, 'function', 'rimraf: callback function required')
57
+ assert(options, 'rimraf: invalid options argument provided')
58
+ assert.equal(typeof options, 'object', 'rimraf: options should be object')
59
+
60
+ defaults(options)
61
+
62
+ let busyTries = 0
63
+ let errState = null
64
+ let n = 0
65
+
66
+ const next = (er) => {
67
+ errState = errState || er
68
+ if (--n === 0)
69
+ cb(errState)
70
+ }
71
+
72
+ const afterGlob = (er, results) => {
73
+ if (er)
74
+ return cb(er)
75
+
76
+ n = results.length
77
+ if (n === 0)
78
+ return cb()
79
+
80
+ results.forEach(p => {
81
+ const CB = (er) => {
82
+ if (er) {
83
+ if ((er.code === "EBUSY" || er.code === "ENOTEMPTY" || er.code === "EPERM") &&
84
+ busyTries < options.maxBusyTries) {
85
+ busyTries ++
86
+ // try again, with the same exact callback as this one.
87
+ return setTimeout(() => rimraf_(p, options, CB), busyTries * 100)
88
+ }
89
+
90
+ // this one won't happen if graceful-fs is used.
91
+ if (er.code === "EMFILE" && timeout < options.emfileWait) {
92
+ return setTimeout(() => rimraf_(p, options, CB), timeout ++)
93
+ }
94
+
95
+ // already gone
96
+ if (er.code === "ENOENT") er = null
97
+ }
98
+
99
+ timeout = 0
100
+ next(er)
101
+ }
102
+ rimraf_(p, options, CB)
103
+ })
104
+ }
105
+
106
+ if (options.disableGlob || !glob.hasMagic(p))
107
+ return afterGlob(null, [p])
108
+
109
+ options.lstat(p, (er, stat) => {
110
+ if (!er)
111
+ return afterGlob(null, [p])
112
+
113
+ glob(p, options.glob, afterGlob)
114
+ })
115
+
116
+ }
117
+
118
+ // Two possible strategies.
119
+ // 1. Assume it's a file. unlink it, then do the dir stuff on EPERM or EISDIR
120
+ // 2. Assume it's a directory. readdir, then do the file stuff on ENOTDIR
121
+ //
122
+ // Both result in an extra syscall when you guess wrong. However, there
123
+ // are likely far more normal files in the world than directories. This
124
+ // is based on the assumption that a the average number of files per
125
+ // directory is >= 1.
126
+ //
127
+ // If anyone ever complains about this, then I guess the strategy could
128
+ // be made configurable somehow. But until then, YAGNI.
129
+ const rimraf_ = (p, options, cb) => {
130
+ assert(p)
131
+ assert(options)
132
+ assert(typeof cb === 'function')
133
+
134
+ // sunos lets the root user unlink directories, which is... weird.
135
+ // so we have to lstat here and make sure it's not a dir.
136
+ options.lstat(p, (er, st) => {
137
+ if (er && er.code === "ENOENT")
138
+ return cb(null)
139
+
140
+ // Windows can EPERM on stat. Life is suffering.
141
+ if (er && er.code === "EPERM" && isWindows)
142
+ fixWinEPERM(p, options, er, cb)
143
+
144
+ if (st && st.isDirectory())
145
+ return rmdir(p, options, er, cb)
146
+
147
+ options.unlink(p, er => {
148
+ if (er) {
149
+ if (er.code === "ENOENT")
150
+ return cb(null)
151
+ if (er.code === "EPERM")
152
+ return (isWindows)
153
+ ? fixWinEPERM(p, options, er, cb)
154
+ : rmdir(p, options, er, cb)
155
+ if (er.code === "EISDIR")
156
+ return rmdir(p, options, er, cb)
157
+ }
158
+ return cb(er)
159
+ })
160
+ })
161
+ }
162
+
163
+ const fixWinEPERM = (p, options, er, cb) => {
164
+ assert(p)
165
+ assert(options)
166
+ assert(typeof cb === 'function')
167
+
168
+ options.chmod(p, 0o666, er2 => {
169
+ if (er2)
170
+ cb(er2.code === "ENOENT" ? null : er)
171
+ else
172
+ options.stat(p, (er3, stats) => {
173
+ if (er3)
174
+ cb(er3.code === "ENOENT" ? null : er)
175
+ else if (stats.isDirectory())
176
+ rmdir(p, options, er, cb)
177
+ else
178
+ options.unlink(p, cb)
179
+ })
180
+ })
181
+ }
182
+
183
+ const fixWinEPERMSync = (p, options, er) => {
184
+ assert(p)
185
+ assert(options)
186
+
187
+ try {
188
+ options.chmodSync(p, 0o666)
189
+ } catch (er2) {
190
+ if (er2.code === "ENOENT")
191
+ return
192
+ else
193
+ throw er
194
+ }
195
+
196
+ let stats
197
+ try {
198
+ stats = options.statSync(p)
199
+ } catch (er3) {
200
+ if (er3.code === "ENOENT")
201
+ return
202
+ else
203
+ throw er
204
+ }
205
+
206
+ if (stats.isDirectory())
207
+ rmdirSync(p, options, er)
208
+ else
209
+ options.unlinkSync(p)
210
+ }
211
+
212
+ const rmdir = (p, options, originalEr, cb) => {
213
+ assert(p)
214
+ assert(options)
215
+ assert(typeof cb === 'function')
216
+
217
+ // try to rmdir first, and only readdir on ENOTEMPTY or EEXIST (SunOS)
218
+ // if we guessed wrong, and it's not a directory, then
219
+ // raise the original error.
220
+ options.rmdir(p, er => {
221
+ if (er && (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM"))
222
+ rmkids(p, options, cb)
223
+ else if (er && er.code === "ENOTDIR")
224
+ cb(originalEr)
225
+ else
226
+ cb(er)
227
+ })
228
+ }
229
+
230
+ const rmkids = (p, options, cb) => {
231
+ assert(p)
232
+ assert(options)
233
+ assert(typeof cb === 'function')
234
+
235
+ options.readdir(p, (er, files) => {
236
+ if (er)
237
+ return cb(er)
238
+ let n = files.length
239
+ if (n === 0)
240
+ return options.rmdir(p, cb)
241
+ let errState
242
+ files.forEach(f => {
243
+ rimraf(path.join(p, f), options, er => {
244
+ if (errState)
245
+ return
246
+ if (er)
247
+ return cb(errState = er)
248
+ if (--n === 0)
249
+ options.rmdir(p, cb)
250
+ })
251
+ })
252
+ })
253
+ }
254
+
255
+ // this looks simpler, and is strictly *faster*, but will
256
+ // tie up the JavaScript thread and fail on excessively
257
+ // deep directory trees.
258
+ const rimrafSync = (p, options) => {
259
+ options = options || {}
260
+ defaults(options)
261
+
262
+ assert(p, 'rimraf: missing path')
263
+ assert.equal(typeof p, 'string', 'rimraf: path should be a string')
264
+ assert(options, 'rimraf: missing options')
265
+ assert.equal(typeof options, 'object', 'rimraf: options should be object')
266
+
267
+ let results
268
+
269
+ if (options.disableGlob || !glob.hasMagic(p)) {
270
+ results = [p]
271
+ } else {
272
+ try {
273
+ options.lstatSync(p)
274
+ results = [p]
275
+ } catch (er) {
276
+ results = glob.sync(p, options.glob)
277
+ }
278
+ }
279
+
280
+ if (!results.length)
281
+ return
282
+
283
+ for (let i = 0; i < results.length; i++) {
284
+ const p = results[i]
285
+
286
+ let st
287
+ try {
288
+ st = options.lstatSync(p)
289
+ } catch (er) {
290
+ if (er.code === "ENOENT")
291
+ return
292
+
293
+ // Windows can EPERM on stat. Life is suffering.
294
+ if (er.code === "EPERM" && isWindows)
295
+ fixWinEPERMSync(p, options, er)
296
+ }
297
+
298
+ try {
299
+ // sunos lets the root user unlink directories, which is... weird.
300
+ if (st && st.isDirectory())
301
+ rmdirSync(p, options, null)
302
+ else
303
+ options.unlinkSync(p)
304
+ } catch (er) {
305
+ if (er.code === "ENOENT")
306
+ return
307
+ if (er.code === "EPERM")
308
+ return isWindows ? fixWinEPERMSync(p, options, er) : rmdirSync(p, options, er)
309
+ if (er.code !== "EISDIR")
310
+ throw er
311
+
312
+ rmdirSync(p, options, er)
313
+ }
314
+ }
315
+ }
316
+
317
+ const rmdirSync = (p, options, originalEr) => {
318
+ assert(p)
319
+ assert(options)
320
+
321
+ try {
322
+ options.rmdirSync(p)
323
+ } catch (er) {
324
+ if (er.code === "ENOENT")
325
+ return
326
+ if (er.code === "ENOTDIR")
327
+ throw originalEr
328
+ if (er.code === "ENOTEMPTY" || er.code === "EEXIST" || er.code === "EPERM")
329
+ rmkidsSync(p, options)
330
+ }
331
+ }
332
+
333
+ const rmkidsSync = (p, options) => {
334
+ assert(p)
335
+ assert(options)
336
+ options.readdirSync(p).forEach(f => rimrafSync(path.join(p, f), options))
337
+
338
+ // We only end up here once we got ENOTEMPTY at least once, and
339
+ // at this point, we are guaranteed to have removed all the kids.
340
+ // So, we know that it won't be ENOENT or ENOTDIR or anything else.
341
+ // try really hard to delete stuff on windows, because it has a
342
+ // PROFOUNDLY annoying habit of not closing handles promptly when
343
+ // files are deleted, resulting in spurious ENOTEMPTY errors.
344
+ const retries = isWindows ? 100 : 1
345
+ let i = 0
346
+ do {
347
+ let threw = true
348
+ try {
349
+ const ret = options.rmdirSync(p, options)
350
+ threw = false
351
+ return ret
352
+ } finally {
353
+ if (++i < retries && threw)
354
+ continue
355
+ }
356
+ } while (true)
357
+ }
358
+
359
+ module.exports = rimraf
360
+ rimraf.sync = rimrafSync