├── .eslintrc.json ├── .gitignore ├── LICENSE ├── README.md ├── package-lock.json ├── package.json ├── src └── index.js └── test ├── config.example.js └── test.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true, 4 | "node": true 5 | }, 6 | "extends": "eslint:recommended", 7 | "parserOptions": { 8 | "ecmaVersion": 2018, 9 | "sourceType": "module" 10 | }, 11 | "rules": { 12 | "accessor-pairs": "error", 13 | "array-bracket-newline": "error", 14 | "array-bracket-spacing": [ 15 | "error", 16 | "never" 17 | ], 18 | "array-callback-return": "error", 19 | "array-element-newline": "off", 20 | "arrow-body-style": "off", 21 | "arrow-parens": "off", 22 | "arrow-spacing": [ 23 | "error", 24 | { 25 | "after": true, 26 | "before": true 27 | } 28 | ], 29 | "block-scoped-var": "error", 30 | "block-spacing": "error", 31 | "brace-style": [ 32 | "error", 33 | "1tbs" 34 | ], 35 | "callback-return": "error", 36 | "camelcase": "error", 37 | "capitalized-comments": "off", 38 | "class-methods-use-this": "error", 39 | "comma-dangle": "off", 40 | "comma-spacing": [ 41 | "error", 42 | { 43 | "after": true, 44 | "before": false 45 | } 46 | ], 47 | "comma-style": [ 48 | "error", 49 | "last" 50 | ], 51 | "complexity": "error", 52 | "computed-property-spacing": [ 53 | "error", 54 | "never" 55 | ], 56 | "consistent-return": "off", 57 | "consistent-this": "error", 58 | "curly": "off", 59 | "default-case": "error", 60 | "dot-location": "error", 61 | "dot-notation": [ 62 | "error", 63 | { 64 | "allowKeywords": true 65 | } 66 | ], 67 | "eol-last": "error", 68 | "eqeqeq": "error", 69 | "func-call-spacing": "error", 70 | "func-name-matching": "error", 71 | "func-names": "error", 72 | "func-style": [ 73 | "error", 74 | "declaration", 75 | { 76 | "allowArrowFunctions": true 77 | } 78 | ], 79 | "function-paren-newline": "off", 80 | "generator-star-spacing": "error", 81 | "global-require": "error", 82 | "guard-for-in": "error", 83 | "handle-callback-err": "error", 84 | "id-blacklist": "error", 85 | "id-length": "off", 86 | "id-match": "error", 87 | "implicit-arrow-linebreak": [ 88 | "error", 89 | "beside" 90 | ], 91 | "indent": "off", 92 | "indent-legacy": "off", 93 | "init-declarations": "error", 94 | "jsx-quotes": "error", 95 | "key-spacing": "error", 96 | "keyword-spacing": "off", 97 | "line-comment-position": "error", 98 | "linebreak-style": [ 99 | "error", 100 | "unix" 101 | ], 102 | "lines-around-comment": "error", 103 | "lines-around-directive": "error", 104 | "lines-between-class-members": "error", 105 | "max-classes-per-file": "error", 106 | "max-depth": "error", 107 | "max-len": "off", 108 | "max-lines": "error", 109 | "max-lines-per-function": "off", 110 | "max-nested-callbacks": "error", 111 | "max-params": "error", 112 | "max-statements": "off", 113 | "max-statements-per-line": "error", 114 | "multiline-comment-style": [ 115 | "error", 116 | "separate-lines" 117 | ], 118 | "multiline-ternary": "error", 119 | "new-cap": "error", 120 | "new-parens": "error", 121 | "newline-after-var": "off", 122 | "newline-before-return": "off", 123 | "newline-per-chained-call": "off", 124 | "no-alert": "error", 125 | "no-array-constructor": "error", 126 | "no-async-promise-executor": "error", 127 | "no-await-in-loop": "error", 128 | "no-bitwise": "error", 129 | "no-buffer-constructor": "error", 130 | "no-caller": "error", 131 | "no-catch-shadow": "error", 132 | "no-confusing-arrow": "error", 133 | "no-continue": "error", 134 | "no-div-regex": "error", 135 | "no-duplicate-imports": "error", 136 | "no-else-return": "error", 137 | "no-empty-function": "error", 138 | "no-eq-null": "error", 139 | "no-eval": "error", 140 | "no-extend-native": "error", 141 | "no-extra-bind": "error", 142 | "no-extra-label": "error", 143 | "no-extra-parens": "error", 144 | "no-floating-decimal": "error", 145 | "no-implicit-coercion": "error", 146 | "no-implicit-globals": "error", 147 | "no-implied-eval": "error", 148 | "no-inline-comments": "error", 149 | "no-invalid-this": "error", 150 | "no-iterator": "error", 151 | "no-label-var": "error", 152 | "no-labels": "error", 153 | "no-lone-blocks": "error", 154 | "no-lonely-if": "error", 155 | "no-loop-func": "error", 156 | "no-magic-numbers": "off", 157 | "no-misleading-character-class": "error", 158 | "no-mixed-operators": "error", 159 | "no-mixed-requires": "error", 160 | "no-multi-assign": "error", 161 | "no-multi-spaces": "error", 162 | "no-multi-str": "error", 163 | "no-multiple-empty-lines": "error", 164 | "no-native-reassign": "error", 165 | "no-negated-condition": "off", 166 | "no-negated-in-lhs": "error", 167 | "no-nested-ternary": "error", 168 | "no-new": "error", 169 | "no-new-func": "error", 170 | "no-new-object": "error", 171 | "no-new-require": "error", 172 | "no-new-wrappers": "error", 173 | "no-octal-escape": "error", 174 | "no-param-reassign": "error", 175 | "no-path-concat": "error", 176 | "no-plusplus": "off", 177 | "no-process-env": "off", 178 | "no-process-exit": "error", 179 | "no-proto": "error", 180 | "no-prototype-builtins": "error", 181 | "no-restricted-globals": "error", 182 | "no-restricted-imports": "error", 183 | "no-restricted-modules": "error", 184 | "no-restricted-properties": "error", 185 | "no-restricted-syntax": "error", 186 | "no-return-assign": "error", 187 | "no-return-await": "error", 188 | "no-script-url": "error", 189 | "no-self-compare": "error", 190 | "no-sequences": "error", 191 | "no-shadow": "off", 192 | "no-shadow-restricted-names": "error", 193 | "no-spaced-func": "error", 194 | "no-sync": "off", 195 | "no-tabs": "error", 196 | "no-template-curly-in-string": "error", 197 | "no-ternary": "error", 198 | "no-throw-literal": "error", 199 | "no-trailing-spaces": "error", 200 | "no-undef-init": "error", 201 | "no-undefined": "error", 202 | "no-underscore-dangle": "off", 203 | "no-unmodified-loop-condition": "error", 204 | "no-unneeded-ternary": "error", 205 | "no-unused-expressions": "error", 206 | "no-use-before-define": "off", 207 | "no-useless-call": "error", 208 | "no-useless-catch": "error", 209 | "no-useless-computed-key": "error", 210 | "no-useless-concat": "error", 211 | "no-useless-constructor": "error", 212 | "no-useless-rename": "error", 213 | "no-useless-return": "error", 214 | "no-var": "off", 215 | "no-void": "error", 216 | "no-warning-comments": "error", 217 | "no-whitespace-before-property": "error", 218 | "no-with": "error", 219 | "nonblock-statement-body-position": "error", 220 | "object-curly-newline": "error", 221 | "object-curly-spacing": "off", 222 | "object-shorthand": "off", 223 | "one-var": "off", 224 | "one-var-declaration-per-line": "error", 225 | "operator-assignment": [ 226 | "error", 227 | "always" 228 | ], 229 | "operator-linebreak": "error", 230 | "padded-blocks": "off", 231 | "padding-line-between-statements": "error", 232 | "prefer-arrow-callback": "error", 233 | "prefer-const": "off", 234 | "prefer-destructuring": "off", 235 | "prefer-numeric-literals": "error", 236 | "prefer-object-spread": "error", 237 | "prefer-promise-reject-errors": "off", 238 | "prefer-reflect": "error", 239 | "prefer-rest-params": "error", 240 | "prefer-spread": "error", 241 | "prefer-template": "off", 242 | "quote-props": "off", 243 | "quotes": "off", 244 | "radix": "error", 245 | "require-atomic-updates": "error", 246 | "require-await": "off", 247 | "require-jsdoc": "off", 248 | "require-unicode-regexp": "error", 249 | "rest-spread-spacing": [ 250 | "error", 251 | "never" 252 | ], 253 | "semi": "off", 254 | "semi-spacing": "error", 255 | "semi-style": [ 256 | "error", 257 | "last" 258 | ], 259 | "sort-imports": "error", 260 | "sort-keys": "off", 261 | "sort-vars": "error", 262 | "space-before-blocks": "off", 263 | "space-before-function-paren": "off", 264 | "space-in-parens": [ 265 | "error", 266 | "never" 267 | ], 268 | "space-infix-ops": "error", 269 | "space-unary-ops": "error", 270 | "spaced-comment": "off", 271 | "strict": "error", 272 | "switch-colon-spacing": "error", 273 | "symbol-description": "error", 274 | "template-curly-spacing": [ 275 | "error", 276 | "never" 277 | ], 278 | "template-tag-spacing": "error", 279 | "unicode-bom": [ 280 | "error", 281 | "never" 282 | ], 283 | "valid-jsdoc": "error", 284 | "vars-on-top": "off", 285 | "wrap-iife": "error", 286 | "wrap-regex": "error", 287 | "yield-star-spacing": "error", 288 | "yoda": [ 289 | "error", 290 | "never" 291 | ] 292 | } 293 | } 294 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test/config.js 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 f9mac 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # puppeteer-extra-plugin-proxy 2 | 3 | > A plugin for [puppeteer-extra](https://github.com/berstend/puppeteer-extra) to add proxy support 4 | 5 | ## Install 6 | 7 | ```bash 8 | yarn add puppeteer-extra-plugin-proxy 9 | # - or - 10 | npm install puppeteer-extra-plugin-proxy 11 | ``` 12 | 13 | If this is your first [puppeteer-extra](https://github.com/berstend/puppeteer-extra) plugin here's everything you need: 14 | 15 | ```bash 16 | yarn add puppeteer puppeteer-extra puppeteer-extra-plugin-proxy 17 | # - or - 18 | npm install puppeteer puppeteer-extra puppeteer-extra-plugin-proxy 19 | ``` 20 | 21 | ## Usage 22 | 23 | ```js 24 | // puppeteer-extra is a drop-in replacement for puppeteer, 25 | // it augments the installed puppeteer with plugin functionality 26 | const puppeteer = require('puppeteer-extra'); 27 | // require proxy plugin 28 | const pluginProxy = require('puppeteer-extra-plugin-proxy'); 29 | // add proxy plugin without proxy crendentials 30 | puppeteer.use(pluginProxy({ 31 | address: '123.123.123.123', 32 | port: 1001 33 | })); 34 | // or you can specify a proxy with crendentials like so 35 | // puppeteer.use(pluginProxy({ 36 | // address: '123.123.123.123', 37 | // port: 1001, 38 | // credentials: { 39 | // username: 'user1', 40 | // password: '123456', 41 | // } 42 | // })); 43 | 44 | // puppeteer usage as normal 45 | puppeteer.launch({ headless: true }).then(async browser => { 46 | const page = await browser.newPage() 47 | await page.setViewport({ width: 800, height: 600 }) 48 | // will go through the specified proxy 49 | await page.goto("https://example.com") 50 | await page.waitFor(5000) 51 | await page.screenshot({ path: "testresult.png", fullPage: true }) 52 | await browser.close() 53 | }) 54 | ``` 55 | 56 | For more info [see the tests](./test/test.js). 57 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppeteer-extra-plugin-proxy", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-colors": { 8 | "version": "3.2.3", 9 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 10 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "3.0.0", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 16 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "3.2.1", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 22 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^1.9.0" 26 | } 27 | }, 28 | "argparse": { 29 | "version": "1.0.10", 30 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 31 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 32 | "dev": true, 33 | "requires": { 34 | "sprintf-js": "~1.0.2" 35 | } 36 | }, 37 | "arr-union": { 38 | "version": "3.1.0", 39 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 40 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 41 | }, 42 | "assert": { 43 | "version": "2.0.0", 44 | "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", 45 | "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", 46 | "dev": true, 47 | "requires": { 48 | "es6-object-assign": "^1.1.0", 49 | "is-nan": "^1.2.1", 50 | "object-is": "^1.0.1", 51 | "util": "^0.12.0" 52 | } 53 | }, 54 | "balanced-match": { 55 | "version": "1.0.0", 56 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 57 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 58 | "dev": true 59 | }, 60 | "brace-expansion": { 61 | "version": "1.1.11", 62 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 63 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 64 | "dev": true, 65 | "requires": { 66 | "balanced-match": "^1.0.0", 67 | "concat-map": "0.0.1" 68 | } 69 | }, 70 | "browser-stdout": { 71 | "version": "1.3.1", 72 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 73 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 74 | "dev": true 75 | }, 76 | "camelcase": { 77 | "version": "5.3.1", 78 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 79 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 80 | "dev": true 81 | }, 82 | "chalk": { 83 | "version": "2.4.2", 84 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 85 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 86 | "dev": true, 87 | "requires": { 88 | "ansi-styles": "^3.2.1", 89 | "escape-string-regexp": "^1.0.5", 90 | "supports-color": "^5.3.0" 91 | }, 92 | "dependencies": { 93 | "supports-color": { 94 | "version": "5.5.0", 95 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 96 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 97 | "dev": true, 98 | "requires": { 99 | "has-flag": "^3.0.0" 100 | } 101 | } 102 | } 103 | }, 104 | "cliui": { 105 | "version": "4.1.0", 106 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 107 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 108 | "dev": true, 109 | "requires": { 110 | "string-width": "^2.1.1", 111 | "strip-ansi": "^4.0.0", 112 | "wrap-ansi": "^2.0.0" 113 | } 114 | }, 115 | "clone-deep": { 116 | "version": "0.2.4", 117 | "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz", 118 | "integrity": "sha1-TnPdCen7lxzDhnDF3O2cGJZIHMY=", 119 | "requires": { 120 | "for-own": "^0.1.3", 121 | "is-plain-object": "^2.0.1", 122 | "kind-of": "^3.0.2", 123 | "lazy-cache": "^1.0.3", 124 | "shallow-clone": "^0.1.2" 125 | } 126 | }, 127 | "code-point-at": { 128 | "version": "1.1.0", 129 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 130 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", 131 | "dev": true 132 | }, 133 | "color-convert": { 134 | "version": "1.9.3", 135 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 136 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 137 | "dev": true, 138 | "requires": { 139 | "color-name": "1.1.3" 140 | } 141 | }, 142 | "color-name": { 143 | "version": "1.1.3", 144 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 145 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 146 | "dev": true 147 | }, 148 | "concat-map": { 149 | "version": "0.0.1", 150 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 151 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 152 | "dev": true 153 | }, 154 | "cross-spawn": { 155 | "version": "6.0.5", 156 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 157 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 158 | "dev": true, 159 | "requires": { 160 | "nice-try": "^1.0.4", 161 | "path-key": "^2.0.1", 162 | "semver": "^5.5.0", 163 | "shebang-command": "^1.2.0", 164 | "which": "^1.2.9" 165 | } 166 | }, 167 | "debug": { 168 | "version": "3.2.6", 169 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 170 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 171 | "requires": { 172 | "ms": "^2.1.1" 173 | } 174 | }, 175 | "decamelize": { 176 | "version": "1.2.0", 177 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 178 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 179 | "dev": true 180 | }, 181 | "deepmerge": { 182 | "version": "2.2.1", 183 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", 184 | "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", 185 | "dev": true 186 | }, 187 | "define-properties": { 188 | "version": "1.1.3", 189 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 190 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 191 | "dev": true, 192 | "requires": { 193 | "object-keys": "^1.0.12" 194 | } 195 | }, 196 | "diff": { 197 | "version": "3.5.0", 198 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 199 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 200 | "dev": true 201 | }, 202 | "emoji-regex": { 203 | "version": "7.0.3", 204 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 205 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 206 | "dev": true 207 | }, 208 | "end-of-stream": { 209 | "version": "1.4.1", 210 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 211 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 212 | "dev": true, 213 | "requires": { 214 | "once": "^1.4.0" 215 | } 216 | }, 217 | "es-abstract": { 218 | "version": "1.13.0", 219 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 220 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 221 | "dev": true, 222 | "requires": { 223 | "es-to-primitive": "^1.2.0", 224 | "function-bind": "^1.1.1", 225 | "has": "^1.0.3", 226 | "is-callable": "^1.1.4", 227 | "is-regex": "^1.0.4", 228 | "object-keys": "^1.0.12" 229 | } 230 | }, 231 | "es-to-primitive": { 232 | "version": "1.2.0", 233 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 234 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 235 | "dev": true, 236 | "requires": { 237 | "is-callable": "^1.1.4", 238 | "is-date-object": "^1.0.1", 239 | "is-symbol": "^1.0.2" 240 | } 241 | }, 242 | "es6-object-assign": { 243 | "version": "1.1.0", 244 | "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", 245 | "integrity": "sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw=", 246 | "dev": true 247 | }, 248 | "escape-string-regexp": { 249 | "version": "1.0.5", 250 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 251 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 252 | "dev": true 253 | }, 254 | "esprima": { 255 | "version": "4.0.1", 256 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 257 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 258 | "dev": true 259 | }, 260 | "execa": { 261 | "version": "1.0.0", 262 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 263 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 264 | "dev": true, 265 | "requires": { 266 | "cross-spawn": "^6.0.0", 267 | "get-stream": "^4.0.0", 268 | "is-stream": "^1.1.0", 269 | "npm-run-path": "^2.0.0", 270 | "p-finally": "^1.0.0", 271 | "signal-exit": "^3.0.0", 272 | "strip-eof": "^1.0.0" 273 | } 274 | }, 275 | "find-up": { 276 | "version": "3.0.0", 277 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 278 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 279 | "dev": true, 280 | "requires": { 281 | "locate-path": "^3.0.0" 282 | } 283 | }, 284 | "flat": { 285 | "version": "4.1.0", 286 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 287 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 288 | "dev": true, 289 | "requires": { 290 | "is-buffer": "~2.0.3" 291 | }, 292 | "dependencies": { 293 | "is-buffer": { 294 | "version": "2.0.3", 295 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 296 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", 297 | "dev": true 298 | } 299 | } 300 | }, 301 | "for-in": { 302 | "version": "1.0.2", 303 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 304 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 305 | }, 306 | "for-own": { 307 | "version": "0.1.5", 308 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", 309 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", 310 | "requires": { 311 | "for-in": "^1.0.1" 312 | } 313 | }, 314 | "fs.realpath": { 315 | "version": "1.0.0", 316 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 317 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 318 | "dev": true 319 | }, 320 | "function-bind": { 321 | "version": "1.1.1", 322 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 323 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 324 | "dev": true 325 | }, 326 | "get-caller-file": { 327 | "version": "2.0.5", 328 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 329 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 330 | "dev": true 331 | }, 332 | "get-stream": { 333 | "version": "4.1.0", 334 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 335 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 336 | "dev": true, 337 | "requires": { 338 | "pump": "^3.0.0" 339 | } 340 | }, 341 | "glob": { 342 | "version": "7.1.3", 343 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 344 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 345 | "dev": true, 346 | "requires": { 347 | "fs.realpath": "^1.0.0", 348 | "inflight": "^1.0.4", 349 | "inherits": "2", 350 | "minimatch": "^3.0.4", 351 | "once": "^1.3.0", 352 | "path-is-absolute": "^1.0.0" 353 | } 354 | }, 355 | "growl": { 356 | "version": "1.10.5", 357 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 358 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 359 | "dev": true 360 | }, 361 | "has": { 362 | "version": "1.0.3", 363 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 364 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 365 | "dev": true, 366 | "requires": { 367 | "function-bind": "^1.1.1" 368 | } 369 | }, 370 | "has-flag": { 371 | "version": "3.0.0", 372 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 373 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 374 | "dev": true 375 | }, 376 | "has-symbols": { 377 | "version": "1.0.0", 378 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 379 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 380 | "dev": true 381 | }, 382 | "he": { 383 | "version": "1.2.0", 384 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 385 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 386 | "dev": true 387 | }, 388 | "inflight": { 389 | "version": "1.0.6", 390 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 391 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 392 | "dev": true, 393 | "requires": { 394 | "once": "^1.3.0", 395 | "wrappy": "1" 396 | } 397 | }, 398 | "inherits": { 399 | "version": "2.0.4", 400 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 401 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 402 | "dev": true 403 | }, 404 | "invert-kv": { 405 | "version": "2.0.0", 406 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", 407 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", 408 | "dev": true 409 | }, 410 | "is-arguments": { 411 | "version": "1.0.4", 412 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 413 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 414 | "dev": true 415 | }, 416 | "is-buffer": { 417 | "version": "1.1.6", 418 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 419 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 420 | }, 421 | "is-callable": { 422 | "version": "1.1.4", 423 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 424 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 425 | "dev": true 426 | }, 427 | "is-date-object": { 428 | "version": "1.0.1", 429 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 430 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 431 | "dev": true 432 | }, 433 | "is-extendable": { 434 | "version": "0.1.1", 435 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 436 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 437 | }, 438 | "is-fullwidth-code-point": { 439 | "version": "2.0.0", 440 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 441 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 442 | "dev": true 443 | }, 444 | "is-generator-function": { 445 | "version": "1.0.7", 446 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", 447 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", 448 | "dev": true 449 | }, 450 | "is-nan": { 451 | "version": "1.2.1", 452 | "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.2.1.tgz", 453 | "integrity": "sha1-n69ltvttskt/XAYoR16nH5iEAeI=", 454 | "dev": true, 455 | "requires": { 456 | "define-properties": "^1.1.1" 457 | } 458 | }, 459 | "is-plain-object": { 460 | "version": "2.0.4", 461 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 462 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 463 | "requires": { 464 | "isobject": "^3.0.1" 465 | } 466 | }, 467 | "is-regex": { 468 | "version": "1.0.4", 469 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 470 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 471 | "dev": true, 472 | "requires": { 473 | "has": "^1.0.1" 474 | } 475 | }, 476 | "is-stream": { 477 | "version": "1.1.0", 478 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 479 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", 480 | "dev": true 481 | }, 482 | "is-symbol": { 483 | "version": "1.0.2", 484 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 485 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 486 | "dev": true, 487 | "requires": { 488 | "has-symbols": "^1.0.0" 489 | } 490 | }, 491 | "isexe": { 492 | "version": "2.0.0", 493 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 494 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 495 | "dev": true 496 | }, 497 | "isobject": { 498 | "version": "3.0.1", 499 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 500 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 501 | }, 502 | "js-yaml": { 503 | "version": "3.13.1", 504 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 505 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 506 | "dev": true, 507 | "requires": { 508 | "argparse": "^1.0.7", 509 | "esprima": "^4.0.0" 510 | } 511 | }, 512 | "kind-of": { 513 | "version": "3.2.2", 514 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 515 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 516 | "requires": { 517 | "is-buffer": "^1.1.5" 518 | } 519 | }, 520 | "lazy-cache": { 521 | "version": "1.0.4", 522 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 523 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" 524 | }, 525 | "lcid": { 526 | "version": "2.0.0", 527 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", 528 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", 529 | "dev": true, 530 | "requires": { 531 | "invert-kv": "^2.0.0" 532 | } 533 | }, 534 | "locate-path": { 535 | "version": "3.0.0", 536 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 537 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 538 | "dev": true, 539 | "requires": { 540 | "p-locate": "^3.0.0", 541 | "path-exists": "^3.0.0" 542 | } 543 | }, 544 | "lodash": { 545 | "version": "4.17.15", 546 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 547 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 548 | "dev": true 549 | }, 550 | "log-symbols": { 551 | "version": "2.2.0", 552 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 553 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 554 | "dev": true, 555 | "requires": { 556 | "chalk": "^2.0.1" 557 | } 558 | }, 559 | "map-age-cleaner": { 560 | "version": "0.1.3", 561 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", 562 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", 563 | "dev": true, 564 | "requires": { 565 | "p-defer": "^1.0.0" 566 | } 567 | }, 568 | "mem": { 569 | "version": "4.3.0", 570 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", 571 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", 572 | "dev": true, 573 | "requires": { 574 | "map-age-cleaner": "^0.1.1", 575 | "mimic-fn": "^2.0.0", 576 | "p-is-promise": "^2.0.0" 577 | } 578 | }, 579 | "merge-deep": { 580 | "version": "3.0.2", 581 | "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.2.tgz", 582 | "integrity": "sha512-T7qC8kg4Zoti1cFd8Cr0M+qaZfOwjlPDEdZIIPPB2JZctjaPM4fX+i7HOId69tAti2fvO6X5ldfYUONDODsrkA==", 583 | "requires": { 584 | "arr-union": "^3.1.0", 585 | "clone-deep": "^0.2.4", 586 | "kind-of": "^3.0.2" 587 | } 588 | }, 589 | "mimic-fn": { 590 | "version": "2.1.0", 591 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 592 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", 593 | "dev": true 594 | }, 595 | "minimatch": { 596 | "version": "3.0.4", 597 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 598 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 599 | "dev": true, 600 | "requires": { 601 | "brace-expansion": "^1.1.7" 602 | } 603 | }, 604 | "minimist": { 605 | "version": "0.0.8", 606 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 607 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 608 | "dev": true 609 | }, 610 | "mixin-object": { 611 | "version": "2.0.1", 612 | "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", 613 | "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", 614 | "requires": { 615 | "for-in": "^0.1.3", 616 | "is-extendable": "^0.1.1" 617 | }, 618 | "dependencies": { 619 | "for-in": { 620 | "version": "0.1.8", 621 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", 622 | "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=" 623 | } 624 | } 625 | }, 626 | "mkdirp": { 627 | "version": "0.5.1", 628 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 629 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 630 | "dev": true, 631 | "requires": { 632 | "minimist": "0.0.8" 633 | } 634 | }, 635 | "mocha": { 636 | "version": "6.2.0", 637 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", 638 | "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", 639 | "dev": true, 640 | "requires": { 641 | "ansi-colors": "3.2.3", 642 | "browser-stdout": "1.3.1", 643 | "debug": "3.2.6", 644 | "diff": "3.5.0", 645 | "escape-string-regexp": "1.0.5", 646 | "find-up": "3.0.0", 647 | "glob": "7.1.3", 648 | "growl": "1.10.5", 649 | "he": "1.2.0", 650 | "js-yaml": "3.13.1", 651 | "log-symbols": "2.2.0", 652 | "minimatch": "3.0.4", 653 | "mkdirp": "0.5.1", 654 | "ms": "2.1.1", 655 | "node-environment-flags": "1.0.5", 656 | "object.assign": "4.1.0", 657 | "strip-json-comments": "2.0.1", 658 | "supports-color": "6.0.0", 659 | "which": "1.3.1", 660 | "wide-align": "1.1.3", 661 | "yargs": "13.2.2", 662 | "yargs-parser": "13.0.0", 663 | "yargs-unparser": "1.5.0" 664 | }, 665 | "dependencies": { 666 | "ms": { 667 | "version": "2.1.1", 668 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 669 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 670 | "dev": true 671 | } 672 | } 673 | }, 674 | "ms": { 675 | "version": "2.1.2", 676 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 677 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 678 | }, 679 | "nice-try": { 680 | "version": "1.0.5", 681 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 682 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 683 | "dev": true 684 | }, 685 | "node-environment-flags": { 686 | "version": "1.0.5", 687 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 688 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", 689 | "dev": true, 690 | "requires": { 691 | "object.getownpropertydescriptors": "^2.0.3", 692 | "semver": "^5.7.0" 693 | } 694 | }, 695 | "npm-run-path": { 696 | "version": "2.0.2", 697 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 698 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 699 | "dev": true, 700 | "requires": { 701 | "path-key": "^2.0.0" 702 | } 703 | }, 704 | "number-is-nan": { 705 | "version": "1.0.1", 706 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 707 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 708 | "dev": true 709 | }, 710 | "object-is": { 711 | "version": "1.0.1", 712 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", 713 | "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", 714 | "dev": true 715 | }, 716 | "object-keys": { 717 | "version": "1.1.1", 718 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 719 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 720 | "dev": true 721 | }, 722 | "object.assign": { 723 | "version": "4.1.0", 724 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 725 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 726 | "dev": true, 727 | "requires": { 728 | "define-properties": "^1.1.2", 729 | "function-bind": "^1.1.1", 730 | "has-symbols": "^1.0.0", 731 | "object-keys": "^1.0.11" 732 | } 733 | }, 734 | "object.entries": { 735 | "version": "1.1.0", 736 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", 737 | "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", 738 | "dev": true, 739 | "requires": { 740 | "define-properties": "^1.1.3", 741 | "es-abstract": "^1.12.0", 742 | "function-bind": "^1.1.1", 743 | "has": "^1.0.3" 744 | } 745 | }, 746 | "object.getownpropertydescriptors": { 747 | "version": "2.0.3", 748 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 749 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 750 | "dev": true, 751 | "requires": { 752 | "define-properties": "^1.1.2", 753 | "es-abstract": "^1.5.1" 754 | } 755 | }, 756 | "once": { 757 | "version": "1.4.0", 758 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 759 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 760 | "dev": true, 761 | "requires": { 762 | "wrappy": "1" 763 | } 764 | }, 765 | "os-locale": { 766 | "version": "3.1.0", 767 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", 768 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", 769 | "dev": true, 770 | "requires": { 771 | "execa": "^1.0.0", 772 | "lcid": "^2.0.0", 773 | "mem": "^4.0.0" 774 | } 775 | }, 776 | "p-defer": { 777 | "version": "1.0.0", 778 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", 779 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", 780 | "dev": true 781 | }, 782 | "p-finally": { 783 | "version": "1.0.0", 784 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 785 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", 786 | "dev": true 787 | }, 788 | "p-is-promise": { 789 | "version": "2.1.0", 790 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", 791 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", 792 | "dev": true 793 | }, 794 | "p-limit": { 795 | "version": "2.2.0", 796 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", 797 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", 798 | "dev": true, 799 | "requires": { 800 | "p-try": "^2.0.0" 801 | } 802 | }, 803 | "p-locate": { 804 | "version": "3.0.0", 805 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 806 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 807 | "dev": true, 808 | "requires": { 809 | "p-limit": "^2.0.0" 810 | } 811 | }, 812 | "p-try": { 813 | "version": "2.2.0", 814 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 815 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 816 | "dev": true 817 | }, 818 | "path-exists": { 819 | "version": "3.0.0", 820 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 821 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 822 | "dev": true 823 | }, 824 | "path-is-absolute": { 825 | "version": "1.0.1", 826 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 827 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 828 | "dev": true 829 | }, 830 | "path-key": { 831 | "version": "2.0.1", 832 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 833 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 834 | "dev": true 835 | }, 836 | "pump": { 837 | "version": "3.0.0", 838 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 839 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 840 | "dev": true, 841 | "requires": { 842 | "end-of-stream": "^1.1.0", 843 | "once": "^1.3.1" 844 | } 845 | }, 846 | "puppeteer-extra": { 847 | "version": "2.1.3", 848 | "resolved": "https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.1.3.tgz", 849 | "integrity": "sha512-RjQp3BkjzkY8JgTcHUsu4RdFcqE3AdTzUquRC9WBUZXRXbSgSXI1CtEmNG7OcxorScXNUTKEbY7Z13xtQVkHnQ==", 850 | "dev": true, 851 | "requires": { 852 | "debug": "^3.1.0", 853 | "deepmerge": "^2.1.0" 854 | } 855 | }, 856 | "puppeteer-extra-plugin": { 857 | "version": "3.0.4", 858 | "resolved": "https://registry.npmjs.org/puppeteer-extra-plugin/-/puppeteer-extra-plugin-3.0.4.tgz", 859 | "integrity": "sha512-qgb5pmyNWI64PHtvRG1MjxEL7S3wAouDeqWklpg+/1jnxsbhRJsoi91SEg4U4Ji+rEOn28kTVM9O4KTXJ1PQ1Q==", 860 | "requires": { 861 | "debug": "^3.1.0", 862 | "merge-deep": "^3.0.1" 863 | } 864 | }, 865 | "require-directory": { 866 | "version": "2.1.1", 867 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 868 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 869 | "dev": true 870 | }, 871 | "require-main-filename": { 872 | "version": "2.0.0", 873 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 874 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 875 | "dev": true 876 | }, 877 | "safe-buffer": { 878 | "version": "5.2.0", 879 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 880 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 881 | "dev": true 882 | }, 883 | "semver": { 884 | "version": "5.7.0", 885 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 886 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 887 | "dev": true 888 | }, 889 | "set-blocking": { 890 | "version": "2.0.0", 891 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 892 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 893 | "dev": true 894 | }, 895 | "shallow-clone": { 896 | "version": "0.1.2", 897 | "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz", 898 | "integrity": "sha1-WQnodLp3EG1zrEFM/sH/yofZcGA=", 899 | "requires": { 900 | "is-extendable": "^0.1.1", 901 | "kind-of": "^2.0.1", 902 | "lazy-cache": "^0.2.3", 903 | "mixin-object": "^2.0.1" 904 | }, 905 | "dependencies": { 906 | "kind-of": { 907 | "version": "2.0.1", 908 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz", 909 | "integrity": "sha1-AY7HpM5+OobLkUG+UZ0kyPqpgbU=", 910 | "requires": { 911 | "is-buffer": "^1.0.2" 912 | } 913 | }, 914 | "lazy-cache": { 915 | "version": "0.2.7", 916 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", 917 | "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" 918 | } 919 | } 920 | }, 921 | "shebang-command": { 922 | "version": "1.2.0", 923 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 924 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 925 | "dev": true, 926 | "requires": { 927 | "shebang-regex": "^1.0.0" 928 | } 929 | }, 930 | "shebang-regex": { 931 | "version": "1.0.0", 932 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 933 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 934 | "dev": true 935 | }, 936 | "signal-exit": { 937 | "version": "3.0.2", 938 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 939 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 940 | "dev": true 941 | }, 942 | "sprintf-js": { 943 | "version": "1.0.3", 944 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 945 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 946 | "dev": true 947 | }, 948 | "string-width": { 949 | "version": "2.1.1", 950 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 951 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 952 | "dev": true, 953 | "requires": { 954 | "is-fullwidth-code-point": "^2.0.0", 955 | "strip-ansi": "^4.0.0" 956 | } 957 | }, 958 | "strip-ansi": { 959 | "version": "4.0.0", 960 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 961 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 962 | "dev": true, 963 | "requires": { 964 | "ansi-regex": "^3.0.0" 965 | } 966 | }, 967 | "strip-eof": { 968 | "version": "1.0.0", 969 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 970 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", 971 | "dev": true 972 | }, 973 | "strip-json-comments": { 974 | "version": "2.0.1", 975 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 976 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 977 | "dev": true 978 | }, 979 | "supports-color": { 980 | "version": "6.0.0", 981 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 982 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 983 | "dev": true, 984 | "requires": { 985 | "has-flag": "^3.0.0" 986 | } 987 | }, 988 | "util": { 989 | "version": "0.12.1", 990 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", 991 | "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", 992 | "dev": true, 993 | "requires": { 994 | "inherits": "^2.0.3", 995 | "is-arguments": "^1.0.4", 996 | "is-generator-function": "^1.0.7", 997 | "object.entries": "^1.1.0", 998 | "safe-buffer": "^5.1.2" 999 | } 1000 | }, 1001 | "which": { 1002 | "version": "1.3.1", 1003 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1004 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1005 | "dev": true, 1006 | "requires": { 1007 | "isexe": "^2.0.0" 1008 | } 1009 | }, 1010 | "which-module": { 1011 | "version": "2.0.0", 1012 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1013 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1014 | "dev": true 1015 | }, 1016 | "wide-align": { 1017 | "version": "1.1.3", 1018 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1019 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1020 | "dev": true, 1021 | "requires": { 1022 | "string-width": "^1.0.2 || 2" 1023 | } 1024 | }, 1025 | "wrap-ansi": { 1026 | "version": "2.1.0", 1027 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1028 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1029 | "dev": true, 1030 | "requires": { 1031 | "string-width": "^1.0.1", 1032 | "strip-ansi": "^3.0.1" 1033 | }, 1034 | "dependencies": { 1035 | "ansi-regex": { 1036 | "version": "2.1.1", 1037 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1038 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1039 | "dev": true 1040 | }, 1041 | "is-fullwidth-code-point": { 1042 | "version": "1.0.0", 1043 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1044 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1045 | "dev": true, 1046 | "requires": { 1047 | "number-is-nan": "^1.0.0" 1048 | } 1049 | }, 1050 | "string-width": { 1051 | "version": "1.0.2", 1052 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1053 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1054 | "dev": true, 1055 | "requires": { 1056 | "code-point-at": "^1.0.0", 1057 | "is-fullwidth-code-point": "^1.0.0", 1058 | "strip-ansi": "^3.0.0" 1059 | } 1060 | }, 1061 | "strip-ansi": { 1062 | "version": "3.0.1", 1063 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1064 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1065 | "dev": true, 1066 | "requires": { 1067 | "ansi-regex": "^2.0.0" 1068 | } 1069 | } 1070 | } 1071 | }, 1072 | "wrappy": { 1073 | "version": "1.0.2", 1074 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1075 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1076 | "dev": true 1077 | }, 1078 | "y18n": { 1079 | "version": "4.0.0", 1080 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1081 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1082 | "dev": true 1083 | }, 1084 | "yargs": { 1085 | "version": "13.2.2", 1086 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", 1087 | "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", 1088 | "dev": true, 1089 | "requires": { 1090 | "cliui": "^4.0.0", 1091 | "find-up": "^3.0.0", 1092 | "get-caller-file": "^2.0.1", 1093 | "os-locale": "^3.1.0", 1094 | "require-directory": "^2.1.1", 1095 | "require-main-filename": "^2.0.0", 1096 | "set-blocking": "^2.0.0", 1097 | "string-width": "^3.0.0", 1098 | "which-module": "^2.0.0", 1099 | "y18n": "^4.0.0", 1100 | "yargs-parser": "^13.0.0" 1101 | }, 1102 | "dependencies": { 1103 | "ansi-regex": { 1104 | "version": "4.1.0", 1105 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1106 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1107 | "dev": true 1108 | }, 1109 | "string-width": { 1110 | "version": "3.1.0", 1111 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1112 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1113 | "dev": true, 1114 | "requires": { 1115 | "emoji-regex": "^7.0.1", 1116 | "is-fullwidth-code-point": "^2.0.0", 1117 | "strip-ansi": "^5.1.0" 1118 | } 1119 | }, 1120 | "strip-ansi": { 1121 | "version": "5.2.0", 1122 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1123 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1124 | "dev": true, 1125 | "requires": { 1126 | "ansi-regex": "^4.1.0" 1127 | } 1128 | } 1129 | } 1130 | }, 1131 | "yargs-parser": { 1132 | "version": "13.0.0", 1133 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", 1134 | "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", 1135 | "dev": true, 1136 | "requires": { 1137 | "camelcase": "^5.0.0", 1138 | "decamelize": "^1.2.0" 1139 | } 1140 | }, 1141 | "yargs-unparser": { 1142 | "version": "1.5.0", 1143 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", 1144 | "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", 1145 | "dev": true, 1146 | "requires": { 1147 | "flat": "^4.1.0", 1148 | "lodash": "^4.17.11", 1149 | "yargs": "^12.0.5" 1150 | }, 1151 | "dependencies": { 1152 | "get-caller-file": { 1153 | "version": "1.0.3", 1154 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 1155 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", 1156 | "dev": true 1157 | }, 1158 | "require-main-filename": { 1159 | "version": "1.0.1", 1160 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1161 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", 1162 | "dev": true 1163 | }, 1164 | "yargs": { 1165 | "version": "12.0.5", 1166 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", 1167 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", 1168 | "dev": true, 1169 | "requires": { 1170 | "cliui": "^4.0.0", 1171 | "decamelize": "^1.2.0", 1172 | "find-up": "^3.0.0", 1173 | "get-caller-file": "^1.0.1", 1174 | "os-locale": "^3.0.0", 1175 | "require-directory": "^2.1.1", 1176 | "require-main-filename": "^1.0.1", 1177 | "set-blocking": "^2.0.0", 1178 | "string-width": "^2.0.0", 1179 | "which-module": "^2.0.0", 1180 | "y18n": "^3.2.1 || ^4.0.0", 1181 | "yargs-parser": "^11.1.1" 1182 | } 1183 | }, 1184 | "yargs-parser": { 1185 | "version": "11.1.1", 1186 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", 1187 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", 1188 | "dev": true, 1189 | "requires": { 1190 | "camelcase": "^5.0.0", 1191 | "decamelize": "^1.2.0" 1192 | } 1193 | } 1194 | } 1195 | } 1196 | } 1197 | } 1198 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppeteer-extra-plugin-proxy", 3 | "version": "1.0.2", 4 | "description": "A puppeteer-extra plugin to add convenient proxy support to puppeteer", 5 | "main": "src/index.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "scripts": { 10 | "test": "./node_modules/mocha/bin/mocha test/" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+ssh://git@github.com/f9mac/puppeteer-extra-plugin-proxy.git" 15 | }, 16 | "keywords": [ 17 | "puppeteer", 18 | "puppeteer-extra", 19 | "puppeteer-extra-plugin", 20 | "proxy", 21 | "chrome", 22 | "headless", 23 | "authless" 24 | ], 25 | "author": "f9mac", 26 | "license": "MIT", 27 | "bugs": { 28 | "url": "https://github.com/f9mac/puppeteer-extra-plugin-proxy/issues" 29 | }, 30 | "homepage": "https://github.com/f9mac/puppeteer-extra-plugin-proxy#readme", 31 | "dependencies": { 32 | "puppeteer-extra-plugin": "^3.0.4" 33 | }, 34 | "devDependencies": { 35 | "assert": "^2.0.0", 36 | "mocha": "^6.2.0", 37 | "puppeteer-extra": "^2.1.3" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const { PuppeteerExtraPlugin } = require('puppeteer-extra-plugin'); 2 | 3 | class Plugin extends PuppeteerExtraPlugin { 4 | constructor (config = {}) { 5 | super(config); 6 | } 7 | 8 | get name () { 9 | return 'proxy' 10 | } 11 | 12 | get defaults () { 13 | return { 14 | _placeholder: '' 15 | } 16 | } 17 | 18 | async beforeLaunch (options) { 19 | const proxyArg = `--proxy-server=${this.opts.address}:${this.opts.port}`; 20 | this.debug('adding browser arg: %s', proxyArg); 21 | options.args.push(proxyArg) 22 | return options; 23 | } 24 | 25 | async onPageCreated (page) { 26 | if (this.opts.credentials === Object(this.opts.credentials)) { 27 | if (typeof this.opts.credentials.username !== 'string') { 28 | throw new Error('Puppeteer Plugin Proxy expected `credentials.username` to be a string'); 29 | } 30 | if (typeof this.opts.credentials.password !== 'string') { 31 | throw new Error('Puppeteer Plugin Proxy expected `credentials.password` to be a string'); 32 | } 33 | this.debug(`authenticate proxy: (U ${this.opts.credentials.username}, P [Secret])`); 34 | return page.authenticate(this.opts.credentials); 35 | } else { 36 | this.debug(`no proxy authentication credentials provided`); 37 | } 38 | } 39 | 40 | } 41 | 42 | module.exports = pluginConfig => new Plugin(pluginConfig); 43 | -------------------------------------------------------------------------------- /test/config.example.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | withoutCredentials: { 3 | address: '123.123.123.123', 4 | port: 1001, 5 | _expectedAddress: '123.123.123.123' 6 | }, 7 | withCredentials: { 8 | address: '123.123.123.123', 9 | port: 1000, 10 | credentials: { 11 | username: 'user', 12 | password: 'password' 13 | }, 14 | _expectedAddress: '123.123.123.123' 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /test/test.js: -------------------------------------------------------------------------------- 1 | /* eslint-env node, mocha */ 2 | const assert = require('assert'); 3 | const puppeteer = require('puppeteer-extra'); 4 | const pluginProxy = require('../src'); 5 | const config = require('./config'); 6 | 7 | const IP_API_SERVICE = 'https://api.myip.com/'; 8 | 9 | describe('PuppeteerExtraPluginProxy', () => { 10 | // reset the plugins to a clean slate for each test 11 | beforeEach(() => (puppeteer._plugins = [])) 12 | 13 | context('without credentials', () => { 14 | it('works', async () => { 15 | puppeteer.use(pluginProxy(config.withoutCredentials)); 16 | const browser = await puppeteer.launch(); 17 | const page = await browser.newPage(); 18 | 19 | try { 20 | const response = await page.goto(IP_API_SERVICE, {waitUntil: 'domcontentloaded'}); 21 | const body = JSON.parse(await response.text()); 22 | assert.equal(body.ip, config.withoutCredentials._expectedAddress, `Unexpected IP ${body.ip}`); 23 | } catch (e) { 24 | browser.close(); 25 | throw e 26 | } 27 | 28 | browser.close(); 29 | }).timeout(10000); 30 | }); 31 | 32 | context('with credentials', () => { 33 | 34 | it('works', async () => { 35 | puppeteer.use(pluginProxy(config.withCredentials)); 36 | const browser = await puppeteer.launch(); 37 | const page = await browser.newPage(); 38 | 39 | try { 40 | const response = await page.goto(IP_API_SERVICE, {waitUntil: 'domcontentloaded'}); 41 | const body = JSON.parse(await response.text()); 42 | assert.equal(body.ip, config.withCredentials._expectedAddress, `Unexpected IP ${body.ip}`); 43 | } catch (e) { 44 | browser.close(); 45 | throw e 46 | } 47 | 48 | browser.close(); 49 | }).timeout(10000); 50 | }); 51 | }); 52 | --------------------------------------------------------------------------------