├── .gitignore ├── .npmignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin └── react-snapshot.js ├── compositor.json ├── package.json ├── src ├── Crawler.js ├── Server.js ├── Writer.js ├── cli.js ├── index.js └── snapshot.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | lib 2 | node_modules 3 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/geelen/react-snapshot/528fcdb825cc8a999699ccf9c354cab1df1869f7/.npmignore -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](http://keepachangelog.com/) 5 | and this project adheres to [Semantic Versioning](http://semver.org/). 6 | 7 | ## [1.2.0] - 2017-11-02 8 | 9 | - Upgraded peer dependencies to include React 16 [#71](https://github.com/geelen/react-snapshot/pull/71) 10 | - Added a package.json option to strip certain JS from the bundle [#58](https://github.com/geelen/react-snapshot/pull/58) 11 | - Added `build-dir`, `output-dir`, and `domain` CLI options [#84](https://github.com/geelen/react-snapshot/pull/84) 12 | 13 | ## [1.1.0] - 2017-05-24 14 | 15 | ### Added 16 | 17 | - Read paths from `package.json` if present [#12](https://github.com/geelen/react-snapshot/pull/12). Uses `include` and `exclude` fields to filter by. 18 | - Understand `homepage` field in `package.json` [#21](https://github.com/geelen/react-snapshot/pull/21). 19 | - Understands `proxy` field, at least for simple cases [#26](https://github.com/geelen/react-snapshot/pull/26) 20 | 21 | ### Changed 22 | 23 | - Don't follow `target="_blank"` links. 24 | - Don't follow links to any URL with a file extension (except `.html`). 25 | - If a URL is `/a/b` it'll render into `a/b.html` as before, but if it's `a/b/` it'll output `a/b/index.html`. 26 | - No longer uses a hardcoded port [#27](https://github.com/geelen/react-snapshot/pull/27). 27 | 28 | ### Fixed 29 | 30 | - Don't crash on null links [#20](https://github.com/geelen/react-snapshot/pull/20) 31 | - React Helmet v5 now works [#27](https://github.com/geelen/react-snapshot/pull/27) 32 | 33 | ## [1.0.4] - 2016-09-27 34 | 35 | Initial release. 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Glen Maddern 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 📸 React Snapshot 2 | 3 | ⚠️⚠️⚠️ DEPRECATED: USE https://github.com/stereobooster/react-snap INSTEAD ⚠️⚠️ 4 | 5 | A zero-configuration static pre-renderer for React apps. Starting by targeting Create React App (because it's great) 6 | 7 | ## The Premise 8 | 9 | Server-side rendering is a big feature of React, but for most apps it can be more trouble than its worth. Personally, I think the sweet spot is taking static site snapshots of all your publicly-accessible pages & leaving anything requiring authentication as a normal, JS-driven Single Page App. 10 | 11 | This is a project to do that. Automatically, without any configuration, just smart defaults. **Retrospective progressive enhancement.** 12 | 13 | The snapshots still have the normal JS bundle included, so once that downloads the site will function exactly as before (i.e. instantaneous page transitions), but you serve real, functional HTML & CSS as soon as possible. It's good for SEO (yes Google crawls SPAs now but they still reward perf and this perfs like a banshee), it's good if your JS is broken or something render-blocking has a network fail, it's good for accessibility, it's good for Slackbot or Facebook to read your opengraph tags, it's just good. 14 | 15 | ## The How To 16 | 17 | - First, `npm i -D react-snapshot` 18 | - Second, open your package.json and change `"scripts"` from 19 | 20 | ```diff 21 | - "build": "react-scripts build" 22 | + "build": "react-scripts build && react-snapshot" 23 | ``` 24 | 25 | - Third, change your usage of `react-dom`: 26 | 27 | ```diff 28 | - import ReactDOM from 'react-dom'; 29 | + import { render } from 'react-snapshot'; 30 | 31 | - ReactDOM.render( 32 | + render( 33 | , 34 | document.getElementById('root') 35 | ); 36 | ``` 37 | 38 | This calls `ReactDOM.render` in development and `ReactDOMServer.renderToString` when prerendering. If I can make this invisible I will but I can't think how at the moment. 39 | 40 | ## Options 41 | You can specify additional paths as entry points for crawling that would otherwise not be found. It's also possible to exclude particular paths from crawling. Simply add a section called `"reactSnapshot"` to your package.json. 42 | 43 | ``` 44 | "reactSnapshot": { 45 | "include": [ 46 | "/other-path", 47 | "/another/nested-path" 48 | ], 49 | "exclude": [ 50 | "/signup", 51 | "/other-path/exclude-me/**" 52 | ], 53 | "snapshotDelay": 300 54 | } 55 | ``` 56 | 57 | Note that exclude can be passed a glob, but include cannot. 58 | 59 | The default snapshot delay is 50ms, and this can be changed to suit your app's requirements. 60 | 61 | ## The Demo 62 | 63 | Check out [create-react-app-snapshot.surge.sh](https://create-react-app-snapshot.surge.sh) for a live version or [geelen/create-react-app-snapshot](https://github.com/geelen/create-react-app-snapshot) for how it was built, starting from [create-react-app](https://github.com/facebookincubator/create-react-app)'s awesome baseline. No ejecting necessary, either. 64 | 65 | The [diff from the original create-react-app code](https://github.com/geelen/create-react-app-snapshot/compare/303f774...master) might be enlightening to you as well. 66 | 67 | ## The Implementation 68 | 69 | It's pretty simple in principle: 70 | 71 | - Fire up the home page in a fake browser and snapshot the HTML once the page is rendered 72 | - Follow every relative URL to crawl the whole site 73 | - Repeat. 74 | 75 | There's a few more steps to it, but not much. 76 | 77 | React-snapshot will crawl all links that it finds. You can create "site map" page, which will contain links to all pages. 78 | 79 | - We move `build/index.html` to `build/200.html` at the beginning, because it's a nice convention. Hosts like [surge.sh](https://surge.sh) understand this, serving `200.html` if no snapshot exists for a URL. If you use a different host I'm sure you can make it do the same. 80 | - `pushstate-server` is used to serve the `build` directory & serving `200.html` by default 81 | - The fake browser is JSDOM, set to execute any local scripts (same origin) in order to actually run your React code, but it'll ignore any third-party scripts (analytics or social widgets) 82 | - We start a new JSDOM session for each URL to ensure that each page gets the absolute minimum HTML to render it. 83 | 84 | ## The Caveats 85 | 86 | This is a hacky experiment at the moment. I would really like to see how far we can take this approach so things "just work" without ever adding config. Off the top of my head: 87 | 88 | - [x] ~~Waiting on [pushstate-server#29](https://github.com/scottcorgan/pushstate-server/pull/29). Right now `pushstate-server` serves `200.html` _even if_ a HTML snapshot is present. So once you've run `react-snapshot`, you have to switch to `http-server` or `superstatic` to test if it worked. Or you could just push to [surge.sh](https://surge.sh) each time, which isn't too bad.~~ 89 | - [x] ~~Is starting at `/` and crawling sufficient? Might there be unreachable sections of your site?~~ 90 | - [x] ~~Should we exclude certain URLs? Maybe parse the `robots.txt` file?~~ 91 | - [ ] What if you don't want the `200.html` pushstate fallback? What if you want to remove the bundle (effectively making this a static site generator)? 92 | - [ ] This doesn't pass down any state except what's contained in the markup. That feels ok for simple use-cases (you can always roll your own) but if you have a use-case where you need it and want zero-config raise an issue. 93 | - [x] #2 ~~I'm using a regexp to parse URLs out of the HTML because I wrote this on a flight with no wifi and couldn't NPM install anything. We should use a real parser. You should submit a PR to use a real parser. That would be real swell.~~ 94 | - [ ] Should we clone the `build` directory to something like `snapshot` or `dist` instead of modifying it in-place? 95 | - [ ] There's virtually no error checking things so will just explode in interesting ways. So yeah that should be fixed. 96 | - [ ] Is JSDOM gonna hold us back at some point? 97 | - [ ] If the React code is changing what it renders based on size of viewport then things may "pop in" once the JS loads. Anything driven by media queries should just work though. So stick to Media Queries, I guess? 98 | - [ ] Does someone else want to take this idea and run with it? I would be 100% happy to not be the maintainer of this project :) 99 | 100 | ## The Alternatives 101 | 102 | This should work for simple cases. For less simple cases, go with: 103 | 104 | - [Webpack Static Site Generator Plugin](https://github.com/markdalgleish/static-site-generator-webpack-plugin) 105 | - [Gatsby](https://github.com/gatsbyjs/gatsby) or [Phenomic](https://phenomic.io/) if you're doing something bigger or more structured. Phenomic has service worker support & minimal bundles and all kinds of things, Gatsby is getting that stuff too. 106 | - Actually run a server-side React node server because you have more complex stuff to do, like pre-rendering stuff behind a login. 107 | 108 | ## License 109 | 110 | MIT 111 | -------------------------------------------------------------------------------- /bin/react-snapshot.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | require('../lib/cli')() 3 | -------------------------------------------------------------------------------- /compositor.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "geelen/react-snapshot", 3 | "version": "0.1.4", 4 | "libraries": { 5 | "xv": "^1.1.25" 6 | }, 7 | "title": "React Snapshot", 8 | "branch": "master", 9 | "style": { 10 | "name": "Material", 11 | "componentSet": { 12 | "nav": "nav/DarkAbsoluteNav", 13 | "header": "header/GradientHeader", 14 | "article": "article/BasicArticle", 15 | "footer": "footer/BasicFooter" 16 | }, 17 | "fontFamily": "Roboto, sans-serif", 18 | "heading": { 19 | "fontWeight": 500, 20 | "letterSpacing": "-0.01em" 21 | }, 22 | "colors": { 23 | "text": "#212121", 24 | "background": "#fff", 25 | "primary": "#2196f3", 26 | "secondary": "#1565c0", 27 | "highlight": "#ff4081", 28 | "border": "#e0e0e0", 29 | "muted": "#f5f5f5" 30 | }, 31 | "layout": { 32 | "centered": true, 33 | "bannerHeight": "80vh", 34 | "maxWidth": 896 35 | } 36 | }, 37 | "content": [ 38 | { 39 | "component": "nav", 40 | "links": [ 41 | { 42 | "href": "https://github.com/geelen/react-snapshot", 43 | "text": "GitHub" 44 | }, 45 | { 46 | "href": "https://npmjs.com/package/react-snapshot", 47 | "text": "npm" 48 | } 49 | ] 50 | }, 51 | { 52 | "component": "header", 53 | "heading": "react-snapshot", 54 | "subhead": "A zero-configuration static pre-renderer for React apps", 55 | "children": [ 56 | { 57 | "component": "ui/TweetButton", 58 | "text": "react-snapshot: A zero-configuration static pre-renderer for React apps", 59 | "url": "" 60 | }, 61 | { 62 | "component": "ui/GithubButton", 63 | "user": "geelen", 64 | "repo": "react-snapshot" 65 | } 66 | ], 67 | "text": "v1.0.4" 68 | }, 69 | { 70 | "component": "article", 71 | "metadata": { 72 | "source": "github.readme" 73 | }, 74 | "html": "

📸 React Snapshot

\n

A zero-configuration static pre-renderer for React apps. Starting by targeting Create React App (because it's great)

\n

The Premise

\n

Server-side rendering is a big feature of React, but for most apps it can be more trouble than its worth. Personally, I think the sweet spot is taking static site snapshots of all your publicly-accessible pages & leaving anything requiring authentication as a normal, JS-driven Single Page App.

\n

This is a project to do that. Automatically, without any configuration, just smart defaults. Retrospective progressive enhancement.

\n

The snapshots still have the normal JS bundle included, so once that downloads the site will function exactly as before (i.e. instantaneous page transitions), but you serve real, functional HTML & CSS as soon as possible. It's good for SEO (yes Google crawls SPAs now but they still reward perf and this perfs like a banshee), it's good if your JS is broken or something render-blocking has a network fail, it's good for accessibility, it's good for Slackbot or Facebook to read your opengraph tags, it's just good.

\n

The How To

\n\n
- "build": "react-scripts build"\n+ "build": "react-scripts build && react-snapshot"
\n
- import ReactDOM from 'react-dom';\n+ import { render } from 'react-snapshot';\n\n- ReactDOM.render(\n+ render(\n    <App/>,\n    document.getElementById('root')\n  );

This calls ReactDOM.render in development and ReactDOMServer.renderToString when prerendering. If I can make this invisible I will but I can't think how at the moment.

\n

Options

\n

You can specify additional paths as entry points for crawling that would otherwise not be found. It's also possible to exclude particular paths from crawling. Simply add a section called "reactSnapshot" to your package.json.

\n
  "reactSnapshot": {\n    "include": [\n      "/other-path",\n      "/another/nested-path"\n    ],\n    "exclude": [\n      "/signup",\n      "/other-path/exclude-me/**"\n    ],\n    "snapshotDelay": 300\n  }

Note that exclude can be passed a glob, but include cannot.

\n

The default snapshot delay is 50ms, and this can be changed to suit your app's requirements.

\n

The Demo

\n

Check out create-react-app-snapshot.surge.sh for a live version or geelen/create-react-app-snapshot for how it was built, starting from create-react-app's awesome baseline. No ejecting necessary, either.

\n

The diff from the original create-react-app code might be enlightening to you as well.

\n

The Implementation

\n

It's pretty simple in principle:

\n\n

There's a few more steps to it, but not much.

\n

React-snapshot will crawl all links that it finds. You can create "site map" page, which will contain links to all pages.

\n\n

The Caveats

\n

This is a hacky experiment at the moment. I would really like to see how far we can take this approach so things "just work" without ever adding config. Off the top of my head:

\n\n

The Alternatives

\n

This should work for simple cases. For less simple cases, go with:

\n\n

License

\n

MIT

\n" 75 | }, 76 | { 77 | "component": "footer", 78 | "links": [ 79 | { 80 | "href": "https://github.com/geelen/react-snapshot", 81 | "text": "GitHub" 82 | }, 83 | { 84 | "href": "https://github.com/geelen", 85 | "text": "geelen" 86 | } 87 | ] 88 | } 89 | ] 90 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-snapshot", 3 | "version": "1.3.0", 4 | "description": "", 5 | "main": "lib/index.js", 6 | "repository": "geelen/react-snapshot", 7 | "bin": { 8 | "react-snapshot": "./bin/react-snapshot.js" 9 | }, 10 | "scripts": { 11 | "build": "babel --out-dir lib src", 12 | "build:watch": "npm run build -- --watch", 13 | "prepublish": "rm -rf lib/* && npm run build" 14 | }, 15 | "dependencies": { 16 | "connect-history-api-fallback": "^1.3.0", 17 | "express": "^4.15.2", 18 | "glob-to-regexp": "^0.3.0", 19 | "http-proxy-middleware": "^0.17.4", 20 | "jsdom": "^9.4.5", 21 | "mkdirp": "^0.5.1", 22 | "safe-commander": "^2.11.1" 23 | }, 24 | "devDependencies": { 25 | "babel-cli": "^6.14.0", 26 | "babel-core": "^6.13.2", 27 | "babel-plugin-add-module-exports": "^0.2.1", 28 | "babel-preset-es2015": "^6.13.2", 29 | "babel-preset-es2016": "^6.11.3", 30 | "react": "^15.3.0", 31 | "react-dom": "^15.3.0" 32 | }, 33 | "peerDependencies": { 34 | "react": "^15.3.0 || ^16.0.0", 35 | "react-dom": "^15.3.0 || ^16.0.0" 36 | }, 37 | "babel": { 38 | "presets": [ 39 | "es2015", 40 | "es2016" 41 | ], 42 | "plugins": [ 43 | "add-module-exports" 44 | ] 45 | }, 46 | "keywords": [ 47 | "react", 48 | "create-react-app", 49 | "snapshot", 50 | "static-site-generator", 51 | "jsdom" 52 | ], 53 | "author": "Glen Maddern", 54 | "license": "ISC", 55 | "homepage": "https://github.com/geelen/react-snapshot" 56 | } 57 | -------------------------------------------------------------------------------- /src/Crawler.js: -------------------------------------------------------------------------------- 1 | /* Loads a URL then starts looking for links. 2 | Emits a full page whenever a new link is found. */ 3 | import url from 'url' 4 | import path from 'path' 5 | import jsdom from 'jsdom' 6 | import glob from 'glob-to-regexp' 7 | import snapshot from './snapshot' 8 | 9 | export default class Crawler { 10 | constructor(baseUrl, snapshotDelay, options) { 11 | this.baseUrl = baseUrl 12 | const { protocol, host } = url.parse(baseUrl) 13 | this.protocol = protocol 14 | this.host = host 15 | this.paths = [...options.include] 16 | this.exclude = options.exclude.map((g) => glob(g, { extended: true, globstar: true})) 17 | this.stripJS = options.stripJS 18 | this.processed = {} 19 | this.snapshotDelay = snapshotDelay 20 | } 21 | 22 | crawl(handler) { 23 | this.handler = handler 24 | console.log(`🕷 Starting crawling ${this.baseUrl}`) 25 | return this.snap() 26 | .then(() => console.log(`🕸 Finished crawling.`)) 27 | } 28 | 29 | snap() { 30 | let urlPath = this.paths.shift() 31 | if (!urlPath) return Promise.resolve() 32 | urlPath = url.resolve('/', urlPath) // Resolve removes trailing slashes 33 | if (this.processed[urlPath]) { 34 | return this.snap() 35 | } else { 36 | this.processed[urlPath] = true 37 | } 38 | return snapshot(this.protocol, this.host, urlPath, this.snapshotDelay).then(window => { 39 | if (this.stripJS) { 40 | const strip = new RegExp(this.stripJS) 41 | Array.from(window.document.querySelectorAll('script')).forEach(script => { 42 | if (strip.exec(url.parse(script.src).path)) script.remove() 43 | }) 44 | } 45 | if (Boolean(window.react_snapshot_state)) { 46 | const stateJSON = JSON.stringify(window.react_snapshot_state) 47 | const script = window.document.createElement('script') 48 | script.innerHTML = `window.react_snapshot_state = JSON.parse('${stateJSON}');` 49 | window.document.head.appendChild(script) 50 | } 51 | const html = jsdom.serializeDocument(window.document) 52 | this.extractNewLinks(window, urlPath) 53 | this.handler({ urlPath, html }) 54 | window.close() // Release resources used by jsdom 55 | return this.snap() 56 | }, err => { 57 | console.log(`🔥 ${err}`) 58 | }) 59 | } 60 | 61 | extractNewLinks(window, currentPath) { 62 | const document = window.document 63 | const tagAttributeMap = { 64 | 'a': 'href', 65 | 'iframe': 'src' 66 | } 67 | 68 | Object.keys(tagAttributeMap).forEach(tagName => { 69 | const urlAttribute = tagAttributeMap[tagName] 70 | Array.from(document.querySelectorAll(`${tagName}[${urlAttribute}]`)).forEach(element => { 71 | if (element.getAttribute('target') === '_blank') return 72 | const href = url.parse(element.getAttribute(urlAttribute)) 73 | if (href.protocol || href.host || href.path === null) return; 74 | const relativePath = url.resolve(currentPath, href.path) 75 | if (path.extname(relativePath) !== '.html' && path.extname(relativePath) !== '') return; 76 | if (this.processed[relativePath]) return; 77 | if (this.exclude.filter((regex) => regex.test(relativePath)).length > 0) return 78 | this.paths.push(relativePath) 79 | }) 80 | }) 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /src/Server.js: -------------------------------------------------------------------------------- 1 | /* Spin up a simple express server */ 2 | import express from 'express' 3 | import httpProxyMiddleware from 'http-proxy-middleware' 4 | import historyApiFallback from 'connect-history-api-fallback' 5 | 6 | export default class Server { 7 | constructor(baseDir, publicPath, port, proxy) { 8 | const app = express() 9 | 10 | app.get('*', (req, res, next) => { 11 | // This makes sure the sockets close down so that 12 | // we can gracefully shutdown the server 13 | res.set('Connection', 'close'); 14 | next() 15 | }) 16 | 17 | // Yes I just copied most of this from react-scripts ¯\_(ツ)_/¯ 18 | app.use(publicPath, 19 | historyApiFallback({ 20 | index: '/200.html', 21 | disableDotRule: true, 22 | htmlAcceptHeaders: ['text/html'], 23 | }), 24 | express.static(baseDir, { index: '200.html' }) 25 | ) 26 | 27 | if (proxy) { 28 | if (typeof proxy !== "string") throw new Error("Only string proxies are implemented currently.") 29 | app.use(httpProxyMiddleware({ 30 | target: proxy, 31 | onProxyReq: proxyReq => { 32 | if (proxyReq.getHeader('origin')) proxyReq.setHeader('origin', proxy) 33 | }, 34 | changeOrigin: true, 35 | xfwd: true, 36 | })) 37 | } 38 | 39 | this.start = this.start.bind(this, app, port) 40 | } 41 | 42 | start(app, port) { 43 | return new Promise((resolve, reject) => { 44 | this.instance = app.listen(port, (err) => { 45 | if (err) { 46 | return reject(err) 47 | } 48 | 49 | resolve() 50 | }) 51 | }) 52 | } 53 | 54 | port() { 55 | return this.instance.address().port 56 | } 57 | 58 | stop() { 59 | this.instance.close() 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/Writer.js: -------------------------------------------------------------------------------- 1 | /* Simple wrapper around fs so I can concentrate on what's going on */ 2 | import fs from 'fs' 3 | import path from 'path' 4 | import { sync as mkDirPSync } from 'mkdirp' 5 | 6 | export default class Writer { 7 | constructor(baseDir, outputDir) { 8 | this.baseDir = baseDir 9 | if (outputDir !== baseDir) { 10 | mkDirPSync(outputDir) 11 | } 12 | this.outputDir = outputDir 13 | } 14 | 15 | move(from, to) { 16 | /* Only do this if we still have an index.html 17 | (i.e. this is the first run post build) */ 18 | const fromPath = path.resolve(this.baseDir, from); 19 | if (fs.existsSync(fromPath)) { 20 | /* This _must_ be in the BUILD directory, not the OUTPUT directory, since 21 | * that's how our Server is configured. */ 22 | fs.renameSync(fromPath, path.resolve(this.baseDir, to)) 23 | } 24 | } 25 | 26 | write(filename, content) { 27 | const newPath = path.join(this.outputDir, filename) 28 | const dirName = path.dirname(newPath) 29 | mkDirPSync(dirName) 30 | fs.writeFileSync(newPath, content) 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/cli.js: -------------------------------------------------------------------------------- 1 | import path from 'path' 2 | import fs from 'fs' 3 | import url from 'url' 4 | import Server from './Server' 5 | import Crawler from './Crawler' 6 | import Writer from './Writer' 7 | import program from 'safe-commander' 8 | 9 | export default () => { 10 | program 11 | .version(require('../package.json').version) 12 | .option('--build-dir ', `Specify where the JS app lives. Defaults to 'build'`) 13 | .option('--domain ', `The local domain to use for scraping. Defaults to 'localhost'`) 14 | .option('--output-dir ', `Where to write the snapshots. Defaults to in-place (i.e. same as build-dir)`) 15 | .parse(process.argv) 16 | 17 | const { 18 | buildDir = 'build', 19 | domain = 'localhost', 20 | outputDir = buildDir, 21 | } = program.optsObj 22 | 23 | const pkg = JSON.parse(fs.readFileSync(path.join(process.cwd(), 'package.json'))) 24 | const basename = ((p) => p.endsWith('/') ? p : p + '/')(pkg.homepage ? url.parse(pkg.homepage).pathname : '') 25 | 26 | const options = Object.assign({ 27 | include: [], 28 | exclude: [], 29 | snapshotDelay: 50, 30 | }, pkg['react-snapshot'] || pkg.reactSnapshot || {}) 31 | 32 | options.exclude = options.exclude.map((p) => path.join(basename, p).replace(/\\/g, '/')) 33 | options.include = options.include.map((p) => path.join(basename, p).replace(/\\/g, '/')) 34 | options.include.unshift(basename) 35 | 36 | const buildDirPath = path.resolve(`./${buildDir}`) 37 | const outputDirPath = path.resolve(`./${outputDir}`) 38 | if (!fs.existsSync(buildDir)) throw new Error(`No build directory exists at: ${buildDirPath}`) 39 | const writer = new Writer(buildDirPath, outputDirPath) 40 | writer.move('index.html', '200.html') 41 | 42 | const server = new Server(buildDirPath, basename, 0, pkg.proxy) 43 | server.start().then(() => { 44 | const crawler = new Crawler(`http://${domain}:${server.port()}${basename}`, options.snapshotDelay, options) 45 | return crawler.crawl(({ urlPath, html }) => { 46 | if (!urlPath.startsWith(basename)) { 47 | console.log(`❗ Refusing to crawl ${urlPath} because it is outside of the ${basename} sub-folder`) 48 | return 49 | } 50 | urlPath = urlPath.replace(basename, '/') 51 | let filename = urlPath 52 | if (urlPath.endsWith('/')) { 53 | filename = `${urlPath}index.html` 54 | } else if (path.extname(urlPath) == '') { 55 | filename = `${urlPath}.html` 56 | } 57 | console.log(`✏️ Saving ${urlPath} as ${filename}`) 58 | writer.write(filename, html) 59 | }) 60 | 61 | }).then(() => server.stop(), err => console.log(`🔥 ${err}`)) 62 | } 63 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | import ReactDOM from 'react-dom'; 2 | import ReactDOMServer from 'react-dom/server'; 3 | 4 | export const render = (rootComponent, domElement) => { 5 | if (navigator.userAgent.match(/Node\.js/i) && window && window.reactSnapshotRender) { 6 | domElement.innerHTML = ReactDOMServer.renderToString(rootComponent) 7 | window.reactSnapshotRender() 8 | } else { 9 | ReactDOM.render(rootComponent, domElement) 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/snapshot.js: -------------------------------------------------------------------------------- 1 | /* Wraps a jsdom call and returns the full page */ 2 | 3 | import jsdom from 'jsdom' 4 | 5 | export default (protocol, host, path, delay) => { 6 | return new Promise((resolve, reject) => { 7 | let reactSnapshotRenderCalled = false 8 | const url = `${protocol}//${host}${path}` 9 | jsdom.env({ 10 | url, 11 | headers: { Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" }, 12 | resourceLoader(resource, callback) { 13 | if (resource.url.host === host) { 14 | resource.defaultFetch(callback); 15 | } else { 16 | callback() 17 | } 18 | }, 19 | features: { 20 | FetchExternalResources: ["script"], 21 | ProcessExternalResources: ["script"], 22 | SkipExternalResources: false 23 | }, 24 | virtualConsole: jsdom.createVirtualConsole().sendTo(console), 25 | created: (err, window) => { 26 | if (err) return reject(err) 27 | if (!window) return reject(`Looks like no page exists at ${url}`) 28 | window.reactSnapshotRender = () => { 29 | reactSnapshotRenderCalled = true 30 | setTimeout(() => { 31 | resolve(window) 32 | }, delay) 33 | } 34 | }, 35 | done: (err, window) => { 36 | if (!reactSnapshotRenderCalled) { 37 | reject("'render' from react-snapshot was never called. Did you replace the call to ReactDOM.render()?") 38 | } 39 | } 40 | }) 41 | }) 42 | } 43 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | abab@^1.0.3: 6 | version "1.0.3" 7 | resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" 8 | 9 | abbrev@1: 10 | version "1.1.0" 11 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 12 | 13 | accepts@~1.3.3: 14 | version "1.3.3" 15 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 16 | dependencies: 17 | mime-types "~2.1.11" 18 | negotiator "0.6.1" 19 | 20 | acorn-globals@^3.1.0: 21 | version "3.1.0" 22 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" 23 | dependencies: 24 | acorn "^4.0.4" 25 | 26 | acorn@^4.0.4: 27 | version "4.0.11" 28 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0" 29 | 30 | ajv@^4.9.1: 31 | version "4.11.7" 32 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.7.tgz#8655a5d86d0824985cc471a1d913fb6729a0ec48" 33 | dependencies: 34 | co "^4.6.0" 35 | json-stable-stringify "^1.0.1" 36 | 37 | amdefine@>=0.0.4: 38 | version "1.0.1" 39 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 40 | 41 | ansi-regex@^2.0.0: 42 | version "2.1.1" 43 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 44 | 45 | ansi-styles@^2.2.1: 46 | version "2.2.1" 47 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 48 | 49 | anymatch@^1.3.0: 50 | version "1.3.0" 51 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" 52 | dependencies: 53 | arrify "^1.0.0" 54 | micromatch "^2.1.5" 55 | 56 | aproba@^1.0.3: 57 | version "1.1.1" 58 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" 59 | 60 | are-we-there-yet@~1.1.2: 61 | version "1.1.4" 62 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 63 | dependencies: 64 | delegates "^1.0.0" 65 | readable-stream "^2.0.6" 66 | 67 | arr-diff@^2.0.0: 68 | version "2.0.0" 69 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 70 | dependencies: 71 | arr-flatten "^1.0.1" 72 | 73 | arr-flatten@^1.0.1: 74 | version "1.0.3" 75 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" 76 | 77 | array-equal@^1.0.0: 78 | version "1.0.0" 79 | resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 80 | 81 | array-flatten@1.1.1: 82 | version "1.1.1" 83 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 84 | 85 | array-unique@^0.2.1: 86 | version "0.2.1" 87 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 88 | 89 | arrify@^1.0.0: 90 | version "1.0.1" 91 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 92 | 93 | asap@~2.0.3: 94 | version "2.0.5" 95 | resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.5.tgz#522765b50c3510490e52d7dcfe085ef9ba96958f" 96 | 97 | asn1@~0.2.3: 98 | version "0.2.3" 99 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 100 | 101 | assert-plus@1.0.0, assert-plus@^1.0.0: 102 | version "1.0.0" 103 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 104 | 105 | assert-plus@^0.2.0: 106 | version "0.2.0" 107 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 108 | 109 | async-each@^1.0.0: 110 | version "1.0.1" 111 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 112 | 113 | asynckit@^0.4.0: 114 | version "0.4.0" 115 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 116 | 117 | aws-sign2@~0.6.0: 118 | version "0.6.0" 119 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 120 | 121 | aws4@^1.2.1: 122 | version "1.6.0" 123 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 124 | 125 | babel-cli@^6.14.0: 126 | version "6.24.1" 127 | resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283" 128 | dependencies: 129 | babel-core "^6.24.1" 130 | babel-polyfill "^6.23.0" 131 | babel-register "^6.24.1" 132 | babel-runtime "^6.22.0" 133 | commander "^2.8.1" 134 | convert-source-map "^1.1.0" 135 | fs-readdir-recursive "^1.0.0" 136 | glob "^7.0.0" 137 | lodash "^4.2.0" 138 | output-file-sync "^1.1.0" 139 | path-is-absolute "^1.0.0" 140 | slash "^1.0.0" 141 | source-map "^0.5.0" 142 | v8flags "^2.0.10" 143 | optionalDependencies: 144 | chokidar "^1.6.1" 145 | 146 | babel-code-frame@^6.22.0: 147 | version "6.22.0" 148 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 149 | dependencies: 150 | chalk "^1.1.0" 151 | esutils "^2.0.2" 152 | js-tokens "^3.0.0" 153 | 154 | babel-core@^6.13.2, babel-core@^6.24.1: 155 | version "6.24.1" 156 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.1.tgz#8c428564dce1e1f41fb337ec34f4c3b022b5ad83" 157 | dependencies: 158 | babel-code-frame "^6.22.0" 159 | babel-generator "^6.24.1" 160 | babel-helpers "^6.24.1" 161 | babel-messages "^6.23.0" 162 | babel-register "^6.24.1" 163 | babel-runtime "^6.22.0" 164 | babel-template "^6.24.1" 165 | babel-traverse "^6.24.1" 166 | babel-types "^6.24.1" 167 | babylon "^6.11.0" 168 | convert-source-map "^1.1.0" 169 | debug "^2.1.1" 170 | json5 "^0.5.0" 171 | lodash "^4.2.0" 172 | minimatch "^3.0.2" 173 | path-is-absolute "^1.0.0" 174 | private "^0.1.6" 175 | slash "^1.0.0" 176 | source-map "^0.5.0" 177 | 178 | babel-generator@^6.24.1: 179 | version "6.24.1" 180 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.1.tgz#e715f486c58ded25649d888944d52aa07c5d9497" 181 | dependencies: 182 | babel-messages "^6.23.0" 183 | babel-runtime "^6.22.0" 184 | babel-types "^6.24.1" 185 | detect-indent "^4.0.0" 186 | jsesc "^1.3.0" 187 | lodash "^4.2.0" 188 | source-map "^0.5.0" 189 | trim-right "^1.0.1" 190 | 191 | babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: 192 | version "6.24.1" 193 | resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" 194 | dependencies: 195 | babel-helper-explode-assignable-expression "^6.24.1" 196 | babel-runtime "^6.22.0" 197 | babel-types "^6.24.1" 198 | 199 | babel-helper-call-delegate@^6.24.1: 200 | version "6.24.1" 201 | resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" 202 | dependencies: 203 | babel-helper-hoist-variables "^6.24.1" 204 | babel-runtime "^6.22.0" 205 | babel-traverse "^6.24.1" 206 | babel-types "^6.24.1" 207 | 208 | babel-helper-define-map@^6.24.1: 209 | version "6.24.1" 210 | resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.24.1.tgz#7a9747f258d8947d32d515f6aa1c7bd02204a080" 211 | dependencies: 212 | babel-helper-function-name "^6.24.1" 213 | babel-runtime "^6.22.0" 214 | babel-types "^6.24.1" 215 | lodash "^4.2.0" 216 | 217 | babel-helper-explode-assignable-expression@^6.24.1: 218 | version "6.24.1" 219 | resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" 220 | dependencies: 221 | babel-runtime "^6.22.0" 222 | babel-traverse "^6.24.1" 223 | babel-types "^6.24.1" 224 | 225 | babel-helper-function-name@^6.24.1: 226 | version "6.24.1" 227 | resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" 228 | dependencies: 229 | babel-helper-get-function-arity "^6.24.1" 230 | babel-runtime "^6.22.0" 231 | babel-template "^6.24.1" 232 | babel-traverse "^6.24.1" 233 | babel-types "^6.24.1" 234 | 235 | babel-helper-get-function-arity@^6.24.1: 236 | version "6.24.1" 237 | resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" 238 | dependencies: 239 | babel-runtime "^6.22.0" 240 | babel-types "^6.24.1" 241 | 242 | babel-helper-hoist-variables@^6.24.1: 243 | version "6.24.1" 244 | resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" 245 | dependencies: 246 | babel-runtime "^6.22.0" 247 | babel-types "^6.24.1" 248 | 249 | babel-helper-optimise-call-expression@^6.24.1: 250 | version "6.24.1" 251 | resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" 252 | dependencies: 253 | babel-runtime "^6.22.0" 254 | babel-types "^6.24.1" 255 | 256 | babel-helper-regex@^6.24.1: 257 | version "6.24.1" 258 | resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.24.1.tgz#d36e22fab1008d79d88648e32116868128456ce8" 259 | dependencies: 260 | babel-runtime "^6.22.0" 261 | babel-types "^6.24.1" 262 | lodash "^4.2.0" 263 | 264 | babel-helper-replace-supers@^6.24.1: 265 | version "6.24.1" 266 | resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" 267 | dependencies: 268 | babel-helper-optimise-call-expression "^6.24.1" 269 | babel-messages "^6.23.0" 270 | babel-runtime "^6.22.0" 271 | babel-template "^6.24.1" 272 | babel-traverse "^6.24.1" 273 | babel-types "^6.24.1" 274 | 275 | babel-helpers@^6.24.1: 276 | version "6.24.1" 277 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 278 | dependencies: 279 | babel-runtime "^6.22.0" 280 | babel-template "^6.24.1" 281 | 282 | babel-messages@^6.23.0: 283 | version "6.23.0" 284 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 285 | dependencies: 286 | babel-runtime "^6.22.0" 287 | 288 | babel-plugin-add-module-exports@^0.2.1: 289 | version "0.2.1" 290 | resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25" 291 | 292 | babel-plugin-check-es2015-constants@^6.22.0: 293 | version "6.22.0" 294 | resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" 295 | dependencies: 296 | babel-runtime "^6.22.0" 297 | 298 | babel-plugin-syntax-exponentiation-operator@^6.8.0: 299 | version "6.13.0" 300 | resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" 301 | 302 | babel-plugin-transform-es2015-arrow-functions@^6.22.0: 303 | version "6.22.0" 304 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" 305 | dependencies: 306 | babel-runtime "^6.22.0" 307 | 308 | babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: 309 | version "6.22.0" 310 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" 311 | dependencies: 312 | babel-runtime "^6.22.0" 313 | 314 | babel-plugin-transform-es2015-block-scoping@^6.24.1: 315 | version "6.24.1" 316 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" 317 | dependencies: 318 | babel-runtime "^6.22.0" 319 | babel-template "^6.24.1" 320 | babel-traverse "^6.24.1" 321 | babel-types "^6.24.1" 322 | lodash "^4.2.0" 323 | 324 | babel-plugin-transform-es2015-classes@^6.24.1: 325 | version "6.24.1" 326 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" 327 | dependencies: 328 | babel-helper-define-map "^6.24.1" 329 | babel-helper-function-name "^6.24.1" 330 | babel-helper-optimise-call-expression "^6.24.1" 331 | babel-helper-replace-supers "^6.24.1" 332 | babel-messages "^6.23.0" 333 | babel-runtime "^6.22.0" 334 | babel-template "^6.24.1" 335 | babel-traverse "^6.24.1" 336 | babel-types "^6.24.1" 337 | 338 | babel-plugin-transform-es2015-computed-properties@^6.24.1: 339 | version "6.24.1" 340 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" 341 | dependencies: 342 | babel-runtime "^6.22.0" 343 | babel-template "^6.24.1" 344 | 345 | babel-plugin-transform-es2015-destructuring@^6.22.0: 346 | version "6.23.0" 347 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" 348 | dependencies: 349 | babel-runtime "^6.22.0" 350 | 351 | babel-plugin-transform-es2015-duplicate-keys@^6.24.1: 352 | version "6.24.1" 353 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" 354 | dependencies: 355 | babel-runtime "^6.22.0" 356 | babel-types "^6.24.1" 357 | 358 | babel-plugin-transform-es2015-for-of@^6.22.0: 359 | version "6.23.0" 360 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" 361 | dependencies: 362 | babel-runtime "^6.22.0" 363 | 364 | babel-plugin-transform-es2015-function-name@^6.24.1: 365 | version "6.24.1" 366 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" 367 | dependencies: 368 | babel-helper-function-name "^6.24.1" 369 | babel-runtime "^6.22.0" 370 | babel-types "^6.24.1" 371 | 372 | babel-plugin-transform-es2015-literals@^6.22.0: 373 | version "6.22.0" 374 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" 375 | dependencies: 376 | babel-runtime "^6.22.0" 377 | 378 | babel-plugin-transform-es2015-modules-amd@^6.24.1: 379 | version "6.24.1" 380 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" 381 | dependencies: 382 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 383 | babel-runtime "^6.22.0" 384 | babel-template "^6.24.1" 385 | 386 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 387 | version "6.24.1" 388 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" 389 | dependencies: 390 | babel-plugin-transform-strict-mode "^6.24.1" 391 | babel-runtime "^6.22.0" 392 | babel-template "^6.24.1" 393 | babel-types "^6.24.1" 394 | 395 | babel-plugin-transform-es2015-modules-systemjs@^6.24.1: 396 | version "6.24.1" 397 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" 398 | dependencies: 399 | babel-helper-hoist-variables "^6.24.1" 400 | babel-runtime "^6.22.0" 401 | babel-template "^6.24.1" 402 | 403 | babel-plugin-transform-es2015-modules-umd@^6.24.1: 404 | version "6.24.1" 405 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" 406 | dependencies: 407 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 408 | babel-runtime "^6.22.0" 409 | babel-template "^6.24.1" 410 | 411 | babel-plugin-transform-es2015-object-super@^6.24.1: 412 | version "6.24.1" 413 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" 414 | dependencies: 415 | babel-helper-replace-supers "^6.24.1" 416 | babel-runtime "^6.22.0" 417 | 418 | babel-plugin-transform-es2015-parameters@^6.24.1: 419 | version "6.24.1" 420 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" 421 | dependencies: 422 | babel-helper-call-delegate "^6.24.1" 423 | babel-helper-get-function-arity "^6.24.1" 424 | babel-runtime "^6.22.0" 425 | babel-template "^6.24.1" 426 | babel-traverse "^6.24.1" 427 | babel-types "^6.24.1" 428 | 429 | babel-plugin-transform-es2015-shorthand-properties@^6.24.1: 430 | version "6.24.1" 431 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" 432 | dependencies: 433 | babel-runtime "^6.22.0" 434 | babel-types "^6.24.1" 435 | 436 | babel-plugin-transform-es2015-spread@^6.22.0: 437 | version "6.22.0" 438 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" 439 | dependencies: 440 | babel-runtime "^6.22.0" 441 | 442 | babel-plugin-transform-es2015-sticky-regex@^6.24.1: 443 | version "6.24.1" 444 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" 445 | dependencies: 446 | babel-helper-regex "^6.24.1" 447 | babel-runtime "^6.22.0" 448 | babel-types "^6.24.1" 449 | 450 | babel-plugin-transform-es2015-template-literals@^6.22.0: 451 | version "6.22.0" 452 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" 453 | dependencies: 454 | babel-runtime "^6.22.0" 455 | 456 | babel-plugin-transform-es2015-typeof-symbol@^6.22.0: 457 | version "6.23.0" 458 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" 459 | dependencies: 460 | babel-runtime "^6.22.0" 461 | 462 | babel-plugin-transform-es2015-unicode-regex@^6.24.1: 463 | version "6.24.1" 464 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" 465 | dependencies: 466 | babel-helper-regex "^6.24.1" 467 | babel-runtime "^6.22.0" 468 | regexpu-core "^2.0.0" 469 | 470 | babel-plugin-transform-exponentiation-operator@^6.24.1: 471 | version "6.24.1" 472 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" 473 | dependencies: 474 | babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" 475 | babel-plugin-syntax-exponentiation-operator "^6.8.0" 476 | babel-runtime "^6.22.0" 477 | 478 | babel-plugin-transform-regenerator@^6.24.1: 479 | version "6.24.1" 480 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.24.1.tgz#b8da305ad43c3c99b4848e4fe4037b770d23c418" 481 | dependencies: 482 | regenerator-transform "0.9.11" 483 | 484 | babel-plugin-transform-strict-mode@^6.24.1: 485 | version "6.24.1" 486 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 487 | dependencies: 488 | babel-runtime "^6.22.0" 489 | babel-types "^6.24.1" 490 | 491 | babel-polyfill@^6.23.0: 492 | version "6.23.0" 493 | resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d" 494 | dependencies: 495 | babel-runtime "^6.22.0" 496 | core-js "^2.4.0" 497 | regenerator-runtime "^0.10.0" 498 | 499 | babel-preset-es2015@^6.13.2: 500 | version "6.24.1" 501 | resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" 502 | dependencies: 503 | babel-plugin-check-es2015-constants "^6.22.0" 504 | babel-plugin-transform-es2015-arrow-functions "^6.22.0" 505 | babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" 506 | babel-plugin-transform-es2015-block-scoping "^6.24.1" 507 | babel-plugin-transform-es2015-classes "^6.24.1" 508 | babel-plugin-transform-es2015-computed-properties "^6.24.1" 509 | babel-plugin-transform-es2015-destructuring "^6.22.0" 510 | babel-plugin-transform-es2015-duplicate-keys "^6.24.1" 511 | babel-plugin-transform-es2015-for-of "^6.22.0" 512 | babel-plugin-transform-es2015-function-name "^6.24.1" 513 | babel-plugin-transform-es2015-literals "^6.22.0" 514 | babel-plugin-transform-es2015-modules-amd "^6.24.1" 515 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 516 | babel-plugin-transform-es2015-modules-systemjs "^6.24.1" 517 | babel-plugin-transform-es2015-modules-umd "^6.24.1" 518 | babel-plugin-transform-es2015-object-super "^6.24.1" 519 | babel-plugin-transform-es2015-parameters "^6.24.1" 520 | babel-plugin-transform-es2015-shorthand-properties "^6.24.1" 521 | babel-plugin-transform-es2015-spread "^6.22.0" 522 | babel-plugin-transform-es2015-sticky-regex "^6.24.1" 523 | babel-plugin-transform-es2015-template-literals "^6.22.0" 524 | babel-plugin-transform-es2015-typeof-symbol "^6.22.0" 525 | babel-plugin-transform-es2015-unicode-regex "^6.24.1" 526 | babel-plugin-transform-regenerator "^6.24.1" 527 | 528 | babel-preset-es2016@^6.11.3: 529 | version "6.24.1" 530 | resolved "https://registry.yarnpkg.com/babel-preset-es2016/-/babel-preset-es2016-6.24.1.tgz#f900bf93e2ebc0d276df9b8ab59724ebfd959f8b" 531 | dependencies: 532 | babel-plugin-transform-exponentiation-operator "^6.24.1" 533 | 534 | babel-register@^6.24.1: 535 | version "6.24.1" 536 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" 537 | dependencies: 538 | babel-core "^6.24.1" 539 | babel-runtime "^6.22.0" 540 | core-js "^2.4.0" 541 | home-or-tmp "^2.0.0" 542 | lodash "^4.2.0" 543 | mkdirp "^0.5.1" 544 | source-map-support "^0.4.2" 545 | 546 | babel-runtime@^6.18.0, babel-runtime@^6.22.0: 547 | version "6.23.0" 548 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" 549 | dependencies: 550 | core-js "^2.4.0" 551 | regenerator-runtime "^0.10.0" 552 | 553 | babel-template@^6.24.1: 554 | version "6.24.1" 555 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.24.1.tgz#04ae514f1f93b3a2537f2a0f60a5a45fb8308333" 556 | dependencies: 557 | babel-runtime "^6.22.0" 558 | babel-traverse "^6.24.1" 559 | babel-types "^6.24.1" 560 | babylon "^6.11.0" 561 | lodash "^4.2.0" 562 | 563 | babel-traverse@^6.24.1: 564 | version "6.24.1" 565 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.24.1.tgz#ab36673fd356f9a0948659e7b338d5feadb31695" 566 | dependencies: 567 | babel-code-frame "^6.22.0" 568 | babel-messages "^6.23.0" 569 | babel-runtime "^6.22.0" 570 | babel-types "^6.24.1" 571 | babylon "^6.15.0" 572 | debug "^2.2.0" 573 | globals "^9.0.0" 574 | invariant "^2.2.0" 575 | lodash "^4.2.0" 576 | 577 | babel-types@^6.19.0, babel-types@^6.24.1: 578 | version "6.24.1" 579 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975" 580 | dependencies: 581 | babel-runtime "^6.22.0" 582 | esutils "^2.0.2" 583 | lodash "^4.2.0" 584 | to-fast-properties "^1.0.1" 585 | 586 | babylon@^6.11.0, babylon@^6.15.0: 587 | version "6.17.0" 588 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.0.tgz#37da948878488b9c4e3c4038893fa3314b3fc932" 589 | 590 | balanced-match@^0.4.1: 591 | version "0.4.2" 592 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 593 | 594 | bcrypt-pbkdf@^1.0.0: 595 | version "1.0.1" 596 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 597 | dependencies: 598 | tweetnacl "^0.14.3" 599 | 600 | binary-extensions@^1.0.0: 601 | version "1.8.0" 602 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" 603 | 604 | block-stream@*: 605 | version "0.0.9" 606 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 607 | dependencies: 608 | inherits "~2.0.0" 609 | 610 | boom@2.x.x: 611 | version "2.10.1" 612 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 613 | dependencies: 614 | hoek "2.x.x" 615 | 616 | brace-expansion@^1.0.0: 617 | version "1.1.7" 618 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 619 | dependencies: 620 | balanced-match "^0.4.1" 621 | concat-map "0.0.1" 622 | 623 | braces@^1.8.2: 624 | version "1.8.5" 625 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 626 | dependencies: 627 | expand-range "^1.8.1" 628 | preserve "^0.2.0" 629 | repeat-element "^1.1.2" 630 | 631 | buffer-shims@~1.0.0: 632 | version "1.0.0" 633 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 634 | 635 | caseless@~0.12.0: 636 | version "0.12.0" 637 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 638 | 639 | chalk@^1.1.0: 640 | version "1.1.3" 641 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 642 | dependencies: 643 | ansi-styles "^2.2.1" 644 | escape-string-regexp "^1.0.2" 645 | has-ansi "^2.0.0" 646 | strip-ansi "^3.0.0" 647 | supports-color "^2.0.0" 648 | 649 | chokidar@^1.6.1: 650 | version "1.6.1" 651 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" 652 | dependencies: 653 | anymatch "^1.3.0" 654 | async-each "^1.0.0" 655 | glob-parent "^2.0.0" 656 | inherits "^2.0.1" 657 | is-binary-path "^1.0.0" 658 | is-glob "^2.0.0" 659 | path-is-absolute "^1.0.0" 660 | readdirp "^2.0.0" 661 | optionalDependencies: 662 | fsevents "^1.0.0" 663 | 664 | co@^4.6.0: 665 | version "4.6.0" 666 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 667 | 668 | code-point-at@^1.0.0: 669 | version "1.1.0" 670 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 671 | 672 | combined-stream@^1.0.5, combined-stream@~1.0.5: 673 | version "1.0.5" 674 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 675 | dependencies: 676 | delayed-stream "~1.0.0" 677 | 678 | commander@^2.11.0: 679 | version "2.11.0" 680 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" 681 | 682 | commander@^2.8.1: 683 | version "2.9.0" 684 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 685 | dependencies: 686 | graceful-readlink ">= 1.0.0" 687 | 688 | concat-map@0.0.1: 689 | version "0.0.1" 690 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 691 | 692 | connect-history-api-fallback@^1.3.0: 693 | version "1.3.0" 694 | resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.3.0.tgz#e51d17f8f0ef0db90a64fdb47de3051556e9f169" 695 | 696 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 697 | version "1.1.0" 698 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 699 | 700 | content-disposition@0.5.2: 701 | version "0.5.2" 702 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 703 | 704 | content-type-parser@^1.0.1: 705 | version "1.0.1" 706 | resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.1.tgz#c3e56988c53c65127fb46d4032a3a900246fdc94" 707 | 708 | content-type@~1.0.2: 709 | version "1.0.2" 710 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 711 | 712 | convert-source-map@^1.1.0: 713 | version "1.5.0" 714 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" 715 | 716 | cookie-signature@1.0.6: 717 | version "1.0.6" 718 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 719 | 720 | cookie@0.3.1: 721 | version "0.3.1" 722 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 723 | 724 | core-js@^1.0.0: 725 | version "1.2.7" 726 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" 727 | 728 | core-js@^2.4.0: 729 | version "2.4.1" 730 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" 731 | 732 | core-util-is@~1.0.0: 733 | version "1.0.2" 734 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 735 | 736 | cryptiles@2.x.x: 737 | version "2.0.5" 738 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 739 | dependencies: 740 | boom "2.x.x" 741 | 742 | cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": 743 | version "0.3.2" 744 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" 745 | 746 | "cssstyle@>= 0.2.37 < 0.3.0": 747 | version "0.2.37" 748 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" 749 | dependencies: 750 | cssom "0.3.x" 751 | 752 | dashdash@^1.12.0: 753 | version "1.14.1" 754 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 755 | dependencies: 756 | assert-plus "^1.0.0" 757 | 758 | debug@2.6.1, debug@^2.1.1: 759 | version "2.6.1" 760 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" 761 | dependencies: 762 | ms "0.7.2" 763 | 764 | debug@2.6.4, debug@^2.2.0: 765 | version "2.6.4" 766 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0" 767 | dependencies: 768 | ms "0.7.3" 769 | 770 | deep-extend@~0.4.0: 771 | version "0.4.1" 772 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 773 | 774 | deep-is@~0.1.3: 775 | version "0.1.3" 776 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 777 | 778 | delayed-stream@~1.0.0: 779 | version "1.0.0" 780 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 781 | 782 | delegates@^1.0.0: 783 | version "1.0.0" 784 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 785 | 786 | depd@1.1.0, depd@~1.1.0: 787 | version "1.1.0" 788 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 789 | 790 | destroy@~1.0.4: 791 | version "1.0.4" 792 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 793 | 794 | detect-indent@^4.0.0: 795 | version "4.0.0" 796 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 797 | dependencies: 798 | repeating "^2.0.0" 799 | 800 | ecc-jsbn@~0.1.1: 801 | version "0.1.1" 802 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 803 | dependencies: 804 | jsbn "~0.1.0" 805 | 806 | ee-first@1.1.1: 807 | version "1.1.1" 808 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 809 | 810 | encodeurl@~1.0.1: 811 | version "1.0.1" 812 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 813 | 814 | encoding@^0.1.11: 815 | version "0.1.12" 816 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 817 | dependencies: 818 | iconv-lite "~0.4.13" 819 | 820 | escape-html@~1.0.3: 821 | version "1.0.3" 822 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 823 | 824 | escape-string-regexp@^1.0.2: 825 | version "1.0.5" 826 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 827 | 828 | escodegen@^1.6.1: 829 | version "1.8.1" 830 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" 831 | dependencies: 832 | esprima "^2.7.1" 833 | estraverse "^1.9.1" 834 | esutils "^2.0.2" 835 | optionator "^0.8.1" 836 | optionalDependencies: 837 | source-map "~0.2.0" 838 | 839 | esprima@^2.7.1: 840 | version "2.7.3" 841 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 842 | 843 | estraverse@^1.9.1: 844 | version "1.9.3" 845 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" 846 | 847 | esutils@^2.0.2: 848 | version "2.0.2" 849 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 850 | 851 | etag@~1.8.0: 852 | version "1.8.0" 853 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" 854 | 855 | eventemitter3@1.x.x: 856 | version "1.2.0" 857 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" 858 | 859 | expand-brackets@^0.1.4: 860 | version "0.1.5" 861 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 862 | dependencies: 863 | is-posix-bracket "^0.1.0" 864 | 865 | expand-range@^1.8.1: 866 | version "1.8.2" 867 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 868 | dependencies: 869 | fill-range "^2.1.0" 870 | 871 | express@^4.15.2: 872 | version "4.15.2" 873 | resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35" 874 | dependencies: 875 | accepts "~1.3.3" 876 | array-flatten "1.1.1" 877 | content-disposition "0.5.2" 878 | content-type "~1.0.2" 879 | cookie "0.3.1" 880 | cookie-signature "1.0.6" 881 | debug "2.6.1" 882 | depd "~1.1.0" 883 | encodeurl "~1.0.1" 884 | escape-html "~1.0.3" 885 | etag "~1.8.0" 886 | finalhandler "~1.0.0" 887 | fresh "0.5.0" 888 | merge-descriptors "1.0.1" 889 | methods "~1.1.2" 890 | on-finished "~2.3.0" 891 | parseurl "~1.3.1" 892 | path-to-regexp "0.1.7" 893 | proxy-addr "~1.1.3" 894 | qs "6.4.0" 895 | range-parser "~1.2.0" 896 | send "0.15.1" 897 | serve-static "1.12.1" 898 | setprototypeof "1.0.3" 899 | statuses "~1.3.1" 900 | type-is "~1.6.14" 901 | utils-merge "1.0.0" 902 | vary "~1.1.0" 903 | 904 | extend@~3.0.0: 905 | version "3.0.0" 906 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 907 | 908 | extglob@^0.3.1: 909 | version "0.3.2" 910 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 911 | dependencies: 912 | is-extglob "^1.0.0" 913 | 914 | extsprintf@1.0.2: 915 | version "1.0.2" 916 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 917 | 918 | fast-levenshtein@~2.0.4: 919 | version "2.0.6" 920 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 921 | 922 | fbjs@^0.8.9: 923 | version "0.8.12" 924 | resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.12.tgz#10b5d92f76d45575fd63a217d4ea02bea2f8ed04" 925 | dependencies: 926 | core-js "^1.0.0" 927 | isomorphic-fetch "^2.1.1" 928 | loose-envify "^1.0.0" 929 | object-assign "^4.1.0" 930 | promise "^7.1.1" 931 | setimmediate "^1.0.5" 932 | ua-parser-js "^0.7.9" 933 | 934 | filename-regex@^2.0.0: 935 | version "2.0.0" 936 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" 937 | 938 | fill-range@^2.1.0: 939 | version "2.2.3" 940 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 941 | dependencies: 942 | is-number "^2.1.0" 943 | isobject "^2.0.0" 944 | randomatic "^1.1.3" 945 | repeat-element "^1.1.2" 946 | repeat-string "^1.5.2" 947 | 948 | finalhandler@~1.0.0: 949 | version "1.0.2" 950 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.2.tgz#d0e36f9dbc557f2de14423df6261889e9d60c93a" 951 | dependencies: 952 | debug "2.6.4" 953 | encodeurl "~1.0.1" 954 | escape-html "~1.0.3" 955 | on-finished "~2.3.0" 956 | parseurl "~1.3.1" 957 | statuses "~1.3.1" 958 | unpipe "~1.0.0" 959 | 960 | for-in@^1.0.1: 961 | version "1.0.2" 962 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 963 | 964 | for-own@^0.1.4: 965 | version "0.1.5" 966 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 967 | dependencies: 968 | for-in "^1.0.1" 969 | 970 | forever-agent@~0.6.1: 971 | version "0.6.1" 972 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 973 | 974 | form-data@~2.1.1: 975 | version "2.1.4" 976 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 977 | dependencies: 978 | asynckit "^0.4.0" 979 | combined-stream "^1.0.5" 980 | mime-types "^2.1.12" 981 | 982 | forwarded@~0.1.0: 983 | version "0.1.0" 984 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" 985 | 986 | fresh@0.5.0: 987 | version "0.5.0" 988 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" 989 | 990 | fs-readdir-recursive@^1.0.0: 991 | version "1.0.0" 992 | resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" 993 | 994 | fs.realpath@^1.0.0: 995 | version "1.0.0" 996 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 997 | 998 | fsevents@^1.0.0: 999 | version "1.1.1" 1000 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" 1001 | dependencies: 1002 | nan "^2.3.0" 1003 | node-pre-gyp "^0.6.29" 1004 | 1005 | fstream-ignore@^1.0.5: 1006 | version "1.0.5" 1007 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 1008 | dependencies: 1009 | fstream "^1.0.0" 1010 | inherits "2" 1011 | minimatch "^3.0.0" 1012 | 1013 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 1014 | version "1.0.11" 1015 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 1016 | dependencies: 1017 | graceful-fs "^4.1.2" 1018 | inherits "~2.0.0" 1019 | mkdirp ">=0.5 0" 1020 | rimraf "2" 1021 | 1022 | gauge@~2.7.1: 1023 | version "2.7.4" 1024 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 1025 | dependencies: 1026 | aproba "^1.0.3" 1027 | console-control-strings "^1.0.0" 1028 | has-unicode "^2.0.0" 1029 | object-assign "^4.1.0" 1030 | signal-exit "^3.0.0" 1031 | string-width "^1.0.1" 1032 | strip-ansi "^3.0.1" 1033 | wide-align "^1.1.0" 1034 | 1035 | getpass@^0.1.1: 1036 | version "0.1.7" 1037 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1038 | dependencies: 1039 | assert-plus "^1.0.0" 1040 | 1041 | glob-base@^0.3.0: 1042 | version "0.3.0" 1043 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1044 | dependencies: 1045 | glob-parent "^2.0.0" 1046 | is-glob "^2.0.0" 1047 | 1048 | glob-parent@^2.0.0: 1049 | version "2.0.0" 1050 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1051 | dependencies: 1052 | is-glob "^2.0.0" 1053 | 1054 | glob-to-regexp@^0.3.0: 1055 | version "0.3.0" 1056 | resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" 1057 | 1058 | glob@^7.0.0, glob@^7.0.5: 1059 | version "7.1.1" 1060 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 1061 | dependencies: 1062 | fs.realpath "^1.0.0" 1063 | inflight "^1.0.4" 1064 | inherits "2" 1065 | minimatch "^3.0.2" 1066 | once "^1.3.0" 1067 | path-is-absolute "^1.0.0" 1068 | 1069 | globals@^9.0.0: 1070 | version "9.17.0" 1071 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.17.0.tgz#0c0ca696d9b9bb694d2e5470bd37777caad50286" 1072 | 1073 | graceful-fs@^4.1.2, graceful-fs@^4.1.4: 1074 | version "4.1.11" 1075 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1076 | 1077 | "graceful-readlink@>= 1.0.0": 1078 | version "1.0.1" 1079 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 1080 | 1081 | har-schema@^1.0.5: 1082 | version "1.0.5" 1083 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 1084 | 1085 | har-validator@~4.2.1: 1086 | version "4.2.1" 1087 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 1088 | dependencies: 1089 | ajv "^4.9.1" 1090 | har-schema "^1.0.5" 1091 | 1092 | has-ansi@^2.0.0: 1093 | version "2.0.0" 1094 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1095 | dependencies: 1096 | ansi-regex "^2.0.0" 1097 | 1098 | has-unicode@^2.0.0: 1099 | version "2.0.1" 1100 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 1101 | 1102 | hawk@~3.1.3: 1103 | version "3.1.3" 1104 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 1105 | dependencies: 1106 | boom "2.x.x" 1107 | cryptiles "2.x.x" 1108 | hoek "2.x.x" 1109 | sntp "1.x.x" 1110 | 1111 | hoek@2.x.x: 1112 | version "2.16.3" 1113 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 1114 | 1115 | home-or-tmp@^2.0.0: 1116 | version "2.0.0" 1117 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1118 | dependencies: 1119 | os-homedir "^1.0.0" 1120 | os-tmpdir "^1.0.1" 1121 | 1122 | html-encoding-sniffer@^1.0.1: 1123 | version "1.0.1" 1124 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz#79bf7a785ea495fe66165e734153f363ff5437da" 1125 | dependencies: 1126 | whatwg-encoding "^1.0.1" 1127 | 1128 | http-errors@~1.6.1: 1129 | version "1.6.1" 1130 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" 1131 | dependencies: 1132 | depd "1.1.0" 1133 | inherits "2.0.3" 1134 | setprototypeof "1.0.3" 1135 | statuses ">= 1.3.1 < 2" 1136 | 1137 | http-proxy-middleware@^0.17.4: 1138 | version "0.17.4" 1139 | resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" 1140 | dependencies: 1141 | http-proxy "^1.16.2" 1142 | is-glob "^3.1.0" 1143 | lodash "^4.17.2" 1144 | micromatch "^2.3.11" 1145 | 1146 | http-proxy@^1.16.2: 1147 | version "1.16.2" 1148 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" 1149 | dependencies: 1150 | eventemitter3 "1.x.x" 1151 | requires-port "1.x.x" 1152 | 1153 | http-signature@~1.1.0: 1154 | version "1.1.1" 1155 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 1156 | dependencies: 1157 | assert-plus "^0.2.0" 1158 | jsprim "^1.2.2" 1159 | sshpk "^1.7.0" 1160 | 1161 | iconv-lite@0.4.13, iconv-lite@~0.4.13: 1162 | version "0.4.13" 1163 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" 1164 | 1165 | inflight@^1.0.4: 1166 | version "1.0.6" 1167 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1168 | dependencies: 1169 | once "^1.3.0" 1170 | wrappy "1" 1171 | 1172 | inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 1173 | version "2.0.3" 1174 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1175 | 1176 | ini@~1.3.0: 1177 | version "1.3.4" 1178 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 1179 | 1180 | invariant@^2.2.0: 1181 | version "2.2.2" 1182 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1183 | dependencies: 1184 | loose-envify "^1.0.0" 1185 | 1186 | ipaddr.js@1.3.0: 1187 | version "1.3.0" 1188 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" 1189 | 1190 | is-binary-path@^1.0.0: 1191 | version "1.0.1" 1192 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 1193 | dependencies: 1194 | binary-extensions "^1.0.0" 1195 | 1196 | is-buffer@^1.1.5: 1197 | version "1.1.5" 1198 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 1199 | 1200 | is-dotfile@^1.0.0: 1201 | version "1.0.2" 1202 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d" 1203 | 1204 | is-equal-shallow@^0.1.3: 1205 | version "0.1.3" 1206 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1207 | dependencies: 1208 | is-primitive "^2.0.0" 1209 | 1210 | is-extendable@^0.1.1: 1211 | version "0.1.1" 1212 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1213 | 1214 | is-extglob@^1.0.0: 1215 | version "1.0.0" 1216 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1217 | 1218 | is-extglob@^2.1.0: 1219 | version "2.1.1" 1220 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1221 | 1222 | is-finite@^1.0.0: 1223 | version "1.0.2" 1224 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1225 | dependencies: 1226 | number-is-nan "^1.0.0" 1227 | 1228 | is-fullwidth-code-point@^1.0.0: 1229 | version "1.0.0" 1230 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1231 | dependencies: 1232 | number-is-nan "^1.0.0" 1233 | 1234 | is-glob@^2.0.0, is-glob@^2.0.1: 1235 | version "2.0.1" 1236 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1237 | dependencies: 1238 | is-extglob "^1.0.0" 1239 | 1240 | is-glob@^3.1.0: 1241 | version "3.1.0" 1242 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" 1243 | dependencies: 1244 | is-extglob "^2.1.0" 1245 | 1246 | is-number@^2.0.2, is-number@^2.1.0: 1247 | version "2.1.0" 1248 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1249 | dependencies: 1250 | kind-of "^3.0.2" 1251 | 1252 | is-posix-bracket@^0.1.0: 1253 | version "0.1.1" 1254 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1255 | 1256 | is-primitive@^2.0.0: 1257 | version "2.0.0" 1258 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1259 | 1260 | is-stream@^1.0.1: 1261 | version "1.1.0" 1262 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1263 | 1264 | is-typedarray@~1.0.0: 1265 | version "1.0.0" 1266 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1267 | 1268 | isarray@1.0.0, isarray@~1.0.0: 1269 | version "1.0.0" 1270 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1271 | 1272 | isobject@^2.0.0: 1273 | version "2.1.0" 1274 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1275 | dependencies: 1276 | isarray "1.0.0" 1277 | 1278 | isomorphic-fetch@^2.1.1: 1279 | version "2.2.1" 1280 | resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" 1281 | dependencies: 1282 | node-fetch "^1.0.1" 1283 | whatwg-fetch ">=0.10.0" 1284 | 1285 | isstream@~0.1.2: 1286 | version "0.1.2" 1287 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1288 | 1289 | jodid25519@^1.0.0: 1290 | version "1.0.2" 1291 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 1292 | dependencies: 1293 | jsbn "~0.1.0" 1294 | 1295 | js-tokens@^3.0.0: 1296 | version "3.0.1" 1297 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1298 | 1299 | jsbn@~0.1.0: 1300 | version "0.1.1" 1301 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1302 | 1303 | jsdom@^9.4.5: 1304 | version "9.12.0" 1305 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" 1306 | dependencies: 1307 | abab "^1.0.3" 1308 | acorn "^4.0.4" 1309 | acorn-globals "^3.1.0" 1310 | array-equal "^1.0.0" 1311 | content-type-parser "^1.0.1" 1312 | cssom ">= 0.3.2 < 0.4.0" 1313 | cssstyle ">= 0.2.37 < 0.3.0" 1314 | escodegen "^1.6.1" 1315 | html-encoding-sniffer "^1.0.1" 1316 | nwmatcher ">= 1.3.9 < 2.0.0" 1317 | parse5 "^1.5.1" 1318 | request "^2.79.0" 1319 | sax "^1.2.1" 1320 | symbol-tree "^3.2.1" 1321 | tough-cookie "^2.3.2" 1322 | webidl-conversions "^4.0.0" 1323 | whatwg-encoding "^1.0.1" 1324 | whatwg-url "^4.3.0" 1325 | xml-name-validator "^2.0.1" 1326 | 1327 | jsesc@^1.3.0: 1328 | version "1.3.0" 1329 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1330 | 1331 | jsesc@~0.5.0: 1332 | version "0.5.0" 1333 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" 1334 | 1335 | json-schema@0.2.3: 1336 | version "0.2.3" 1337 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1338 | 1339 | json-stable-stringify@^1.0.1: 1340 | version "1.0.1" 1341 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1342 | dependencies: 1343 | jsonify "~0.0.0" 1344 | 1345 | json-stringify-safe@~5.0.1: 1346 | version "5.0.1" 1347 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1348 | 1349 | json5@^0.5.0: 1350 | version "0.5.1" 1351 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1352 | 1353 | jsonify@~0.0.0: 1354 | version "0.0.0" 1355 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1356 | 1357 | jsprim@^1.2.2: 1358 | version "1.4.0" 1359 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 1360 | dependencies: 1361 | assert-plus "1.0.0" 1362 | extsprintf "1.0.2" 1363 | json-schema "0.2.3" 1364 | verror "1.3.6" 1365 | 1366 | kind-of@^3.0.2: 1367 | version "3.2.0" 1368 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07" 1369 | dependencies: 1370 | is-buffer "^1.1.5" 1371 | 1372 | levn@~0.3.0: 1373 | version "0.3.0" 1374 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1375 | dependencies: 1376 | prelude-ls "~1.1.2" 1377 | type-check "~0.3.2" 1378 | 1379 | lodash@^4.17.2, lodash@^4.2.0: 1380 | version "4.17.4" 1381 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1382 | 1383 | loose-envify@^1.0.0, loose-envify@^1.1.0: 1384 | version "1.3.1" 1385 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1386 | dependencies: 1387 | js-tokens "^3.0.0" 1388 | 1389 | media-typer@0.3.0: 1390 | version "0.3.0" 1391 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1392 | 1393 | merge-descriptors@1.0.1: 1394 | version "1.0.1" 1395 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1396 | 1397 | methods@~1.1.2: 1398 | version "1.1.2" 1399 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1400 | 1401 | micromatch@^2.1.5, micromatch@^2.3.11: 1402 | version "2.3.11" 1403 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1404 | dependencies: 1405 | arr-diff "^2.0.0" 1406 | array-unique "^0.2.1" 1407 | braces "^1.8.2" 1408 | expand-brackets "^0.1.4" 1409 | extglob "^0.3.1" 1410 | filename-regex "^2.0.0" 1411 | is-extglob "^1.0.0" 1412 | is-glob "^2.0.1" 1413 | kind-of "^3.0.2" 1414 | normalize-path "^2.0.1" 1415 | object.omit "^2.0.0" 1416 | parse-glob "^3.0.4" 1417 | regex-cache "^0.4.2" 1418 | 1419 | mime-db@~1.27.0: 1420 | version "1.27.0" 1421 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 1422 | 1423 | mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: 1424 | version "2.1.15" 1425 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 1426 | dependencies: 1427 | mime-db "~1.27.0" 1428 | 1429 | mime@1.3.4: 1430 | version "1.3.4" 1431 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 1432 | 1433 | minimatch@^3.0.0, minimatch@^3.0.2: 1434 | version "3.0.3" 1435 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1436 | dependencies: 1437 | brace-expansion "^1.0.0" 1438 | 1439 | minimist@0.0.8: 1440 | version "0.0.8" 1441 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1442 | 1443 | minimist@^1.2.0: 1444 | version "1.2.0" 1445 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1446 | 1447 | "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1448 | version "0.5.1" 1449 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1450 | dependencies: 1451 | minimist "0.0.8" 1452 | 1453 | ms@0.7.2: 1454 | version "0.7.2" 1455 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 1456 | 1457 | ms@0.7.3: 1458 | version "0.7.3" 1459 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff" 1460 | 1461 | nan@^2.3.0: 1462 | version "2.6.2" 1463 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" 1464 | 1465 | negotiator@0.6.1: 1466 | version "0.6.1" 1467 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1468 | 1469 | node-fetch@^1.0.1: 1470 | version "1.6.3" 1471 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.6.3.tgz#dc234edd6489982d58e8f0db4f695029abcd8c04" 1472 | dependencies: 1473 | encoding "^0.1.11" 1474 | is-stream "^1.0.1" 1475 | 1476 | node-pre-gyp@^0.6.29: 1477 | version "0.6.34" 1478 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" 1479 | dependencies: 1480 | mkdirp "^0.5.1" 1481 | nopt "^4.0.1" 1482 | npmlog "^4.0.2" 1483 | rc "^1.1.7" 1484 | request "^2.81.0" 1485 | rimraf "^2.6.1" 1486 | semver "^5.3.0" 1487 | tar "^2.2.1" 1488 | tar-pack "^3.4.0" 1489 | 1490 | nopt@^4.0.1: 1491 | version "4.0.1" 1492 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1493 | dependencies: 1494 | abbrev "1" 1495 | osenv "^0.1.4" 1496 | 1497 | normalize-path@^2.0.1: 1498 | version "2.1.1" 1499 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1500 | dependencies: 1501 | remove-trailing-separator "^1.0.1" 1502 | 1503 | npmlog@^4.0.2: 1504 | version "4.0.2" 1505 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" 1506 | dependencies: 1507 | are-we-there-yet "~1.1.2" 1508 | console-control-strings "~1.1.0" 1509 | gauge "~2.7.1" 1510 | set-blocking "~2.0.0" 1511 | 1512 | number-is-nan@^1.0.0: 1513 | version "1.0.1" 1514 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1515 | 1516 | "nwmatcher@>= 1.3.9 < 2.0.0": 1517 | version "1.3.9" 1518 | resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" 1519 | 1520 | oauth-sign@~0.8.1: 1521 | version "0.8.2" 1522 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1523 | 1524 | object-assign@^4.1.0: 1525 | version "4.1.1" 1526 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1527 | 1528 | object.omit@^2.0.0: 1529 | version "2.0.1" 1530 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1531 | dependencies: 1532 | for-own "^0.1.4" 1533 | is-extendable "^0.1.1" 1534 | 1535 | on-finished@~2.3.0: 1536 | version "2.3.0" 1537 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1538 | dependencies: 1539 | ee-first "1.1.1" 1540 | 1541 | once@^1.3.0, once@^1.3.3: 1542 | version "1.4.0" 1543 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1544 | dependencies: 1545 | wrappy "1" 1546 | 1547 | optionator@^0.8.1: 1548 | version "0.8.2" 1549 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1550 | dependencies: 1551 | deep-is "~0.1.3" 1552 | fast-levenshtein "~2.0.4" 1553 | levn "~0.3.0" 1554 | prelude-ls "~1.1.2" 1555 | type-check "~0.3.2" 1556 | wordwrap "~1.0.0" 1557 | 1558 | os-homedir@^1.0.0: 1559 | version "1.0.2" 1560 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1561 | 1562 | os-tmpdir@^1.0.0, os-tmpdir@^1.0.1: 1563 | version "1.0.2" 1564 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1565 | 1566 | osenv@^0.1.4: 1567 | version "0.1.4" 1568 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1569 | dependencies: 1570 | os-homedir "^1.0.0" 1571 | os-tmpdir "^1.0.0" 1572 | 1573 | output-file-sync@^1.1.0: 1574 | version "1.1.2" 1575 | resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" 1576 | dependencies: 1577 | graceful-fs "^4.1.4" 1578 | mkdirp "^0.5.1" 1579 | object-assign "^4.1.0" 1580 | 1581 | parse-glob@^3.0.4: 1582 | version "3.0.4" 1583 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1584 | dependencies: 1585 | glob-base "^0.3.0" 1586 | is-dotfile "^1.0.0" 1587 | is-extglob "^1.0.0" 1588 | is-glob "^2.0.0" 1589 | 1590 | parse5@^1.5.1: 1591 | version "1.5.1" 1592 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" 1593 | 1594 | parseurl@~1.3.1: 1595 | version "1.3.1" 1596 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 1597 | 1598 | path-is-absolute@^1.0.0: 1599 | version "1.0.1" 1600 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1601 | 1602 | path-to-regexp@0.1.7: 1603 | version "0.1.7" 1604 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1605 | 1606 | performance-now@^0.2.0: 1607 | version "0.2.0" 1608 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1609 | 1610 | prelude-ls@~1.1.2: 1611 | version "1.1.2" 1612 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 1613 | 1614 | preserve@^0.2.0: 1615 | version "0.2.0" 1616 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1617 | 1618 | private@^0.1.6: 1619 | version "0.1.7" 1620 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" 1621 | 1622 | process-nextick-args@~1.0.6: 1623 | version "1.0.7" 1624 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1625 | 1626 | promise@^7.1.1: 1627 | version "7.1.1" 1628 | resolved "https://registry.yarnpkg.com/promise/-/promise-7.1.1.tgz#489654c692616b8aa55b0724fa809bb7db49c5bf" 1629 | dependencies: 1630 | asap "~2.0.3" 1631 | 1632 | prop-types@^15.5.7, prop-types@~15.5.7: 1633 | version "15.5.8" 1634 | resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.5.8.tgz#6b7b2e141083be38c8595aa51fc55775c7199394" 1635 | dependencies: 1636 | fbjs "^0.8.9" 1637 | 1638 | proxy-addr@~1.1.3: 1639 | version "1.1.4" 1640 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" 1641 | dependencies: 1642 | forwarded "~0.1.0" 1643 | ipaddr.js "1.3.0" 1644 | 1645 | punycode@^1.4.1: 1646 | version "1.4.1" 1647 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1648 | 1649 | qs@6.4.0, qs@~6.4.0: 1650 | version "6.4.0" 1651 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1652 | 1653 | randomatic@^1.1.3: 1654 | version "1.1.6" 1655 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" 1656 | dependencies: 1657 | is-number "^2.0.2" 1658 | kind-of "^3.0.2" 1659 | 1660 | range-parser@~1.2.0: 1661 | version "1.2.0" 1662 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 1663 | 1664 | rc@^1.1.7: 1665 | version "1.2.1" 1666 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" 1667 | dependencies: 1668 | deep-extend "~0.4.0" 1669 | ini "~1.3.0" 1670 | minimist "^1.2.0" 1671 | strip-json-comments "~2.0.1" 1672 | 1673 | react-dom@^15.3.0: 1674 | version "15.5.4" 1675 | resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-15.5.4.tgz#ba0c28786fd52ed7e4f2135fe0288d462aef93da" 1676 | dependencies: 1677 | fbjs "^0.8.9" 1678 | loose-envify "^1.1.0" 1679 | object-assign "^4.1.0" 1680 | prop-types "~15.5.7" 1681 | 1682 | react@^15.3.0: 1683 | version "15.5.4" 1684 | resolved "https://registry.yarnpkg.com/react/-/react-15.5.4.tgz#fa83eb01506ab237cdc1c8c3b1cea8de012bf047" 1685 | dependencies: 1686 | fbjs "^0.8.9" 1687 | loose-envify "^1.1.0" 1688 | object-assign "^4.1.0" 1689 | prop-types "^15.5.7" 1690 | 1691 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 1692 | version "2.2.9" 1693 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" 1694 | dependencies: 1695 | buffer-shims "~1.0.0" 1696 | core-util-is "~1.0.0" 1697 | inherits "~2.0.1" 1698 | isarray "~1.0.0" 1699 | process-nextick-args "~1.0.6" 1700 | string_decoder "~1.0.0" 1701 | util-deprecate "~1.0.1" 1702 | 1703 | readdirp@^2.0.0: 1704 | version "2.1.0" 1705 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1706 | dependencies: 1707 | graceful-fs "^4.1.2" 1708 | minimatch "^3.0.2" 1709 | readable-stream "^2.0.2" 1710 | set-immediate-shim "^1.0.1" 1711 | 1712 | regenerate@^1.2.1: 1713 | version "1.3.2" 1714 | resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" 1715 | 1716 | regenerator-runtime@^0.10.0: 1717 | version "0.10.4" 1718 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.4.tgz#74cb6598d3ba2eb18694e968a40e2b3b4df9cf93" 1719 | 1720 | regenerator-transform@0.9.11: 1721 | version "0.9.11" 1722 | resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.9.11.tgz#3a7d067520cb7b7176769eb5ff868691befe1283" 1723 | dependencies: 1724 | babel-runtime "^6.18.0" 1725 | babel-types "^6.19.0" 1726 | private "^0.1.6" 1727 | 1728 | regex-cache@^0.4.2: 1729 | version "0.4.3" 1730 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" 1731 | dependencies: 1732 | is-equal-shallow "^0.1.3" 1733 | is-primitive "^2.0.0" 1734 | 1735 | regexpu-core@^2.0.0: 1736 | version "2.0.0" 1737 | resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" 1738 | dependencies: 1739 | regenerate "^1.2.1" 1740 | regjsgen "^0.2.0" 1741 | regjsparser "^0.1.4" 1742 | 1743 | regjsgen@^0.2.0: 1744 | version "0.2.0" 1745 | resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" 1746 | 1747 | regjsparser@^0.1.4: 1748 | version "0.1.5" 1749 | resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" 1750 | dependencies: 1751 | jsesc "~0.5.0" 1752 | 1753 | remove-trailing-separator@^1.0.1: 1754 | version "1.0.1" 1755 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" 1756 | 1757 | repeat-element@^1.1.2: 1758 | version "1.1.2" 1759 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1760 | 1761 | repeat-string@^1.5.2: 1762 | version "1.6.1" 1763 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1764 | 1765 | repeating@^2.0.0: 1766 | version "2.0.1" 1767 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1768 | dependencies: 1769 | is-finite "^1.0.0" 1770 | 1771 | request@^2.79.0, request@^2.81.0: 1772 | version "2.81.0" 1773 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1774 | dependencies: 1775 | aws-sign2 "~0.6.0" 1776 | aws4 "^1.2.1" 1777 | caseless "~0.12.0" 1778 | combined-stream "~1.0.5" 1779 | extend "~3.0.0" 1780 | forever-agent "~0.6.1" 1781 | form-data "~2.1.1" 1782 | har-validator "~4.2.1" 1783 | hawk "~3.1.3" 1784 | http-signature "~1.1.0" 1785 | is-typedarray "~1.0.0" 1786 | isstream "~0.1.2" 1787 | json-stringify-safe "~5.0.1" 1788 | mime-types "~2.1.7" 1789 | oauth-sign "~0.8.1" 1790 | performance-now "^0.2.0" 1791 | qs "~6.4.0" 1792 | safe-buffer "^5.0.1" 1793 | stringstream "~0.0.4" 1794 | tough-cookie "~2.3.0" 1795 | tunnel-agent "^0.6.0" 1796 | uuid "^3.0.0" 1797 | 1798 | requires-port@1.x.x: 1799 | version "1.0.0" 1800 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1801 | 1802 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 1803 | version "2.6.1" 1804 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1805 | dependencies: 1806 | glob "^7.0.5" 1807 | 1808 | safe-buffer@^5.0.1: 1809 | version "5.0.1" 1810 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1811 | 1812 | safe-commander@^2.11.1: 1813 | version "2.11.1" 1814 | resolved "https://registry.yarnpkg.com/safe-commander/-/safe-commander-2.11.1.tgz#d23389bfd5d35c8f0a8bbcfd85ea71792b5380a3" 1815 | dependencies: 1816 | commander "^2.11.0" 1817 | 1818 | sax@^1.2.1: 1819 | version "1.2.2" 1820 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" 1821 | 1822 | semver@^5.3.0: 1823 | version "5.3.0" 1824 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1825 | 1826 | send@0.15.1: 1827 | version "0.15.1" 1828 | resolved "https://registry.yarnpkg.com/send/-/send-0.15.1.tgz#8a02354c26e6f5cca700065f5f0cdeba90ec7b5f" 1829 | dependencies: 1830 | debug "2.6.1" 1831 | depd "~1.1.0" 1832 | destroy "~1.0.4" 1833 | encodeurl "~1.0.1" 1834 | escape-html "~1.0.3" 1835 | etag "~1.8.0" 1836 | fresh "0.5.0" 1837 | http-errors "~1.6.1" 1838 | mime "1.3.4" 1839 | ms "0.7.2" 1840 | on-finished "~2.3.0" 1841 | range-parser "~1.2.0" 1842 | statuses "~1.3.1" 1843 | 1844 | serve-static@1.12.1: 1845 | version "1.12.1" 1846 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.1.tgz#7443a965e3ced647aceb5639fa06bf4d1bbe0039" 1847 | dependencies: 1848 | encodeurl "~1.0.1" 1849 | escape-html "~1.0.3" 1850 | parseurl "~1.3.1" 1851 | send "0.15.1" 1852 | 1853 | set-blocking@~2.0.0: 1854 | version "2.0.0" 1855 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1856 | 1857 | set-immediate-shim@^1.0.1: 1858 | version "1.0.1" 1859 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1860 | 1861 | setimmediate@^1.0.5: 1862 | version "1.0.5" 1863 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1864 | 1865 | setprototypeof@1.0.3: 1866 | version "1.0.3" 1867 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 1868 | 1869 | signal-exit@^3.0.0: 1870 | version "3.0.2" 1871 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1872 | 1873 | slash@^1.0.0: 1874 | version "1.0.0" 1875 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 1876 | 1877 | sntp@1.x.x: 1878 | version "1.0.9" 1879 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1880 | dependencies: 1881 | hoek "2.x.x" 1882 | 1883 | source-map-support@^0.4.2: 1884 | version "0.4.14" 1885 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.14.tgz#9d4463772598b86271b4f523f6c1f4e02a7d6aef" 1886 | dependencies: 1887 | source-map "^0.5.6" 1888 | 1889 | source-map@^0.5.0, source-map@^0.5.6: 1890 | version "0.5.6" 1891 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1892 | 1893 | source-map@~0.2.0: 1894 | version "0.2.0" 1895 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" 1896 | dependencies: 1897 | amdefine ">=0.0.4" 1898 | 1899 | sshpk@^1.7.0: 1900 | version "1.13.0" 1901 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" 1902 | dependencies: 1903 | asn1 "~0.2.3" 1904 | assert-plus "^1.0.0" 1905 | dashdash "^1.12.0" 1906 | getpass "^0.1.1" 1907 | optionalDependencies: 1908 | bcrypt-pbkdf "^1.0.0" 1909 | ecc-jsbn "~0.1.1" 1910 | jodid25519 "^1.0.0" 1911 | jsbn "~0.1.0" 1912 | tweetnacl "~0.14.0" 1913 | 1914 | "statuses@>= 1.3.1 < 2", statuses@~1.3.1: 1915 | version "1.3.1" 1916 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 1917 | 1918 | string-width@^1.0.1: 1919 | version "1.0.2" 1920 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1921 | dependencies: 1922 | code-point-at "^1.0.0" 1923 | is-fullwidth-code-point "^1.0.0" 1924 | strip-ansi "^3.0.0" 1925 | 1926 | string_decoder@~1.0.0: 1927 | version "1.0.0" 1928 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667" 1929 | dependencies: 1930 | buffer-shims "~1.0.0" 1931 | 1932 | stringstream@~0.0.4: 1933 | version "0.0.5" 1934 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1935 | 1936 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1937 | version "3.0.1" 1938 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1939 | dependencies: 1940 | ansi-regex "^2.0.0" 1941 | 1942 | strip-json-comments@~2.0.1: 1943 | version "2.0.1" 1944 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1945 | 1946 | supports-color@^2.0.0: 1947 | version "2.0.0" 1948 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1949 | 1950 | symbol-tree@^3.2.1: 1951 | version "3.2.2" 1952 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 1953 | 1954 | tar-pack@^3.4.0: 1955 | version "3.4.0" 1956 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" 1957 | dependencies: 1958 | debug "^2.2.0" 1959 | fstream "^1.0.10" 1960 | fstream-ignore "^1.0.5" 1961 | once "^1.3.3" 1962 | readable-stream "^2.1.4" 1963 | rimraf "^2.5.1" 1964 | tar "^2.2.1" 1965 | uid-number "^0.0.6" 1966 | 1967 | tar@^2.2.1: 1968 | version "2.2.1" 1969 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1970 | dependencies: 1971 | block-stream "*" 1972 | fstream "^1.0.2" 1973 | inherits "2" 1974 | 1975 | to-fast-properties@^1.0.1: 1976 | version "1.0.2" 1977 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" 1978 | 1979 | tough-cookie@^2.3.2, tough-cookie@~2.3.0: 1980 | version "2.3.2" 1981 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1982 | dependencies: 1983 | punycode "^1.4.1" 1984 | 1985 | tr46@~0.0.3: 1986 | version "0.0.3" 1987 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1988 | 1989 | trim-right@^1.0.1: 1990 | version "1.0.1" 1991 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 1992 | 1993 | tunnel-agent@^0.6.0: 1994 | version "0.6.0" 1995 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1996 | dependencies: 1997 | safe-buffer "^5.0.1" 1998 | 1999 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2000 | version "0.14.5" 2001 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2002 | 2003 | type-check@~0.3.2: 2004 | version "0.3.2" 2005 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2006 | dependencies: 2007 | prelude-ls "~1.1.2" 2008 | 2009 | type-is@~1.6.14: 2010 | version "1.6.15" 2011 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 2012 | dependencies: 2013 | media-typer "0.3.0" 2014 | mime-types "~2.1.15" 2015 | 2016 | ua-parser-js@^0.7.9: 2017 | version "0.7.12" 2018 | resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb" 2019 | 2020 | uid-number@^0.0.6: 2021 | version "0.0.6" 2022 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2023 | 2024 | unpipe@~1.0.0: 2025 | version "1.0.0" 2026 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2027 | 2028 | user-home@^1.1.1: 2029 | version "1.1.1" 2030 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2031 | 2032 | util-deprecate@~1.0.1: 2033 | version "1.0.2" 2034 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2035 | 2036 | utils-merge@1.0.0: 2037 | version "1.0.0" 2038 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 2039 | 2040 | uuid@^3.0.0: 2041 | version "3.0.1" 2042 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 2043 | 2044 | v8flags@^2.0.10: 2045 | version "2.1.1" 2046 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 2047 | dependencies: 2048 | user-home "^1.1.1" 2049 | 2050 | vary@~1.1.0: 2051 | version "1.1.1" 2052 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" 2053 | 2054 | verror@1.3.6: 2055 | version "1.3.6" 2056 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 2057 | dependencies: 2058 | extsprintf "1.0.2" 2059 | 2060 | webidl-conversions@^3.0.0: 2061 | version "3.0.1" 2062 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2063 | 2064 | webidl-conversions@^4.0.0: 2065 | version "4.0.1" 2066 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.1.tgz#8015a17ab83e7e1b311638486ace81da6ce206a0" 2067 | 2068 | whatwg-encoding@^1.0.1: 2069 | version "1.0.1" 2070 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" 2071 | dependencies: 2072 | iconv-lite "0.4.13" 2073 | 2074 | whatwg-fetch@>=0.10.0: 2075 | version "2.0.3" 2076 | resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" 2077 | 2078 | whatwg-url@^4.3.0: 2079 | version "4.7.1" 2080 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.7.1.tgz#df4dc2e3f25a63b1fa5b32ed6d6c139577d690de" 2081 | dependencies: 2082 | tr46 "~0.0.3" 2083 | webidl-conversions "^3.0.0" 2084 | 2085 | wide-align@^1.1.0: 2086 | version "1.1.0" 2087 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 2088 | dependencies: 2089 | string-width "^1.0.1" 2090 | 2091 | wordwrap@~1.0.0: 2092 | version "1.0.0" 2093 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2094 | 2095 | wrappy@1: 2096 | version "1.0.2" 2097 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2098 | 2099 | xml-name-validator@^2.0.1: 2100 | version "2.0.1" 2101 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" 2102 | --------------------------------------------------------------------------------