├── .vscode └── settings.json └── business-card-generator ├── src ├── index.js ├── puppeteerCluster.js └── worker.js ├── package.json ├── resources └── data.json ├── script.txt ├── .gitignore └── package-lock.json /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /business-card-generator/src/index.js: -------------------------------------------------------------------------------- 1 | const data = require('../resources/data.json') 2 | const cp = require('child_process') 3 | const moduleName = `${__dirname}/worker.js` 4 | 5 | 6 | ; 7 | (async function main() { 8 | 9 | for (const item of data) { 10 | console.log('data', item.name) 11 | const worker = cp.fork(moduleName, []) 12 | 13 | worker.on('message', msg => console.log(msg)) 14 | worker.on('error', msg => console.error('error!', msg)) 15 | 16 | worker.send(item); 17 | } 18 | 19 | })(); 20 | 21 | 22 | -------------------------------------------------------------------------------- /business-card-generator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "business-card-generator", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.js", 6 | "scripts": { 7 | "start": "rm -rf output && mkdir -p output && node src/index.js", 8 | "cluster": "rm -rf output && mkdir -p output && node src/puppeteerCluster.js" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "puppeteer": "5.2.1", 15 | "puppeteer-cluster": "^0.22.0", 16 | "puppeteer-core": "^5.2.1", 17 | "uuid": "8.3.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /business-card-generator/resources/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Erick Wendel", 4 | "profession": "Node.js Instructor", 5 | "email": "ei@dude.com", 6 | "phone": "+447795001178", 7 | "website": "cursos.erickwendel.com", 8 | "location": "São Paulo, SP" 9 | }, 10 | { 11 | "name": "Xuxa da Silva", 12 | "profession": "Node.js Expert", 13 | "email": "xuxa@silva.com", 14 | "phone": "+550092911", 15 | "website": "xuxadasilva.com", 16 | "location": "Los Angeles, CA" 17 | }, 18 | { 19 | "name": "Chapolin Colorado", 20 | "profession": "Super Heroi", 21 | "email": "chapolin@heroes.com", 22 | "phone": "+119698302834", 23 | "website": "chapolin.com", 24 | "location": "Acapulco, MEX" 25 | } 26 | ] -------------------------------------------------------------------------------- /business-card-generator/script.txt: -------------------------------------------------------------------------------- 1 | show the repo 2 | show the business-card-template URL running 3 | copy the default values from business-card-template 4 | 5 | mkdir business-card-generator 6 | npm init -y 7 | mkdir resources && touch data.json 8 | paste default values 9 | worker.js 10 | async function main(data) { 11 | const pid = process.pid 12 | console.log(`${pid} got message: ${data.name}`); 13 | } 14 | process.once('message', main) 15 | touch index.js 16 | all 17 | run it 18 | 19 | npm i puppeteer uuid 20 | worker.js 21 | const querystring = require('querystring') 22 | 23 | const qs = createQueryStringFromObject(data); 24 | const finalUrl = `${BC_URL}?${qs}` 25 | console.log(finalUrl) 26 | 27 | create render 28 | -> headless: false, 29 | index.js -> only one 30 | run 31 | index.js -> all 32 | headless: true 33 | run 34 | make 70 copies on the JSON and show errors 35 | npm i puppeteer-cluster 36 | touch puppeteerCluster.js 37 | copy dependencies from index.js 38 | copy all worker.js 39 | 40 | import puppeteer-cluster 41 | change main() 42 | change render() 43 | 44 | 45 | 46 | run 47 | 48 | 49 | 50 | https://blog.insiderattack.net/deep-dive-into-worker-threads-in-node-js-e75e10546b11 -------------------------------------------------------------------------------- /business-card-generator/src/puppeteerCluster.js: -------------------------------------------------------------------------------- 1 | const data = require('../resources/data.json') 2 | const { Cluster } = require('puppeteer-cluster') 3 | const querystring = require('querystring') 4 | const { v1 } = require('uuid') 5 | const { join } = require('path') 6 | 7 | const BC_URL = 'https://erickwendel.github.io/business-card-template/index.html' 8 | 9 | 10 | async function render({ page, data: { finalUrl, name } }) { 11 | 12 | const output = join(__dirname, `/../output/${name}-${v1()}.pdf`) 13 | 14 | await page.goto(finalUrl, { waitUntil: 'networkidle2', }); 15 | 16 | await page.pdf({ 17 | path: output, 18 | format: 'A4', 19 | landscape: true, 20 | printBackground: true, 21 | 22 | }); 23 | 24 | console.log('ended', output) 25 | } 26 | 27 | function createQueryStringFromObject(data) { 28 | const separator = null; 29 | const keyDelimiter = null; 30 | const options = { encodeURIComponent: querystring.unescape }; 31 | const qs = querystring.stringify(data, separator, keyDelimiter, options); 32 | return qs; 33 | } 34 | 35 | async function main() { 36 | 37 | const cluster = await Cluster.launch({ 38 | concurrency: Cluster.CONCURRENCY_CONTEXT, 39 | maxConcurrency: 10, 40 | }); 41 | 42 | await cluster.task(render); 43 | 44 | for (const item of data) { 45 | const qs = createQueryStringFromObject(item); 46 | const finalUrl = `${BC_URL}?${qs}` 47 | await cluster.queue({ finalUrl, name: item.name }); 48 | } 49 | 50 | await cluster.idle(); 51 | await cluster.close(); 52 | } 53 | 54 | 55 | main() 56 | 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /business-card-generator/src/worker.js: -------------------------------------------------------------------------------- 1 | const querystring = require('querystring') 2 | const { v1 } = require('uuid') 3 | const { join } = require('path') 4 | const puppeteer = require('puppeteer') 5 | 6 | const BC_URL = 'https://erickwendel.github.io/business-card-template/index.html' 7 | 8 | async function render({ finalUrl, name }) { 9 | const output = join(__dirname, `/../output/${name}-${v1()}.pdf`) 10 | 11 | const browser = await puppeteer.launch({ 12 | // headless: false, 13 | }); 14 | const page = await browser.newPage(); 15 | await page.goto(finalUrl, { waitUntil: 'networkidle2', }); 16 | 17 | await page.pdf({ 18 | path: output, 19 | format: 'A4', 20 | landscape: true, 21 | printBackground: true, 22 | 23 | }); 24 | 25 | await browser.close(); 26 | } 27 | 28 | function createQueryStringFromObject(data) { 29 | const separator = null; 30 | const keyDelimiter = null; 31 | const options = { encodeURIComponent: querystring.unescape }; 32 | const qs = querystring.stringify(data, separator, keyDelimiter, options); 33 | return qs; 34 | } 35 | 36 | async function main(data) { 37 | const pid = process.pid 38 | console.log(`${pid} got message: ${data.name}`); 39 | const qs = createQueryStringFromObject(data); 40 | const finalUrl = `${BC_URL}?${qs}` 41 | 42 | try { 43 | await render({ finalUrl, name: data.name }) 44 | process.send(`${pid} has finished`) 45 | } catch (error) { 46 | process.send(`${pid} has crashed: ${error.stack}`) 47 | } 48 | 49 | } 50 | 51 | 52 | 53 | process.once('message', main) 54 | 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /business-card-generator/.gitignore: -------------------------------------------------------------------------------- 1 | output 2 | 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # Snowpack dependency directory (https://snowpack.dev/) 47 | web_modules/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Microbundle cache 59 | .rpt2_cache/ 60 | .rts2_cache_cjs/ 61 | .rts2_cache_es/ 62 | .rts2_cache_umd/ 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | .parcel-cache 80 | 81 | # Next.js build output 82 | .next 83 | out 84 | 85 | # Nuxt.js build / generate output 86 | .nuxt 87 | dist 88 | 89 | # Gatsby files 90 | .cache/ 91 | # Comment in the public line in if your project uses Gatsby and not Next.js 92 | # https://nextjs.org/blog/next-9-1#public-directory-support 93 | # public 94 | 95 | # vuepress build output 96 | .vuepress/dist 97 | 98 | # Serverless directories 99 | .serverless/ 100 | 101 | # FuseBox cache 102 | .fusebox/ 103 | 104 | # DynamoDB Local files 105 | .dynamodb/ 106 | 107 | # TernJS port file 108 | .tern-port 109 | 110 | # Stores VSCode versions used for testing VSCode extensions 111 | .vscode-test 112 | 113 | # yarn v2 114 | .yarn/cache 115 | .yarn/unplugged 116 | .yarn/build-state.yml 117 | .yarn/install-state.gz 118 | .pnp.* 119 | -------------------------------------------------------------------------------- /business-card-generator/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "business-card-generator", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "8.10.63", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.63.tgz", 10 | "integrity": "sha512-g+nSkeHFDd2WOQChfmy9SAXLywT47WZBrGS/NC5ym5PJ8c8RC6l4pbGaUW/X0+eZJnXw6/AVNEouXWhV4iz72Q==", 11 | "optional": true 12 | }, 13 | "@types/yauzl": { 14 | "version": "2.9.1", 15 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", 16 | "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", 17 | "optional": true, 18 | "requires": { 19 | "@types/node": "*" 20 | } 21 | }, 22 | "agent-base": { 23 | "version": "5.1.1", 24 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", 25 | "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" 26 | }, 27 | "balanced-match": { 28 | "version": "1.0.0", 29 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 30 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 31 | }, 32 | "base64-js": { 33 | "version": "1.3.1", 34 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 35 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 36 | }, 37 | "bl": { 38 | "version": "4.0.3", 39 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz", 40 | "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==", 41 | "requires": { 42 | "buffer": "^5.5.0", 43 | "inherits": "^2.0.4", 44 | "readable-stream": "^3.4.0" 45 | }, 46 | "dependencies": { 47 | "readable-stream": { 48 | "version": "3.6.0", 49 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 50 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 51 | "requires": { 52 | "inherits": "^2.0.3", 53 | "string_decoder": "^1.1.1", 54 | "util-deprecate": "^1.0.1" 55 | } 56 | }, 57 | "string_decoder": { 58 | "version": "1.3.0", 59 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 60 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 61 | "requires": { 62 | "safe-buffer": "~5.2.0" 63 | } 64 | } 65 | } 66 | }, 67 | "brace-expansion": { 68 | "version": "1.1.11", 69 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 70 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 71 | "requires": { 72 | "balanced-match": "^1.0.0", 73 | "concat-map": "0.0.1" 74 | } 75 | }, 76 | "buffer": { 77 | "version": "5.6.0", 78 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 79 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 80 | "requires": { 81 | "base64-js": "^1.0.2", 82 | "ieee754": "^1.1.4" 83 | } 84 | }, 85 | "buffer-crc32": { 86 | "version": "0.2.13", 87 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 88 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 89 | }, 90 | "chownr": { 91 | "version": "1.1.4", 92 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 93 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 94 | }, 95 | "concat-map": { 96 | "version": "0.0.1", 97 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 98 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 99 | }, 100 | "debug": { 101 | "version": "4.1.1", 102 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 103 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 104 | "requires": { 105 | "ms": "^2.1.1" 106 | } 107 | }, 108 | "devtools-protocol": { 109 | "version": "0.0.781568", 110 | "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.781568.tgz", 111 | "integrity": "sha512-9Uqnzy6m6zEStluH9iyJ3iHyaQziFnMnLeC8vK0eN6smiJmIx7+yB64d67C2lH/LZra+5cGscJAJsNXO+MdPMg==" 112 | }, 113 | "end-of-stream": { 114 | "version": "1.4.4", 115 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 116 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 117 | "requires": { 118 | "once": "^1.4.0" 119 | } 120 | }, 121 | "extract-zip": { 122 | "version": "2.0.1", 123 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", 124 | "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", 125 | "requires": { 126 | "@types/yauzl": "^2.9.1", 127 | "debug": "^4.1.1", 128 | "get-stream": "^5.1.0", 129 | "yauzl": "^2.10.0" 130 | } 131 | }, 132 | "fd-slicer": { 133 | "version": "1.1.0", 134 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 135 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 136 | "requires": { 137 | "pend": "~1.2.0" 138 | } 139 | }, 140 | "fs-constants": { 141 | "version": "1.0.0", 142 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 143 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 144 | }, 145 | "fs.realpath": { 146 | "version": "1.0.0", 147 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 148 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 149 | }, 150 | "get-stream": { 151 | "version": "5.2.0", 152 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", 153 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", 154 | "requires": { 155 | "pump": "^3.0.0" 156 | } 157 | }, 158 | "glob": { 159 | "version": "7.1.6", 160 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 161 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 162 | "requires": { 163 | "fs.realpath": "^1.0.0", 164 | "inflight": "^1.0.4", 165 | "inherits": "2", 166 | "minimatch": "^3.0.4", 167 | "once": "^1.3.0", 168 | "path-is-absolute": "^1.0.0" 169 | } 170 | }, 171 | "https-proxy-agent": { 172 | "version": "4.0.0", 173 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", 174 | "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", 175 | "requires": { 176 | "agent-base": "5", 177 | "debug": "4" 178 | }, 179 | "dependencies": { 180 | "debug": { 181 | "version": "4.1.1", 182 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 183 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 184 | "requires": { 185 | "ms": "^2.1.1" 186 | } 187 | }, 188 | "ms": { 189 | "version": "2.1.2", 190 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 191 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 192 | } 193 | } 194 | }, 195 | "ieee754": { 196 | "version": "1.1.13", 197 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 198 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 199 | }, 200 | "inflight": { 201 | "version": "1.0.6", 202 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 203 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 204 | "requires": { 205 | "once": "^1.3.0", 206 | "wrappy": "1" 207 | } 208 | }, 209 | "inherits": { 210 | "version": "2.0.4", 211 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 212 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 213 | }, 214 | "locate-path": { 215 | "version": "5.0.0", 216 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", 217 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", 218 | "requires": { 219 | "p-locate": "^4.1.0" 220 | } 221 | }, 222 | "mime": { 223 | "version": "2.4.6", 224 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", 225 | "integrity": "sha512-RZKhC3EmpBchfTGBVb8fb+RL2cWyw/32lshnsETttkBAyAUXSGHxbEJWWRXc751DrIxG1q04b8QwMbAwkRPpUA==" 226 | }, 227 | "minimatch": { 228 | "version": "3.0.4", 229 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 230 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 231 | "requires": { 232 | "brace-expansion": "^1.1.7" 233 | } 234 | }, 235 | "mkdirp-classic": { 236 | "version": "0.5.3", 237 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 238 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 239 | }, 240 | "ms": { 241 | "version": "2.1.2", 242 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 243 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 244 | }, 245 | "once": { 246 | "version": "1.4.0", 247 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 248 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 249 | "requires": { 250 | "wrappy": "1" 251 | } 252 | }, 253 | "p-limit": { 254 | "version": "2.3.0", 255 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", 256 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", 257 | "requires": { 258 | "p-try": "^2.0.0" 259 | } 260 | }, 261 | "p-locate": { 262 | "version": "4.1.0", 263 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", 264 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", 265 | "requires": { 266 | "p-limit": "^2.2.0" 267 | } 268 | }, 269 | "p-try": { 270 | "version": "2.2.0", 271 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 272 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 273 | }, 274 | "path-is-absolute": { 275 | "version": "1.0.1", 276 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 277 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 278 | }, 279 | "pend": { 280 | "version": "1.2.0", 281 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 282 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 283 | }, 284 | "pkg-dir": { 285 | "version": "4.2.0", 286 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", 287 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", 288 | "requires": { 289 | "find-up": "^4.0.0" 290 | }, 291 | "dependencies": { 292 | "find-up": { 293 | "version": "4.1.0", 294 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", 295 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", 296 | "requires": { 297 | "locate-path": "^5.0.0", 298 | "path-exists": "^4.0.0" 299 | } 300 | }, 301 | "path-exists": { 302 | "version": "4.0.0", 303 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 304 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" 305 | } 306 | } 307 | }, 308 | "progress": { 309 | "version": "2.0.3", 310 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 311 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 312 | }, 313 | "proxy-from-env": { 314 | "version": "1.1.0", 315 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 316 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 317 | }, 318 | "pump": { 319 | "version": "3.0.0", 320 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 321 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 322 | "requires": { 323 | "end-of-stream": "^1.1.0", 324 | "once": "^1.3.1" 325 | } 326 | }, 327 | "puppeteer": { 328 | "version": "5.2.1", 329 | "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.2.1.tgz", 330 | "integrity": "sha512-PZoZG7u+T6N1GFWBQmGVG162Ak5MAy8nYSVpeeQrwJK2oYUlDWpHEJPcd/zopyuEMTv7DiztS1blgny1txR2qw==", 331 | "requires": { 332 | "debug": "^4.1.0", 333 | "devtools-protocol": "0.0.781568", 334 | "extract-zip": "^2.0.0", 335 | "https-proxy-agent": "^4.0.0", 336 | "mime": "^2.0.3", 337 | "pkg-dir": "^4.2.0", 338 | "progress": "^2.0.1", 339 | "proxy-from-env": "^1.0.0", 340 | "rimraf": "^3.0.2", 341 | "tar-fs": "^2.0.0", 342 | "unbzip2-stream": "^1.3.3", 343 | "ws": "^7.2.3" 344 | } 345 | }, 346 | "puppeteer-cluster": { 347 | "version": "0.22.0", 348 | "resolved": "https://registry.npmjs.org/puppeteer-cluster/-/puppeteer-cluster-0.22.0.tgz", 349 | "integrity": "sha512-hmydtMwfVM+idFIDzS8OXetnujHGre7RY3BGL+3njy9+r8Dcu3VALkZHfuBEPf6byKssTCgzxU1BvLczifXd5w==", 350 | "requires": { 351 | "debug": "^4.1.1" 352 | } 353 | }, 354 | "puppeteer-core": { 355 | "version": "5.2.1", 356 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-5.2.1.tgz", 357 | "integrity": "sha512-gLjEOrzwgcnwRH+sm4hS1TBqe2/DN248nRb2hYB7+lZ9kCuLuACNvuzlXILlPAznU3Ob+mEvVEBDcLuFa0zq3g==", 358 | "requires": { 359 | "debug": "^4.1.0", 360 | "devtools-protocol": "0.0.781568", 361 | "extract-zip": "^2.0.0", 362 | "https-proxy-agent": "^4.0.0", 363 | "mime": "^2.0.3", 364 | "pkg-dir": "^4.2.0", 365 | "progress": "^2.0.1", 366 | "proxy-from-env": "^1.0.0", 367 | "rimraf": "^3.0.2", 368 | "tar-fs": "^2.0.0", 369 | "unbzip2-stream": "^1.3.3", 370 | "ws": "^7.2.3" 371 | } 372 | }, 373 | "rimraf": { 374 | "version": "3.0.2", 375 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 376 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 377 | "requires": { 378 | "glob": "^7.1.3" 379 | } 380 | }, 381 | "safe-buffer": { 382 | "version": "5.2.1", 383 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 384 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 385 | }, 386 | "tar-fs": { 387 | "version": "2.1.0", 388 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", 389 | "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", 390 | "requires": { 391 | "chownr": "^1.1.1", 392 | "mkdirp-classic": "^0.5.2", 393 | "pump": "^3.0.0", 394 | "tar-stream": "^2.0.0" 395 | } 396 | }, 397 | "tar-stream": { 398 | "version": "2.1.3", 399 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.3.tgz", 400 | "integrity": "sha512-Z9yri56Dih8IaK8gncVPx4Wqt86NDmQTSh49XLZgjWpGZL9GK9HKParS2scqHCC4w6X9Gh2jwaU45V47XTKwVA==", 401 | "requires": { 402 | "bl": "^4.0.1", 403 | "end-of-stream": "^1.4.1", 404 | "fs-constants": "^1.0.0", 405 | "inherits": "^2.0.3", 406 | "readable-stream": "^3.1.1" 407 | }, 408 | "dependencies": { 409 | "readable-stream": { 410 | "version": "3.6.0", 411 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 412 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 413 | "requires": { 414 | "inherits": "^2.0.3", 415 | "string_decoder": "^1.1.1", 416 | "util-deprecate": "^1.0.1" 417 | } 418 | }, 419 | "string_decoder": { 420 | "version": "1.3.0", 421 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 422 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 423 | "requires": { 424 | "safe-buffer": "~5.2.0" 425 | } 426 | } 427 | } 428 | }, 429 | "through": { 430 | "version": "2.3.8", 431 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 432 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 433 | }, 434 | "unbzip2-stream": { 435 | "version": "1.4.3", 436 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", 437 | "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", 438 | "requires": { 439 | "buffer": "^5.2.1", 440 | "through": "^2.3.8" 441 | } 442 | }, 443 | "util-deprecate": { 444 | "version": "1.0.2", 445 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 446 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 447 | }, 448 | "uuid": { 449 | "version": "8.3.0", 450 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", 451 | "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" 452 | }, 453 | "wrappy": { 454 | "version": "1.0.2", 455 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 456 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 457 | }, 458 | "ws": { 459 | "version": "7.3.1", 460 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz", 461 | "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==" 462 | }, 463 | "yauzl": { 464 | "version": "2.10.0", 465 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 466 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 467 | "requires": { 468 | "buffer-crc32": "~0.2.3", 469 | "fd-slicer": "~1.1.0" 470 | } 471 | } 472 | } 473 | } 474 | --------------------------------------------------------------------------------