├── .gitignore ├── Dockerfile ├── README.md ├── now.json ├── package.json ├── src ├── debuglog.js ├── index.js ├── pageshot.js ├── public │ ├── index.css │ └── index.html └── setup.js ├── start.sh └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:edge as base 2 | RUN apk add --no-cache --update chromium tar zstd && \ 3 | cd /usr/lib/chromium/locales/ && \ 4 | find ./ -maxdepth 1 '!' -path './' '!' -path './en-US.pak' '!' -path './en-US.pak.info' -exec 'rm' '{}' ';' && \ 5 | cd /usr/lib && \ 6 | tar cvf /chromium_lib.tar ./chromium && \ 7 | zstd --train -r /usr/lib/chromium -o /chromium_lib.dict && \ 8 | zstd -f -22 --ultra -D /chromium_lib.dict /chromium_lib.tar 9 | 10 | FROM mhart/alpine-node:10 as build 11 | WORKDIR /usr/src 12 | COPY package.json yarn.lock /usr/src/ 13 | RUN PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=1 yarn install --production 14 | COPY src/ . 15 | COPY start.sh . 16 | RUN rm -rf **/README* **/.git* 17 | 18 | FROM mhart/alpine-node:base-10 19 | WORKDIR /usr/src 20 | ENV NODE_ENV="production" 21 | COPY --from=base /chromium_lib.tar.zst /chromium_lib.dict /chrome/ 22 | #RUN apk add --no-cache --update tar zstd && \ 23 | RUN apk add --no-cache --update tar zstd alsa-lib at-spi2-atk atk cairo cups-libs dbus-libs eudev-libs expat flac fontconfig freetype gdk-pixbuf glib gtk+3.0 harfbuzz libatomic libevent libgcc libjpeg-turbo libpng libre2 libstdc++ libwebp libx11 libxcb libxcomposite libxcursor libxdamage libxext libxfixes libxi libxml2 libxrandr libxrender libxscrnsaver libxslt libxtst musl nspr nss opus pango snappy ttf-opensans minizip && \ 24 | rm -rf /usr/share/gtk-doc 25 | ENV CHROME_BIN=/usr/bin/chromium-browser \ 26 | CHROME_PATH=/usr/lib/chromium/ 27 | COPY --from=build /usr/src/ . 28 | 29 | CMD ["./start.sh"] 30 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pageshot [![][now-deploy-src]](#deploy) 2 | 3 | Pageshot as a service. 4 | 5 | ## Usage 6 | 7 | - __Web UI__: https://shot.now.sh 8 | - __Endpoint__: https://shot.now.sh/shot 9 | 10 | Examples: 11 | 12 | - https://shot.now.sh/shot?url=https://google.com 13 | - https://shot.now.sh/shot?url=https://github.com&full=true 14 | 15 | Query Params: 16 | 17 | - __`url`__: The webpage location. (required) 18 | - __`width`__: Viewport width. (default: 1280) 19 | - __`height`__: Viewport height. (default: 800) 20 | - __`full`__: Full page screenshot. (default: false) 21 | - __`dpr`__: Device pixel ratio. (default: 2) 22 | 23 | ## Deploy 24 | 25 | - to [now.sh](https://zeit.co/now): 26 | ``` 27 | now amio/pageshot 28 | ``` 29 | 30 | - using [Dockerfile](Dockerfile): 31 | ``` 32 | docker pull amio/pageshot 33 | ``` 34 | 35 | - running locally (require Google Chrome installed): 36 | ``` 37 | npm start 38 | ``` 39 | 40 | ## License 41 | 42 | ISC © [Amio](https://github.com/amio) 43 | 44 | [now-deploy-src]: https://badgen.net/badge/%E2%96%B2/$%20now%20amio%2Fpageshot/333 45 | -------------------------------------------------------------------------------- /now.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pageshot", 3 | "type": "docker", 4 | "public": true, 5 | "alias": [ 6 | "shot", 7 | "pageshot" 8 | ], 9 | "features": { 10 | "cloud": "v2" 11 | }, 12 | "limits": { 13 | "maxConcurrentReqs": 4, 14 | "timeout": 900000 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pageshot", 3 | "version": "1.0.0", 4 | "description": "Pageshot as a service.", 5 | "author": "Amio ", 6 | "license": "ISC", 7 | "main": "src/index.js", 8 | "scripts": { 9 | "deploy": "now --public -T pageshot", 10 | "alias": "now -T pageshot alias", 11 | "start": "node ." 12 | }, 13 | "dependencies": { 14 | "koa": "^2.5.2", 15 | "koa-proxies": "^0.7.0", 16 | "koa-route": "^3.2.0", 17 | "koa-static": "^5.0.0", 18 | "micro": "^9.3.3", 19 | "micro-fork": "^0.1.0", 20 | "puppeteer": "^1.0.0", 21 | "serve-handler": "^4.0.1" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/debuglog.js: -------------------------------------------------------------------------------- 1 | const util = require('util') 2 | 3 | module.exports = util.debuglog('shot') 4 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const Koa = require('koa') 2 | const serve = require('koa-static') 3 | const router = require('koa-route') 4 | const pageshot = require('./pageshot.js') 5 | 6 | module.exports = async function (port = 3000) { 7 | const app = new Koa() 8 | 9 | app.use(router.get('/shot', pageshot)) 10 | app.use(serve('public')) 11 | 12 | app.listen(port, () => { 13 | console.log(`Pageshot server running on ${port}`) 14 | }) 15 | 16 | app.on('error', err => { 17 | console.error('ERR_APP:', err) 18 | }) 19 | 20 | return app 21 | } 22 | 23 | module.exports() 24 | 25 | process.on('uncaughtException', err => { 26 | console.error(`UncaughtException: ${err}`) 27 | process.exit(1) 28 | }) 29 | -------------------------------------------------------------------------------- /src/pageshot.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert') 2 | const { getBrowser } = require('./setup.js') 3 | 4 | module.exports = async function pageshot (ctx) { 5 | const { response } = ctx 6 | const { url, height, width, dpr, full } = ctx.query 7 | 8 | if (typeof url !== 'string') { 9 | response.code = 400 10 | response.body = 'URL is required.' 11 | return 12 | } 13 | 14 | const fullPage = !!full 15 | const viewport = { 16 | width: parseInt(width, 10) || 960, 17 | height: parseInt(height, 10) || 640, 18 | deviceScaleFactor: parseInt(dpr, 10) || 2 19 | } 20 | 21 | console.time(url) 22 | try { 23 | const page = await (await getBrowser()).newPage() 24 | await page.setViewport(viewport) 25 | await page.goto(url, {timeout: 10000}) 26 | response.body = await page.screenshot({fullPage}) 27 | response.type = 'image/png' 28 | page.close() 29 | } catch (e) { 30 | response.body = 'PAGESHOT FAILED: ' + e.message 31 | response.code = 400 32 | console.error('SHOT_ERROR', e.message) 33 | } 34 | console.timeEnd(url) 35 | } 36 | -------------------------------------------------------------------------------- /src/public/index.css: -------------------------------------------------------------------------------- 1 | html, body { 2 | font: 16px/2em -apple-system, BlinkMacSystemFont, "Raleway", sans-serif; 3 | margin: 0; 4 | text-align: center; 5 | height: 100%; 6 | display: flex; 7 | flex-direction: column; 8 | } 9 | 10 | main { 11 | flex: 1; 12 | display: flex; 13 | flex-direction: column; 14 | } 15 | 16 | .hero { 17 | flex: 1; 18 | box-sizing: border-box; 19 | display: flex; 20 | flex-direction: column; 21 | align-items: center; 22 | justify-content: center; 23 | } 24 | 25 | .intro { 26 | letter-spacing: 0.1em; 27 | text-transform: uppercase; 28 | } 29 | 30 | form { 31 | height: 57%; 32 | } 33 | 34 | h1 { 35 | margin: 3rem; 36 | font-size: 5rem; 37 | font-family: 'Alex Brush', cursive; 38 | } 39 | 40 | input { 41 | outline: none; 42 | font-size: 1rem; 43 | padding: 0.5em; 44 | margin: 1em; 45 | border: 1px solid #BBB; 46 | } 47 | 48 | input.url { 49 | font-family: 'Courier', monospace; 50 | width: 80%; 51 | max-width: 720px; 52 | } 53 | 54 | input.url:focus { 55 | border-color: #999; 56 | box-shadow: 0 0 0 0.3em #F3F3F3; 57 | } 58 | 59 | input.size { 60 | width: 5em; 61 | margin: 1.5em; 62 | border-width: 0 0 1px 0; 63 | text-align: center; 64 | } 65 | 66 | input.size:focus { 67 | border-color: #555; 68 | } 69 | 70 | .submit { display: none } 71 | 72 | footer { 73 | height: 10%; 74 | max-height: 100px; 75 | padding: 0 3rem; 76 | display: flex; 77 | align-items: center; 78 | justify-content: space-between; 79 | background: #333; 80 | color: #AAA; 81 | font-weight: 300; 82 | letter-spacing: 0.4px; 83 | } 84 | 85 | footer a { 86 | color: #DDD; 87 | line-height: 1.2em; 88 | text-decoration: none; 89 | border-bottom: 1px solid transparent; 90 | } 91 | 92 | footer a:hover { 93 | border-color: #CCC; 94 | } 95 | 96 | .loading { visibility: hidden; margin-top: -1em; } 97 | 98 | .spin { 99 | display: inline-block; 100 | height: 10px; 101 | width: 10px; 102 | text-align: center; 103 | /*border-radius: 30px;*/ 104 | border: 3px dashed #555; 105 | animation: spin 1s linear infinite; 106 | } 107 | 108 | @keyframes spin { 109 | from {transform:rotate(0deg);} 110 | to {transform:rotate(360deg);} 111 | } 112 | 113 | /* latin */ 114 | @font-face { 115 | font-family: 'Raleway'; 116 | font-style: normal; 117 | font-weight: 400; 118 | src: local('Raleway'), local('Raleway-Regular'), url(data:font/woff2;base64,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) format('woff2'); 119 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; 120 | } 121 | 122 | /* latin */ 123 | @font-face { 124 | font-family: 'Alex Brush'; 125 | font-style: normal; 126 | font-weight: 400; 127 | src: local('Alex Brush Regular'), local('AlexBrush-Regular'), url(data:font/woff2;base64,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) format('woff2'); 128 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215; 129 | } 130 | -------------------------------------------------------------------------------- /src/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Shot - Pageshot as a service. 6 | 7 | 8 | 9 |
10 |
11 |

Shot

12 |
pageshot as a service
13 |
14 |
15 |
. . . GRAB & SHOT . . .
16 | 17 |
18 | x 19 | 20 |
21 |
22 | 26 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /src/setup.js: -------------------------------------------------------------------------------- 1 | const puppeteer = require('puppeteer') 2 | 3 | const isBrowserAvailable = async browser => { 4 | try { 5 | await browser.version() 6 | } catch (e) { 7 | console.error(e) 8 | return false 9 | } 10 | return true 11 | } 12 | 13 | exports.getBrowser = (() => { 14 | let browser 15 | let launching 16 | return async () => { 17 | let unlock 18 | // eslint-disable-next-line no-unused-expressions 19 | launching && launching.then && (await launching) 20 | // eslint-disable-next-line no-return-assign 21 | launching = new Promise(r => (unlock = r)) 22 | if (!browser || !(await isBrowserAvailable(browser))) { 23 | browser = await puppeteer.launch({ 24 | executablePath: '/usr/bin/chromium-browser', 25 | args: ['--no-sandbox', '--headless', '--disable-gpu', '-—disable-dev-tools'], 26 | dumpio: true, 27 | devtools: false 28 | }) 29 | console.log(`launch done: ${await browser.version()}`) 30 | } 31 | unlock() 32 | return browser 33 | } 34 | })() 35 | -------------------------------------------------------------------------------- /start.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -eu 4 | 5 | zstd -D /chrome/chromium_lib.dict -d /chrome/chromium_lib.tar.zst 6 | tar xvf /chrome/chromium_lib.tar 7 | mv chromium /usr/lib/chromium 8 | ln -s /usr/lib/chromium/chromium-launcher.sh /usr/bin/chromium-browser 9 | node index.js 10 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@^1.3.5: 6 | version "1.3.5" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 8 | dependencies: 9 | mime-types "~2.1.18" 10 | negotiator "0.6.1" 11 | 12 | agent-base@^4.1.0: 13 | version "4.2.1" 14 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" 15 | dependencies: 16 | es6-promisify "^5.0.0" 17 | 18 | ansi-styles@^3.2.1: 19 | version "3.2.1" 20 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 21 | dependencies: 22 | color-convert "^1.9.0" 23 | 24 | any-promise@^1.0.0, any-promise@^1.1.0: 25 | version "1.3.0" 26 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 27 | 28 | arg@2.0.0: 29 | version "2.0.0" 30 | resolved "https://registry.yarnpkg.com/arg/-/arg-2.0.0.tgz#c06e7ff69ab05b3a4a03ebe0407fac4cba657545" 31 | 32 | async-limiter@~1.0.0: 33 | version "1.0.0" 34 | resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 35 | 36 | balanced-match@^1.0.0: 37 | version "1.0.0" 38 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 39 | 40 | brace-expansion@^1.1.7: 41 | version "1.1.11" 42 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 43 | dependencies: 44 | balanced-match "^1.0.0" 45 | concat-map "0.0.1" 46 | 47 | buffer-from@^1.0.0: 48 | version "1.1.1" 49 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" 50 | 51 | bytes@3.0.0: 52 | version "3.0.0" 53 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 54 | 55 | cache-content-type@^1.0.0: 56 | version "1.0.1" 57 | resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c" 58 | dependencies: 59 | mime-types "^2.1.18" 60 | ylru "^1.2.0" 61 | 62 | chalk@2.4.0: 63 | version "2.4.0" 64 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.0.tgz#a060a297a6b57e15b61ca63ce84995daa0fe6e52" 65 | dependencies: 66 | ansi-styles "^3.2.1" 67 | escape-string-regexp "^1.0.5" 68 | supports-color "^5.3.0" 69 | 70 | co@^4.6.0: 71 | version "4.6.0" 72 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 73 | 74 | color-convert@^1.9.0: 75 | version "1.9.2" 76 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.2.tgz#49881b8fba67df12a96bdf3f56c0aab9e7913147" 77 | dependencies: 78 | color-name "1.1.1" 79 | 80 | color-name@1.1.1: 81 | version "1.1.1" 82 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" 83 | 84 | concat-map@0.0.1: 85 | version "0.0.1" 86 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 87 | 88 | concat-stream@1.6.2: 89 | version "1.6.2" 90 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" 91 | dependencies: 92 | buffer-from "^1.0.0" 93 | inherits "^2.0.3" 94 | readable-stream "^2.2.2" 95 | typedarray "^0.0.6" 96 | 97 | content-disposition@0.5.2, content-disposition@~0.5.2: 98 | version "0.5.2" 99 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 100 | 101 | content-type@1.0.4, content-type@^1.0.4: 102 | version "1.0.4" 103 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 104 | 105 | cookies@~0.7.1: 106 | version "0.7.1" 107 | resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b" 108 | dependencies: 109 | depd "~1.1.1" 110 | keygrip "~1.0.2" 111 | 112 | core-util-is@~1.0.0: 113 | version "1.0.2" 114 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 115 | 116 | debug@*, debug@^3.1.0: 117 | version "3.1.0" 118 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 119 | dependencies: 120 | ms "2.0.0" 121 | 122 | debug@2.6.9: 123 | version "2.6.9" 124 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 125 | dependencies: 126 | ms "2.0.0" 127 | 128 | deep-equal@~1.0.1: 129 | version "1.0.1" 130 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 131 | 132 | delegates@^1.0.0: 133 | version "1.0.0" 134 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 135 | 136 | depd@1.1.1: 137 | version "1.1.1" 138 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 139 | 140 | depd@^1.1.2, depd@~1.1.1, depd@~1.1.2: 141 | version "1.1.2" 142 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 143 | 144 | destroy@^1.0.4: 145 | version "1.0.4" 146 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 147 | 148 | ee-first@1.1.1: 149 | version "1.1.1" 150 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 151 | 152 | error-inject@^1.0.0: 153 | version "1.0.0" 154 | resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" 155 | 156 | es6-promise@^4.0.3: 157 | version "4.2.4" 158 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" 159 | 160 | es6-promisify@^5.0.0: 161 | version "5.0.0" 162 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 163 | dependencies: 164 | es6-promise "^4.0.3" 165 | 166 | escape-html@^1.0.3: 167 | version "1.0.3" 168 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 169 | 170 | escape-string-regexp@^1.0.5: 171 | version "1.0.5" 172 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 173 | 174 | eventemitter3@^3.0.0: 175 | version "3.1.0" 176 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" 177 | 178 | extract-zip@^1.6.6: 179 | version "1.6.7" 180 | resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" 181 | dependencies: 182 | concat-stream "1.6.2" 183 | debug "2.6.9" 184 | mkdirp "0.5.1" 185 | yauzl "2.4.1" 186 | 187 | fast-decode-uri-component@^1.0.0: 188 | version "1.0.0" 189 | resolved "https://registry.yarnpkg.com/fast-decode-uri-component/-/fast-decode-uri-component-1.0.0.tgz#7ce10336aa4b26286fee93d71e6785ff0f596a33" 190 | 191 | fast-url-parser@1.1.3: 192 | version "1.1.3" 193 | resolved "https://registry.yarnpkg.com/fast-url-parser/-/fast-url-parser-1.1.3.tgz#f4af3ea9f34d8a271cf58ad2b3759f431f0b318d" 194 | dependencies: 195 | punycode "^1.3.2" 196 | 197 | fd-slicer@~1.0.1: 198 | version "1.0.1" 199 | resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" 200 | dependencies: 201 | pend "~1.2.0" 202 | 203 | find-my-way@^1.15.1: 204 | version "1.15.1" 205 | resolved "https://registry.yarnpkg.com/find-my-way/-/find-my-way-1.15.1.tgz#aa76b386be51ff528c548422544ffd91d8f3dec1" 206 | dependencies: 207 | fast-decode-uri-component "^1.0.0" 208 | safe-regex "^1.1.0" 209 | semver-store "^0.3.0" 210 | 211 | follow-redirects@^1.0.0: 212 | version "1.5.5" 213 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.5.tgz#3c143ca599a2e22e62876687d68b23d55bad788b" 214 | dependencies: 215 | debug "^3.1.0" 216 | 217 | fresh@~0.5.2: 218 | version "0.5.2" 219 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 220 | 221 | fs.realpath@^1.0.0: 222 | version "1.0.0" 223 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 224 | 225 | glob-slash@^1.0.0: 226 | version "1.0.0" 227 | resolved "https://registry.yarnpkg.com/glob-slash/-/glob-slash-1.0.0.tgz#fe52efa433233f74a2fe64c7abb9bc848202ab95" 228 | 229 | glob-slasher@1.0.1: 230 | version "1.0.1" 231 | resolved "https://registry.yarnpkg.com/glob-slasher/-/glob-slasher-1.0.1.tgz#747a0e5bb222642ee10d3e05443e109493cb0f8e" 232 | dependencies: 233 | glob-slash "^1.0.0" 234 | lodash.isobject "^2.4.1" 235 | toxic "^1.0.0" 236 | 237 | glob@^7.0.5: 238 | version "7.1.2" 239 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 240 | dependencies: 241 | fs.realpath "^1.0.0" 242 | inflight "^1.0.4" 243 | inherits "2" 244 | minimatch "^3.0.4" 245 | once "^1.3.0" 246 | path-is-absolute "^1.0.0" 247 | 248 | has-flag@^3.0.0: 249 | version "3.0.0" 250 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 251 | 252 | http-assert@^1.3.0: 253 | version "1.3.0" 254 | resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a" 255 | dependencies: 256 | deep-equal "~1.0.1" 257 | http-errors "~1.6.1" 258 | 259 | http-errors@1.6.2: 260 | version "1.6.2" 261 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 262 | dependencies: 263 | depd "1.1.1" 264 | inherits "2.0.3" 265 | setprototypeof "1.0.3" 266 | statuses ">= 1.3.1 < 2" 267 | 268 | http-errors@^1.6.3: 269 | version "1.7.0" 270 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.0.tgz#b6d36492a201c7888bdcb5dd0471140423c4ad2a" 271 | dependencies: 272 | depd "~1.1.2" 273 | inherits "2.0.3" 274 | setprototypeof "1.1.0" 275 | statuses ">= 1.5.0 < 2" 276 | toidentifier "1.0.0" 277 | 278 | http-errors@~1.4.0: 279 | version "1.4.0" 280 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.4.0.tgz#6c0242dea6b3df7afda153c71089b31c6e82aabf" 281 | dependencies: 282 | inherits "2.0.1" 283 | statuses ">= 1.2.1 < 2" 284 | 285 | http-errors@~1.6.1, http-errors@~1.6.2: 286 | version "1.6.3" 287 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 288 | dependencies: 289 | depd "~1.1.2" 290 | inherits "2.0.3" 291 | setprototypeof "1.1.0" 292 | statuses ">= 1.4.0 < 2" 293 | 294 | http-proxy@^1.16.2: 295 | version "1.17.0" 296 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.17.0.tgz#7ad38494658f84605e2f6db4436df410f4e5be9a" 297 | dependencies: 298 | eventemitter3 "^3.0.0" 299 | follow-redirects "^1.0.0" 300 | requires-port "^1.0.0" 301 | 302 | https-proxy-agent@^2.2.1: 303 | version "2.2.1" 304 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" 305 | dependencies: 306 | agent-base "^4.1.0" 307 | debug "^3.1.0" 308 | 309 | iconv-lite@0.4.19: 310 | version "0.4.19" 311 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 312 | 313 | inflight@^1.0.4: 314 | version "1.0.6" 315 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 316 | dependencies: 317 | once "^1.3.0" 318 | wrappy "1" 319 | 320 | inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.3: 321 | version "2.0.3" 322 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 323 | 324 | inherits@2.0.1: 325 | version "2.0.1" 326 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" 327 | 328 | is-generator-function@^1.0.7: 329 | version "1.0.7" 330 | resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522" 331 | 332 | is-stream@1.1.0: 333 | version "1.1.0" 334 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 335 | 336 | isarray@0.0.1: 337 | version "0.0.1" 338 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 339 | 340 | isarray@~1.0.0: 341 | version "1.0.0" 342 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 343 | 344 | keygrip@~1.0.2: 345 | version "1.0.2" 346 | resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91" 347 | 348 | koa-compose@^3.0.0: 349 | version "3.2.1" 350 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" 351 | dependencies: 352 | any-promise "^1.1.0" 353 | 354 | koa-compose@^4.1.0: 355 | version "4.1.0" 356 | resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.1.0.tgz#507306b9371901db41121c812e923d0d67d3e877" 357 | 358 | koa-convert@^1.2.0: 359 | version "1.2.0" 360 | resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0" 361 | dependencies: 362 | co "^4.6.0" 363 | koa-compose "^3.0.0" 364 | 365 | koa-is-json@^1.0.0: 366 | version "1.0.0" 367 | resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14" 368 | 369 | koa-proxies@^0.7.0: 370 | version "0.7.0" 371 | resolved "https://registry.yarnpkg.com/koa-proxies/-/koa-proxies-0.7.0.tgz#868a47aebad6d8a3c19aa0f4c03fa2a518ffbd2a" 372 | dependencies: 373 | http-proxy "^1.16.2" 374 | path-match "^1.2.4" 375 | 376 | koa-route@^3.2.0: 377 | version "3.2.0" 378 | resolved "https://registry.yarnpkg.com/koa-route/-/koa-route-3.2.0.tgz#76298b99a6bcfa9e38cab6fe5c79a8733e758bce" 379 | dependencies: 380 | debug "*" 381 | methods "~1.1.0" 382 | path-to-regexp "^1.2.0" 383 | 384 | koa-send@^5.0.0: 385 | version "5.0.0" 386 | resolved "https://registry.yarnpkg.com/koa-send/-/koa-send-5.0.0.tgz#5e8441e07ef55737734d7ced25b842e50646e7eb" 387 | dependencies: 388 | debug "^3.1.0" 389 | http-errors "^1.6.3" 390 | mz "^2.7.0" 391 | resolve-path "^1.4.0" 392 | 393 | koa-static@^5.0.0: 394 | version "5.0.0" 395 | resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943" 396 | dependencies: 397 | debug "^3.1.0" 398 | koa-send "^5.0.0" 399 | 400 | koa@^2.5.2: 401 | version "2.5.2" 402 | resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.2.tgz#f2bda7f3e70be54924e7e5e9789a249f77256fe3" 403 | dependencies: 404 | accepts "^1.3.5" 405 | cache-content-type "^1.0.0" 406 | content-disposition "~0.5.2" 407 | content-type "^1.0.4" 408 | cookies "~0.7.1" 409 | debug "^3.1.0" 410 | delegates "^1.0.0" 411 | depd "^1.1.2" 412 | destroy "^1.0.4" 413 | error-inject "^1.0.0" 414 | escape-html "^1.0.3" 415 | fresh "~0.5.2" 416 | http-assert "^1.3.0" 417 | http-errors "^1.6.3" 418 | is-generator-function "^1.0.7" 419 | koa-compose "^4.1.0" 420 | koa-convert "^1.2.0" 421 | koa-is-json "^1.0.0" 422 | on-finished "^2.3.0" 423 | only "~0.0.2" 424 | parseurl "^1.3.2" 425 | statuses "^1.5.0" 426 | type-is "^1.6.16" 427 | vary "^1.1.2" 428 | 429 | lodash._objecttypes@~2.4.1: 430 | version "2.4.1" 431 | resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" 432 | 433 | lodash.isobject@^2.4.1: 434 | version "2.4.1" 435 | resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" 436 | dependencies: 437 | lodash._objecttypes "~2.4.1" 438 | 439 | lodash@^4.17.10: 440 | version "4.17.10" 441 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" 442 | 443 | media-typer@0.3.0: 444 | version "0.3.0" 445 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 446 | 447 | methods@~1.1.0: 448 | version "1.1.2" 449 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 450 | 451 | micro-fork@^0.1.0: 452 | version "0.1.0" 453 | resolved "https://registry.yarnpkg.com/micro-fork/-/micro-fork-0.1.0.tgz#240019a532a46bc94f56d4cfa2cbd53adb1dc009" 454 | dependencies: 455 | find-my-way "^1.15.1" 456 | 457 | micro@^9.3.3: 458 | version "9.3.3" 459 | resolved "https://registry.yarnpkg.com/micro/-/micro-9.3.3.tgz#32728c7be15e807691ead85da27fd8117a8bca24" 460 | dependencies: 461 | arg "2.0.0" 462 | chalk "2.4.0" 463 | content-type "1.0.4" 464 | is-stream "1.1.0" 465 | raw-body "2.3.2" 466 | 467 | mime-db@~1.33.0: 468 | version "1.33.0" 469 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 470 | 471 | mime-db@~1.35.0: 472 | version "1.35.0" 473 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.35.0.tgz#0569d657466491283709663ad379a99b90d9ab47" 474 | 475 | mime-types@2.1.18: 476 | version "2.1.18" 477 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 478 | dependencies: 479 | mime-db "~1.33.0" 480 | 481 | mime-types@^2.1.18, mime-types@~2.1.18: 482 | version "2.1.19" 483 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.19.tgz#71e464537a7ef81c15f2db9d97e913fc0ff606f0" 484 | dependencies: 485 | mime-db "~1.35.0" 486 | 487 | mime@^2.0.3: 488 | version "2.3.1" 489 | resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" 490 | 491 | minimatch@3.0.4, minimatch@^3.0.4: 492 | version "3.0.4" 493 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 494 | dependencies: 495 | brace-expansion "^1.1.7" 496 | 497 | minimist@0.0.8: 498 | version "0.0.8" 499 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 500 | 501 | mkdirp@0.5.1: 502 | version "0.5.1" 503 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 504 | dependencies: 505 | minimist "0.0.8" 506 | 507 | ms@2.0.0: 508 | version "2.0.0" 509 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 510 | 511 | mz@^2.7.0: 512 | version "2.7.0" 513 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 514 | dependencies: 515 | any-promise "^1.0.0" 516 | object-assign "^4.0.1" 517 | thenify-all "^1.0.0" 518 | 519 | negotiator@0.6.1: 520 | version "0.6.1" 521 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 522 | 523 | object-assign@^4.0.1: 524 | version "4.1.1" 525 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 526 | 527 | on-finished@^2.3.0: 528 | version "2.3.0" 529 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 530 | dependencies: 531 | ee-first "1.1.1" 532 | 533 | once@^1.3.0: 534 | version "1.4.0" 535 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 536 | dependencies: 537 | wrappy "1" 538 | 539 | only@~0.0.2: 540 | version "0.0.2" 541 | resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4" 542 | 543 | parseurl@^1.3.2: 544 | version "1.3.2" 545 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 546 | 547 | path-is-absolute@1.0.1, path-is-absolute@^1.0.0: 548 | version "1.0.1" 549 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 550 | 551 | path-is-inside@1.0.2: 552 | version "1.0.2" 553 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 554 | 555 | path-match@^1.2.4: 556 | version "1.2.4" 557 | resolved "https://registry.yarnpkg.com/path-match/-/path-match-1.2.4.tgz#a62747f3c7e0c2514762697f24443585b09100ea" 558 | dependencies: 559 | http-errors "~1.4.0" 560 | path-to-regexp "^1.0.0" 561 | 562 | path-to-regexp@2.2.1: 563 | version "2.2.1" 564 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.2.1.tgz#90b617025a16381a879bc82a38d4e8bdeb2bcf45" 565 | 566 | path-to-regexp@^1.0.0, path-to-regexp@^1.2.0: 567 | version "1.7.0" 568 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" 569 | dependencies: 570 | isarray "0.0.1" 571 | 572 | pend@~1.2.0: 573 | version "1.2.0" 574 | resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" 575 | 576 | process-nextick-args@~2.0.0: 577 | version "2.0.0" 578 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 579 | 580 | progress@^2.0.0: 581 | version "2.0.0" 582 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" 583 | 584 | proxy-from-env@^1.0.0: 585 | version "1.0.0" 586 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" 587 | 588 | punycode@^1.3.2: 589 | version "1.4.1" 590 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 591 | 592 | puppeteer@^1.0.0: 593 | version "1.7.0" 594 | resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.7.0.tgz#edcba2300a50847202c0f19fd15e7a96171ff3bd" 595 | dependencies: 596 | debug "^3.1.0" 597 | extract-zip "^1.6.6" 598 | https-proxy-agent "^2.2.1" 599 | mime "^2.0.3" 600 | progress "^2.0.0" 601 | proxy-from-env "^1.0.0" 602 | rimraf "^2.6.1" 603 | ws "^5.1.1" 604 | 605 | range-parser@1.2.0: 606 | version "1.2.0" 607 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 608 | 609 | raw-body@2.3.2: 610 | version "2.3.2" 611 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" 612 | dependencies: 613 | bytes "3.0.0" 614 | http-errors "1.6.2" 615 | iconv-lite "0.4.19" 616 | unpipe "1.0.0" 617 | 618 | readable-stream@^2.2.2: 619 | version "2.3.6" 620 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 621 | dependencies: 622 | core-util-is "~1.0.0" 623 | inherits "~2.0.3" 624 | isarray "~1.0.0" 625 | process-nextick-args "~2.0.0" 626 | safe-buffer "~5.1.1" 627 | string_decoder "~1.1.1" 628 | util-deprecate "~1.0.1" 629 | 630 | requires-port@^1.0.0: 631 | version "1.0.0" 632 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 633 | 634 | resolve-path@^1.4.0: 635 | version "1.4.0" 636 | resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7" 637 | dependencies: 638 | http-errors "~1.6.2" 639 | path-is-absolute "1.0.1" 640 | 641 | ret@~0.1.10: 642 | version "0.1.15" 643 | resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" 644 | 645 | rimraf@^2.6.1: 646 | version "2.6.2" 647 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 648 | dependencies: 649 | glob "^7.0.5" 650 | 651 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 652 | version "5.1.2" 653 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 654 | 655 | safe-regex@^1.1.0: 656 | version "1.1.0" 657 | resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" 658 | dependencies: 659 | ret "~0.1.10" 660 | 661 | semver-store@^0.3.0: 662 | version "0.3.0" 663 | resolved "https://registry.yarnpkg.com/semver-store/-/semver-store-0.3.0.tgz#ce602ff07df37080ec9f4fb40b29576547befbe9" 664 | 665 | serve-handler@^4.0.1: 666 | version "4.0.1" 667 | resolved "https://registry.yarnpkg.com/serve-handler/-/serve-handler-4.0.1.tgz#6d8a4ff3f77989dc3c7268fbc20e0eaa5e921788" 668 | dependencies: 669 | bytes "3.0.0" 670 | content-disposition "0.5.2" 671 | fast-url-parser "1.1.3" 672 | glob-slasher "1.0.1" 673 | mime-types "2.1.18" 674 | minimatch "3.0.4" 675 | path-is-inside "1.0.2" 676 | path-to-regexp "2.2.1" 677 | range-parser "1.2.0" 678 | 679 | setprototypeof@1.0.3: 680 | version "1.0.3" 681 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 682 | 683 | setprototypeof@1.1.0: 684 | version "1.1.0" 685 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 686 | 687 | "statuses@>= 1.2.1 < 2", "statuses@>= 1.3.1 < 2", "statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0: 688 | version "1.5.0" 689 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 690 | 691 | string_decoder@~1.1.1: 692 | version "1.1.1" 693 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 694 | dependencies: 695 | safe-buffer "~5.1.0" 696 | 697 | supports-color@^5.3.0: 698 | version "5.4.0" 699 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 700 | dependencies: 701 | has-flag "^3.0.0" 702 | 703 | thenify-all@^1.0.0: 704 | version "1.6.0" 705 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 706 | dependencies: 707 | thenify ">= 3.1.0 < 4" 708 | 709 | "thenify@>= 3.1.0 < 4": 710 | version "3.3.0" 711 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" 712 | dependencies: 713 | any-promise "^1.0.0" 714 | 715 | toidentifier@1.0.0: 716 | version "1.0.0" 717 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 718 | 719 | toxic@^1.0.0: 720 | version "1.0.1" 721 | resolved "https://registry.yarnpkg.com/toxic/-/toxic-1.0.1.tgz#8c2e2528da591100adc3883f2c0e56acfb1c7288" 722 | dependencies: 723 | lodash "^4.17.10" 724 | 725 | type-is@^1.6.16: 726 | version "1.6.16" 727 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 728 | dependencies: 729 | media-typer "0.3.0" 730 | mime-types "~2.1.18" 731 | 732 | typedarray@^0.0.6: 733 | version "0.0.6" 734 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 735 | 736 | unpipe@1.0.0: 737 | version "1.0.0" 738 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 739 | 740 | util-deprecate@~1.0.1: 741 | version "1.0.2" 742 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 743 | 744 | vary@^1.1.2: 745 | version "1.1.2" 746 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 747 | 748 | wrappy@1: 749 | version "1.0.2" 750 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 751 | 752 | ws@^5.1.1: 753 | version "5.2.2" 754 | resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" 755 | dependencies: 756 | async-limiter "~1.0.0" 757 | 758 | yauzl@2.4.1: 759 | version "2.4.1" 760 | resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" 761 | dependencies: 762 | fd-slicer "~1.0.1" 763 | 764 | ylru@^1.2.0: 765 | version "1.2.1" 766 | resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f" 767 | --------------------------------------------------------------------------------