├── .gitignore ├── .nowignore ├── README.md ├── api └── index.js ├── assets ├── logo.png ├── puppetron-favicon.png └── puppetron-favicon.svg ├── blocked.json ├── index.html ├── package-lock.json ├── package.json └── vercel.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .vercel 4 | .env -------------------------------------------------------------------------------- /.nowignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | README.md -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Puppetron 2 | 3 | > [Puppeteer](https://github.com/puppeteer/puppeteer) (Headless Chrome Node API)-based rendering solution. 4 | 5 | Videos & Tweets: 6 | 7 | - Demo 8 | - `clipSelector` demo 9 | - CJK fonts support 10 | - Emoji support 11 | 12 | **⚠️⚠️⚠️ NOTE:** Starting version 2.0, CJK and emoji support is gone. 13 | 14 | ## 🚧🚧🚧 PLEASE READ THIS 🚧🚧🚧 15 | 16 | **Do NOT use this for production use-cases.** 17 | 18 | This is just a demo site of what cool things that `Puppeteer` can do. Under any circumstances, this site may be down any time or be heavily rate-limited to prevent abuse. 19 | 20 | Please check out what [Puppeteer](https://github.com/GoogleChrome/puppeteer) can do for your own use case and host on your own servers. 21 | 22 | ## API 23 | 24 | The API can perform 3 actions: 25 | 26 | - [Screenshot](#screenshot) - take a screenshot of the web page 27 | - [Render](#render) - render and serialize a HTML copy of the web page 28 | - [PDF](#pdf) - generate a PDF of the web page 29 | 30 | **`URL`** - the URL with encoded `pathname`, `search` and `hash`. 31 | 32 | Global parameters: 33 | 34 | - `width` - width of viewport/screenshot (default: `1024`) 35 | - `height` - height of viewport/screenshot (default: `768`) 36 | 37 | ### Screenshot 38 | 39 | ``` 40 | /screenshot/{URL} 41 | ...or 42 | /{URL} 43 | ``` 44 | 45 | Parameters: 46 | 47 | - `thumbWidth` - width of thumbnail, respecting aspect ratio (no default, has to be smaller than `width`) 48 | - `fullPage` - takes a screenshot of the full scrollable page (default: `false`). If the page is too long, it may time out. 49 | - `clipSelector` - CSS selector of element to be clipped (no default). E.g.: `.weather-forecast`. 50 | 51 | ### Render 52 | 53 | ``` 54 | /render/{URL} 55 | ``` 56 | 57 | Notes: 58 | 59 | - `script` tags except `JSON-LD` will be removed 60 | - `link[rel=import]` tags will be removed 61 | - HTML comments will be removed 62 | - `base` tag will be added for loading relative resources 63 | - Elements with absolute paths like `src="/xxx"` or `href="/xxx"` will be prepended with the origin URL. 64 | 65 | Parameters: _None_ 66 | 67 | ### PDF 68 | 69 | ``` 70 | /pdf/{URL} 71 | ``` 72 | 73 | Parameters: 74 | 75 | - `format`: Paper format that [Puppeteer supports](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagepdfoptions). E.g.: `Letter`, `Legal`, `A4`, etc. (default: `Letter`) 76 | - `pageRanges`: Paper ranges to print. E.g., `1-5`, `8`, `11-13` (default all pages) 77 | 78 | ## Development 79 | 80 | ### Requirements 81 | 82 | - [Node.js](https://nodejs.org/en/) 83 | - [Vercel](https://vercel.com/download) 84 | 85 | #### Steps 86 | 87 | 1. `npm i` 88 | 2. `npm start` 89 | 3. Load `localhost:3000` 90 | 91 | ## Credits 92 | 93 | Block list from [Prerender](https://github.com/prerender/prerender/blob/master/lib/resources/blocked-resources.json). 94 | 95 | For version 1.0, this uses [`cheeaun/puppeteer`](https://hub.docker.com/r/cheeaun/puppeteer/) Docker image. 96 | 97 | For version 2.0, this uses some parts from [Zeit's now-examples: misc-screenshot](https://github.com/zeit/now-examples/blob/master/misc-screenshot/Dockerfile). 98 | 99 | Inspired by [`zenato/puppeteer`](<(https://hub.docker.com/r/zenato/puppeteer/)>), [`puppeteer-renderer`](https://github.com/zenato/puppeteer-renderer) and [Rendertron](https://render-tron.appspot.com/). 100 | -------------------------------------------------------------------------------- /api/index.js: -------------------------------------------------------------------------------- 1 | const { CAPTCHA_SECRET, NOW_REGION, VERCEL_REGION } = process.env; 2 | const fs = require('fs'); 3 | const http = require('http'); 4 | const { URL } = require('url'); 5 | 6 | const chrome = require('chrome-aws-lambda'); 7 | const puppeteer = require('puppeteer-core'); 8 | 9 | const { verify } = require('hcaptcha'); 10 | 11 | const isDev = 12 | NOW_REGION === 'dev1' || 13 | VERCEL_REGION === 'dev1' || 14 | (!NOW_REGION && !VERCEL_REGION); 15 | // console.log({ isDev }); 16 | 17 | const jimp = require('jimp'); 18 | const pTimeout = require('p-timeout'); 19 | const LRU = require('lru-cache'); 20 | 21 | const cache = new LRU({ 22 | max: process.env.CACHE_SIZE || Infinity, 23 | maxAge: 1000 * 60, // 1 minute 24 | noDisposeOnSet: true, 25 | dispose: async (url, page) => { 26 | try { 27 | if (page && page.close) { 28 | console.log('🗑 Disposing ' + url); 29 | page.removeAllListeners(); 30 | await page.deleteCookie(await page.cookies()); 31 | await page.close(); 32 | } 33 | } catch (e) {} 34 | }, 35 | }); 36 | setInterval(() => cache.prune(), 1000 * 60); // Prune every minute 37 | 38 | const blocked = require('../blocked.json'); 39 | const blockedRegExp = new RegExp('(' + blocked.join('|') + ')', 'i'); 40 | 41 | const truncate = (str, len) => 42 | str.length > len ? str.slice(0, len) + '…' : str; 43 | 44 | let browser; 45 | const localChrome = isDev ? require('chrome-finder')() : null; 46 | if (isDev) console.log(localChrome); 47 | 48 | async function handler(req, res) { 49 | const { host } = req.headers; 50 | 51 | if (req.url == '/') { 52 | res.writeHead(200, { 53 | 'content-type': 'text/html; charset=utf-8', 54 | 'cache-control': 'public,max-age=31536000', 55 | }); 56 | res.end(fs.readFileSync('index.html')); 57 | return; 58 | } 59 | 60 | if (req.url == '/favicon.ico') { 61 | res.writeHead(204); 62 | res.end(); 63 | return; 64 | } 65 | 66 | if (req.url == '/status') { 67 | res.writeHead(200, { 68 | 'content-type': 'application/json', 69 | }); 70 | res.end( 71 | JSON.stringify( 72 | { 73 | pages: cache.keys(), 74 | process: { 75 | versions: process.versions, 76 | memoryUsage: process.memoryUsage(), 77 | }, 78 | }, 79 | null, 80 | '\t', 81 | ), 82 | ); 83 | return; 84 | } 85 | 86 | const [_, action] = req.url.match(/^\/(screenshot|render|pdf)/i) || [ 87 | '', 88 | '', 89 | '', 90 | ]; 91 | 92 | if (!action) { 93 | res.writeHead(400, { 94 | 'content-type': 'text/plain', 95 | }); 96 | res.end('Something is wrong. Invalid URL.'); 97 | return; 98 | } 99 | 100 | if (cache.itemCount > 20) { 101 | res.writeHead(420, { 102 | 'content-type': 'text/plain', 103 | }); 104 | res.end( 105 | `There are ${cache.itemCount} pages in the current instance now. Please try again in few minutes.`, 106 | ); 107 | return; 108 | } 109 | 110 | let page, pageURL; 111 | try { 112 | const { searchParams } = new URL(req.url, 'http://test.com'); 113 | pageURL = searchParams.get('url'); 114 | 115 | if (!/^https?:\/\//i.test(pageURL)) { 116 | throw new Error('Invalid URL'); 117 | } 118 | 119 | const token = searchParams.get('token'); 120 | if (!token) throw new Error('No token'); 121 | await verify(CAPTCHA_SECRET, token); 122 | 123 | const { hostname, pathname } = new URL(pageURL); 124 | const path = decodeURIComponent(pathname); 125 | 126 | await new Promise((resolve, reject) => { 127 | const req = http.request( 128 | { 129 | method: 'HEAD', 130 | host: hostname, 131 | path, 132 | }, 133 | ({ statusCode, headers }) => { 134 | if ( 135 | !headers || 136 | (statusCode == 200 && !/text\/html/i.test(headers['content-type'])) 137 | ) { 138 | reject(new Error('Not a HTML page')); 139 | } else { 140 | resolve(); 141 | } 142 | }, 143 | ); 144 | req.on('error', reject); 145 | req.end(); 146 | }); 147 | 148 | let actionDone = false; 149 | const width = parseInt(searchParams.get('width'), 10) || 1024; 150 | const height = parseInt(searchParams.get('height'), 10) || 768; 151 | 152 | page = cache.get(pageURL); 153 | if (!page) { 154 | if (!browser) { 155 | console.log('🚀 Launch browser!'); 156 | const config = { 157 | ignoreHTTPSErrors: true, 158 | ...(isDev 159 | ? { 160 | headless: false, 161 | executablePath: localChrome, 162 | } 163 | : { 164 | args: chrome.args, 165 | executablePath: await chrome.executablePath, 166 | headless: chrome.headless, 167 | }), 168 | }; 169 | browser = await puppeteer.launch(config); 170 | } 171 | page = await browser.newPage(); 172 | 173 | const nowTime = +new Date(); 174 | let reqCount = 0; 175 | await page.setRequestInterception(true); 176 | page.on('request', (request) => { 177 | const url = request.url(); 178 | const method = request.method(); 179 | const resourceType = request.resourceType(); 180 | 181 | // Skip data URIs 182 | if (/^data:/i.test(url)) { 183 | request.continue(); 184 | return; 185 | } 186 | 187 | const seconds = (+new Date() - nowTime) / 1000; 188 | const shortURL = truncate(url, 70); 189 | const otherResources = /^(manifest|other)$/i.test(resourceType); 190 | // Abort requests that exceeds 15 seconds 191 | // Also abort if more than 100 requests 192 | if (seconds > 15 || reqCount > 100 || actionDone) { 193 | console.log(`❌⏳ ${method} ${shortURL}`); 194 | request.abort(); 195 | } else if (blockedRegExp.test(url) || otherResources) { 196 | console.log(`❌ ${method} ${shortURL}`); 197 | request.abort(); 198 | } else { 199 | console.log(`✅ ${method} ${shortURL}`); 200 | request.continue(); 201 | reqCount++; 202 | } 203 | }); 204 | 205 | let responseReject; 206 | const responsePromise = new Promise((_, reject) => { 207 | responseReject = reject; 208 | }); 209 | page.on('response', ({ headers }) => { 210 | const location = headers['location']; 211 | if (location && location.includes(host)) { 212 | responseReject(new Error('Possible infinite redirects detected.')); 213 | } 214 | }); 215 | 216 | await page.setViewport({ 217 | width, 218 | height, 219 | }); 220 | 221 | console.log('⬇️ Fetching ' + pageURL); 222 | await Promise.race([ 223 | responsePromise, 224 | page.goto(pageURL, { 225 | waitUntil: 'networkidle2', 226 | }), 227 | ]); 228 | 229 | // Pause all media and stop buffering 230 | page.frames().forEach((frame) => { 231 | frame.evaluate(() => { 232 | document.querySelectorAll('video, audio').forEach((m) => { 233 | if (!m) return; 234 | if (m.pause) m.pause(); 235 | m.preload = 'none'; 236 | }); 237 | }); 238 | }); 239 | } else { 240 | await page.setViewport({ 241 | width, 242 | height, 243 | }); 244 | } 245 | 246 | console.log('💥 Perform action: ' + action); 247 | 248 | switch (action) { 249 | case 'render': { 250 | const raw = searchParams.get('raw') || false; 251 | 252 | const content = await pTimeout( 253 | raw 254 | ? page.content() 255 | : page.evaluate(() => { 256 | let content = ''; 257 | if (document.doctype) { 258 | content = new XMLSerializer().serializeToString( 259 | document.doctype, 260 | ); 261 | } 262 | 263 | const doc = document.documentElement.cloneNode(true); 264 | 265 | // Remove scripts except JSON-LD 266 | const scripts = doc.querySelectorAll( 267 | 'script:not([type="application/ld+json"])', 268 | ); 269 | scripts.forEach((s) => s.parentNode.removeChild(s)); 270 | 271 | // Remove import tags 272 | const imports = doc.querySelectorAll('link[rel=import]'); 273 | imports.forEach((i) => i.parentNode.removeChild(i)); 274 | 275 | const { origin, pathname } = location; 276 | // Inject for loading relative resources 277 | if (!doc.querySelector('base')) { 278 | const base = document.createElement('base'); 279 | base.href = origin + pathname; 280 | doc.querySelector('head').appendChild(base); 281 | } 282 | 283 | // Try to fix absolute paths 284 | const absEls = doc.querySelectorAll( 285 | 'link[href^="/"], script[src^="/"], img[src^="/"]', 286 | ); 287 | absEls.forEach((el) => { 288 | const href = el.getAttribute('href'); 289 | const src = el.getAttribute('src'); 290 | if (src && /^\/[^/]/i.test(src)) { 291 | el.src = origin + src; 292 | } else if (href && /^\/[^/]/i.test(href)) { 293 | el.href = origin + href; 294 | } 295 | }); 296 | 297 | content += doc.outerHTML; 298 | 299 | // Remove comments 300 | content = content.replace(//g, ''); 301 | 302 | return content; 303 | }), 304 | 10 * 1000, 305 | 'Render timed out', 306 | ); 307 | 308 | res.writeHead(200, { 309 | 'content-type': 'text/html; charset=UTF-8', 310 | 'cache-control': 'public,max-age=31536000', 311 | }); 312 | res.end(content); 313 | break; 314 | } 315 | case 'pdf': { 316 | const format = searchParams.get('format') || null; 317 | const pageRanges = searchParams.get('pageRanges') || ''; 318 | 319 | const pdf = await pTimeout( 320 | page.pdf({ 321 | format, 322 | pageRanges, 323 | }), 324 | 10 * 1000, 325 | 'PDF timed out', 326 | ); 327 | 328 | res.writeHead(200, { 329 | 'content-type': 'application/pdf', 330 | 'cache-control': 'public,max-age=31536000', 331 | }); 332 | res.end(pdf, 'binary'); 333 | break; 334 | } 335 | default: { 336 | const thumbWidth = parseInt(searchParams.get('thumbWidth'), 10) || null; 337 | const fullPage = searchParams.get('fullPage') == 'true' || false; 338 | const clipSelector = searchParams.get('clipSelector'); 339 | 340 | let screenshot; 341 | if (clipSelector) { 342 | const handle = await page.$(clipSelector); 343 | if (handle) { 344 | screenshot = await pTimeout( 345 | handle.screenshot({ 346 | type: 'jpeg', 347 | }), 348 | 20 * 1000, 349 | 'Screenshot timed out', 350 | ); 351 | } 352 | } else { 353 | screenshot = await pTimeout( 354 | page.screenshot({ 355 | type: 'jpeg', 356 | fullPage, 357 | }), 358 | 20 * 1000, 359 | 'Screenshot timed out', 360 | ); 361 | } 362 | 363 | res.writeHead(200, { 364 | 'content-type': 'image/jpeg', 365 | 'cache-control': 'public,max-age=31536000', 366 | }); 367 | 368 | if (thumbWidth && thumbWidth < width) { 369 | const image = await jimp.read(screenshot); 370 | image 371 | .resize(thumbWidth, jimp.AUTO) 372 | .quality(90) 373 | .getBuffer(jimp.MIME_JPEG, (err, buffer) => { 374 | res.end(buffer, 'binary'); 375 | }); 376 | } else { 377 | res.end(screenshot, 'binary'); 378 | } 379 | } 380 | } 381 | 382 | actionDone = true; 383 | console.log('💥 Done action: ' + action); 384 | if (!cache.has(pageURL)) { 385 | cache.set(pageURL, page); 386 | 387 | // Try to stop all execution 388 | page.frames().forEach((frame) => { 389 | frame.evaluate(() => { 390 | // Clear all timer intervals https://stackoverflow.com/a/6843415/20838 391 | for (var i = 1; i < 99999; i++) window.clearInterval(i); 392 | // Disable all XHR requests 393 | XMLHttpRequest.prototype.send = (_) => _; 394 | // Disable all RAFs 395 | requestAnimationFrame = (_) => _; 396 | }); 397 | }); 398 | } 399 | } catch (e) { 400 | if (page) { 401 | console.error(e); 402 | console.log('💔 Force close ' + pageURL); 403 | page.removeAllListeners(); 404 | page.close(); 405 | } 406 | cache.del(pageURL); 407 | const { message = '' } = e; 408 | res.writeHead(400, { 409 | 'content-type': 'text/plain', 410 | }); 411 | res.end('Oops. Something is wrong.\n\n' + message); 412 | 413 | // Handle websocket not opened error 414 | if (/not opened/i.test(message) && browser) { 415 | console.error('🕸 Web socket failed'); 416 | try { 417 | browser.close(); 418 | browser = null; 419 | } catch (err) { 420 | console.warn(`Chrome could not be killed ${err.message}`); 421 | browser = null; 422 | } 423 | } 424 | } 425 | } 426 | 427 | module.exports = handler; 428 | 429 | if (isDev) { 430 | const PORT = process.env.PORT || 3000; 431 | const listen = () => console.log(`Listening on ${PORT}...`); 432 | require('http').createServer(handler).listen(PORT, listen); 433 | } 434 | 435 | process.on('SIGINT', () => { 436 | if (browser) browser.close(); 437 | process.exit(); 438 | }); 439 | 440 | process.on('unhandledRejection', (reason, p) => { 441 | console.log('Unhandled Rejection at:', p, 'reason:', reason); 442 | }); 443 | -------------------------------------------------------------------------------- /assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheeaun/puppetron/c05a6d7b98852f5fef292818727759c0e1a9f72d/assets/logo.png -------------------------------------------------------------------------------- /assets/puppetron-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cheeaun/puppetron/c05a6d7b98852f5fef292818727759c0e1a9f72d/assets/puppetron-favicon.png -------------------------------------------------------------------------------- /assets/puppetron-favicon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /blocked.json: -------------------------------------------------------------------------------- 1 | [ 2 | "google-analytics.com", 3 | "api.mixpanel.com", 4 | "stats.g.doubleclick.net", 5 | "mc.yandex.ru", 6 | "beacon.tapfiliate.com", 7 | "js-agent.newrelic.com", 8 | "api.segment.io", 9 | "woopra.com", 10 | "static.olark.com", 11 | "static.getclicky.com", 12 | "cdn.heapanalytics.com", 13 | "googleads.g.doubleclick.net", 14 | "pagead2.googlesyndication.com", 15 | "fullstory.com/rec", 16 | "navilytics.com/nls_ajax.php", 17 | "log.optimizely.com/event", 18 | "hn.inspectlet.com", 19 | "tpc.googlesyndication.com", 20 | "partner.googleadservices.com", 21 | "pixel.quantserve.com", 22 | "pixel.mathtag.com", 23 | "pixel.rubiconproject.com", 24 | "logx.optimizely.com", 25 | "akstat.io", 26 | "go-mpulse.net", 27 | "doubleclick.net/pixel", 28 | "cx.atdmt.com", 29 | "sb.scorecardresearch.com" 30 | ] 31 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Puppetron 5 | 6 | 71 | 72 |

Puppetron

73 |
74 | 75 |
76 |
77 | 78 | 79 | 80 |
81 | 82 | 135 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppetron", 3 | "version": "6.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/runtime": { 8 | "version": "7.9.6", 9 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.6.tgz", 10 | "integrity": "sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==", 11 | "requires": { 12 | "regenerator-runtime": "^0.13.4" 13 | } 14 | }, 15 | "@jimp/bmp": { 16 | "version": "0.12.1", 17 | "resolved": "https://registry.npmjs.org/@jimp/bmp/-/bmp-0.12.1.tgz", 18 | "integrity": "sha512-t16IamuBMv4GiGa1VAMzsgrVKVANxXG81wXECzbikOUkUv7pKJ2vHZDgkLBEsZQ9sAvFCneM1+yoSRpuENrfVQ==", 19 | "requires": { 20 | "@babel/runtime": "^7.7.2", 21 | "@jimp/utils": "^0.12.1", 22 | "bmp-js": "^0.1.0" 23 | } 24 | }, 25 | "@jimp/core": { 26 | "version": "0.12.1", 27 | "resolved": "https://registry.npmjs.org/@jimp/core/-/core-0.12.1.tgz", 28 | "integrity": "sha512-mWfjExYEjHxBal+1gPesGChOQBSpxO7WUQkrO9KM7orboitOdQ15G5UA75ce7XVZ+5t+FQPOLmVkVZzzTQSEJA==", 29 | "requires": { 30 | "@babel/runtime": "^7.7.2", 31 | "@jimp/utils": "^0.12.1", 32 | "any-base": "^1.1.0", 33 | "buffer": "^5.2.0", 34 | "exif-parser": "^0.1.12", 35 | "file-type": "^9.0.0", 36 | "load-bmfont": "^1.3.1", 37 | "mkdirp": "^0.5.1", 38 | "phin": "^2.9.1", 39 | "pixelmatch": "^4.0.2", 40 | "tinycolor2": "^1.4.1" 41 | } 42 | }, 43 | "@jimp/custom": { 44 | "version": "0.12.1", 45 | "resolved": "https://registry.npmjs.org/@jimp/custom/-/custom-0.12.1.tgz", 46 | "integrity": "sha512-bVClp8FEJ/11GFTKeRTrfH7NgUWvVO5/tQzO/68aOwMIhbz9BOYQGh533K9+mSy29VjZJo8jxZ0C9ZwYHuFwfA==", 47 | "requires": { 48 | "@babel/runtime": "^7.7.2", 49 | "@jimp/core": "^0.12.1" 50 | } 51 | }, 52 | "@jimp/gif": { 53 | "version": "0.12.1", 54 | "resolved": "https://registry.npmjs.org/@jimp/gif/-/gif-0.12.1.tgz", 55 | "integrity": "sha512-cGn/AcvMGUGcqR6ByClGSnrja4AYmTwsGVXTQ1+EmfAdTiy6ztGgZCTDpZ/tq4SpdHXwm9wDHez7damKhTrH0g==", 56 | "requires": { 57 | "@babel/runtime": "^7.7.2", 58 | "@jimp/utils": "^0.12.1", 59 | "omggif": "^1.0.9" 60 | } 61 | }, 62 | "@jimp/jpeg": { 63 | "version": "0.12.1", 64 | "resolved": "https://registry.npmjs.org/@jimp/jpeg/-/jpeg-0.12.1.tgz", 65 | "integrity": "sha512-UoCUHbKLj2CDCETd7LrJnmK/ExDsSfJXmc1pKkfgomvepjXogdl2KTHf141wL6D+9CfSD2VBWQLC5TvjMvcr9A==", 66 | "requires": { 67 | "@babel/runtime": "^7.7.2", 68 | "@jimp/utils": "^0.12.1", 69 | "jpeg-js": "^0.4.0" 70 | } 71 | }, 72 | "@jimp/plugin-blit": { 73 | "version": "0.12.1", 74 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blit/-/plugin-blit-0.12.1.tgz", 75 | "integrity": "sha512-VRBB6bx6EpQuaH0WX8ytlGNqUQcmuxXBbzL3e+cD0W6MluYibzQy089okvXcyUS72Q+qpSMmUDCVr3pDqLAsSA==", 76 | "requires": { 77 | "@babel/runtime": "^7.7.2", 78 | "@jimp/utils": "^0.12.1" 79 | } 80 | }, 81 | "@jimp/plugin-blur": { 82 | "version": "0.12.1", 83 | "resolved": "https://registry.npmjs.org/@jimp/plugin-blur/-/plugin-blur-0.12.1.tgz", 84 | "integrity": "sha512-rTFY0yrwVJFNgNsAlYGn2GYCRLVEcPQ6cqAuhNylXuR/7oH3Acul+ZWafeKtvN8D8uMlth/6VP74gruXvwffZw==", 85 | "requires": { 86 | "@babel/runtime": "^7.7.2", 87 | "@jimp/utils": "^0.12.1" 88 | } 89 | }, 90 | "@jimp/plugin-circle": { 91 | "version": "0.12.1", 92 | "resolved": "https://registry.npmjs.org/@jimp/plugin-circle/-/plugin-circle-0.12.1.tgz", 93 | "integrity": "sha512-+/OiBDjby7RBbQoDX8ZsqJRr1PaGPdTaaKUVGAsrE7KCNO9ODYNFAizB9lpidXkGgJ4Wx5R4mJy21i22oY/a4Q==", 94 | "requires": { 95 | "@babel/runtime": "^7.7.2", 96 | "@jimp/utils": "^0.12.1" 97 | } 98 | }, 99 | "@jimp/plugin-color": { 100 | "version": "0.12.1", 101 | "resolved": "https://registry.npmjs.org/@jimp/plugin-color/-/plugin-color-0.12.1.tgz", 102 | "integrity": "sha512-xlnK/msWN4uZ+Bu7+UrCs9oMzTSA9QE0jWFnF3h0aBsD8t1LGxozkckHe8nHtC/y/sxIa8BGKSfkiaW+r6FbnA==", 103 | "requires": { 104 | "@babel/runtime": "^7.7.2", 105 | "@jimp/utils": "^0.12.1", 106 | "tinycolor2": "^1.4.1" 107 | } 108 | }, 109 | "@jimp/plugin-contain": { 110 | "version": "0.12.1", 111 | "resolved": "https://registry.npmjs.org/@jimp/plugin-contain/-/plugin-contain-0.12.1.tgz", 112 | "integrity": "sha512-WZ/D6G0jhnBh2bkBh610PEh/caGhAUIAxYLsQsfSSlOxPsDhbj3S6hMbFKRgnDvf0hsd5zTIA0j1B0UG4kh18A==", 113 | "requires": { 114 | "@babel/runtime": "^7.7.2", 115 | "@jimp/utils": "^0.12.1" 116 | } 117 | }, 118 | "@jimp/plugin-cover": { 119 | "version": "0.12.1", 120 | "resolved": "https://registry.npmjs.org/@jimp/plugin-cover/-/plugin-cover-0.12.1.tgz", 121 | "integrity": "sha512-ddWwTQO40GcabJ2UwUYCeuNxnjV4rBTiLprnjGMqAJCzdz3q3Sp20FkRf+H+E22k2v2LHss8dIOFOF4i6ycr9Q==", 122 | "requires": { 123 | "@babel/runtime": "^7.7.2", 124 | "@jimp/utils": "^0.12.1" 125 | } 126 | }, 127 | "@jimp/plugin-crop": { 128 | "version": "0.12.1", 129 | "resolved": "https://registry.npmjs.org/@jimp/plugin-crop/-/plugin-crop-0.12.1.tgz", 130 | "integrity": "sha512-CKjVkrNO8FDZKYVpMireQW4SgKBSOdF+Ip/1sWssHHe77+jGEKqOjhYju+VhT3dZJ3+75rJNI9II7Kethp+rTw==", 131 | "requires": { 132 | "@babel/runtime": "^7.7.2", 133 | "@jimp/utils": "^0.12.1" 134 | } 135 | }, 136 | "@jimp/plugin-displace": { 137 | "version": "0.12.1", 138 | "resolved": "https://registry.npmjs.org/@jimp/plugin-displace/-/plugin-displace-0.12.1.tgz", 139 | "integrity": "sha512-MQAw2iuf1/bVJ6P95WWTLA+WBjvIZ7TeGBerkvBaTK8oWdj+NSLNRIYOIoyPbZ7DTL8f1SN4Vd6KD6BZaoWrwg==", 140 | "requires": { 141 | "@babel/runtime": "^7.7.2", 142 | "@jimp/utils": "^0.12.1" 143 | } 144 | }, 145 | "@jimp/plugin-dither": { 146 | "version": "0.12.1", 147 | "resolved": "https://registry.npmjs.org/@jimp/plugin-dither/-/plugin-dither-0.12.1.tgz", 148 | "integrity": "sha512-mCrBHdx2ViTLJDLcrobqGLlGhZF/Mq41bURWlElQ2ArvrQ3/xR52We9DNDfC08oQ2JVb6q3v1GnCCdn0KNojGQ==", 149 | "requires": { 150 | "@babel/runtime": "^7.7.2", 151 | "@jimp/utils": "^0.12.1" 152 | } 153 | }, 154 | "@jimp/plugin-fisheye": { 155 | "version": "0.12.1", 156 | "resolved": "https://registry.npmjs.org/@jimp/plugin-fisheye/-/plugin-fisheye-0.12.1.tgz", 157 | "integrity": "sha512-CHvYSXtHNplzkkYzB44tENPDmvfUHiYCnAETTY+Hx58kZ0w8ERZ+OiLhUmiBcvH/QHm/US1iiNjgGUAfeQX6dg==", 158 | "requires": { 159 | "@babel/runtime": "^7.7.2", 160 | "@jimp/utils": "^0.12.1" 161 | } 162 | }, 163 | "@jimp/plugin-flip": { 164 | "version": "0.12.1", 165 | "resolved": "https://registry.npmjs.org/@jimp/plugin-flip/-/plugin-flip-0.12.1.tgz", 166 | "integrity": "sha512-xi+Yayrnln8A/C9E3yQBExjxwBSeCkt/ZQg1CxLgszVyX/3Zo8+nkV8MJYpkTpj8LCZGTOKlsE05mxu/a3lbJQ==", 167 | "requires": { 168 | "@babel/runtime": "^7.7.2", 169 | "@jimp/utils": "^0.12.1" 170 | } 171 | }, 172 | "@jimp/plugin-gaussian": { 173 | "version": "0.12.1", 174 | "resolved": "https://registry.npmjs.org/@jimp/plugin-gaussian/-/plugin-gaussian-0.12.1.tgz", 175 | "integrity": "sha512-7O6eKlhL37hsLfV6WAX1Cvce7vOqSwL1oWbBveC1agutDlrtvcTh1s2mQ4Pde654hCJu55mq1Ur10+ote5j3qw==", 176 | "requires": { 177 | "@babel/runtime": "^7.7.2", 178 | "@jimp/utils": "^0.12.1" 179 | } 180 | }, 181 | "@jimp/plugin-invert": { 182 | "version": "0.12.1", 183 | "resolved": "https://registry.npmjs.org/@jimp/plugin-invert/-/plugin-invert-0.12.1.tgz", 184 | "integrity": "sha512-JTAs7A1Erbxwl+7ph7tgcb2PZ4WzB+3nb2WbfiWU8iCrKj17mMDSc5soaCCycn8wfwqvgB1vhRfGpseOLWxsuQ==", 185 | "requires": { 186 | "@babel/runtime": "^7.7.2", 187 | "@jimp/utils": "^0.12.1" 188 | } 189 | }, 190 | "@jimp/plugin-mask": { 191 | "version": "0.12.1", 192 | "resolved": "https://registry.npmjs.org/@jimp/plugin-mask/-/plugin-mask-0.12.1.tgz", 193 | "integrity": "sha512-bnDdY0RO/x5Mhqoy+056SN1wEj++sD4muAKqLD2CIT8Zq5M/0TA4hkdf/+lwFy3H2C0YTK39PSE9xyb4jPX3kA==", 194 | "requires": { 195 | "@babel/runtime": "^7.7.2", 196 | "@jimp/utils": "^0.12.1" 197 | } 198 | }, 199 | "@jimp/plugin-normalize": { 200 | "version": "0.12.1", 201 | "resolved": "https://registry.npmjs.org/@jimp/plugin-normalize/-/plugin-normalize-0.12.1.tgz", 202 | "integrity": "sha512-4kSaI4JLM/PNjHwbnAHgyh51V5IlPfPxYvsZyZ1US32pebWtocxSMaSuOaJUg7OGSkwSDBv81UR2h5D+Dz1b5A==", 203 | "requires": { 204 | "@babel/runtime": "^7.7.2", 205 | "@jimp/utils": "^0.12.1" 206 | } 207 | }, 208 | "@jimp/plugin-print": { 209 | "version": "0.12.1", 210 | "resolved": "https://registry.npmjs.org/@jimp/plugin-print/-/plugin-print-0.12.1.tgz", 211 | "integrity": "sha512-T0lNS3qU9SwCHOEz7AGrdp50+gqiWGZibOL3350/X/dqoFs1EvGDjKVeWncsGCyLlpfd7M/AibHZgu8Fx2bWng==", 212 | "requires": { 213 | "@babel/runtime": "^7.7.2", 214 | "@jimp/utils": "^0.12.1", 215 | "load-bmfont": "^1.4.0" 216 | } 217 | }, 218 | "@jimp/plugin-resize": { 219 | "version": "0.12.1", 220 | "resolved": "https://registry.npmjs.org/@jimp/plugin-resize/-/plugin-resize-0.12.1.tgz", 221 | "integrity": "sha512-sbNn4tdBGcgGlPt9XFxCuDl4ZOoxa8/Re8nAikyxYhRss2Dqz91ARbBQxOf1vlUGeicQMsjEuWbPQAogTSJRug==", 222 | "requires": { 223 | "@babel/runtime": "^7.7.2", 224 | "@jimp/utils": "^0.12.1" 225 | } 226 | }, 227 | "@jimp/plugin-rotate": { 228 | "version": "0.12.1", 229 | "resolved": "https://registry.npmjs.org/@jimp/plugin-rotate/-/plugin-rotate-0.12.1.tgz", 230 | "integrity": "sha512-RYkLzwG2ervG6hHy8iepbIVeWdT1kz4Qz044eloqo6c66MK0KAqp228YI8+CAKm0joQnVDC/A0FgRIj/K8uyAw==", 231 | "requires": { 232 | "@babel/runtime": "^7.7.2", 233 | "@jimp/utils": "^0.12.1" 234 | } 235 | }, 236 | "@jimp/plugin-scale": { 237 | "version": "0.12.1", 238 | "resolved": "https://registry.npmjs.org/@jimp/plugin-scale/-/plugin-scale-0.12.1.tgz", 239 | "integrity": "sha512-zjNVI1fUj+ywfG78T1ZU33g9a5sk4rhEQkkhtny8koAscnVsDN2YaZEKoFli54kqaWh5kSS5DDL7a/9pEfXnFQ==", 240 | "requires": { 241 | "@babel/runtime": "^7.7.2", 242 | "@jimp/utils": "^0.12.1" 243 | } 244 | }, 245 | "@jimp/plugin-shadow": { 246 | "version": "0.12.1", 247 | "resolved": "https://registry.npmjs.org/@jimp/plugin-shadow/-/plugin-shadow-0.12.1.tgz", 248 | "integrity": "sha512-Z82IwvunXWQ2jXegd3W3TYUXpfJcEvNbHodr7Z+oVnwhM1OoQ5QC6RSRQwsj2qXIhbGffQjH8eguHgEgAV+u5w==", 249 | "requires": { 250 | "@babel/runtime": "^7.7.2", 251 | "@jimp/utils": "^0.12.1" 252 | } 253 | }, 254 | "@jimp/plugin-threshold": { 255 | "version": "0.12.1", 256 | "resolved": "https://registry.npmjs.org/@jimp/plugin-threshold/-/plugin-threshold-0.12.1.tgz", 257 | "integrity": "sha512-PFezt5fSk0q+xKvdpuv0eLggy2I7EgYotrK8TRZOT0jimuYFXPF0Z514c6szumoW5kEsRz04L1HkPT1FqI97Yg==", 258 | "requires": { 259 | "@babel/runtime": "^7.7.2", 260 | "@jimp/utils": "^0.12.1" 261 | } 262 | }, 263 | "@jimp/plugins": { 264 | "version": "0.12.1", 265 | "resolved": "https://registry.npmjs.org/@jimp/plugins/-/plugins-0.12.1.tgz", 266 | "integrity": "sha512-7+Yp29T6BbYo+Oqnc+m7A5AH+O+Oy5xnxvxlfmsp48+SuwEZ4akJp13Gu2PSmRlylENzR7MlWOxzhas5ERNlIg==", 267 | "requires": { 268 | "@babel/runtime": "^7.7.2", 269 | "@jimp/plugin-blit": "^0.12.1", 270 | "@jimp/plugin-blur": "^0.12.1", 271 | "@jimp/plugin-circle": "^0.12.1", 272 | "@jimp/plugin-color": "^0.12.1", 273 | "@jimp/plugin-contain": "^0.12.1", 274 | "@jimp/plugin-cover": "^0.12.1", 275 | "@jimp/plugin-crop": "^0.12.1", 276 | "@jimp/plugin-displace": "^0.12.1", 277 | "@jimp/plugin-dither": "^0.12.1", 278 | "@jimp/plugin-fisheye": "^0.12.1", 279 | "@jimp/plugin-flip": "^0.12.1", 280 | "@jimp/plugin-gaussian": "^0.12.1", 281 | "@jimp/plugin-invert": "^0.12.1", 282 | "@jimp/plugin-mask": "^0.12.1", 283 | "@jimp/plugin-normalize": "^0.12.1", 284 | "@jimp/plugin-print": "^0.12.1", 285 | "@jimp/plugin-resize": "^0.12.1", 286 | "@jimp/plugin-rotate": "^0.12.1", 287 | "@jimp/plugin-scale": "^0.12.1", 288 | "@jimp/plugin-shadow": "^0.12.1", 289 | "@jimp/plugin-threshold": "^0.12.1", 290 | "timm": "^1.6.1" 291 | } 292 | }, 293 | "@jimp/png": { 294 | "version": "0.12.1", 295 | "resolved": "https://registry.npmjs.org/@jimp/png/-/png-0.12.1.tgz", 296 | "integrity": "sha512-tOUSJMJzcMAN82F9/Q20IToquIVWzvOe/7NIpVQJn6m+Lq6TtVmd7d8gdcna9AEFm2FIza5lhq2Kta6Xj0KXhQ==", 297 | "requires": { 298 | "@babel/runtime": "^7.7.2", 299 | "@jimp/utils": "^0.12.1", 300 | "pngjs": "^3.3.3" 301 | } 302 | }, 303 | "@jimp/tiff": { 304 | "version": "0.12.1", 305 | "resolved": "https://registry.npmjs.org/@jimp/tiff/-/tiff-0.12.1.tgz", 306 | "integrity": "sha512-bzWDgv3202TKhaBGzV9OFF0PVQWEb4194h9kv5js348SSnbCusz/tzTE1EwKrnbDZThZPgTB1ryKs7D+Q9Mhmg==", 307 | "requires": { 308 | "@babel/runtime": "^7.7.2", 309 | "utif": "^2.0.1" 310 | } 311 | }, 312 | "@jimp/types": { 313 | "version": "0.12.1", 314 | "resolved": "https://registry.npmjs.org/@jimp/types/-/types-0.12.1.tgz", 315 | "integrity": "sha512-hg5OKXpWWeKGuDrfibrjWWhr7hqb7f552wqnPWSLQpVrdWgjH+hpOv6cOzdo9bsU78qGTelZJPxr0ERRoc+MhQ==", 316 | "requires": { 317 | "@babel/runtime": "^7.7.2", 318 | "@jimp/bmp": "^0.12.1", 319 | "@jimp/gif": "^0.12.1", 320 | "@jimp/jpeg": "^0.12.1", 321 | "@jimp/png": "^0.12.1", 322 | "@jimp/tiff": "^0.12.1", 323 | "timm": "^1.6.1" 324 | } 325 | }, 326 | "@jimp/utils": { 327 | "version": "0.12.1", 328 | "resolved": "https://registry.npmjs.org/@jimp/utils/-/utils-0.12.1.tgz", 329 | "integrity": "sha512-EjPkDQOzV/oZfbolEUgFT6SE++PtCccVBvjuACkttyCfl0P2jnpR49SwstyVLc2u8AwBAZEHHAw9lPYaMjtbXQ==", 330 | "requires": { 331 | "@babel/runtime": "^7.7.2", 332 | "regenerator-runtime": "^0.13.3" 333 | } 334 | }, 335 | "@types/node": { 336 | "version": "14.0.5", 337 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", 338 | "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==", 339 | "optional": true 340 | }, 341 | "@types/yauzl": { 342 | "version": "2.9.1", 343 | "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.1.tgz", 344 | "integrity": "sha512-A1b8SU4D10uoPjwb0lnHmmu8wZhR9d+9o2PKBQT2jU5YPTKsxac6M2qGAdY7VcL+dHHhARVUDmeg0rOrcd9EjA==", 345 | "optional": true, 346 | "requires": { 347 | "@types/node": "*" 348 | } 349 | }, 350 | "agent-base": { 351 | "version": "5.1.1", 352 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", 353 | "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==" 354 | }, 355 | "any-base": { 356 | "version": "1.1.0", 357 | "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", 358 | "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" 359 | }, 360 | "balanced-match": { 361 | "version": "1.0.0", 362 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 363 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 364 | }, 365 | "base64-js": { 366 | "version": "1.3.1", 367 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 368 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 369 | }, 370 | "bl": { 371 | "version": "4.0.2", 372 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", 373 | "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", 374 | "requires": { 375 | "buffer": "^5.5.0", 376 | "inherits": "^2.0.4", 377 | "readable-stream": "^3.4.0" 378 | } 379 | }, 380 | "bmp-js": { 381 | "version": "0.1.0", 382 | "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.1.0.tgz", 383 | "integrity": "sha1-4Fpj95amwf8l9Hcex62twUjAcjM=" 384 | }, 385 | "brace-expansion": { 386 | "version": "1.1.11", 387 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 388 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 389 | "requires": { 390 | "balanced-match": "^1.0.0", 391 | "concat-map": "0.0.1" 392 | } 393 | }, 394 | "buffer": { 395 | "version": "5.6.0", 396 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz", 397 | "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==", 398 | "requires": { 399 | "base64-js": "^1.0.2", 400 | "ieee754": "^1.1.4" 401 | } 402 | }, 403 | "buffer-crc32": { 404 | "version": "0.2.13", 405 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 406 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 407 | }, 408 | "buffer-equal": { 409 | "version": "0.0.1", 410 | "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", 411 | "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" 412 | }, 413 | "chownr": { 414 | "version": "1.1.4", 415 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", 416 | "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" 417 | }, 418 | "chrome-aws-lambda": { 419 | "version": "3.1.1", 420 | "resolved": "https://registry.npmjs.org/chrome-aws-lambda/-/chrome-aws-lambda-3.1.1.tgz", 421 | "integrity": "sha512-ikOcpFgobiiUvDXtBft+jxVz2CsauRV58owDtVyF1ocl/YN+/eqdIrrmbItm3yeJGnb9RtKxzFAqGcpBTQbTCA==", 422 | "requires": { 423 | "lambdafs": "^1.3.0" 424 | } 425 | }, 426 | "chrome-finder": { 427 | "version": "git+https://github.com/simplemerchant/chrome-finder.git#511a5a19e389c59161cdfba9cfc3100d0a77ff7f", 428 | "from": "git+https://github.com/simplemerchant/chrome-finder.git", 429 | "dev": true 430 | }, 431 | "concat-map": { 432 | "version": "0.0.1", 433 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 434 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 435 | }, 436 | "debug": { 437 | "version": "4.1.1", 438 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 439 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 440 | "requires": { 441 | "ms": "^2.1.1" 442 | } 443 | }, 444 | "dom-walk": { 445 | "version": "0.1.2", 446 | "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", 447 | "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" 448 | }, 449 | "end-of-stream": { 450 | "version": "1.4.4", 451 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 452 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 453 | "requires": { 454 | "once": "^1.4.0" 455 | } 456 | }, 457 | "exif-parser": { 458 | "version": "0.1.12", 459 | "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", 460 | "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" 461 | }, 462 | "extract-zip": { 463 | "version": "2.0.0", 464 | "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.0.tgz", 465 | "integrity": "sha512-i42GQ498yibjdvIhivUsRslx608whtGoFIhF26Z7O4MYncBxp8CwalOs1lnHy21A9sIohWO2+uiE4SRtC9JXDg==", 466 | "requires": { 467 | "@types/yauzl": "^2.9.1", 468 | "debug": "^4.1.1", 469 | "get-stream": "^5.1.0", 470 | "yauzl": "^2.10.0" 471 | } 472 | }, 473 | "fd-slicer": { 474 | "version": "1.1.0", 475 | "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", 476 | "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", 477 | "requires": { 478 | "pend": "~1.2.0" 479 | } 480 | }, 481 | "file-type": { 482 | "version": "9.0.0", 483 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-9.0.0.tgz", 484 | "integrity": "sha512-Qe/5NJrgIOlwijpq3B7BEpzPFcgzggOTagZmkXQY4LA6bsXKTUstK7Wp12lEJ/mLKTpvIZxmIuRcLYWT6ov9lw==" 485 | }, 486 | "fs-constants": { 487 | "version": "1.0.0", 488 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 489 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" 490 | }, 491 | "fs.realpath": { 492 | "version": "1.0.0", 493 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 494 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 495 | }, 496 | "get-stream": { 497 | "version": "5.1.0", 498 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", 499 | "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", 500 | "requires": { 501 | "pump": "^3.0.0" 502 | } 503 | }, 504 | "glob": { 505 | "version": "7.1.6", 506 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 507 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 508 | "requires": { 509 | "fs.realpath": "^1.0.0", 510 | "inflight": "^1.0.4", 511 | "inherits": "2", 512 | "minimatch": "^3.0.4", 513 | "once": "^1.3.0", 514 | "path-is-absolute": "^1.0.0" 515 | } 516 | }, 517 | "global": { 518 | "version": "4.3.2", 519 | "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", 520 | "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", 521 | "requires": { 522 | "min-document": "^2.19.0", 523 | "process": "~0.5.1" 524 | } 525 | }, 526 | "hcaptcha": { 527 | "version": "0.0.2", 528 | "resolved": "https://registry.npmjs.org/hcaptcha/-/hcaptcha-0.0.2.tgz", 529 | "integrity": "sha512-wWOncj/sY+q8s7tV12tjn3cFNoQhSu3l/7nTJi4QkFKALQi9XnduoXrV/KFzLg5lnB+5560zSAoi9YdYPDw6Eg==" 530 | }, 531 | "https-proxy-agent": { 532 | "version": "4.0.0", 533 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", 534 | "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", 535 | "requires": { 536 | "agent-base": "5", 537 | "debug": "4" 538 | } 539 | }, 540 | "ieee754": { 541 | "version": "1.1.13", 542 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 543 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 544 | }, 545 | "inflight": { 546 | "version": "1.0.6", 547 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 548 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 549 | "requires": { 550 | "once": "^1.3.0", 551 | "wrappy": "1" 552 | } 553 | }, 554 | "inherits": { 555 | "version": "2.0.4", 556 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 557 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 558 | }, 559 | "is-function": { 560 | "version": "1.0.2", 561 | "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.2.tgz", 562 | "integrity": "sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==" 563 | }, 564 | "jimp": { 565 | "version": "0.12.1", 566 | "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.12.1.tgz", 567 | "integrity": "sha512-0soPJif+yjmzmOF+4cF2hyhxUWWpXpQntsm2joJXFFoRcQiPzsG4dbLKYqYPT3Fc6PjZ8MaLtCkDqqckVSfmRw==", 568 | "requires": { 569 | "@babel/runtime": "^7.7.2", 570 | "@jimp/custom": "^0.12.1", 571 | "@jimp/plugins": "^0.12.1", 572 | "@jimp/types": "^0.12.1", 573 | "regenerator-runtime": "^0.13.3" 574 | } 575 | }, 576 | "jpeg-js": { 577 | "version": "0.4.0", 578 | "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.0.tgz", 579 | "integrity": "sha512-960VHmtN1vTpasX/1LupLohdP5odwAT7oK/VSm6mW0M58LbrBnowLAPWAZhWGhDAGjzbMnPXZxzB/QYgBwkN0w==" 580 | }, 581 | "lambdafs": { 582 | "version": "1.3.0", 583 | "resolved": "https://registry.npmjs.org/lambdafs/-/lambdafs-1.3.0.tgz", 584 | "integrity": "sha512-HqRPmEgtkTW4sCYDUjTEuTGkjCHuLvtZU8iM8GkhD7SpjW4AJJbBk86YU4K43sWGuW5Vmzp1lVCx4ab/kJsuBw==", 585 | "requires": { 586 | "tar-fs": "^2.0.0" 587 | }, 588 | "dependencies": { 589 | "bl": { 590 | "version": "3.0.0", 591 | "bundled": true, 592 | "requires": { 593 | "readable-stream": "^3.0.1" 594 | } 595 | }, 596 | "chownr": { 597 | "version": "1.1.2", 598 | "bundled": true 599 | }, 600 | "end-of-stream": { 601 | "version": "1.4.1", 602 | "bundled": true, 603 | "requires": { 604 | "once": "^1.4.0" 605 | } 606 | }, 607 | "fs-constants": { 608 | "version": "1.0.0", 609 | "bundled": true 610 | }, 611 | "inherits": { 612 | "version": "2.0.4", 613 | "bundled": true 614 | }, 615 | "minimist": { 616 | "version": "0.0.8", 617 | "bundled": true 618 | }, 619 | "mkdirp": { 620 | "version": "0.5.1", 621 | "bundled": true, 622 | "requires": { 623 | "minimist": "0.0.8" 624 | } 625 | }, 626 | "once": { 627 | "version": "1.4.0", 628 | "bundled": true, 629 | "requires": { 630 | "wrappy": "1" 631 | } 632 | }, 633 | "pump": { 634 | "version": "3.0.0", 635 | "bundled": true, 636 | "requires": { 637 | "end-of-stream": "^1.1.0", 638 | "once": "^1.3.1" 639 | } 640 | }, 641 | "readable-stream": { 642 | "version": "3.4.0", 643 | "bundled": true, 644 | "requires": { 645 | "inherits": "^2.0.3", 646 | "string_decoder": "^1.1.1", 647 | "util-deprecate": "^1.0.1" 648 | } 649 | }, 650 | "safe-buffer": { 651 | "version": "5.2.0", 652 | "bundled": true 653 | }, 654 | "string_decoder": { 655 | "version": "1.3.0", 656 | "bundled": true, 657 | "requires": { 658 | "safe-buffer": "~5.2.0" 659 | } 660 | }, 661 | "tar-fs": { 662 | "version": "2.0.0", 663 | "bundled": true, 664 | "requires": { 665 | "chownr": "^1.1.1", 666 | "mkdirp": "^0.5.1", 667 | "pump": "^3.0.0", 668 | "tar-stream": "^2.0.0" 669 | } 670 | }, 671 | "tar-stream": { 672 | "version": "2.1.0", 673 | "bundled": true, 674 | "requires": { 675 | "bl": "^3.0.0", 676 | "end-of-stream": "^1.4.1", 677 | "fs-constants": "^1.0.0", 678 | "inherits": "^2.0.3", 679 | "readable-stream": "^3.1.1" 680 | } 681 | }, 682 | "util-deprecate": { 683 | "version": "1.0.2", 684 | "bundled": true 685 | }, 686 | "wrappy": { 687 | "version": "1.0.2", 688 | "bundled": true 689 | } 690 | } 691 | }, 692 | "load-bmfont": { 693 | "version": "1.4.0", 694 | "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", 695 | "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", 696 | "requires": { 697 | "buffer-equal": "0.0.1", 698 | "mime": "^1.3.4", 699 | "parse-bmfont-ascii": "^1.0.3", 700 | "parse-bmfont-binary": "^1.0.5", 701 | "parse-bmfont-xml": "^1.1.4", 702 | "phin": "^2.9.1", 703 | "xhr": "^2.0.1", 704 | "xtend": "^4.0.0" 705 | } 706 | }, 707 | "lru-cache": { 708 | "version": "5.1.1", 709 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 710 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 711 | "requires": { 712 | "yallist": "^3.0.2" 713 | } 714 | }, 715 | "mime": { 716 | "version": "1.6.0", 717 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 718 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 719 | }, 720 | "min-document": { 721 | "version": "2.19.0", 722 | "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", 723 | "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", 724 | "requires": { 725 | "dom-walk": "^0.1.0" 726 | } 727 | }, 728 | "minimatch": { 729 | "version": "3.0.4", 730 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 731 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 732 | "requires": { 733 | "brace-expansion": "^1.1.7" 734 | } 735 | }, 736 | "minimist": { 737 | "version": "1.2.5", 738 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 739 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 740 | }, 741 | "mkdirp": { 742 | "version": "0.5.5", 743 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 744 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 745 | "requires": { 746 | "minimist": "^1.2.5" 747 | } 748 | }, 749 | "mkdirp-classic": { 750 | "version": "0.5.3", 751 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 752 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" 753 | }, 754 | "ms": { 755 | "version": "2.1.2", 756 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 757 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 758 | }, 759 | "omggif": { 760 | "version": "1.0.10", 761 | "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", 762 | "integrity": "sha512-LMJTtvgc/nugXj0Vcrrs68Mn2D1r0zf630VNtqtpI1FEO7e+O9FP4gqs9AcnBaSEeoHIPm28u6qgPR0oyEpGSw==" 763 | }, 764 | "once": { 765 | "version": "1.4.0", 766 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 767 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 768 | "requires": { 769 | "wrappy": "1" 770 | } 771 | }, 772 | "p-finally": { 773 | "version": "1.0.0", 774 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 775 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 776 | }, 777 | "p-timeout": { 778 | "version": "3.2.0", 779 | "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", 780 | "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", 781 | "requires": { 782 | "p-finally": "^1.0.0" 783 | } 784 | }, 785 | "pako": { 786 | "version": "1.0.11", 787 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 788 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" 789 | }, 790 | "parse-bmfont-ascii": { 791 | "version": "1.0.6", 792 | "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", 793 | "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" 794 | }, 795 | "parse-bmfont-binary": { 796 | "version": "1.0.6", 797 | "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", 798 | "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" 799 | }, 800 | "parse-bmfont-xml": { 801 | "version": "1.1.4", 802 | "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", 803 | "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", 804 | "requires": { 805 | "xml-parse-from-string": "^1.0.0", 806 | "xml2js": "^0.4.5" 807 | } 808 | }, 809 | "parse-headers": { 810 | "version": "2.0.3", 811 | "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", 812 | "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" 813 | }, 814 | "path-is-absolute": { 815 | "version": "1.0.1", 816 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 817 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 818 | }, 819 | "pend": { 820 | "version": "1.2.0", 821 | "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", 822 | "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" 823 | }, 824 | "phin": { 825 | "version": "2.9.3", 826 | "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", 827 | "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" 828 | }, 829 | "pixelmatch": { 830 | "version": "4.0.2", 831 | "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", 832 | "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", 833 | "requires": { 834 | "pngjs": "^3.0.0" 835 | } 836 | }, 837 | "pngjs": { 838 | "version": "3.4.0", 839 | "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", 840 | "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" 841 | }, 842 | "process": { 843 | "version": "0.5.2", 844 | "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", 845 | "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" 846 | }, 847 | "progress": { 848 | "version": "2.0.3", 849 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 850 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" 851 | }, 852 | "proxy-from-env": { 853 | "version": "1.1.0", 854 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 855 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 856 | }, 857 | "pump": { 858 | "version": "3.0.0", 859 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 860 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 861 | "requires": { 862 | "end-of-stream": "^1.1.0", 863 | "once": "^1.3.1" 864 | } 865 | }, 866 | "puppeteer-core": { 867 | "version": "3.1.0", 868 | "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-3.1.0.tgz", 869 | "integrity": "sha512-o0dlA3g+Dzc8mrKvCrlmn79upNhLfTQwtnPbS4hxuH6tWOwFFEbet8WHtYjQbUPZOqIt0GmoyM93VQKm6ogO+Q==", 870 | "requires": { 871 | "debug": "^4.1.0", 872 | "extract-zip": "^2.0.0", 873 | "https-proxy-agent": "^4.0.0", 874 | "mime": "^2.0.3", 875 | "progress": "^2.0.1", 876 | "proxy-from-env": "^1.0.0", 877 | "rimraf": "^3.0.2", 878 | "tar-fs": "^2.0.0", 879 | "unbzip2-stream": "^1.3.3", 880 | "ws": "^7.2.3" 881 | }, 882 | "dependencies": { 883 | "mime": { 884 | "version": "2.4.5", 885 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", 886 | "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" 887 | } 888 | } 889 | }, 890 | "readable-stream": { 891 | "version": "3.6.0", 892 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 893 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 894 | "requires": { 895 | "inherits": "^2.0.3", 896 | "string_decoder": "^1.1.1", 897 | "util-deprecate": "^1.0.1" 898 | } 899 | }, 900 | "regenerator-runtime": { 901 | "version": "0.13.5", 902 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz", 903 | "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==" 904 | }, 905 | "rimraf": { 906 | "version": "3.0.2", 907 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 908 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 909 | "requires": { 910 | "glob": "^7.1.3" 911 | } 912 | }, 913 | "safe-buffer": { 914 | "version": "5.2.1", 915 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 916 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 917 | }, 918 | "sax": { 919 | "version": "1.2.4", 920 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 921 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 922 | }, 923 | "string_decoder": { 924 | "version": "1.3.0", 925 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 926 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 927 | "requires": { 928 | "safe-buffer": "~5.2.0" 929 | } 930 | }, 931 | "tar-fs": { 932 | "version": "2.1.0", 933 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.0.tgz", 934 | "integrity": "sha512-9uW5iDvrIMCVpvasdFHW0wJPez0K4JnMZtsuIeDI7HyMGJNxmDZDOCQROr7lXyS+iL/QMpj07qcjGYTSdRFXUg==", 935 | "requires": { 936 | "chownr": "^1.1.1", 937 | "mkdirp-classic": "^0.5.2", 938 | "pump": "^3.0.0", 939 | "tar-stream": "^2.0.0" 940 | } 941 | }, 942 | "tar-stream": { 943 | "version": "2.1.2", 944 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", 945 | "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", 946 | "requires": { 947 | "bl": "^4.0.1", 948 | "end-of-stream": "^1.4.1", 949 | "fs-constants": "^1.0.0", 950 | "inherits": "^2.0.3", 951 | "readable-stream": "^3.1.1" 952 | } 953 | }, 954 | "through": { 955 | "version": "2.3.8", 956 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 957 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 958 | }, 959 | "timm": { 960 | "version": "1.6.2", 961 | "resolved": "https://registry.npmjs.org/timm/-/timm-1.6.2.tgz", 962 | "integrity": "sha512-IH3DYDL1wMUwmIlVmMrmesw5lZD6N+ZOAFWEyLrtpoL9Bcrs9u7M/vyOnHzDD2SMs4irLkVjqxZbHrXStS/Nmw==" 963 | }, 964 | "tinycolor2": { 965 | "version": "1.4.1", 966 | "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", 967 | "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" 968 | }, 969 | "unbzip2-stream": { 970 | "version": "1.4.2", 971 | "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.2.tgz", 972 | "integrity": "sha512-pZMVAofMrrHX6Ik39hCk470kulCbmZ2SWfQLPmTWqfJV/oUm0gn1CblvHdUu4+54Je6Jq34x8kY6XjTy6dMkOg==", 973 | "requires": { 974 | "buffer": "^5.2.1", 975 | "through": "^2.3.8" 976 | } 977 | }, 978 | "utif": { 979 | "version": "2.0.1", 980 | "resolved": "https://registry.npmjs.org/utif/-/utif-2.0.1.tgz", 981 | "integrity": "sha512-Z/S1fNKCicQTf375lIP9G8Sa1H/phcysstNrrSdZKj1f9g58J4NMgb5IgiEZN9/nLMPDwF0W7hdOe9Qq2IYoLg==", 982 | "requires": { 983 | "pako": "^1.0.5" 984 | } 985 | }, 986 | "util-deprecate": { 987 | "version": "1.0.2", 988 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 989 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 990 | }, 991 | "wrappy": { 992 | "version": "1.0.2", 993 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 994 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 995 | }, 996 | "ws": { 997 | "version": "7.3.0", 998 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.0.tgz", 999 | "integrity": "sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w==" 1000 | }, 1001 | "xhr": { 1002 | "version": "2.5.0", 1003 | "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", 1004 | "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", 1005 | "requires": { 1006 | "global": "~4.3.0", 1007 | "is-function": "^1.0.1", 1008 | "parse-headers": "^2.0.0", 1009 | "xtend": "^4.0.0" 1010 | } 1011 | }, 1012 | "xml-parse-from-string": { 1013 | "version": "1.0.1", 1014 | "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", 1015 | "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" 1016 | }, 1017 | "xml2js": { 1018 | "version": "0.4.23", 1019 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", 1020 | "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", 1021 | "requires": { 1022 | "sax": ">=0.6.0", 1023 | "xmlbuilder": "~11.0.0" 1024 | } 1025 | }, 1026 | "xmlbuilder": { 1027 | "version": "11.0.1", 1028 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 1029 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" 1030 | }, 1031 | "xtend": { 1032 | "version": "4.0.2", 1033 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1034 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1035 | }, 1036 | "yallist": { 1037 | "version": "3.1.1", 1038 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1039 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1040 | }, 1041 | "yauzl": { 1042 | "version": "2.10.0", 1043 | "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", 1044 | "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", 1045 | "requires": { 1046 | "buffer-crc32": "~0.2.3", 1047 | "fd-slicer": "~1.1.0" 1048 | } 1049 | } 1050 | } 1051 | } 1052 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppetron", 3 | "version": "6.0.0", 4 | "license": "MIT", 5 | "dependencies": { 6 | "chrome-aws-lambda": "~3.1.1", 7 | "hcaptcha": "0.0.2", 8 | "jimp": "~0.12.1", 9 | "lru-cache": "~5.1.1", 10 | "p-timeout": "~3.2.0", 11 | "puppeteer-core": "~3.1.0" 12 | }, 13 | "devDependencies": { 14 | "chrome-finder": "https://github.com/simplemerchant/chrome-finder.git" 15 | }, 16 | "scripts": { 17 | "start": "vercel dev" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /vercel.json: -------------------------------------------------------------------------------- 1 | { 2 | "alias": "puppetron.now.sh", 3 | "version": 2, 4 | "public": true, 5 | "rewrites": [ 6 | { "source": "/", "destination": "/index.html" }, 7 | { "source": "/(.+)", "destination": "/api/index" } 8 | ] 9 | } 10 | --------------------------------------------------------------------------------