├── .gitignore ├── chrome-script.js ├── handler.js ├── images └── aws_limits.png ├── package-lock.json ├── package.json ├── readme.md └── serverless.yml /.gitignore: -------------------------------------------------------------------------------- 1 | # package directories 2 | node_modules 3 | jspm_packages 4 | 5 | # Serverless directories 6 | .serverless -------------------------------------------------------------------------------- /chrome-script.js: -------------------------------------------------------------------------------- 1 | const launchChrome = require ("@serverless-chrome/lambda"); 2 | const request = require ("superagent"); 3 | 4 | module.exports.getChrome = async () => { 5 | const chrome = await launchChrome(); 6 | 7 | const response = await request 8 | .get(`${chrome.url}/json/version`) 9 | .set("Content-Type", "application/json"); 10 | 11 | const endpoint = response.body.webSocketDebuggerUrl; 12 | 13 | return { 14 | endpoint, 15 | instance: chrome 16 | }; 17 | }; -------------------------------------------------------------------------------- /handler.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer'); 2 | const {getChrome} = require('./chrome-script') 3 | 4 | module.exports.hello = async (event) => { 5 | const {url} = event.queryStringParameters 6 | const chrome = await getChrome(); 7 | const browser = await puppeteer.connect({ 8 | browserWSEndpoint: chrome.endpoint 9 | }); 10 | const page = await browser.newPage(); 11 | await page.goto(url ,{"waitUntil" : "networkidle0"}); 12 | const content = await page.evaluate(() => document.body.innerHTML); 13 | return { 14 | statusCode : 200, 15 | body : JSON.stringify({ 16 | content : content 17 | }) 18 | } 19 | }; -------------------------------------------------------------------------------- /images/aws_limits.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jay-deshmukh/headless-chrome-with-puppeteer-on-AWS-lambda-with-serverless-framework/8ed894c6fd5af22b957178ded3cb29b87cd21ff4/images/aws_limits.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scrapper-lambda", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "requires": { 12 | "@babel/highlight": "^7.0.0" 13 | } 14 | }, 15 | "@babel/core": { 16 | "version": "7.2.2", 17 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.2.2.tgz", 18 | "integrity": "sha512-59vB0RWt09cAct5EIe58+NzGP4TFSD3Bz//2/ELy3ZeTeKF6VTD1AXlH8BGGbCX0PuobZBsIzO7IAI9PH67eKw==", 19 | "requires": { 20 | "@babel/code-frame": "^7.0.0", 21 | "@babel/generator": "^7.2.2", 22 | "@babel/helpers": "^7.2.0", 23 | "@babel/parser": "^7.2.2", 24 | "@babel/template": "^7.2.2", 25 | "@babel/traverse": "^7.2.2", 26 | "@babel/types": "^7.2.2", 27 | "convert-source-map": "^1.1.0", 28 | "debug": "^4.1.0", 29 | "json5": "^2.1.0", 30 | "lodash": "^4.17.10", 31 | "resolve": "^1.3.2", 32 | "semver": "^5.4.1", 33 | "source-map": "^0.5.0" 34 | } 35 | }, 36 | "@babel/generator": { 37 | "version": "7.2.2", 38 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.2.2.tgz", 39 | "integrity": "sha512-I4o675J/iS8k+P38dvJ3IBGqObLXyQLTxtrR4u9cSUJOURvafeEWb/pFMOTwtNrmq73mJzyF6ueTbO1BtN0Zeg==", 40 | "requires": { 41 | "@babel/types": "^7.2.2", 42 | "jsesc": "^2.5.1", 43 | "lodash": "^4.17.10", 44 | "source-map": "^0.5.0", 45 | "trim-right": "^1.0.1" 46 | } 47 | }, 48 | "@babel/helper-function-name": { 49 | "version": "7.1.0", 50 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", 51 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", 52 | "requires": { 53 | "@babel/helper-get-function-arity": "^7.0.0", 54 | "@babel/template": "^7.1.0", 55 | "@babel/types": "^7.0.0" 56 | } 57 | }, 58 | "@babel/helper-get-function-arity": { 59 | "version": "7.0.0", 60 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", 61 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", 62 | "requires": { 63 | "@babel/types": "^7.0.0" 64 | } 65 | }, 66 | "@babel/helper-split-export-declaration": { 67 | "version": "7.0.0", 68 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", 69 | "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", 70 | "requires": { 71 | "@babel/types": "^7.0.0" 72 | } 73 | }, 74 | "@babel/helpers": { 75 | "version": "7.2.0", 76 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.2.0.tgz", 77 | "integrity": "sha512-Fr07N+ea0dMcMN8nFpuK6dUIT7/ivt9yKQdEEnjVS83tG2pHwPi03gYmk/tyuwONnZ+sY+GFFPlWGgCtW1hF9A==", 78 | "requires": { 79 | "@babel/template": "^7.1.2", 80 | "@babel/traverse": "^7.1.5", 81 | "@babel/types": "^7.2.0" 82 | } 83 | }, 84 | "@babel/highlight": { 85 | "version": "7.0.0", 86 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 87 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 88 | "requires": { 89 | "chalk": "^2.0.0", 90 | "esutils": "^2.0.2", 91 | "js-tokens": "^4.0.0" 92 | } 93 | }, 94 | "@babel/parser": { 95 | "version": "7.2.3", 96 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.2.3.tgz", 97 | "integrity": "sha512-0LyEcVlfCoFmci8mXx8A5oIkpkOgyo8dRHtxBnK9RRBwxO2+JZPNsqtVEZQ7mJFPxnXF9lfmU24mHOPI0qnlkA==" 98 | }, 99 | "@babel/register": { 100 | "version": "7.0.0", 101 | "resolved": "https://registry.npmjs.org/@babel/register/-/register-7.0.0.tgz", 102 | "integrity": "sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g==", 103 | "requires": { 104 | "core-js": "^2.5.7", 105 | "find-cache-dir": "^1.0.0", 106 | "home-or-tmp": "^3.0.0", 107 | "lodash": "^4.17.10", 108 | "mkdirp": "^0.5.1", 109 | "pirates": "^4.0.0", 110 | "source-map-support": "^0.5.9" 111 | } 112 | }, 113 | "@babel/template": { 114 | "version": "7.2.2", 115 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", 116 | "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", 117 | "requires": { 118 | "@babel/code-frame": "^7.0.0", 119 | "@babel/parser": "^7.2.2", 120 | "@babel/types": "^7.2.2" 121 | } 122 | }, 123 | "@babel/traverse": { 124 | "version": "7.2.3", 125 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", 126 | "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", 127 | "requires": { 128 | "@babel/code-frame": "^7.0.0", 129 | "@babel/generator": "^7.2.2", 130 | "@babel/helper-function-name": "^7.1.0", 131 | "@babel/helper-split-export-declaration": "^7.0.0", 132 | "@babel/parser": "^7.2.3", 133 | "@babel/types": "^7.2.2", 134 | "debug": "^4.1.0", 135 | "globals": "^11.1.0", 136 | "lodash": "^4.17.10" 137 | } 138 | }, 139 | "@babel/types": { 140 | "version": "7.2.2", 141 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.2.2.tgz", 142 | "integrity": "sha512-fKCuD6UFUMkR541eDWL+2ih/xFZBXPOg/7EQFeTluMDebfqR4jrpaCjLhkWlQS4hT6nRa2PMEgXKbRB5/H2fpg==", 143 | "requires": { 144 | "esutils": "^2.0.2", 145 | "lodash": "^4.17.10", 146 | "to-fast-properties": "^2.0.0" 147 | } 148 | }, 149 | "@serverless-chrome/lambda": { 150 | "version": "1.0.0-55", 151 | "resolved": "https://registry.npmjs.org/@serverless-chrome/lambda/-/lambda-1.0.0-55.tgz", 152 | "integrity": "sha512-iJQlFl5AZEqhrfZOFo9LYvDFanr+BcOncGYjwjVKtJ2ZQ9sUnYQLO9qETWAMbg8+5F9eb8/o/Uvby6/rWZzC9g==", 153 | "requires": { 154 | "extract-zip": "1.6.6" 155 | } 156 | }, 157 | "@types/core-js": { 158 | "version": "0.9.46", 159 | "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-0.9.46.tgz", 160 | "integrity": "sha512-LooLR6XHes9V+kNYRz1Qm8w3atw9QMn7XeZUmIpUelllF9BdryeUKd/u0Wh5ErcjpWfG39NrToU9MF7ngsTFVw==" 161 | }, 162 | "@types/mkdirp": { 163 | "version": "0.3.29", 164 | "resolved": "http://registry.npmjs.org/@types/mkdirp/-/mkdirp-0.3.29.tgz", 165 | "integrity": "sha1-fyrX7FX5FEgvybHsS7GuYCjUYGY=" 166 | }, 167 | "@types/node": { 168 | "version": "9.6.41", 169 | "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.41.tgz", 170 | "integrity": "sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA==" 171 | }, 172 | "@types/rimraf": { 173 | "version": "0.0.28", 174 | "resolved": "http://registry.npmjs.org/@types/rimraf/-/rimraf-0.0.28.tgz", 175 | "integrity": "sha1-VWJRm8eWPKyoq/fxKMrjtZTUHQY=" 176 | }, 177 | "accept": { 178 | "version": "2.1.4", 179 | "resolved": "https://registry.npmjs.org/accept/-/accept-2.1.4.tgz", 180 | "integrity": "sha1-iHr1TO7lx/RDBGGXHsQAxh0JrLs=", 181 | "requires": { 182 | "boom": "5.x.x", 183 | "hoek": "4.x.x" 184 | }, 185 | "dependencies": { 186 | "boom": { 187 | "version": "5.2.0", 188 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 189 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 190 | "requires": { 191 | "hoek": "4.x.x" 192 | } 193 | } 194 | } 195 | }, 196 | "ammo": { 197 | "version": "2.0.4", 198 | "resolved": "https://registry.npmjs.org/ammo/-/ammo-2.0.4.tgz", 199 | "integrity": "sha1-v4CqshFpjqePY+9efxE91dnokX8=", 200 | "requires": { 201 | "boom": "5.x.x", 202 | "hoek": "4.x.x" 203 | }, 204 | "dependencies": { 205 | "boom": { 206 | "version": "5.2.0", 207 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 208 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 209 | "requires": { 210 | "hoek": "4.x.x" 211 | } 212 | } 213 | } 214 | }, 215 | "ansi-styles": { 216 | "version": "3.2.1", 217 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 218 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 219 | "requires": { 220 | "color-convert": "^1.9.0" 221 | } 222 | }, 223 | "array-union": { 224 | "version": "1.0.2", 225 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 226 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 227 | "requires": { 228 | "array-uniq": "^1.0.1" 229 | } 230 | }, 231 | "array-uniq": { 232 | "version": "1.0.3", 233 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 234 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" 235 | }, 236 | "async-limiter": { 237 | "version": "1.0.0", 238 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", 239 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" 240 | }, 241 | "asynckit": { 242 | "version": "0.4.0", 243 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 244 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 245 | }, 246 | "b64": { 247 | "version": "3.0.3", 248 | "resolved": "https://registry.npmjs.org/b64/-/b64-3.0.3.tgz", 249 | "integrity": "sha512-Pbeh0i6OLubPJdIdCepn8ZQHwN2MWznZHbHABSTEfQ706ie+yuxNSaPdqX1xRatT6WanaS1EazMiSg0NUW2XxQ==" 250 | }, 251 | "balanced-match": { 252 | "version": "1.0.0", 253 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 254 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 255 | }, 256 | "boom": { 257 | "version": "4.3.1", 258 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 259 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 260 | "requires": { 261 | "hoek": "4.x.x" 262 | } 263 | }, 264 | "brace-expansion": { 265 | "version": "1.1.11", 266 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 267 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 268 | "requires": { 269 | "balanced-match": "^1.0.0", 270 | "concat-map": "0.0.1" 271 | } 272 | }, 273 | "buffer-equal-constant-time": { 274 | "version": "1.0.1", 275 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 276 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 277 | }, 278 | "buffer-from": { 279 | "version": "1.1.1", 280 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 281 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 282 | }, 283 | "call": { 284 | "version": "3.0.4", 285 | "resolved": "http://registry.npmjs.org/call/-/call-3.0.4.tgz", 286 | "integrity": "sha1-44Dy8qSRMwqnkIU1X4vggId9VZ4=", 287 | "requires": { 288 | "boom": "4.x.x", 289 | "hoek": "4.x.x" 290 | } 291 | }, 292 | "catbox": { 293 | "version": "7.1.5", 294 | "resolved": "https://registry.npmjs.org/catbox/-/catbox-7.1.5.tgz", 295 | "integrity": "sha512-4fui5lELzqZ+9cnaAP/BcqXTH6LvWLBRtFhJ0I4FfgfXiSaZcf6k9m9dqOyChiTxNYtvLk7ZMYSf7ahMq3bf5A==", 296 | "requires": { 297 | "boom": "5.x.x", 298 | "hoek": "4.x.x", 299 | "joi": "10.x.x" 300 | }, 301 | "dependencies": { 302 | "boom": { 303 | "version": "5.2.0", 304 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 305 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 306 | "requires": { 307 | "hoek": "4.x.x" 308 | } 309 | }, 310 | "joi": { 311 | "version": "10.6.0", 312 | "resolved": "https://registry.npmjs.org/joi/-/joi-10.6.0.tgz", 313 | "integrity": "sha512-hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ==", 314 | "requires": { 315 | "hoek": "4.x.x", 316 | "isemail": "2.x.x", 317 | "items": "2.x.x", 318 | "topo": "2.x.x" 319 | } 320 | } 321 | } 322 | }, 323 | "catbox-memory": { 324 | "version": "2.0.4", 325 | "resolved": "http://registry.npmjs.org/catbox-memory/-/catbox-memory-2.0.4.tgz", 326 | "integrity": "sha1-Qz4lWQLK9UIz0ShkKcj03xToItU=", 327 | "requires": { 328 | "hoek": "4.x.x" 329 | } 330 | }, 331 | "chalk": { 332 | "version": "2.4.1", 333 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 334 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 335 | "requires": { 336 | "ansi-styles": "^3.2.1", 337 | "escape-string-regexp": "^1.0.5", 338 | "supports-color": "^5.3.0" 339 | } 340 | }, 341 | "chrome-launcher": { 342 | "version": "0.10.5", 343 | "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.10.5.tgz", 344 | "integrity": "sha512-Gbzg8HlWhyuoVqflhiXwfFXhzNfNWvAkSWv2QR1Yl6mwsMo1oCLAVjp2tIySuS4lrZLEjzVx1fOy584yE76P4g==", 345 | "requires": { 346 | "@types/core-js": "^0.9.41", 347 | "@types/mkdirp": "^0.3.29", 348 | "@types/node": "^9.3.0", 349 | "@types/rimraf": "^0.0.28", 350 | "is-wsl": "^1.1.0", 351 | "lighthouse-logger": "^1.0.0", 352 | "mkdirp": "0.5.1", 353 | "rimraf": "^2.6.1" 354 | } 355 | }, 356 | "color-convert": { 357 | "version": "1.9.3", 358 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 359 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 360 | "requires": { 361 | "color-name": "1.1.3" 362 | } 363 | }, 364 | "color-name": { 365 | "version": "1.1.3", 366 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 367 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 368 | }, 369 | "combined-stream": { 370 | "version": "1.0.7", 371 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", 372 | "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", 373 | "requires": { 374 | "delayed-stream": "~1.0.0" 375 | } 376 | }, 377 | "commondir": { 378 | "version": "1.0.1", 379 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", 380 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" 381 | }, 382 | "component-emitter": { 383 | "version": "1.2.1", 384 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 385 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 386 | }, 387 | "concat-map": { 388 | "version": "0.0.1", 389 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 390 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 391 | }, 392 | "concat-stream": { 393 | "version": "1.6.0", 394 | "resolved": "http://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", 395 | "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", 396 | "requires": { 397 | "inherits": "^2.0.3", 398 | "readable-stream": "^2.2.2", 399 | "typedarray": "^0.0.6" 400 | } 401 | }, 402 | "content": { 403 | "version": "3.0.7", 404 | "resolved": "http://registry.npmjs.org/content/-/content-3.0.7.tgz", 405 | "integrity": "sha512-LXtnSnvE+Z1Cjpa3P9gh9kb396qV4MqpfwKy777BOSF8n6nw2vAi03tHNl0/XRqZUyzVzY/+nMXOZVnEapWzdg==", 406 | "requires": { 407 | "boom": "5.x.x" 408 | }, 409 | "dependencies": { 410 | "boom": { 411 | "version": "5.2.0", 412 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 413 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 414 | "requires": { 415 | "hoek": "4.x.x" 416 | } 417 | } 418 | } 419 | }, 420 | "convert-source-map": { 421 | "version": "1.6.0", 422 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", 423 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", 424 | "requires": { 425 | "safe-buffer": "~5.1.1" 426 | } 427 | }, 428 | "cookiejar": { 429 | "version": "2.1.2", 430 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", 431 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" 432 | }, 433 | "core-js": { 434 | "version": "2.6.1", 435 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.1.tgz", 436 | "integrity": "sha512-L72mmmEayPJBejKIWe2pYtGis5r0tQ5NaJekdhyXgeMQTpJoBsH0NL4ElY2LfSoV15xeQWKQ+XTTOZdyero5Xg==" 437 | }, 438 | "core-util-is": { 439 | "version": "1.0.2", 440 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 441 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 442 | }, 443 | "cryptiles": { 444 | "version": "4.1.3", 445 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-4.1.3.tgz", 446 | "integrity": "sha512-gT9nyTMSUC1JnziQpPbxKGBbUg8VL7Zn2NB4E1cJYvuXdElHrwxrV9bmltZGDzet45zSDGyYceueke1TjynGzw==", 447 | "requires": { 448 | "boom": "7.x.x" 449 | }, 450 | "dependencies": { 451 | "boom": { 452 | "version": "7.3.0", 453 | "resolved": "https://registry.npmjs.org/boom/-/boom-7.3.0.tgz", 454 | "integrity": "sha512-Swpoyi2t5+GhOEGw8rEsKvTxFLIDiiKoUc2gsoV6Lyr43LHBIzch3k2MvYUs8RTROrIkVJ3Al0TkaOGjnb+B6A==", 455 | "requires": { 456 | "hoek": "6.x.x" 457 | } 458 | }, 459 | "hoek": { 460 | "version": "6.1.2", 461 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.2.tgz", 462 | "integrity": "sha512-6qhh/wahGYZHFSFw12tBbJw5fsAhhwrrG/y3Cs0YMTv2WzMnL0oLPnQJjv1QJvEfylRSOFuP+xCu+tdx0tD16Q==" 463 | } 464 | } 465 | }, 466 | "debug": { 467 | "version": "4.1.0", 468 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz", 469 | "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==", 470 | "requires": { 471 | "ms": "^2.1.1" 472 | } 473 | }, 474 | "delayed-stream": { 475 | "version": "1.0.0", 476 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 477 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 478 | }, 479 | "ecdsa-sig-formatter": { 480 | "version": "1.0.10", 481 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz", 482 | "integrity": "sha1-HFlQAPBKiJffuFAAiSoPTDOvhsM=", 483 | "requires": { 484 | "safe-buffer": "^5.0.1" 485 | } 486 | }, 487 | "es6-promise": { 488 | "version": "4.2.5", 489 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", 490 | "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==" 491 | }, 492 | "es6-promisify": { 493 | "version": "5.0.0", 494 | "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 495 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 496 | "requires": { 497 | "es6-promise": "^4.0.3" 498 | } 499 | }, 500 | "escape-string-regexp": { 501 | "version": "1.0.5", 502 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 503 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 504 | }, 505 | "esutils": { 506 | "version": "2.0.2", 507 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 508 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 509 | }, 510 | "extract-zip": { 511 | "version": "1.6.6", 512 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", 513 | "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", 514 | "requires": { 515 | "concat-stream": "1.6.0", 516 | "debug": "2.6.9", 517 | "mkdirp": "0.5.0", 518 | "yauzl": "2.4.1" 519 | }, 520 | "dependencies": { 521 | "debug": { 522 | "version": "2.6.9", 523 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 524 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 525 | "requires": { 526 | "ms": "2.0.0" 527 | } 528 | }, 529 | "minimist": { 530 | "version": "0.0.8", 531 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 532 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 533 | }, 534 | "mkdirp": { 535 | "version": "0.5.0", 536 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", 537 | "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", 538 | "requires": { 539 | "minimist": "0.0.8" 540 | } 541 | }, 542 | "ms": { 543 | "version": "2.0.0", 544 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 545 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 546 | } 547 | } 548 | }, 549 | "fd-slicer": { 550 | "version": "1.0.1", 551 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", 552 | "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", 553 | "requires": { 554 | "pend": "~1.2.0" 555 | } 556 | }, 557 | "find-cache-dir": { 558 | "version": "1.0.0", 559 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", 560 | "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", 561 | "requires": { 562 | "commondir": "^1.0.1", 563 | "make-dir": "^1.0.0", 564 | "pkg-dir": "^2.0.0" 565 | } 566 | }, 567 | "find-up": { 568 | "version": "2.1.0", 569 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 570 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 571 | "requires": { 572 | "locate-path": "^2.0.0" 573 | } 574 | }, 575 | "form-data": { 576 | "version": "2.3.3", 577 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 578 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 579 | "requires": { 580 | "asynckit": "^0.4.0", 581 | "combined-stream": "^1.0.6", 582 | "mime-types": "^2.1.12" 583 | } 584 | }, 585 | "formidable": { 586 | "version": "1.2.1", 587 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", 588 | "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" 589 | }, 590 | "fs-extra": { 591 | "version": "2.1.2", 592 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", 593 | "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", 594 | "requires": { 595 | "graceful-fs": "^4.1.2", 596 | "jsonfile": "^2.1.0" 597 | } 598 | }, 599 | "fs-p": { 600 | "version": "2.0.0", 601 | "resolved": "https://registry.npmjs.org/fs-p/-/fs-p-2.0.0.tgz", 602 | "integrity": "sha1-ZnhKASRzxwC2j7dqwhIOzMawYCs=", 603 | "requires": { 604 | "fs-extra": "^2.0.0" 605 | } 606 | }, 607 | "fs.realpath": { 608 | "version": "1.0.0", 609 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 610 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 611 | }, 612 | "glob": { 613 | "version": "7.1.3", 614 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 615 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 616 | "requires": { 617 | "fs.realpath": "^1.0.0", 618 | "inflight": "^1.0.4", 619 | "inherits": "2", 620 | "minimatch": "^3.0.4", 621 | "once": "^1.3.0", 622 | "path-is-absolute": "^1.0.0" 623 | } 624 | }, 625 | "globals": { 626 | "version": "11.9.0", 627 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz", 628 | "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg==" 629 | }, 630 | "globby": { 631 | "version": "6.1.0", 632 | "resolved": "http://registry.npmjs.org/globby/-/globby-6.1.0.tgz", 633 | "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", 634 | "requires": { 635 | "array-union": "^1.0.1", 636 | "glob": "^7.0.3", 637 | "object-assign": "^4.0.1", 638 | "pify": "^2.0.0", 639 | "pinkie-promise": "^2.0.0" 640 | }, 641 | "dependencies": { 642 | "pify": { 643 | "version": "2.3.0", 644 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 645 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 646 | } 647 | } 648 | }, 649 | "graceful-fs": { 650 | "version": "4.1.15", 651 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 652 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 653 | }, 654 | "h2o2": { 655 | "version": "5.4.0", 656 | "resolved": "https://registry.npmjs.org/h2o2/-/h2o2-5.4.0.tgz", 657 | "integrity": "sha1-1oV8oFNVIAyJCzSmZgbKugIp7Vg=", 658 | "requires": { 659 | "boom": "3.X.X", 660 | "hoek": "4.X.X", 661 | "joi": "9.X.X", 662 | "wreck": "9.X.X" 663 | }, 664 | "dependencies": { 665 | "boom": { 666 | "version": "3.2.2", 667 | "resolved": "https://registry.npmjs.org/boom/-/boom-3.2.2.tgz", 668 | "integrity": "sha1-DwzF0ErcUAO4x9cfQsynJx/vDng=", 669 | "requires": { 670 | "hoek": "4.x.x" 671 | } 672 | } 673 | } 674 | }, 675 | "hapi": { 676 | "version": "14.2.0", 677 | "resolved": "http://registry.npmjs.org/hapi/-/hapi-14.2.0.tgz", 678 | "integrity": "sha1-5P4vwYJZig+B6HtBtr4PvTHHVAk=", 679 | "requires": { 680 | "accept": "2.x.x", 681 | "ammo": "2.x.x", 682 | "boom": "3.x.x", 683 | "call": "3.x.x", 684 | "catbox": "7.x.x", 685 | "catbox-memory": "2.x.x", 686 | "cryptiles": "3.x.x", 687 | "heavy": "4.x.x", 688 | "hoek": "4.x.x", 689 | "iron": "4.x.x", 690 | "items": "2.x.x", 691 | "joi": "9.x.x", 692 | "kilt": "2.x.x", 693 | "mimos": "3.x.x", 694 | "peekaboo": "2.x.x", 695 | "shot": "3.x.x", 696 | "statehood": "4.x.x", 697 | "subtext": "4.x.x", 698 | "topo": "2.x.x" 699 | }, 700 | "dependencies": { 701 | "boom": { 702 | "version": "3.2.2", 703 | "resolved": "https://registry.npmjs.org/boom/-/boom-3.2.2.tgz", 704 | "integrity": "sha1-DwzF0ErcUAO4x9cfQsynJx/vDng=", 705 | "requires": { 706 | "hoek": "4.x.x" 707 | } 708 | }, 709 | "cryptiles": { 710 | "version": "3.1.4", 711 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.4.tgz", 712 | "integrity": "sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw==", 713 | "requires": { 714 | "boom": "5.x.x" 715 | }, 716 | "dependencies": { 717 | "boom": { 718 | "version": "5.2.0", 719 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 720 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 721 | "requires": { 722 | "hoek": "4.x.x" 723 | } 724 | } 725 | } 726 | } 727 | } 728 | }, 729 | "hapi-cors-headers": { 730 | "version": "1.0.3", 731 | "resolved": "https://registry.npmjs.org/hapi-cors-headers/-/hapi-cors-headers-1.0.3.tgz", 732 | "integrity": "sha512-U/y+kpVLUJ0y86fEk8yleou9C1T5wFopcWQjuxKdMXzCcymTjfSqGz59waqvngUs1SbeXav/y8Ga9C0G0L1MGg==" 733 | }, 734 | "has-flag": { 735 | "version": "3.0.0", 736 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 737 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 738 | }, 739 | "heavy": { 740 | "version": "4.0.4", 741 | "resolved": "https://registry.npmjs.org/heavy/-/heavy-4.0.4.tgz", 742 | "integrity": "sha1-NskTNsAMz+hSyqTRUwhjNc0vAOk=", 743 | "requires": { 744 | "boom": "5.x.x", 745 | "hoek": "4.x.x", 746 | "joi": "10.x.x" 747 | }, 748 | "dependencies": { 749 | "boom": { 750 | "version": "5.2.0", 751 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 752 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 753 | "requires": { 754 | "hoek": "4.x.x" 755 | } 756 | }, 757 | "joi": { 758 | "version": "10.6.0", 759 | "resolved": "https://registry.npmjs.org/joi/-/joi-10.6.0.tgz", 760 | "integrity": "sha512-hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ==", 761 | "requires": { 762 | "hoek": "4.x.x", 763 | "isemail": "2.x.x", 764 | "items": "2.x.x", 765 | "topo": "2.x.x" 766 | } 767 | } 768 | } 769 | }, 770 | "hoek": { 771 | "version": "4.2.1", 772 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", 773 | "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" 774 | }, 775 | "home-or-tmp": { 776 | "version": "3.0.0", 777 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-3.0.0.tgz", 778 | "integrity": "sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs=" 779 | }, 780 | "https-proxy-agent": { 781 | "version": "2.2.4", 782 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", 783 | "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", 784 | "requires": { 785 | "agent-base": "^4.3.0", 786 | "debug": "^3.1.0" 787 | }, 788 | "dependencies": { 789 | "agent-base": { 790 | "version": "4.3.0", 791 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 792 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 793 | "requires": { 794 | "es6-promisify": "^5.0.0" 795 | } 796 | }, 797 | "debug": { 798 | "version": "3.2.6", 799 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 800 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 801 | "requires": { 802 | "ms": "^2.1.1" 803 | } 804 | } 805 | } 806 | }, 807 | "inflight": { 808 | "version": "1.0.6", 809 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 810 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 811 | "requires": { 812 | "once": "^1.3.0", 813 | "wrappy": "1" 814 | } 815 | }, 816 | "inherits": { 817 | "version": "2.0.3", 818 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 819 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 820 | }, 821 | "iron": { 822 | "version": "4.0.5", 823 | "resolved": "https://registry.npmjs.org/iron/-/iron-4.0.5.tgz", 824 | "integrity": "sha1-TwQszri5c480a1mqc0yDqJvDFCg=", 825 | "requires": { 826 | "boom": "5.x.x", 827 | "cryptiles": "3.x.x", 828 | "hoek": "4.x.x" 829 | }, 830 | "dependencies": { 831 | "boom": { 832 | "version": "5.2.0", 833 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 834 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 835 | "requires": { 836 | "hoek": "4.x.x" 837 | } 838 | }, 839 | "cryptiles": { 840 | "version": "3.1.4", 841 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.4.tgz", 842 | "integrity": "sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw==", 843 | "requires": { 844 | "boom": "5.x.x" 845 | } 846 | } 847 | } 848 | }, 849 | "is-wsl": { 850 | "version": "1.1.0", 851 | "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", 852 | "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" 853 | }, 854 | "isarray": { 855 | "version": "1.0.0", 856 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 857 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 858 | }, 859 | "isemail": { 860 | "version": "2.2.1", 861 | "resolved": "http://registry.npmjs.org/isemail/-/isemail-2.2.1.tgz", 862 | "integrity": "sha1-A1PT2aYpUQgMJiwqoKQrjqjp4qY=" 863 | }, 864 | "items": { 865 | "version": "2.1.2", 866 | "resolved": "https://registry.npmjs.org/items/-/items-2.1.2.tgz", 867 | "integrity": "sha512-kezcEqgB97BGeZZYtX/MA8AG410ptURstvnz5RAgyFZ8wQFPMxHY8GpTq+/ZHKT3frSlIthUq7EvLt9xn3TvXg==" 868 | }, 869 | "joi": { 870 | "version": "9.2.0", 871 | "resolved": "https://registry.npmjs.org/joi/-/joi-9.2.0.tgz", 872 | "integrity": "sha1-M4WseQGSEwy+Iw6ALsAskhW7/to=", 873 | "requires": { 874 | "hoek": "4.x.x", 875 | "isemail": "2.x.x", 876 | "items": "2.x.x", 877 | "moment": "2.x.x", 878 | "topo": "2.x.x" 879 | } 880 | }, 881 | "js-string-escape": { 882 | "version": "1.0.1", 883 | "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", 884 | "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=" 885 | }, 886 | "js-tokens": { 887 | "version": "4.0.0", 888 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 889 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" 890 | }, 891 | "jsesc": { 892 | "version": "2.5.2", 893 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 894 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" 895 | }, 896 | "json5": { 897 | "version": "2.1.0", 898 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", 899 | "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", 900 | "requires": { 901 | "minimist": "^1.2.0" 902 | } 903 | }, 904 | "jsonfile": { 905 | "version": "2.4.0", 906 | "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", 907 | "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", 908 | "requires": { 909 | "graceful-fs": "^4.1.6" 910 | } 911 | }, 912 | "jsonpath-plus": { 913 | "version": "0.16.0", 914 | "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-0.16.0.tgz", 915 | "integrity": "sha1-/kQbI/A+xpeaVgNROYjNPtt9tdw=" 916 | }, 917 | "jsonwebtoken": { 918 | "version": "8.4.0", 919 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.4.0.tgz", 920 | "integrity": "sha512-coyXjRTCy0pw5WYBpMvWOMN+Kjaik2MwTUIq9cna/W7NpO9E+iYbumZONAz3hcr+tXFJECoQVrtmIoC3Oz0gvg==", 921 | "requires": { 922 | "jws": "^3.1.5", 923 | "lodash.includes": "^4.3.0", 924 | "lodash.isboolean": "^3.0.3", 925 | "lodash.isinteger": "^4.0.4", 926 | "lodash.isnumber": "^3.0.3", 927 | "lodash.isplainobject": "^4.0.6", 928 | "lodash.isstring": "^4.0.1", 929 | "lodash.once": "^4.0.0", 930 | "ms": "^2.1.1" 931 | } 932 | }, 933 | "jwa": { 934 | "version": "1.1.6", 935 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz", 936 | "integrity": "sha512-tBO/cf++BUsJkYql/kBbJroKOgHWEigTKBAjjBEmrMGYd1QMBC74Hr4Wo2zCZw6ZrVhlJPvoMrkcOnlWR/DJfw==", 937 | "requires": { 938 | "buffer-equal-constant-time": "1.0.1", 939 | "ecdsa-sig-formatter": "1.0.10", 940 | "safe-buffer": "^5.0.1" 941 | } 942 | }, 943 | "jws": { 944 | "version": "3.1.5", 945 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz", 946 | "integrity": "sha512-GsCSexFADNQUr8T5HPJvayTjvPIfoyJPtLQBwn5a4WZQchcrPMPMAWcC1AzJVRDKyD6ZPROPAxgv6rfHViO4uQ==", 947 | "requires": { 948 | "jwa": "^1.1.5", 949 | "safe-buffer": "^5.0.1" 950 | } 951 | }, 952 | "kilt": { 953 | "version": "2.0.2", 954 | "resolved": "http://registry.npmjs.org/kilt/-/kilt-2.0.2.tgz", 955 | "integrity": "sha1-BNcYPCmKEjLv3ffdyllZqPYwHiA=", 956 | "requires": { 957 | "hoek": "4.x.x" 958 | } 959 | }, 960 | "lighthouse-logger": { 961 | "version": "1.2.0", 962 | "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz", 963 | "integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==", 964 | "requires": { 965 | "debug": "^2.6.8", 966 | "marky": "^1.2.0" 967 | }, 968 | "dependencies": { 969 | "debug": { 970 | "version": "2.6.9", 971 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 972 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 973 | "requires": { 974 | "ms": "2.0.0" 975 | } 976 | }, 977 | "ms": { 978 | "version": "2.0.0", 979 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 980 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 981 | } 982 | } 983 | }, 984 | "locate-path": { 985 | "version": "2.0.0", 986 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 987 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 988 | "requires": { 989 | "p-locate": "^2.0.0", 990 | "path-exists": "^3.0.0" 991 | } 992 | }, 993 | "lodash": { 994 | "version": "4.17.19", 995 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 996 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 997 | }, 998 | "lodash.includes": { 999 | "version": "4.3.0", 1000 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", 1001 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=" 1002 | }, 1003 | "lodash.isboolean": { 1004 | "version": "3.0.3", 1005 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", 1006 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=" 1007 | }, 1008 | "lodash.isinteger": { 1009 | "version": "4.0.4", 1010 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", 1011 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=" 1012 | }, 1013 | "lodash.isnumber": { 1014 | "version": "3.0.3", 1015 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", 1016 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=" 1017 | }, 1018 | "lodash.isplainobject": { 1019 | "version": "4.0.6", 1020 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", 1021 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=" 1022 | }, 1023 | "lodash.isstring": { 1024 | "version": "4.0.1", 1025 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", 1026 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=" 1027 | }, 1028 | "lodash.once": { 1029 | "version": "4.1.1", 1030 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", 1031 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" 1032 | }, 1033 | "make-dir": { 1034 | "version": "1.3.0", 1035 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", 1036 | "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", 1037 | "requires": { 1038 | "pify": "^3.0.0" 1039 | } 1040 | }, 1041 | "marky": { 1042 | "version": "1.2.1", 1043 | "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz", 1044 | "integrity": "sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==" 1045 | }, 1046 | "methods": { 1047 | "version": "1.1.2", 1048 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1049 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1050 | }, 1051 | "mime": { 1052 | "version": "2.4.0", 1053 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz", 1054 | "integrity": "sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w==" 1055 | }, 1056 | "mime-db": { 1057 | "version": "1.37.0", 1058 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", 1059 | "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" 1060 | }, 1061 | "mime-types": { 1062 | "version": "2.1.21", 1063 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", 1064 | "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", 1065 | "requires": { 1066 | "mime-db": "~1.37.0" 1067 | } 1068 | }, 1069 | "mimos": { 1070 | "version": "3.0.3", 1071 | "resolved": "http://registry.npmjs.org/mimos/-/mimos-3.0.3.tgz", 1072 | "integrity": "sha1-uRCQcq03jCty9qAQHEPd+ys2ZB8=", 1073 | "requires": { 1074 | "hoek": "4.x.x", 1075 | "mime-db": "1.x.x" 1076 | } 1077 | }, 1078 | "minimatch": { 1079 | "version": "3.0.4", 1080 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1081 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1082 | "requires": { 1083 | "brace-expansion": "^1.1.7" 1084 | } 1085 | }, 1086 | "minimist": { 1087 | "version": "1.2.0", 1088 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1089 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1090 | }, 1091 | "mkdirp": { 1092 | "version": "0.5.1", 1093 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1094 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1095 | "requires": { 1096 | "minimist": "0.0.8" 1097 | }, 1098 | "dependencies": { 1099 | "minimist": { 1100 | "version": "0.0.8", 1101 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1102 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1103 | } 1104 | } 1105 | }, 1106 | "moment": { 1107 | "version": "2.23.0", 1108 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.23.0.tgz", 1109 | "integrity": "sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==" 1110 | }, 1111 | "ms": { 1112 | "version": "2.1.1", 1113 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 1114 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 1115 | }, 1116 | "nigel": { 1117 | "version": "2.0.2", 1118 | "resolved": "http://registry.npmjs.org/nigel/-/nigel-2.0.2.tgz", 1119 | "integrity": "sha1-k6GGb7DFLYc5CqdeKxYfS1x15bE=", 1120 | "requires": { 1121 | "hoek": "4.x.x", 1122 | "vise": "2.x.x" 1123 | } 1124 | }, 1125 | "node-modules-regexp": { 1126 | "version": "1.0.0", 1127 | "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", 1128 | "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" 1129 | }, 1130 | "object-assign": { 1131 | "version": "4.1.1", 1132 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1133 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1134 | }, 1135 | "once": { 1136 | "version": "1.4.0", 1137 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1138 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1139 | "requires": { 1140 | "wrappy": "1" 1141 | } 1142 | }, 1143 | "p-limit": { 1144 | "version": "1.3.0", 1145 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 1146 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 1147 | "requires": { 1148 | "p-try": "^1.0.0" 1149 | } 1150 | }, 1151 | "p-locate": { 1152 | "version": "2.0.0", 1153 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1154 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1155 | "requires": { 1156 | "p-limit": "^1.1.0" 1157 | } 1158 | }, 1159 | "p-try": { 1160 | "version": "1.0.0", 1161 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1162 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 1163 | }, 1164 | "path-exists": { 1165 | "version": "3.0.0", 1166 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1167 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1168 | }, 1169 | "path-is-absolute": { 1170 | "version": "1.0.1", 1171 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1172 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1173 | }, 1174 | "path-parse": { 1175 | "version": "1.0.6", 1176 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1177 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 1178 | }, 1179 | "peekaboo": { 1180 | "version": "2.0.2", 1181 | "resolved": "http://registry.npmjs.org/peekaboo/-/peekaboo-2.0.2.tgz", 1182 | "integrity": "sha1-/ELhOe/WmMb/KHCmsgwEfNmqKf8=" 1183 | }, 1184 | "pend": { 1185 | "version": "1.2.0", 1186 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 1187 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 1188 | }, 1189 | "pez": { 1190 | "version": "2.1.5", 1191 | "resolved": "https://registry.npmjs.org/pez/-/pez-2.1.5.tgz", 1192 | "integrity": "sha1-XsLMYlAMw+tCNtSkFM9aF7XrUAc=", 1193 | "requires": { 1194 | "b64": "3.x.x", 1195 | "boom": "5.x.x", 1196 | "content": "3.x.x", 1197 | "hoek": "4.x.x", 1198 | "nigel": "2.x.x" 1199 | }, 1200 | "dependencies": { 1201 | "boom": { 1202 | "version": "5.2.0", 1203 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 1204 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 1205 | "requires": { 1206 | "hoek": "4.x.x" 1207 | } 1208 | } 1209 | } 1210 | }, 1211 | "pify": { 1212 | "version": "3.0.0", 1213 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1214 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 1215 | }, 1216 | "pinkie": { 1217 | "version": "2.0.4", 1218 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1219 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1220 | }, 1221 | "pinkie-promise": { 1222 | "version": "2.0.1", 1223 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1224 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1225 | "requires": { 1226 | "pinkie": "^2.0.0" 1227 | } 1228 | }, 1229 | "pirates": { 1230 | "version": "4.0.0", 1231 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.0.tgz", 1232 | "integrity": "sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA==", 1233 | "requires": { 1234 | "node-modules-regexp": "^1.0.0" 1235 | } 1236 | }, 1237 | "pkg-dir": { 1238 | "version": "2.0.0", 1239 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 1240 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 1241 | "requires": { 1242 | "find-up": "^2.1.0" 1243 | } 1244 | }, 1245 | "process-nextick-args": { 1246 | "version": "2.0.0", 1247 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1248 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1249 | }, 1250 | "progress": { 1251 | "version": "2.0.3", 1252 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1253 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 1254 | }, 1255 | "proxy-from-env": { 1256 | "version": "1.0.0", 1257 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", 1258 | "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" 1259 | }, 1260 | "puppeteer": { 1261 | "version": "1.11.0", 1262 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-1.11.0.tgz", 1263 | "integrity": "sha512-iG4iMOHixc2EpzqRV+pv7o3GgmU2dNYEMkvKwSaQO/vMZURakwSOn/EYJ6OIRFYOque1qorzIBvrytPIQB3YzQ==", 1264 | "requires": { 1265 | "debug": "^4.1.0", 1266 | "extract-zip": "^1.6.6", 1267 | "https-proxy-agent": "^2.2.1", 1268 | "mime": "^2.0.3", 1269 | "progress": "^2.0.1", 1270 | "proxy-from-env": "^1.0.0", 1271 | "rimraf": "^2.6.1", 1272 | "ws": "^6.1.0" 1273 | } 1274 | }, 1275 | "qs": { 1276 | "version": "6.6.0", 1277 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.6.0.tgz", 1278 | "integrity": "sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA==" 1279 | }, 1280 | "readable-stream": { 1281 | "version": "2.3.6", 1282 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1283 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1284 | "requires": { 1285 | "core-util-is": "~1.0.0", 1286 | "inherits": "~2.0.3", 1287 | "isarray": "~1.0.0", 1288 | "process-nextick-args": "~2.0.0", 1289 | "safe-buffer": "~5.1.1", 1290 | "string_decoder": "~1.1.1", 1291 | "util-deprecate": "~1.0.1" 1292 | } 1293 | }, 1294 | "resolve": { 1295 | "version": "1.9.0", 1296 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", 1297 | "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", 1298 | "requires": { 1299 | "path-parse": "^1.0.6" 1300 | } 1301 | }, 1302 | "rimraf": { 1303 | "version": "2.6.2", 1304 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1305 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1306 | "requires": { 1307 | "glob": "^7.0.5" 1308 | } 1309 | }, 1310 | "safe-buffer": { 1311 | "version": "5.1.2", 1312 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1313 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1314 | }, 1315 | "semver": { 1316 | "version": "5.6.0", 1317 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1318 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" 1319 | }, 1320 | "serverless-offline": { 1321 | "version": "3.31.3", 1322 | "resolved": "https://registry.npmjs.org/serverless-offline/-/serverless-offline-3.31.3.tgz", 1323 | "integrity": "sha512-Nl42T+RMSYaI+AuSN/3bn2hIXFzU6l50Oiri6173xVoEEKeRdRwdMzBa83/YQA2DQgiIc4zGXHThhcpUVz0OPw==", 1324 | "requires": { 1325 | "@babel/core": "^7.0.0", 1326 | "@babel/register": "^7.0.0", 1327 | "boom": "^4.2.0", 1328 | "cryptiles": "^4.1.2", 1329 | "h2o2": "^5.4.0", 1330 | "hapi": "14.2.0", 1331 | "hapi-cors-headers": "^1.0.3", 1332 | "js-string-escape": "^1.0.1", 1333 | "jsonpath-plus": "^0.16.0", 1334 | "jsonwebtoken": "^8.3.0", 1335 | "lodash": "^4.17.10", 1336 | "uuid": "^3.3.2", 1337 | "velocityjs": "^1.1.2" 1338 | } 1339 | }, 1340 | "serverless-plugin-chrome": { 1341 | "version": "1.0.0-55", 1342 | "resolved": "https://registry.npmjs.org/serverless-plugin-chrome/-/serverless-plugin-chrome-1.0.0-55.tgz", 1343 | "integrity": "sha512-xs3aBh7MtfvmPUPTpIwAOtV+SdQ6Wf5x38kIJvNrDPtMOHD+TZa155CH+2iR7kIqhEsMWJe9dJa3xFvh1cqjLw==", 1344 | "requires": { 1345 | "@serverless-chrome/lambda": "1.0.0-55", 1346 | "fs-p": "2.0.0", 1347 | "globby": "6.1.0" 1348 | } 1349 | }, 1350 | "shot": { 1351 | "version": "3.4.2", 1352 | "resolved": "https://registry.npmjs.org/shot/-/shot-3.4.2.tgz", 1353 | "integrity": "sha1-Hlw/bysmZJrcQvfrNQIUpaApHWc=", 1354 | "requires": { 1355 | "hoek": "4.x.x", 1356 | "joi": "10.x.x" 1357 | }, 1358 | "dependencies": { 1359 | "joi": { 1360 | "version": "10.6.0", 1361 | "resolved": "https://registry.npmjs.org/joi/-/joi-10.6.0.tgz", 1362 | "integrity": "sha512-hBF3LcqyAid+9X/pwg+eXjD2QBZI5eXnBFJYaAkH4SK3mp9QSRiiQnDYlmlz5pccMvnLcJRS4whhDOTCkmsAdQ==", 1363 | "requires": { 1364 | "hoek": "4.x.x", 1365 | "isemail": "2.x.x", 1366 | "items": "2.x.x", 1367 | "topo": "2.x.x" 1368 | } 1369 | } 1370 | } 1371 | }, 1372 | "source-map": { 1373 | "version": "0.5.7", 1374 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1375 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1376 | }, 1377 | "source-map-support": { 1378 | "version": "0.5.9", 1379 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", 1380 | "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", 1381 | "requires": { 1382 | "buffer-from": "^1.0.0", 1383 | "source-map": "^0.6.0" 1384 | }, 1385 | "dependencies": { 1386 | "source-map": { 1387 | "version": "0.6.1", 1388 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1389 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 1390 | } 1391 | } 1392 | }, 1393 | "statehood": { 1394 | "version": "4.1.0", 1395 | "resolved": "http://registry.npmjs.org/statehood/-/statehood-4.1.0.tgz", 1396 | "integrity": "sha1-iih30T2YUKq2zod6VLd43w9DrNs=", 1397 | "requires": { 1398 | "boom": "3.x.x", 1399 | "cryptiles": "3.x.x", 1400 | "hoek": "4.x.x", 1401 | "iron": "4.x.x", 1402 | "items": "2.x.x", 1403 | "joi": "9.x.x" 1404 | }, 1405 | "dependencies": { 1406 | "boom": { 1407 | "version": "3.2.2", 1408 | "resolved": "https://registry.npmjs.org/boom/-/boom-3.2.2.tgz", 1409 | "integrity": "sha1-DwzF0ErcUAO4x9cfQsynJx/vDng=", 1410 | "requires": { 1411 | "hoek": "4.x.x" 1412 | } 1413 | }, 1414 | "cryptiles": { 1415 | "version": "3.1.4", 1416 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.4.tgz", 1417 | "integrity": "sha512-8I1sgZHfVwcSOY6mSGpVU3lw/GSIZvusg8dD2+OGehCJpOhQRLNcH0qb9upQnOH4XhgxxFJSg6E2kx95deb1Tw==", 1418 | "requires": { 1419 | "boom": "5.x.x" 1420 | }, 1421 | "dependencies": { 1422 | "boom": { 1423 | "version": "5.2.0", 1424 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 1425 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 1426 | "requires": { 1427 | "hoek": "4.x.x" 1428 | } 1429 | } 1430 | } 1431 | } 1432 | } 1433 | }, 1434 | "string_decoder": { 1435 | "version": "1.1.1", 1436 | "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1437 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1438 | "requires": { 1439 | "safe-buffer": "~5.1.0" 1440 | } 1441 | }, 1442 | "subtext": { 1443 | "version": "4.4.1", 1444 | "resolved": "https://registry.npmjs.org/subtext/-/subtext-4.4.1.tgz", 1445 | "integrity": "sha1-L87JRd5CkoPD0YsVH/D6HxuHrsk=", 1446 | "requires": { 1447 | "boom": "5.x.x", 1448 | "content": "3.x.x", 1449 | "hoek": "4.x.x", 1450 | "pez": "2.x.x", 1451 | "wreck": "12.x.x" 1452 | }, 1453 | "dependencies": { 1454 | "boom": { 1455 | "version": "5.2.0", 1456 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 1457 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 1458 | "requires": { 1459 | "hoek": "4.x.x" 1460 | } 1461 | }, 1462 | "wreck": { 1463 | "version": "12.5.1", 1464 | "resolved": "https://registry.npmjs.org/wreck/-/wreck-12.5.1.tgz", 1465 | "integrity": "sha512-l5DUGrc+yDyIflpty1x9XuMj1ehVjC/dTbF3/BasOO77xk0EdEa4M/DuOY8W88MQDAD0fEDqyjc8bkIMHd2E9A==", 1466 | "requires": { 1467 | "boom": "5.x.x", 1468 | "hoek": "4.x.x" 1469 | } 1470 | } 1471 | } 1472 | }, 1473 | "superagent": { 1474 | "version": "4.0.0", 1475 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-4.0.0.tgz", 1476 | "integrity": "sha512-qaGDf+QUYxgMYdJBWCezHnc3UjrCUwxm5bCfxBhTXI5BbCluVzmVNYzxvCw1jP9PXmwUZeOW2yPpGm9fLbhtFg==", 1477 | "requires": { 1478 | "component-emitter": "^1.2.0", 1479 | "cookiejar": "^2.1.2", 1480 | "debug": "^4.0.0", 1481 | "form-data": "^2.3.2", 1482 | "formidable": "^1.2.0", 1483 | "methods": "^1.1.1", 1484 | "mime": "^2.0.3", 1485 | "qs": "^6.5.1", 1486 | "readable-stream": "^3.0.3" 1487 | }, 1488 | "dependencies": { 1489 | "readable-stream": { 1490 | "version": "3.1.0", 1491 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.0.tgz", 1492 | "integrity": "sha512-vpydAvIJvPODZNagCPuHG87O9JNPtvFEtjHHRVwNVsVVRBqemvPJkc2SYbxJsiZXawJdtZNmkmnsPuE3IgsG0A==", 1493 | "requires": { 1494 | "inherits": "^2.0.3", 1495 | "string_decoder": "^1.1.1", 1496 | "util-deprecate": "^1.0.1" 1497 | } 1498 | } 1499 | } 1500 | }, 1501 | "supports-color": { 1502 | "version": "5.5.0", 1503 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1504 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1505 | "requires": { 1506 | "has-flag": "^3.0.0" 1507 | } 1508 | }, 1509 | "to-fast-properties": { 1510 | "version": "2.0.0", 1511 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1512 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" 1513 | }, 1514 | "topo": { 1515 | "version": "2.0.2", 1516 | "resolved": "http://registry.npmjs.org/topo/-/topo-2.0.2.tgz", 1517 | "integrity": "sha1-zVYVdSU5BXwNwEkaYhw7xvvh0YI=", 1518 | "requires": { 1519 | "hoek": "4.x.x" 1520 | } 1521 | }, 1522 | "trim-right": { 1523 | "version": "1.0.1", 1524 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1525 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" 1526 | }, 1527 | "typedarray": { 1528 | "version": "0.0.6", 1529 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1530 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1531 | }, 1532 | "util-deprecate": { 1533 | "version": "1.0.2", 1534 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1535 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1536 | }, 1537 | "uuid": { 1538 | "version": "3.3.2", 1539 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 1540 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 1541 | }, 1542 | "velocityjs": { 1543 | "version": "1.1.3", 1544 | "resolved": "https://registry.npmjs.org/velocityjs/-/velocityjs-1.1.3.tgz", 1545 | "integrity": "sha512-7cC2jgKt6AuSaAaJvvTkFFLuYJzKWTYHldPcRVCqR8e6bbx8iOweSTMcTjOmY/RedgINrlWG5m/SZxHJGna8CQ==" 1546 | }, 1547 | "vise": { 1548 | "version": "2.0.2", 1549 | "resolved": "http://registry.npmjs.org/vise/-/vise-2.0.2.tgz", 1550 | "integrity": "sha1-awjo+0y3bjpQzW3Q7DczjoEaDTk=", 1551 | "requires": { 1552 | "hoek": "4.x.x" 1553 | } 1554 | }, 1555 | "wrappy": { 1556 | "version": "1.0.2", 1557 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1558 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1559 | }, 1560 | "wreck": { 1561 | "version": "9.0.0", 1562 | "resolved": "https://registry.npmjs.org/wreck/-/wreck-9.0.0.tgz", 1563 | "integrity": "sha1-HeY9SbsHuU/nGIZLi+YxduYzMew=", 1564 | "requires": { 1565 | "boom": "3.x.x", 1566 | "hoek": "4.x.x" 1567 | }, 1568 | "dependencies": { 1569 | "boom": { 1570 | "version": "3.2.2", 1571 | "resolved": "https://registry.npmjs.org/boom/-/boom-3.2.2.tgz", 1572 | "integrity": "sha1-DwzF0ErcUAO4x9cfQsynJx/vDng=", 1573 | "requires": { 1574 | "hoek": "4.x.x" 1575 | } 1576 | } 1577 | } 1578 | }, 1579 | "ws": { 1580 | "version": "6.1.2", 1581 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz", 1582 | "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==", 1583 | "requires": { 1584 | "async-limiter": "~1.0.0" 1585 | } 1586 | }, 1587 | "yauzl": { 1588 | "version": "2.4.1", 1589 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", 1590 | "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", 1591 | "requires": { 1592 | "fd-slicer": "~1.0.1" 1593 | } 1594 | } 1595 | } 1596 | } 1597 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "scrapper-lambda", 3 | "version": "1.0.0", 4 | "description": "When it comes to AWS Lambda function , they have their own limits as follows ![AWS Limits](./images/aws_limits.png) So , When you try to use Puppeteer your deployment package size(unzipped) easily go's above 250 mb because When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API.", 5 | "main": "chrome-script.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@serverless-chrome/lambda": "^1.0.0-55", 14 | "chrome-launcher": "^0.10.5", 15 | "puppeteer": "^1.11.0", 16 | "serverless-offline": "^3.31.3", 17 | "serverless-plugin-chrome": "^1.0.0-55", 18 | "superagent": "^4.0.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | ### Running Puppeteer on AWS Lambda Using Serverless Framework 2 | 3 | ### Instructions to run locally 4 | 5 | ``` 6 | $ npm install 7 | $ sls offline 8 | ``` 9 | 10 | ### To Deploy on AWS 11 | 12 | - Add your profile in `serverless.yml` and run 13 | 14 | ``` 15 | $ sls deploy 16 | ``` 17 | ___________ 18 | # About Project 19 | 20 | When it comes to AWS Lambda function , they have their own limits as follows 21 | ![AWS Limits](./images/aws_limits.png) 22 | 23 | 24 | 25 | So , When you try to use Puppeteer your deployment package size(unzipped) easily go's above 250 mb because When you install Puppeteer, it downloads a recent version of Chromium (~170MB Mac, ~282MB Linux, ~280MB Win) that is guaranteed to work with the API. 26 | 27 | ## Solution 28 | 29 | Best solution I found for this problem is using this awesome Serverless-framework Headless Chrome Plugin i.e 30 | `serverless-plugin-chrome` 31 | 32 | # How ?? 33 | 34 | ## 1. Add the Plugin in your serverless.yml 35 | 36 | ``` 37 | plugins: 38 | - serverless-plugin-chrome 39 | ``` 40 | 41 | ## 2. Install Following Dependencies 42 | 43 | - superagent 44 | - @serverless-chrome/lambda 45 | - puppeteer 46 | 47 | ``` 48 | $ npm i superagent @serverless-chrome/lambda puppeteer 49 | ``` 50 | 51 | ## 3.Exclude Chromium Dist that comes with puppeteer by default 52 | 53 | We can do this in package section of our `serverless.yml` 54 | 55 | ``` 56 | package: 57 | exclude: 58 | - node_modules/puppeteer/.local-chromium/** 59 | ``` 60 | 61 | 62 | ## 4. Create a new file and name it chrome-script.js 63 | 64 | Add the following lines to chrome-script.js 65 | 66 | ``` 67 | const launchChrome = require ("@serverless-chrome/lambda"); 68 | const request = require ("superagent"); 69 | 70 | module.exports.getChrome = async () => { 71 | const chrome = await launchChrome(); 72 | 73 | const response = await request 74 | .get(`${chrome.url}/json/version`) 75 | .set("Content-Type", "application/json"); 76 | 77 | const endpoint = response.body.webSocketDebuggerUrl; 78 | 79 | return { 80 | endpoint, 81 | instance: chrome 82 | }; 83 | }; 84 | ``` 85 | 86 | `@@serverless-chrome/lambda` provide scaffolding for using Headless Chrome during a serverless function invocation. Serverless Chrome takes care of building and bundling the Chrome binaries and making sure Chrome is running when your serverless function executes. In addition, this project also provides a few example services for common patterns (e.g. taking a screenshot of a page, printing to PDF, some scraping, etc.) 87 | 88 | 89 | ## 5.Connect Puppeteer With Headless Chrome 90 | 91 | - import chrome in our `handler.js` 92 | 93 | ``` 94 | const {getChrome} = require('./chrome-script') 95 | ``` 96 | 97 | - connect it with puppeteer 98 | 99 | ``` 100 | const browser = await puppeteer.connect({ 101 | browserWSEndpoint: chrome.endpoint 102 | }); 103 | ``` 104 | 105 | That's all you can now use puppeteer on aws lambda 106 | 107 | 108 | ### To Test It Locally 109 | 110 | ``` 111 | $ npm i serverless-offline 112 | $ npm i chrome-launcher 113 | ``` 114 | 115 | - Make the following request (replace `{{URL}}` with the page you want to get content for) 116 | 117 | ``` 118 | curl -X GET \ 119 | 'http://localhost:3000?url={{URL}}' \ 120 | ``` 121 | 122 | 123 | 124 | ### To Deploy on AWS 125 | 126 | ``` 127 | $ sls deploy 128 | ``` 129 | 130 | - Make the following request (replace `{{URL}}` with the page you want to get content for and `{{lambda_url}}` with your lambda url) 131 | 132 | ``` 133 | curl -X GET \ 134 | '{{lambda_url}}?url={{URL}}' \ 135 | ``` 136 | 137 | 138 | 139 | 140 | -------------------------------------------------------------------------------- /serverless.yml: -------------------------------------------------------------------------------- 1 | service: scrapper-lambda 2 | provider: 3 | name: aws 4 | profile: 5 | runtime: nodejs8.10 6 | 7 | plugins: 8 | - serverless-offline 9 | - serverless-plugin-chrome 10 | 11 | package: 12 | exclude: 13 | - node_modules/puppeteer/.local-chromium/** 14 | 15 | functions: 16 | hello: 17 | handler: handler.hello 18 | memorySize: 1536MB 19 | timeout: 60 20 | events: 21 | - http: 22 | path: / 23 | method: get --------------------------------------------------------------------------------