├── .gitignore ├── media ├── favicon.ico ├── icon.svg ├── logo.svg └── puppeteer-logo.png ├── package.json ├── readme.md ├── saasify.json ├── src ├── lib │ ├── options.ts │ ├── page.ts │ └── types.ts ├── pdf.ts └── screenshot.ts ├── todo.md └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | .dummy 14 | 15 | # Directory for instrumented libs generated by jscoverage/JSCover 16 | lib-cov 17 | 18 | # Coverage directory used by tools like istanbul 19 | coverage 20 | 21 | # nyc test coverage 22 | .nyc_output 23 | 24 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 25 | .grunt 26 | 27 | # Bower dependency directory (https://bower.io/) 28 | bower_components 29 | 30 | # node-waf configuration 31 | .lock-wscript 32 | 33 | # Compiled binary addons (http://nodejs.org/api/addons.html) 34 | build/Release 35 | 36 | # Dependency directories 37 | node_modules/ 38 | jspm_packages/ 39 | 40 | # Typescript v1 declaration files 41 | typings/ 42 | 43 | # Optional npm cache directory 44 | .npm 45 | 46 | # Optional eslint cache 47 | .eslintcache 48 | 49 | # Optional REPL history 50 | .node_repl_history 51 | 52 | # Output of 'npm pack' 53 | *.tgz 54 | 55 | # Yarn Integrity file 56 | .yarn-integrity 57 | 58 | # dotenv environment variables file 59 | .env 60 | 61 | keys/ 62 | .vscode/ 63 | .keyfile.json 64 | master.json 65 | 66 | .next 67 | -------------------------------------------------------------------------------- /media/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saasify-sh/puppet-master/f73c3f7e63874c387012846c1099c6b9bda65690/media/favicon.ico -------------------------------------------------------------------------------- /media/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | logo 5 | Created with Sketch. 6 | 7 | 48 | 49 | -------------------------------------------------------------------------------- /media/logo.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /media/puppeteer-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/saasify-sh/puppet-master/f73c3f7e63874c387012846c1099c6b9bda65690/media/puppeteer-logo.png -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppet-master", 3 | "private": true, 4 | "version": "0.0.0", 5 | "description": "Puppeteer as a service", 6 | "repository": "saasify-sh/puppet-master", 7 | "author": "Saasify ", 8 | "license": "MIT", 9 | "scripts": { 10 | "test": "saasify debug", 11 | "deploy": "saasify deploy", 12 | "toc": "markdown-toc -i readme.md" 13 | }, 14 | "keywords": [ 15 | "puppeteer", 16 | "chrome", 17 | "chromium", 18 | "headless", 19 | "screenshot", 20 | "pdf", 21 | "serverless", 22 | "saas", 23 | "faas", 24 | "api", 25 | "browserless", 26 | "puppet", 27 | "open source", 28 | "lambda", 29 | "capture-website" 30 | ], 31 | "dependencies": { 32 | "chrome-aws-lambda": "^1.19.0", 33 | "fts-core": "^1.1.0", 34 | "puppeteer-core": "^1.19.0" 35 | }, 36 | "devDependencies": { 37 | "@types/node": "^12.6.9", 38 | "@types/puppeteer-core": "^1.9.0", 39 | "markdown-toc": "^1.2.0" 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Puppet Master 2 | 3 | > [Puppeteer](https://pptr.dev) as a [service](https://puppet-master.sh). 4 | 5 |

6 | 7 | Puppeteer Logo 8 | 9 |

10 | 11 | ## Features 12 | 13 | - **Simple**: Quick to setup and integrate 14 | - **Standard**: Just HTTPS + JSON 15 | - **Managed**: Hosted via serverless functions 16 | - **Scalable**: Scales to any capacity 17 | - **Usage based**: Pay only for what you use 18 | - **Focused**: We only do one thing and do it well 19 | - **Immutable deployments**: All API updates are optional 20 | 21 | ## Contents 22 | 23 | 24 | 25 | - [Introduction](#introduction) 26 | - [Functions](#functions) 27 | * [Screenshot](#screenshot) 28 | * [Pdf](#pdf) 29 | * [Common Options](#common-options) 30 | - [FAQ](#faq) 31 | * [Why are my screenshots blurry?](#why-are-my-screenshots-blurry) 32 | * [How is this project different from other alternatives?](#how-is-this-project-different-from-other-alternatives) 33 | * [The functionality I need is missing.](#the-functionality-i-need-is-missing) 34 | * [How do subscriptions work?](#how-do-subscriptions-work) 35 | * [This project is great! How can I help out?](#this-project-is-great-how-can-i-help-out) 36 | * [How can I debug potential issues with the API?](#how-can-i-debug-potential-issues-with-the-api) 37 | - [License](#license) 38 | 39 | 40 | 41 | ## Introduction 42 | 43 | Puppet Master provides hosted, serverless SaaS APIs for controlling headless chrome in the cloud. 44 | 45 | Our goal is to make it really simple for developers to scale automated browser workflows via [Puppeteer](https://pptr.dev). 46 | 47 | ## Functions 48 | 49 | ### Screenshot 50 | 51 | Navigates to a page and captures a screenshot via Puppeteer's [Page.screenshot](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagescreenshotoptions). 52 | 53 | All Puppeteer options are supported. 54 | 55 | Returns an image as either `image/png` or `image/jpeg` depending on the `type` parameter. 56 | 57 | ### Pdf 58 | 59 | Navigates to a page and captures a PDF via Puppeteer's [Page.pdf](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagepdfoptions). 60 | 61 | All Puppeteer options are supported. 62 | 63 | Returns a PDF as `application/pdf`. 64 | 65 | ### Common Options 66 | 67 | In addition to the standard parameters, all functions optionally accept a set of additional common options. 68 | 69 | - [viewport](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagesetviewportviewport) - Set the browser window's viewport dimensions and/or resolution. 70 | - [userAgent](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagesetuseragentuseragent) - Set the browser's [user-agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent). 71 | - Useful to trick websites into displaying different content or styles based on an emulated device. 72 | - [gotoOptions](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagegotourl-options) - Customize the `Page.goto` navigation options. 73 | - Useful when you need to customize behavior around when Puppeteer considers a page navigation "finished". 74 | - [emulateDevice](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pageemulateoptions) - Make it look like the screenshot was taken on the specified device. 75 | - Use the `name` property from one of the built-in [devices](https://github.com/GoogleChrome/puppeteer/blob/master/lib/DeviceDescriptors.js). 76 | - Overrides `viewport` and `userAgent`. 77 | 78 | ## FAQ 79 | 80 | ### Why are my screenshots blurry? 81 | 82 | Try setting [viewport.deviceScaleFactor](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagesetviewportviewport) to `2` to emulate a retina display. 83 | 84 | ### How is this project different from other alternatives? 85 | 86 | The differences can be broken down into two areas: 87 | 88 | **Functionality** 89 | 90 | - We use serverless functions to provide maximum scalability while minimizing cost. 91 | - This also means that you only pay for what you actually use. 92 | - You could set this up yourself, but headless chrome is a resource hog and who wants to setup and manage another async task queue? 93 | - We also allow you to run functions locally which is essential for debugging. 94 | 95 | **Philisophy** 96 | 97 | The core motivation behind this project lies in trying to tackle the problem of open source sustainability. 98 | 99 | Towards that end, every aspect of this SaaS product aside from the core functionality was generated automatically via [Saasify](https://saasify.sh), the Shopify for SaaS. That includes the template-based marketing website, OpenAPI-based API docs, serverless function hosting, user account management, usage-based billing integration, legal docs, and support. 100 | 101 | It's our hope that by greatly simplifying and automating the process of launching SaaS APIs, open source authors will be much more inclined to monetize their work and help to sustain their passion while still holding true to the underlying nature of OSS. 102 | 103 | Puppet Master is therefore a SaaS product that is fully generated from the source code in this repository. If you know how to create an open source TypeScript project like this one, you're already 95% of your way towards creating your own monetizable SaaS product! 104 | 105 | ### The functionality I need is missing. 106 | 107 | We're actively looking for feedback and feature suggestions. 108 | 109 | Please [contact us](mailto:support@saasify.sh) or open an issue on this repo. 110 | 111 | Thanks! 112 | 113 | ### How do subscriptions work? 114 | 115 | All APIs come with a free public tier that is rate-limited so you can test things out before signing up for a subscription. 116 | 117 | Saasify uses [Stripe](https://stripe.com) to securely handle all payments, subscriptions, and invoices. 118 | 119 | We use usage-based, metered subscriptions that charge fractions of a cent depending on three factors: 120 | 121 | - Number of authenticated API calls 122 | - Aggregate compute time 123 | - Bandwidth in / out 124 | 125 | Signing up for a subscription starts a weekly billing cycle. Note that you will only be charged for what you use. 126 | 127 | See [pricing](/pricing) for more details. 128 | 129 | ### This project is great! How can I help out? 130 | 131 | Collaboration is what makes open source truly powerful! If you're interested in working on Puppet Master or have an idea for your own Saasify product, please [contact us](mailto:info@saasify.sh) to learn more. Thanks! 132 | 133 | ### How can I debug potential issues with the API? 134 | 135 | If your API calls are not working or returning unexpected results, the best way to troubleshoot is to try and reproduce your issue by running the project locally. 136 | 137 | - Clone this repository 138 | - Install `saasify` globally via `npm install -g saasify` 139 | - Run `saasify dev` at the repo root specifying an additional environment variable `PUPPET_MASTER_DEBUG` 140 | 141 | ``` 142 | PUPPET_MASTER_DEBUG=1 saasify dev 143 | ``` 144 | 145 | This will run the deployment locally with a non-headless browser and `slowMo` set to `1000`. 146 | 147 | Then just change the URL you're calling to be the corresponding `localhost` URL and investigate the issue. 148 | 149 | ## License 150 | 151 | MIT © [Saasify](https://saasify.sh) 152 | 153 | 154 | Support my OSS work by following me on twitter twitter 155 | -------------------------------------------------------------------------------- /saasify.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "puppet-master", 3 | "alias": "puppet-master.sh", 4 | "services": [ 5 | { 6 | "src": "src/screenshot.ts", 7 | "examples": [ 8 | { 9 | "name": "Basic", 10 | "input": { 11 | "url": "https://youtube.com" 12 | } 13 | }, 14 | { 15 | "name": "Custom", 16 | "input": { 17 | "url": "https://github.com", 18 | "type": "jpeg", 19 | "quality": 90, 20 | "viewport": { 21 | "width": 1920, 22 | "height": 1080, 23 | "deviceScaleFactor": 2 24 | }, 25 | "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36" 26 | } 27 | } 28 | ] 29 | }, 30 | { 31 | "src": "src/pdf.ts", 32 | "examples": [ 33 | { 34 | "name": "Basic", 35 | "input": { 36 | "url": "https://producthunt.com" 37 | } 38 | }, 39 | { 40 | "name": "Custom", 41 | "input": { 42 | "url": "https://producthunt.com", 43 | "viewport": { 44 | "width": 1920, 45 | "height": 1080, 46 | "deviceScaleFactor": 2 47 | }, 48 | "displayHeaderFooter": true, 49 | "format": "A0" 50 | } 51 | } 52 | ] 53 | } 54 | ], 55 | "saas": { 56 | "name": "Puppet Master", 57 | "heading": "Puppeteer as a Service", 58 | "subheading": "Control headless Chrome via a simple SaaS API!", 59 | "repo": "https://github.com/saasify-sh/puppet-master", 60 | "logo": "./media/logo.svg", 61 | "favicon": "./media/favicon.ico" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/lib/options.ts: -------------------------------------------------------------------------------- 1 | import chrome = require('chrome-aws-lambda') 2 | 3 | const isDev = process.env.NOW_REGION === 'dev1' 4 | const isDebug = isDev && process.env.PUPPET_MASTER_DEBUG 5 | 6 | const exePath = process.platform === 'win32' 7 | ? 'C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe' 8 | : '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome' 9 | 10 | interface Options { 11 | args: string[] 12 | executablePath: string 13 | headless: boolean 14 | } 15 | 16 | export async function getLaunchOptions(): Promise { 17 | if (isDev) { 18 | const debugParams = isDebug ? { 19 | headless: false, 20 | slowMo: 1000 21 | } : { 22 | headless: true 23 | } 24 | 25 | return { 26 | args: [], 27 | executablePath: exePath, 28 | ...debugParams 29 | } 30 | } else { 31 | return { 32 | args: chrome.args, 33 | executablePath: await chrome.executablePath, 34 | headless: chrome.headless 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/lib/page.ts: -------------------------------------------------------------------------------- 1 | import { Browser, Page, devices, launch } from 'puppeteer-core' 2 | 3 | import { getLaunchOptions } from './options' 4 | import { CommonOptions } from './types' 5 | 6 | // cache the current chrome instance between serverless invocations 7 | let _browser: Browser | null = null 8 | 9 | export async function getPage(opts: CommonOptions): Promise { 10 | if (!_browser) { 11 | const options = await getLaunchOptions() 12 | _browser = await launch(options) 13 | } 14 | 15 | const page = await _browser.newPage() 16 | return initPage(page, opts) 17 | } 18 | 19 | export async function initPage(page: Page, opts: CommonOptions): Promise { 20 | if (opts.emulateDevice) { 21 | const device = devices[opts.emulateDevice] 22 | if (!device) { 23 | const err = new Error(`Invalid device name [${opts.emulateDevice}]`); 24 | (err as any).statusCode = 400 25 | throw err 26 | } 27 | 28 | await page.emulate(device) 29 | } else { 30 | if (opts.userAgent) { 31 | await page.setUserAgent(opts.userAgent) 32 | } 33 | 34 | if (opts.viewport) { 35 | await page.setViewport(opts.viewport) 36 | } 37 | } 38 | 39 | await page.goto(opts.url, opts.gotoOptions) 40 | return page 41 | } 42 | -------------------------------------------------------------------------------- /src/lib/types.ts: -------------------------------------------------------------------------------- 1 | import { 2 | DirectNavigationOptions, 3 | Viewport 4 | } from 'puppeteer-core' 5 | 6 | export type ImageFormat = 'png' | 'jpeg' 7 | 8 | export interface Rect { 9 | x: number 10 | y: number 11 | width: number 12 | height: number 13 | } 14 | 15 | export interface Margin { 16 | /** Top margin. */ 17 | top?: number, 18 | /** Right margin. */ 19 | right?: number, 20 | /** Bottom margin. */ 21 | bottom?: number, 22 | /** Left margin. */ 23 | left?: number 24 | } 25 | 26 | export interface CommonOptions { 27 | url: string 28 | gotoOptions?: DirectNavigationOptions 29 | viewport?: Viewport 30 | userAgent?: string 31 | emulateDevice?: string 32 | } 33 | -------------------------------------------------------------------------------- /src/pdf.ts: -------------------------------------------------------------------------------- 1 | import { HttpResponse } from 'fts-core' 2 | import { 3 | DirectNavigationOptions, 4 | PDFOptions, 5 | PDFFormat, 6 | Viewport 7 | } from 'puppeteer-core' 8 | 9 | import { getPage } from './lib/page' 10 | import { ImageFormat, Margin, Rect } from './lib/types' 11 | 12 | /** 13 | * Navigates to a page and captures a PDF via Puppeteer's [Page.pdf](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagepdfoptions). 14 | * 15 | * @param url - URL to navigate page to. The url should include scheme, e.g. `https://`. 16 | * @param scale - Scale of the webpage rendering. 17 | * @param displayHeaderFooter - Display header and footer. 18 | * @param headerTemplate - HTML template for the print header. Should be valid HTML markup with following classes used to inject printing values into them: 19 | * - `date` formatted print date 20 | * - `title` document title 21 | * - `url` document location 22 | * - `pageNumber` current page number 23 | * - `totalPages` total pages in the document 24 | * @param footerTemplate - HTML template for the print footer. Should be valid HTML markup with following classes used to inject printing values into them: 25 | * - `date` formatted print date 26 | * - `title` document title 27 | * - `url` document location 28 | * - `pageNumber` current page number 29 | * - `totalPages` total pages in the document 30 | * @param printBackground - Print background graphics. 31 | * @param landscape - Paper orientation. 32 | * @param pageRanges - Paper ranges to print, e.g., `1-5, 8, 11-13`. Default is `''` which means print all pages. 33 | * @param format - Paper format. If set, takes priority over width or height options. 34 | * @param width - Paper width. 35 | * @param height - Paper height. 36 | * @param margin - Paper margins, defaults to none. 37 | * @param preferCSSPageSize - Give any CSS @page size declared in the page priority over what is declared in width and 38 | * height or format options. Defaults to `false` which will scale the content to fit the paper size. 39 | * @param gotoOptions - Customize the `Page.goto` navigation options. 40 | * @param viewport - Set the browser window's viewport dimensions and/or resolution. 41 | * @param userAgent - Set the browser's [user-agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent). 42 | * @param emulateDevice - Make it look like the screenshot was taken on the specified device. 43 | * - Use the `name` property from one of the built-in [devices](https://github.com/GoogleChrome/puppeteer/blob/master/lib/DeviceDescriptors.js). 44 | * - Overrides `viewport` and `userAgent`. 45 | * 46 | * @returns PDF as `application/pdf`. 47 | */ 48 | export default async function pdf( 49 | url: string, 50 | scale: number = 1, 51 | displayHeaderFooter: boolean = false, 52 | headerTemplate?: string, 53 | footerTemplate?: string, 54 | printBackground: boolean = false, 55 | landscape: boolean = false, 56 | pageRanges: string = '', 57 | format: PDFFormat = 'Letter', 58 | width?: number, 59 | height?: number, 60 | margin?: Margin, 61 | preferCSSPageSize: boolean = false, 62 | gotoOptions?: DirectNavigationOptions, 63 | viewport?: Viewport, 64 | userAgent?: string, 65 | emulateDevice?: string 66 | ): Promise { 67 | const page = await getPage({ 68 | url, 69 | gotoOptions, 70 | viewport, 71 | userAgent, 72 | emulateDevice 73 | }) 74 | 75 | const opts: PDFOptions = { 76 | scale, 77 | displayHeaderFooter, 78 | headerTemplate, 79 | footerTemplate, 80 | printBackground, 81 | landscape, 82 | pageRanges, 83 | format, 84 | width, 85 | height, 86 | margin, 87 | preferCSSPageSize 88 | } 89 | 90 | const body = await page.pdf(opts) 91 | await page.close() 92 | 93 | return { 94 | headers: { 95 | 'Content-Type': 'application/pdf' 96 | }, 97 | statusCode: 200, 98 | body 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /src/screenshot.ts: -------------------------------------------------------------------------------- 1 | import { HttpResponse } from 'fts-core' 2 | import { 3 | DirectNavigationOptions, 4 | BinaryScreenShotOptions, 5 | Viewport 6 | } from 'puppeteer-core' 7 | 8 | import { getPage } from './lib/page' 9 | import { ImageFormat, Rect } from './lib/types' 10 | 11 | /** 12 | * Navigates to a page and captures a screenshot via Puppeteer's [Page.screenshot](https://pptr.dev/#?product=Puppeteer&version=v1.19.0&show=api-pagescreenshotoptions). 13 | * 14 | * @param url - URL to navigate page to. The url should include scheme, e.g. `https://`. 15 | * @param type - Specify screenshot type, can be either `jpeg` or `png`. 16 | * @param quality - The quality of the image, between 0-100. Not applicable to `png` images. 17 | * @param fullPage - When `true`, takes a screenshot of the full scrollable page. 18 | * @param omitBackground - Hides default white background and allows capturing screenshots with transparency. 19 | * @param clip - An object which specifies clipping region of the page. 20 | * @param gotoOptions - Customize the `Page.goto` navigation options. 21 | * @param viewport - Set the browser window's viewport dimensions and/or resolution. 22 | * @param userAgent - Set the browser's [user-agent](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent). 23 | * @param emulateDevice - Make it look like the screenshot was taken on the specified device. 24 | * - Use the `name` property from one of the built-in [devices](https://github.com/GoogleChrome/puppeteer/blob/master/lib/DeviceDescriptors.js). 25 | * - Overrides `viewport` and `userAgent`. 26 | * 27 | * @return Image as either `image/png` or `image/jpeg` depending on the `type` parameter. 28 | */ 29 | export default async function screenshot( 30 | url: string, 31 | type: ImageFormat = 'png', 32 | quality: number = 100, 33 | fullPage: boolean = false, 34 | omitBackground: boolean = true, 35 | clip?: Rect, 36 | gotoOptions?: DirectNavigationOptions, 37 | viewport?: Viewport, 38 | userAgent?: string, 39 | emulateDevice?: string 40 | ): Promise { 41 | const page = await getPage({ 42 | url, 43 | gotoOptions, 44 | viewport, 45 | userAgent, 46 | emulateDevice 47 | }) 48 | 49 | const opts: BinaryScreenShotOptions = { 50 | type, 51 | fullPage, 52 | omitBackground, 53 | clip 54 | } 55 | 56 | if (type === 'jpeg') { 57 | opts.quality = quality 58 | } 59 | 60 | const body = await page.screenshot(opts) 61 | await page.close() 62 | 63 | return { 64 | headers: { 65 | 'Content-Type': (type === 'png' ? 'image/png' : 'image/jpeg') 66 | }, 67 | statusCode: 200, 68 | body 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /todo.md: -------------------------------------------------------------------------------- 1 | # Puppet Master 2 | 3 | > [Puppeteer](https://pptr.dev) as a service. 4 | 5 | ## TODO 6 | 7 | - [ ] add `guide.md` 8 | - should this just live in the general saasify walkthrough docs? 9 | - section on debugging 10 | - also mention `https://saasify_puppet-master.saasify.sh` 11 | - [ ] add additional options from [capture-website](https://github.com/sindresorhus/capture-website) 12 | - [ ] add raw html content as alternative for url 13 | - [ ] integrate with crawler / mesh proxy network 14 | - readme 15 | - [ ] add section on avoiding detection 16 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@*", "@types/node@^12.6.9": 6 | version "12.7.4" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.7.4.tgz#64db61e0359eb5a8d99b55e05c729f130a678b04" 8 | 9 | "@types/puppeteer-core@^1.9.0": 10 | version "1.9.0" 11 | resolved "https://registry.yarnpkg.com/@types/puppeteer-core/-/puppeteer-core-1.9.0.tgz#5ceb397e3ff769081fb07d71289b5009392d24d3" 12 | dependencies: 13 | "@types/puppeteer" "*" 14 | 15 | "@types/puppeteer@*": 16 | version "1.19.1" 17 | resolved "https://registry.yarnpkg.com/@types/puppeteer/-/puppeteer-1.19.1.tgz#942ca62288953a0f5fbbc25c103b5f2ba28b60ab" 18 | dependencies: 19 | "@types/node" "*" 20 | 21 | agent-base@^4.3.0: 22 | version "4.3.0" 23 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.3.0.tgz#8165f01c436009bccad0b1d122f05ed770efc6ee" 24 | dependencies: 25 | es6-promisify "^5.0.0" 26 | 27 | ansi-red@^0.1.1: 28 | version "0.1.1" 29 | resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c" 30 | dependencies: 31 | ansi-wrap "0.1.0" 32 | 33 | ansi-wrap@0.1.0: 34 | version "0.1.0" 35 | resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" 36 | 37 | argparse@^1.0.10, argparse@^1.0.7: 38 | version "1.0.10" 39 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 40 | dependencies: 41 | sprintf-js "~1.0.2" 42 | 43 | async-limiter@~1.0.0: 44 | version "1.0.1" 45 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" 46 | 47 | autolinker@~0.28.0: 48 | version "0.28.1" 49 | resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47" 50 | dependencies: 51 | gulp-header "^1.7.1" 52 | 53 | balanced-match@^1.0.0: 54 | version "1.0.0" 55 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 56 | 57 | brace-expansion@^1.1.7: 58 | version "1.1.11" 59 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 60 | dependencies: 61 | balanced-match "^1.0.0" 62 | concat-map "0.0.1" 63 | 64 | buffer-from@^1.0.0: 65 | version "1.1.1" 66 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 67 | 68 | chrome-aws-lambda@^1.19.0: 69 | version "1.19.0" 70 | resolved "https://registry.yarnpkg.com/chrome-aws-lambda/-/chrome-aws-lambda-1.19.0.tgz#1078e9fe1a30584a26eb5ef5270df41d6223099d" 71 | 72 | coffee-script@^1.12.4: 73 | version "1.12.7" 74 | resolved "https://registry.yarnpkg.com/coffee-script/-/coffee-script-1.12.7.tgz#c05dae0cb79591d05b3070a8433a98c9a89ccc53" 75 | 76 | concat-map@0.0.1: 77 | version "0.0.1" 78 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 79 | 80 | concat-stream@1.6.2, concat-stream@^1.5.2: 81 | version "1.6.2" 82 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 83 | dependencies: 84 | buffer-from "^1.0.0" 85 | inherits "^2.0.3" 86 | readable-stream "^2.2.2" 87 | typedarray "^0.0.6" 88 | 89 | concat-with-sourcemaps@*: 90 | version "1.1.0" 91 | resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e" 92 | dependencies: 93 | source-map "^0.6.1" 94 | 95 | core-util-is@~1.0.0: 96 | version "1.0.2" 97 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 98 | 99 | debug@2.6.9: 100 | version "2.6.9" 101 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 102 | dependencies: 103 | ms "2.0.0" 104 | 105 | debug@^3.1.0: 106 | version "3.2.6" 107 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" 108 | dependencies: 109 | ms "^2.1.1" 110 | 111 | debug@^4.1.0: 112 | version "4.1.1" 113 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" 114 | dependencies: 115 | ms "^2.1.1" 116 | 117 | diacritics-map@^0.1.0: 118 | version "0.1.0" 119 | resolved "https://registry.yarnpkg.com/diacritics-map/-/diacritics-map-0.1.0.tgz#6dfc0ff9d01000a2edf2865371cac316e94977af" 120 | 121 | es6-promise@^4.0.3: 122 | version "4.2.8" 123 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 124 | 125 | es6-promisify@^5.0.0: 126 | version "5.0.0" 127 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 128 | dependencies: 129 | es6-promise "^4.0.3" 130 | 131 | esprima@^4.0.0: 132 | version "4.0.1" 133 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 134 | 135 | expand-range@^1.8.1: 136 | version "1.8.2" 137 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 138 | dependencies: 139 | fill-range "^2.1.0" 140 | 141 | extend-shallow@^2.0.1: 142 | version "2.0.1" 143 | resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" 144 | dependencies: 145 | is-extendable "^0.1.0" 146 | 147 | extract-zip@^1.6.6: 148 | version "1.6.7" 149 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" 150 | dependencies: 151 | concat-stream "1.6.2" 152 | debug "2.6.9" 153 | mkdirp "0.5.1" 154 | yauzl "2.4.1" 155 | 156 | fd-slicer@~1.0.1: 157 | version "1.0.1" 158 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 159 | dependencies: 160 | pend "~1.2.0" 161 | 162 | fill-range@^2.1.0: 163 | version "2.2.4" 164 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" 165 | dependencies: 166 | is-number "^2.1.0" 167 | isobject "^2.0.0" 168 | randomatic "^3.0.0" 169 | repeat-element "^1.1.2" 170 | repeat-string "^1.5.2" 171 | 172 | for-in@^1.0.2: 173 | version "1.0.2" 174 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 175 | 176 | fs.realpath@^1.0.0: 177 | version "1.0.0" 178 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 179 | 180 | fts-core@^1.1.0: 181 | version "1.1.0" 182 | resolved "https://registry.yarnpkg.com/fts-core/-/fts-core-1.1.0.tgz#b4d77bb1f00fe93dbff063ca0ac20c277bd510ec" 183 | 184 | glob@^7.1.3: 185 | version "7.1.4" 186 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" 187 | dependencies: 188 | fs.realpath "^1.0.0" 189 | inflight "^1.0.4" 190 | inherits "2" 191 | minimatch "^3.0.4" 192 | once "^1.3.0" 193 | path-is-absolute "^1.0.0" 194 | 195 | gray-matter@^2.1.0: 196 | version "2.1.1" 197 | resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-2.1.1.tgz#3042d9adec2a1ded6a7707a9ed2380f8a17a430e" 198 | dependencies: 199 | ansi-red "^0.1.1" 200 | coffee-script "^1.12.4" 201 | extend-shallow "^2.0.1" 202 | js-yaml "^3.8.1" 203 | toml "^2.3.2" 204 | 205 | gulp-header@^1.7.1: 206 | version "1.8.12" 207 | resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84" 208 | dependencies: 209 | concat-with-sourcemaps "*" 210 | lodash.template "^4.4.0" 211 | through2 "^2.0.0" 212 | 213 | https-proxy-agent@^2.2.1: 214 | version "2.2.2" 215 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz#271ea8e90f836ac9f119daccd39c19ff7dfb0793" 216 | dependencies: 217 | agent-base "^4.3.0" 218 | debug "^3.1.0" 219 | 220 | inflight@^1.0.4: 221 | version "1.0.6" 222 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 223 | dependencies: 224 | once "^1.3.0" 225 | wrappy "1" 226 | 227 | inherits@2, inherits@^2.0.3, inherits@~2.0.3: 228 | version "2.0.4" 229 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 230 | 231 | is-buffer@^1.1.5: 232 | version "1.1.6" 233 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 234 | 235 | is-extendable@^0.1.0: 236 | version "0.1.1" 237 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 238 | 239 | is-extendable@^1.0.1: 240 | version "1.0.1" 241 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" 242 | dependencies: 243 | is-plain-object "^2.0.4" 244 | 245 | is-number@^2.1.0: 246 | version "2.1.0" 247 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 248 | dependencies: 249 | kind-of "^3.0.2" 250 | 251 | is-number@^4.0.0: 252 | version "4.0.0" 253 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" 254 | 255 | is-plain-object@^2.0.4: 256 | version "2.0.4" 257 | resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" 258 | dependencies: 259 | isobject "^3.0.1" 260 | 261 | isarray@1.0.0, isarray@~1.0.0: 262 | version "1.0.0" 263 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 264 | 265 | isobject@^2.0.0: 266 | version "2.1.0" 267 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 268 | dependencies: 269 | isarray "1.0.0" 270 | 271 | isobject@^3.0.1: 272 | version "3.0.1" 273 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" 274 | 275 | js-yaml@^3.8.1: 276 | version "3.13.1" 277 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 278 | dependencies: 279 | argparse "^1.0.7" 280 | esprima "^4.0.0" 281 | 282 | kind-of@^3.0.2: 283 | version "3.2.2" 284 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 285 | dependencies: 286 | is-buffer "^1.1.5" 287 | 288 | kind-of@^6.0.0: 289 | version "6.0.2" 290 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" 291 | 292 | lazy-cache@^2.0.2: 293 | version "2.0.2" 294 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" 295 | dependencies: 296 | set-getter "^0.1.0" 297 | 298 | list-item@^1.1.1: 299 | version "1.1.1" 300 | resolved "https://registry.yarnpkg.com/list-item/-/list-item-1.1.1.tgz#0c65d00e287cb663ccb3cb3849a77e89ec268a56" 301 | dependencies: 302 | expand-range "^1.8.1" 303 | extend-shallow "^2.0.1" 304 | is-number "^2.1.0" 305 | repeat-string "^1.5.2" 306 | 307 | lodash._reinterpolate@^3.0.0: 308 | version "3.0.0" 309 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 310 | 311 | lodash.template@^4.4.0: 312 | version "4.5.0" 313 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" 314 | dependencies: 315 | lodash._reinterpolate "^3.0.0" 316 | lodash.templatesettings "^4.0.0" 317 | 318 | lodash.templatesettings@^4.0.0: 319 | version "4.2.0" 320 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" 321 | dependencies: 322 | lodash._reinterpolate "^3.0.0" 323 | 324 | markdown-link@^0.1.1: 325 | version "0.1.1" 326 | resolved "https://registry.yarnpkg.com/markdown-link/-/markdown-link-0.1.1.tgz#32c5c65199a6457316322d1e4229d13407c8c7cf" 327 | 328 | markdown-toc@^1.2.0: 329 | version "1.2.0" 330 | resolved "https://registry.yarnpkg.com/markdown-toc/-/markdown-toc-1.2.0.tgz#44a15606844490314afc0444483f9e7b1122c339" 331 | dependencies: 332 | concat-stream "^1.5.2" 333 | diacritics-map "^0.1.0" 334 | gray-matter "^2.1.0" 335 | lazy-cache "^2.0.2" 336 | list-item "^1.1.1" 337 | markdown-link "^0.1.1" 338 | minimist "^1.2.0" 339 | mixin-deep "^1.1.3" 340 | object.pick "^1.2.0" 341 | remarkable "^1.7.1" 342 | repeat-string "^1.6.1" 343 | strip-color "^0.1.0" 344 | 345 | math-random@^1.0.1: 346 | version "1.0.4" 347 | resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" 348 | 349 | mime@^2.0.3: 350 | version "2.4.4" 351 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" 352 | 353 | minimatch@^3.0.4: 354 | version "3.0.4" 355 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 356 | dependencies: 357 | brace-expansion "^1.1.7" 358 | 359 | minimist@0.0.8: 360 | version "0.0.8" 361 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 362 | 363 | minimist@^1.2.0: 364 | version "1.2.0" 365 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 366 | 367 | mixin-deep@^1.1.3: 368 | version "1.3.2" 369 | resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" 370 | dependencies: 371 | for-in "^1.0.2" 372 | is-extendable "^1.0.1" 373 | 374 | mkdirp@0.5.1: 375 | version "0.5.1" 376 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 377 | dependencies: 378 | minimist "0.0.8" 379 | 380 | ms@2.0.0: 381 | version "2.0.0" 382 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 383 | 384 | ms@^2.1.1: 385 | version "2.1.2" 386 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 387 | 388 | object.pick@^1.2.0: 389 | version "1.3.0" 390 | resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" 391 | dependencies: 392 | isobject "^3.0.1" 393 | 394 | once@^1.3.0: 395 | version "1.4.0" 396 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 397 | dependencies: 398 | wrappy "1" 399 | 400 | path-is-absolute@^1.0.0: 401 | version "1.0.1" 402 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 403 | 404 | pend@~1.2.0: 405 | version "1.2.0" 406 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 407 | 408 | process-nextick-args@~2.0.0: 409 | version "2.0.1" 410 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 411 | 412 | progress@^2.0.1: 413 | version "2.0.3" 414 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" 415 | 416 | proxy-from-env@^1.0.0: 417 | version "1.0.0" 418 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" 419 | 420 | puppeteer-core@^1.19.0: 421 | version "1.19.0" 422 | resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-1.19.0.tgz#3c3f98edb5862583e3a9c19cbc0da57ccc63ba5c" 423 | dependencies: 424 | debug "^4.1.0" 425 | extract-zip "^1.6.6" 426 | https-proxy-agent "^2.2.1" 427 | mime "^2.0.3" 428 | progress "^2.0.1" 429 | proxy-from-env "^1.0.0" 430 | rimraf "^2.6.1" 431 | ws "^6.1.0" 432 | 433 | randomatic@^3.0.0: 434 | version "3.1.1" 435 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" 436 | dependencies: 437 | is-number "^4.0.0" 438 | kind-of "^6.0.0" 439 | math-random "^1.0.1" 440 | 441 | readable-stream@^2.2.2, readable-stream@~2.3.6: 442 | version "2.3.6" 443 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 444 | dependencies: 445 | core-util-is "~1.0.0" 446 | inherits "~2.0.3" 447 | isarray "~1.0.0" 448 | process-nextick-args "~2.0.0" 449 | safe-buffer "~5.1.1" 450 | string_decoder "~1.1.1" 451 | util-deprecate "~1.0.1" 452 | 453 | remarkable@^1.7.1: 454 | version "1.7.4" 455 | resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00" 456 | dependencies: 457 | argparse "^1.0.10" 458 | autolinker "~0.28.0" 459 | 460 | repeat-element@^1.1.2: 461 | version "1.1.3" 462 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" 463 | 464 | repeat-string@^1.5.2, repeat-string@^1.6.1: 465 | version "1.6.1" 466 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 467 | 468 | rimraf@^2.6.1: 469 | version "2.7.1" 470 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" 471 | dependencies: 472 | glob "^7.1.3" 473 | 474 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 475 | version "5.1.2" 476 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 477 | 478 | set-getter@^0.1.0: 479 | version "0.1.0" 480 | resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" 481 | dependencies: 482 | to-object-path "^0.3.0" 483 | 484 | source-map@^0.6.1: 485 | version "0.6.1" 486 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 487 | 488 | sprintf-js@~1.0.2: 489 | version "1.0.3" 490 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 491 | 492 | string_decoder@~1.1.1: 493 | version "1.1.1" 494 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 495 | dependencies: 496 | safe-buffer "~5.1.0" 497 | 498 | strip-color@^0.1.0: 499 | version "0.1.0" 500 | resolved "https://registry.yarnpkg.com/strip-color/-/strip-color-0.1.0.tgz#106f65d3d3e6a2d9401cac0eb0ce8b8a702b4f7b" 501 | 502 | through2@^2.0.0: 503 | version "2.0.5" 504 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" 505 | dependencies: 506 | readable-stream "~2.3.6" 507 | xtend "~4.0.1" 508 | 509 | to-object-path@^0.3.0: 510 | version "0.3.0" 511 | resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" 512 | dependencies: 513 | kind-of "^3.0.2" 514 | 515 | toml@^2.3.2: 516 | version "2.3.6" 517 | resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.6.tgz#25b0866483a9722474895559088b436fd11f861b" 518 | 519 | typedarray@^0.0.6: 520 | version "0.0.6" 521 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 522 | 523 | util-deprecate@~1.0.1: 524 | version "1.0.2" 525 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 526 | 527 | wrappy@1: 528 | version "1.0.2" 529 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 530 | 531 | ws@^6.1.0: 532 | version "6.2.1" 533 | resolved "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz#442fdf0a47ed64f59b6a5d8ff130f4748ed524fb" 534 | dependencies: 535 | async-limiter "~1.0.0" 536 | 537 | xtend@~4.0.1: 538 | version "4.0.2" 539 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 540 | 541 | yauzl@2.4.1: 542 | version "2.4.1" 543 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 544 | dependencies: 545 | fd-slicer "~1.0.1" 546 | --------------------------------------------------------------------------------