{"_id":"puppeteer-extra","_rev":"51-b24b55c79919d6133d70bd862fbb07f7","name":"puppeteer-extra","dist-tags":{"latest":"3.3.6","next":"3.1.16-next.149"},"versions":{"1.0.1":{"name":"puppeteer-extra","version":"1.0.1","description":"A light-weight wrapper around `puppeteer` to handle more advanced use-cases, most notably the abillity to set custom user preferences, a stealth mode and to allow flash content without confirmation prompts.","main":"./lib/PuppeteerExtra.js","directories":{"lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","dependencies":{"deepmerge":"^2.1.0","mkdirp-promise":"^5.0.1","rimraf":"^2.6.2"},"peerDependencies":{"puppeteer":"1.x"},"gitHead":"ce374997924972b52905cc9c3172676aa3af3c65","_id":"puppeteer-extra@1.0.1","_npmVersion":"5.6.0","_nodeVersion":"10.0.0","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-wfUhFwA8+gHqyRZZ1NcbbBQeKfLuj/02HLOnNuHFqLsP+KOyVKCHQ51XRj3UVLPoA7RHBpQXeRgKXr4eLbcgzw==","shasum":"86ce3e9900a6e4d973713f346ef31959fdcf260b","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-1.0.1.tgz","fileCount":4,"unpackedSize":17926,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa+z3lCRA9TVsSAnZWagAAxosP/11lp377vcHhzgPSmXXf\nGcnTbvZbI0vePoqn7dtwMmhulzKbO84745LeA6xPgoV5ofSYMto5VoM4XW2s\nd7YtkqTUncoB4b6ZoxVVX5ddsOalVmJapypUE4YCnl4mH4sAuPoYBu4MSnk0\n0Dbc0ax7sFm/5/C/nDPchiy3c9Zm7VJtexMdROTHSCDXRUAn669jioDMCh9w\nkY6XWhf+Lm55vMMoFTVR4YFjIHVZeA1boZT+J6WS/p1R33vWSZvg/3GEoUoO\nIj4JzV80irKYUyYByA944Rc/MUyA8pYW30D/upWWNdT/iNttl6rEybBvWY6a\nvOjDaJfuA4W6IhqqGT2MLoTdER19Ja1YJ2+V9TEzk7uJhD2KSnMBs5QXsFb7\nlzgg6udyLN2/otuTwJh4LWPslSu6zF62Ok/napvuqxCLv7oneHwhiE1fp8bj\nqiJD8Qiw4TftAA38yKyiQsQULXkqhm+FukTSD/ZtmyhpKMZRvPOvx7n0DLph\ncFl+/i3ivsP7xW5hBIQQcCunznXmXmmpjjwG8S1luQYS/XHlHcvs1TzxjM4R\n693cFwjGxe1YeTNtvBtXcdA1+Catwn6VRlTddjhKKENj+nw02+g2rjNb6X3k\n6dm5Vwb4cNBBxw9KSbH60fdb30SYkl/l5VxFYRkAPkylArAxHILkNHGIuga7\nbjdD\r\n=mZn+\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDLHP0bROevVtNJg61MO6HQsTmlKnChWfbsxDnby/fEBwIhAMRMfpt7t5HJhmKs6+rDju+2bEul71xsHdjPWkp+sdAR"}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_1.0.1_1526414819361_0.9125694300567027"},"_hasShrinkwrap":false},"1.1.0":{"name":"puppeteer-extra","version":"1.1.0","description":"A light-weight wrapper around `puppeteer` to handle more advanced use-cases, most notably the abillity to set custom user preferences, a stealth mode and to allow flash content without confirmation prompts.","main":"./lib/PuppeteerExtra.js","directories":{"lib":"lib"},"scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"author":{"name":"berstend"},"license":"MIT","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","dependencies":{"deepmerge":"^2.1.0","mkdirp-promise":"^5.0.1","rimraf":"^2.6.2"},"peerDependencies":{"puppeteer":"1.x"},"devDependencies":{"puppeteer":"^1.4.0"},"gitHead":"d595e51f001579ac6fd69bb32b2b8344be495638","_id":"puppeteer-extra@1.1.0","_npmVersion":"5.6.0","_nodeVersion":"10.0.0","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-BNhSX1RUsmPUM2JIAZ8rcYUDAqc5QZ41mFeNHkZeBH56D//28nXA7xQ6ElMfw22pTAOAegYwFhkW1sx7S0QW5A==","shasum":"f969813eb78ab7399c53255f0a1a9bad6ec48519","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-1.1.0.tgz","fileCount":8,"unpackedSize":27037,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJa/xFCCRA9TVsSAnZWagAAVEoP/RUNspy5bK33CaS2igfl\nBXyrMkP7vTu1UZu0CM2M5gHwZV3RRtAN8XyLQDVdK29LqICxCsq2uLQkxf4O\nUQZXVA5DYGUHJxpkD8oJuqxsKbwW1gECyLgSZsLB4xfsEzsVxCgWcSrUx2oS\nF09Lo+xa3KM+zVuILh5H0mmceZwTRHTWZLNQ2NGV8GfPKJOVzbj0u2ZusX9Q\n8Wz//Q/TW48Ec3pCZ3FnhmeWRMbqfuhggMYW/vhpJU2Y0Lxe9s4+/twNrO+P\n34MP8GDiFxUxnX2U8M0JgtX2L6o93AI+f7T5Cu37btu57A+YH2veb8N1QIQ5\n7mBlU1v54vuP+JjGxHZreTGfFw63MUJlkpXj2V9DmTfg5M2MEGBF9/B9aqWA\nUt+0wse9gyQSsPXTRrG2yoOFCRUDTofVdnSwzs0BDcsrYVLehMlhzvy0kx7a\ncKO1MlHf5leqXNMZYaSd+kblpnn/AoReg2SVWBiJ9Ttew8LNZ/srHs3W6e20\nPxo8y1D6TDykMHTBwXsjZ1PuA9lSr99w6ZmIlE7xmZG8s5Bwswe3+qdMRQB9\nYAHe1PhM3Ri3kerXNFi8LU9aiW67VgJKs5/KXDIXAqtnFabPRShcSUm6Jlwg\nEEuI8oQgk4y+iRdvKI3t0hJ4mjg0plHkpInLe7IPtCOZRZpj1pGeVqLjVxbe\nQIkF\r\n=7bmA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIBhp4Z1qH47mz7yVkqhtSoxSXE+VMDQ0MnWKfvYJGr+VAiEAh2uidTe+KK8VJl3MwDh4JcQ7RgqSH6LvsRhhwg8IEbU="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_1.1.0_1526665536519_0.7460177636778456"},"_hasShrinkwrap":false},"2.0.1":{"name":"puppeteer-extra","version":"2.0.1","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.1","dist":{"shasum":"ae0a53d20ecdfe9f8d8632af430ea4062d10046b","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.1.tgz","fileCount":6,"unpackedSize":20298,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbDXhBCRA9TVsSAnZWagAA4PkQAINMSTK7Jd5Ev6DF3Q1S\ndMIHi+4JBle0IqCERYVkpVKu8p9vX1CZjyl5yAYahDOle6mNgf0I+Ta+5Jdb\nCUfdA3PKu2GsL+0EznZDVElxjM+9u6ftKLouc3qyYM5T3P/eeAB5zI5GKddq\nlf0Yzp4MFr2yx/yD7D2HGQu/08B8m6qB8W9Yhs97U6VwOemDzdhUQT2cG2eQ\nz1vBUTPyT9zqGP7lhZQ53Zi8DEYc48DEC39yukqXuuqrsZYPyH307RDP0KGZ\nXGszMKcnJSX2a4vMIpzXLiqlfRkyahwbvD4l4brLFHkzCNUqjlH4KK9mzR0/\nwBry388UpAulmL6/+Vw6BBfa57gKynsycXmam44baX34tTjGozzjTv/G1PbP\ny96RoQcDBKYjXrEVc2Tj/MFbEcjWvd+IhqP3WoiMwAzuVKgy0DqvqZQ//hGj\nqynykcOQcyOeG3Wh12iA/85vWC7/uNwhe7k/eqCh2LWI7OttMwRsPJyTiqA0\nvgWO2ObJJluVNklmNHdLE/D50oh9ZS2qUboRc992MCmho/kks5dj/pbk1EPR\nqVpxJHrmz2mLaDEwylswSloayw8yTy0ch7FW6f3aq15qpWSPSxBo13ils/BC\nPPtsSAW6SbrWOAULrPPtyMP8dC2BqOK+aGSuspVHIs8/STm+ajv1WWc1KfoG\nlsPf\r\n=a6Ni\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-PQ2KXN9l1pAgILhxRfA1sHYzNCbWVVyhL/T4TvyjxYBOBnjZaSV5ldCwFrKFyMMUTR+zWOOZ5OfS/EvUeJgi1w==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCzTWRKdTemv4Of9bproF8SSpiqI9RQKEDYuNd/eAkDiwIhALEzfeeHIcPyiWzGOmOtfauWQ9XO89xgG3fpLKGaQh+1"}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.1_1527609407958_0.9957448371843101"},"_hasShrinkwrap":false},"2.0.2":{"name":"puppeteer-extra","version":"2.0.2","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.2","dist":{"shasum":"21e6b1fb0c2d6ca39897026682b07dab8d4750ad","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.2.tgz","fileCount":7,"unpackedSize":23031,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbERX8CRA9TVsSAnZWagAAAwgQAIe7HpcsPrJiZiBPX9Jz\nJK+lrmdN37PfqxUXf6SfTqf/6y/VIgc1jEAX3M7eERXE3MUWFVZ4fuHqoce9\nxZZQu+p1MxuWAHZPE1ZF6Suz7ljkFxnIFjHskVYZEzGFJ7uT3LfvrsNB2mBr\nJAjcnaNIBOfBlvF/Pw9ISbuegi1/E1ByohgDAz2gQ8LeKrkva2gJR0Brm19A\n5UGC+u1EjNeOtc5iUMJ4nYw3v6t+H69GSH5pJQQEwxS8l/1tL5hIOFeL8jCn\nbdiE3MuEd1RZHDjjzsM+mnlIJenx9c8BPkS8q1jCHGRDf6fgoIv1q1IUiuVh\nO5jzoOhLSNpT8Uk4n4zZyHa249R7ZjXvjjKgYtnRqimWHhKC9NLm83SWMg3s\nQoRY4q2pPkorRKtQwRJFXhSOjKPdt1Vse5QzLuvyRCFySAGFT6noNrpFAaYB\nBD0yDSpBhdQ0p+fT2KayksKf2Ki9vTEcZKXNlFrHQpnNRvL821hklACcJpZo\nME0XZwYocAis6SjZbbNbpkXp/SUQ9XVq7IP58CmSfY6CsElviq3qCJ0okR4d\n9xPlmDlr7RS9QR0RttpXCP3aS0ZwT8shof+eJv8eH3lUxt/cSYy4iPtyEZl3\nuE67/BYjgNsz2KlnosQMS8XPHrX5R1R789Lu2CwQPm92uPDEf4LdKTKACEbY\nIbmY\r\n=J7dl\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-Gui4KY0RSaqV8pHM6WaoYty3DG0FIzqZqGFFf2eFYrL4vjnf8/5oGT07iRSdVzFJ+yVhe9oXHBrvibXE+BK3Cw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDny4cu1lM8nGPygCMQXcC1AAEyunkeuLURiwciSw3AtAIgTOaPOxDafCPyrzlLDbiK3bwy3x2kvwshVxWwcp/bea4="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.2_1527846395253_0.12121301008949548"},"_hasShrinkwrap":false},"2.0.3":{"name":"puppeteer-extra","version":"2.0.3","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.3","dist":{"shasum":"e8a52690f75f511f2b6124d7eac003aeeecc83d5","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.3.tgz","fileCount":7,"unpackedSize":23027,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbERnYCRA9TVsSAnZWagAAOggQAIe8rVRqztSAB9cK2ICP\nMTXxgxE+6mt9KTuqnzIKPJqnJ8Ihph9XsZLSky29mucyJVNJqFxhN7YoQUfT\nBH667sSbx46yMyyzWhVa2BdwgUkdXrsEJeN/diOSpAoLxzeo31SIuObtgXyp\nF8hM3AVVMzFeKAGhbetFlQp0L769auKx1ETGCJjXPy6LLsNw4PSDOHl+2Oyo\nLkJMJL7qSsuIfxPJxmK+NoSBlIjL0Wun7pqQ8c3ATnhKZG2116Z1brKbzYlg\noZfjI1IU4spYpb88Zk3FI3+7zL6r/+ctg7BmZH/O4BJBY0KzC0F4ggzAn55L\nfsdZ9r4ICAD1WSHYmdELLXzLO56buC6TV4lmqD+AXoZHodw2kDTP2ylwY9lE\nJgJ1SeGfLDHP6ySO8xETLeeLKQyOjVOlFNYJcBTTBdT/YKtHWTUFjLZ2PWJr\nyFovJSG3WdDCMyAYy4ydepxNnRrGJu4IHUdVIMt4jYeRrIfKoJy1Ly2Dlqvo\n8koetCzCTN9ZuQ/MMSZeveqBrOruqkpnqVbkBN/MEfGVsUSGgqiI/cvu1vpV\n4xxgKOMKD6aLmlWvdGPBVG6lzrV2yN8q55eVmU5m6wKz38bWPF9chR+XH61D\nji/QFfbsaS+OeBu364gznga/aYbSuWbGriO7IUYq1sUK3Kl0P9O1NrtOHIa4\nHp9N\r\n=z7zD\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-wQHX/PgBFXnRzkQs303Q7WAadidLcVluhLqfpH0xnS/JOXnQf9Bg1jil1mDe7BBDXGZVUo8uD0aVyVvM4kQZ0Q==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDlJEa1VIvKiOXMRt82iF6xdequBpzEoBG3ooQdGV5X6AiAc+VhR4Fx6Id9mX02MihsQXYy4N0Hf/WMr4TxGvVcMiw=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.3_1527847384284_0.21232596773013568"},"_hasShrinkwrap":false},"2.0.4":{"name":"puppeteer-extra","version":"2.0.4","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.4","dist":{"shasum":"d66f9ab833c31d7861c212f55222172d7e3d968f","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.4.tgz","fileCount":7,"unpackedSize":23027,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEqbrCRA9TVsSAnZWagAA/QYP/2IMIzKMKjM3+Gsmk6mN\nBOwMbjj2LSfaNRP63BDYwtDsrWTdLZeq85WIg5msaz6iuZUayQPej1Q+bDGh\nbmDDtYk81/MlOidgGgpJC/hg9g1UN+KAvbi7Tjrvup9gZLKf7k00Uo7iaUQA\nOBrhKjRZwq3j0dbjZTjTpbsbL7IuqwKMsEX47MN1F/fvisp70kVKsC+HQ+Ns\n9Atn/6563k9ytMkX3IJOwam2JZHJdPlR8iwY4aALbSCk7BO6kWWXuduYCfX9\nq3tY4BvC17yhhuleMAK2IKXJeTyxMBqRRRTc0ERHH963CeGwrHAYLvSS6kvK\nl0RUH96IMw0LAP+rXBzXsp3khAqQmmKNzp4zI5ZkGILzxlJS8e3IUO+w+p6L\n5KZuQbgeGGm7Qzpn0gNwsl9SWrWDILEU672PAwNxF1QJJxyU4Ok4P1FBM8NG\ntQ1xwG9z4Pi25uZMjvPXMGqzc5PfWrE1ufl6P7eGz6oosWRYK8U5YAxZAaEm\nU3iOQDsWzwU7IozHDeaZQKRxyjhy8cDnnW+zWQLXxk3gO55oQn1xzcL/twk+\nsEnEz3844yIclO6TuZ88zlpTPEW5HvNZEZF+YlCawbZ0zuBXKK1pMzgzo7HY\n4UIxEPAzhrHl0Vhke99XWLn6+V5xCy5yjA7g9uVctskltuuJ2Hg3u+zMUgP5\nAvYQ\r\n=PV2B\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-VTpgiAnAlvqbCAjuE8WcuUW3q0/Ja0dofIp+Fm0RSOS4qxb/evmzoDhxmY+1gYxjunmssyeOdqdPOgjX6l9cyA==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIE2wac4pYCDr1ADbIRapQ7lIBPyYOBlHwgbVBr5oqNVnAiBoDijimfWZr37qRTf/ZeTHfjgsfDnyAi2lrzM8rZHfSw=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.4_1527949034656_0.6539927332003077"},"_hasShrinkwrap":false},"2.0.5":{"name":"puppeteer-extra","version":"2.0.5","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.5","dist":{"shasum":"caee2fbc1b8117e0edfa9162953f2dd51cfa26cc","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.5.tgz","fileCount":7,"unpackedSize":25222,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbEvguCRA9TVsSAnZWagAATwMP/jzIV+SjbluXj0wyhRp5\noXRe6gFz1oVUTUIkoSUiUuyx4GAFkfncZF4NiLPEJHR/M2ZGSc+P+5ZI03Z6\n20EPHtTfi3QvDxOJAN91qklDNZ8OApycX8rTi5Awwd2+5LB8enpyR5IL8aDT\nKRiW7THFTva+5AxMuKwzBsVDcdQ2whmfexw6vKW2KR3Nhuf8h4Ntj6LnWCyl\nkFOTrCfr03nxw7XAlZUsHbKcQ9Q+f5UlxUH77l+t4E67iESfNGGcEaoWNM5x\no1xISvSzRk+NohamS9SaCmPhb501MHCFuqs13NzSf7c+KRVCaT6RY74jlC4O\n+fyzHyn4fKIUa1zEYcH3PuPC0EPod9DKWO9x6ZhIPRVtGU3qk1galelzmhNj\nJ9neKUF9kI49rPrHnrnRtM6uoYlTcLQJXMjnBgf/aOTi0g4/tSWGJUaXOIiD\nqKE2tPBarpBuK8wh3NBwuz6cc/SiWeO14U8nRS1tUfU2xqI8A1FnaHVTM70A\nDCqMNwHL1/Nf9ednQoIYSob2THUaw6MO2SbYU0aQkmqhecAzwvFwID8uPsSz\nNvZWhfqugZjImbZAadZ5a/Erd94xbtDxcJTDroHQ3oKSITUiBLbhaJfK/20q\nloJBH5mkN8sAbi7LPFjW6AD7fRGxLRoRD+4QBROEOVfXrUDfHtuW9QeV1T83\n2GeU\r\n=sFfc\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-HDlmtBe0qDR/sOz4n+2w4MZtWUXLhhva/45uSCR1YkaiD54vXGya+Z5bWsbgpLCpqRuCldqkoiFFAinMjuvWkQ==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHTyb2yUYz/l8loPXBQH0J2l4Z0SL1Y18+1BYoWc/6RLAiEA8tgIuz99J0OHepDo08TKjE8ptB3u3abl/tdmG89/CGM="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.5_1527969837440_0.3238773234996637"},"_hasShrinkwrap":false},"2.0.6":{"name":"puppeteer-extra","version":"2.0.6","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.6","dist":{"shasum":"77c15d88cfcb24ac122bbd8b351e203d8f14b945","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.6.tgz","fileCount":7,"unpackedSize":25296,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGASiCRA9TVsSAnZWagAARSsP/16Xy+aSgcNjzYJHwZtl\npIvp1HHN8IJtXIko736/ebiPo81Yz1tBBXbpuxn3meBRe8g7VqZioaaDS8aA\n0pgq4P8OaE/hxTfmsEzEljjUGfrEz5A3kbShDvHYFxQsSCGjDzMleLtC/QCt\nH8sqQEZPZcBZeEqcx4C1qUxQgsLE7Hgzn34TLFp2a8Z1nWi+ynHjjVVPR7BE\nFpOLxwps0xl3ej5YHNJCzgp44KzhTkp2lf+eivIWofM9ouTYehFNCAgpUJzf\nSA3lodalh63umKZQIvMgl8yiIfCRONINOSQYJ5/kAqERf8SlqGZIXoc0lxJy\nkLqfkSKkAsbT9Xx9aduqe6vM3RZtx99ZGoBODoM3T7uwvfMUAp+oK+V7o/+f\nNikiaCZKDUo3UmInlLQ1ckMZ9dUWI65TpW7Z/giMBU6XwGvl7Gmpo/UG/tIN\njr33gNltmJc6LI/fHglLFHdUpVVfm64S3qsmk0XeQsh2iO0rZSxWsxffmG0z\nYEVMfqEa9GMhUmVUoRe+aQyTABuBLMhfBbhE+eacBj7KbnelxvLdxhNp4ukr\nqWsFXPFY1CgKluW1ETv+KCKl1XD3hoDkYlZwpd9pDBZptIbTrshLa0nz5T2Q\nt62M7yGrUqaIbOpdfdNWtO2kzDar+gahcccyjUY+LYB5A/pL1Otfu97KXxyX\nWvWr\r\n=giNR\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-NJCNrJBtm39JneyWgs5b6qC4Qay/7M74qqzp1F6P+3yCVTVhjiTOwkvdpuYnVPG306sShya8TBnFE/EQwB2FWw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDlviW/gAPOQdRZBnQo99EU3+8Gz1fLxmIXZwyrzYu8nQIgCsQprm3XH3qjUVnA3h+vQax6FwKfDJGqzgnvGaPB7kQ="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.6_1528300705378_0.1243929141722786"},"_hasShrinkwrap":false},"2.0.7":{"name":"puppeteer-extra","version":"2.0.7","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"_id":"puppeteer-extra@2.0.7","dist":{"shasum":"aae32b5c80eb83395f149cb0e533a442ccbf102b","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.7.tgz","fileCount":10,"unpackedSize":35059,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbGIH9CRA9TVsSAnZWagAAq1wQAJixcYmOxkzoC4Om6kZP\nhRsCOFlNHXspdiVwRSDv3qTR0mIcRlMdH3AwrUktkWVUBJMwQB3TfkRw1QkE\nVmnOxZWBGbROSjHcQYiBbqmBxFyPuq00mLDeVj1JDCS/+2UAW7JP1y4Gp/6i\n1CqPDNrxPzsFiJxpdy4TXHJNfnpvFAU7IleBLnwzmBCg657lNUGgWVZYboDd\neUMVhPuzUv1/UoyESvQ3u5nrV4BuaEP7WrQy4zTgBuYv2uyl4qj4pvjsJl2r\nhanjxg9+0zMpIeB5LQaJo+P3lcSk5Sjmtmnfv004RoTDbavqZPbcGfHDeJ+H\nN3SdL+FQzt7MlyUOes6ySkJ2psTc3WvYZpxcSDtbtUWv1AOVGxSvFEZLlxGV\n+M8Z53rW3ZqJLhofr/dZe4iLaMFfUPLlpJD3fk4BNAU6fjqglg1zP5/vxePY\niFZMPyL630ybYn+ewH51o9IHTLV1geTFKhT/cA5gFkYIBCt3XvEO8lPkqnd1\njB7FOKDuT4LTppG2SJxq8LKkbO9eF6TSLQYi3hNivu8/84SJXblhELi9MIpp\n7hatWhIj2ImCjFx5kZT6A/bhap3jRrzDI8U9oC35+dmWeRrBFeIhzk2Ybv17\nM0T5FOvUTBfhcYSL+2X+LVJ654fi4jtRqcq8pr3nc1Ex/g6mlmndXkMEvXAs\nLQ2I\r\n=obgE\r\n-----END PGP SIGNATURE-----\r\n","integrity":"sha512-HXkZ3AYp3fe6DTlVJIKQCrmihN8+pPmObv2F1I9Yvup279msAWnEb9kojOkso4UAaXtYuDWQ3FzcIxTKICx7Qw==","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG8Y6sipa0gfwXKEyA3bg4/mOZa2k7bWraszYpp9NRzOAiBUO9vAa/GTC5ctC5wv7a8fCQi5by44os1MBsRoLA347w=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.7_1528332796716_0.3006102007120106"},"_hasShrinkwrap":false},"2.0.10":{"name":"puppeteer-extra","version":"2.0.10","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"peerDependencies":{"puppeteer":"*"},"bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@2.0.10","_npmVersion":"5.1.0","_nodeVersion":"10.4.0","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-/1j/ma/+w+6RIsGr9voc1+DyK9Ykru5MjetEOwopFYqR6d5JfR3DQooKEW5Gjt436/7DhiUX85cOhnSwaHZ/cg==","shasum":"3389365a7256d8a9d143ed0f1e36d58accad98c3","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.0.10.tgz","fileCount":8,"unpackedSize":35128,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbeGMRCRA9TVsSAnZWagAAnBgQAINkCAxgbvrhmw81FSMA\nDFzDCDaGc0Gs569BP5pughbnLt1JAEoAaGx5eJ/ZuGidinDVSWsCDIBgocFn\nUy9XmmJB+MAlvy1zgvMlPRKM8Biuz46RU6QXY2X7C5pPypgQgRxjP/xjTd3L\nPBiOdKXEekaEq2AT63ajjerjYs5bRUXGDviBijd5DRBcw1TPSMbR5P1hcEQL\nedBAEObMMxtFq8rspKiY7oIyHj9vDDaZ9J4LUEtiqwD2jF65X2zR1OnH31rj\nPac5tiKO6vHSVng8tyJW0BpqwHhJvBIWOjZ4iW2H6xU08Ws6NX5a4uUqI5S4\nryPyU0Hn01f34/d2q04QlFRf8lM8ARTJPIUjDQr9pu6qQvbZvMd0eJlA/ScB\nbWmgCo8Qllfl1nXsgHQnnkGx29jiUJ9HiXsF467QLA7l9/ms8egQdb02/hrL\nX/83vuhLd9Eu7/rlwcmKdMNVw7b7FZ53QGFRsxWdJtoxR/OxPgv84KfIh1cj\nynbyGND91URLaG5B9NVpdffAwQ8gy1ZNQGIivhpHS7isfl22aRTFDRkI+jrJ\nbAS6skbDojaX2uraIBP4DsQwIF/dBFgmhyMg+HyqC5dnPBnOabNInoY8TigH\ns5VbbBTGzeeYYJL5ONNEC9rf6XX0f+czO6Bhcu8HMGbMTDmzpYkMCIN/YXBI\ngC6k\r\n=ssm3\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIEGz2tddbSnLQd1yT8AZCmBlwbJ3SYptjT6yM0FtVrO0AiAkyFGf5LaEwA62BeqHlDwO6iJMQmSJKT2rTbEM1NHrEg=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.0.10_1534616337301_0.2724305991463398"},"_hasShrinkwrap":false},"2.1.1":{"name":"puppeteer-extra","version":"2.1.1","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"peerDependencies":{"puppeteer":"*"},"gitHead":"2783eda8b71df3eb3e360614302c08007d467628","_id":"puppeteer-extra@2.1.1","dist":{"shasum":"30ca88124e33a3b83c03e160bfc4f9efd34b5d5c","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.1.1.tgz","integrity":"sha512-HWN0xfZSi2KaWl1fsVwBncVyKpkMenFtytZugcrxT1/PWREhBDmR6iCAG3SaYCJwaWu2OzvMpyiXufEHouV+8g==","fileCount":11,"unpackedSize":451665,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJbljixCRA9TVsSAnZWagAAziIP/A/mCzLqeQP+BLkkfpQb\nOom5bV5NhiYKZFp3Y6BTifjwKjYnTJJAfNs1ZJmWIFWXai8WYBWDarVjLlK/\nZpkHei8+pchCAP2N65m6gch5Vg5Bqw5T96mT8ubsjdIhs0Zx58RRaxCgXNhd\n6tLhMAj5aL2AQ7w/J9ZLWFooLBsowm5hFciSL9aKv4iwpkUz+Co6A7yriwn6\nBrouv1eiQDTLDgfSdhnAZt6UPWwYwK9MLk4b/wAvpYY2jjae6qAlzs2TcyUk\nHjW3nFuXue1GZr2pMoFcHqjaecEallLyfJC7e66PL6TpQ3IxSdmaEw441tez\nnn3V9S0Ucpy0cff/kRJFNS3X9CJEt8rOYzqbJU2hpaetHRfe4nIiHX8EInEO\nNOH0KBRy4W3SrwFUZ2YFzy4AUUH0v9POlc28Blhryz94jnZDYMjiLilw4zRD\nkcqZminTPYFfo1XXU6Ja9p6ya/so+hRjz1DT5YW7uFdpF1fTsh0/IikUWH+N\n2zN24164Iu+dmdXwfEvMHEW7uzemfB80ZA5qKqAjLgMnH0AiaWHIgfo0ezD3\nz7sNWAkFEcS5ewObooOwF/CqYy3cGuy1qgkNpEn7Y8uk+m85P5XvIeCH66NC\ntQmaKo9s6ckpfnVVMl0pRnj+rZamRj+QTD/yqR73f+jTKa1HGjOQfKyXVF81\nByQJ\r\n=nkzB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGY39ewAKtHXMu3ba5goq+kbYKRGoln7K73pBZ44nKhaAiAG4Om1YFleUEEnRX183VpfVVK7FYmGSn96uf+gzxoTNQ=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.1.1_1536571568706_0.7696762128920371"},"_hasShrinkwrap":false},"2.1.2":{"name":"puppeteer-extra","version":"2.1.2","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"peerDependencies":{"puppeteer":"*"},"gitHead":"d56b0bff08e963c83e1b17008f29133326aadeaa","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@2.1.2","_nodeVersion":"10.9.0","_npmVersion":"lerna/3.11.0/node@v10.9.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-LSBoeXueRzAWbSgEloGopNRDSWCqfZJJs9nVhg3GsJJceQOthXpRrJUHmNS3vGME30NX2euks03dDi+8lhzEFA==","shasum":"84623b18d7671c773c991f77ce4ed2a5010b8f2b","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.1.2.tgz","fileCount":11,"unpackedSize":452066,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYOpvCRA9TVsSAnZWagAAKasQAJsEPCu7y1uEo/MRdm83\naDx0XPKCysmHQRkFYyrRSWTboMEWik/u1E+jNTs7OdC9lPlfJ2IOlYa2DRJz\nZOmyvKQhezq+kLrzdhFoKjx/Ro9UB6G1b8yotPS+eh0LtMW/dfZ8vYe6EBb3\n9EUN+p5DbpJHr8SWIzEAy2XSpGpV+mkD2RVc4y+z/N6fE5FtnRQqlRJmvdDj\nmsKJOOGmH+K3zLkxVB8lo1sqWqCPZmZMNukD/nDSXDhXzlsbdK8aprY7NuKX\nXmD5DXMk9zsdCIawOd0OYd8iksjdv6lHblKSz/PIOvNkEOEqdRWv+lkp1S8O\nSIUHIup8qEVUuKO+qvcJ038PoUF2MRnjVpFXVJt/LoJZYouepZsLukwwPSR1\n7fTnQV0WYvtXssrKOD+y0mCYqsINoMSJ5wnthE50jIAQDZEW1y+Zu8eH2i+0\n2LguXyWI7iksuiFxhus4lHAInIQMbo0qJb1GGy68cSr8BCNrjc3mtiT+OGax\nUueCpHNG+yBqA6Iw/Mw+d6HajNE4i0+U6g4xSPOBrB2Rz6/UcdbQ+Rsxt6Wu\n5d8CRXvEucwrq5+X+8mWgZgJ1fRPHABYIG3Jq7+3RKNzf/KWONdKfGV++ETb\nWDBm9svjNHMPNWChdV+v3e4sGpE2T6q/P35+r5+7ij0c1fT7JxjR5PlT4UIV\nfaiL\r\n=5x48\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD9+/Ba/JETWqvdU1f1dIYsM1ExCt6ug+eA+G2M8YNMLQIgJxFusEMp8SOfIoqo2rx6weWv121TGfCA7Wm7SLwaJKI="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.1.2_1549855342654_0.024019717702941756"},"_hasShrinkwrap":false},"2.1.3":{"name":"puppeteer-extra","version":"2.1.3","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava -v && standard","test-ci":"yarn test"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"^0.25.0","puppeteer":"next","puppeteer-extra-plugin":"^3.0.4","standard":"^11.0.0","update-markdown-jsdoc":"^1.0.2","update-markdown-usage":"^1.0.1"},"dependencies":{"debug":"^3.1.0","deepmerge":"^2.1.0"},"peerDependencies":{"puppeteer":"*"},"gitHead":"17e693ccab5acf68c5153924490c8730449bf998","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@2.1.3","_nodeVersion":"10.9.0","_npmVersion":"lerna/3.11.0/node@v10.9.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-RjQp3BkjzkY8JgTcHUsu4RdFcqE3AdTzUquRC9WBUZXRXbSgSXI1CtEmNG7OcxorScXNUTKEbY7Z13xtQVkHnQ==","shasum":"5d0417bba8f9727afafdbbc26f21e0fed249b682","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.1.3.tgz","fileCount":11,"unpackedSize":452473,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJcYuD4CRA9TVsSAnZWagAAAYUP/2gU/C4MVvZ4O0zwBgnC\n5ByfeItStAMngmiPuEDj9xDOdzN5Zyga419hsM0D9ewrmIVRwR9ERahMU7Dk\nnsV4J6XC//KNeT03egL3f9ALDPGV37y5daQ+BSid8AuckLXtt7yhL+XSFJzL\nNkYnehUXBJ7/x5HSQ701TOKf8c5O60mu0OWobSFf2lAAygoJfTfhdapJPDY8\nUlzXXenMluOabAraW1tP/JqgVDpAsF1O+f7qBnvS9zXaS37oc9hMYGTdntfO\nkOxoojXoC3DTZMN+KK4KN8A3nlPig5CsiOGivxKjES2T99sLfNC2fRBoylfU\nuwka8Y6zGxAl9Vu3TcRkl1W5AX6dWIjKoRLyeYB5TFTCUq8L8+Sbw8hsJHDm\nxrLIBlN1nnEfQN0kh5FiNp/36e0pacaquOmSVe4TS2TC/08jhQhhFTerUIbh\nS93MsORJ8GSCb91p3g5yXVkdv9/N3z2pxoMQ774d/OzG1cZBm+eg5hkfxkbn\naK+d3AWnrMNipaXeTX77Nj6xfqTfbaem+569WpHLsXEW7HMLQDfdKhwYx/M4\nohI4RcrFo2fPfXwipbNd5jbbCUtCdKCfFI+gc7ik0JURloDeBowGCG52vKQT\njnfVJGpMGpZtS5Kz8q8KE56+ZYqW4URr4g7Pr72WHgDyUEcrJfCELa5x2Oou\neu3R\r\n=wwut\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICYO40RHGAk954xuQkw9rW0Ks3MHXpdSY5w1hi3Ye8bSAiEAqt1xh/GJ42gXjA5Wu0qwHi3exnY31YC5ErGF6trknaA="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.1.3_1549983992101_0.7257622305046252"},"_hasShrinkwrap":false},"2.1.6":{"name":"puppeteer-extra","version":"2.1.6","description":"Teach puppeteer new tricks through plugins.","main":"index.js","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","scripts":{"docs":"update-markdown-jsdoc","test":"ava --serial -v && eslint --ext .js .","test-ci":"yarn test"},"engines":{"node":">=8"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"devDependencies":{"ava":"2.4.0","eslint-config-standard":"^14.1.0","puppeteer":"next","puppeteer-extra-plugin":"^3.0.7","update-markdown-jsdoc":"^1.0.11"},"dependencies":{"debug":"^4.1.1","deepmerge":"^4.2.2"},"peerDependencies":{"puppeteer":"^2.0.0"},"gitHead":"21cf62f8aaa2b72479155ea02f178355a284080b","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@2.1.6","_nodeVersion":"13.1.0","_npmVersion":"lerna/3.19.0/node@v13.1.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-UtD9ke+FhU5hC4NDCGJ4iW+jmtQLSTxqcjBNwhi8suDF514fuB4ahDlFcGyReEV52lRHDjjrGgmFBGqjKAAR/Q==","shasum":"469f37fbdce5227f7af2771491f06d6b812c3e92","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-2.1.6.tgz","fileCount":11,"unpackedSize":664890,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd27dbCRA9TVsSAnZWagAANwAP+wUG1d1QBrLFO/0ydVj8\nJ6abFy4LR+uc+wq8ODqOmAIuU/9lThxIghHuk6YkWwrtbcTC/8U8qeR1BJZ4\nHCJ5Ifhqta27OPObvU9jl7g2ze6mhHZv2zHG4YCOSg/R70DYQ/RkFkBU6Fen\n7wfq3/r4zQ7I0AgNtQpPHNB0pJsQlqtdKdjjCCTW5J7LkO6iDWPLC0kg5G0M\nxN+3dc1e65RA/YbyrAE65AoZrKO6pctjqY2+rU++tT74eshcqec9d7JAN93g\nbQgvYPe+SRt4q4ZVhvzIttTgrNMocMbEJmKxeHdhet1JCK21+k9kCKmPIzt9\nd6EXfy4uAIuOVu25WWhUlhZebpAFa5TKuWv/9uBZyXjrTkt7k+0Wv8f8Ic5Y\na1nnE8vLdYRE0Hfakjfyttp6C21Xvf1V++UlWkX9mU5iTzc6Vl/Dc8Tye4nz\nBN2/LKUvRwFmhGlvbT8F9vy5t+4l0e99UBs3Axhi3LfVMbc7NQEwoepZUQ5y\n2/UsJURZQ+hxZ07u05356pAxX5Psd7RSvugFrZsc59V9Axg7ddZ8ALoc5C8W\nfaLxHVgZPVXPbuomtRIhn1YCLrqESmNe8jOePf0uXLCAlV46Q4AxcLHAenPV\nklWndGBs32P36IsCD6CJ7hglJtuaMHDhdOq4ga5yHk3nE9PdwCH0Z5HMHXeq\nZqJp\r\n=z+Al\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCM9LtuLVEryLFLGhS1Bq5NDlQICbI01F0qZNS8q90LzQIgQGNex4vPuc/leelfRpMt8pWcvqlLcmDmieioB6onq7Y="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_2.1.6_1574680411449_0.42879881025902566"},"_hasShrinkwrap":false},"3.1.2":{"name":"puppeteer-extra","version":"3.1.2","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.1","puppeteer-extra-plugin-anonymize-ua":"^2.2.1","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.2","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"e4f04742f62bd66ae968229879b6f278b1e6146b","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.2","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-opOOWlQ/Mt1kzQ56UlIOOi3znpkLOFXQM2Sxe1TuPp3XPC0x0wHz82I9Tr5RFH4h/hji9OvPL5sxPkqc9D9AyQ==","shasum":"c48b9a691ac8851ac0ec935741317fdfdfb67d7e","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.2.tgz","fileCount":13,"unpackedSize":141555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4RUFCRA9TVsSAnZWagAAxegP/31cW5HYv0RHo3N7aam/\ni7rJfoQ73A55oWlal5aS/sMqV74md1h/dwZ0PmeOFH1MVcWA7x0JijdtYy/r\nv06wFfLIyiqPPPCyp1wj/DAceIMyb/cu6pmPhX3G/SNCEVdWhk5u73GWscZh\nXWETMIDZGjquF7YQ6SVDoBO11yi6vrLpP95zkqpKnfH3LKTlrWf0Okavh8NY\nl9mv6SmiU5figCZJyfiLdU7JCC2fkHcHdX2P4coDo/FCmV1kqJiKJH1cW67V\nsDmi1Djw4uqNkJnZM0AoHXd1Wg2pT5UZj4OjA5zOdvjM2IlNeBrrqpcJCPlD\nVtYNHo78R96R1DUhO/xx2Xmgj0QsPeQjB6sCaiNguqOCfjzAsf149QdrMMCl\nbJSAg6/nxV79mjQj15BOhcGUrBCtZgFwSX2hkstAlzdPCn+ovR7ERA+PUHi5\nbi/WSyXb5HQHnyYBwX/MSpjqzSSFarmHtDfIT1b9V68uKdZlAq4lZaeLIm5V\nedO717MUXISQckkVhzvhCMkymvgfH7//N2m5qaqjm1DiAaHh2oNtJRkfXIcM\n6e6XNOkHtAbJBmX5k9pOxOWaiaiq57YBv7F93Ha3nC/MeBlOxQlKn7i+qrQR\nASJzVtBZIo6cfq+alt80gDIu8f+yh3msSTEMqDPkJOQVZzp69qXPiFqszA5K\n6gbK\r\n=sgSy\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCDAMGWRv1KgfIaQZMuGBDfwYuzdSw8AoeqpuVGcSDFMAIhANhA5VI9ddD+Ey3906lJOq3E+v/WhLua7XW4o50kafga"}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.2_1575032068541_0.7469450338434123"},"_hasShrinkwrap":false},"3.1.3":{"name":"puppeteer-extra","version":"3.1.3","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.2","puppeteer-extra-plugin-anonymize-ua":"^2.2.2","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.2","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"b5d3faff1b601bd3929448f85ae73f40b0acdf78","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.3","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-4SXf7j1M1weunIhD17adBfnS8K+JiQO6CG9J/7s22+SV06rjV8HCe+qd5wUMA0oIO7LxF4+ERgOo/KUu/7INFQ==","shasum":"5ea0fab2d52d4620c6869735ebf4ca2c553489ba","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.3.tgz","fileCount":13,"unpackedSize":141555,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4RzQCRA9TVsSAnZWagAACRoQAJGx4j2GHGVnFlb+jr6k\nN+FL9xIYyXOVvB+3D7vKXfBnyJKGSXOHRTRjSOQSJ27D263Blr4OdZjpZivN\nUiiYwjSXj4H4Y4NgIh+0FThsHGJTF1LT7TOn27Mr+tQMCnttQmIT48vjBpbl\nQ9OW489UGnSei0n9/UaHTT4Bd/E5oFZpuoyJemoiuIlhT/Rqa2J0pXDLCVLe\n00kCeDH5RkzedNSseSeczooYsVIJCytMKqtkB89hW3OmgPYVYdhlNox6miSa\nAbKDEa2ejCc5BQ3p8+MEY1xmfJKuNfDKjlGaV+K26uxPLG9oniTACYytARbM\ndY0OsHL3eUBesV88QvrT+bfJPjQc3rSDFEdiEmcQaIqZH7hHwrmzSTBK/+YD\nljn1CzUof4WgLH5XE+ABXW3oPpOiecBafPW3Ai2ilm0FRP1A/lQeb8UwP5o2\n34JVBzw5uDb2CN2IIwfCrrdpzVCkUPuD6ICKSglfzz8O9lwoRTmY6b7cvFsx\nfsXQQwN0xBr4j5m6G7cQlwQ+G0+T2Ay0N0zspT4g3SNIjil0Z+ACFfKLbBln\n3plojko+9C9x1wgFS8LceMK98cGyo5O9xya8Qm7Hq7zJkBB3yWwtOulNkoDJ\nJnjqm35eAj2xWKer07a+x8x6mtARyoBGhw01G3CNF6MvHscZ17aQFG7O/FDi\njEum\r\n=o0dP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC4Mf24+REtYz8I04QLb9gQz7mi1Zb5Dd49E2OO909qzAiEAmrIe7KizXNKRIPL80RbqrXG/WE0H4Zg1UxJEImzdUZs="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.3_1575034063846_0.43257221329341755"},"_hasShrinkwrap":false},"3.1.4":{"name":"puppeteer-extra","version":"3.1.4","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.2","puppeteer-extra-plugin-anonymize-ua":"^2.2.3","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.2","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"e52842520747a4a2ae8c5151660d4edf1926286e","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.4","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-roswxzRlnTuYx/IkXP5N1cVCOgxQWJAkZdGDTD7+E4ChHV2EeSctRVGyg7W3S/bEwWasV0/NBHONYNZIQUYwhg==","shasum":"6cff681b3bdcd4e3deedd24b258b1acd78befe5a","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.4.tgz","fileCount":13,"unpackedSize":141788,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd4XAMCRA9TVsSAnZWagAAlbAP/1rugiN9AYCGsb8VyAGz\nFv25DvlzxNDmM8nXcn8tZLAOE6q8z9oI6fglZr9PDvt003uKgTaXvlc7KtS9\nID1x/GRE81WitQFoOiNhUg7NA2oZJ+0cKqsiJ5qLbGj/x/Ek8pcBcv+rLaY0\n3fjbnN4D/qeZXBkNNQDp0wQeDtqB3uFSfMQ6KHWHFxO+fuUsmO64IJ/97ChG\nY2SK6N2uOEigLvxjZZQ2SojnmPzBLNo6VMD74kfZjVCyxmC/4FnszFX/V4w7\nDqbS/X1L/sWfPGbByXUbab8idloYiqWZzvWFj/sEfhhll1kzzGlmMpBqBsc3\nYcipr7jtLl4oF/zHlLtD81ZUEGP0C/UscTG9tXsRAD6m2d5k1HtT3rx0jL70\n3ZyvNbzW84919wG9rDvHRUcmr0PEDGQ6KKo0zbk0CdaFaTVVLziyf83pEEPG\n/7xmUm73W64cd3PYOeOse2t4s5hSfOMbVDfsPb/MK94Yia3SFo9QmxUMslHF\nBXByykgZUaDOdRNkFsSOvRmS95ntWYrtkay25qZeceT6HqrAhUiv3va4bIOB\n4yX7Dzx4KuLbQlimlAB6y5QTU4FBWLyLDXi9/D5/33uOa4AyznaOhhUaiwVH\ntjIM7EZahWqUdnIHyoC+HYOao5qirSdtFxuozuF9IX2+In0WUS1aixz0Mhoz\nDkjB\r\n=V34l\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDaZMnH9oPanB1gqzcSo9yVYwSzqCx9SOYsqA+YU3HfbwIgEDdXeOPbBc4PZtY/iLEvc3N1B5VP1Zzt2Fk/hFec8Fw="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.4_1575055371530_0.809839946729076"},"_hasShrinkwrap":false},"3.1.5":{"name":"puppeteer-extra","version":"3.1.5","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.2","puppeteer-extra-plugin-anonymize-ua":"^2.2.4","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.2","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"4ccd12798f596c65d7c82e3e3ea31aadbd81bdd9","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.5","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-gLbeMVsgBPliF8/AVswEZy7T639ZhYhxQqy3turULOQhyt6a8WU+vR1qNw8o4kYsIBLTb1ilHA4myZqsYJmA7Q==","shasum":"8573531cbdf6627d647d6c9dd86cfd40e59eba2c","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.5.tgz","fileCount":13,"unpackedSize":143260,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd49mWCRA9TVsSAnZWagAA0YAP/3TwLAi1AoQiM3b6Pi2H\nwzhSSdM8mHHIjPAnNvb2lHDqfFp3IFqwGMdvbq77nSXx9cMXbF00ZejacgxB\nE2ldZl235XHUwBHPIvU30BwzjX83+By+uUSgGFo2t/yI6QOlljEdrvdrRvD9\nwdYDT1ffsO1WoxfkUUqGSaovGI5JjWN0JIfnz8kCrlAynDCMpGz7x4Lr1Hsu\nI+wW7A++YPJsRBeIGkqSh95Gb5EOwtMLsjarevU7xvhBGVhK2NKxoG5AJmsM\nrwErstQXGq532deNLSm9/4FOr8a43W/dPcsz2PiJdGa6g3MK+6768Auq7LLs\nWgHM89dkxJsOG9zKwqnyUawrcYY7CKYKZVps64PWuAiEWTtfAnlq6a7BNhVN\nBD1OoJBObEi5G9Zrd42aL8CIynKBpN2R2dVUkMq1D74xASxjHWtznhLKxCFw\nFBjCyXHSSK/+2nEjYtCksqOmw7GsWyum6Kih7JL+BNw+UsHM4KJR5xrDrLXj\nHaPA7LXucUd0TVm/xIIHXnEIPUkAzdBcs4cPndA6iGFY63yhoLp4BXTIg8TZ\nWxU+kHE5YOcq0Ki6nzZ+1uKtqXVWsjkwocfUZLmdIvPzFPHmF3b8bM3YAIn1\nOMwN73Vu2KFwbjiw7c0+uUY3dkyZKCnp+VaD3ejjDhuhtePdm/oGF/oFiEAZ\n/rX+\r\n=WJuL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEMCHx3migeRv3y6l3UmTfXvuv5jFzmbzMX2nI7angGqWoUCIAitA8LiCvOo9x95tFYBug1IX94rZNd/pbbn204d1/+A"}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.5_1575213462051_0.8021142555144953"},"_hasShrinkwrap":false},"3.1.6":{"name":"puppeteer-extra","version":"3.1.6","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.2","puppeteer-extra-plugin-anonymize-ua":"^2.2.5","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.2","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"c324041fb49871d3c171c5baea04178828a1fffe","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.6","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-DRT9GcOMMv6JTvhOlFGeijx9Knv5GYT0NUQCkIWwinKaQHze2Np//YwMk6cRx+NbaZE3J3qJKftvHbeq6/bYMA==","shasum":"cb1cd6949611867d87a810934a1912d5a0af2075","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.6.tgz","fileCount":13,"unpackedSize":147262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5n3wCRA9TVsSAnZWagAAaH0QAJA2tj0uNLvE7DEbHCKN\n2f3+lFyK0OABdI9A/Ly7VVR9506vomPUsYLg8SO1cZGeebFQzBpgLCy7msCs\n7AGl4Ze7yOmGTaiBeVq6vAXp3pakrNhYAQq09RJ6AC97AhmsLW/uCw8TtwiG\ng+iWUzV67Mmk55BuukQNb021bitfoaO9jFufS0tKLDXRXUXciCP2QDCDjuNb\n1j0hgneeKHVDiSx+PwIJw8GlQwHFQZpqETKmgrZtwPbe3MQKsRQGHAOXqqUE\nXG7FhLvvIZUCp8vIKdkDCf3mIeQ4y77ud95pECHSYJKbEVRDH+zRbzRBZDvp\nNjexzl6ZIxy8AErCOoWqcHY9ZgiUKwSWO+N6ZrcgyqUtwtCpnlrFrAW/rAWe\nDjekWeOUSneh4BzMpWOSV4r+YQacGiV52Y84h20Ju3XxGG3yP6SugdYnvpkW\n44zlJg7rm/nRDw2ChQ0Z06EAK53sAE/2ZMIFKuAiluy/iHFIPO5Rw02QJmwe\nRTwgIWIK6PbLx5r9YJBWAIJCi8elqQx3kdDiD7lCcSDcQFMkcSEQz2Zw0iDz\nQ5xoqWR5ZUwj+XG8T6+N9nbjPxx2jy/GjZV5Ta7HfzlWYPUumxlaC5/jrcAq\nYDqDz5SxMG31bthv6ofywslqxagezLsYKRFTqwqvAoQCjUpU4ULWs+utqaDc\nNyMR\r\n=XLeX\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHfpCM2CJpSydaOYjVK/3LrBRz0KFwzKD+4kDoN7HvtJAiAtOwl1kJsrEfC7PLt/vXzsrzduqn64B2q3GO9C+uMxBw=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.6_1575386607617_0.8501729251357881"},"_hasShrinkwrap":false},"3.1.7":{"name":"puppeteer-extra","version":"3.1.7","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.2","puppeteer-extra-plugin-anonymize-ua":"^2.2.6","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.2","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"6d452681fe832a6d864616ee8fa79134ebd19be7","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.7","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-c4lyW+k1MW0esrMZmFCfvPZiL/fyM1aG8GAvfI7200PyN7TekVsJwDnyONxgZlVH0dZY46HeKLiZpC4eBP5fFg==","shasum":"623153bee638fc414ca0072ea12c82172cc50e5d","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.7.tgz","fileCount":13,"unpackedSize":147262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJd5udDCRA9TVsSAnZWagAAwI8P/1IHqiJCuZcNpXz7OL+R\nX6GgIoXciWoEKEEQIHSpRwMsQY4CjNJ4UPfywHDgEPGfpKGU0LnZImEbqDJy\n4jNf9/4BbO50hbTBi1iHykNN3QSACS8rde5fmBesBUhHV9TbDggok4CiFrF4\nZMsFsoKDgUTfiLkDVUHp6yljGC9SgD7JRPL0EkfvNFmnbbuJM7gaXggLYkH9\n3FW+oPEnSsgiTgX0yPbOEH1IruRVK/oxY1sq2KPsAjotDZSNeqS460/cLe8x\ndZ+J5gLjogFaeC+N0Jej/WG+n615B9eD1l6K2kfs9dcBqwqOCytBp7vc/wco\nEoUzHpimgg3hBfUyYAaPds9SCRlJK5htGy6nj8JMUGtQRqq/mOdeI9iUZinN\nibdOt1UbYYHneLoRMvklWLlN35V/i2d10LtHMoyB+MU+qFL/R121Am5Eei1c\nxi0nj6tSOQ09zPAc/7y6CE3egJliiFpWEn0RRJjaPrEWyxxXnDzogqHs2b+x\nfJqOuSxZbjjpJ/Z1VBBvaBJ/Hme4Nsmw8sPAyzuKGpjVpbQsJ8dbkVnZOtLw\nHIYfoXLT34jMMtlSK7fT9zm5VvvhQZdrAdVYCgrrk0B+kRTwaYEoX/uQxJJe\ntyTtfkswrMfTLqPuoNOkY67SWB2YupVh31HODsylqhGYFbe8YmghWD3vFVuk\nKS1B\r\n=aWLL\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCJA/CVQE++kIsmY/IwI8PJchH0/r+xPzaSAtA5ZPJnVwIgIk8Okk6/wK8ThcgGMRVY2hlyHlP0GCuq5DbJO9XlrfU="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.7_1575413570720_0.8228236759732097"},"_hasShrinkwrap":false},"3.1.8":{"name":"puppeteer-extra","version":"3.1.8","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.3","puppeteer-extra-plugin-anonymize-ua":"^2.2.7","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"6a89e1196bdf8327ee9a2ba8b18f861d9fc209d3","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.8","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-Vq5nUP5Z0B/RRuKMuSmN26ieL10Hk/IVJffiDD+KQ6zsPC8nUt/DFoAB8OdpHUNCDlBfkf5lEh8HZAX+yiyKGw==","shasum":"fca6900a6773d6cd6d48102e6a520d4e0bbbe1eb","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.8.tgz","fileCount":13,"unpackedSize":147262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeEkdrCRA9TVsSAnZWagAAY6MP/jOrfv42h5aY/c62Jjjv\ndAfsdqpVPQTfq+npkziQUgcR21a4+qUMi8mbkBsCFDRPDjzJREe24aDkz0Gg\nBObFa8O1fB07m+E1fmUk3VupUYHENCOrWLaadskbBUWoxgFVXVeBdM8eebmS\nTUF8B6NvQJztPItx6nI8NnWFHbKIpUzA4B416xerrRqh1om1vTeLIUes5zkF\nJT+qALG/TqWaVoPbDyg+hZw9NZwq9VWP7SC24BjeuberwPDctdypb6zn4n7X\n6+lqkuFnmTDygfMPbC7yGfa1SD0lbz33RDJ4UioEMn0IlWZkh56MzHwboEUD\nep28zfT1s1ORShOx7d39RGgW4Pf0wx8sYPeb6C6bPv+Vq4RB3glsbqH9hYub\nIJjEhZQ45+dvzpXlNGWy1LHwFgh/dKyH2iuFaraB/FN1STcI9xdmmQ0B8HU2\nUVdPwPe2y24dFXOmHVA/2iZBDwF9k8QeNZ680tqH8UcXDRrUx73Us1TG5bCY\nFJqCAEPpofKh3F0E2qf6v09KwjmTMLPPJ0UHLrfy86nIraBERkrXlYZsO6E2\nKXK7He6e9vHIYQxSYaIq7WMAaEiiHeOoF9mVuphNmPjYXBGkJaUlVTc6SZfG\nsS8xfsFTdThJ9JlK64yFCCf1Q7DyY5jleaaetuTwOcTzoI2LA60SzC3rL06h\n5dFx\r\n=xboD\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICvnpFmrdmaNSP8eX92fKue0wvFh1RtX5WjeyedOXC0vAiAvvwGKlkxaAFw9hJPZnO4ip8nLy278GktQF38ohzddVw=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.8_1578256234894_0.5605680757268374"},"_hasShrinkwrap":false},"3.1.9":{"name":"puppeteer-extra","version":"3.1.9","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.4","puppeteer-extra-plugin-anonymize-ua":"^2.2.8","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"3143ea17daa8d4364835fa7e5f4890f1ee838648","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.9","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-hxyQnlZLLaA2fh6oObs2jkzAcGW6UEnPf9geEbX/UkLqp3LysouC3UDbCA2a1K4d1N73AD0afNgnADr62JBIcA==","shasum":"b01c17ee7f8e6836e7d3fb4c36c4c6d1e10e6c59","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.9.tgz","fileCount":13,"unpackedSize":147262,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJeE19pCRA9TVsSAnZWagAAmU4P/0BYZ6I8K/yh1xV7iCil\nIiglE1eT5hwaIDCQAEwfsScmwRFSQk/mE8L0/MuTbPhH1ZTeZadhBUcip+NZ\nER0led08suS0jsFEREHI6kr0Rpx+JFwwNey1gKC53UpYFmkxBbFM5wLg3jZ0\nlSa/LnjSHmLZEABz7epCAQBeX+yhKac5b7zBnJGSQZ1Awnt/b7msq6c98c0M\nczdT6rQ1yEImY/THnKFxEPI4S843I0pUu7rlMcr0cbkJfiHd1s1xLsSOBAGR\nHiO9YpU/QQ32E2GyaKQ7UtK+s+j7E6rTYR0QHl9HM9XeKeitUkLYzUh30X/E\nvkvU3+oWJ1S9qd+/gyeWMedEhlEmkMDOPOCVQtxJlrE9jAcaiSMdRaxxsCod\nwYw7gL6pI+2KdSYCU2r4Q26oSsXpafCUmEuzkMBLjqjX4AGEE/fujm4D+aZ2\nslE9ejQIIDHHPGDhw8kNW+x8RS78SWfZI4GhlMgDHdJRxrSuwkVstMh7SvCo\ndqr5crXM1K3SDvMNCGwpx5OwtHz5j1XNppdVF+iIQ1kP0n6ZyiutEYobNrWo\nrRuMYvLH6g7skCG05W0RZjoXY8nsOw1RzfX6KIJUsNr8JacsQI7jvFbnaPp7\nQT8w5uf60HUvKrKNsyqb8Lr3ofUyi0JrsJ6FBfLCMovsF/laKNyVYFeSVXEx\nbzjD\r\n=dkWt\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCICmKpTagi5iMjFoiiDguwsLnf25p8/uHBdLGCJ9hEb7RAiBN061ad5M61t2DWCM/Ui1axKaohRSs5YCJZr/HXlhqLw=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.9_1578327912635_0.4798548335376649"},"_hasShrinkwrap":false},"3.1.10":{"name":"puppeteer-extra","version":"3.1.10","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.4","puppeteer-extra-plugin-anonymize-ua":"^2.2.9","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"bd73a05835ef5bd19565330188ad69d49431b7ea","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.10","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-2Y+BUU8wcWWHY8TkbXW3p0Rw5Yvge3hRDl8YDewOCudHrlviZ82Ifedt2SuodOp/kZv5FLXZsrJc4KbVJntJrA==","shasum":"e64e8fdceb8428397389aa2019c6b18818393a7d","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.10.tgz","fileCount":9,"unpackedSize":61406,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBd+aCRA9TVsSAnZWagAAVrwQAJ+UAM+pPB9QiL1DBfhY\ns/srZv191Ih2GJKapz3HJN1Szx0mHFVweMmpNM8LCB5ehJGZvkmZCnUpOnFG\npKkB00L3r0vNaejDx/6TtrIYzSolfwdkHtnIiiF0fQU7FSdOoqkgz1RjBoon\n8VEN84BOoVhASOYQEfo/gS+8rCXrEZbbdGUyTuWEteZcTZKZck2KrHIMNg3I\nKz8qetnl55vk30Cw6cXBXnR80AOXgabKEDK117O8kZavM8Ww+y6pYWdX0fMM\n6ZSHNOjyDAhWWnWqDcEoqzxPPxwuKKfpA1lXMIQbVDd2Q8V7BKrDrJcH+9Uz\nsIerbPoQYeRaURNKzNS3ock3rRexsp6966oIlWjB36PDz8v7z8qYo8veFd04\n7GWCAH6mJk05+CUZ3QP8alBVcYyj+Kj1ridQasnD8baWij4XUVOj1Q+Y4znj\nax/wld4uvyFwQRIiluHs9baWAzSdo4Jx9l1j8+C7SW0gUJ5CNTM1kO9ZEJFd\nSorstZXRURHqKCW3lAGA35S/MBWN9yEcqRlgCMMwsr/vT0Vvhi/rDS0cLJYi\nGJ9G/BiPHdbIQO7ZD0DdXDPAsTjC+ozD1Wf22Q36FLejwZtmfiPnktgzydZp\nbuHB1tpXOZXxZ2+P7Byli5YmbXoJKNcRnAmNxO/Sv3HRkpQnEqodz6mGsTT2\naAq+\r\n=oTtA\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHaumQvEPKD1/9gi9iylnKNGNUt8QpCnV0fAdIyzrqcYAiBqIOFKAGuKWZ1NkqzwKcoqiW/dibv5GocTIKiZlj1bog=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.10_1594220442488_0.8836228228396621"},"_hasShrinkwrap":false},"3.1.11":{"name":"puppeteer-extra","version":"3.1.11","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.5","puppeteer-extra-plugin-anonymize-ua":"^2.2.10","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"c4112a26517141a35d690faef5a9de75c4a69b5f","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.11","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-t/dSHlTiCDjay4bSKMnmwXFC8w6VFDduwxRwgkxqdLbpaVBXe7c8pAKAAorW85OEzYGnYiLtmbdlHp0uo8Lu5w==","shasum":"f9a04c1d2458115241253dabbafa40c0a1633307","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.11.tgz","fileCount":13,"unpackedSize":147456,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBeHHCRA9TVsSAnZWagAAyAgQAIVuu6fhfWEucmN7NBAL\n3Xk8k2lvq3ITOfaLb0BbCC7qoAdPoAbEjzC7iGYTPkiGwVE6vp5x9weihNig\nAeJp/nqMVwkKXXqgfcwIIS5wSHyJ/057bLrTu6nr9fCfDdMk6qchyfLAhBev\nU/Sa+h+z+sOqtsddPjhjC2zBD2LOkeqrj2QYft8cQW2qDAmG1Mqu+dejeS5F\n/Obt8l/WC98yw/sjC4Gc6Jt3E66Noi4OvGzXFocZ7hBj+KXfjuSuDWJrOWRC\nTlrd2DauGNHxihJriBEkZAhVHqh+3wi//RGBYm9ZITHddWcdShKMdXx7Dhkq\nrRAzzFC4wZPQS36wf88VsUIqB9TNgsegH0Yji13JV6v1ZQKWrnUSWqMa6SiI\nLIsNhPe0eFSNloy2EAfxCr8hKj5MG1LKXXHxsbKu0xQj8lMCqnZRVsKKcDj2\ngAd6qX3+dnFoAN7o7cKT4x7MwBCs6IdiRzz/r/xXj0LIRAVvTc/SjSbOUf6q\nrE7zp/zUyBicdvBQAzdwRDZrhnkI+bqPLxdLYuqL2TC2RwVZDC++plSnmoBt\nr1VXU8Jeb3Yn0n4x+FStRVbqb4THMYEPZ87QwkJupkV3sjrmw3c2CE4Wa+wJ\no7ZAt1Q+5HCe0lv0N9PuqkXCLK+WTcBDJctz6SS+zlIUbqQjOiQcnb+tRcmS\nmUk5\r\n=QMze\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD3uWAFT1mcg1gayXsvRLuWGFLTdUUiCQMFq4ZMd/AfpgIgHcnZJ30xDgAWDHYTDVB5NNt++0uzw09dGWhH9m6jOLE="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.11_1594220999216_0.8432102416557616"},"_hasShrinkwrap":false},"3.1.12":{"name":"puppeteer-extra","version":"3.1.12","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","build":"yarpm run clean && tsc --module commonjs && rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts && npx prettier --write readme.md","test-ts":"TS_NODE_COMPILER_OPTIONS='{\"module\":\"commonjs\"}' ava -v test/**.ts","test-js":"ava -v --serial --concurrency 1 --fail-fast test/**.js","test":"yarpm run test-js && yarpm run test-ts","test-ci":"yarpm run test"},"ava":{"compileEnhancements":false,"extensions":["ts"],"require":["ts-node/register"]},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.6","puppeteer-extra-plugin-anonymize-ua":"^2.2.11","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4","yarpm":"^0.2.1"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"d35cc36fd80afbe9aa3f04496d7b919ee23d65a0","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.12","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-7f/DL/n6mRi0YDmkMGMDU6Lj7tf5XpNjhI3+YgqLtBPv/09NVqzWT8e9Hlr+H+9PgF8pqdHS74V6AV0tPhjxxg==","shasum":"1377611faba2f4bb9b5b7b9d5f7e0506cd7a4f30","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.12.tgz","fileCount":13,"unpackedSize":147456,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfBmBGCRA9TVsSAnZWagAA9zcP/2CxQwE/SiA05vCKRBpB\n6mXj/Df1VwCUqzKytfGTDVP9HUFO65a4LX73OzbPsrAI3BDJfexTgQGPY7Oa\nlCAshPcPWxuXtjyjqom3jJV0mlEqV4UWcAbL39S3sZBRrpatUoqcp1+dY9w7\nprBkXpTzXL1Zxag0owkkoBMf68g1Dx+tklJupQMqC1TIi2ygRHythGNZIc8b\npq+cHs5jwNhCwM022QRU68w27UKwC9rn6AlN+pm2CHxii458KUzl5JJk9gbo\n/QyE+/nXWe4JlV9Rz9pukpLcbceIoq5h2cKKQcGGPCxhiFh/qrgNFVvhKc0Q\nqHhbPG9VfYhNiMl0H8ERvnfROCMELCAKX4sv3X6TrWde2gdAkiMDN3pKWkvR\n6FfWu9EMdztYjTnJPWn2VQyZbwFcp0IV8NbbBzm29vS3sRG3++8D3YKAqrOf\nO6KwRsYskUf6ejGDJwK0+4s9orIZqdsMI+eFrhtUzBAoaVKR3cFvOETkmWyC\nOhIHNH5qRaTCA6WehcsfAvuYW8J7rYxqSbkIH3Lz3TlxXB57jIAVlaOJDYSr\n46wMfeAWWTJZhEZ3VzwDfgmmftxPC5U4dUNC1dFvCyMRJ9cFaj7DT6+nB5Jv\ne1OAK3OW5hNatTsak6Fo8bSvXNQO2rc+EDCsyfTn/x/wPpOaNlEeMsvATf+3\na8dJ\r\n=ANi4\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCg48stIE9UTgvL2wA2wxad4sKesKGQvA3LVZhvMiGlYgIhAPro5Rig/SKonY2tRw8gMbuMZCtChh64RzTA+smDP7ok"}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.12_1594253381768_0.9688107842685032"},"_hasShrinkwrap":false},"3.1.13":{"name":"puppeteer-extra","version":"3.1.13","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.7","puppeteer-extra-plugin-anonymize-ua":"^2.2.12","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"e5ea80a38701bb98dd8e1313bdadb95b90ab5d18","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.13","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.19.0/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-bykD6G3VQO96PremtBP0wH0PIGLrxN7Wxl3hYLanKqbWVNA1lxVed+kVfnPWSrRppAcrDG7OdfWN7BVvlfnp9g==","shasum":"1534f20cc7d79d4dc4a578af9a28e6f5100a8c4e","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.13.tgz","fileCount":13,"unpackedSize":147840,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfGYO4CRA9TVsSAnZWagAA8HgQAJo7FwdUEWpoxdgqW12d\nVuJ3ep4TGa/AkC5xZ0ZjDPryz5bJiJ1vLwAIHISNg9YFYiyyn0Rz0PorvRB3\nLAhEY853OKCYY8523tooML9ftlOG6Oj4Njx47ywyroLu2fRzpPUwG8xqlSbp\nLPQyDS2Ls+7vf5jSVvmLKzRGvXckK1KbuSSVY7FHXr8Ehgw47303/2qxF6u4\nO6J/J5fWZROXsJSWQ6I8e3TfdYzsLlFVgNZRaip8OxenxKSp5j3UGMNDc029\nr+ad7NmsUKjTzjujf0U2Ibs5KhYlXEFgWhBnlsN6ZaEq3TAmC9TK8rXLQkp+\n16SjC/ugmSWpxShePib3u0bq6+FNag4OaKjaBhzDnKUkJYLxZszzGeEL0t5H\nGwP+2EHhVKGdOYlbWc1+/QN/601a0ZqWvJSysxIrUodWsvW4wXn6x6D2Srdh\nTyoDj9mtYySEpgkh2vqwG2t6HSyCfqwzWf98A+DvdpKoNPCYH5XO5fJKPnz3\nAJ9P4Rd+++BUruPNULohKYFOGSYpn/z/iUd6xcZ/dAc4/huJLaKKwFZ3Hgit\nC1M88e6NXiRGvMKsfPXkY42JYK4/IM/xpStGSryVrthpH0PUkOrkGoyQHO8F\nI3TDXtBboXLkcyPXWN+uk19uDYKVc/6P3nSk6fYSlpCns2V7fqV/1wCJvD8L\nT/bX\r\n=osJ6\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGL9KAdaZ5LCaGBB+3kWGaaXxEwQd0smdQ8YGI/oODj8AiBxdJMfqPdXjK2GUz6ea0SAEoqIMQaLIlqoSfU2yN6G+w=="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.13_1595507640061_0.6348074093336138"},"_hasShrinkwrap":false},"3.1.14":{"name":"puppeteer-extra","version":"3.1.14","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.7","puppeteer-extra-plugin-anonymize-ua":"^2.2.13","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"d820d4d2d22bc8f43f40212d92cf3d2c82a48b7e","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.14","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.20.2/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-yL6/mY+XXUzaxr4XwPaIzTPyfpjzhPkluI7GmDN/bpg5ckIe4ekzCp94Z1r1lhTwl6sitm5Ef9MN9vz3mW/+BQ==","shasum":"20599d8f657a5f191c526c4bc643596ba5b4477f","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.14.tgz","fileCount":13,"unpackedSize":147840,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfO+yoCRA9TVsSAnZWagAATaMP/RQtWWseTw3OeRsu5xjc\nf+OfTYPuAIGG8orDoH0MQOh7tgFAMEyfjZtI86MQGNL/xq8E8mA/udpd2OkI\nKG8F4S4zQ/mfQoo/Gdbb8jH7olQthvbt4VnOnXA9CMviq1lXANnxLu0/Llz5\nXy9TEKUK2xOxXwCQ8pKcAjm0LJ+aWoGuBv7jbsS77XpgxJT3TYMoiZ5jQ5ki\n6WsV/jec31on9FX0MN9s3uaAunknAOzgi5Jm3LxTZNZPBzT9Dwlx3s6wX3vk\njuTNAb8hpmvAPFNeRkwByBgLDqOH63oy/X01o8nApU/gK6XK5OaFev30LuYu\nOc/1IXvyxW487kgVGAKrUnFzcLE26AWP/MVLPiYYCGK/CGOKoBofFdNBbrF/\nr+sVBcwZTiis0TsrjFdvqKbr0k5L9AKzZ4Qu2gn8Bt+B+vZa42YqoxiG04Hb\nr5FCAQ1ztJ8dJFJjA0wwvAThI5tgi8E8g00NroHRg+c63p+FOagfveRfkOg8\n0ZtPZcq/VitExDVko7U/+d0btXtNY9Zvxpft6/F3+OJq43MLi4Ttw0XtH6/P\nA1GdpBusJpt4XpZYhBZu3qs32TqeOFGgsy7skhkFRVyVBpGBdNUs1wt/+zTI\n2kCz1ZE54m0q48rOJ+JgCdpUWRnXVf3q6Woc0fgeBoMrg2nke7kxq9vK1MIW\njs/E\r\n=8RGK\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDrqE09FYfjBoPhE9N7f4PWtBjgl2pJj205KVP6Lad3owIgOM8YxRmUaK7hCMD7MYaz8tnew9mPdJ6DoBFAxgvYeB8="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.14_1597762728184_0.27966442689011695"},"_hasShrinkwrap":false},"3.1.15":{"name":"puppeteer-extra","version":"3.1.15","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.7","puppeteer-extra-plugin-anonymize-ua":"^2.2.14","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"9b20ce9cb30524620000d697320034d1c6e91ac5","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.15","_nodeVersion":"13.2.0","_npmVersion":"lerna/3.20.2/node@v13.2.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-TFKcluoNSYCT3xmZjDcqOkBuxZePbwvaL5mrW5Gvp5c9QsJEei5TYixoenMQaB3QZuRW0Aura4yyjVrJDNlWFA==","shasum":"a2ec4f5fc0bed837cc983a25b7d18c37161233cb","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.15.tgz","fileCount":13,"unpackedSize":147838,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.4\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfO/W3CRA9TVsSAnZWagAAt1cP/1z5Ris19YCNdo+wAYat\ne4wpxaVEiaevQ0RP8yGe9o5HbF9+bdYx/UmL4YlJkqybTJ2tWCDFzGsIUUb9\n0ZV/5MfWa742XB7nDvjkbrLHwBkqRwCHv9L8QT4BNNBuaC/4Zl3mcbCg8nuB\n5j4izyXtNAhf/mK5p/ZtWobnZMilRmipKR4fnyyHjUwpKVD+zucoR8ya2Zeu\nc4vh0P3OkLbB/bL8X57WOJeVMQqT2i/B66LVnRDAnmW7H9ese8PjS+KNXDoq\nZn6iIG1Ls6/pCC/1gAElnQkPRHEqVzf6epNWBvuPFjDx3HnYDa8lCiEJCIxS\n8UVNmejZqFYQAdB5GDxp8vulcSIxp/ZsY0vp9Zd6ZTBukLuFdkNQQu/EmVjr\nGIDYL80B1vNE5HVR4bT3SCw5fIGNgctqEn8DDi6zh0dOJT1sQnYhr6eOG3LO\nByX/uQo8pcjCithGa/xcjY337I3BYGuOXHyvFeOsdnOqMYPLK5j2GJcNaAhH\nwrtv2Vn5bkXP2qX9n1tsAU7XvtPs4IylTXSyRgxbzrHa/eODxDKlA8BQnMc3\ngQxaIQrT897HZWBKkz77SRsI6uqs/QzmUxjy2/W0wJpbuLcBFHNRvpo4we2Q\ne2HUVVF0kFMNHAwYfZMSrp8JvZOEj9fz71S9as+Xn+q+tXxps4wug7E5282x\nPs+D\r\n=Tx/e\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDJ6lhxFNvaZuVQ8+xUQ/WYbBsayms3ZtueHrJJXganNQIgUWYOiG+nfmRWeYL7wixd71X/SErfwOOTPxIowO3roYU="}]},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"directories":{},"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.15_1597765047106_0.7526552378753977"},"_hasShrinkwrap":false},"3.1.16":{"name":"puppeteer-extra","version":"3.1.16","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.8","puppeteer-extra-plugin-anonymize-ua":"^2.2.15","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"0abcb1e7084d02e499dd979dc6f07b78940e301c","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.16","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-7XpScQH1n2Qx5CBZFizAi3HsKoRY8kgVntVg7P/QNiOVvLwcXTi5r3j8Dg25xj2Ga6p7PdWzqY21c4v4C42+Yg==","shasum":"7e577a34da4a406f8f7b707f222bd5addf20acc6","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16.tgz","fileCount":13,"unpackedSize":148245,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf/q3UCRA9TVsSAnZWagAAbVQP/jhrqWXeAwk9gbZ5sw9J\nyL+BmGn+YNPUC0okxI2Uh1ioTljwv71hWvkTT9xjbCcAE6GhLyvfu3eUCtsk\nEmS/7lpzapq5ZR0QF9JP6+DNb54s/1X003XZTy+4Uuj056j+95/tL+XBTV0o\nHR4WQmMplvPxfsjvzbp+ndd3SlhKk1dLROL3piOYiS+EpSBx+EwJnplHto07\nICsW/n1qznbKX/W2UYXVDr2GfaUbrEd9nzz8g6HLfv2io0xCODCcWtWhAJR0\nGry4SFySnmNwSqhjn7TCgE6/cMvT2xgI1ptIAVgM5kzD+sd3VtmYq2csd8T9\n/1uffsNs8WtY7dJ6nd2w0zkdtZ1ky3+26IYlkv5z3eZK2gEjAfCcOn1TGFaS\nGFGq0FO8n+kDC6Q5QsjKjnfsuS0nYU3kyhvUBassu587BIH5mjNyNrdZkyXq\nLRbzkPB4EaOhGmxFVdaZtsoHWSr23errcsfHlktvxs+8cI2L55nLu2W5OtD+\nY3qMWUsIWONpizOSZRWp0IQFhi78eUX6w36HMOhvf4D+wviCaFb9AlJYRAWB\nkMhIuXSN8jsGKtTZSMZ6GKuAiSumSHkLUOzwy7T2qqB423TlwYLsldp1Hjrh\nFE/oDXnzIz0cAWOUu4DLU0RaPmUAPfu51fVyUUDF1Gsy7a1TjfxbmqtmLYkD\ntQOJ\r\n=no17\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHfduscFo1wDS1lbnAFrH7n6CQc2wcjOWEAb5Q9/jpGHAiAls12TxheWFubpDA13G98LpnOtVfP+EfY7tqKy0HxeiA=="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16_1610526164080_0.5710112861476029"},"_hasShrinkwrap":false},"3.1.16-next.120":{"name":"puppeteer-extra","version":"3.1.16-next.120","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"homepage":"https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra","author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"echo 'docs will currently not be auto-generated'","docs-bak":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-s test:js test:ts","test-ci":"run-s lint test","lint":"eslint src/ test/"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","captcha","user-preferences","chrome","headless","pupeteer","browser","automation","antibot"],"engines":{"node":">=8"},"devDependencies":{"@rollup/plugin-commonjs":"^16.0.0","@rollup/plugin-node-resolve":"^10.0.0","@typescript-eslint/eslint-plugin":"^4.8.2","@typescript-eslint/parser":"^4.8.2","ava":"^3.13.0","documentation-markdown-themes":"13.1.2","eslint":"7","eslint-config-prettier":"^6.15.0","eslint-config-standard-with-typescript":"^19.0.1","eslint-plugin-import":"2","eslint-plugin-node":"11","eslint-plugin-promise":"4","eslint-plugin-standard":"4","npm-run-all":"^4.1.5","playwright":"1.8.0","rimraf":"^3.0.0","rollup":"^2.34.0","rollup-plugin-sourcemaps":"^0.6.3","rollup-plugin-typescript2":"^0.29.0","ts-node":"^9.0.0","typescript":"4.1.2"},"dependencies":{"automation-extra":"^4.2.1-next.587+03bcc08"},"gitHead":"03bcc0821d16e3f32190471e3e6e30b9f04d8710","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/berstend/puppeteer-extra/Test/master)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](http://scraping-chat.cf) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/puppeteer/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@5 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitFor(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitFor(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=automation-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitFor(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-firefox</code></strong></summary><br/>\n\n> [puppeteer-firefox](https://github.com/puppeteer/puppeteer/tree/master/experimental/puppeteer-firefox) is still new and experimental, you can follow it's progress [here](https://aslushnikov.github.io/ispuppeteerfirefoxready/).\n\n```js\n// Any puppeteer API-compatible puppeteer implementation\n// or version can be augmented with `addExtra`.\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteer = addExtra(require('puppeteer-firefox'))\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n    await page.waitFor(10 * 1000)\n    await browser.close()\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitFor(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with Playwright</strong></summary><br/>\n\n[`playwright-extra`] is now available.\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of headless puppeteer harder.\n\n#### 🏴 [`@extra/recaptcha`](/packages/plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`\n- First plugin to support [Playwright](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra) & Puppeteer, Chrome, Firefox and Webkit.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>3.1.15 ➠ 4.1.0</code></summary>\n\n### `3.1.15` ➠ `4.1.0`\n\nMassive rewrite: `puppeteer-extra` is now just a small entry point to [`automation-extra`], which is the underlying shared foundation used by [`playwright-extra`] as well. Existing `puppeteer-extra` plugins and code should continue to work with the new `puppeteer-extra`, please report any issues you might encounter.\n\n- Breaking changes:\n  - `puppeteer.plugins` ➠ `puppeteer.plugins.list`\n  - `puppeteer.pluginNames` ➠ `puppeteer.plugins.names`\n\n</details>\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`puppeteer-firefox`, `chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch e.g. puppeteer-firefox and add plugins\nconst puppeteer = addExtra(require('puppeteer-firefox'))\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2021, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](https://github.com/berstend). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n[playwright-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[`playwright-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[puppeteer-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra\n[automation-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n[`automation-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n","readmeFilename":"readme.md","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"_id":"puppeteer-extra@3.1.16-next.120","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-5nGuLr5YrLVpJp2zfT4p0ro/RM/T7EholSTVGrcpYSisoDP/39XCIldgWPV8JmlzKx3HiMnM+8CMpPeBR9gWLA==","shasum":"eb977505339335eb78009c47b4728c5bbcf575c7","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16-next.120.tgz","fileCount":10,"unpackedSize":39088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIUwCCRA9TVsSAnZWagAAEjcQAJkJScFW+FyVOV7z1P7w\nOh3l1Emub9jXGpa5+y46j/mdE26Z0rNt1Lg2wXd2Zk9YmAVfTNC4xQMlZtzp\nA7Xeeo02hASzM0dDDsDd01C1vx/qxpN47NmbQgjiu/yTaf1cGq/y7/LiGQhv\nPJLMq0x03JILzZHuqeI3i55Bs+McNpP2lXUg2/bywH4ZkLer0Lu82lPzRv/h\neVinMz09iHts23tOHINjPxoczhOlJAfq+wXRqUGqoXwvMbELuDqNGBtyG0tO\np4MIg0Ga/hC3PXhvNgDXUvaXMUqzYdXNBHJ4x0ug5Y4CrtGYefoltOapMXT+\n+hTxxCgDuiU+jxCzZfc9Xlf9FAvIHqDvz5U7e/fFUoue15m7ucTc6cgn1nPQ\nRsYr/hw3CTkzwpgggRURxJEDowdK+YEQhzPFZriVw+jiuBAMWHtGdoIKtpBk\njqfFqsQbHOTOnHHe99nn30pUzXasGsFxsk36lXKVNTcj7xr24t2mVqWPODJn\nBdoRRofh18ldr8ACdFC7iaARdkOWGL4+44YweubWV7Ax6VSue9Syz6OjPfOL\n4x6Ot6cDORty6zYdK7LmrzAmwb7t3XfC0EFeQEY+KAbREolRTk+hDKDRTQRH\nalYTSb3A1uCA3nCbNcyrYef4+jajAYKbyeAtXFQDJNQsw+Ch/Q5azjr3zCqH\nm844\r\n=smLf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIACSAlkoJjfd3V93zLHsDfjcudw8w+NSFFf1p+yOh2U5AiBmtcVNJjDGbY3TI7fES5qBkbR7z8Jf4hrzIlHeyvdxzQ=="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16-next.120_1612794882190_0.18908833562311678"},"_hasShrinkwrap":false},"3.1.16-next.121":{"name":"puppeteer-extra","version":"3.1.16-next.121","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"homepage":"https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra","author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"echo 'docs will currently not be auto-generated'","docs-bak":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-s test:js test:ts","test-ci":"run-s lint test","lint":"eslint src/ test/"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","captcha","user-preferences","chrome","headless","pupeteer","browser","automation","antibot"],"engines":{"node":">=8"},"devDependencies":{"@rollup/plugin-commonjs":"^16.0.0","@rollup/plugin-node-resolve":"^10.0.0","@typescript-eslint/eslint-plugin":"^4.8.2","@typescript-eslint/parser":"^4.8.2","ava":"^3.13.0","documentation-markdown-themes":"13.1.2","eslint":"7","eslint-config-prettier":"^6.15.0","eslint-config-standard-with-typescript":"^19.0.1","eslint-plugin-import":"2","eslint-plugin-node":"11","eslint-plugin-promise":"4","eslint-plugin-standard":"4","npm-run-all":"^4.1.5","playwright":"1.8.0","rimraf":"^3.0.0","rollup":"^2.34.0","rollup-plugin-sourcemaps":"^0.6.3","rollup-plugin-typescript2":"^0.29.0","ts-node":"^9.0.0","typescript":"4.1.2"},"dependencies":{"automation-extra":"^4.2.1-next.588+b071b3f"},"gitHead":"b071b3fba1172b6cb435b4f438a0ba109a5dd937","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/berstend/puppeteer-extra/Test/master)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](http://scraping-chat.cf) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/puppeteer/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@5 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitFor(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitFor(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=automation-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitFor(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-firefox</code></strong></summary><br/>\n\n> [puppeteer-firefox](https://github.com/puppeteer/puppeteer/tree/master/experimental/puppeteer-firefox) is still new and experimental, you can follow it's progress [here](https://aslushnikov.github.io/ispuppeteerfirefoxready/).\n\n```js\n// Any puppeteer API-compatible puppeteer implementation\n// or version can be augmented with `addExtra`.\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteer = addExtra(require('puppeteer-firefox'))\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n    await page.waitFor(10 * 1000)\n    await browser.close()\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitFor(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with Playwright</strong></summary><br/>\n\n[`playwright-extra`] is now available.\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of headless puppeteer harder.\n\n#### 🏴 [`@extra/recaptcha`](/packages/plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`\n- First plugin to support [Playwright](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra) & Puppeteer, Chrome, Firefox and Webkit.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>3.1.15 ➠ 4.1.0</code></summary>\n\n### `3.1.15` ➠ `4.1.0`\n\nMassive rewrite: `puppeteer-extra` is now just a small entry point to [`automation-extra`], which is the underlying shared foundation used by [`playwright-extra`] as well. Existing `puppeteer-extra` plugins and code should continue to work with the new `puppeteer-extra`, please report any issues you might encounter.\n\n- Breaking changes:\n  - `puppeteer.plugins` ➠ `puppeteer.plugins.list`\n  - `puppeteer.pluginNames` ➠ `puppeteer.plugins.names`\n\n</details>\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`puppeteer-firefox`, `chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch e.g. puppeteer-firefox and add plugins\nconst puppeteer = addExtra(require('puppeteer-firefox'))\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2021, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](https://github.com/berstend). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n[playwright-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[`playwright-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[puppeteer-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra\n[automation-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n[`automation-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n","readmeFilename":"readme.md","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"_id":"puppeteer-extra@3.1.16-next.121","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-6rkiYenA3FYQ+oCAM87ZjWPJEgcnV+iJygr6Ru1zjvqT+VEv/qIeLDu1y4BkZ8Wt5lryMwTPwrLeG0n2YK//GA==","shasum":"20ffafa96ae003d075724adb724bbd16e4f3475d","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16-next.121.tgz","fileCount":10,"unpackedSize":39088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIVpbCRA9TVsSAnZWagAACCIP/ifRgfu5ysrm1AShxFVB\nOOOlO3OiIv4S6LoSv5PEC9yJD8WaWLerUKr+fbjO9REzl9tGxzwzHpaxGkKB\n+VR7+JWIo5RiPLEav2W/4en3/2ocIhJgcYRB8MUfVty+LjpZo3ZxraiO6UBN\n9Z4CjrZfWQoaJnwDLs5Osp5pFgZSNh03ZC+rHJBTMYMtbZnUYGB0AE/BpDLj\nbTk9NdHgGRJWk7V2iQIuNidgQWYlTX8SRZCqJ4Rtv+uf71PkLRRvbPBpRjLm\nFgPspBTgPqXoLC/3o5KuBUuLXbWwM2KYGldX8whCGh+aPnB8TPZI5Trc1uIW\nCMcDNSHdw3pf6BYvJdxl/u17o+LLJ9gK7XXPWrvCxbbticVoxpoLsBXnLao3\nJ4GJo9zgSKLFteiVHMy5E0YxnBZbcqnF1QPgK3Imi7TOUM71t+lBDOQzQc4r\nR1pxg0oPp3gIHvc9OIXrWF0rq0IW8QAYdeLufwLD2PkeFL67opJAE1WHHPSn\n/f/YvYhgZz2W3G14poMMHuEHu1RU0j55/Fl9pLalk4UDgp07M/U4p1/fBD6i\nQGY0a5z/XyRPPoeP7artnqC9Wy1ZoGbX5ydi7B9nftF8Ta9WIh0odQKahkLb\n+QJCi2PjXfcAF6iysQbDtrJFgnUxyXYaczeJGkrxgfbr+NdFLCfLPys5Aowy\nJR93\r\n=MfTP\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDeQ9ejxvrFdlE8qjTbyEaC1NfTFC/CgLZPh+Dpz55KXAiA4VErVdXK5XimQ1BSnBgrFy4sKdnKHgFxeNghkfoGNzg=="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16-next.121_1612798554853_0.4776894435328354"},"_hasShrinkwrap":false},"3.1.16-next.122":{"name":"puppeteer-extra","version":"3.1.16-next.122","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"homepage":"https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra","author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"echo 'docs will currently not be auto-generated'","docs-bak":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-s test:js test:ts","test-ci":"run-s lint test","lint":"eslint src/ test/"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","captcha","user-preferences","chrome","headless","pupeteer","browser","automation","antibot"],"engines":{"node":">=8"},"devDependencies":{"@rollup/plugin-commonjs":"^16.0.0","@rollup/plugin-node-resolve":"^10.0.0","@typescript-eslint/eslint-plugin":"^4.8.2","@typescript-eslint/parser":"^4.8.2","ava":"^3.13.0","documentation-markdown-themes":"13.1.2","eslint":"7","eslint-config-prettier":"^6.15.0","eslint-config-standard-with-typescript":"^19.0.1","eslint-plugin-import":"2","eslint-plugin-node":"11","eslint-plugin-promise":"4","eslint-plugin-standard":"4","npm-run-all":"^4.1.5","playwright":"1.8.0","rimraf":"^3.0.0","rollup":"^2.34.0","rollup-plugin-sourcemaps":"^0.6.3","rollup-plugin-typescript2":"^0.29.0","ts-node":"^9.0.0","typescript":"4.1.2"},"dependencies":{"automation-extra":"^4.2.1-next.589+1025243"},"gitHead":"102524307a6c14c938130932c3aeb5f1c105b96d","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/berstend/puppeteer-extra/Test/master)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](http://scraping-chat.cf) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/puppeteer/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@5 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitFor(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitFor(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=automation-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitFor(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-firefox</code></strong></summary><br/>\n\n> [puppeteer-firefox](https://github.com/puppeteer/puppeteer/tree/master/experimental/puppeteer-firefox) is still new and experimental, you can follow it's progress [here](https://aslushnikov.github.io/ispuppeteerfirefoxready/).\n\n```js\n// Any puppeteer API-compatible puppeteer implementation\n// or version can be augmented with `addExtra`.\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteer = addExtra(require('puppeteer-firefox'))\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n    await page.waitFor(10 * 1000)\n    await browser.close()\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitFor(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with Playwright</strong></summary><br/>\n\n[`playwright-extra`] is now available.\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of headless puppeteer harder.\n\n#### 🏴 [`@extra/recaptcha`](/packages/plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`\n- First plugin to support [Playwright](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra) & Puppeteer, Chrome, Firefox and Webkit.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>3.1.15 ➠ 4.1.0</code></summary>\n\n### `3.1.15` ➠ `4.1.0`\n\nMassive rewrite: `puppeteer-extra` is now just a small entry point to [`automation-extra`], which is the underlying shared foundation used by [`playwright-extra`] as well. Existing `puppeteer-extra` plugins and code should continue to work with the new `puppeteer-extra`, please report any issues you might encounter.\n\n- Breaking changes:\n  - `puppeteer.plugins` ➠ `puppeteer.plugins.list`\n  - `puppeteer.pluginNames` ➠ `puppeteer.plugins.names`\n\n</details>\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`puppeteer-firefox`, `chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch e.g. puppeteer-firefox and add plugins\nconst puppeteer = addExtra(require('puppeteer-firefox'))\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2021, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](https://github.com/berstend). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n[playwright-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[`playwright-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[puppeteer-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra\n[automation-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n[`automation-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n","readmeFilename":"readme.md","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"_id":"puppeteer-extra@3.1.16-next.122","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-0y8+tbkg1i0QSLgYwMmxXXkFhEonvADPc54m0h4WIcUoCyw1FLITvKzxTkIw7cP2xdQtKschqbCd4Vnjx/sCYA==","shasum":"b59e923917ad02adf69ad99f35c48710dc0c1ad1","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16-next.122.tgz","fileCount":10,"unpackedSize":39088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIVrVCRA9TVsSAnZWagAAoXUQAJ62HB9By5a8TSxq90OZ\namTtUL4w7o+X/IygQi4XhJWaioJPgeVJnbTU8l32/7YEfwLnxhFNJ6V7CiPs\npD0CWKLPhB8+eIE9SvLJpyf5e8wg13RUEuCJmqQ6zxTNJEpDOBon2mhzdmF7\nKZmRThWh9DYIoAPnDOtuEGdXfVkqL5Y6lc+r8cL3SK+Uh/pSxebbd7dJhbuQ\noYVkm8qP4E+Vox4NzbERTwqD/tzjCvDMzMYhvBJrVjWtxyvwS7mmiSPI+9KN\n5ed93uUF5YYEbeXk9U54mvrO39J96erpMb8k+5eLsljKxD3RuLstL0dTqdOl\n0/pD4waml7PlF9NEfr1P7uM6dVT/troe9gkdbKSRsVBP3JFPeHCdpstJ0Teu\nMBz1mFB/cFqFMb0mLXRpZZdW/xxmy6e4XAoZ54kpZ9ZYhSfcng/Ezo4ALeWf\npyIa0wmzwTL5GUCEDVj6IeVL2mTQ3GJ4EBuAWzXXgJQPYXBRRW89WpUQEbTj\nWlyobYUxq34l+1pSsHuXGm+LpHdntW3reSixBMP89lhzXM95VS1eMr3qXSF+\nE1wpB3jS0HRsx1M1PpjJqZy9s3oUYiSJSSeC9V7CS4JhMqJy63UyfQRL14gj\nb4qiK1QaD8B75B8oQJQKYASBgIDazInk2O9ZtJE1hXoiQPFUceAZuAz2vapv\n6pD/\r\n=bt/q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHYqoWPIuIz11qfUkBKv2UTvDnNtq27iwczyBpETOtRzAiEAub/x+u3v18A0J2qyyArr5ExLr1KQPjPR38kfAXXpDnc="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16-next.122_1612798676933_0.0687781483123251"},"_hasShrinkwrap":false},"3.1.16-next.123":{"name":"puppeteer-extra","version":"3.1.16-next.123","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"homepage":"https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra","author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"echo 'docs will currently not be auto-generated'","docs-bak":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-s test:js test:ts","test-ci":"run-s lint test","lint":"eslint src/ test/"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","captcha","user-preferences","chrome","headless","pupeteer","browser","automation","antibot"],"engines":{"node":">=8"},"devDependencies":{"@rollup/plugin-commonjs":"^16.0.0","@rollup/plugin-node-resolve":"^10.0.0","@typescript-eslint/eslint-plugin":"^4.8.2","@typescript-eslint/parser":"^4.8.2","ava":"^3.13.0","documentation-markdown-themes":"13.1.2","eslint":"7","eslint-config-prettier":"^6.15.0","eslint-config-standard-with-typescript":"^19.0.1","eslint-plugin-import":"2","eslint-plugin-node":"11","eslint-plugin-promise":"4","eslint-plugin-standard":"4","npm-run-all":"^4.1.5","playwright":"1.8.0","rimraf":"^3.0.0","rollup":"^2.34.0","rollup-plugin-sourcemaps":"^0.6.3","rollup-plugin-typescript2":"^0.29.0","ts-node":"^9.0.0","typescript":"4.1.2"},"dependencies":{"automation-extra":"^4.2.1-next.590+a6ed7c4"},"gitHead":"a6ed7c43bd5650e2928316c19bb5de8a69778ddb","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/berstend/puppeteer-extra/Test/master)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](http://scraping-chat.cf) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/puppeteer/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@5 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitFor(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitFor(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=automation-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitFor(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-firefox</code></strong></summary><br/>\n\n> [puppeteer-firefox](https://github.com/puppeteer/puppeteer/tree/master/experimental/puppeteer-firefox) is still new and experimental, you can follow it's progress [here](https://aslushnikov.github.io/ispuppeteerfirefoxready/).\n\n```js\n// Any puppeteer API-compatible puppeteer implementation\n// or version can be augmented with `addExtra`.\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteer = addExtra(require('puppeteer-firefox'))\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n    await page.waitFor(10 * 1000)\n    await browser.close()\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitFor(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with Playwright</strong></summary><br/>\n\n[`playwright-extra`] is now available.\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of headless puppeteer harder.\n\n#### 🏴 [`@extra/recaptcha`](/packages/plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`\n- First plugin to support [Playwright](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra) & Puppeteer, Chrome, Firefox and Webkit.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>3.1.15 ➠ 4.1.0</code></summary>\n\n### `3.1.15` ➠ `4.1.0`\n\nMassive rewrite: `puppeteer-extra` is now just a small entry point to [`automation-extra`], which is the underlying shared foundation used by [`playwright-extra`] as well. Existing `puppeteer-extra` plugins and code should continue to work with the new `puppeteer-extra`, please report any issues you might encounter.\n\n- Breaking changes:\n  - `puppeteer.plugins` ➠ `puppeteer.plugins.list`\n  - `puppeteer.pluginNames` ➠ `puppeteer.plugins.names`\n\n</details>\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`puppeteer-firefox`, `chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch e.g. puppeteer-firefox and add plugins\nconst puppeteer = addExtra(require('puppeteer-firefox'))\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2021, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](https://github.com/berstend). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n[playwright-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[`playwright-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[puppeteer-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra\n[automation-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n[`automation-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n","readmeFilename":"readme.md","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"_id":"puppeteer-extra@3.1.16-next.123","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-BGI+ZR9VVtiWQl6d6xSDFWIwaodytAFFs/Dh3NGfwFz1a1X/pShKyA1A4VfWKi5M0Z7XBcQorNP4nLhoeSjTRA==","shasum":"4d334c4ee0f0d7bfa808188e2c5eeed6b0a355ac","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16-next.123.tgz","fileCount":10,"unpackedSize":39088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIVwKCRA9TVsSAnZWagAAOw0P/R3mC/S9TXuHp7CL0IB3\nLUnCua+XVrAaqtheWkagXhogp63AHTv6TwPVBtE2SdduwT+0uopKvf4tb+3/\nWO82Fhn45F/yQlGex7ghESuRdA229XkDzPt/U3LW28zZ25h4kKVmt0CNwq5d\nFyKm57cUKKyKFX3L8/FtPC5t8f1TDRlyDDCbaxRVtzYeQUsfRGtX0EICJ2Lj\nzcfvCI17NOVaX/1txe75RxHpaJQRWQz+92A/EuRzofBmxs3CZlVPpGkIq4cs\n0xuQKXyuVFxeBFiq8v2QbMmZyWtaoyLUWKTc5aExAej8MDQzc3Rr97DkuYuy\nPeHhtLiOcm/Mwb/YCk02GLrXL/IrsrgQwvssG2gn5jXMoRHBuTa4ASCGfiAz\niCVoRVOIABDQhnMSHvVoVfoqhBevhAWO6kvY6x4Cp7/iBX3AvxgPICwsRXXv\nwNS8Qa0hwEAkYTVKdrPqGm2Wun05eGKFtlU4QzTdZm1C0TeUijubN2Ei6f+K\nBzDA7PmC6fxz+5+Z6OFDPn96gklbQowYqq+HEmdfxOsjswN6cNEPxnAYt7/l\nRiU/KgtpaebH617p9F2VpdsLR3bF7uBSYq4AqSsrJfySNbX5DB4x3rG8Qxvw\nwvRZwkfcKXNmK52Ux+366PZe0yp/Go8Zx5F4ik1SDYgfxzkHtgZPFvWC2Kkk\nFozy\r\n=7m65\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCICO+U5j1+jkFfTfZRC7SjIbE2hGn6OAZRmTd8QYjtlK/AiEAgtTm1RWUNsZES1X/cJuBZD5FfcL/QP3KmKzwNb8GOlU="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16-next.123_1612798986136_0.772182001499111"},"_hasShrinkwrap":false},"3.1.16-next.126":{"name":"puppeteer-extra","version":"3.1.16-next.126","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"homepage":"https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra","author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"echo 'docs will currently not be auto-generated'","docs-bak":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-s test:js test:ts","test-ci":"run-s lint test","lint":"eslint src/ test/"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","captcha","user-preferences","chrome","headless","pupeteer","browser","automation","antibot"],"engines":{"node":">=8"},"devDependencies":{"@rollup/plugin-commonjs":"^16.0.0","@rollup/plugin-node-resolve":"^10.0.0","@typescript-eslint/eslint-plugin":"^4.8.2","@typescript-eslint/parser":"^4.8.2","ava":"^3.13.0","documentation-markdown-themes":"13.1.2","eslint":"7","eslint-config-prettier":"^6.15.0","eslint-config-standard-with-typescript":"^19.0.1","eslint-plugin-import":"2","eslint-plugin-node":"11","eslint-plugin-promise":"4","eslint-plugin-standard":"4","npm-run-all":"^4.1.5","playwright":"1.8.0","rimraf":"^3.0.0","rollup":"^2.34.0","rollup-plugin-sourcemaps":"^0.6.3","rollup-plugin-typescript2":"^0.29.0","ts-node":"^9.0.0","typescript":"4.1.2"},"dependencies":{"automation-extra":"^4.2.1-next.593+35c62f3"},"gitHead":"35c62f372672ee1a329492257766a6deaf292192","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/berstend/puppeteer-extra/Test/master)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](http://scraping-chat.cf) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/puppeteer/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@5 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitFor(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitFor(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=automation-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitFor(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-firefox</code></strong></summary><br/>\n\n> [puppeteer-firefox](https://github.com/puppeteer/puppeteer/tree/master/experimental/puppeteer-firefox) is still new and experimental, you can follow it's progress [here](https://aslushnikov.github.io/ispuppeteerfirefoxready/).\n\n```js\n// Any puppeteer API-compatible puppeteer implementation\n// or version can be augmented with `addExtra`.\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteer = addExtra(require('puppeteer-firefox'))\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n    await page.waitFor(10 * 1000)\n    await browser.close()\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitFor(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with Playwright</strong></summary><br/>\n\n[`playwright-extra`] is now available.\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of headless puppeteer harder.\n\n#### 🏴 [`@extra/recaptcha`](/packages/plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`\n- First plugin to support [Playwright](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra) & Puppeteer, Chrome, Firefox and Webkit.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>3.1.15 ➠ 4.1.0</code></summary>\n\n### `3.1.15` ➠ `4.1.0`\n\nMassive rewrite: `puppeteer-extra` is now just a small entry point to [`automation-extra`], which is the underlying shared foundation used by [`playwright-extra`] as well. Existing `puppeteer-extra` plugins and code should continue to work with the new `puppeteer-extra`, please report any issues you might encounter.\n\n- Breaking changes:\n  - `puppeteer.plugins` ➠ `puppeteer.plugins.list`\n  - `puppeteer.pluginNames` ➠ `puppeteer.plugins.names`\n\n</details>\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`puppeteer-firefox`, `chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch e.g. puppeteer-firefox and add plugins\nconst puppeteer = addExtra(require('puppeteer-firefox'))\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2021, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](https://github.com/berstend). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n[playwright-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[`playwright-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[puppeteer-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra\n[automation-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n[`automation-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n","readmeFilename":"readme.md","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"_id":"puppeteer-extra@3.1.16-next.126","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-UqOsVncHhJPudS4Tt/7aX60Oek9qyzixExgP0kLRzp7/u+JZvmWuYlUEy4B+KKVUKmKmmw7ief/slCX7m0ds/Q==","shasum":"c73d56d48de63b76e582eae270556e5f0b3d84ad","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16-next.126.tgz","fileCount":10,"unpackedSize":39088,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIV3dCRA9TVsSAnZWagAAL1QP/iajWvy5Sz9DJzkqGTuo\njTs+7UgEFT9A6d/QxMnfzshzGbxqFAXEhWx1otE0EMMvyvyV55P80v2Ines0\nA7QVXdfvtOQ5Yiy6Yhu7Ga9+XowVsaY1h/za/c4DRws/JnEFd3MNehWZCRLX\nyf1eo9fYiWkOEEvGW1qR2KMkpvpwJQhG/OnFi+CAERXU6MS9tUsbxQ963tnH\np/ZSavbgEXPwMezXv+0wWt8g2yTlcX9IhLnw5iNwUYlGKq0gey/RNAz4eWZZ\nTrtYFI+Q0l3372X0j7EG06rZD6NvKwS3ClPPL96D0lwYC8iy1M1NXw9j03Pv\nmEV9hHr+TYUMkb8/vxLMC249pcLqaqcfjBczTEWKjty/s0TgI0pIngeIJcO+\ne3fFdXhB68x0LgZdQOwjO1DnKnGeIgO9ZgTIE2FcCXRgW6KRdssV+cQRU5zQ\nMz6iaJgbSbMgLdALhPMNjXieepT6e+wRdNB8z2tKFIuqZSHGCTa+eIGk7g0v\n2vXskaJQ3lfg9t6pV0YX4dJ7IVOQgdqcxRraqnBHetzNhkDlLwII4tv0h314\nSIYvvIsF4cRWR2VcG305YcLuAIqREJm6XsrgYjOz0fwvMT0FrnDJUHkIF341\nLXoRI3KZL2PnCyKxHgFdUhiEHZMrsxYbJKnb/zsht1ZvpZppuIadTkYgGMgd\nnyRe\r\n=OW1X\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDzC1O1MDPQvxaYoV1tTf7WhsXEf5Yk6IDN3swjefO54gIhAJPyM1rA6yoFbgM/D5mVnXGXRwVYQqDLsuIfQqrllMEG"}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16-next.126_1612799452560_0.8978095067673078"},"_hasShrinkwrap":false},"3.1.16-next.149":{"name":"puppeteer-extra","version":"3.1.16-next.149","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"homepage":"https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra","author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"echo 'docs will currently not be auto-generated'","docs-bak":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-s test:js test:ts","test-ci":"run-s lint test","lint":"eslint src/ test/"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","captcha","user-preferences","chrome","headless","pupeteer","browser","automation","antibot"],"engines":{"node":">=8"},"devDependencies":{"@rollup/plugin-commonjs":"^16.0.0","@rollup/plugin-node-resolve":"^10.0.0","@typescript-eslint/eslint-plugin":"^4.8.2","@typescript-eslint/parser":"^4.8.2","ava":"^3.13.0","documentation-markdown-themes":"13.1.2","eslint":"7","eslint-config-prettier":"^6.15.0","eslint-config-standard-with-typescript":"^19.0.1","eslint-plugin-import":"2","eslint-plugin-node":"11","eslint-plugin-promise":"4","eslint-plugin-standard":"4","npm-run-all":"^4.1.5","playwright":"1.8.0","rimraf":"^3.0.0","rollup":"^2.34.0","rollup-plugin-sourcemaps":"^0.6.3","rollup-plugin-typescript2":"^0.29.0","ts-node":"^9.0.0","typescript":"4.1.2"},"dependencies":{"automation-extra":"^4.2.1-next.616+846b2f2"},"gitHead":"846b2f283f7c0cae6dfac5a2a1761df117973e28","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/workflow/status/berstend/puppeteer-extra/Test/master)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](http://scraping-chat.cf) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/puppeteer/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@5 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitFor(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitFor(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=automation-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitFor(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-firefox</code></strong></summary><br/>\n\n> If you're interested in automating firefox [please read this](https://github.com/berstend/puppeteer-extra/wiki/Is-Puppeteer-Firefox-ready-yet%3F).\n> TL;DR: You want to use `playwright-extra` :-)\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitFor(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n<details>\n <summary><strong>Using with Playwright</strong></summary><br/>\n\n[`playwright-extra`] is now available.\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of headless puppeteer harder.\n\n#### 🏴 [`@extra/recaptcha`](/packages/plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`\n- First plugin to support [Playwright](https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra) & Puppeteer, Chrome, Firefox and Webkit.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>3.1.15 ➠ 4.1.0</code></summary>\n\n### `3.1.15` ➠ `4.1.0`\n\nMassive rewrite: `puppeteer-extra` is now just a small entry point to [`automation-extra`], which is the underlying shared foundation used by [`playwright-extra`] as well. Existing `puppeteer-extra` plugins and code should continue to work with the new `puppeteer-extra`, please report any issues you might encounter.\n\n- Breaking changes:\n  - `puppeteer.plugins` ➠ `puppeteer.plugins.list`\n  - `puppeteer.pluginNames` ➠ `puppeteer.plugins.names`\n\n</details>\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`puppeteer-firefox`, `chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch e.g. puppeteer-firefox and add plugins\nconst puppeteer = addExtra(require('puppeteer-firefox'))\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2021, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](https://github.com/berstend). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n[playwright-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[`playwright-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/playwright-extra\n[puppeteer-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra\n[automation-extra]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n[`automation-extra`]: https://github.com/berstend/puppeteer-extra/tree/master/packages/automation-extra\n","readmeFilename":"readme.md","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"_id":"puppeteer-extra@3.1.16-next.149","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-2DBfII0LC0pKgut4Bz2ghBufN4ZXZUm+WorXR0Ikq8SJ34bVXi+KLyHkakc3YYGS6Ttg8t+DMdwO4hzAL/YPFQ==","shasum":"50e8807d1fa9373a395e81973f79d5ab62d80bfa","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.16-next.149.tgz","fileCount":10,"unpackedSize":38558,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgIkhSCRA9TVsSAnZWagAAURoP/RMupbUUhiI2IB05hmTB\nhcdCfyo8LajWTn7gdp5/e0gHBu7NFvkp1pzYwk75JFMTZmogQWc/16tzUDE1\nDsUSkkhgy3TwrOw3cr6fWFQYMBPtNR00vgGXxLk9kQ9DU+E2uJFbOaTwaYq0\nS/VcGGqPJNGMzRlIPHj+VLAr1IjyIFAWJgN+QKHbRINrbpE54GAKLzUPIDYr\nMh9DKrGFqxTHi892obqbJRLFA+flkmdIkNxuaDA9T6b5VTa8RLtV8zwn5gqR\nFybAbzlsKBNl2H/z5/X6ZNaA3PptlEaYmzAeanCqiZdTKckRP1LoIJGNFPOH\nsJ3yl9zSKRi+wiUHGvxU55utjIbUEqq9md4eJ98IFK4o/W/qCUYhEVgXWfkF\nRgtBgo2ezV3zsu1CxF/qomjL0Ov593Ltmt0AphTNDPKOgpqKsKmxoDUY4Rjd\nqfdMcXvW48HMUO5S37/l4IUP5NfBaBGSuNnUfB4cXpzEvLA6H0U+Y+fJDTGD\n62obE3sYLV1m8nbjalGGHQlPz+WF9VoQlL08Bf2PSiBJmiZmBuAxnU7bLgvK\n1FnmQkNT7920Sh4GyajmcVdXmSEd9V2a44OXkfOHD7uWmIU8DwAQVNNhc9uI\nk9okhilmi7xzKh0xmvCi5/OjqABrK/ISENtPWrJb/1rQU43WDIbI0BmQp15t\n5b5f\r\n=cq5Q\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAfHHZO3yp3Xalo1js1revZ5SA4twpeg3eromkSv1iMdAiB4ZdkvcZZXoHUDAoCBRa4FXFVq/Pj1a9gSk923jtEsAg=="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.16-next.149_1612859474053_0.9598699438774325"},"_hasShrinkwrap":false},"3.1.17":{"name":"puppeteer-extra","version":"3.1.17","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"^2.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.8","puppeteer-extra-plugin-anonymize-ua":"^2.2.16","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"704502b1005fbe1ac1e2149ffd3715cc7629b50c","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.17","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-KkrIEZGuQ1uqRK9wo0hIGEspGPlYHQIr31MQcbVy4l3RBCICdNbGpKH5TIyvTwSuuqjjGl62gFq5Naa51OpYsA==","shasum":"873114efb7e2508eff232558f3429c5edc863e51","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.17.tgz","fileCount":13,"unpackedSize":148457,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgKk8dCRA9TVsSAnZWagAA7BMP/jX841T1Fq1AsskJdX3/\n6wN1uXO/kiw8kS8GG1YySksaVcN9z5vgcfse36HosPBpJlbNsnMxFzzEB3GL\nc8EsN/iV6/vwGz5hqkX0V5P4VjyLKTuQsJyYcVPn8rvkwitMVV+dPamQibEw\nfKTaDTNpMR/jFc0brAb82Gyv8jIg4wUT0iRGs/d5gabGZS7vvp580OHSaMIv\ndXFAIHCiGxqEsPHomH/8RnN1JfQEmigsEpDh+t+UDWOWeN0CtJFFsjNw2nh/\nEBM5Zir/BkgInFc7c45CSd9uJekyLlSUt1GQeLX1DzgpnuVmHcOG6VMe1piJ\nLabeu6TLa/S5qnr8liJggNO1QMb+zGQbO0d4eVUGjgYvAG+HQ88SMJYW88do\nSzLihDc1XdZu+biNNjGdUg0v9WTu3TcVUg5Q3LTncGtNQ8wCfvfkL1Uhl1uL\n4W4hMq1Ym/4szLYh/EqSKyGkRG3j9cE8Y0cf07D0zNWRJdpjqtpPxwO/V9Oq\nNfWJE8BHvk4q+QqQycyjYej/GRMqd8ptGMRiP+OWS/0sYilTXL17MEE8VwV2\nzpIbABVfvVIiPw8TIbeE50hhmMPTe7pUEvpNu3eAQhNIxExhb2ZyPbHyLhsp\nWLradNPBvrZwIGSSv2JjuVdShRP34BCO43x9EJJ4kCjtgC0dJSFWE5zmnEmt\nmGWi\r\n=Jb6J\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCsJulxIXH1W1snwPUu+6Og7mZVigzqElSSqUYOgx9atgIhAKS2ojrUGbJuGrUH923qlwRUHiIiAIzNbYCzJB1X1fJJ"}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.17_1613385501183_0.8250050479110922"},"_hasShrinkwrap":false},"3.1.18":{"name":"puppeteer-extra","version":"3.1.18","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/puppeteer":"5.4.3","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^2.0.0","puppeteer-extra-plugin":"^3.1.9","puppeteer-extra-plugin-anonymize-ua":"^2.2.17","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"^3.7.4"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"5.4.3","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"adcc26325c9a01febcd152e5fb79555b29187a5f","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.1.18","_nodeVersion":"15.3.0","_npmVersion":"lerna/3.22.1/node@v15.3.0+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-mGQyAnxaGcZomx7NVC4wgAkZl0MLTdE/GIfwRSbLJ9L4yIxPg9uEA3yiLBe+x09tjhTGEtv8KDef8Bl53RXgiA==","shasum":"4269018e55f7ee62788d13e3eb3d89e842a3d48e","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.1.18.tgz","fileCount":13,"unpackedSize":148312,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgTpVsCRA9TVsSAnZWagAAl4YQAIU9ElOhluvtbE6ltT0c\npzxEu9r59AepiAfb0F0vHCVR7bN31csVvQieBWySSKnQ42LUOf6LrHuO81mn\nzPZXLMUpKKarjazNQIDbCYIdBZLRbeWV0rVuQBfb9bGGkX7wgkDZD92zkab8\nS39w1F0jF7FWCOAPFPld1Zo0uLwrhzK+01wifavdNxlrWtT05i8skW2HrfSk\n+Quj3oI975CEPFHMa9ZB899CcUj0GgHVFUlbaug50WJ/3np7pSeAv9EAzId9\nkENIg2JIrTjOD/yffwfQEriJKOQIgXLBaBuPZNAphznyt8Cf5UAwswD7YZjb\n73nXccLQ7nXDXQReniyuCFqoBCfiCC4kEF3fJk7FWnVLiGLviFBlx+tGy/uM\nHmUbuKBJRPYsAx2cTwOdZj1aXiONiBtJyqa+VYMyh/DOQPo7iGur2QtAZQlU\neu/Eq2R0GctaRFxyoJ9R3Xbp8NTH4UoD2Wdmxw1Ik9CNZdQG/reVWylXNv6p\nmjyIGYmVgtW+hfHApyD+3qG4xfoLmW5h7sg2VAJHByUBUYkpi82lJ+X5W3ml\nhp0j4uYZ1MKV2F5US+RDpdHZAjb3gFPkhCHpWbYcT3IEXZOBiUciqyJhWQGM\nVmQ69pHq+f6X+M0u9fnfeU21crOsieVnGmoB4snqrMDqWy8speWy9mwxMcZd\n1yA3\r\n=dMBB\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIAWFK2l0dpleBdklpjGd0pjKntQV8RVklNY937eaIvAaAiAR+25Dm0ZRpPusY/dwiUiPhoLFDsRiFrg2n4aI21npKg=="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.1.18_1615762795699_0.4401838905646456"},"_hasShrinkwrap":false},"3.2.0":{"name":"puppeteer-extra","version":"3.2.0","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"9","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.3.0","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"008c114b7f056cb1993ea27f45bb837058f62646","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.2.0","_nodeVersion":"14.17.6","_npmVersion":"lerna/3.22.1/node@v14.17.6+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-e2cky/TsgABCB+ydYecvsrYEpGr5BSYEwgid2PqJVbGeLFN7l5kkcWqzCu6eIIQe7lMqTGkIa3LKzegp0KpX/g==","shasum":"38d594e76cee45abf89128e447dea207c6009ba2","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.2.0.tgz","fileCount":12,"unpackedSize":148867,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQC35lNVLrKqu5PE/WNryoSagYsh3BsGWWAbZ5sTLClz3wIgTCJ/hNjT1J5W9tGNjod16jGtBo8drcYqhCS/vHOWHoM="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.2.0_1632234535791_0.35447682766620514"},"_hasShrinkwrap":false},"3.2.1":{"name":"puppeteer-extra","version":"3.2.1","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"9","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.3.1","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"b4a21d20d0065423dd6cf5139a105815716917ae","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.2.1","_nodeVersion":"14.17.6","_npmVersion":"lerna/3.22.1/node@v14.17.6+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-Is6NP4UoogBwfZg+7Dr6R2XlhcsiGSmKLkhHf9AZdgsxKDpTRBIu9jw3PtKbCvn97WliX6MFsEP9Ag0PMTIziA==","shasum":"f1e1420067bb121936f7e0513310371a0a8230fb","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.2.1.tgz","fileCount":12,"unpackedSize":148865,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCcPzzqvRF9MCCPMPZzK/GBwQuCMO927DhKmV+SoqVQxwIgMT8rkIgLuazU9RuOXLa/4NN1IGDydQ8p4eIjPMcioIQ="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.2.1_1632414391540_0.9638517642192701"},"_hasShrinkwrap":false},"3.2.2":{"name":"puppeteer-extra","version":"3.2.2","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"9","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.3.2","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"a2189e9f2164cb39ce828e1b75e57a7a796886e9","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.2.2","_nodeVersion":"14.17.6","_npmVersion":"lerna/3.22.1/node@v14.17.6+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-mj+jyEEyRc+HFN8MmDMTeRHOGep3ljRF9kps6ipspL+aUjxWcIELsA3s8x6OsuxqNlH7b5/fU3MGbW41jvwxJw==","shasum":"cc28fed563d0eba29607731acd3400824bd91256","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.2.2.tgz","fileCount":12,"unpackedSize":148865,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHB5gg1bS7lGStBFCtPjsck9NHWL+0KdvFiU3RT1UtlvAiEArnW2p3NXUqoJ57H5EK0xGklYTZjt3s58LESah/Jb0wU="}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.2.2_1632589069513_0.07691075758300858"},"_hasShrinkwrap":false},"3.2.3":{"name":"puppeteer-extra","version":"3.2.3","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"9","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.3.3","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"dceb82ba3b65ef6f76764ae54f9b4eae53728d78","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.2.3","_nodeVersion":"14.17.6","_npmVersion":"lerna/3.22.1/node@v14.17.6+x64 (darwin)","_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"dist":{"integrity":"sha512-CnSN9yIedbAbS8WmRybaDHJLf6goRk+VYM/kbH6i/+EMadCaAeh2O+1/mFUMN2LbkbDNAp2Vd/UwrTVCHjTxyg==","shasum":"1b24ae12ab7c7660f81922c1065beb5887cc189e","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.2.3.tgz","fileCount":12,"unpackedSize":148865,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh23d0CRA9TVsSAnZWagAAIssP/1ENxaNu7qLSfTl+58oX\nZBW/lhdhfKPoHE8QKi5am4py49EE31cjK/4cnxxhlSaCgBbYYtCvr9UI1Pu8\nrwjUPICGjYp2KiNVzUMod7g3SxyJkTvvy/3mJebUXlLzO5B3JMnLlz++pc1t\n6g9O1NUNXR/DSnfIxxUuvGm52DMkGLuQMb0BX3JN+zrlFNb/1fRkY7R776uO\npBfdBl5hNdwnfzlG2LwjqlHB0Hseml9lJw0anhHejctFEPN+WxKMZQ1//HUy\neWm1rBIDXiy/nYFrCwWPbaHNLjVrlV82JkL0PTNzE1ibd/XZwN0Bqrb7HyAG\n0pfNHPZE9CYZDwu2tFKc9vwYIAhkWHYGlDSzCGiAC702L30F+aSWMwtDemmC\nrqPLfkaG3K+uSieLE/44MHEWsmChUvNUf6CT1rmaV2Ep3YaeSQj5xQ6GIGL0\njg8o9f98vHtxcuw2n3Y7A8qElXUgCttHSzyF42gwbZ5BDQyP2OCQ4hfBKJgm\nXciA7RPHwbuQHAgI4CzHQSWBFlDlkGU0JUrzOsYdqOVed5PICvZ69rNm2GD1\noa//sonhqC+zxU/FKrD04lgXa2byrJI952PCadpgRb0j/roG+jmMJZJoxN2M\nEyb3ziptWZZtRYvg+tleNu1b4Yg40vbrstAkCPbr4dYN34Q7dEO2DRBfJ5yh\nFhVZ\r\n=G7XT\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDWlTAxbyiPjnSB/IAr4Qzj/zdFYrOg0GB+Nft8HHMu2AIhAMiGy2TareFIKm/wyVPPgvd4KTL8AOTwiXolgmldJg0t"}]},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.2.3_1632865880270_0.8053420800116127"},"_hasShrinkwrap":false},"3.3.0":{"name":"puppeteer-extra","version":"3.3.0","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.4.0","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"eebe9fb6f72974e0c98d20b120af9d466cd9bc51","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.0","_nodeVersion":"16.15.0","_npmVersion":"lerna/3.22.1/node@v16.15.0+x64 (darwin)","dist":{"integrity":"sha512-JVYbLkbo3/gNnMs4LapqNFvOeODpx87XM5Q9FX3v+nyjQ2BtD/Gk+0MDXh9einKmq11Nbn2r2cZPfpK5G47x9w==","shasum":"22fe62cd31cc7fc20ebf9f932c177a8c5c909635","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.0.tgz","fileCount":12,"unpackedSize":148929,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDfkK2FFk7FzgPnDwfOduJfRQSEz6eUXh3Fy+MFkKIbpwIgPF0FMa54dXZLb1N6CQII9r7WoC50OEZKopNDhMdeqmg="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJisJRPACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpQzRAAm6hpS8CorI9clZJNfDC5tDhvE+wvt6eiC1ZQA9lcV5TCNjZH\r\nuIU0SnZ0y9ZqNMbbOG9Gq3RAxZOoY0oKuZa0GjgIEwFJn5wl827FYKGNRexz\r\n5MxN79wYQ7OvINssdGRK9dzPwnXxk6KIarDYOPVzp9WcpHYFOmTWMUnfkdEY\r\n2vmUmDrsKu46wdl12B315MnmzKy88aW1xJUr+feucZuRXPrZPtagVyyzXqyF\r\nxzG7hMrb1/uFWvppTy8UQ8bFC4h/eS+mxqsx29wgZ21fiL+G15JMnrKgSAGr\r\n/QRJ5ca0upZJlHX8DWfhYs1RHYgaqIfSdOeY/JPgwL8fHY7RnhV0VcWfR1QO\r\nd/y2C798gRta8rdIR0eQB0X3D9MrPT/duB/jEszFM6GzZxciJh+ApNHxOGQq\r\nua0vA9Qe0uJzOnzjqeJlg5d9lfuswAzapDt+2stbCN3Qrkm6G/J6HcQ+SzG4\r\nx4Go0eAEaUl1R9RTnLvpO75IcrY1zrq9Qi01fcKuHxKWUs4dSL4Yu7e5gRgB\r\nh1q90bv8VqAa/69A3NjvS4sJpjtpHoCU6Q3//0eQQiuazsHOKBHln6LfM5Z6\r\nBr5Cx8Aw6iTmHeekgKxO4l86zxN4aTr3o3sUaOM6P9jrlI8GfJPQfs2/wr+9\r\nZCDXBVJcEwbGmYkZnZkfiJO2Ihn7fXLMczY=\r\n=emtZ\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.0_1655739470832_0.28952772334095567"},"_hasShrinkwrap":false},"3.3.1":{"name":"puppeteer-extra","version":"3.3.1","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.4.1","puppeteer-firefox":"^0.5.0","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"5b39abb432e3d86675a899f3a5ba351d11b7b7ba","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.1","_nodeVersion":"16.15.0","_npmVersion":"lerna/3.22.1/node@v16.15.0+x64 (darwin)","dist":{"integrity":"sha512-ySlwelCtymixsFY7b6S/5ua9u1Q0SX6bJcbodh1kZgQiySC+yjPa2F8QoC+9rco7mINFkm2V8wupSqyI3ITT2g==","shasum":"98c1610314fad286887fe81e142db428d03e44cb","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.1.tgz","fileCount":10,"unpackedSize":146152,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDu40xZnfVoDtSp2ez7+kyfK2mBooDX5Vyi2xdMayJwBQIhAK8tcKbPus5W3w8dvUnrG8EAdnB61O45q03oXVwd2QCP"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixPXaACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmrPEQ//asHgZFQpJs/UUN/qVc7bzUF49mFXiwY8ZxOrNJ+DQrN3GV96\r\nBenVlhoAXleJmuldF6dAatMmBhwankif1AUMzVOcEXblLWslI+Vgb6FdHX0+\r\numNFWls+dXYza7iI0gr+2fzwoUiICjagQKWry2mDbOxLXPe28q6A56Wtw8Vl\r\nUejePqzCdn6hZjbLxXIz2P9p/BZCKS1O+udjU6j1sfjlY3nLGmCbXg22zOFs\r\nkRGTDY4HV/NosX7dC73cMy+drsYukBIjR2FXblzWiGu9NvKzzkiRoik+DUvX\r\nsvzu16+cOPJ0azBiGqmSHXxCdUJRfN08fTf7mgRtey0R2NC2bu7LTJ9CQDr1\r\nQM419Rwl5YI+HxW9UzOJ1Y1EYNs7jm1R4Wa7VSZgWFqjr0HqCMhV/uZEgk7l\r\nWLjKp8OaaqmS3ZcuGHYHQviyOiBhQ8iBrhYq5DKsFU9dvEwPjXUrbnsni4RT\r\n6MMu1N2YmEdDgiridY6jPkkyDfyKEVPwgVN/QuOfguvl7IkS0wlBPK/QH9da\r\ns9KIPko3c0zTvQmwvO11gbgJ/m6cWlfVFheL7SfPVGVoMU9AXFHi1eVgQiEm\r\ndnSREwyN+Lt9gQmEQGeMrK5Pd5fGSHRMBldzRr++KuMlULis+7yrKZqOdonJ\r\nyujiQNsagOvo/2E2BpnCWZxA6m6brqcl4hA=\r\n=WWAR\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.1_1657075162302_0.10178450859647947"},"_hasShrinkwrap":false},"3.3.2":{"name":"puppeteer-extra","version":"3.3.2","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/node":"^18.0.0","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.0","puppeteer-extra-plugin-anonymize-ua":"^2.4.2","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"peerDependencies":{"puppeteer":"*"},"dependencies":{"@types/debug":"^4.1.0","@types/puppeteer":"*","debug":"^4.1.1","deepmerge":"^4.2.2"},"gitHead":"3adeb3df2c204892be51aeb3cb18324fa3dbb93f","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.2","_nodeVersion":"16.15.0","_npmVersion":"lerna/3.22.1/node@v16.15.0+x64 (darwin)","dist":{"integrity":"sha512-I9WRoeiwZqRNyuVNBxqONEyVryV7EQcpDULJxSsAVdbEAz9weJnCNHmlk2dt6lCKMfUz95q9ilHH6+k5o5dUaA==","shasum":"9ebf0cffdb6eea08306d051fbe32390d5f923678","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.2.tgz","fileCount":12,"unpackedSize":147770,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDTq94Ck8RuCrm7nC1gAQWAunPzLvoiYua7lYlEPCpQMgIgNYxgvOCJXU2O7ZDTMHKCR1oklrkqU5khGqDSES9ARRw="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixwsvACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmqm2A/8CTFi/9ShhIonrLPB3cNVkudgpWxAnJkA4uc8LKZyu7P1gDp7\r\nDM4EEFnPcrRnuFJ0KxiRZvA22yWfJ0kC6aKW6TKquuSuBHuu8zjvHflR17JO\r\nHaB8SWG59XbzfgiQmoXd6Q6Na4fAQy5OR6aIK5vGh5e+PBJhbirXlrwDvAB7\r\nZ/o7BOoANtfmOThKEb51G4rSgKt1RAUFVbLd0ZBXHaMGiJY35PtbT1FQSBXY\r\njINfIWe/w7/FXOrmu9oLV492XgqlNOaZQcdqdtnZbEzm4x/eMqm/07u2PIDd\r\ndDfwk0erCwmd8APyEGJAvGJINvU9N7/NFgiuue4uRX8cLxwhQ4VqTIkc9h1m\r\nwWhM9qYc9YULCwZd1ekDq0lBbRpeuWTVc4l4Vrs0TG+ckFLHFdoFg3DN6+xL\r\nvg+huKQODQ9G4CXkEIgc3v4XAy01JOtwuTjxiLUCJGLY0Tn658KUz3ymc7Bi\r\n4zug0QUBR2+cQXuZJaHtQ4nnYnye8Iwtj+5AEpvOXgKKdGlj9/uouIwzxHkm\r\nbAz0NMuspBWVXGaq2YfAJmmdNytQliLu24rQAq4J4SQHFj/sVOAi7XJgk//O\r\nLH3M2lV5DSEn6JKhOzC+VpV3QyX8voocP81DFBq5zRYjgQ9I77OeEfLkQaYz\r\nZkywz/ePDEFj3CFnFx9alcEkJYbas/I145U=\r\n=N0De\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.2_1657211694842_0.02757573371636557"},"_hasShrinkwrap":false},"3.3.3":{"name":"puppeteer-extra","version":"3.3.3","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/node":"^18.0.0","@types/puppeteer":"*","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.1","puppeteer-extra-plugin-anonymize-ua":"^2.4.3","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"dependencies":{"@types/debug":"^4.1.0","debug":"^4.1.1","deepmerge":"^4.2.2"},"peerDependencies":{"@types/puppeteer":"*","puppeteer":"*","puppeteer-core":"*"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"puppeteer-core":{"optional":true},"@types/puppeteer":{"optional":true}},"gitHead":"0ac255cd0b86c5da842bdf323f9979fa2fd3483a","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.3","_nodeVersion":"16.15.0","_npmVersion":"lerna/3.22.1/node@v16.15.0+x64 (darwin)","dist":{"integrity":"sha512-0TiAB617OQr29YQBltLu1q029/vc0s752NvAEXvXHiHgHnxwaNRku+nMMZFIjNEObNwBsk8dx/l+sXbE6peozA==","shasum":"025d5474a41d3da219b58e6df837e2dbbc1b5932","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.3.tgz","fileCount":12,"unpackedSize":148017,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDy2ps6WJAHEK7vew12alO6OgRIQn/gbuP2QH+yt/NBhQIgNbTX2kSabmvLwnwomfr93UJo87prU/teJ8m8TZj5kyk="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJixy2DACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmppjw//TCfzCnJJxx8sIIJKod9v10y0fu3e3S1CR+bTwQtlSj/hnx9I\r\nSs4lvr0qMjY6ygDVSB+3Pg3gunm75Z+7JnBwW7Aig5fmp/vtQ5iEZirCZSLf\r\ne81Sf0gc6pgUBFOJeMU1E6YfBQQqSM775AoQancgFs03SvWRLcYxVd9g94fO\r\ncWVZkI148IrMYb8rPrF9Xe/2fAmyOGu0NMkmvSVdAtt30TShN0pBuBR2nxzM\r\n/AZBgtoS/tgTtwDuAT7tttDS8bXcwibEsO+W9/38x4Rt7/a+Q9QPeKBEVKf6\r\nhMJ8lowvXczoDjQX4tNitO+vMOQhmm55f1jZJjiutsMizJnfNutSzIHmiGA1\r\nMwWYUBoIZU65K8+KhjnC9DrbgCkdgn40TCKlwVCZglzdDgIdTRN8avlU8UPD\r\nVEWeGSlKfqZHIEW4aZjJV+rFYJqKFoVmV6NtUfyD1bjHOjoBBMXSCqZpX00F\r\n9KiWIpqcGkTZv1lQ4/w7M9YLdAzCaWV66iRF63U8b3yOfRwH5u9qp/foT+Kt\r\nXlvkUnt/vd7bKU6NkaX7je3qLq9/7AcORwilucVGKH/jLqqEetipXFAHfyKM\r\nxtS+i154x9bFZy/3CCi8pMCnoA4vLVtruh4PTTs7OyXrzQQF1iNAt6tm88Mo\r\npEct6nyVcy39r93HjHnA6YO8g3Tv336ktmM=\r\n=Pep4\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.3_1657220482644_0.6444764451383305"},"_hasShrinkwrap":false},"3.3.4":{"name":"puppeteer-extra","version":"3.3.4","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/node":"^18.0.0","@types/puppeteer":"*","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.2","puppeteer-extra-plugin-anonymize-ua":"^2.4.4","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"dependencies":{"@types/debug":"^4.1.0","debug":"^4.1.1","deepmerge":"^4.2.2"},"peerDependencies":{"@types/puppeteer":"*","puppeteer":"*","puppeteer-core":"*"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"puppeteer-core":{"optional":true},"@types/puppeteer":{"optional":true}},"gitHead":"26f15d2111338d63651beda85acbedff57356d5f","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.4","_nodeVersion":"16.15.0","_npmVersion":"lerna/3.22.1/node@v16.15.0+x64 (darwin)","dist":{"integrity":"sha512-fN5pHvSMJ8d1o7Z8wLLTQOUBpORD2BcFn+KDs7QnkGZs9SV69hcUcce67vX4L4bNSEG3A0P6Osrv+vWNhhdm8w==","shasum":"e0ecf021783d1112b6b0db20546d5022e632ed55","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.4.tgz","fileCount":12,"unpackedSize":148017,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHJ/rtt6e0sjrA8Q2kF54BB8f4mXzr4rC1yUTSK6Jk4nAiB3+E13tt0mpgtmanQDFRwSQc5b0yR3d9aT5CcMWTRNvg=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJix2V1ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmoB7g//cQ1eGwhJjhbZb8FAkL8NeRCdRA8xY80qZ45xWBDvN7gDflu8\r\n6nOvYRD+dUYsMogm9ub+0IrxF3ql4d0odDv62+OrZDe02va4KzIOYJdjRgYL\r\nhqp3DJHpBlLHV6jrn8zP9YfzM/5LSPRvG6ahRO6hXPxOvXekbrShUH4wzZSo\r\n2ALmQmvyUleCXSWVCZeHbVFcaQOk+75ADBuNiiY851Ku+fYeRUuCdvDD/uCC\r\nyclrj5gEJqao1B+Bsx0rUsQefYxYrMTZyPoFChLkZbi1wv+vO156cRwGe6Tj\r\ngQOm4lLK/3NPQEDVGI2l2U+aB0IXnt3dVsE2rGgfV5fY+DR9C+b1fn+HDGHm\r\nHxvzayLqc/wnUi93QP5P0JvsEwjPnv8Illx0xANhJPAvCc8XVj1SDVvW/xFB\r\nii+MqfMK0h+juBITuxLLGAwVNCc0w2TP07PIp9vr/zATz5gbIsAe9GNnmWNG\r\n+EUmyAf1oONze1h+ixVI0wYp3AcE4d1pJ2BD21WtKsh0OXd8QkWsCrengH/S\r\nJXdJpMQePUEmG0abv3JrnBenbKARFGwDMBd+pdy6xhQFSPCqc79MngjWdqZN\r\nipyLmGZeQ8/E2Gy8cmVscM7n2h6qvqiitIJD3E6CDUHJKX9mckHxxkN7QvPK\r\nPWcI8GUHKqyINPe0NG3tHj+YiIig8Y6uIcs=\r\n=UEm8\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.4_1657234805077_0.7076054525585715"},"_hasShrinkwrap":false},"3.3.5":{"name":"puppeteer-extra","version":"3.3.5","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/node":"^18.0.0","@types/puppeteer":"*","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.3","puppeteer-extra-plugin-anonymize-ua":"^2.4.5","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"dependencies":{"@types/debug":"^4.1.0","debug":"^4.1.1","deepmerge":"^4.2.2"},"peerDependencies":{"@types/puppeteer":"*","puppeteer":"*","puppeteer-core":"*"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"puppeteer-core":{"optional":true},"@types/puppeteer":{"optional":true}},"gitHead":"2f4a357f233b35a7a20f16ce007f5ef3f62765b9","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.5","_nodeVersion":"18.12.1","_npmVersion":"lerna/3.22.1/node@v18.12.1+arm64 (darwin)","dist":{"integrity":"sha512-uxaf+64AkoH9dD4vByKgxeCg9Bv7vQ9Qq3cBezenQSW2ePGdGm9dyaK0TvNHZXhTOGJ9qcw7VSy7dbCpPGf5nA==","shasum":"86953e0d254e2f205d54c965c1c2306bcbb930a0","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.5.tgz","fileCount":12,"unpackedSize":148047,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC1btbY8A7UUrWZtJ0cqq9iIDWblzb2Z33tg8grJv85nwIhAI0n5rMXmUAeLCeyntKL40Xl+ufxyaIvufxTIb782sHs"}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/z/5ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmok4w//ZakNmu5fhnfOhLFUSfY+UYPoGnMyQuH5/bv26tfM0o2DlTBw\r\nF42PsTptXqLdhLU4m0WNWGJ69UZE2rmIppB0eDL+g1ydkrsc8RzEp8jYf1AC\r\nfplvKoTqrPIQ8IdSMN4j/chflaGgDkjqqCQpGe6HXM1rjmNCXFbVIuulcdwV\r\nK2N4ndCbIal1u0f5LPxRazl21ahXpCqy5sszS5mOuA40DK4SA8yW5bCN0hU+\r\nkJu2pAW0rcKfiaPHOrv+S2o0ldkvExgRs6EeXLMjMxeCXkwFq1oLndsrQdqQ\r\n05LSxuQaP2Jng5GaTx4lRjexduAWU75jatUttkBkxtk4p4Z2UecK1+SThe4W\r\nm7Qe65M3agQWWB6mnYZ2jNyCxgzBHp1pW4YANLniILhEJKObExpvZj4V67M6\r\nARgVGgqsLYafcoUQJ3Zpw+/JOcaKsE0YHo/Xm9DUINHOndNuz9EEnC2rd2t8\r\nRTlO14Wh5eqGJ8AbBl1IR/g4BfTGOPXqaznJYmXHkGGQy7VkpR8AUPDggd5M\r\nsMh+niopwK6HPSLuk9aID+YMlmbaiA/CQttnOaUymA3ffKQvderQHUoYN+pB\r\nMV2ZJtkngvN9prJKasP28do3TrbwtOptXKhIb5lxixFhTZXOVd6PhKVNXe7f\r\ntH7UxMKsezBvoEkYUnQV/k6K9ccalriEi4g=\r\n=uBYD\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.5_1677672440938_0.5624794191824767"},"_hasShrinkwrap":false},"3.3.6":{"name":"puppeteer-extra","version":"3.3.6","description":"Teach puppeteer new tricks through plugins.","repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","typings":"dist/index.d.ts","main":"dist/index.cjs.js","module":"dist/index.esm.js","scripts":{"clean":"rimraf dist/*","prebuild":"run-s clean","build":"run-s build:tsc build:rollup ambient-dts","build:tsc":"tsc --module commonjs","build:rollup":"rollup -c rollup.config.ts","docs":"documentation readme --quiet --shallow --github --markdown-theme transitivebs --readme-file readme.md --section API ./src/index.ts","postdocs":"npx prettier --write readme.md","test:ts":"ava -v --config ava.config-ts.js","test:js":"ava -v --serial --concurrency 1 --fail-fast","test":"run-p test:js test:ts","test-ci":"run-s test","ambient-dts":"run-s ambient-dts-copy ambient-dts-fix-path","ambient-dts-copy":"copyfiles -u 1 \"src/**/*.d.ts\" dist","ambient-dts-fix-path":"replace-in-files --string='/// <reference path=\"../src/' --replacement='/// <reference path=\"../dist/' 'dist/**/*.d.ts'"},"keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"engines":{"node":">=8"},"devDependencies":{"@types/node":"^18.0.0","@types/puppeteer":"*","ava":"^2.4.0","documentation-markdown-themes":"^12.1.5","npm-run-all":"^4.1.5","puppeteer":"^10.2.0","puppeteer-extra-plugin":"^3.2.3","puppeteer-extra-plugin-anonymize-ua":"^2.4.6","rimraf":"^3.0.0","rollup":"^1.27.5","rollup-plugin-commonjs":"^10.1.0","rollup-plugin-node-resolve":"^5.2.0","rollup-plugin-sourcemaps":"^0.4.2","rollup-plugin-typescript2":"^0.25.2","ts-node":"^8.5.4","tslint":"^5.20.1","tslint-config-prettier":"^1.18.0","tslint-config-standard":"^9.0.0","typescript":"4.4.3"},"dependencies":{"@types/debug":"^4.1.0","debug":"^4.1.1","deepmerge":"^4.2.2"},"peerDependencies":{"@types/puppeteer":"*","puppeteer":"*","puppeteer-core":"*"},"peerDependenciesMeta":{"puppeteer":{"optional":true},"puppeteer-core":{"optional":true},"@types/puppeteer":{"optional":true}},"gitHead":"39248f1f5deeb21b1e7eb6ae07b8ef73f1231ab9","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"},"homepage":"https://github.com/berstend/puppeteer-extra#readme","_id":"puppeteer-extra@3.3.6","_nodeVersion":"18.12.1","_npmVersion":"lerna/3.22.1/node@v18.12.1+arm64 (darwin)","dist":{"integrity":"sha512-rsLBE/6mMxAjlLd06LuGacrukP2bqbzKCLzV1vrhHFavqQE/taQ2UXv3H5P0Ls7nsrASa+6x3bDbXHpqMwq+7A==","shasum":"fc16ff396aae52664842da9a557ea8fa51eaa8b7","tarball":"https://registry.npmjs.org/puppeteer-extra/-/puppeteer-extra-3.3.6.tgz","fileCount":12,"unpackedSize":148047,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDUNkJzWmOUNaeOVJ7K5fA2dZ3Oj/Dam2r+9V4hibbY9AiBmpm1Gg3R0SPjBlxgJzVo+P9t85RHg2x5Uqo2JjGeD5g=="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJj/0K2ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmo5Ig/8C0NifQ9U0+Fa7pi11gxHTgmY1+snqHMrqxbL8i+Y0vIr6De8\r\nOI96Z8UBpyX0A5Jv1C7sw8NITsZXabByGUMSCOX7umCvd6u0LwjyI/y3lXHh\r\n0jxWf4P3YfVrNzdAwHDo2AUVspz7EYB3shwCgMtboS/MGh6sPn4v2J6/GuoI\r\nVpwokKHcNQS2sGlVt5XpgOeUiyLn+Qk8AM/IL3mJVJ/Wm0JUQD3g7xuOMngb\r\ncVBXSJF619iuEN1xaZrqoERaT01v3F9wF827uXt/YHhXRxTUwnL0Ad07pdXn\r\nqw6tKFArjLBz8zCVQnCadQWln5xGHqjY1cfSIzCk8/d6uy7HnIfTEvTHRNyb\r\nF/3cW8FShQDor09+weYfGlxpDjHh1BH1kTbSj/cSqd/8N07izOIxTxWHuDex\r\nr9n4ER4kB+4G9U5zXc9jVntuZGA1VKicDJsuJ+zp2o56mEPwrUzBcAyvof1M\r\nb20h6MAOUKVN8DkZBgSNZvb0nSD02oHSAbVkQCJVz/yAiecrsbfAbd+Wnlb9\r\nDESw4Egnub5iWXShCU7NOo/civ6h60JculbzNzH3d81KPb1nRlIr9YHdOF1F\r\nSuxWUIDOI5SpagJbMyyzbPvtLtrRQwFYQpSOa3EC15a7QqCu95wF7hLKtXdl\r\nBpMgn9PpDGCYZVHY9hNvXL6MOl+HR1scESM=\r\n=O7zo\r\n-----END PGP SIGNATURE-----\r\n"},"_npmUser":{"name":"berstend","email":"e.ndze.it@gmail.com"},"directories":{},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/puppeteer-extra_3.3.6_1677673142054_0.5423249737320741"},"_hasShrinkwrap":false}},"time":{"created":"2018-05-15T20:06:59.361Z","1.0.1":"2018-05-15T20:06:59.416Z","modified":"2023-03-01T12:19:02.367Z","1.1.0":"2018-05-18T17:45:36.706Z","2.0.1":"2018-05-29T15:56:48.104Z","2.0.2":"2018-06-01T09:46:35.345Z","2.0.3":"2018-06-01T10:03:04.484Z","2.0.4":"2018-06-02T14:17:14.739Z","2.0.5":"2018-06-02T20:03:57.506Z","2.0.6":"2018-06-06T15:58:25.465Z","2.0.7":"2018-06-07T00:53:16.968Z","2.0.10":"2018-08-18T18:18:57.385Z","2.1.1":"2018-09-10T09:26:08.869Z","2.1.2":"2019-02-11T03:22:22.821Z","2.1.3":"2019-02-12T15:06:32.287Z","2.1.6":"2019-11-25T11:13:31.617Z","3.1.2":"2019-11-29T12:54:28.698Z","3.1.3":"2019-11-29T13:27:44.002Z","3.1.4":"2019-11-29T19:22:51.636Z","3.1.5":"2019-12-01T15:17:42.195Z","3.1.6":"2019-12-03T15:23:27.770Z","3.1.7":"2019-12-03T22:52:50.859Z","3.1.8":"2020-01-05T20:30:35.115Z","3.1.9":"2020-01-06T16:25:12.717Z","3.1.10":"2020-07-08T15:00:42.567Z","3.1.11":"2020-07-08T15:09:59.316Z","3.1.12":"2020-07-09T00:09:41.990Z","3.1.13":"2020-07-23T12:34:00.228Z","3.1.14":"2020-08-18T14:58:48.301Z","3.1.15":"2020-08-18T15:37:27.304Z","3.1.16":"2021-01-13T08:22:44.238Z","3.1.16-next.120":"2021-02-08T14:34:42.315Z","3.1.16-next.121":"2021-02-08T15:35:54.970Z","3.1.16-next.122":"2021-02-08T15:37:57.053Z","3.1.16-next.123":"2021-02-08T15:43:06.320Z","3.1.16-next.126":"2021-02-08T15:50:52.727Z","3.1.16-next.149":"2021-02-09T08:31:14.160Z","3.1.17":"2021-02-15T10:38:21.367Z","3.1.18":"2021-03-14T22:59:55.863Z","3.2.0":"2021-09-21T14:28:55.983Z","3.2.1":"2021-09-23T16:26:31.659Z","3.2.2":"2021-09-25T16:57:49.677Z","3.2.3":"2021-09-28T21:51:20.403Z","3.3.0":"2022-06-20T15:37:50.989Z","3.3.1":"2022-07-06T02:39:22.551Z","3.3.2":"2022-07-07T16:34:55.088Z","3.3.3":"2022-07-07T19:01:23.022Z","3.3.4":"2022-07-07T23:00:05.247Z","3.3.5":"2023-03-01T12:07:21.079Z","3.3.6":"2023-03-01T12:19:02.234Z"},"maintainers":[{"name":"berstend","email":"e.ndze.it@gmail.com"}],"description":"Teach puppeteer new tricks through plugins.","keywords":["puppeteer","puppeteer-extra","flash","stealth","prefs","user-preferences","chrome","headless","pupeteer"],"repository":{"type":"git","url":"git+https://github.com/berstend/puppeteer-extra.git"},"author":{"name":"berstend"},"license":"MIT","readme":"# puppeteer-extra [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/berstend/puppeteer-extra/test.yml?branch=master&event=push)](https://github.com/berstend/puppeteer-extra/actions) [![Discord](https://img.shields.io/discord/737009125862408274)](https://extra.community) [![npm](https://img.shields.io/npm/v/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/dt/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra) [![npm](https://img.shields.io/npm/l/puppeteer-extra.svg)](https://www.npmjs.com/package/puppeteer-extra)\n\n> A light-weight wrapper around [`puppeteer`](https://github.com/GoogleChrome/puppeteer) and [friends](#more-examples) to enable cool [plugins](#plugins) through a clean interface.\n\n<a href=\"https://github.com/berstend/puppeteer-extra\"><img src=\"https://i.imgur.com/qtlnoQL.png\" width=\"279px\" height=\"187px\" align=\"right\" /></a>\n\n## Installation\n\n```bash\nyarn add puppeteer puppeteer-extra\n# - or -\nnpm install puppeteer puppeteer-extra\n\n# puppeteer-extra works with any puppeteer version:\nyarn add puppeteer@2.0.0 puppeteer-extra\n```\n\n## Quickstart\n\n```js\n// puppeteer-extra is a drop-in replacement for puppeteer,\n// it augments the installed puppeteer with plugin functionality.\n// Any number of plugins can be added through `puppeteer.use()`\nconst puppeteer = require('puppeteer-extra')\n\n// Add stealth plugin and use defaults (all tricks to hide puppeteer usage)\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\n// Add adblocker plugin to block all ads and trackers (saves bandwidth)\nconst AdblockerPlugin = require('puppeteer-extra-plugin-adblocker')\npuppeteer.use(AdblockerPlugin({ blockTrackers: true }))\n\n// That's it, the rest is puppeteer usage as normal 😊\npuppeteer.launch({ headless: true }).then(async browser => {\n  const page = await browser.newPage()\n  await page.setViewport({ width: 800, height: 600 })\n\n  console.log(`Testing adblocker plugin..`)\n  await page.goto('https://www.vanityfair.com')\n  await page.waitForTimeout(1000)\n  await page.screenshot({ path: 'adblocker.png', fullPage: true })\n\n  console.log(`Testing the stealth plugin..`)\n  await page.goto('https://bot.sannysoft.com')\n  await page.waitForTimeout(5000)\n  await page.screenshot({ path: 'stealth.png', fullPage: true })\n\n  console.log(`All done, check the screenshots. ✨`)\n  await browser.close()\n})\n```\n\nThe above example uses the [`stealth`](/packages/puppeteer-extra-plugin-stealth) and [`adblocker`](/packages/puppeteer-extra-plugin-adblocker) plugin, which need to be installed as well:\n\n```bash\nyarn add puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n# - or -\nnpm install puppeteer-extra-plugin-stealth puppeteer-extra-plugin-adblocker\n```\n\nIf you'd like to see debug output just run your script like so:\n\n```bash\nDEBUG=puppeteer-extra,puppeteer-extra-plugin:* node myscript.js\n```\n\n### More examples\n\n<details>\n <summary><strong>TypeScript usage</strong></summary><br/>\n\n> `puppeteer-extra` and most plugins are written in TS,\n> so you get perfect type support out of the box. :)\n\n```ts\nimport puppeteer from 'puppeteer-extra'\n\nimport AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'\nimport StealthPlugin from 'puppeteer-extra-plugin-stealth'\n\npuppeteer.use(AdblockerPlugin()).use(StealthPlugin())\n\npuppeteer\n  .launch({ headless: false, defaultViewport: null })\n  .then(async browser => {\n    const page = await browser.newPage()\n    await page.goto('https://bot.sannysoft.com')\n    await page.waitForTimeout(5000)\n    await page.screenshot({ path: 'stealth.png', fullPage: true })\n    await browser.close()\n  })\n```\n\n> Please check this [wiki](https://github.com/berstend/puppeteer-extra/wiki/TypeScript-usage) entry in case you have TypeScript related import issues.\n\n![typings](https://i.imgur.com/bNtuTOt.png 'Typings')\n\n</details>\n\n<details>\n <summary><strong>Playwright usage</strong></summary><br/>\n\n[`playright-extra`](/packages/playwright-extra) with plugin support is available as well.\n\n</details>\n\n<details>\n <summary><strong>Multiple puppeteers with different plugins</strong></summary><br/>\n\n```js\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst AnonymizeUA = require('puppeteer-extra-plugin-anonymize-ua')\n\nasync function main() {\n  const pptr1 = addExtra(vanillaPuppeteer)\n  pptr1.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello1/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  const pptr2 = addExtra(vanillaPuppeteer)\n  pptr2.use(\n    AnonymizeUA({\n      customFn: ua => 'Hello2/' + ua.replace('Chrome', 'Beer')\n    })\n  )\n\n  await checkUserAgent(pptr1)\n  await checkUserAgent(pptr2)\n}\n\nmain()\n\nasync function checkUserAgent(pptr) {\n  const browser = await pptr.launch({ headless: true })\n  const page = await browser.newPage()\n  await page.goto('https://httpbin.org/headers', {\n    waitUntil: 'domcontentloaded'\n  })\n  const content = await page.content()\n  console.log(content)\n  await browser.close()\n}\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>puppeteer-cluster</code></strong></summary><br/>\n\n> [puppeteer-cluster](https://github.com/thomasdondorf/puppeteer-cluster) allows you to create a cluster of puppeteer workers and plays well together with `puppeteer-extra`.\n\n```js\nconst { Cluster } = require('puppeteer-cluster')\nconst vanillaPuppeteer = require('puppeteer')\n\nconst { addExtra } = require('puppeteer-extra')\nconst Stealth = require('puppeteer-extra-plugin-stealth')\nconst Recaptcha = require('puppeteer-extra-plugin-recaptcha')\n\nasync function main() {\n  // Create a custom puppeteer-extra instance using `addExtra`,\n  // so we could create additional ones with different plugin config.\n  const puppeteer = addExtra(vanillaPuppeteer)\n  puppeteer.use(Stealth())\n  puppeteer.use(Recaptcha())\n\n  // Launch cluster with puppeteer-extra\n  const cluster = await Cluster.launch({\n    puppeteer,\n    maxConcurrency: 2,\n    concurrency: Cluster.CONCURRENCY_CONTEXT\n  })\n\n  // Define task handler\n  await cluster.task(async ({ page, data: url }) => {\n    await page.goto(url)\n\n    const { hostname } = new URL(url)\n    const { captchas } = await page.findRecaptchas()\n    console.log(`Found ${captchas.length} captcha on ${hostname}`)\n\n    await page.screenshot({ path: `${hostname}.png`, fullPage: true })\n  })\n\n  // Queue any number of tasks\n  cluster.queue('https://bot.sannysoft.com')\n  cluster.queue('https://www.google.com/recaptcha/api2/demo')\n  cluster.queue('http://www.wikipedia.org/')\n\n  await cluster.idle()\n  await cluster.close()\n  console.log(`All done, check the screenshots. ✨`)\n}\n\n// Let's go\nmain().catch(console.warn)\n```\n\nFor using with TypeScript, just change your imports to:\n\n```ts\nimport { Cluster } from 'puppeteer-cluster'\nimport vanillaPuppeteer from 'puppeteer'\n\nimport { addExtra } from 'puppeteer-extra'\nimport Stealth from 'puppeteer-extra-plugin-stealth'\nimport Recaptcha from 'puppeteer-extra-plugin-recaptcha'\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>chrome-aws-lambda</code></strong></summary><br/>\n\n> If you plan to use [chrome-aws-lambda](https://github.com/alixaxel/chrome-aws-lambda) with the [`stealth`](/packages/puppeteer-extra-plugin-stealth) plugin, you'll need to modify the default args to remove the\n> `--disable-notifications` flag to pass all the tests.\n\n```js\nconst chromium = require('chrome-aws-lambda')\nconst { addExtra } = require('puppeteer-extra')\nconst puppeteerExtra = addExtra(chromium.puppeteer)\n\nconst launch = async () => {\n  puppeteerExtra\n    .launch({\n      args: chromium.args,\n      defaultViewport: chromium.defaultViewport,\n      executablePath: await chromium.executablePath,\n      headless: chromium.headless\n    })\n    .then(async browser => {\n      const page = await browser.newPage()\n      await page.goto('https://www.spacejam.com/archive/spacejam/movie/jam.htm')\n      await page.waitForTimeout(10 * 1000)\n      await browser.close()\n    })\n}\n\nlaunch() // Launch Browser\n```\n\n</details>\n\n<details>\n <summary><strong>Using with <code>Kikobeats/browserless</code></strong></summary><br/>\n\n> [Kikobeats/browserless](https://github.com/Kikobeats/browserless) is a puppeteer-like Node.js library for interacting with Headless production scenarios.\n\n```js\nconst puppeteer = require('puppeteer-extra')\nconst StealthPlugin = require('puppeteer-extra-plugin-stealth')\npuppeteer.use(StealthPlugin())\n\nconst browserless = require('browserless')({ puppeteer })\n\nconst saveBufferToFile = (buffer, fileName) => {\n  const wstream = require('fs').createWriteStream(fileName)\n  wstream.write(buffer)\n  wstream.end()\n}\n\nbrowserless\n  .screenshot('https://bot.sannysoft.com', { device: 'iPhone 6' })\n  .then(buffer => {\n    const fileName = 'screenshot.png'\n    saveBufferToFile(buffer, fileName)\n    console.log(`your screenshot is here: `, fileName)\n  })\n```\n\n</details>\n\n---\n\n## Plugins\n\n#### 🔥 [`puppeteer-extra-plugin-stealth`](/packages/puppeteer-extra-plugin-stealth)\n\n- Applies various evasion techniques to make detection of puppeteer harder.\n\n#### 🏴 [`puppeteer-extra-plugin-recaptcha`](/packages/puppeteer-extra-plugin-recaptcha)\n\n- Solves reCAPTCHAs and hCaptchas automatically, using a single line of code: `page.solveRecaptchas()`.\n\n#### [`puppeteer-extra-plugin-adblocker`](/packages/puppeteer-extra-plugin-adblocker)\n\n- Very fast & efficient blocker for ads and trackers. Reduces bandwidth & load times.\n\n#### [`puppeteer-extra-plugin-devtools`](/packages/puppeteer-extra-plugin-devtools)\n\n- Makes puppeteer browser debugging possible from anywhere.\n- Creates a secure tunnel to make the devtools frontend (**incl. screencasting**) accessible from the public internet\n\n#### [`puppeteer-extra-plugin-repl`](/packages/puppeteer-extra-plugin-repl)\n\n- Makes quick puppeteer debugging and exploration fun with an interactive REPL.\n\n#### [`puppeteer-extra-plugin-block-resources`](/packages/puppeteer-extra-plugin-block-resources)\n\n- Blocks resources (images, media, css, etc.) in puppeteer.\n- Supports all resource types, blocking can be toggled dynamically.\n\n#### [`puppeteer-extra-plugin-flash`](/packages/puppeteer-extra-plugin-flash)\n\n- Allows flash content to run on all sites without user interaction.\n\n#### [`puppeteer-extra-plugin-anonymize-ua`](/packages/puppeteer-extra-plugin-anonymize-ua)\n\n- Anonymizes the user-agent on all pages.\n- Supports dynamic replacing, so the browser version stays intact and recent.\n\n#### [`puppeteer-extra-plugin-user-preferences`](/packages/puppeteer-extra-plugin-user-preferences)\n\n- Allows setting custom Chrome/Chromium user preferences.\n- Has itself a plugin interface which is used by e.g. [`puppeteer-extra-plugin-font-size`](/packages/puppeteer-extra-plugin-font-size).\n\n> Check out the [packages folder](/packages/) for more plugins.\n\n### Community Plugins\n\n_These plugins have been generously contributed by members of the community._\n_Please note that they're hosted outside the main project and not under our control or supervision._\n\n#### [`puppeteer-extra-plugin-minmax`](https://github.com/Stillerman/puppeteer-extra-minmax)\n\n- Minimize and maximize puppeteer in real time.\n- Great for manually solving captchas.\n\n#### [`puppeteer-extra-plugin-portal`](https://github.com/claabs/puppeteer-extra-plugin-portal)\n\n- Use the Chromium screencast API to remotely view and interact with puppeteer sessions.\n- Great for remotely intervening when an automated task gets stuck, like captchas.\n\n> Please check the `Contributing` section below if you're interested in creating a plugin as well.\n\n---\n\n## Contributors\n\n<a href=\"https://github.com/berstend/puppeteer-extra/graphs/contributors\">\n  <img src=\"https://contributors-img.firebaseapp.com/image?repo=berstend/puppeteer-extra\" />\n</a>\n\n## Further info\n\n<details>\n <summary><strong>Contributing</strong></summary><br/>\n\nPRs and new plugins are welcome! 🎉 The plugin API for `puppeteer-extra` is clean and fun to use. Have a look the [PuppeteerExtraPlugin](/packages/puppeteer-extra-plugin) base class documentation to get going and check out the [existing plugins](./packages/) (minimal example is the [anonymize-ua](/packages/puppeteer-extra-plugin-anonymize-ua/index.js) plugin) for reference.\n\nWe use a [monorepo](/) powered by [Lerna](https://github.com/lerna/lerna#--use-workspaces) (and yarn workspaces), [ava](https://github.com/avajs/ava) for testing, TypeScript for the core, the [standard](https://standardjs.com/) style for linting and [JSDoc](http://usejsdoc.org/about-getting-started.html) heavily to auto-generate markdown [documentation](https://github.com/documentationjs/documentation) based on code. :-)\n\n</details>\n\n<details>\n <summary><strong>Kudos</strong></summary><br/>\n\n- Thanks to [skyiea](https://github.com/skyiea) for [this PR](https://github.com/GoogleChrome/puppeteer/pull/1806) that started the project idea.\n- Thanks to [transitive-bullshit](https://github.com/transitive-bullshit) for [suggesting](https://github.com/berstend/puppeteer-extra/issues/2) a modular plugin design, which was fun to implement.\n\n</details>\n\n<details>\n <summary><strong>Compatibility</strong></summary><br/>\n\n`puppeteer-extra` and all plugins are [tested continously](https://github.com/berstend/puppeteer-extra/actions) in a matrix of current (stable & LTS) NodeJS and puppeteer versions.\nWe never broke compatibility and still support puppeteer down to very early versions from 2018.\n\nA few plugins won't work in headless mode (it's noted if that's the case) due to Chrome limitations (e.g. the [`user-preferences`](/packages/puppeteer-extra-plugin-user-preferences) plugin), look into `xvfb-run` if you still require a headless experience in these circumstances.\n\n</details>\n\n## Changelog\n\n<details>\n <summary><code>2.1.6 ➠ 3.1.1</code></summary>\n\n### `2.1.6` ➠ `3.1.1`\n\nBig refactor, the core is now **written in TypeScript** 🎉\nThat means out of the box type safety for fellow TS users and nice auto-completion in VSCode for JS users. Also:\n\n- A new [`addExtra`](#addextrapuppeteer) export, to **patch any puppeteer compatible library with plugin functionality** (`chrome-aws-lambda`, etc). This also allows for multiple puppeteer instances with different plugins.\n\nThe API is backwards compatible, I bumped the major version just in case I missed something. Please report any issues you might find with the new release. :)\n\n</details>\n\n---\n\n## API\n\n<!-- Generated by documentation.js. Update this documentation by updating the source code. -->\n\n#### Table of Contents\n\n- [class: PuppeteerExtra](#class-puppeteerextra)\n  - [.use(plugin)](#useplugin)\n  - [.launch(options?)](#launchoptions)\n  - [.connect(options?)](#connectoptions)\n  - [.defaultArgs(options?)](#defaultargsoptions)\n  - [.executablePath()](#executablepath)\n  - [.createBrowserFetcher(options?)](#createbrowserfetcheroptions)\n  - [.plugins](#plugins)\n  - [.getPluginData(name?)](#getplugindataname)\n- [defaultExport()](#defaultexport)\n- [addExtra(puppeteer)](#addextrapuppeteer)\n\n### class: [PuppeteerExtra](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L67-L474)\n\nModular plugin framework to teach `puppeteer` new tricks.\n\nThis module acts as a drop-in replacement for `puppeteer`.\n\nAllows PuppeteerExtraPlugin's to register themselves and\nto extend puppeteer with additional functionality.\n\nExample:\n\n```javascript\nconst puppeteer = require('puppeteer-extra')\npuppeteer.use(require('puppeteer-extra-plugin-anonymize-ua')())\npuppeteer.use(\n  require('puppeteer-extra-plugin-font-size')({ defaultFontSize: 18 })\n)\n;(async () => {\n  const browser = await puppeteer.launch({ headless: false })\n  const page = await browser.newPage()\n  await page.goto('http://example.com', { waitUntil: 'domcontentloaded' })\n  await browser.close()\n})()\n```\n\n---\n\n#### .[use(plugin)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L85-L107)\n\n- `plugin` **PuppeteerExtraPlugin**\n\nReturns: **this** The same `PuppeteerExtra` instance (for optional chaining)\n\nThe **main interface** to register `puppeteer-extra` plugins.\n\nExample:\n\n```javascript\npuppeteer.use(plugin1).use(plugin2)\n```\n\n- **See: [PuppeteerExtraPlugin]**\n\n---\n\n#### .[launch(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L153-L177)\n\n- `options` **Puppeteer.LaunchOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nThe method launches a browser instance with given arguments. The browser will be closed when the parent node.js process is closed.\n\nAugments the original `puppeteer.launch` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeLaunch` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\nExample:\n\n```javascript\nconst browser = await puppeteer.launch({\n  headless: false,\n  defaultViewport: null\n})\n```\n\n---\n\n#### .[connect(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L189-L208)\n\n- `options` **Puppeteer.ConnectOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerconnectoptions).\n\nReturns: **[Promise](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise)&lt;Puppeteer.Browser>**\n\nAttach Puppeteer to an existing Chromium instance.\n\nAugments the original `puppeteer.connect` method with plugin lifecycle methods.\n\nAll registered plugins that have a `beforeConnect` method will be called\nin sequence to potentially update the `options` Object before launching the browser.\n\n---\n\n#### .[defaultArgs(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L215-L217)\n\n- `options` **Puppeteer.ChromeArgOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteerdefaultargsoptions).\n\nReturns: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)>**\n\nThe default flags that Chromium will be launched with.\n\n---\n\n#### .[executablePath()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L220-L222)\n\nReturns: **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)**\n\nPath where Puppeteer expects to find bundled Chromium.\n\n---\n\n#### .[createBrowserFetcher(options?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L229-L233)\n\n- `options` **Puppeteer.FetcherOptions?** See [puppeteer docs](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteercreatebrowserfetcheroptions).\n\nReturns: **Puppeteer.BrowserFetcher**\n\nThis methods attaches Puppeteer to an existing Chromium instance.\n\n---\n\n#### .[plugins](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L283-L285)\n\nType: **[Array](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array)&lt;PuppeteerExtraPlugin>**\n\nGet a list of all registered plugins.\n\n---\n\n#### .[getPluginData(name?)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L310-L315)\n\n- `name` **[string](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String)?** Filter data by optional plugin name\n\nCollects the exposed `data` property of all registered plugins.\nWill be reduced/flattened to a single array.\n\nCan be accessed by plugins that listed the `dataFromPlugins` requirement.\n\nImplemented mainly for plugins that need data from other plugins (e.g. `user-preferences`).\n\n- **See: [PuppeteerExtraPlugin]/data**\n\n---\n\n### [defaultExport()](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L494-L496)\n\nType: **[PuppeteerExtra](#puppeteerextra)**\n\nThe **default export** will behave exactly the same as the regular puppeteer\n(just with extra plugin functionality) and can be used as a drop-in replacement.\n\nBehind the scenes it will try to require either `puppeteer`\nor [`puppeteer-core`](https://github.com/puppeteer/puppeteer/blob/master/docs/api.md#puppeteer-vs-puppeteer-core)\nfrom the installed dependencies.\n\nExample:\n\n```javascript\n// javascript import\nconst puppeteer = require('puppeteer-extra')\n\n// typescript/es6 module import\nimport puppeteer from 'puppeteer-extra'\n\n// Add plugins\npuppeteer.use(...)\n```\n\n---\n\n### [addExtra(puppeteer)](https://github.com/berstend/puppeteer-extra/blob/dc8b90260a927c0c66c4585c5a56092ea9c35049/packages/puppeteer-extra/src/index.ts#L519-L520)\n\n- `puppeteer` **VanillaPuppeteer** Any puppeteer API-compatible puppeteer implementation or version.\n\nReturns: **[PuppeteerExtra](#puppeteerextra)** A fresh PuppeteerExtra instance using the provided puppeteer\n\nAn **alternative way** to use `puppeteer-extra`: Augments the provided puppeteer with extra plugin functionality.\n\nThis is useful in case you need multiple puppeteer instances with different plugins or to add plugins to a non-standard puppeteer package.\n\nExample:\n\n```javascript\n// js import\nconst puppeteerVanilla = require('puppeteer')\nconst { addExtra } = require('puppeteer-extra')\n\n// ts/es6 import\nimport puppeteerVanilla from 'puppeteer'\nimport { addExtra } from 'puppeteer-extra'\n\n// Patch provided puppeteer and add plugins\nconst puppeteer = addExtra(puppeteerVanilla)\npuppeteer.use(...)\n```\n\n---\n\n## License\n\nCopyright © 2018 - 2023, [berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘](mailto:github@berstend.com?subject=[GitHub]%20PuppeteerExtra). Released under the MIT License.\n\n<!-- Markdown footnotes (for links) -->\n\n[puppeteerextraplugin]: https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin 'PuppeteerExtraPlugin Documentation'\n","readmeFilename":"readme.md","homepage":"https://github.com/berstend/puppeteer-extra#readme","bugs":{"url":"https://github.com/berstend/puppeteer-extra/issues"}}