postdoc 0.1.2 → 0.2.0.beta4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (372) hide show
  1. checksums.yaml +5 -5
  2. data/lib/pdf.js +27 -0
  3. data/lib/postdoc.rb +3 -7
  4. data/node_modules/agent-base/History.md +113 -0
  5. data/node_modules/agent-base/README.md +145 -0
  6. data/node_modules/agent-base/index.js +160 -0
  7. data/node_modules/agent-base/package.json +35 -0
  8. data/node_modules/agent-base/patch-core.js +37 -0
  9. data/node_modules/agent-base/test/ssl-cert-snakeoil.key +15 -0
  10. data/node_modules/agent-base/test/ssl-cert-snakeoil.pem +12 -0
  11. data/node_modules/agent-base/test/test.js +673 -0
  12. data/node_modules/async-limiter/LICENSE +8 -0
  13. data/node_modules/async-limiter/coverage/coverage.json +1 -0
  14. data/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.html +73 -0
  15. data/node_modules/async-limiter/coverage/lcov-report/async-throttle/index.js.html +246 -0
  16. data/node_modules/async-limiter/coverage/lcov-report/base.css +182 -0
  17. data/node_modules/async-limiter/coverage/lcov-report/index.html +73 -0
  18. data/node_modules/async-limiter/coverage/lcov-report/prettify.css +1 -0
  19. data/node_modules/async-limiter/coverage/lcov-report/prettify.js +1 -0
  20. data/node_modules/async-limiter/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  21. data/node_modules/async-limiter/coverage/lcov-report/sorter.js +156 -0
  22. data/node_modules/async-limiter/coverage/lcov.info +74 -0
  23. data/node_modules/async-limiter/index.js +67 -0
  24. data/node_modules/async-limiter/package.json +35 -0
  25. data/node_modules/async-limiter/readme.md +132 -0
  26. data/node_modules/balanced-match/LICENSE.md +21 -0
  27. data/node_modules/balanced-match/README.md +91 -0
  28. data/node_modules/balanced-match/index.js +59 -0
  29. data/node_modules/balanced-match/package.json +49 -0
  30. data/node_modules/brace-expansion/LICENSE +21 -0
  31. data/node_modules/brace-expansion/README.md +129 -0
  32. data/node_modules/brace-expansion/index.js +201 -0
  33. data/node_modules/brace-expansion/package.json +47 -0
  34. data/node_modules/buffer-from/index.js +69 -0
  35. data/node_modules/buffer-from/package.json +16 -0
  36. data/node_modules/buffer-from/readme.md +69 -0
  37. data/node_modules/buffer-from/test.js +12 -0
  38. data/node_modules/concat-map/LICENSE +18 -0
  39. data/node_modules/concat-map/README.markdown +62 -0
  40. data/node_modules/concat-map/example/map.js +6 -0
  41. data/node_modules/concat-map/index.js +13 -0
  42. data/node_modules/concat-map/package.json +43 -0
  43. data/node_modules/concat-map/test/map.js +39 -0
  44. data/node_modules/concat-stream/LICENSE +24 -0
  45. data/node_modules/concat-stream/index.js +144 -0
  46. data/node_modules/concat-stream/package.json +55 -0
  47. data/node_modules/concat-stream/readme.md +102 -0
  48. data/node_modules/core-util-is/LICENSE +19 -0
  49. data/node_modules/core-util-is/README.md +3 -0
  50. data/node_modules/core-util-is/float.patch +604 -0
  51. data/node_modules/core-util-is/lib/util.js +107 -0
  52. data/node_modules/core-util-is/package.json +32 -0
  53. data/node_modules/core-util-is/test.js +68 -0
  54. data/node_modules/debug/CHANGELOG.md +395 -0
  55. data/node_modules/debug/LICENSE +19 -0
  56. data/node_modules/debug/Makefile +58 -0
  57. data/node_modules/debug/README.md +368 -0
  58. data/node_modules/debug/karma.conf.js +70 -0
  59. data/node_modules/debug/node.js +1 -0
  60. data/node_modules/debug/package.json +43 -0
  61. data/node_modules/debug/src/browser.js +195 -0
  62. data/node_modules/debug/src/debug.js +225 -0
  63. data/node_modules/debug/src/index.js +10 -0
  64. data/node_modules/debug/src/node.js +186 -0
  65. data/node_modules/es6-promise/CHANGELOG.md +151 -0
  66. data/node_modules/es6-promise/LICENSE +19 -0
  67. data/node_modules/es6-promise/README.md +97 -0
  68. data/node_modules/es6-promise/auto.js +4 -0
  69. data/node_modules/es6-promise/dist/es6-promise.auto.js +1181 -0
  70. data/node_modules/es6-promise/dist/es6-promise.auto.map +1 -0
  71. data/node_modules/es6-promise/dist/es6-promise.auto.min.js +1 -0
  72. data/node_modules/es6-promise/dist/es6-promise.auto.min.map +1 -0
  73. data/node_modules/es6-promise/dist/es6-promise.js +1179 -0
  74. data/node_modules/es6-promise/dist/es6-promise.map +1 -0
  75. data/node_modules/es6-promise/dist/es6-promise.min.js +1 -0
  76. data/node_modules/es6-promise/dist/es6-promise.min.map +1 -0
  77. data/node_modules/es6-promise/es6-promise.d.ts +81 -0
  78. data/node_modules/es6-promise/lib/es6-promise/-internal.js +266 -0
  79. data/node_modules/es6-promise/lib/es6-promise/asap.js +119 -0
  80. data/node_modules/es6-promise/lib/es6-promise/enumerator.js +113 -0
  81. data/node_modules/es6-promise/lib/es6-promise/polyfill.js +35 -0
  82. data/node_modules/es6-promise/lib/es6-promise/promise/all.js +52 -0
  83. data/node_modules/es6-promise/lib/es6-promise/promise/race.js +84 -0
  84. data/node_modules/es6-promise/lib/es6-promise/promise/reject.js +46 -0
  85. data/node_modules/es6-promise/lib/es6-promise/promise/resolve.js +48 -0
  86. data/node_modules/es6-promise/lib/es6-promise/promise.js +427 -0
  87. data/node_modules/es6-promise/lib/es6-promise/then.js +32 -0
  88. data/node_modules/es6-promise/lib/es6-promise/utils.js +21 -0
  89. data/node_modules/es6-promise/lib/es6-promise.auto.js +3 -0
  90. data/node_modules/es6-promise/lib/es6-promise.js +7 -0
  91. data/node_modules/es6-promise/package.json +75 -0
  92. data/node_modules/es6-promisify/README.md +89 -0
  93. data/node_modules/es6-promisify/dist/promise.js +73 -0
  94. data/node_modules/es6-promisify/dist/promisify.js +85 -0
  95. data/node_modules/es6-promisify/package.json +41 -0
  96. data/node_modules/extract-zip/CONTRIBUTING.md +1 -0
  97. data/node_modules/extract-zip/LICENSE +23 -0
  98. data/node_modules/extract-zip/cli.js +20 -0
  99. data/node_modules/extract-zip/index.js +205 -0
  100. data/node_modules/extract-zip/node_modules/debug/CHANGELOG.md +362 -0
  101. data/node_modules/extract-zip/node_modules/debug/LICENSE +19 -0
  102. data/node_modules/extract-zip/node_modules/debug/Makefile +50 -0
  103. data/node_modules/extract-zip/node_modules/debug/README.md +312 -0
  104. data/node_modules/extract-zip/node_modules/debug/component.json +19 -0
  105. data/node_modules/extract-zip/node_modules/debug/karma.conf.js +70 -0
  106. data/node_modules/extract-zip/node_modules/debug/node.js +1 -0
  107. data/node_modules/extract-zip/node_modules/debug/package.json +49 -0
  108. data/node_modules/extract-zip/node_modules/debug/src/browser.js +185 -0
  109. data/node_modules/extract-zip/node_modules/debug/src/debug.js +202 -0
  110. data/node_modules/extract-zip/node_modules/debug/src/index.js +10 -0
  111. data/node_modules/extract-zip/node_modules/debug/src/inspector-log.js +15 -0
  112. data/node_modules/extract-zip/node_modules/debug/src/node.js +248 -0
  113. data/node_modules/extract-zip/package.json +35 -0
  114. data/node_modules/extract-zip/readme.md +49 -0
  115. data/node_modules/fd-slicer/CHANGELOG.md +49 -0
  116. data/node_modules/fd-slicer/LICENSE +21 -0
  117. data/node_modules/fd-slicer/README.md +189 -0
  118. data/node_modules/fd-slicer/index.js +277 -0
  119. data/node_modules/fd-slicer/package.json +36 -0
  120. data/node_modules/fd-slicer/test/test.js +350 -0
  121. data/node_modules/fs.realpath/LICENSE +43 -0
  122. data/node_modules/fs.realpath/README.md +33 -0
  123. data/node_modules/fs.realpath/index.js +66 -0
  124. data/node_modules/fs.realpath/old.js +303 -0
  125. data/node_modules/fs.realpath/package.json +26 -0
  126. data/node_modules/glob/LICENSE +15 -0
  127. data/node_modules/glob/README.md +368 -0
  128. data/node_modules/glob/changelog.md +67 -0
  129. data/node_modules/glob/common.js +240 -0
  130. data/node_modules/glob/glob.js +790 -0
  131. data/node_modules/glob/package.json +43 -0
  132. data/node_modules/glob/sync.js +486 -0
  133. data/node_modules/https-proxy-agent/History.md +124 -0
  134. data/node_modules/https-proxy-agent/README.md +137 -0
  135. data/node_modules/https-proxy-agent/index.js +229 -0
  136. data/node_modules/https-proxy-agent/package.json +35 -0
  137. data/node_modules/https-proxy-agent/test/ssl-cert-snakeoil.key +15 -0
  138. data/node_modules/https-proxy-agent/test/ssl-cert-snakeoil.pem +12 -0
  139. data/node_modules/https-proxy-agent/test/test.js +342 -0
  140. data/node_modules/inflight/LICENSE +15 -0
  141. data/node_modules/inflight/README.md +37 -0
  142. data/node_modules/inflight/inflight.js +54 -0
  143. data/node_modules/inflight/package.json +29 -0
  144. data/node_modules/inherits/LICENSE +16 -0
  145. data/node_modules/inherits/README.md +42 -0
  146. data/node_modules/inherits/inherits.js +7 -0
  147. data/node_modules/inherits/inherits_browser.js +23 -0
  148. data/node_modules/inherits/package.json +29 -0
  149. data/node_modules/isarray/Makefile +6 -0
  150. data/node_modules/isarray/README.md +60 -0
  151. data/node_modules/isarray/component.json +19 -0
  152. data/node_modules/isarray/index.js +5 -0
  153. data/node_modules/isarray/package.json +45 -0
  154. data/node_modules/isarray/test.js +20 -0
  155. data/node_modules/mime/CHANGELOG.md +225 -0
  156. data/node_modules/mime/CONTRIBUTING.md +5 -0
  157. data/node_modules/mime/LICENSE +21 -0
  158. data/node_modules/mime/Mime.js +89 -0
  159. data/node_modules/mime/README.md +188 -0
  160. data/node_modules/mime/cli.js +10 -0
  161. data/node_modules/mime/index.js +4 -0
  162. data/node_modules/mime/lite.js +4 -0
  163. data/node_modules/mime/package.json +43 -0
  164. data/node_modules/mime/src/README_js.md +179 -0
  165. data/node_modules/mime/src/build.js +71 -0
  166. data/node_modules/mime/src/test.js +257 -0
  167. data/node_modules/mime/types/other.json +1 -0
  168. data/node_modules/mime/types/standard.json +1 -0
  169. data/node_modules/minimatch/LICENSE +15 -0
  170. data/node_modules/minimatch/README.md +209 -0
  171. data/node_modules/minimatch/minimatch.js +923 -0
  172. data/node_modules/minimatch/package.json +30 -0
  173. data/node_modules/minimist/LICENSE +18 -0
  174. data/node_modules/minimist/example/parse.js +2 -0
  175. data/node_modules/minimist/index.js +187 -0
  176. data/node_modules/minimist/package.json +40 -0
  177. data/node_modules/minimist/readme.markdown +73 -0
  178. data/node_modules/minimist/test/dash.js +24 -0
  179. data/node_modules/minimist/test/default_bool.js +20 -0
  180. data/node_modules/minimist/test/dotted.js +16 -0
  181. data/node_modules/minimist/test/long.js +31 -0
  182. data/node_modules/minimist/test/parse.js +318 -0
  183. data/node_modules/minimist/test/parse_modified.js +9 -0
  184. data/node_modules/minimist/test/short.js +67 -0
  185. data/node_modules/minimist/test/whitespace.js +8 -0
  186. data/node_modules/mkdirp/LICENSE +21 -0
  187. data/node_modules/mkdirp/bin/cmd.js +33 -0
  188. data/node_modules/mkdirp/bin/usage.txt +12 -0
  189. data/node_modules/mkdirp/examples/pow.js +6 -0
  190. data/node_modules/mkdirp/index.js +98 -0
  191. data/node_modules/mkdirp/package.json +27 -0
  192. data/node_modules/mkdirp/readme.markdown +100 -0
  193. data/node_modules/mkdirp/test/chmod.js +41 -0
  194. data/node_modules/mkdirp/test/clobber.js +38 -0
  195. data/node_modules/mkdirp/test/mkdirp.js +28 -0
  196. data/node_modules/mkdirp/test/opts_fs.js +29 -0
  197. data/node_modules/mkdirp/test/opts_fs_sync.js +27 -0
  198. data/node_modules/mkdirp/test/perm.js +32 -0
  199. data/node_modules/mkdirp/test/perm_sync.js +36 -0
  200. data/node_modules/mkdirp/test/race.js +37 -0
  201. data/node_modules/mkdirp/test/rel.js +32 -0
  202. data/node_modules/mkdirp/test/return.js +25 -0
  203. data/node_modules/mkdirp/test/return_sync.js +24 -0
  204. data/node_modules/mkdirp/test/root.js +19 -0
  205. data/node_modules/mkdirp/test/sync.js +32 -0
  206. data/node_modules/mkdirp/test/umask.js +28 -0
  207. data/node_modules/mkdirp/test/umask_sync.js +32 -0
  208. data/node_modules/ms/index.js +152 -0
  209. data/node_modules/ms/license.md +21 -0
  210. data/node_modules/ms/package.json +37 -0
  211. data/node_modules/ms/readme.md +51 -0
  212. data/node_modules/once/LICENSE +15 -0
  213. data/node_modules/once/README.md +79 -0
  214. data/node_modules/once/once.js +42 -0
  215. data/node_modules/once/package.json +33 -0
  216. data/node_modules/path-is-absolute/index.js +20 -0
  217. data/node_modules/path-is-absolute/license +21 -0
  218. data/node_modules/path-is-absolute/package.json +43 -0
  219. data/node_modules/path-is-absolute/readme.md +59 -0
  220. data/node_modules/pend/LICENSE +23 -0
  221. data/node_modules/pend/README.md +41 -0
  222. data/node_modules/pend/index.js +55 -0
  223. data/node_modules/pend/package.json +18 -0
  224. data/node_modules/pend/test.js +137 -0
  225. data/node_modules/process-nextick-args/index.js +44 -0
  226. data/node_modules/process-nextick-args/license.md +19 -0
  227. data/node_modules/process-nextick-args/package.json +25 -0
  228. data/node_modules/process-nextick-args/readme.md +18 -0
  229. data/node_modules/progress/CHANGELOG.md +115 -0
  230. data/node_modules/progress/LICENSE +22 -0
  231. data/node_modules/progress/Makefile +8 -0
  232. data/node_modules/progress/README.md +146 -0
  233. data/node_modules/progress/index.js +1 -0
  234. data/node_modules/progress/lib/node-progress.js +231 -0
  235. data/node_modules/progress/package.json +25 -0
  236. data/node_modules/proxy-from-env/README.md +131 -0
  237. data/node_modules/proxy-from-env/index.js +103 -0
  238. data/node_modules/proxy-from-env/package.json +35 -0
  239. data/node_modules/proxy-from-env/test.js +393 -0
  240. data/node_modules/puppeteer/CONTRIBUTING.md +206 -0
  241. data/node_modules/puppeteer/DeviceDescriptors.js +704 -0
  242. data/node_modules/puppeteer/LICENSE +202 -0
  243. data/node_modules/puppeteer/README.md +306 -0
  244. data/node_modules/puppeteer/index.js +28 -0
  245. data/node_modules/puppeteer/install.js +122 -0
  246. data/node_modules/puppeteer/lib/Browser.js +186 -0
  247. data/node_modules/puppeteer/lib/BrowserFetcher.js +279 -0
  248. data/node_modules/puppeteer/lib/Connection.js +246 -0
  249. data/node_modules/puppeteer/lib/Coverage.js +301 -0
  250. data/node_modules/puppeteer/lib/Dialog.js +84 -0
  251. data/node_modules/puppeteer/lib/ElementHandle.js +328 -0
  252. data/node_modules/puppeteer/lib/EmulationManager.js +89 -0
  253. data/node_modules/puppeteer/lib/ExecutionContext.js +232 -0
  254. data/node_modules/puppeteer/lib/FrameManager.js +997 -0
  255. data/node_modules/puppeteer/lib/Input.js +309 -0
  256. data/node_modules/puppeteer/lib/Launcher.js +310 -0
  257. data/node_modules/puppeteer/lib/Multimap.js +95 -0
  258. data/node_modules/puppeteer/lib/NavigatorWatcher.js +137 -0
  259. data/node_modules/puppeteer/lib/NetworkManager.js +796 -0
  260. data/node_modules/puppeteer/lib/Page.js +1098 -0
  261. data/node_modules/puppeteer/lib/Pipe.js +69 -0
  262. data/node_modules/puppeteer/lib/Puppeteer.js +60 -0
  263. data/node_modules/puppeteer/lib/Target.js +88 -0
  264. data/node_modules/puppeteer/lib/TaskQueue.js +17 -0
  265. data/node_modules/puppeteer/lib/Tracing.js +99 -0
  266. data/node_modules/puppeteer/lib/USKeyboardLayout.js +281 -0
  267. data/node_modules/puppeteer/lib/helper.js +248 -0
  268. data/node_modules/puppeteer/node6/lib/Browser.js +394 -0
  269. data/node_modules/puppeteer/node6/lib/BrowserFetcher.js +357 -0
  270. data/node_modules/puppeteer/node6/lib/Connection.js +350 -0
  271. data/node_modules/puppeteer/node6/lib/Coverage.js +561 -0
  272. data/node_modules/puppeteer/node6/lib/Dialog.js +136 -0
  273. data/node_modules/puppeteer/node6/lib/ElementHandle.js +796 -0
  274. data/node_modules/puppeteer/node6/lib/EmulationManager.js +115 -0
  275. data/node_modules/puppeteer/node6/lib/ExecutionContext.js +414 -0
  276. data/node_modules/puppeteer/node6/lib/FrameManager.js +1621 -0
  277. data/node_modules/puppeteer/node6/lib/Input.js +569 -0
  278. data/node_modules/puppeteer/node6/lib/Launcher.js +362 -0
  279. data/node_modules/puppeteer/node6/lib/Multimap.js +95 -0
  280. data/node_modules/puppeteer/node6/lib/NavigatorWatcher.js +163 -0
  281. data/node_modules/puppeteer/node6/lib/NetworkManager.js +1108 -0
  282. data/node_modules/puppeteer/node6/lib/Page.js +2242 -0
  283. data/node_modules/puppeteer/node6/lib/Pipe.js +69 -0
  284. data/node_modules/puppeteer/node6/lib/Puppeteer.js +60 -0
  285. data/node_modules/puppeteer/node6/lib/Target.js +114 -0
  286. data/node_modules/puppeteer/node6/lib/TaskQueue.js +17 -0
  287. data/node_modules/puppeteer/node6/lib/Tracing.js +177 -0
  288. data/node_modules/puppeteer/node6/lib/USKeyboardLayout.js +281 -0
  289. data/node_modules/puppeteer/node6/lib/helper.js +274 -0
  290. data/node_modules/puppeteer/package.json +61 -0
  291. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  292. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  293. data/node_modules/readable-stream/LICENSE +47 -0
  294. data/node_modules/readable-stream/README.md +58 -0
  295. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  296. data/node_modules/readable-stream/duplex-browser.js +1 -0
  297. data/node_modules/readable-stream/duplex.js +1 -0
  298. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  299. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  300. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  301. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  302. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  303. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  304. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  305. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  306. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  307. data/node_modules/readable-stream/package.json +52 -0
  308. data/node_modules/readable-stream/passthrough.js +1 -0
  309. data/node_modules/readable-stream/readable-browser.js +7 -0
  310. data/node_modules/readable-stream/readable.js +19 -0
  311. data/node_modules/readable-stream/transform.js +1 -0
  312. data/node_modules/readable-stream/writable-browser.js +1 -0
  313. data/node_modules/readable-stream/writable.js +8 -0
  314. data/node_modules/rimraf/LICENSE +15 -0
  315. data/node_modules/rimraf/README.md +101 -0
  316. data/node_modules/rimraf/bin.js +50 -0
  317. data/node_modules/rimraf/package.json +26 -0
  318. data/node_modules/rimraf/rimraf.js +364 -0
  319. data/node_modules/safe-buffer/LICENSE +21 -0
  320. data/node_modules/safe-buffer/README.md +584 -0
  321. data/node_modules/safe-buffer/index.d.ts +187 -0
  322. data/node_modules/safe-buffer/index.js +62 -0
  323. data/node_modules/safe-buffer/package.json +37 -0
  324. data/node_modules/string_decoder/LICENSE +48 -0
  325. data/node_modules/string_decoder/README.md +47 -0
  326. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  327. data/node_modules/string_decoder/package.json +31 -0
  328. data/node_modules/typedarray/LICENSE +35 -0
  329. data/node_modules/typedarray/example/tarray.js +4 -0
  330. data/node_modules/typedarray/index.js +630 -0
  331. data/node_modules/typedarray/package.json +55 -0
  332. data/node_modules/typedarray/readme.markdown +61 -0
  333. data/node_modules/typedarray/test/server/undef_globals.js +19 -0
  334. data/node_modules/typedarray/test/tarray.js +10 -0
  335. data/node_modules/ultron/LICENSE +22 -0
  336. data/node_modules/ultron/README.md +113 -0
  337. data/node_modules/ultron/index.js +136 -0
  338. data/node_modules/ultron/package.json +41 -0
  339. data/node_modules/util-deprecate/History.md +16 -0
  340. data/node_modules/util-deprecate/LICENSE +24 -0
  341. data/node_modules/util-deprecate/README.md +53 -0
  342. data/node_modules/util-deprecate/browser.js +67 -0
  343. data/node_modules/util-deprecate/node.js +6 -0
  344. data/node_modules/util-deprecate/package.json +27 -0
  345. data/node_modules/wrappy/LICENSE +15 -0
  346. data/node_modules/wrappy/README.md +36 -0
  347. data/node_modules/wrappy/package.json +29 -0
  348. data/node_modules/wrappy/wrappy.js +33 -0
  349. data/node_modules/ws/LICENSE +21 -0
  350. data/node_modules/ws/README.md +341 -0
  351. data/node_modules/ws/index.js +15 -0
  352. data/node_modules/ws/lib/BufferUtil.js +71 -0
  353. data/node_modules/ws/lib/Constants.js +10 -0
  354. data/node_modules/ws/lib/ErrorCodes.js +28 -0
  355. data/node_modules/ws/lib/EventTarget.js +151 -0
  356. data/node_modules/ws/lib/Extensions.js +203 -0
  357. data/node_modules/ws/lib/PerMessageDeflate.js +507 -0
  358. data/node_modules/ws/lib/Receiver.js +553 -0
  359. data/node_modules/ws/lib/Sender.js +412 -0
  360. data/node_modules/ws/lib/Validation.js +17 -0
  361. data/node_modules/ws/lib/WebSocket.js +717 -0
  362. data/node_modules/ws/lib/WebSocketServer.js +326 -0
  363. data/node_modules/ws/package.json +46 -0
  364. data/node_modules/yauzl/LICENSE +21 -0
  365. data/node_modules/yauzl/README.md +467 -0
  366. data/node_modules/yauzl/index.js +626 -0
  367. data/node_modules/yauzl/package.json +36 -0
  368. data/package.json +5 -0
  369. data/yarn.lock +240 -0
  370. metadata +372 -7
  371. data/app/assets/stylesheets/default.css +0 -4
  372. data/lib/postdoc/postdoc_view_helper.rb +0 -22
@@ -0,0 +1,309 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the 'License');
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an 'AS IS' BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ const {helper} = require('./helper');
18
+ const keyDefinitions = require('./USKeyboardLayout');
19
+
20
+ /**
21
+ * @typedef {Object} KeyDescription
22
+ * @property {number} keyCode
23
+ * @property {string} key
24
+ * @property {string} text
25
+ * @property {string} code
26
+ * @property {number} location
27
+ */
28
+
29
+ class Keyboard {
30
+ /**
31
+ * @param {!Puppeteer.CDPSession} client
32
+ */
33
+ constructor(client) {
34
+ this._client = client;
35
+ this._modifiers = 0;
36
+ this._pressedKeys = new Set();
37
+ }
38
+
39
+ /**
40
+ * @param {string} key
41
+ * @param {{text: string}=} options
42
+ */
43
+ async down(key, options = { text: undefined }) {
44
+ const description = this._keyDescriptionForString(key);
45
+
46
+ const autoRepeat = this._pressedKeys.has(description.code);
47
+ this._pressedKeys.add(description.code);
48
+ this._modifiers |= this._modifierBit(description.key);
49
+
50
+ const text = options.text === undefined ? description.text : options.text;
51
+ await this._client.send('Input.dispatchKeyEvent', {
52
+ type: text ? 'keyDown' : 'rawKeyDown',
53
+ modifiers: this._modifiers,
54
+ windowsVirtualKeyCode: description.keyCode,
55
+ code: description.code,
56
+ key: description.key,
57
+ text: text,
58
+ unmodifiedText: text,
59
+ autoRepeat,
60
+ location: description.location,
61
+ isKeypad: description.location === 3
62
+ });
63
+ }
64
+
65
+ /**
66
+ * @param {string} key
67
+ * @return {number}
68
+ */
69
+ _modifierBit(key) {
70
+ if (key === 'Alt')
71
+ return 1;
72
+ if (key === 'Control')
73
+ return 2;
74
+ if (key === 'Meta')
75
+ return 4;
76
+ if (key === 'Shift')
77
+ return 8;
78
+ return 0;
79
+ }
80
+
81
+ /**
82
+ * @param {string} keyString
83
+ * @return {KeyDescription}
84
+ */
85
+ _keyDescriptionForString(keyString) {
86
+ const shift = this._modifiers & 8;
87
+ const description = {
88
+ key: '',
89
+ keyCode: 0,
90
+ code: '',
91
+ text: '',
92
+ location: 0
93
+ };
94
+
95
+ const definition = keyDefinitions[keyString];
96
+ console.assert(definition, `Unknown key: "${keyString}"`);
97
+
98
+ if (definition.key)
99
+ description.key = definition.key;
100
+ if (shift && definition.shiftKey)
101
+ description.key = definition.shiftKey;
102
+
103
+ if (definition.keyCode)
104
+ description.keyCode = definition.keyCode;
105
+ if (shift && definition.shiftKeyCode)
106
+ description.keyCode = definition.shiftKeyCode;
107
+
108
+ if (definition.code)
109
+ description.code = definition.code;
110
+
111
+ if (definition.location)
112
+ description.location = definition.location;
113
+
114
+ if (description.key.length === 1)
115
+ description.text = description.key;
116
+
117
+ if (definition.text)
118
+ description.text = definition.text;
119
+ if (shift && definition.shiftText)
120
+ description.text = definition.shiftText;
121
+
122
+ // if any modifiers besides shift are pressed, no text should be sent
123
+ if (this._modifiers & ~8)
124
+ description.text = '';
125
+
126
+ return description;
127
+ }
128
+
129
+ /**
130
+ * @param {string} key
131
+ */
132
+ async up(key) {
133
+ const description = this._keyDescriptionForString(key);
134
+
135
+ this._modifiers &= ~this._modifierBit(description.key);
136
+ this._pressedKeys.delete(description.code);
137
+ await this._client.send('Input.dispatchKeyEvent', {
138
+ type: 'keyUp',
139
+ modifiers: this._modifiers,
140
+ key: description.key,
141
+ windowsVirtualKeyCode: description.keyCode,
142
+ code: description.code,
143
+ location: description.location
144
+ });
145
+ }
146
+
147
+ /**
148
+ * @param {string} char
149
+ */
150
+ async sendCharacter(char) {
151
+ await this._client.send('Input.dispatchKeyEvent', {
152
+ type: 'char',
153
+ modifiers: this._modifiers,
154
+ text: char,
155
+ key: char,
156
+ unmodifiedText: char
157
+ });
158
+ }
159
+
160
+ /**
161
+ * @param {string} text
162
+ * @param {{delay: (number|undefined)}=} options
163
+ */
164
+ async type(text, options) {
165
+ let delay = 0;
166
+ if (options && options.delay)
167
+ delay = options.delay;
168
+ for (const char of text) {
169
+ if (keyDefinitions[char])
170
+ await this.press(char, {delay});
171
+ else
172
+ await this.sendCharacter(char);
173
+ if (delay)
174
+ await new Promise(f => setTimeout(f, delay));
175
+ }
176
+ }
177
+
178
+ /**
179
+ * @param {string} key
180
+ * @param {!Object=} options
181
+ */
182
+ async press(key, options) {
183
+ await this.down(key, options);
184
+ if (options && options.delay)
185
+ await new Promise(f => setTimeout(f, options.delay));
186
+ await this.up(key);
187
+ }
188
+ }
189
+
190
+ class Mouse {
191
+ /**
192
+ * @param {Puppeteer.CDPSession} client
193
+ * @param {!Keyboard} keyboard
194
+ */
195
+ constructor(client, keyboard) {
196
+ this._client = client;
197
+ this._keyboard = keyboard;
198
+ this._x = 0;
199
+ this._y = 0;
200
+ this._button = 'none';
201
+ }
202
+
203
+ /**
204
+ * @param {number} x
205
+ * @param {number} y
206
+ * @param {Object=} options
207
+ * @return {!Promise}
208
+ */
209
+ async move(x, y, options = {}) {
210
+ const fromX = this._x, fromY = this._y;
211
+ this._x = x;
212
+ this._y = y;
213
+ const steps = options.steps || 1;
214
+ for (let i = 1; i <= steps; i++) {
215
+ await this._client.send('Input.dispatchMouseEvent', {
216
+ type: 'mouseMoved',
217
+ button: this._button,
218
+ x: fromX + (this._x - fromX) * (i / steps),
219
+ y: fromY + (this._y - fromY) * (i / steps),
220
+ modifiers: this._keyboard._modifiers
221
+ });
222
+ }
223
+ }
224
+
225
+ /**
226
+ * @param {number} x
227
+ * @param {number} y
228
+ * @param {!Object=} options
229
+ */
230
+ async click(x, y, options = {}) {
231
+ this.move(x, y);
232
+ this.down(options);
233
+ if (typeof options.delay === 'number')
234
+ await new Promise(f => setTimeout(f, options.delay));
235
+ await this.up(options);
236
+ }
237
+
238
+ /**
239
+ * @param {!Object=} options
240
+ */
241
+ async down(options = {}) {
242
+ this._button = (options.button || 'left');
243
+ await this._client.send('Input.dispatchMouseEvent', {
244
+ type: 'mousePressed',
245
+ button: this._button,
246
+ x: this._x,
247
+ y: this._y,
248
+ modifiers: this._keyboard._modifiers,
249
+ clickCount: (options.clickCount || 1)
250
+ });
251
+ }
252
+
253
+ /**
254
+ * @param {!Object=} options
255
+ */
256
+ async up(options = {}) {
257
+ this._button = 'none';
258
+ await this._client.send('Input.dispatchMouseEvent', {
259
+ type: 'mouseReleased',
260
+ button: (options.button || 'left'),
261
+ x: this._x,
262
+ y: this._y,
263
+ modifiers: this._keyboard._modifiers,
264
+ clickCount: (options.clickCount || 1)
265
+ });
266
+ }
267
+ }
268
+
269
+ class Touchscreen {
270
+ /**
271
+ * @param {Puppeteer.CDPSession} client
272
+ * @param {Keyboard} keyboard
273
+ */
274
+ constructor(client, keyboard) {
275
+ this._client = client;
276
+ this._keyboard = keyboard;
277
+ }
278
+
279
+ /**
280
+ * @param {number} x
281
+ * @param {number} y
282
+ */
283
+ async tap(x, y) {
284
+ // Touches appear to be lost during the first frame after navigation.
285
+ // This waits a frame before sending the tap.
286
+ // @see https://crbug.com/613219
287
+ await this._client.send('Runtime.evaluate', {
288
+ expression: 'new Promise(x => requestAnimationFrame(() => requestAnimationFrame(x)))',
289
+ awaitPromise: true
290
+ });
291
+
292
+ const touchPoints = [{x: Math.round(x), y: Math.round(y)}];
293
+ await this._client.send('Input.dispatchTouchEvent', {
294
+ type: 'touchStart',
295
+ touchPoints,
296
+ modifiers: this._keyboard._modifiers
297
+ });
298
+ await this._client.send('Input.dispatchTouchEvent', {
299
+ type: 'touchEnd',
300
+ touchPoints: [],
301
+ modifiers: this._keyboard._modifiers
302
+ });
303
+ }
304
+ }
305
+
306
+ module.exports = { Keyboard, Mouse, Touchscreen};
307
+ helper.tracePublicAPI(Keyboard);
308
+ helper.tracePublicAPI(Mouse);
309
+ helper.tracePublicAPI(Touchscreen);
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ const os = require('os');
17
+ const path = require('path');
18
+ const removeFolder = require('rimraf');
19
+ const childProcess = require('child_process');
20
+ const BrowserFetcher = require('./BrowserFetcher');
21
+ const {Connection} = require('./Connection');
22
+ const Browser = require('./Browser');
23
+ const readline = require('readline');
24
+ const fs = require('fs');
25
+ const {helper, debugError} = require('./helper');
26
+ const ChromiumRevision = require(path.join(helper.projectRoot(), 'package.json')).puppeteer.chromium_revision;
27
+
28
+ const mkdtempAsync = helper.promisify(fs.mkdtemp);
29
+ const removeFolderAsync = helper.promisify(removeFolder);
30
+
31
+ const CHROME_PROFILE_PATH = path.join(os.tmpdir(), 'puppeteer_dev_profile-');
32
+
33
+ const DEFAULT_ARGS = [
34
+ '--disable-background-networking',
35
+ '--disable-background-timer-throttling',
36
+ '--disable-client-side-phishing-detection',
37
+ '--disable-default-apps',
38
+ '--disable-dev-shm-usage',
39
+ '--disable-extensions',
40
+ '--disable-hang-monitor',
41
+ '--disable-popup-blocking',
42
+ '--disable-prompt-on-repost',
43
+ '--disable-sync',
44
+ '--disable-translate',
45
+ '--metrics-recording-only',
46
+ '--no-first-run',
47
+ '--safebrowsing-disable-auto-update',
48
+ ];
49
+
50
+ const AUTOMATION_ARGS = [
51
+ '--enable-automation',
52
+ '--password-store=basic',
53
+ '--use-mock-keychain',
54
+ ];
55
+
56
+ class Launcher {
57
+ /**
58
+ * @param {!LaunchOptions=} options
59
+ * @return {!Promise<!Browser>}
60
+ */
61
+ static async launch(options) {
62
+ options = Object.assign({}, options || {});
63
+ console.assert(!options.ignoreDefaultArgs || !options.appMode, '`appMode` flag cannot be used together with `ignoreDefaultArgs`');
64
+ let temporaryUserDataDir = null;
65
+ const chromeArguments = [];
66
+ if (!options.ignoreDefaultArgs)
67
+ chromeArguments.push(...DEFAULT_ARGS);
68
+ if (options.appMode) {
69
+ options.headless = false;
70
+ options.pipe = true;
71
+ } else if (!options.ignoreDefaultArgs) {
72
+ chromeArguments.push(...AUTOMATION_ARGS);
73
+ }
74
+
75
+ if (!options.ignoreDefaultArgs || !chromeArguments.some(argument => argument.startsWith('--remote-debugging-')))
76
+ chromeArguments.push(options.pipe ? '--remote-debugging-pipe' : '--remote-debugging-port=0');
77
+
78
+ if (!options.args || !options.args.some(arg => arg.startsWith('--user-data-dir'))) {
79
+ if (!options.userDataDir)
80
+ temporaryUserDataDir = await mkdtempAsync(CHROME_PROFILE_PATH);
81
+
82
+ chromeArguments.push(`--user-data-dir=${options.userDataDir || temporaryUserDataDir}`);
83
+ }
84
+ if (options.devtools === true) {
85
+ chromeArguments.push('--auto-open-devtools-for-tabs');
86
+ options.headless = false;
87
+ }
88
+ if (typeof options.headless !== 'boolean' || options.headless) {
89
+ chromeArguments.push(
90
+ '--headless',
91
+ '--disable-gpu',
92
+ '--hide-scrollbars',
93
+ '--mute-audio'
94
+ );
95
+ }
96
+ let chromeExecutable = options.executablePath;
97
+ if (typeof chromeExecutable !== 'string') {
98
+ const browserFetcher = new BrowserFetcher();
99
+ const revisionInfo = browserFetcher.revisionInfo(ChromiumRevision);
100
+ console.assert(revisionInfo.local, `Chromium revision is not downloaded. Run "npm install" or "yarn install"`);
101
+ chromeExecutable = revisionInfo.executablePath;
102
+ }
103
+ if (Array.isArray(options.args))
104
+ chromeArguments.push(...options.args);
105
+
106
+
107
+ const usePipe = chromeArguments.includes('--remote-debugging-pipe');
108
+ const stdio = ['pipe', 'pipe', 'pipe'];
109
+ if (usePipe)
110
+ stdio.push('pipe', 'pipe');
111
+ const chromeProcess = childProcess.spawn(
112
+ chromeExecutable,
113
+ chromeArguments,
114
+ {
115
+ // On non-windows platforms, `detached: false` makes child process a leader of a new
116
+ // process group, making it possible to kill child process tree with `.kill(-pid)` command.
117
+ // @see https://nodejs.org/api/child_process.html#child_process_options_detached
118
+ detached: process.platform !== 'win32',
119
+ env: options.env || process.env,
120
+ stdio
121
+ }
122
+ );
123
+
124
+ if (options.dumpio) {
125
+ chromeProcess.stderr.pipe(process.stderr);
126
+ chromeProcess.stdout.pipe(process.stdout);
127
+ }
128
+
129
+ let chromeClosed = false;
130
+ const waitForChromeToClose = new Promise((fulfill, reject) => {
131
+ chromeProcess.once('close', () => {
132
+ chromeClosed = true;
133
+ // Cleanup as processes exit.
134
+ if (temporaryUserDataDir) {
135
+ removeFolderAsync(temporaryUserDataDir)
136
+ .then(() => fulfill())
137
+ .catch(err => console.error(err));
138
+ } else {
139
+ fulfill();
140
+ }
141
+ });
142
+ });
143
+
144
+ const listeners = [ helper.addEventListener(process, 'exit', killChrome) ];
145
+ if (options.handleSIGINT !== false)
146
+ listeners.push(helper.addEventListener(process, 'SIGINT', () => { killChrome(); process.exit(130); }));
147
+ if (options.handleSIGTERM !== false)
148
+ listeners.push(helper.addEventListener(process, 'SIGTERM', gracefullyCloseChrome));
149
+ if (options.handleSIGHUP !== false)
150
+ listeners.push(helper.addEventListener(process, 'SIGHUP', gracefullyCloseChrome));
151
+ /** @type {?Connection} */
152
+ let connection = null;
153
+ try {
154
+ const connectionDelay = options.slowMo || 0;
155
+ if (!usePipe) {
156
+ const timeout = helper.isNumber(options.timeout) ? options.timeout : 30000;
157
+ const browserWSEndpoint = await waitForWSEndpoint(chromeProcess, timeout);
158
+ connection = await Connection.createForWebSocket(browserWSEndpoint, connectionDelay);
159
+ } else {
160
+ connection = Connection.createForPipe(/** @type {!NodeJS.WritableStream} */(chromeProcess.stdio[3]), /** @type {!NodeJS.ReadableStream} */ (chromeProcess.stdio[4]), connectionDelay);
161
+ }
162
+ return Browser.create(connection, options, chromeProcess, gracefullyCloseChrome);
163
+ } catch (e) {
164
+ killChrome();
165
+ throw e;
166
+ }
167
+
168
+ /**
169
+ * @return {Promise}
170
+ */
171
+ function gracefullyCloseChrome() {
172
+ helper.removeEventListeners(listeners);
173
+ if (temporaryUserDataDir) {
174
+ killChrome();
175
+ } else if (connection) {
176
+ // Attempt to close chrome gracefully
177
+ connection.send('Browser.close').catch(error => {
178
+ debugError(error);
179
+ killChrome();
180
+ });
181
+ }
182
+ return waitForChromeToClose;
183
+ }
184
+
185
+ // This method has to be sync to be used as 'exit' event handler.
186
+ function killChrome() {
187
+ helper.removeEventListeners(listeners);
188
+ if (chromeProcess.pid && !chromeProcess.killed && !chromeClosed) {
189
+ // Force kill chrome.
190
+ try {
191
+ if (process.platform === 'win32')
192
+ childProcess.execSync(`taskkill /pid ${chromeProcess.pid} /T /F`);
193
+ else
194
+ process.kill(-chromeProcess.pid, 'SIGKILL');
195
+ } catch (e) {
196
+ // the process might have already stopped
197
+ }
198
+ }
199
+ // Attempt to remove temporary profile directory to avoid littering.
200
+ try {
201
+ removeFolder.sync(temporaryUserDataDir);
202
+ } catch (e) { }
203
+ }
204
+ }
205
+
206
+ /**
207
+ * @return {!Array<string>}
208
+ */
209
+ static defaultArgs() {
210
+ return DEFAULT_ARGS.concat(AUTOMATION_ARGS);
211
+ }
212
+
213
+ /**
214
+ * @return {string}
215
+ */
216
+ static executablePath() {
217
+ const browserFetcher = new BrowserFetcher();
218
+ const revisionInfo = browserFetcher.revisionInfo(ChromiumRevision);
219
+ return revisionInfo.executablePath;
220
+ }
221
+
222
+ /**
223
+ * @param {!Object=} options
224
+ * @return {!Promise<!Browser>}
225
+ */
226
+ static async connect(options = {}) {
227
+ const connectionDelay = options.slowMo || 0;
228
+ const connection = await Connection.createForWebSocket(options.browserWSEndpoint, connectionDelay);
229
+ return Browser.create(connection, options, null, () => connection.send('Browser.close').catch(debugError));
230
+ }
231
+ }
232
+
233
+ /**
234
+ * @param {!Puppeteer.ChildProcess} chromeProcess
235
+ * @param {number} timeout
236
+ * @return {!Promise<string>}
237
+ */
238
+ function waitForWSEndpoint(chromeProcess, timeout) {
239
+ return new Promise((resolve, reject) => {
240
+ const rl = readline.createInterface({ input: chromeProcess.stderr });
241
+ let stderr = '';
242
+ const listeners = [
243
+ helper.addEventListener(rl, 'line', onLine),
244
+ helper.addEventListener(rl, 'close', () => onClose()),
245
+ helper.addEventListener(chromeProcess, 'exit', () => onClose()),
246
+ helper.addEventListener(chromeProcess, 'error', error => onClose(error))
247
+ ];
248
+ const timeoutId = timeout ? setTimeout(onTimeout, timeout) : 0;
249
+
250
+ /**
251
+ * @param {!Error=} error
252
+ */
253
+ function onClose(error) {
254
+ cleanup();
255
+ reject(new Error([
256
+ 'Failed to launch chrome!' + (error ? ' ' + error.message : ''),
257
+ stderr,
258
+ '',
259
+ 'TROUBLESHOOTING: https://github.com/GoogleChrome/puppeteer/blob/master/docs/troubleshooting.md',
260
+ '',
261
+ ].join('\n')));
262
+ }
263
+
264
+ function onTimeout() {
265
+ cleanup();
266
+ reject(new Error(`Timed out after ${timeout} ms while trying to connect to Chrome! The only Chrome revision guaranteed to work is r${ChromiumRevision}`));
267
+ }
268
+
269
+ /**
270
+ * @param {string} line
271
+ */
272
+ function onLine(line) {
273
+ stderr += line + '\n';
274
+ const match = line.match(/^DevTools listening on (ws:\/\/.*)$/);
275
+ if (!match)
276
+ return;
277
+ cleanup();
278
+ resolve(match[1]);
279
+ }
280
+
281
+ function cleanup() {
282
+ if (timeoutId)
283
+ clearTimeout(timeoutId);
284
+ helper.removeEventListeners(listeners);
285
+ }
286
+ });
287
+ }
288
+
289
+ /**
290
+ * @typedef {Object} LaunchOptions
291
+ * @property {boolean=} ignoreHTTPSErrors
292
+ * @property {boolean=} headless
293
+ * @property {string=} executablePath
294
+ * @property {number=} slowMo
295
+ * @property {!Array<string>=} args
296
+ * @property {boolean=} ignoreDefaultArgs
297
+ * @property {boolean=} handleSIGINT
298
+ * @property {boolean=} handleSIGTERM
299
+ * @property {boolean=} handleSIGHUP
300
+ * @property {number=} timeout
301
+ * @property {boolean=} dumpio
302
+ * @property {string=} userDataDir
303
+ * @property {!Object<string, string | undefined>=} env
304
+ * @property {boolean=} devtools
305
+ * @property {boolean=} pipe
306
+ * @property {boolean=} appMode
307
+ */
308
+
309
+
310
+ module.exports = Launcher;
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Copyright 2017 Google Inc. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ class Multimap {
18
+ constructor() {
19
+ this._map = new Map();
20
+ }
21
+
22
+ set(key, value) {
23
+ let set = this._map.get(key);
24
+ if (!set) {
25
+ set = new Set();
26
+ this._map.set(key, set);
27
+ }
28
+ set.add(value);
29
+ }
30
+
31
+ get(key) {
32
+ let result = this._map.get(key);
33
+ if (!result)
34
+ result = new Set();
35
+ return result;
36
+ }
37
+
38
+ has(key) {
39
+ return this._map.has(key);
40
+ }
41
+
42
+ hasValue(key, value) {
43
+ const set = this._map.get(key);
44
+ if (!set)
45
+ return false;
46
+ return set.has(value);
47
+ }
48
+
49
+ /**
50
+ * @return {number}
51
+ */
52
+ get size() {
53
+ return this._map.size;
54
+ }
55
+
56
+ delete(key, value) {
57
+ const values = this.get(key);
58
+ const result = values.delete(value);
59
+ if (!values.size)
60
+ this._map.delete(key);
61
+ return result;
62
+ }
63
+
64
+ deleteAll(key) {
65
+ this._map.delete(key);
66
+ }
67
+
68
+ firstValue(key) {
69
+ const set = this._map.get(key);
70
+ if (!set)
71
+ return null;
72
+ return set.values().next().value;
73
+ }
74
+
75
+ firstKey() {
76
+ return this._map.keys().next().value;
77
+ }
78
+
79
+ valuesArray() {
80
+ const result = [];
81
+ for (const key of this._map.keys())
82
+ result.push(...Array.from(this._map.get(key).values()));
83
+ return result;
84
+ }
85
+
86
+ keysArray() {
87
+ return Array.from(this._map.keys());
88
+ }
89
+
90
+ clear() {
91
+ this._map.clear();
92
+ }
93
+ }
94
+
95
+ module.exports = Multimap;