UrgentcareCLI 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (317) hide show
  1. checksums.yaml +4 -4
  2. data/lib/UrgentCare/CLI.rb +1 -2
  3. data/lib/UrgentCare/Scraper.rb +65 -0
  4. data/lib/UrgentCare/version.rb +2 -2
  5. data/lib/UrgentCare.rb +1 -0
  6. metadata +3 -313
  7. data/.gitignore +0 -11
  8. data/.rspec +0 -3
  9. data/.travis.yml +0 -5
  10. data/CODE_OF_CONDUCT.md +0 -74
  11. data/Gemfile +0 -12
  12. data/Gemfile.lock +0 -84
  13. data/LICENSE.txt +0 -21
  14. data/Notes +0 -41
  15. data/README.md +0 -41
  16. data/Rakefile +0 -8
  17. data/UrgentCare.gemspec +0 -39
  18. data/background.jpg +0 -0
  19. data/data.txt +0 -4
  20. data/lib/Urgentcare/Scraper.rb +0 -78
  21. data/node_modules/.bin/rimraf +0 -1
  22. data/node_modules/.package-lock.json +0 -250
  23. data/node_modules/balanced-match/.github/FUNDING.yml +0 -2
  24. data/node_modules/balanced-match/LICENSE.md +0 -21
  25. data/node_modules/balanced-match/README.md +0 -97
  26. data/node_modules/balanced-match/index.js +0 -62
  27. data/node_modules/balanced-match/package.json +0 -48
  28. data/node_modules/brace-expansion/LICENSE +0 -21
  29. data/node_modules/brace-expansion/README.md +0 -129
  30. data/node_modules/brace-expansion/index.js +0 -201
  31. data/node_modules/brace-expansion/package.json +0 -47
  32. data/node_modules/concat-map/.travis.yml +0 -4
  33. data/node_modules/concat-map/LICENSE +0 -18
  34. data/node_modules/concat-map/README.markdown +0 -62
  35. data/node_modules/concat-map/example/map.js +0 -6
  36. data/node_modules/concat-map/index.js +0 -13
  37. data/node_modules/concat-map/package.json +0 -43
  38. data/node_modules/concat-map/test/map.js +0 -39
  39. data/node_modules/core-util-is/LICENSE +0 -19
  40. data/node_modules/core-util-is/README.md +0 -3
  41. data/node_modules/core-util-is/float.patch +0 -604
  42. data/node_modules/core-util-is/lib/util.js +0 -107
  43. data/node_modules/core-util-is/package.json +0 -32
  44. data/node_modules/core-util-is/test.js +0 -68
  45. data/node_modules/fs.realpath/LICENSE +0 -43
  46. data/node_modules/fs.realpath/README.md +0 -33
  47. data/node_modules/fs.realpath/index.js +0 -66
  48. data/node_modules/fs.realpath/old.js +0 -303
  49. data/node_modules/fs.realpath/package.json +0 -26
  50. data/node_modules/glob/LICENSE +0 -21
  51. data/node_modules/glob/README.md +0 -375
  52. data/node_modules/glob/changelog.md +0 -67
  53. data/node_modules/glob/common.js +0 -234
  54. data/node_modules/glob/glob.js +0 -788
  55. data/node_modules/glob/package.json +0 -51
  56. data/node_modules/glob/sync.js +0 -484
  57. data/node_modules/immediate/LICENSE.txt +0 -20
  58. data/node_modules/immediate/README.md +0 -93
  59. data/node_modules/immediate/dist/immediate.js +0 -75
  60. data/node_modules/immediate/dist/immediate.min.js +0 -1
  61. data/node_modules/immediate/lib/browser.js +0 -69
  62. data/node_modules/immediate/lib/index.js +0 -73
  63. data/node_modules/immediate/package.json +0 -42
  64. data/node_modules/inflight/LICENSE +0 -15
  65. data/node_modules/inflight/README.md +0 -37
  66. data/node_modules/inflight/inflight.js +0 -54
  67. data/node_modules/inflight/package.json +0 -29
  68. data/node_modules/inherits/LICENSE +0 -16
  69. data/node_modules/inherits/README.md +0 -42
  70. data/node_modules/inherits/inherits.js +0 -9
  71. data/node_modules/inherits/inherits_browser.js +0 -27
  72. data/node_modules/inherits/package.json +0 -29
  73. data/node_modules/isarray/.npmignore +0 -1
  74. data/node_modules/isarray/.travis.yml +0 -4
  75. data/node_modules/isarray/Makefile +0 -6
  76. data/node_modules/isarray/README.md +0 -60
  77. data/node_modules/isarray/component.json +0 -19
  78. data/node_modules/isarray/index.js +0 -5
  79. data/node_modules/isarray/package.json +0 -45
  80. data/node_modules/isarray/test.js +0 -20
  81. data/node_modules/jszip/.codeclimate.yml +0 -16
  82. data/node_modules/jszip/.editorconfig +0 -8
  83. data/node_modules/jszip/.jshintignore +0 -1
  84. data/node_modules/jszip/.jshintrc +0 -21
  85. data/node_modules/jszip/.travis.yml +0 -17
  86. data/node_modules/jszip/CHANGES.md +0 -163
  87. data/node_modules/jszip/LICENSE.markdown +0 -651
  88. data/node_modules/jszip/README.markdown +0 -35
  89. data/node_modules/jszip/dist/jszip.js +0 -30
  90. data/node_modules/jszip/dist/jszip.min.js +0 -13
  91. data/node_modules/jszip/index.d.ts +0 -270
  92. data/node_modules/jszip/lib/base64.js +0 -106
  93. data/node_modules/jszip/lib/compressedObject.js +0 -74
  94. data/node_modules/jszip/lib/compressions.js +0 -14
  95. data/node_modules/jszip/lib/crc32.js +0 -77
  96. data/node_modules/jszip/lib/defaults.js +0 -11
  97. data/node_modules/jszip/lib/external.js +0 -19
  98. data/node_modules/jszip/lib/flate.js +0 -85
  99. data/node_modules/jszip/lib/generate/ZipFileWorker.js +0 -540
  100. data/node_modules/jszip/lib/generate/index.js +0 -57
  101. data/node_modules/jszip/lib/index.js +0 -52
  102. data/node_modules/jszip/lib/license_header.js +0 -11
  103. data/node_modules/jszip/lib/load.js +0 -81
  104. data/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +0 -74
  105. data/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +0 -42
  106. data/node_modules/jszip/lib/nodejsUtils.js +0 -57
  107. data/node_modules/jszip/lib/object.js +0 -389
  108. data/node_modules/jszip/lib/readable-stream-browser.js +0 -9
  109. data/node_modules/jszip/lib/reader/ArrayReader.js +0 -57
  110. data/node_modules/jszip/lib/reader/DataReader.js +0 -116
  111. data/node_modules/jszip/lib/reader/NodeBufferReader.js +0 -19
  112. data/node_modules/jszip/lib/reader/StringReader.js +0 -38
  113. data/node_modules/jszip/lib/reader/Uint8ArrayReader.js +0 -22
  114. data/node_modules/jszip/lib/reader/readerFor.js +0 -28
  115. data/node_modules/jszip/lib/signature.js +0 -7
  116. data/node_modules/jszip/lib/stream/ConvertWorker.js +0 -26
  117. data/node_modules/jszip/lib/stream/Crc32Probe.js +0 -24
  118. data/node_modules/jszip/lib/stream/DataLengthProbe.js +0 -29
  119. data/node_modules/jszip/lib/stream/DataWorker.js +0 -116
  120. data/node_modules/jszip/lib/stream/GenericWorker.js +0 -263
  121. data/node_modules/jszip/lib/stream/StreamHelper.js +0 -212
  122. data/node_modules/jszip/lib/support.js +0 -38
  123. data/node_modules/jszip/lib/utf8.js +0 -275
  124. data/node_modules/jszip/lib/utils.js +0 -476
  125. data/node_modules/jszip/lib/zipEntries.js +0 -262
  126. data/node_modules/jszip/lib/zipEntry.js +0 -294
  127. data/node_modules/jszip/lib/zipObject.js +0 -133
  128. data/node_modules/jszip/package.json +0 -63
  129. data/node_modules/jszip/vendor/FileSaver.js +0 -247
  130. data/node_modules/lie/README.md +0 -62
  131. data/node_modules/lie/dist/lie.js +0 -350
  132. data/node_modules/lie/dist/lie.min.js +0 -1
  133. data/node_modules/lie/dist/lie.polyfill.js +0 -358
  134. data/node_modules/lie/dist/lie.polyfill.min.js +0 -1
  135. data/node_modules/lie/lib/browser.js +0 -273
  136. data/node_modules/lie/lib/index.js +0 -298
  137. data/node_modules/lie/license.md +0 -7
  138. data/node_modules/lie/lie.d.ts +0 -244
  139. data/node_modules/lie/package.json +0 -69
  140. data/node_modules/lie/polyfill.js +0 -4
  141. data/node_modules/minimatch/LICENSE +0 -15
  142. data/node_modules/minimatch/README.md +0 -209
  143. data/node_modules/minimatch/minimatch.js +0 -923
  144. data/node_modules/minimatch/package.json +0 -30
  145. data/node_modules/once/LICENSE +0 -15
  146. data/node_modules/once/README.md +0 -79
  147. data/node_modules/once/once.js +0 -42
  148. data/node_modules/once/package.json +0 -33
  149. data/node_modules/pako/CHANGELOG.md +0 -164
  150. data/node_modules/pako/LICENSE +0 -21
  151. data/node_modules/pako/README.md +0 -191
  152. data/node_modules/pako/dist/pako.js +0 -6818
  153. data/node_modules/pako/dist/pako.min.js +0 -1
  154. data/node_modules/pako/dist/pako_deflate.js +0 -3997
  155. data/node_modules/pako/dist/pako_deflate.min.js +0 -1
  156. data/node_modules/pako/dist/pako_inflate.js +0 -3300
  157. data/node_modules/pako/dist/pako_inflate.min.js +0 -1
  158. data/node_modules/pako/index.js +0 -14
  159. data/node_modules/pako/lib/deflate.js +0 -400
  160. data/node_modules/pako/lib/inflate.js +0 -423
  161. data/node_modules/pako/lib/utils/common.js +0 -105
  162. data/node_modules/pako/lib/utils/strings.js +0 -187
  163. data/node_modules/pako/lib/zlib/README +0 -59
  164. data/node_modules/pako/lib/zlib/adler32.js +0 -51
  165. data/node_modules/pako/lib/zlib/constants.js +0 -68
  166. data/node_modules/pako/lib/zlib/crc32.js +0 -59
  167. data/node_modules/pako/lib/zlib/deflate.js +0 -1874
  168. data/node_modules/pako/lib/zlib/gzheader.js +0 -58
  169. data/node_modules/pako/lib/zlib/inffast.js +0 -345
  170. data/node_modules/pako/lib/zlib/inflate.js +0 -1556
  171. data/node_modules/pako/lib/zlib/inftrees.js +0 -343
  172. data/node_modules/pako/lib/zlib/messages.js +0 -32
  173. data/node_modules/pako/lib/zlib/trees.js +0 -1222
  174. data/node_modules/pako/lib/zlib/zstream.js +0 -47
  175. data/node_modules/pako/package.json +0 -44
  176. data/node_modules/path-is-absolute/index.js +0 -20
  177. data/node_modules/path-is-absolute/license +0 -21
  178. data/node_modules/path-is-absolute/package.json +0 -43
  179. data/node_modules/path-is-absolute/readme.md +0 -59
  180. data/node_modules/process-nextick-args/index.js +0 -45
  181. data/node_modules/process-nextick-args/license.md +0 -19
  182. data/node_modules/process-nextick-args/package.json +0 -25
  183. data/node_modules/process-nextick-args/readme.md +0 -18
  184. data/node_modules/readable-stream/.travis.yml +0 -34
  185. data/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  186. data/node_modules/readable-stream/GOVERNANCE.md +0 -136
  187. data/node_modules/readable-stream/LICENSE +0 -47
  188. data/node_modules/readable-stream/README.md +0 -58
  189. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +0 -60
  190. data/node_modules/readable-stream/duplex-browser.js +0 -1
  191. data/node_modules/readable-stream/duplex.js +0 -1
  192. data/node_modules/readable-stream/lib/_stream_duplex.js +0 -131
  193. data/node_modules/readable-stream/lib/_stream_passthrough.js +0 -47
  194. data/node_modules/readable-stream/lib/_stream_readable.js +0 -1019
  195. data/node_modules/readable-stream/lib/_stream_transform.js +0 -214
  196. data/node_modules/readable-stream/lib/_stream_writable.js +0 -687
  197. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +0 -79
  198. data/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -74
  199. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  200. data/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  201. data/node_modules/readable-stream/package.json +0 -52
  202. data/node_modules/readable-stream/passthrough.js +0 -1
  203. data/node_modules/readable-stream/readable-browser.js +0 -7
  204. data/node_modules/readable-stream/readable.js +0 -19
  205. data/node_modules/readable-stream/transform.js +0 -1
  206. data/node_modules/readable-stream/writable-browser.js +0 -1
  207. data/node_modules/readable-stream/writable.js +0 -8
  208. data/node_modules/rimraf/LICENSE +0 -15
  209. data/node_modules/rimraf/README.md +0 -101
  210. data/node_modules/rimraf/bin.js +0 -50
  211. data/node_modules/rimraf/package.json +0 -29
  212. data/node_modules/rimraf/rimraf.js +0 -372
  213. data/node_modules/safe-buffer/LICENSE +0 -21
  214. data/node_modules/safe-buffer/README.md +0 -584
  215. data/node_modules/safe-buffer/index.d.ts +0 -187
  216. data/node_modules/safe-buffer/index.js +0 -62
  217. data/node_modules/safe-buffer/package.json +0 -37
  218. data/node_modules/selenium-webdriver/CHANGES.md +0 -1114
  219. data/node_modules/selenium-webdriver/LICENSE +0 -202
  220. data/node_modules/selenium-webdriver/NOTICE +0 -2
  221. data/node_modules/selenium-webdriver/README.md +0 -229
  222. data/node_modules/selenium-webdriver/chrome.js +0 -295
  223. data/node_modules/selenium-webdriver/chromium.js +0 -829
  224. data/node_modules/selenium-webdriver/devtools/CDPConnection.js +0 -35
  225. data/node_modules/selenium-webdriver/edge.js +0 -224
  226. data/node_modules/selenium-webdriver/example/chrome_android.js +0 -45
  227. data/node_modules/selenium-webdriver/example/chrome_mobile_emulation.js +0 -46
  228. data/node_modules/selenium-webdriver/example/firefox_channels.js +0 -84
  229. data/node_modules/selenium-webdriver/example/google_search.js +0 -50
  230. data/node_modules/selenium-webdriver/example/google_search_test.js +0 -70
  231. data/node_modules/selenium-webdriver/example/headless.js +0 -63
  232. data/node_modules/selenium-webdriver/example/logging.js +0 -64
  233. data/node_modules/selenium-webdriver/firefox.js +0 -789
  234. data/node_modules/selenium-webdriver/http/index.js +0 -324
  235. data/node_modules/selenium-webdriver/http/util.js +0 -172
  236. data/node_modules/selenium-webdriver/ie.js +0 -503
  237. data/node_modules/selenium-webdriver/index.js +0 -825
  238. data/node_modules/selenium-webdriver/io/exec.js +0 -162
  239. data/node_modules/selenium-webdriver/io/index.js +0 -348
  240. data/node_modules/selenium-webdriver/io/zip.js +0 -223
  241. data/node_modules/selenium-webdriver/lib/atoms/find-elements.js +0 -123
  242. data/node_modules/selenium-webdriver/lib/atoms/get-attribute.js +0 -101
  243. data/node_modules/selenium-webdriver/lib/atoms/is-displayed.js +0 -101
  244. data/node_modules/selenium-webdriver/lib/atoms/mutation-listener.js +0 -55
  245. data/node_modules/selenium-webdriver/lib/by.js +0 -415
  246. data/node_modules/selenium-webdriver/lib/capabilities.js +0 -553
  247. data/node_modules/selenium-webdriver/lib/command.js +0 -206
  248. data/node_modules/selenium-webdriver/lib/error.js +0 -605
  249. data/node_modules/selenium-webdriver/lib/http.js +0 -704
  250. data/node_modules/selenium-webdriver/lib/input.js +0 -946
  251. data/node_modules/selenium-webdriver/lib/logging.js +0 -661
  252. data/node_modules/selenium-webdriver/lib/promise.js +0 -285
  253. data/node_modules/selenium-webdriver/lib/proxy.js +0 -212
  254. data/node_modules/selenium-webdriver/lib/session.js +0 -77
  255. data/node_modules/selenium-webdriver/lib/symbols.js +0 -37
  256. data/node_modules/selenium-webdriver/lib/until.js +0 -429
  257. data/node_modules/selenium-webdriver/lib/webdriver.js +0 -2919
  258. data/node_modules/selenium-webdriver/net/index.js +0 -107
  259. data/node_modules/selenium-webdriver/net/portprober.js +0 -75
  260. data/node_modules/selenium-webdriver/opera.js +0 -406
  261. data/node_modules/selenium-webdriver/package.json +0 -54
  262. data/node_modules/selenium-webdriver/proxy.js +0 -32
  263. data/node_modules/selenium-webdriver/remote/index.js +0 -624
  264. data/node_modules/selenium-webdriver/safari.js +0 -168
  265. data/node_modules/selenium-webdriver/testing/index.js +0 -504
  266. data/node_modules/set-immediate-shim/index.js +0 -7
  267. data/node_modules/set-immediate-shim/package.json +0 -34
  268. data/node_modules/set-immediate-shim/readme.md +0 -31
  269. data/node_modules/string_decoder/.travis.yml +0 -50
  270. data/node_modules/string_decoder/LICENSE +0 -48
  271. data/node_modules/string_decoder/README.md +0 -47
  272. data/node_modules/string_decoder/lib/string_decoder.js +0 -296
  273. data/node_modules/string_decoder/package.json +0 -31
  274. data/node_modules/tmp/CHANGELOG.md +0 -288
  275. data/node_modules/tmp/LICENSE +0 -21
  276. data/node_modules/tmp/README.md +0 -365
  277. data/node_modules/tmp/lib/tmp.js +0 -780
  278. data/node_modules/tmp/node_modules/.bin/rimraf +0 -1
  279. data/node_modules/tmp/node_modules/rimraf/CHANGELOG.md +0 -65
  280. data/node_modules/tmp/node_modules/rimraf/LICENSE +0 -15
  281. data/node_modules/tmp/node_modules/rimraf/README.md +0 -101
  282. data/node_modules/tmp/node_modules/rimraf/bin.js +0 -68
  283. data/node_modules/tmp/node_modules/rimraf/package.json +0 -32
  284. data/node_modules/tmp/node_modules/rimraf/rimraf.js +0 -360
  285. data/node_modules/tmp/package.json +0 -58
  286. data/node_modules/util-deprecate/History.md +0 -16
  287. data/node_modules/util-deprecate/LICENSE +0 -24
  288. data/node_modules/util-deprecate/README.md +0 -53
  289. data/node_modules/util-deprecate/browser.js +0 -67
  290. data/node_modules/util-deprecate/node.js +0 -6
  291. data/node_modules/util-deprecate/package.json +0 -27
  292. data/node_modules/wrappy/LICENSE +0 -15
  293. data/node_modules/wrappy/README.md +0 -36
  294. data/node_modules/wrappy/package.json +0 -29
  295. data/node_modules/wrappy/wrappy.js +0 -33
  296. data/node_modules/ws/LICENSE +0 -21
  297. data/node_modules/ws/README.md +0 -496
  298. data/node_modules/ws/browser.js +0 -8
  299. data/node_modules/ws/index.js +0 -10
  300. data/node_modules/ws/lib/buffer-util.js +0 -129
  301. data/node_modules/ws/lib/constants.js +0 -10
  302. data/node_modules/ws/lib/event-target.js +0 -184
  303. data/node_modules/ws/lib/extension.js +0 -223
  304. data/node_modules/ws/lib/limiter.js +0 -55
  305. data/node_modules/ws/lib/permessage-deflate.js +0 -517
  306. data/node_modules/ws/lib/receiver.js +0 -507
  307. data/node_modules/ws/lib/sender.js +0 -405
  308. data/node_modules/ws/lib/stream.js +0 -165
  309. data/node_modules/ws/lib/validation.js +0 -104
  310. data/node_modules/ws/lib/websocket-server.js +0 -418
  311. data/node_modules/ws/lib/websocket.js +0 -942
  312. data/node_modules/ws/package.json +0 -56
  313. data/package-lock.json +0 -458
  314. data/package.json +0 -5
  315. data/selenium.log +0 -1
  316. data/spec.md +0 -6
  317. data/test.data +0 -2110
@@ -1 +0,0 @@
1
- ../rimraf/bin.js
@@ -1,65 +0,0 @@
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
@@ -1,15 +0,0 @@
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.
@@ -1,101 +0,0 @@
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).
@@ -1,68 +0,0 @@
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)
@@ -1,32 +0,0 @@
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
- }
@@ -1,360 +0,0 @@
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