Quellcode durchsuchen

Merge pull request #273 from transloadit/dogumentation

[WIP] Dogumentation
Artur Paikin vor 7 Jahren
Ursprung
Commit
45a8cc8a00

+ 29 - 76
README.md

@@ -6,118 +6,72 @@
 <a href="https://www.npmjs.com/package/uppy"><img src="https://img.shields.io/npm/v/uppy.svg?style=flat-square"></a>
 <a href="https://travis-ci.org/transloadit/uppy"><img src="https://img.shields.io/travis/transloadit/uppy/master.svg?style=flat-square" alt="Build Status"></a>
 
-Uppy is (going to be) a sleek, modular file uploader that integrates seemlessly with any framework. It fetches files from local disk, Google Drive, Dropbox, Instagram, remote URLs, cameras and other exciting locations, and then uploads them to the final destination. It’s fast, easy to use and let's you worry about more important problems than building a file uploader.
+Uppy is a sleek, modular file uploader that integrates seemlessly with any framework. It fetches files from local disk, Google Drive, Dropbox, Instagram, remote URLs, cameras and other exciting locations, and then uploads them to the final destination. It’s fast, easy to use and let's you worry about more important problems than building a file uploader. [Try it live](http://uppy.io/examples/dashboard/).
 
 Uppy is developed by the [Transloadit](https://transloadit.com) team.
 
-Check out [uppy.io](http://uppy.io/) for docs, API, examples and stats.
+Check out docs and examples on [uppy.io](http://uppy.io).
 
-## Features (some in development)
+<img width="700" alt="Uppy UI Demo: modal dialog with a few selected files and an upload button" src="https://github.com/transloadit/uppy/raw/master/uppy-screenshot.jpg">
+
+- [Full featured UI](http://uppy.io/examples/dashboard)
+- [Simple Drag & Drop](http://uppy.io/examples/dragdrop)
+
+## Features
 
 - Lightweight, modular plugin-based architecture, easy on dependencies :zap:
 - Use from a CDN or as a module to import
 - Resumable file uploads via the open [tus](http://tus.io/) standard
-- Supports picking files from sources like: Webcam, Dropbox, Facebook, bypassing the user's device where possible, syncing between servers directly via [uppy-server](https://github.com/transloadit/uppy-server)
-- A nice user interface :sparkles:
+- Supports picking files from: Webcam, Dropbox, Google Drive, Instagram, bypassing the user’s device where possible, syncing between servers directly via [uppy-server](https://github.com/transloadit/uppy-server)
+- A sleek user interface :sparkles:
 - Speaks multiple languages (i18n) :earth_africa:
 - Built with accessibility in mind
 - Free for the world, forever (as in beer 🍺, pizza 🍕, and liberty 🗽)
 - Works great with file encoding and processing backends, such as [Transloadit](http://transloadit.com), works great without (just roll your own Apache/Nginx/Node/etc backend)
 - Cute as a puppy, also accepts cat pictures :dog:
 
-## Demo
-
-<img width="700" alt="Uppy UI Demo: modal dialog with a few selected files and an upload button" src="https://github.com/transloadit/uppy/raw/master/uppy-screenshot.jpg">
+## Installation
 
-- [Full featured UI](http://uppy.io/examples/dashboard)
-- [Simple Drag & Drop](http://uppy.io/examples/dragdrop)
-
-## Usage
-
-### Installing from NPM
-
-```sh
-$ npm install uppy --save
+``` bash
+$ npm install uppy
 ```
 
-Bundle with Browserify or Webpack:
-
-```js
-import Uppy from 'uppy/lib/core'
-import DragDrop from 'uppy/lib/plugins/DragDrop'
-import Tus10 from 'uppy/lib/plugins/Tus10'
-
-const uppy = Uppy()
-uppy
-  .use(DragDrop, {target: 'body'})
-  .use(Tus10, {endpoint: '//master.tus.io/files/'})
-  .run()
-```
+We recommend installing from NPM and then using a module bundler such as [Webpack](http://webpack.github.io/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/). 
 
 Add CSS [uppy.min.css](https://unpkg.com/uppy/dist/uppy.min.css), either to `<head>` of your HTML page or include in JS, if your bundler of choice supports it — transforms and plugins are available for Browserify and Webpack.
 
-Give Uppy a spin [on RequireBin](http://requirebin.com/?gist=54e076cccc929cc567cb0aba38815105).
-
-### Installing from CDN
+If you like, you can also use a pre-built bundle, for example from [unpkg CDN](https://unpkg.com/uppy/). In that case `Uppy` will attach itself to the global `window.Uppy` object. 
 
-But if you like, you can also use a pre-built bundle, for example from [unpkg CDN](https://unpkg.com/uppy/). In that case `Uppy` will attach itself to the global `window` object.
+> ⚠️ The bundle currently consists of most Uppy plugins, so this method is not  recommended for production, as your users will have to download all plugins, even if you are using just a few.
 
-1\. Add a script to your the bottom of your HTML’s `<body>`:
+1\. Add a script to the bottom of `<body>`:
 
-```html
+``` html
 <script src="https://unpkg.com/uppy/dist/uppy.min.js"></script>
 ```
 
-2\. Add CSS to your HTML’s `<head>`:
-```html
+2\. Add CSS to `<head>`:
+``` html
 <link href="https://unpkg.com/uppy/dist/uppy.min.css" rel="stylesheet">
 ```
 
 3\. Initialize:
 
-```js
+``` html
 <script>
-  var uppy = new Uppy.Core({autoProceed: false, debug: true})
+  var uppy = Uppy.Core()
   uppy.use(Uppy.DragDrop, {target: '.UppyDragDrop'})
   uppy.use(Uppy.Tus10, {endpoint: '//master.tus.io/files/'})
   uppy.run()
 </script>
 ```
 
-## API
-
-:warning: :construction: API is unstable and is subject to breaking changes
-
-Uppy exposes events that you can subscribe to in your app:
-
-### Event `core:upload-progress` when file upload progress is available
-
-```js
-uppy.on('core:upload-progress', (data) => {
-  console.log(data.id, data.bytesUploaded, data.bytesTotal)
-})
-```
-
-### Event `core:upload-success` when one upload is complete
-
-```js
-uppy.on('core:upload-success', (fileId, response) => {
-  console.log(response.url)
-  var img = new Image()
-  img.width = 300
-  img.alt = fileId
-  img.src = response.url
-  document.body.appendChild(img)
-})
-```
-
-### Event `core:success` when all uploads are complete
+## Documentation
 
-```js
-uppy.on('core:success', (fileList) => {
-  console.log(fileList)
-})
-```
+- [Uppy](http://uppy.io/docs/uppy/) — full list of options, methods and events.
+- [Plugins](http://uppy.io/docs/plugins/) — list of Uppy plugins and their options.
+- [Server](http://uppy.io/docs/server/) — setting up and running an Uppy Server instance, which adds support for Instagram, Dropbox, Google Drive and other remote sources.
+- Architecture & Making a Plugin — how to write a plugin for Uppy [documentation in progress].
 
 ## Browser Support
 
@@ -141,14 +95,13 @@ Yes, whatever you want on the backend will work with `Multipart` plugin, since i
 
 No, as mentioned previously, `Multipart` plugin is old-school and just works with everything. However, you need [`uppy-server`](https://github.com/transloadit/uppy-server) if you’d like your users to be able to pick files from Google Drive or Dropbox (more services coming). And you can add [tus](http://tus.io) if you want resumability.
 
-### Does it support S3 direct upload?
+### Does Uppy support S3 uploads?
 
-Not at the moment, but you can write a plugin and send us a PR. That would be awesome :)
+Yes, since 0.18, there is an S3 plugin. Check out the docs for more information.
 
 ## Contributions are welcome
 
  - Contributor’s guide in [`website/src/guide/contributing.md`](website/src/guide/contributing.md)
- - Architecture in [`website/src/api/architecture.md`](website/src/api/architecture.md)
  - Changelog to track our release progress (we aim to roll out a release every month): [`CHANGELOG.md`](CHANGELOG.md)
 
 ## License

+ 4 - 0
examples/aws-presigned-url/.gitignore

@@ -0,0 +1,4 @@
+vendor
+bundle.js
+uppy.min.css
+bundle.js.*

+ 7 - 0
examples/aws-presigned-url/composer.json

@@ -0,0 +1,7 @@
+{
+    "name": "transloadit/uppy-aws-demo",
+    "type": "project",
+    "require": {
+        "aws/aws-sdk-php": "^3.31"
+    }
+}

+ 384 - 0
examples/aws-presigned-url/composer.lock

@@ -0,0 +1,384 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+        "This file is @generated automatically"
+    ],
+    "content-hash": "e20f395162aaa593a890967537ff5f08",
+    "packages": [
+        {
+            "name": "aws/aws-sdk-php",
+            "version": "3.33.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/aws/aws-sdk-php.git",
+                "reference": "980351b9468d85fd077e74e696ccf14d3f5b631e"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/980351b9468d85fd077e74e696ccf14d3f5b631e",
+                "reference": "980351b9468d85fd077e74e696ccf14d3f5b631e",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/guzzle": "^5.3.1|^6.2.1",
+                "guzzlehttp/promises": "~1.0",
+                "guzzlehttp/psr7": "^1.4.1",
+                "mtdowling/jmespath.php": "~2.2",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "andrewsville/php-token-reflection": "^1.4",
+                "aws/aws-php-sns-message-validator": "~1.0",
+                "behat/behat": "~3.0",
+                "doctrine/cache": "~1.4",
+                "ext-dom": "*",
+                "ext-json": "*",
+                "ext-openssl": "*",
+                "ext-pcre": "*",
+                "ext-simplexml": "*",
+                "ext-spl": "*",
+                "nette/neon": "^2.3",
+                "phpunit/phpunit": "^4.8.35|^5.4.0",
+                "psr/cache": "^1.0"
+            },
+            "suggest": {
+                "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
+                "doctrine/cache": "To use the DoctrineCacheAdapter",
+                "ext-curl": "To send requests using cURL",
+                "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "3.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Aws\\": "src/"
+                },
+                "files": [
+                    "src/functions.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "Apache-2.0"
+            ],
+            "authors": [
+                {
+                    "name": "Amazon Web Services",
+                    "homepage": "http://aws.amazon.com"
+                }
+            ],
+            "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
+            "homepage": "http://aws.amazon.com/sdkforphp",
+            "keywords": [
+                "amazon",
+                "aws",
+                "cloud",
+                "dynamodb",
+                "ec2",
+                "glacier",
+                "s3",
+                "sdk"
+            ],
+            "time": "2017-08-14T19:22:37+00:00"
+        },
+        {
+            "name": "guzzlehttp/guzzle",
+            "version": "6.3.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/guzzle.git",
+                "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+                "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+                "shasum": ""
+            },
+            "require": {
+                "guzzlehttp/promises": "^1.0",
+                "guzzlehttp/psr7": "^1.4",
+                "php": ">=5.5"
+            },
+            "require-dev": {
+                "ext-curl": "*",
+                "phpunit/phpunit": "^4.0 || ^5.0",
+                "psr/log": "^1.0"
+            },
+            "suggest": {
+                "psr/log": "Required for using the Log middleware"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "6.2-dev"
+                }
+            },
+            "autoload": {
+                "files": [
+                    "src/functions_include.php"
+                ],
+                "psr-4": {
+                    "GuzzleHttp\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle is a PHP HTTP client library",
+            "homepage": "http://guzzlephp.org/",
+            "keywords": [
+                "client",
+                "curl",
+                "framework",
+                "http",
+                "http client",
+                "rest",
+                "web service"
+            ],
+            "time": "2017-06-22T18:50:49+00:00"
+        },
+        {
+            "name": "guzzlehttp/promises",
+            "version": "v1.3.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/promises.git",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.5.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "^4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Promise\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Guzzle promises library",
+            "keywords": [
+                "promise"
+            ],
+            "time": "2016-12-20T10:07:11+00:00"
+        },
+        {
+            "name": "guzzlehttp/psr7",
+            "version": "1.4.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/guzzle/psr7.git",
+                "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+                "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0",
+                "psr/http-message": "~1.0"
+            },
+            "provide": {
+                "psr/http-message-implementation": "1.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "GuzzleHttp\\Psr7\\": "src/"
+                },
+                "files": [
+                    "src/functions_include.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                },
+                {
+                    "name": "Tobias Schultze",
+                    "homepage": "https://github.com/Tobion"
+                }
+            ],
+            "description": "PSR-7 message implementation that also provides common utility methods",
+            "keywords": [
+                "http",
+                "message",
+                "request",
+                "response",
+                "stream",
+                "uri",
+                "url"
+            ],
+            "time": "2017-03-20T17:10:46+00:00"
+        },
+        {
+            "name": "mtdowling/jmespath.php",
+            "version": "2.4.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/jmespath/jmespath.php.git",
+                "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
+                "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.4.0"
+            },
+            "require-dev": {
+                "phpunit/phpunit": "~4.0"
+            },
+            "bin": [
+                "bin/jp.php"
+            ],
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "JmesPath\\": "src/"
+                },
+                "files": [
+                    "src/JmesPath.php"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Michael Dowling",
+                    "email": "mtdowling@gmail.com",
+                    "homepage": "https://github.com/mtdowling"
+                }
+            ],
+            "description": "Declaratively specify how to extract elements from a JSON document",
+            "keywords": [
+                "json",
+                "jsonpath"
+            ],
+            "time": "2016-12-03T22:08:25+00:00"
+        },
+        {
+            "name": "psr/http-message",
+            "version": "1.0.1",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/http-message.git",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-4": {
+                    "Psr\\Http\\Message\\": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for HTTP messages",
+            "homepage": "https://github.com/php-fig/http-message",
+            "keywords": [
+                "http",
+                "http-message",
+                "psr",
+                "psr-7",
+                "request",
+                "response"
+            ],
+            "time": "2016-08-06T14:39:51+00:00"
+        }
+    ],
+    "packages-dev": [],
+    "aliases": [],
+    "minimum-stability": "stable",
+    "stability-flags": [],
+    "prefer-stable": false,
+    "prefer-lowest": false,
+    "platform": [],
+    "platform-dev": []
+}

+ 12 - 0
examples/aws-presigned-url/index.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <title>Uppy AWS Example</title>
+    <link href="uppy.min.css" rel="stylesheet">
+  </head>
+  <body>
+    <script src="bundle.js"></script>
+  </body>
+</html>

+ 44 - 0
examples/aws-presigned-url/main.js

@@ -0,0 +1,44 @@
+const Uppy = require('uppy/lib/core/Core.js')
+const Dashboard = require('uppy/lib/plugins/Dashboard')
+const XHRUpload = require('uppy/lib/plugins/XHRUpload')
+const AwsS3 = require('uppy/lib/plugins/AwsS3')
+
+const uppy = Uppy({
+  debug: true,
+  autoProceed: false
+})
+
+uppy.use(Dashboard, {
+  inline: true,
+  target: 'body'
+})
+uppy.use(XHRUpload)
+uppy.use(AwsS3, {
+  getUploadParameters (file) {
+    // Send a request to our PHP signing endpoint.
+    return fetch('/s3-sign.php', {
+      method: 'post',
+      // Send and receive JSON.
+      headers: {
+        accept: 'application/json',
+        'content-type': 'application/json'
+      },
+      body: JSON.stringify({
+        filename: file.name,
+        contentType: `${file.type.general}/${file.type.specific}`
+      })
+    }).then((response) => {
+      // Parse the JSON response.
+      return response.json()
+    }).then((data) => {
+      // Return an object in the correct shape.
+      return {
+        method: data.method,
+        url: data.url,
+        fields: {}
+      }
+    })
+  }
+})
+
+uppy.run()

+ 1865 - 0
examples/aws-presigned-url/package-lock.json

@@ -0,0 +1,1865 @@
+{
+  "name": "uppy-aws-php-example",
+  "requires": true,
+  "lockfileVersion": 1,
+  "dependencies": {
+    "acorn": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz",
+      "integrity": "sha512-vOk6uEMctu0vQrvuSqFdJyqj1Q0S5VTDL79qtjo+DhRr+1mmaD+tluFSCZqhvi/JUhXSzoZN2BhtstaPEeE8cw=="
+    },
+    "aliasify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/aliasify/-/aliasify-2.1.0.tgz",
+      "integrity": "sha1-fDCCW5RQueYYW6J1M+r24gZ9S0I=",
+      "requires": {
+        "browserify-transform-tools": "1.7.0"
+      }
+    },
+    "ansi-regex": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
+    },
+    "ansi-styles": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
+    },
+    "array-filter": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
+    },
+    "array-map": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI="
+    },
+    "array-reduce": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
+    },
+    "asn1.js": {
+      "version": "4.9.1",
+      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz",
+      "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "assert": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
+      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
+      "requires": {
+        "util": "0.10.3"
+      }
+    },
+    "astw": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/astw/-/astw-2.2.0.tgz",
+      "integrity": "sha1-e9QXhNMkk5h66yOba04cV6hzuRc=",
+      "requires": {
+        "acorn": "4.0.13"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+        }
+      }
+    },
+    "babel-code-frame": {
+      "version": "6.22.0",
+      "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+      "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
+      "requires": {
+        "chalk": "1.1.3",
+        "esutils": "2.0.2",
+        "js-tokens": "3.0.2"
+      }
+    },
+    "babel-core": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.25.0.tgz",
+      "integrity": "sha1-fdQrBGPHQunVKW3rPsZ6kyLa1yk=",
+      "requires": {
+        "babel-code-frame": "6.22.0",
+        "babel-generator": "6.25.0",
+        "babel-helpers": "6.24.1",
+        "babel-messages": "6.23.0",
+        "babel-register": "6.24.1",
+        "babel-runtime": "6.25.0",
+        "babel-template": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "convert-source-map": "1.5.0",
+        "debug": "2.6.8",
+        "json5": "0.5.1",
+        "lodash": "4.17.4",
+        "minimatch": "3.0.4",
+        "path-is-absolute": "1.0.1",
+        "private": "0.1.7",
+        "slash": "1.0.0",
+        "source-map": "0.5.6"
+      }
+    },
+    "babel-generator": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.25.0.tgz",
+      "integrity": "sha1-M6GvcNXyiQrrRlpKd5PB32qeqfw=",
+      "requires": {
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.25.0",
+        "babel-types": "6.25.0",
+        "detect-indent": "4.0.0",
+        "jsesc": "1.3.0",
+        "lodash": "4.17.4",
+        "source-map": "0.5.6",
+        "trim-right": "1.0.1"
+      }
+    },
+    "babel-helpers": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz",
+      "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=",
+      "requires": {
+        "babel-runtime": "6.25.0",
+        "babel-template": "6.25.0"
+      }
+    },
+    "babel-messages": {
+      "version": "6.23.0",
+      "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+      "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+      "requires": {
+        "babel-runtime": "6.25.0"
+      }
+    },
+    "babel-register": {
+      "version": "6.24.1",
+      "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.24.1.tgz",
+      "integrity": "sha1-fhDhOi9xBlvfrVoXh7pFvKbe118=",
+      "requires": {
+        "babel-core": "6.25.0",
+        "babel-runtime": "6.25.0",
+        "core-js": "2.5.0",
+        "home-or-tmp": "2.0.0",
+        "lodash": "4.17.4",
+        "mkdirp": "0.5.1",
+        "source-map-support": "0.4.15"
+      }
+    },
+    "babel-runtime": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz",
+      "integrity": "sha1-M7mOql1IK7AajRqmtDetKwGuxBw=",
+      "requires": {
+        "core-js": "2.5.0",
+        "regenerator-runtime": "0.10.5"
+      }
+    },
+    "babel-template": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.25.0.tgz",
+      "integrity": "sha1-ZlJBFmt8KqTGGdceGSlpVSsQwHE=",
+      "requires": {
+        "babel-runtime": "6.25.0",
+        "babel-traverse": "6.25.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "lodash": "4.17.4"
+      }
+    },
+    "babel-traverse": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.25.0.tgz",
+      "integrity": "sha1-IldJfi/NGbie3BPEyROB+VEklvE=",
+      "requires": {
+        "babel-code-frame": "6.22.0",
+        "babel-messages": "6.23.0",
+        "babel-runtime": "6.25.0",
+        "babel-types": "6.25.0",
+        "babylon": "6.17.4",
+        "debug": "2.6.8",
+        "globals": "9.18.0",
+        "invariant": "2.2.2",
+        "lodash": "4.17.4"
+      }
+    },
+    "babel-types": {
+      "version": "6.25.0",
+      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.25.0.tgz",
+      "integrity": "sha1-cK+ySNVmDl0Y+BHZHIMDtUE0oY4=",
+      "requires": {
+        "babel-runtime": "6.25.0",
+        "esutils": "2.0.2",
+        "lodash": "4.17.4",
+        "to-fast-properties": "1.0.3"
+      }
+    },
+    "babelify": {
+      "version": "7.3.0",
+      "resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz",
+      "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=",
+      "requires": {
+        "babel-core": "6.25.0",
+        "object-assign": "4.1.1"
+      }
+    },
+    "babylon": {
+      "version": "6.17.4",
+      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.17.4.tgz",
+      "integrity": "sha512-kChlV+0SXkjE0vUn9OZ7pBMWRFd8uq3mZe8x1K6jhuNcAFAtEnjchFAqB+dYEXKyd+JpT6eppRR78QAr5gTsUw=="
+    },
+    "balanced-match": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+    },
+    "base64-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz",
+      "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw=="
+    },
+    "bn.js": {
+      "version": "4.11.8",
+      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
+      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
+    },
+    "brace-expansion": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+      "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+      "requires": {
+        "balanced-match": "1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "brorand": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
+      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
+    },
+    "browser-pack": {
+      "version": "6.0.2",
+      "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.0.2.tgz",
+      "integrity": "sha1-+GzWzvT1MAyOY+B6TVEvZfv/RTE=",
+      "requires": {
+        "combine-source-map": "0.7.2",
+        "defined": "1.0.0",
+        "JSONStream": "1.3.1",
+        "through2": "2.0.3",
+        "umd": "3.0.1"
+      }
+    },
+    "browser-resolve": {
+      "version": "1.11.2",
+      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz",
+      "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=",
+      "requires": {
+        "resolve": "1.1.7"
+      },
+      "dependencies": {
+        "resolve": {
+          "version": "1.1.7",
+          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
+          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
+        }
+      }
+    },
+    "browserify": {
+      "version": "14.4.0",
+      "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.4.0.tgz",
+      "integrity": "sha1-CJo0Y69Y0OSNjNQHCz90ZU1avKk=",
+      "requires": {
+        "assert": "1.4.1",
+        "browser-pack": "6.0.2",
+        "browser-resolve": "1.11.2",
+        "browserify-zlib": "0.1.4",
+        "buffer": "5.0.7",
+        "cached-path-relative": "1.0.1",
+        "concat-stream": "1.5.2",
+        "console-browserify": "1.1.0",
+        "constants-browserify": "1.0.0",
+        "crypto-browserify": "3.11.1",
+        "defined": "1.0.0",
+        "deps-sort": "2.0.0",
+        "domain-browser": "1.1.7",
+        "duplexer2": "0.1.4",
+        "events": "1.1.1",
+        "glob": "7.1.2",
+        "has": "1.0.1",
+        "htmlescape": "1.1.1",
+        "https-browserify": "1.0.0",
+        "inherits": "2.0.3",
+        "insert-module-globals": "7.0.1",
+        "JSONStream": "1.3.1",
+        "labeled-stream-splicer": "2.0.0",
+        "module-deps": "4.1.1",
+        "os-browserify": "0.1.2",
+        "parents": "1.0.1",
+        "path-browserify": "0.0.0",
+        "process": "0.11.10",
+        "punycode": "1.4.1",
+        "querystring-es3": "0.2.1",
+        "read-only-stream": "2.0.0",
+        "readable-stream": "2.3.3",
+        "resolve": "1.4.0",
+        "shasum": "1.0.2",
+        "shell-quote": "1.6.1",
+        "stream-browserify": "2.0.1",
+        "stream-http": "2.7.2",
+        "string_decoder": "1.0.3",
+        "subarg": "1.0.0",
+        "syntax-error": "1.3.0",
+        "through2": "2.0.3",
+        "timers-browserify": "1.4.2",
+        "tty-browserify": "0.0.0",
+        "url": "0.11.0",
+        "util": "0.10.3",
+        "vm-browserify": "0.0.4",
+        "xtend": "4.0.1"
+      }
+    },
+    "browserify-aes": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz",
+      "integrity": "sha1-Xncl297x/Vkw1OurSFZ85FHEigo=",
+      "requires": {
+        "buffer-xor": "1.0.3",
+        "cipher-base": "1.0.4",
+        "create-hash": "1.1.3",
+        "evp_bytestokey": "1.0.0",
+        "inherits": "2.0.3"
+      }
+    },
+    "browserify-cipher": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz",
+      "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=",
+      "requires": {
+        "browserify-aes": "1.0.6",
+        "browserify-des": "1.0.0",
+        "evp_bytestokey": "1.0.0"
+      }
+    },
+    "browserify-des": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz",
+      "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=",
+      "requires": {
+        "cipher-base": "1.0.4",
+        "des.js": "1.0.0",
+        "inherits": "2.0.3"
+      }
+    },
+    "browserify-rsa": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
+      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "randombytes": "2.0.5"
+      }
+    },
+    "browserify-sign": {
+      "version": "4.0.4",
+      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
+      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "elliptic": "6.4.0",
+        "inherits": "2.0.3",
+        "parse-asn1": "5.1.0"
+      }
+    },
+    "browserify-transform-tools": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/browserify-transform-tools/-/browserify-transform-tools-1.7.0.tgz",
+      "integrity": "sha1-g+J3Ih9jJZvtLn6yooOpcKUB9MQ=",
+      "requires": {
+        "falafel": "2.1.0",
+        "through": "2.3.8"
+      }
+    },
+    "browserify-zlib": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz",
+      "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=",
+      "requires": {
+        "pako": "0.2.9"
+      }
+    },
+    "buffer": {
+      "version": "5.0.7",
+      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.0.7.tgz",
+      "integrity": "sha512-NeeHXWh5pCbPQCt2/6rLvXqapZfVsqw/YgRgaHpT3H9Uzgs+S0lSg5SQzouIuDvcmlQRqBe8hOO2scKCu3cxrg==",
+      "requires": {
+        "base64-js": "1.2.1",
+        "ieee754": "1.1.8"
+      }
+    },
+    "buffer-xor": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
+      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
+    },
+    "builtin-modules": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+      "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+      "dev": true
+    },
+    "builtin-status-codes": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
+      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
+    },
+    "cached-path-relative": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
+      "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc="
+    },
+    "chalk": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+      "requires": {
+        "ansi-styles": "2.2.1",
+        "escape-string-regexp": "1.0.5",
+        "has-ansi": "2.0.0",
+        "strip-ansi": "3.0.1",
+        "supports-color": "2.0.0"
+      }
+    },
+    "cipher-base": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
+      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
+      "requires": {
+        "inherits": "2.0.3",
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "combine-source-map": {
+      "version": "0.7.2",
+      "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.7.2.tgz",
+      "integrity": "sha1-CHAxKFazB6h8xKxIbzqaYq7MwJ4=",
+      "requires": {
+        "convert-source-map": "1.1.3",
+        "inline-source-map": "0.6.2",
+        "lodash.memoize": "3.0.4",
+        "source-map": "0.5.6"
+      },
+      "dependencies": {
+        "convert-source-map": {
+          "version": "1.1.3",
+          "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
+          "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
+        }
+      }
+    },
+    "concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+    },
+    "concat-stream": {
+      "version": "1.5.2",
+      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz",
+      "integrity": "sha1-cIl4Yk2FavQaWnQd790mHadSwmY=",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.0.6",
+        "typedarray": "0.0.6"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+        },
+        "readable-stream": {
+          "version": "2.0.6",
+          "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+          "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+          "requires": {
+            "core-util-is": "1.0.2",
+            "inherits": "2.0.3",
+            "isarray": "1.0.0",
+            "process-nextick-args": "1.0.7",
+            "string_decoder": "0.10.31",
+            "util-deprecate": "1.0.2"
+          }
+        },
+        "string_decoder": {
+          "version": "0.10.31",
+          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+          "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+        }
+      }
+    },
+    "console-browserify": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
+      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+      "requires": {
+        "date-now": "0.1.4"
+      }
+    },
+    "constants-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
+      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
+    },
+    "convert-source-map": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz",
+      "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU="
+    },
+    "core-js": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.0.tgz",
+      "integrity": "sha1-VpwFCRi+ZIazg3VSAorgRmtxcIY="
+    },
+    "core-util-is": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+    },
+    "create-ecdh": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz",
+      "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "elliptic": "6.4.0"
+      }
+    },
+    "create-hash": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz",
+      "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=",
+      "requires": {
+        "cipher-base": "1.0.4",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "sha.js": "2.4.8"
+      }
+    },
+    "create-hmac": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz",
+      "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=",
+      "requires": {
+        "cipher-base": "1.0.4",
+        "create-hash": "1.1.3",
+        "inherits": "2.0.3",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.8"
+      }
+    },
+    "cross-spawn": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+      "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=",
+      "dev": true,
+      "requires": {
+        "lru-cache": "4.1.1",
+        "shebang-command": "1.2.0",
+        "which": "1.3.0"
+      }
+    },
+    "crypto-browserify": {
+      "version": "3.11.1",
+      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz",
+      "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==",
+      "requires": {
+        "browserify-cipher": "1.0.0",
+        "browserify-sign": "4.0.4",
+        "create-ecdh": "4.0.0",
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "diffie-hellman": "5.0.2",
+        "inherits": "2.0.3",
+        "pbkdf2": "3.0.13",
+        "public-encrypt": "4.0.0",
+        "randombytes": "2.0.5"
+      }
+    },
+    "date-now": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
+      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+    },
+    "debug": {
+      "version": "2.6.8",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
+      "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
+      "requires": {
+        "ms": "2.0.0"
+      }
+    },
+    "define-properties": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz",
+      "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=",
+      "dev": true,
+      "requires": {
+        "foreach": "2.0.5",
+        "object-keys": "1.0.11"
+      }
+    },
+    "defined": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
+      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
+    },
+    "deps-sort": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
+      "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
+      "requires": {
+        "JSONStream": "1.3.1",
+        "shasum": "1.0.2",
+        "subarg": "1.0.0",
+        "through2": "2.0.3"
+      }
+    },
+    "des.js": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
+      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "detect-indent": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+      "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+      "requires": {
+        "repeating": "2.0.1"
+      }
+    },
+    "detective": {
+      "version": "4.5.0",
+      "resolved": "https://registry.npmjs.org/detective/-/detective-4.5.0.tgz",
+      "integrity": "sha1-blqMaybmx6JUsca210kNmOyR7dE=",
+      "requires": {
+        "acorn": "4.0.13",
+        "defined": "1.0.0"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+        }
+      }
+    },
+    "diffie-hellman": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz",
+      "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "miller-rabin": "4.0.0",
+        "randombytes": "2.0.5"
+      }
+    },
+    "domain-browser": {
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz",
+      "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw="
+    },
+    "duplexer": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
+      "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
+      "dev": true
+    },
+    "duplexer2": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
+      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
+      "requires": {
+        "readable-stream": "2.3.3"
+      }
+    },
+    "elliptic": {
+      "version": "6.4.0",
+      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz",
+      "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0",
+        "hash.js": "1.1.3",
+        "hmac-drbg": "1.0.1",
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "error-ex": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+      "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+      "dev": true,
+      "requires": {
+        "is-arrayish": "0.2.1"
+      }
+    },
+    "es-abstract": {
+      "version": "1.8.0",
+      "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.8.0.tgz",
+      "integrity": "sha512-Cf9/h5MrXtExM20gSS55YFrGKCyPrRBjIVBtVyy8vmlsDfe0NPKMWj65tPLgzyfPuapWxh5whpXCtW4+AW5mRg==",
+      "dev": true,
+      "requires": {
+        "es-to-primitive": "1.1.1",
+        "function-bind": "1.1.0",
+        "has": "1.0.1",
+        "is-callable": "1.1.3",
+        "is-regex": "1.0.4"
+      }
+    },
+    "es-to-primitive": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz",
+      "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=",
+      "dev": true,
+      "requires": {
+        "is-callable": "1.1.3",
+        "is-date-object": "1.0.1",
+        "is-symbol": "1.0.1"
+      }
+    },
+    "escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
+    },
+    "esutils": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+    },
+    "event-stream": {
+      "version": "3.3.4",
+      "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+      "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1",
+        "from": "0.1.7",
+        "map-stream": "0.1.0",
+        "pause-stream": "0.0.11",
+        "split": "0.3.3",
+        "stream-combiner": "0.0.4",
+        "through": "2.3.8"
+      }
+    },
+    "events": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
+      "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ="
+    },
+    "evp_bytestokey": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz",
+      "integrity": "sha1-SXtmrZ/vZc18CKYYCCS6FHa2blM=",
+      "requires": {
+        "create-hash": "1.1.3"
+      }
+    },
+    "falafel": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz",
+      "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=",
+      "requires": {
+        "acorn": "5.1.1",
+        "foreach": "2.0.5",
+        "isarray": "0.0.1",
+        "object-keys": "1.0.11"
+      }
+    },
+    "foreach": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
+      "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k="
+    },
+    "from": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
+      "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
+      "dev": true
+    },
+    "fs-write-stream-atomic": {
+      "version": "1.0.10",
+      "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
+      "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=",
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "iferr": "0.1.5",
+        "imurmurhash": "0.1.4",
+        "readable-stream": "2.3.3"
+      }
+    },
+    "fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+    },
+    "function-bind": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz",
+      "integrity": "sha1-FhdnFMgBeY5Ojyz391KUZ7tKV3E="
+    },
+    "glob": {
+      "version": "7.1.2",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+      "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+      "requires": {
+        "fs.realpath": "1.0.0",
+        "inflight": "1.0.6",
+        "inherits": "2.0.3",
+        "minimatch": "3.0.4",
+        "once": "1.4.0",
+        "path-is-absolute": "1.0.1"
+      }
+    },
+    "globals": {
+      "version": "9.18.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz",
+      "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ=="
+    },
+    "graceful-fs": {
+      "version": "4.1.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+    },
+    "has": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz",
+      "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=",
+      "requires": {
+        "function-bind": "1.1.0"
+      }
+    },
+    "has-ansi": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "hash-base": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz",
+      "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=",
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "hash.js": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz",
+      "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==",
+      "requires": {
+        "inherits": "2.0.3",
+        "minimalistic-assert": "1.0.0"
+      }
+    },
+    "hmac-drbg": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
+      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
+      "requires": {
+        "hash.js": "1.1.3",
+        "minimalistic-assert": "1.0.0",
+        "minimalistic-crypto-utils": "1.0.1"
+      }
+    },
+    "home-or-tmp": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz",
+      "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=",
+      "requires": {
+        "os-homedir": "1.0.2",
+        "os-tmpdir": "1.0.2"
+      }
+    },
+    "hosted-git-info": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz",
+      "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==",
+      "dev": true
+    },
+    "htmlescape": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
+      "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E="
+    },
+    "https-browserify": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
+      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
+    },
+    "ieee754": {
+      "version": "1.1.8",
+      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz",
+      "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q="
+    },
+    "iferr": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz",
+      "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE="
+    },
+    "imurmurhash": {
+      "version": "0.1.4",
+      "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+    },
+    "indexof": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+      "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10="
+    },
+    "inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+      "requires": {
+        "once": "1.4.0",
+        "wrappy": "1.0.2"
+      }
+    },
+    "inherits": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "inline-source-map": {
+      "version": "0.6.2",
+      "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
+      "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
+      "requires": {
+        "source-map": "0.5.6"
+      }
+    },
+    "insert-module-globals": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.0.1.tgz",
+      "integrity": "sha1-wDv04BywhtW15azorQr+eInWOMM=",
+      "requires": {
+        "combine-source-map": "0.7.2",
+        "concat-stream": "1.5.2",
+        "is-buffer": "1.1.5",
+        "JSONStream": "1.3.1",
+        "lexical-scope": "1.2.0",
+        "process": "0.11.10",
+        "through2": "2.0.3",
+        "xtend": "4.0.1"
+      }
+    },
+    "invariant": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+      "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+      "requires": {
+        "loose-envify": "1.3.1"
+      }
+    },
+    "is-arrayish": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+      "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+      "dev": true
+    },
+    "is-buffer": {
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
+      "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
+    },
+    "is-builtin-module": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+      "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+      "dev": true,
+      "requires": {
+        "builtin-modules": "1.1.1"
+      }
+    },
+    "is-callable": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz",
+      "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=",
+      "dev": true
+    },
+    "is-date-object": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
+      "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
+      "dev": true
+    },
+    "is-finite": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+      "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+      "requires": {
+        "number-is-nan": "1.0.1"
+      }
+    },
+    "is-regex": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
+      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
+      "dev": true,
+      "requires": {
+        "has": "1.0.1"
+      }
+    },
+    "is-symbol": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz",
+      "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=",
+      "dev": true
+    },
+    "isarray": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "js-tokens": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
+      "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
+    },
+    "jsesc": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+      "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s="
+    },
+    "json-stable-stringify": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
+      "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
+      "requires": {
+        "jsonify": "0.0.0"
+      }
+    },
+    "json5": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
+      "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE="
+    },
+    "jsonify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
+    },
+    "jsonparse": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
+      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
+    },
+    "JSONStream": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz",
+      "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=",
+      "requires": {
+        "jsonparse": "1.3.1",
+        "through": "2.3.8"
+      }
+    },
+    "labeled-stream-splicer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.0.tgz",
+      "integrity": "sha1-pS4dE4AkwAuGscDJH2d5GLiuClk=",
+      "requires": {
+        "inherits": "2.0.3",
+        "isarray": "0.0.1",
+        "stream-splicer": "2.0.0"
+      }
+    },
+    "lexical-scope": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/lexical-scope/-/lexical-scope-1.2.0.tgz",
+      "integrity": "sha1-/Ope3HBKSzqHls3KQZw6CvryLfQ=",
+      "requires": {
+        "astw": "2.2.0"
+      }
+    },
+    "load-json-file": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
+      "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
+      "dev": true,
+      "requires": {
+        "graceful-fs": "4.1.11",
+        "parse-json": "2.2.0",
+        "pify": "2.3.0",
+        "strip-bom": "3.0.0"
+      }
+    },
+    "lodash": {
+      "version": "4.17.4",
+      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+      "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4="
+    },
+    "lodash.memoize": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
+      "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
+    },
+    "loose-envify": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+      "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+      "requires": {
+        "js-tokens": "3.0.2"
+      }
+    },
+    "lru-cache": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz",
+      "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==",
+      "dev": true,
+      "requires": {
+        "pseudomap": "1.0.2",
+        "yallist": "2.1.2"
+      }
+    },
+    "map-stream": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+      "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+      "dev": true
+    },
+    "miller-rabin": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz",
+      "integrity": "sha1-SmL7HUKTPAVYOYL0xxb2+55sbT0=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "brorand": "1.1.0"
+      }
+    },
+    "minimalistic-assert": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz",
+      "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M="
+    },
+    "minimalistic-crypto-utils": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
+      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
+    },
+    "minimatch": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+      "requires": {
+        "brace-expansion": "1.1.8"
+      }
+    },
+    "minimist": {
+      "version": "0.0.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
+    },
+    "mkdirp": {
+      "version": "0.5.1",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+      "requires": {
+        "minimist": "0.0.8"
+      }
+    },
+    "module-deps": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz",
+      "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=",
+      "requires": {
+        "browser-resolve": "1.11.2",
+        "cached-path-relative": "1.0.1",
+        "concat-stream": "1.5.2",
+        "defined": "1.0.0",
+        "detective": "4.5.0",
+        "duplexer2": "0.1.4",
+        "inherits": "2.0.3",
+        "JSONStream": "1.3.1",
+        "parents": "1.0.1",
+        "readable-stream": "2.3.3",
+        "resolve": "1.4.0",
+        "stream-combiner2": "1.1.1",
+        "subarg": "1.0.0",
+        "through2": "2.0.3",
+        "xtend": "4.0.1"
+      }
+    },
+    "ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+    },
+    "normalize-package-data": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
+      "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
+      "dev": true,
+      "requires": {
+        "hosted-git-info": "2.5.0",
+        "is-builtin-module": "1.0.0",
+        "semver": "5.4.1",
+        "validate-npm-package-license": "3.0.1"
+      }
+    },
+    "npm-run-all": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.0.2.tgz",
+      "integrity": "sha1-qEZpNI5ttsy+BSIAtM22v+A0pP4=",
+      "dev": true,
+      "requires": {
+        "chalk": "1.1.3",
+        "cross-spawn": "5.1.0",
+        "minimatch": "3.0.4",
+        "ps-tree": "1.1.0",
+        "read-pkg": "2.0.0",
+        "shell-quote": "1.6.1",
+        "string.prototype.padend": "3.0.0"
+      }
+    },
+    "number-is-nan": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
+      "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0="
+    },
+    "object-assign": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
+    },
+    "object-keys": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz",
+      "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0="
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1.0.2"
+      }
+    },
+    "os-browserify": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.1.2.tgz",
+      "integrity": "sha1-ScoCk+CxlZCl9d4Qx/JlphfY/lQ="
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M="
+    },
+    "os-tmpdir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
+    },
+    "pako": {
+      "version": "0.2.9",
+      "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
+      "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU="
+    },
+    "parents": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
+      "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
+      "requires": {
+        "path-platform": "0.11.15"
+      }
+    },
+    "parse-asn1": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz",
+      "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=",
+      "requires": {
+        "asn1.js": "4.9.1",
+        "browserify-aes": "1.0.6",
+        "create-hash": "1.1.3",
+        "evp_bytestokey": "1.0.0",
+        "pbkdf2": "3.0.13"
+      }
+    },
+    "parse-json": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "dev": true,
+      "requires": {
+        "error-ex": "1.3.1"
+      }
+    },
+    "path-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz",
+      "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo="
+    },
+    "path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+    },
+    "path-parse": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+      "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
+    },
+    "path-platform": {
+      "version": "0.11.15",
+      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
+      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
+    },
+    "path-type": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
+      "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
+      "dev": true,
+      "requires": {
+        "pify": "2.3.0"
+      }
+    },
+    "pause-stream": {
+      "version": "0.0.11",
+      "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+      "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
+    "pbkdf2": {
+      "version": "3.0.13",
+      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.13.tgz",
+      "integrity": "sha512-+dCHxDH+djNtjgWmvVC/my3SYBAKpKNqKSjLkp+GtWWYe4XPE+e/PSD2aCanlEZZnqPk2uekTKNC/ccbwd2X2Q==",
+      "requires": {
+        "create-hash": "1.1.3",
+        "create-hmac": "1.1.6",
+        "ripemd160": "2.0.1",
+        "safe-buffer": "5.1.1",
+        "sha.js": "2.4.8"
+      }
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "private": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz",
+      "integrity": "sha1-aM5eih7woju1cMwoU3tTMqumPvE="
+    },
+    "process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
+    },
+    "process-nextick-args": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz",
+      "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M="
+    },
+    "ps-tree": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz",
+      "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=",
+      "dev": true,
+      "requires": {
+        "event-stream": "3.3.4"
+      }
+    },
+    "pseudomap": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+      "dev": true
+    },
+    "public-encrypt": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz",
+      "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=",
+      "requires": {
+        "bn.js": "4.11.8",
+        "browserify-rsa": "4.0.1",
+        "create-hash": "1.1.3",
+        "parse-asn1": "5.1.0",
+        "randombytes": "2.0.5"
+      }
+    },
+    "punycode": {
+      "version": "1.4.1",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+    },
+    "querystring": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
+    },
+    "querystring-es3": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
+      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
+    },
+    "randombytes": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz",
+      "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==",
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "read-only-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
+      "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
+      "requires": {
+        "readable-stream": "2.3.3"
+      }
+    },
+    "read-pkg": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
+      "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
+      "dev": true,
+      "requires": {
+        "load-json-file": "2.0.0",
+        "normalize-package-data": "2.4.0",
+        "path-type": "2.0.0"
+      }
+    },
+    "readable-stream": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz",
+      "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==",
+      "requires": {
+        "core-util-is": "1.0.2",
+        "inherits": "2.0.3",
+        "isarray": "1.0.0",
+        "process-nextick-args": "1.0.7",
+        "safe-buffer": "5.1.1",
+        "string_decoder": "1.0.3",
+        "util-deprecate": "1.0.2"
+      },
+      "dependencies": {
+        "isarray": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+        }
+      }
+    },
+    "regenerator-runtime": {
+      "version": "0.10.5",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+      "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg="
+    },
+    "repeating": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "requires": {
+        "is-finite": "1.0.2"
+      }
+    },
+    "resolve": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
+      "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
+      "requires": {
+        "path-parse": "1.0.5"
+      }
+    },
+    "ripemd160": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz",
+      "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=",
+      "requires": {
+        "hash-base": "2.0.2",
+        "inherits": "2.0.3"
+      }
+    },
+    "safe-buffer": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
+      "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
+    },
+    "semver": {
+      "version": "5.4.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz",
+      "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==",
+      "dev": true
+    },
+    "sha.js": {
+      "version": "2.4.8",
+      "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz",
+      "integrity": "sha1-NwaMLEdra69ALRSknGf1l5IfY08=",
+      "requires": {
+        "inherits": "2.0.3"
+      }
+    },
+    "shasum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
+      "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
+      "requires": {
+        "json-stable-stringify": "0.0.1",
+        "sha.js": "2.4.8"
+      }
+    },
+    "shebang-command": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+      "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "1.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
+      "dev": true
+    },
+    "shell-quote": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+      "requires": {
+        "array-filter": "0.0.1",
+        "array-map": "0.0.0",
+        "array-reduce": "0.0.0",
+        "jsonify": "0.0.0"
+      }
+    },
+    "slash": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz",
+      "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU="
+    },
+    "source-map": {
+      "version": "0.5.6",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+      "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI="
+    },
+    "source-map-support": {
+      "version": "0.4.15",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz",
+      "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=",
+      "requires": {
+        "source-map": "0.5.6"
+      }
+    },
+    "spdx-correct": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+      "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+      "dev": true,
+      "requires": {
+        "spdx-license-ids": "1.2.2"
+      }
+    },
+    "spdx-expression-parse": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+      "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+      "dev": true
+    },
+    "spdx-license-ids": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+      "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+      "dev": true
+    },
+    "split": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+      "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
+      "dev": true,
+      "requires": {
+        "through": "2.3.8"
+      }
+    },
+    "stream-browserify": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
+      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.3"
+      }
+    },
+    "stream-combiner": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
+      "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
+      "dev": true,
+      "requires": {
+        "duplexer": "0.1.1"
+      }
+    },
+    "stream-combiner2": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
+      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
+      "requires": {
+        "duplexer2": "0.1.4",
+        "readable-stream": "2.3.3"
+      }
+    },
+    "stream-http": {
+      "version": "2.7.2",
+      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz",
+      "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==",
+      "requires": {
+        "builtin-status-codes": "3.0.0",
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.3",
+        "to-arraybuffer": "1.0.1",
+        "xtend": "4.0.1"
+      }
+    },
+    "stream-splicer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
+      "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
+      "requires": {
+        "inherits": "2.0.3",
+        "readable-stream": "2.3.3"
+      }
+    },
+    "string_decoder": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
+      "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
+      "requires": {
+        "safe-buffer": "5.1.1"
+      }
+    },
+    "string.prototype.padend": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz",
+      "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=",
+      "dev": true,
+      "requires": {
+        "define-properties": "1.1.2",
+        "es-abstract": "1.8.0",
+        "function-bind": "1.1.0"
+      }
+    },
+    "strip-ansi": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "requires": {
+        "ansi-regex": "2.1.1"
+      }
+    },
+    "strip-bom": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+      "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+      "dev": true
+    },
+    "subarg": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
+      "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
+      "requires": {
+        "minimist": "1.2.0"
+      },
+      "dependencies": {
+        "minimist": {
+          "version": "1.2.0",
+          "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
+        }
+      }
+    },
+    "supports-color": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
+    },
+    "syntax-error": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.3.0.tgz",
+      "integrity": "sha1-HtkmbE1AvnXcVb+bsct3Biu5bKE=",
+      "requires": {
+        "acorn": "4.0.13"
+      },
+      "dependencies": {
+        "acorn": {
+          "version": "4.0.13",
+          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
+          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
+        }
+      }
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    },
+    "through2": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+      "requires": {
+        "readable-stream": "2.3.3",
+        "xtend": "4.0.1"
+      }
+    },
+    "timers-browserify": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
+      "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
+      "requires": {
+        "process": "0.11.10"
+      }
+    },
+    "to-arraybuffer": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
+      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
+    },
+    "to-fast-properties": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
+      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
+    },
+    "trim-right": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+      "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM="
+    },
+    "tty-browserify": {
+      "version": "0.0.0",
+      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
+      "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY="
+    },
+    "typedarray": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
+    },
+    "umd": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.1.tgz",
+      "integrity": "sha1-iuVW4RAR9jwllnCKiDclnwGz1g4="
+    },
+    "url": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
+      "requires": {
+        "punycode": "1.3.2",
+        "querystring": "0.2.0"
+      },
+      "dependencies": {
+        "punycode": {
+          "version": "1.3.2",
+          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
+        }
+      }
+    },
+    "util": {
+      "version": "0.10.3",
+      "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
+      "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
+      "requires": {
+        "inherits": "2.0.1"
+      },
+      "dependencies": {
+        "inherits": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
+        }
+      }
+    },
+    "util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+    },
+    "validate-npm-package-license": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+      "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+      "dev": true,
+      "requires": {
+        "spdx-correct": "1.0.2",
+        "spdx-expression-parse": "1.0.4"
+      }
+    },
+    "vm-browserify": {
+      "version": "0.0.4",
+      "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz",
+      "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=",
+      "requires": {
+        "indexof": "0.0.1"
+      }
+    },
+    "which": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+      "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+      "dev": true,
+      "requires": {
+        "isexe": "2.0.0"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "xtend": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+    },
+    "yallist": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+      "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+      "dev": true
+    }
+  }
+}

+ 13 - 0
examples/aws-presigned-url/package.json

@@ -0,0 +1,13 @@
+{
+  "private": true,
+  "name": "uppy-aws-php-example",
+  "scripts": {
+    "start": "node ./serve.js"
+  },
+  "devDependencies": {
+    "aliasify": "^2.1.0",
+    "babelify": "^7.3.0",
+    "browserify": "^14.4.0",
+    "fs-write-stream-atomic": "^1.0.10"
+  }
+}

+ 36 - 0
examples/aws-presigned-url/readme.md

@@ -0,0 +1,36 @@
+# Uppy + AWS S3 Example
+
+This example uses a server-side PHP endpoint to sign uploads to S3.
+
+## Running It
+
+This example uses the AWS PHP SDK.
+To install it, [get composer](https://getcomposer.org) and run `composer update` in this folder.
+
+```bash
+cd ./examples/aws-presigned-url
+composer update
+```
+
+Configure AWS S3 credentials using [environment variables](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#environment-credentials) or a [credentials file in `~/.aws/credentials`](https://docs.aws.amazon.com/aws-sdk-php/v3/guide/guide/credentials.html#credential-profiles).
+Configure a bucket name and region in the `s3-sign.php` file.
+
+Then install npm dependencies using
+
+```bash
+npm install
+```
+
+and start the demo server using
+
+```bash
+npm start
+```
+
+The demo should now be available at http://localhost:8080.
+
+Optionally, provide a port in the `PORT` environment variable:
+
+```bash
+PORT=8080 npm start
+```

+ 39 - 0
examples/aws-presigned-url/s3-sign.php

@@ -0,0 +1,39 @@
+<?php
+
+require 'vendor/autoload.php';
+header('Access-Control-Allow-Origin: *');
+header("Access-Control-Allow-Headers: GET");
+
+// CONFIG: Change these variables to a valid region and bucket.
+$awsRegion = 'eu-west-2';
+$bucket = 'uppy-test';
+// Directory to place uploaded files in.
+$directory = 'uppy-php-example';
+
+// Create the S3 client.
+$s3 = new Aws\S3\S3Client([
+  'version' => 'latest',
+  'region' => $awsRegion,
+]);
+
+// Retrieve data about the file to be uploaded from the request body.
+$body = json_decode(file_get_contents('php://input'));
+$filename = $body->filename;
+$contentType = $body->contentType;
+
+// Prepare a PutObject command.
+$command = $s3->getCommand('putObject', [
+  'Bucket' => $bucket,
+  'Key' => "{$directory}/{$filename}",
+  'ContentType' => $contentType,
+  'Body' => '',
+]);
+
+$request = $s3->createPresignedRequest($command, '+5 minutes');
+
+header('content-type: application/json');
+echo json_encode([
+  'method' => $request->getMethod(),
+  'url' => (string) $request->getUri(),
+  'fields' => [],
+]);

+ 45 - 0
examples/aws-presigned-url/serve.js

@@ -0,0 +1,45 @@
+const spawn = require('child_process').spawn
+const path = require('path')
+const fs = require('fs')
+const createWriteStream = require('fs-write-stream-atomic')
+const browserify = require('browserify')
+const watchify = require('watchify')
+const aliasify = require('aliasify')
+const babelify = require('babelify')
+
+const port = process.env.PORT || 8080
+
+const b = browserify({
+  cache: {},
+  packageCache: {},
+  debug: true,
+  entries: path.join(__dirname, './main.js')
+})
+
+b.plugin(watchify)
+
+b.transform(babelify)
+b.transform(aliasify, {
+  replacements: {
+    '^uppy/lib/(.*?)$': path.join(__dirname, '../../src/$1')
+  }
+})
+
+function bundle () {
+  return b.bundle()
+    .pipe(createWriteStream(path.join(__dirname, './bundle.js')))
+}
+
+b.on('log', console.log)
+b.on('update', bundle)
+b.on('error', console.error)
+
+bundle()
+
+fs.createReadStream(path.join(__dirname, '../../dist/uppy.min.css'))
+  .pipe(fs.createWriteStream(path.join(__dirname, './uppy.min.css')))
+
+// Start the PHP delevopment server.
+spawn('php', ['-S', `localhost:${port}`], {
+  stdio: 'inherit'
+})

+ 1 - 1
package.json

@@ -100,7 +100,7 @@
     "build:lib": "babel --version && babel src --source-maps -d lib",
     "build": "npm-run-all --parallel build:js build:css --serial build:gzip size",
     "clean": "rm -rf lib && rm -rf dist",
-    "docs": "cd website && node node_modules/documentation/bin/documentation.js readme ../src/index.js --readme-file=src/api/docs.md --section 'Uppy Core & Plugins' -q --github -c doc-order.json",
+    "docs": "cd website && node node_modules/documentation/bin/documentation.js readme ../src/index.js --readme-file=src/docs/generated.md --section 'Uppy Core & Plugins' -q --github -c doc-order.json",
     "lint:fix": "eslint src test website/build-examples.js website/update.js website/themes/uppy/source/js/common.js --fix",
     "lint": "eslint src test website/build-examples.js website/update.js website/themes/uppy/source/js/common.js",
     "lint-staged": "lint-staged",

+ 1 - 0
src/plugins/Dashboard/index.js

@@ -44,6 +44,7 @@ module.exports = class DashboardUI extends Plugin {
     const defaultOptions = {
       target: 'body',
       getMetaFromForm: true,
+      trigger: '#uppy-select-files',
       inline: false,
       width: 750,
       height: 550,

+ 3 - 2
website/_config.yml

@@ -13,8 +13,8 @@ logo_large: /images/logos/uppy-dog-full.svg
 logo_medium: /images/logos/uppy-dog-head-arrow.svg
 logo_icon: /images/logos/uppy-dog-head-arrow.png
 description: >
-    Uppy is (going to be) a sleek, modular file uploader that integrates seemlessly with any framework.
-    It fetches files from local disk, Google Drive, Dropbox, Instagram, remote URLs, cameras and other exciting locations, and then uploads them to the final destination.
+    Uppy is a sleek, modular file uploader that integrates seemlessly with any framework. 
+    It fetches files from local disk, Google Drive, Dropbox, Instagram, remote URLs, cameras and other exciting locations, and then uploads them to the final destination. 
     It’s fast, easy to use and let's you worry about more important problems than building a file uploader.
 descriptionWho: >
   Uppy is brought to you by the people
@@ -111,6 +111,7 @@ markdown:
   breaks: true
   smartLists: true
   smartypants: true
+  modifyAnchors: 1
 
 feed:
   type: atom

+ 0 - 1775
website/src/api/docs.md

@@ -1,1775 +0,0 @@
----
-type: api
-order: 1
-title: "Generated API Docs"
----
-
-# Uppy Core & Plugins
-
-## Uppy
-
-[src/core/Core.js:14-581](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L14-L581 "Source code on GitHub")
-
-Main Uppy core
-
-**Parameters**
-
--   `opts` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** general options, like locales, to show modal or not to show
-
-### updateAll
-
-[src/core/Core.js:73-79](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L73-L79 "Source code on GitHub")
-
-Iterate on all plugins and run `update` on them. Called each time state changes
-
-**Parameters**
-
--   `state`  
-
-### setState
-
-[src/core/Core.js:86-92](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L86-L92 "Source code on GitHub")
-
-Updates state
-
-**Parameters**
-
--   `object` **newState** 
--   `stateUpdate`  
-
-### getState
-
-[src/core/Core.js:98-102](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L98-L102 "Source code on GitHub")
-
-Returns current state
-
-### actions
-
-[src/core/Core.js:295-385](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L295-L385 "Source code on GitHub")
-
-Registers listeners for all global actions, like:
-`file-add`, `file-remove`, `upload-progress`, `reset`
-
-### use
-
-[src/core/Core.js:410-439](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L410-L439 "Source code on GitHub")
-
-Registers a plugin with Core
-
-**Parameters**
-
--   `Plugin` **Class** object
--   `options` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** object that will be passed to Plugin later
--   `opts`  
-
-Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** self for chaining
-
-### getPlugin
-
-[src/core/Core.js:446-456](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L446-L456 "Source code on GitHub")
-
-Find one Plugin by name
-
-**Parameters**
-
--   `string`  name description
--   `name`  
-
-### iteratePlugins
-
-[src/core/Core.js:463-467](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L463-L467 "Source code on GitHub")
-
-Iterate through all `use`d plugins
-
-**Parameters**
-
--   `function`  method description
--   `method`  
-
-### removePlugin
-
-[src/core/Core.js:474-485](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L474-L485 "Source code on GitHub")
-
-Uninstall and remove a plugin.
-
-**Parameters**
-
--   `instance` **[Plugin](#plugin)** The plugin instance to remove.
-
-### close
-
-[src/core/Core.js:490-498](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L490-L498 "Source code on GitHub")
-
-Uninstall all plugins and close down this Uppy instance.
-
-### log
-
-[src/core/Core.js:505-520](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L505-L520 "Source code on GitHub")
-
-Logs stuff to console, only if `debug` is set to true. Silent in production.
-
-**Parameters**
-
--   `msg`  
--   `type`  
-
-Returns **([String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) \| [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object))** to log
-
-### run
-
-[src/core/Core.js:542-556](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Core.js#L542-L556 "Source code on GitHub")
-
-Initializes actions, installs all plugins (by iterating on them and calling `install`), sets options
-
-## Plugin
-
-[src/plugins/Plugin.js:14-119](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Plugin.js#L14-L119 "Source code on GitHub")
-
-Boilerplate that all Plugins share - and should not be used
-directly. It also shows which methods final plugins should implement/override,
-this deciding on structure.
-
-**Parameters**
-
--   `main` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Uppy core object
--   `object` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** with plugin options
-
-Returns **([array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array) \| [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String))** files or success/fail message
-
-### mount
-
-[src/plugins/Plugin.js:70-100](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Plugin.js#L70-L100 "Source code on GitHub")
-
-Check if supplied `target` is a DOM element or an `object`.
-If it’s an object — target is a plugin, and we search `plugins`
-for a plugin with same name and return its target.
-
-**Parameters**
-
--   `target` **([String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String) \| [Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object))** 
--   `plugin`  
-
-## Utils
-
-[src/plugins/Dashboard/index.js:15-463](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Dashboard/index.js#L15-L463 "Source code on GitHub")
-
-**Extends Plugin**
-
-Modal Dialog & Dashboard
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/core/Utils.js:14-16](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L14-L16 "Source code on GitHub")
-
-A collection of small utility functions that help with dom manipulation, adding listeners,
-promises and other good things.
-
-**Parameters**
-
--   `arr`  
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/generic-provider-views/index.js:38-351](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L38-L351 "Source code on GitHub")
-
-Class to easily generate generic views for plugins
-
-This class expects the plugin using to have the following attributes
-
-stateId {String} object key of which the plugin state is stored
-
-This class also expects the plugin instance using it to have the following
-accessor methods.
-Each method takes the item whose property is to be accessed
-as a param
-
-isFolder
-
-Returns **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** for if the item is a folder or not
-getItemData
-
-Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** that is format ready for uppy upload/download
-getItemIcon
-
-Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** html instance of the item's icon
-getItemSubList
-
-Returns **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)** sub-items in the item. e.g a folder may contain sub-items
-getItemName
-
-Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** display friendly name of the item
-getMimeType
-
-Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** mime type of the item
-getItemId
-
-Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** unique id of the item
-getItemRequestPath
-
-Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** unique request path of the item when making calls to uppy server
-getItemModifiedDate
-
-Returns **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** or {String} date of when last the item was modified
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/plugins/Webcam/index.js:13-233](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L13-L233 "Source code on GitHub")
-
-**Extends Plugin**
-
-Webcam
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/uppy-base/src/plugins/Webcam.js:8-336](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L8-L336 "Source code on GitHub")
-
-Webcam Plugin
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/plugins/Tus10.js:29-383](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L29-L383 "Source code on GitHub")
-
-**Extends Plugin**
-
-Tus resumable file uploader
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/plugins/Transloadit/index.js:8-241](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/index.js#L8-L241 "Source code on GitHub")
-
-**Extends Plugin**
-
-Upload files to Transloadit using Tus.
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/plugins/Transloadit/Client.js:4-57](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L4-L57 "Source code on GitHub")
-
-A Barebones HTTP API client for Transloadit.
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Utils
-
-[src/plugins/Transloadit/Socket.js:8-60](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Socket.js#L8-L60 "Source code on GitHub")
-
-WebSocket status API client for Transloadit.
-
-### constructor
-
-[src/generic-provider-views/index.js:42-63](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L42-L63 "Source code on GitHub")
-
-**Parameters**
-
--   `instance` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** of the plugin
--   `plugin`  
-
-### updateState
-
-[src/generic-provider-views/index.js:68-73](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L68-L73 "Source code on GitHub")
-
-Little shorthand to update the state with the plugin's state
-
-**Parameters**
-
--   `newState`  
-
-### updateState
-
-[src/plugins/Webcam/index.js:227-232](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Webcam/index.js#L227-L232 "Source code on GitHub")
-
-Little shorthand to update the state with my new state
-
-**Parameters**
-
--   `newState`  
-
-### getFolder
-
-[src/generic-provider-views/index.js:80-111](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L80-L111 "Source code on GitHub")
-
-Based on folder ID, fetch a new folder and update it to state
-
-**Parameters**
-
--   `id` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder id
--   `name`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** Folders/files in folder
-
-### getNextFolder
-
-[src/generic-provider-views/index.js:118-121](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L118-L121 "Source code on GitHub")
-
-Fetches new folder
-
-**Parameters**
-
--   `Folder` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `title` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Folder title
--   `folder`  
-
-### logout
-
-[src/generic-provider-views/index.js:152-166](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L152-L166 "Source code on GitHub")
-
-Removes session token on client side.
-
-### handleRowClick
-
-[src/generic-provider-views/index.js:172-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/generic-provider-views/index.js#L172-L179 "Source code on GitHub")
-
-Used to set active file/folder.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Active file/folder
-
-### init
-
-[src/uppy-base/src/plugins/Webcam.js:61-78](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L61-L78 "Source code on GitHub")
-
-Checks for getUserMedia support
-
-### detectFlash
-
-[src/uppy-base/src/plugins/Webcam.js:138-162](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L138-L162 "Source code on GitHub")
-
-Detects if browser supports flash
-Code snippet borrowed from: <https://github.com/swfobject/swfobject>
-
-Returns **bool** flash supported
-
-### stop
-
-[src/uppy-base/src/plugins/Webcam.js:247-264](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L247-L264 "Source code on GitHub")
-
-Stops the webcam capture and video playback.
-
-### getImage
-
-[src/uppy-base/src/plugins/Webcam.js:300-317](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/uppy-base/src/plugins/Webcam.js#L300-L317 "Source code on GitHub")
-
-Takes a snapshot and displays it in a canvas.
-
-**Parameters**
-
--   `video`  
--   `opts`  
-
-### upload
-
-[src/plugins/Tus10.js:114-187](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Tus10.js#L114-L187 "Source code on GitHub")
-
-Create a new Tus upload
-
-**Parameters**
-
--   `file` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** for use with upload
--   `current` **integer** file in a queue
--   `total` **integer** number of files in a queue
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-### createAssembly
-
-[src/plugins/Transloadit/Client.js:15-46](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L15-L46 "Source code on GitHub")
-
-Create a new assembly.
-
-**Parameters**
-
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
--   `$0` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-    -   `$0.templateId`  
-    -   `$0.params`  
-    -   `$0.fields`  
-    -   `$0.signature`  
-    -   `$0.expectedFiles`  
-
-### getAssemblyStatus
-
-[src/plugins/Transloadit/Client.js:53-56](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Transloadit/Client.js#L53-L56 "Source code on GitHub")
-
-Get the current status for an assembly.
-
-**Parameters**
-
--   `url` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** The status endpoint of the assembly.
-
-## Dummy
-
-[src/plugins/Dummy.js:9-67](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Dummy.js#L9-L67 "Source code on GitHub")
-
-**Extends Plugin**
-
-Dummy
-A test plugin, does nothing useful
-
-## index
-
-[src/plugins/DragDrop/index.js:11-179](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/DragDrop/index.js#L11-L179 "Source code on GitHub")
-
-**Extends Plugin**
-
-Drag & Drop plugin
-
-### checkDragDropSupport
-
-[src/plugins/DragDrop/index.js:67-83](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/DragDrop/index.js#L67-L83 "Source code on GitHub")
-
-Checks if the browser supports Drag & Drop (not supported on mobile devices, for example).
-
-Returns **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** true if supported, false otherwise
-
-## flatten
-
-[src/core/Utils.js:14-16](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L14-L16 "Source code on GitHub")
-
-Shallow flatten nested arrays.
-
-**Parameters**
-
--   `arr`  
-
-## groupBy
-
-[src/core/Utils.js:73-81](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L73-L81 "Source code on GitHub")
-
-Partition array by a grouping function.
-
-**Parameters**
-
--   `array` **\[type]** Input array
--   `groupingFn` **\[type]** Grouping function
-
-Returns **\[type]** Array of arrays
-
-## every
-
-[src/core/Utils.js:89-97](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L89-L97 "Source code on GitHub")
-
-Tests if every array element passes predicate
-
-**Parameters**
-
--   `array` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)** Input array
--   `predicateFn` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Predicate
-
-Returns **bool** Every element pass
-
-## toArray
-
-[src/core/Utils.js:102-104](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L102-L104 "Source code on GitHub")
-
-Converts list into array
-
-**Parameters**
-
--   `list`  
-
-## generateFileID
-
-[src/core/Utils.js:113-118](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L113-L118 "Source code on GitHub")
-
-Takes a fileName and turns it into fileID, by converting to lowercase,
-removing extra characters and adding unix timestamp
-
-**Parameters**
-
--   `fileName` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-
-## getProportionalImageHeight
-
-[src/core/Utils.js:138-142](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L138-L142 "Source code on GitHub")
-
-Takes function or class, returns its name.
-Because IE doesn’t support `constructor.name`.
-<https://gist.github.com/dfkaye/6384439>, <http://stackoverflow.com/a/15714445>
-
-**Parameters**
-
--   `fn` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** — function
--   `img`  
--   `newWidth`  
-
-## readFile
-
-[src/core/Utils.js:182-212](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L182-L212 "Source code on GitHub")
-
-Reads file as data URI from file object,
-the one you get from input[type=file] or drag & drop.
-
-**Parameters**
-
--   `file` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** object
--   `fileObj`  
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** dataURL of the file
-
-## createImageThumbnail
-
-[src/core/Utils.js:224-256](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L224-L256 "Source code on GitHub")
-
-Resizes an image to specified width and proportional height, using canvas
-See <https://davidwalsh.name/resize-image-canvas>,
-<http://babalan.com/resizing-images-with-javascript/>
-
-**Parameters**
-
--   `Data` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** URI of the original image
--   `width` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** of the resulting image
--   `imgDataURI`  
--   `newWidth`  
-
-Returns **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** Data URI of the resized image
-
-## copyToClipboard
-
-[src/core/Utils.js:303-343](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L303-L343 "Source code on GitHub")
-
-Copies text to clipboard by creating an almost invisible textarea,
-adding text there, then running execCommand('copy').
-Falls back to prompt() when the easy way fails (hello, Safari!)
-From <http://stackoverflow.com/a/30810322>
-
-**Parameters**
-
--   `textToCopy` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
--   `fallbackString` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
-
-Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)** 
-
-## isDOMElement
-
-[src/core/Utils.js:426-428](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L426-L428 "Source code on GitHub")
-
-Check if an object is a DOM element. Duck-typing based on `nodeType`.
-
-**Parameters**
-
--   `obj` **Any** 
-
-## findDOMElement
-
-[src/core/Utils.js:436-444](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Utils.js#L436-L444 "Source code on GitHub")
-
-Find a DOM element.
-
-**Parameters**
-
--   `element` **([Node](https://developer.mozilla.org/en-US/docs/Web/API/Node/nextSibling) \| [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String))** 
-
-Returns **([Node](https://developer.mozilla.org/en-US/docs/Web/API/Node/nextSibling) | null)** 
-
-## Translator
-
-[src/core/Translator.js:14-86](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Translator.js#L14-L86 "Source code on GitHub")
-
-Translates strings with interpolation & pluralization support.
-Extensible with custom dictionaries and pluralization functions.
-
-Borrows heavily from and inspired by Polyglot <https://github.com/airbnb/polyglot.js>,
-basically a stripped-down version of it. Differences: pluralization functions are not hardcoded
-and can be easily added among with dictionaries, nested objects are used for pluralization
-as opposed to `||||` delimeter
-
-Usage example: `translator.translate('files_chosen', {smart_count: 3})`
-
-**Parameters**
-
--   `opts` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** 
-
-### interpolate
-
-[src/core/Translator.js:48-69](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Translator.js#L48-L69 "Source code on GitHub")
-
-Takes a string with placeholder variables like `%{smart_count} file selected`
-and replaces it with values from options `{smart_count: 5}`
-
-**Parameters**
-
--   `phrase` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** that needs interpolation, with placeholders
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** with values that will be used to replace placeholders
-
-Returns **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** interpolated
-
-**Meta**
-
--   **license**: https&#x3A;//github.com/airbnb/polyglot.js/blob/master/LICENSE
-    taken from https&#x3A;//github.com/airbnb/polyglot.js/blob/master/lib/polyglot.js#L299
-
-### translate
-
-[src/core/Translator.js:78-85](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/core/Translator.js#L78-L85 "Source code on GitHub")
-
-Public translate method
-
-**Parameters**
-
--   `key` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** 
--   `options` **[object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** with values that will be used later to replace placeholders in string
-
-Returns **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** translated (and interpolated)
-
-## ProgressBar
-
-[src/plugins/ProgressBar.js:8-45](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/ProgressBar.js#L8-L45 "Source code on GitHub")
-
-**Extends Plugin**
-
-Progress bar
-
-## Informer
-
-[src/plugins/Informer.js:11-120](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/Informer.js#L11-L120 "Source code on GitHub")
-
-**Extends Plugin**
-
-Informer
-Shows rad message bubbles
-used like this: `bus.emit('informer', 'hello world', 'info', 5000)`
-or for errors: `bus.emit('informer', 'Error uploading img.jpg', 'error', 5000)`
-
-## MetaData
-
-[src/plugins/MetaData.js:8-51](https://github.com/transloadit/uppy/blob/dc65688b4891c1227374a436217fd1928b522d00/src/plugins/MetaData.js#L8-L51 "Source code on GitHub")
-
-**Extends Plugin**
-
-Meta Data
-Adds metadata fields to Uppy

+ 0 - 75
website/src/api/index.md

@@ -1,75 +0,0 @@
----
-type: api
-order: 0
-title: "API"
-permalink: api/
----
-
-*Work in progress, API not stable. Last update: 2016-10-21*
-
-## The Gist
-
-{% include_code lang:js ../api-usage-example.ejs %}
-
-## Methods
-
-### `uppy.use(plugin)`
-
-``` javascript
-uppy.use(DragDrop)
-```
-
-### `uppy.run()`
-
-Initializes everything after setup.
-
-### uppy.on('event', action)
-
-Subscribe to an event.
-
-## Events
-
-Uppy exposes events that you can subscribe to in your app:
-
-### core:upload-progress
-
-Fired each time file upload progress is available, `data` object looks like this:
-
-```javascript
-data = {
-  id: myimg12321323,
-  bytesUploaded: 2323254,
-  bytesTotal
-}
-```
-
-```javascript
-uppy.on('core:upload-progress', (data) => {
-  console.log(data.id, data.bytesUploaded, data.bytesTotal)
-})
-```
-
-### `core:upload-success`
-
-Fired when single upload is complete.
-
-``` javascript
-uppy.on('core:upload-success', (fileId, url) => {
-  console.log(url)
-  var img = new Image()
-  img.width = 300
-  img.alt = fileId
-  img.src = url
-  document.body.appendChild(img)
-})
-```
-
-### `core:success`
-
-Fired when all uploads are complete.
-
-``` javascript
-uppy.on('core:success', (fileCount) => {
-  console.log(fileCount)
-})
-```

+ 9 - 8
website/src/api/architecture.md → website/src/docs/architecture.md

@@ -1,23 +1,24 @@
 ---
 type: api
-order: 0
+order: 10
 title: "Architecture"
-permalink: api/architecture
+permalink: api/architecture/
+published: false
 ---
 
-Uppy has a lean [Core](https://github.com/transloadit/uppy/blob/master/src/core/Core.js) module and [Plugins](https://github.com/transloadit/uppy/tree/master/src/plugins) (see simple [Input](https://github.com/transloadit/uppy/blob/master/src/plugins/Formtag.js) as an example) that extend its functionality. Here’s how it’s currently used:
+Uppy file uploader consists of a lean [Core](https://github.com/transloadit/uppy/blob/master/src/core/Core.js) module and [Plugins](https://github.com/transloadit/uppy/tree/master/src/plugins) (see simple [Input](https://github.com/transloadit/uppy/blob/master/src/plugins/Formtag.js) as an example) that extend it’s functionality. Like this:
 
 {% include_code lang:js ../api-usage-example.ejs %}
 
 ## Core
 
-Core module orchestrates everything in Uppy. Plugins are added to it via `.use(Plugin, opts)` API, like `.use(DragDrop, {target: 'body'})`. Core instantiates plugins with `new Plugin(this, opts)`, passing options to them, then places them in `plugins` object, nested by type: `uploader`, `progressindicator`, `acquirer`, etc.
+1. Core module orchestrates Uppy plugins, stores `state` with `files`, and exposes useful methods like `addFile`, `setState`, `upload` to the user and plugins. Plugins are added to Uppy with `.use(Plugin, opts)` API, like so: `.use(DragDrop, {target: 'body'})`. 
 
-Core then iterates over `plugins` object and calls `install` on each plugin. In its `install` method a plugin can extend global state with its state, set event listeners to react to events happening in Uppy (upload progress, file has been removed), or do anything else needed on init.
+2. Internally Core then instantiates plugins via `new Plugin(this, opts)`, passing options to them, then places them in `plugins` object, nested by type: `uploader`, `progressindicator`, `acquirer`, etc. Core then iterates over `plugins` and calls `install` on each of them. In it’s `install` method a plugin can set event listeners to react to things happening in Uppy (upload progress, file was removed), or do anything else needed on init.
 
-Each time `state` is updated with `setState(stateAddition)`, Core runs `updateAll()` that re-renders all of the plugins (components) that have been mounted in the dom somewhere, using the new state.
+3. Each time `state` is updated with `setState(statePatch)`, Core runs `updateAll()` method that re-renders all of the view plugins (components) that have been mounted in the DOM somewhere, passing the new state to each of them.
 
-Core is very lean (at least should be), and acts as a glue that ties together all the plugins, shared data and functionality together. It keeps `state` with `files`, `capabilities`, plus exposes a few methods that are called by plugins to update state — adding files, adding preview Thumbnails to images, updating progress for each file and total progress, etc.
+Core is very lean (at least we try to keep it sobe), and acts as a glue that ties together all the plugins, shared data and functionality together. It keeps `state` with `files`, `capabilities`, plus exposes a few methods that are called by plugins to update state — adding files, adding preview thumbnails to images, updating progress for each file and total progress, etc.
 
 *Comment: There is a discussion that these methods could in theory all live in Utils or be standalone modules used by plugins and the user directly, see https://github.com/transloadit/uppy/issues/116#issuecomment-247695921.*
 
@@ -64,7 +65,7 @@ Logs stuff to console only if user specified `debug: true`, silent in production
 
 An event emitter embedded into Core that is passed to Plugins, and can be used directly on the instance. Used by Plugins for communicating with other Plugins and Core.
 
-For example:
+## Events
 
 - Core listens for `core:upload-progress` event and calculates speed & ETA for all files currently in progress. *Uploader plugins could just call core.updateProgress().*
 - Core checks if browser in offline or online and emits `core:is-offline` or `core:is-online` that other plugins can listen to.

+ 170 - 0
website/src/docs/aws-s3.md

@@ -0,0 +1,170 @@
+---
+type: docs
+order: 10
+title: "AwsS3"
+permalink: docs/aws-s3/
+---
+
+The `AwsS3` plugin can be used to upload files directly to an S3 bucket.
+
+As of now, the `AwsS3` plugin "decorates" the XHRUpload plugin.
+To upload files directly to S3, both the XHRUpload and AwsS3 plugins must be used:
+
+```js
+// No options have to be provided to the XHRUpload plugin,
+// the S3 plugin will configure it.
+uppy.use(XHRUpload)
+uppy.use(AwsS3, {
+  // Options for S3
+})
+```
+
+## Options
+
+### `host`
+
+When using [uppy-server][uppy-server docs] to sign S3 uploads, set this option to the root URL of the uppy-server.
+
+```js
+uppy.use(XHRUpload)
+uppy.use(AwsS3, {
+  host: 'https://uppy-server.my-app.com/'
+})
+```
+
+### `getUploadParameters(file)`
+
+> Note: When using [uppy-server][uppy-server docs] to sign S3 uploads, do not define this option.
+
+A function returning upload parameters for a file.
+Parameters should be returned as an object, or a Promise for an object, with keys `{ method, url, fields }`.
+
+The `method` field is the HTTP method to use for the upload.
+This should be one of `PUT` or `POST`, depending on the type of upload used.
+
+The `url` field is the URL to send the upload request to.
+When using a presigned PUT upload, this should be the URL to the S3 object including signing parameters in the query string.
+When using a POST upload with a policy document, this should be the root URL of the bucket.
+
+The `fields` field is an object with form fields to send along with the upload request.
+For presigned PUT uploads, this should be empty.
+
+## S3 Bucket configuration
+
+S3 buckets do not allow public uploads by default.
+In order to allow Uppy to upload to a bucket directly, its CORS permissions need to be configured.
+
+CORS permissions can be found in the [S3 Management Console](https://console.aws.amazon.com/s3/home).
+Click the bucket that will receive the uploads, then go into the "Permissions" tab and select the "CORS configuration" button.
+An XML document will be shown that contains the CORS configuration.
+
+Good practice is to use two CORS rules: one for viewing the uploaded files, and one for uploading files.
+
+Depending on which settings were enabled during bucket creation, AWS S3 may have defined a CORS rule that allows public reading already.
+This rule looks like:
+
+```xml
+<CORSRule>
+  <AllowedOrigin>*</AllowedOrigin>
+  <AllowedMethod>GET</AllowedMethod>
+  <MaxAgeSeconds>3000</MaxAgeSeconds>
+</CORSRule>
+```
+
+If uploaded files should be publically viewable, but a rule like this is not present, add it.
+
+A different `<CORSRule>` is necessary to allow uploading.
+This rule should come _before_ the existing rule, because S3 only uses the first rule that matches the origin of the request.
+
+At minimum, the domain from which the uploads will happen must be whitelisted, and the definitions from the previous rule must be added:
+
+```xml
+<AllowedOrigin>https://my-app.com</AllowedOrigin>
+<AllowedMethod>GET</AllowedMethod>
+<MaxAgeSeconds>3000</MaxAgeSeconds>
+```
+
+When using uppy-server, which generates a POST policy document, the following permissions must be granted:
+
+```xml
+<AllowedMethod>POST</AllowedMethod>
+<AllowedHeader>Authorization</AllowedHeader>
+<AllowedHeader>x-amz-date</AllowedHeader>
+<AllowedHeader>x-amz-content-sha256</AllowedHeader>
+<AllowedHeader>content-type</AllowedHeader>
+```
+
+When using a presigned upload URL, the following permissions must be granted:
+
+```xml
+<AllowedMethod>PUT</AllowedMethod>
+```
+
+The final configuration should look something like the below:
+
+```xml
+<?xml version="1.0" encoding="UTF-8"?>
+<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
+  <CORSRule>
+    <AllowedOrigin>https://my-app.com</AllowedOrigin>
+    <AllowedMethod>GET</AllowedMethod>
+    <AllowedMethod>POST</AllowedMethod>
+    <MaxAgeSeconds>3000</MaxAgeSeconds>
+    <AllowedHeader>Authorization</AllowedHeader>
+    <AllowedHeader>x-amz-date</AllowedHeader>
+    <AllowedHeader>x-amz-content-sha256</AllowedHeader>
+    <AllowedHeader>content-type</AllowedHeader>
+  </CORSRule>
+  <CORSRule>
+    <AllowedOrigin>*</AllowedOrigin>
+    <AllowedMethod>GET</AllowedMethod>
+    <MaxAgeSeconds>3000</MaxAgeSeconds>
+  </CORSRule>
+</CORSConfiguration>
+```
+
+In-depth documentation about CORS rules is available on the [AWS documentation site](https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html).
+
+## Examples
+
+### Generating a presigned upload URL server-side
+
+The `getUploadParameters` function can return a Promise, so upload parameters can be prepared server-side.
+That way, no private keys to the S3 bucket need to be shared on the client.
+For example, there could be a PHP server endpoint that prepares a presigned URL for a file:
+
+```js
+uppy
+  .use(XHRUpload)
+  .use(AwsS3, {
+    getUploadParameters (file) {
+      // Send a request to our PHP signing endpoint.
+      return fetch('/s3-sign.php', {
+        method: 'post',
+        // Send and receive JSON.
+        headers: {
+          accept: 'application/json',
+          'content-type': 'application/json'
+        },
+        body: JSON.stringify({
+          filename: file.name,
+          contentType: `${file.type.general}/${file.type.specific}`
+        })
+      }).then((response) => {
+        // Parse the JSON response.
+        return response.json()
+      }).then((data) => {
+        // Return an object in the correct shape.
+        return {
+          method: data.method,
+          url: data.url,
+          fields: {}
+        }
+      })
+    }
+  })
+```
+
+See the [aws-presigned-url example in the uppy repository](https://github.com/transloadit/uppy/tree/master/examples/aws-presigned-url) for a small example that implements both the server-side and the client-side.
+
+[uppy-server docs]: /docs/server/index.html

+ 91 - 0
website/src/docs/dashboard.md

@@ -0,0 +1,91 @@
+---
+type: docs
+order: 6
+title: "Dashboard"
+permalink: docs/dashboard/
+---
+
+Dashboard is a universal UI plugin for Uppy:
+
+- Drag and Drop, paste, select from local disk / my device
+- UI for Webcam and remote sources: Google Drive, Dropbox, Instagram (all optional, added via plugins)
+- File previews and info, metadata editor
+- Progress: total and for individual files
+- Ability to pause/resume or cancel (depending on uploader plugin) individual or all files
+
+[Try it live](/examples/dashboard/)
+
+## Options
+
+```js
+uppy.use(Dashboard, {
+  target: 'body',
+  getMetaFromForm: true,
+  inline: false,
+  width: 750,
+  height: 550,
+  note: false,
+  disableStatusBar: false,
+  disableInformer: false,
+  locale: {
+    strings: {
+      selectToUpload: 'Select files to upload',
+      closeModal: 'Close Modal',
+      upload: 'Upload',
+      importFrom: 'Import files from',
+      dashboardWindowTitle: 'Uppy Dashboard Window (Press escape to close)',
+      dashboardTitle: 'Uppy Dashboard',
+      copyLinkToClipboardSuccess: 'Link copied to clipboard.',
+      copyLinkToClipboardFallback: 'Copy the URL below',
+      done: 'Done',
+      localDisk: 'Local Disk',
+      dropPasteImport: 'Drop files here, paste, import from one of the locations above or',
+      dropPaste: 'Drop files here, paste or',
+      browse: 'browse',
+      fileProgress: 'File progress: upload speed and ETA',
+      numberOfSelectedFiles: 'Number of selected files',
+      uploadAllNewFiles: 'Upload all new files'
+    }
+  }
+})
+```
+
+### `target: 'body'`
+
+Dashboard is rendered into `body` by default, because by default it’s hidden and only opened as a modal when `trigger` is clicked.
+
+### `inline: false`
+
+By default Dashboard will be rendered as a modal, which is opened via clicking on `trigger`. If `inline: true`, Dashboard will be rendered into `target` and fit right in.
+
+### `trigger: '#uppy-select-files'`
+
+String with a CSS selector for a button that will trigger opening Dashboard modal.
+
+### `width: 750`
+
+Maximum width of the Dashboard in pixels. Used when `inline: true`.
+
+### `height: 750`
+
+Maximum height of the Dashboard in pixels. Used when `inline: true`.
+
+### `note: false`
+
+Optinally specify a string of text that explains something about the upload for the user. This is a place to explain `restrictions` that are put in place. For example: `'Images and video only, 2–3 files, up to 1 MB'`.
+
+### `disableStatusBar: false`
+
+Dashboard ships with `StatusBar` plugin that shows upload progress and pause/resume/cancel buttons. If you want, you can disable the StatusBar to provide your custom solution.
+
+### `disableInformer: false`
+
+Dashboard ships with `Informer` plugin that notifies when the browser is offline, or when it’s time to smile if `Webcam` is taking a picture. If you want, you can disable the Informer and/or provide your custom solution.
+
+### `getMetaFromForm: true`
+
+See [general plugin options](/docs/plugins).
+
+### `locale`
+
+See [general plugin options](/docs/plugins).

+ 37 - 0
website/src/docs/dragdrop.md

@@ -0,0 +1,37 @@
+---
+type: docs
+order: 7
+title: "DragDrop"
+permalink: docs/dragdrop/
+---
+
+DragDrop renders a simple Drag and Drop area for file selection. Useful when you only want local device as a file source, don’t need file previews and metadata editing UI, and the [Dashboard](/docs/dashboard/) feels like an overkill.
+
+[Try it live](/examples/dragdrop/)
+
+## Options
+
+```js
+uppy.use(DragDrop, {
+  target: '.UppyDragDrop',
+  getMetaFromForm: true,
+  locale: {
+    strings: {
+      chooseFile: 'Choose a file',
+      orDragDrop: 'or drop it here',
+      upload: 'Upload',
+      selectedFiles: {
+        0: '%{smart_count} file selected',
+        1: '%{smart_count} files selected'
+      }
+    }
+  }
+})
+```
+
+### `target: '.UppyDragDrop'`
+
+### `getMetaFromForm: true`
+
+### `locale`
+

+ 45 - 0
website/src/docs/golder-retriever.md

@@ -0,0 +1,45 @@
+---
+title: "Golden Retriever"
+type: docs
+permalink: docs/golden-retriever/
+order: 15
+---
+
+Golden Retriever plugin saves selected files in your browser cache (Local Storage for metadata, then Service Worker for all blobs + IndexedDB for small blobs), so that if the browser crashes, Uppy can restore everything and continue uploading like nothing happened. Read more about it [on the blog](https://uppy.io/blog/2017/07/golden-retriever/).
+
+1\. Bundle your own service worker `sw.js` file with Uppy Golden Retriever’s service worker. If you’re using Browserify, just bundle it separately, for Webpack there is a plugin [serviceworker-webpack-plugin](https://github.com/oliviertassinari/serviceworker-webpack-plugin).
+
+```js
+// sw.js
+
+require('uppy/lib/GoldenRetriever/ServiceWorker.js')
+```
+
+2\. Register it in your app entry point:
+
+```js
+// you app.js entry point
+
+uppy.use(RestoreFiles, {serviceWorker: true})
+uppy.run()
+
+const isServiceWorkerControllerReady = new Promise(resolve => {
+  if (navigator.serviceWorker.controller) return resolve()
+  navigator.serviceWorker.addEventListener('controllerchange', e => resolve())
+})
+
+if ('serviceWorker' in navigator) {
+  navigator.serviceWorker
+    .register('/sw.js') // path to your bundled service worker with Golden Retriever service worker
+    .then((registration) => {
+      console.log('ServiceWorker registration successful with scope: ', registration.scope)
+      return isServiceWorkerControllerReady
+    })
+    .then(() => {
+      uppy.emit('core:file-sw-ready')
+    })
+    .catch((error) => {
+      console.log('Registration failed with ' + error)
+    })
+}
+```

+ 8 - 0
website/src/docs/how-to-plugin.md

@@ -0,0 +1,8 @@
+---
+title: "How To Make A Plugin"
+permalink: docs/how-to-plugin/
+order: 20
+published: false
+---
+
+There are a few useful Uppy plugins out there, but there might come a time when you’ll want to build your own. This document will guide you.

+ 83 - 0
website/src/docs/index.md

@@ -0,0 +1,83 @@
+---
+title: "Getting Started"
+type: docs
+permalink: docs/
+order: 0
+---
+
+Uppy is a sleek, modular file uploader that integrates seemlessly with any framework. It fetches files from local disk, Google Drive, Dropbox, Instagram, remote URLs, cameras and other exciting locations, and then uploads them to the final destination. It’s fast, easy to use and let's you worry about more important problems than building a file uploader.
+
+Uppy consists of a core module and [various plugins](/docs/plugins/) for selecting, manipulating and uploading files. Here’s how it works:
+
+```js
+const Uppy = require('uppy/lib/core')
+const Dashboard = require('uppy/lib/plugins/Dashboard')
+const Tus10 = require('uppy/lib/plugins/Tus10')
+const uppy = Uppy({ autoProceed: false })
+  .use(Dashboard, {
+    trigger: '#select-files', 
+    replaceTargetContent: true
+  })
+  .use(Tus10, {endpoint: '//master.tus.io/files/'})
+  .run()
+uppy.on('core:success', (files) => {
+  console.log(`Upload complete! We’ve uploaded these files: ${files}`)
+})
+```
+
+[Try it live](/examples/dashboard/)
+
+Drag and Drop, Webcam, basic file manipulation (adding metadata), uploading via tus resumable uploads or XHR/Multipart is all possible using just the uppy client module. 
+
+Adding [Uppy Server](/docs/server/) to the mix enables remote sources, such as Instagram, Google Drive and Dropbox. Uploads from remote sources are handled server-to-serber,(so a 5 GB video won’t be eating into your mobile data plan. Files are removed from Uppy Server after an upload is complete, or after a reasonable timeout. Access tokens also don’t stick around for long, for security reasons.
+
+## Installation
+
+``` bash
+$ npm install uppy
+```
+
+We recommend installing from NPM and then using a module bundler such as [Webpack](http://webpack.github.io/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/). 
+
+If you like, you can also use a pre-built bundle, for example from [unpkg CDN](https://unpkg.com/uppy/). In that case `Uppy` will attach itself to the global `window.Uppy` object. 
+
+> ⚠️ The bundle currently consists of most Uppy plugins, so this method is not  recommended for production, as your users will have to download all plugins, even if you are using just a few.
+
+1\. Add a script to the bottom of `<body>`:
+
+``` html
+<script src="https://unpkg.com/uppy/dist/uppy.min.js"></script>
+```
+
+2\. Add CSS to `<head>`:
+``` html
+<link href="https://unpkg.com/uppy/dist/uppy.min.css" rel="stylesheet">
+```
+
+3\. Initialize:
+
+``` html
+<script>
+  var uppy = Uppy.Core()
+  uppy.use(Uppy.DragDrop, {target: '.UppyDragDrop'})
+  uppy.use(Uppy.Tus10, {endpoint: '//master.tus.io/files/'})
+  uppy.run()
+</script>
+```
+
+## Documentation
+
+- [Uppy](/docs/uppy/) — full list of options, methods and events.
+- [Plugins](/docs/plugins/) — list of Uppy plugins and their options.
+- [Server](/docs/server/) — setting up and running an uppy-server instance, which adds support for Instagram, Dropbox, Google Drive and other remote sources.
+- Architecture & Making a Plugin — how to write a plugin for Uppy [documentation in progress].
+
+## Browser Support
+
+<a href="https://saucelabs.com/u/transloadit-uppy">
+  <img src="https://saucelabs.com/browser-matrix/transloadit-uppy.svg" alt="Sauce Test Status"/>
+</a>
+
+Note: we aim to support IE10+ and recent versions of Safari, Edge, Chrome, Firefox and Opera. IE6 on the chart above means we recommend setting Uppy to target a `<form>` element, so when Uppy has not yet loaded or is not supported, upload still works. Even on the refrigerator browser. Or, yes, IE6.

+ 147 - 0
website/src/docs/plugins.md

@@ -0,0 +1,147 @@
+---
+title: "Plugins"
+type: docs
+permalink: docs/plugins/
+order: 2
+---
+
+Plugins are what makes Uppy useful: they help select, manipulate and upload files.
+
+- **Acquirers (neat UIs for picking files):** 
+  - [Dashboard](/docs/dashboard) — full featured sleek UI with file previews, metadata editing, upload/pause/resume/cancel buttons and more
+  - [DragDrop](/docs/dragdrop) — plain and simple drag and drop area
+  - FileInput — even more plain and simple, just a button
+  - [Provider Plugins](#Provider-Plugins) (remote sources that work through [Uppy Server](/docs/uppy-server/)): Instagram, GoogleDrive, Dropbox
+- **Uploaders:** Tus10, XHRUpload, S3
+- **Progress:** ProgressBar, StatusBar, Informer
+- **Helpers:** GoldenRetriever
+
+## Common Options
+
+Each plugin can have any number of options (please see specific plugin for details), but these are shared between some:
+
+### `target`
+
+Can be a `string` or an `object`, referencing another plugin. Consider the following example, where `DragDrop` plugin will be rendered into a `body` element:
+
+```js
+const Uppy = require('uppy/lib/core')
+const DragDrop = require('uppy/lib/plugins/DragDrop')
+const uppy = Uppy()
+uppy.use(DragDrop, {target: 'body'})
+```
+
+While in this one, we are using the `Dashboard` plugin, which can act as a host target for other plugins:
+
+```js
+const Uppy = require('uppy/lib/core')
+const DragDrop = require('uppy/lib/plugins/Dashboard')
+const GoogleDrive = require('uppy/lib/plugins/GoogleDrive')
+const uppy = Uppy()
+uppy.use(Dashboard, {
+  trigger: '#uppyModalOpener',
+  target: '#uppy',
+})
+uppy.use(GoogleDrive, {target: Dashboard})
+```
+
+In the example above the `Dashboard` gets rendered into an element with ID `uppy`, while `GoogleDrive` is rendered into the `Dashboard` itself.
+
+### `endpoint`
+
+Used by uploader plugins, such as Tus and XHRUpload. Expects a `string` with a url that will be used for file uploading.
+
+### `host`
+
+Used by remote provider plugins, such as Google Drive, Instagram or Dropbox. Specifies the url to your running `uppy-server`. This allows uppy to know what server to connect to when server related operations are required by the provider plugin.
+
+```js
+// for Google Drive
+const GoogleDrive = require('uppy/lib/plugins/GoogleDrive')
+uppy.use(GoogleDrive, {target: Dashboard, host: 'http://localhost:3020'})
+```
+
+### `setMetaFromTargetForm`
+
+If `setMetaFromTargetForm === true`, UI acquire type plugins, like Dashboard, FileInput and DragDrop, before mounting themselves or doing anything else, will extract FormData
+from the target `<form>` element (it must be a form currently), and merge the object with the global `uppy.state.meta`.
+
+If you have a form like this one:
+
+```html
+<form class="MyForm" action="/">
+  <input type="file" />
+  <input type="hidden" name="bla" value="12333">
+  <input type="text" name="yo" value="1">
+  <button type="submit">Upload</button>
+</form>
+```
+
+And then do:
+
+```js
+uppy.use(DragDrop, {
+  target: '.MyForm',
+  setMetaFromTargetForm: true
+})
+```
+
+Uppy’s `uppy.state.meta` will become:
+
+```js
+state = {
+  meta: {
+    bla: 12333,
+    yo: 1
+  }
+}
+```
+
+### `replaceTargetContent: false`
+
+By default Uppy will append any UI to a DOM element, if such element is specified as a `target`. This default is the least dangerous option. However, you might want to provide fallback `<form>` with `<button type="submit">` that will be shown if Uppy or JavaScript in not loaded/supported on the page. Set `replaceTargetContent: true` to clear the `target` before appending, that way all your fallback elements will be removed if Uppy is actually functioning.
+
+### `locale: {}`
+
+Same as with Uppy.Core’s setting from above, this allows you to override plugin’s local string, so that instead of `Select files` in English, your users will see `Выберите файлы` in Russian. Example:
+
+```js
+.use(FileInput, {
+  target: 'body', 
+  locale: {
+    strings: { selectToUpload: 'Выберите файл для загрузки' }
+  }
+})
+```
+
+See plugin documentation pages for other plugin-specific options.
+
+## Provider Plugins
+
+The Provider plugins help you connect to your accounts with remote file providers such as [Dropbox](https://dropbox.com), [Google Drive](https://drive.google.com), [Instagram](https://instagram.com). Because this requires server to server communication, they work tightly with [uppy-server](https://github.com/transloadit/uppy-server) to manage the server to server authroization for your account. Virtually most of the communication (file download/upload) is done on the server-to-server end, so this saves you the stress of data consumption on the client.
+
+As of now, the supported providers are **Dropbox**, **GoogleDrive**, and **Instagram**.
+
+Usage of the Provider plugins is not that different from any other *acquirer* plugin, except that it takes an extra option `host`, which specifies the url to your running `uppy-server`. This allows Uppy to know what server to connect to when server related operations are required by the provider plugin. Here's a quick example.
+
+```js
+const Uppy = require('uppy/lib/core')
+const DragDrop = require('uppy/lib/plugins/Dashboard')
+const uppy = Uppy()
+uppy.use(Dashboard, {
+  trigger: '#uppyModalOpener',
+  target: '#uppy',
+})
+
+// for Google Drive
+const GoogleDrive = require('uppy/lib/plugins/GoogleDrive')
+uppy.use(GoogleDrive, {target: Dashboard, host: 'http://localhost:3020'})
+
+// for Dropbox
+const Dropbox = require('uppy/lib/plugins/Dropbox')
+uppy.use(Dropbox, {target: Dashboard, host: 'http://localhost:3020'})
+
+// for Instagram
+const Instagram = require('uppy/lib/plugins/Instagram')
+uppy.use(Instagram, {target: Dashboard, host: 'http://localhost:3020'})
+```

+ 286 - 0
website/src/docs/server.md

@@ -0,0 +1,286 @@
+---
+title: "Uppy Server"
+type: docs
+permalink: docs/server/
+order: 5
+---
+
+Drag and Drop, Webcam, basic file manipulation (adding metadata, for example) and uploading via tus resumable uploads or XHR/Multipart are all possible using just the uppy client module. 
+
+However, if you add [uppy-server](https://github.com/transloadit/uppy-server) to the mix, your users will be able to select files from remote sources, such as Instagram, Google Drive and Dropbox, bypassing the client (so a 5 GB video isn’t eating into your mobile data plan), and then uploaded to the final distanation. Files are removed from uppy-server after an upload is complete, or after a resonable timeout. Access tokens also don’t stick around for long, for security.
+
+Uppy Server handles the server-to-server communication between your server and file storage providers such as Google Drive, Dropbox, Instagram, etc.
+
+## Supported Providers
+
+As of now uppy-server is integrated to work with:
+
+- Google Drive
+- Dropbox
+- Instagram
+- Amazon S3
+- Local disk
+
+## Install
+
+```bash
+npm install uppy-server
+```
+
+## Usage
+
+Uppy-server may either be used as pluggable express app, which you plug to your already existing server, or it may simply be run as a standalone server:
+
+### Plug to already existing server
+
+```javascript
+
+var express = require('express')
+var bodyParser = require('body-parser')
+var uppy = require('uppy-server')
+
+var app = express()
+app.use(bodyParser.json())
+...
+// be sure to place this anywhere after app.use(bodyParser.json())
+const options = {
+  providerOptions: {
+    google: {
+      key: 'GOOGLE_KEY',
+      secret: 'GOOGLE_SECRET'
+    }
+  },
+  server: {
+    host: 'localhost:3020',
+    protocol: 'http',
+  },
+  filePath: '/path/to/folder/'
+}
+
+app.use(uppy.app(options))
+
+```
+[See](#options) for valid configuration options.
+
+To enable uppy socket for realtime feed to the client while upload is going on, you call the `socket` method like so.
+
+```javascript
+...
+var server = app.listen(PORT)
+
+uppy.socket(server, options)
+
+```
+
+### Run as standalone server
+Please ensure that the required env varaibles are set before runnning/using uppy-server as a standalone server. [See](#configure-standalone).
+
+```bash
+$ uppy-server
+```
+
+If you cloned the repo from gtihub and want to run it as a standalone server, you may also run the following command from within its
+directory
+
+```bash
+npm run start:production
+```
+
+#### Configure Standalone
+To run uppy-server as a standalone server, you are required to set your uppy options via environment variables
+
+```bash
+####### Mandatory variables ###########
+export UPPYSERVER_DOMAIN="YOUR SERVER DOMAIN"
+export UPPYSERVER_DATADIR="PATH/TO/DOWNLOAD/DIRECTORY"
+
+###### Optionional variables ##########
+export UPPYSERVER_PROTOCOL="YOUR SERVER PROTOCOL" # defaults to http
+export UPPYSERVER_PORT="YOUR SERVER PORT" # defaults to 3020
+export UPPYSERVER_PATH="/SERVER/PATH/TO/WHERE/UPPY-SERVER/LIVES" # defaults to ''
+
+# use this in place of UPPYSERVER_PATH if the server path should not be
+# handled by the express.js app but maybe by an external server configuration
+# instead (e.g Nginx).
+export UPPYSERVER_IMPLICIT_PATH="/SERVER/PATH/TO/WHERE/UPPY/SERVER/LIVES"
+
+# camma separated client hosts to whitlelist by the server
+# if not specified, the server would allow any host
+export UPPY_ENDPOINTS="localhost:3452,uppy.io"
+
+# To enable redis session storage
+# and enable upload progress storage
+export UPPYSERVER_REDIS_URL="REDIS URL" 
+
+# If used with Dropbox
+export UPPYSERVER_DROPBOX_KEY="YOUR DROPBOX KEY"
+export UPPYSERVER_DROPBOX_SECRET="YOUR DROPBOX SECRET"
+
+# If used with Google Drive
+export UPPYSERVER_GOOGLE_KEY="YOUR GOOGLE KEY"
+export UPPYSERVER_GOOGLE_SECRET="YOUR GOOGLE SECRET"
+
+# If used with Instagram Drive
+export UPPYSERVER_INSTAGRAM_KEY="YOUR INSTAGRAM KEY"
+export UPPYSERVER_INSTAGRAM_SECRET="YOUR INSTAGRAM SECRET"
+
+# If used with s3
+export UPPYSERVER_AWS_KEY="YOUR AWS KEY"
+export UPPYSERVER_AWS_SECRET="YOUR AWS SECRET"
+export UPPYSERVER_AWS_BUCKET="YOUR AWS S3 BUCKET"
+export UPPYSERVER_AWS_REGION="AWS REGION"
+
+# for multiple server instances with multiple subdomains
+export UPPYSERVER_OAUTH_DOMAIN="sub.domain.com"
+export UPPYSERVER_DOMAINS="sub1.domain.com,sub2.domain.com,sub3.domain.com"
+
+# Only set this variable if you want uppy server to set the "i-am" header
+# in every response.
+export UPPYSERVER_SELF_ENDPOINT="THIS SHOULD BE SAME AS YOUR DOMAIN + PATH"
+```
+
+### Options
+
+```javascript
+{
+  providerOptions: {
+    google: {
+      key: "***",
+      secret: "***"
+    },
+    dropbox: {
+      key: "***",
+      secret: "***"
+    },
+    instagram: {
+      key: "***",
+      secret: "***"
+    },
+    s3: {
+      key: "***",
+      secret: "***",
+      bucket: "bucke-name",
+      region: "us-east-1"
+    }
+  },
+  server: {
+    host: "localhost:3020", // or yourdomain.com
+    protocol: "http"
+  },
+  filePath: "path/to/download/folder",
+  sendSelfEndpoint: "localhost:3020"
+}
+```
+
+1. **filePath(required)** - Full path to the directory where provider files would temporarily be downloaded to.
+
+2. **redisUrl(optional)** - URL to running redis server. If this is set, the state of uploads would be stored temporarily. This helps for resumed uploads after a browser crash from the client. The stored upload would be sent back to the client on reconnection.
+
+3. **providerOptions(optional)** - An object containing credentials (`key` and `secret`) for each provider you would like to enable. Please [see](#supported-providers) for supported providers.
+
+4. **server(optional)** - An object with details mainly used to carry out oauth authentication from any of the enable providers above. Though it is optional, it is required if you would be enabling any of the supported providers. The following are the server options you may set
+
+  - protocol - `http | https`
+  - host(required) - your server host (e.g localhost:3020, mydomain.com)
+  - path - the server path to where the uppy app is sitting (e.g if uppy server is at `mydomain.com/uppy`, then the path would be `/uppy`).
+  - oauthDoamin - if you have multiple instances of uppy server with different(and maybe dynamic) subdomains, you can set a master domain(e.g `sub1.mydomain.com`) to handle your oauth authentication for you. This would then redirect to the slave subdomain with the required credentials on completion.
+  - validHosts - if you are setting a master `oauthDomain`, you need to set a list of valid hosts, so the master oauth handler can validate the host of the uppy instance requesting the authentication. This is basically a list of valid domains running your uppy server instances. The list may also contain regex patterns. e.g `['sub2.mydomain.com', 'sub3.mydomain.com', '(\\w+).mydomain.com']`
+
+5. **sendSelfEndpoint(optional)** - This is basically the same as the `server.host + server.path` attributes. The major reason for this attributes is that, when set, it adds the value as the `i-am` header of every request response.
+
+6. **customProviders(optional)** - This option enables you add custom providers along with the already supported providers. [See](#adding-custom-providers) for more.
+
+### Adding Custom Providers
+
+As of now, uppy-server supports **Google Drive**, **Dropbox** and **Instagram** out of the box, but you may also choose to add your custom providers. You can do this by passing the `customPrivders` 
+option when calling the uppy `app` method. The custom provider is expected to supoort Oauth 1 or 2 for authentication/authorization.
+
+```javascript
+let options = {
+    customProviders: {
+        myprovidername: {
+            config: {
+                authorize_url: "https://mywebsite.com/authorize",
+                access_url: "https://mywebsite.com/token",
+                oauth: 2,
+                key: "***",
+                secret: "**",
+                scope: ["read", "write"]
+            },
+            module: require('/path/to/provider/module')
+        }
+    }
+}
+
+uppy.app(options)
+```
+
+The `customProviders` option should be an object containing each custom provider.
+Each custom provider would in turn be an object with two keys, `config` and `module`. The `config` option would contain Oauth API settings, while the `module` would point to the provider module.
+
+To work well with uppy server, the **Module** must be a class with the following methods.
+
+1. `list (options, done)` - lists json data of user files (e.g list of all the files in a particular directory).
+  - `options` - is an object containing the following attributes
+    - token - authorization token(retrieved from oauth process) to send along with your request
+    - directory - the `id/name` of the directory whose data is to be retrieved. This may be ignored if it doesn't apply to your provider
+    - query - expressjs query params object received by the server(just in case there's some data you need in there).
+  - `done (err, response, body)` - the callback that should be called when the request to your provider is done. As the signature indicates the following data should be passed along to the callback `err`, `response`, and `body`.
+2. `download (options, onData, onResponse)` - downloads a particular file from the provider.
+  - `options` - is an object containing the following attributes
+    - token - authorization token(retrieved from oauth process) to send along with your request.
+    - id - id of the file being downloaded.
+  - `onData (chunk)` - a callback that should be called with each data chunk received on download. This is useful if the size of the downloaded file can be pre-determined. This would allow for pipelined upload of the file(to the desired destination), while the download is still going on.
+  - `onResponse (response)` - if the size of the downloaded file can not be pre-determined by uppy-server, then this callback should be called in place of the `onData` callback. This callback would be called after the download is done, and would the downloaded data(response) as argument.
+
+## Development
+
+1. To setup uppy-server for local development, please clone the repo and install like so:
+
+```bash
+git clone https://github.com/transloadit/uppy-server && cd uppy-server && npm install
+```
+
+
+2. Configure your enviorment variables by copying the `env.example.sh` file to `env.sh` and edit it to its correct values.
+
+```bash
+cp env.example.sh env.sh
+$EDITOR env.sh
+```
+
+
+3. To start the server, simply run:
+
+```bash
+npm run start
+```
+
+This would get the uppy-server running on `http://localhost:3020`.
+
+It also expects the [uppy client](https://github.com/transloadit/uppy) to be running on `http://localhost:3452`
+
+## Running example
+
+An example server is running at http://server.uppy.io, which is deployed via
+[Frey](https://github.com/kvz/frey), using the following [Freyfile](infra/Freyfile.toml).
+
+All the secrets are stored in `env.infra.sh`, so using `env.infra.example.sh`, you could
+use the same Freyfile but target a different cloud vendor with different secrets, and run your own
+uppy-server.
+
+## Logging
+
+Requires Frey, if you haven't set it up yet type
+
+```bash
+npm run install:frey
+```
+
+afterwards, production logs are available through:
+
+```bash
+npm run logtail
+```
+
+This requires at least the `FREY_ENCRYPTION_SECRET` key present in your `./env.sh`.

+ 159 - 0
website/src/docs/transloadit.md

@@ -0,0 +1,159 @@
+---
+type: docs
+order: 9
+title: "Transloadit"
+permalink: docs/transloadit/
+---
+
+The Transloadit plugin can be used to upload files to [Transloadit](https://transloadit.com/) for all kinds of processing, such as transcoding video, resizing images, zipping/unzipping, [and more](https://transloadit.com/services/).
+
+The Transloadit plugin uses the Tus plugin for the uploading itself.
+To upload files to Transloadit directly, both the Tus and Transloadit plugins must be used:
+
+```js
+// The `resume: false` option _must_ be provided to the Tus plugin.
+uppy.use(Tus10, {
+  resume: false
+})
+uppy.use(Transloadit, {
+  // Transloadit plugin options
+})
+```
+
+## Options
+
+### `waitForEncoding`
+
+Whether to wait for all assemblies to complete before completing the upload.
+
+### `waitForMetadata`
+
+Whether to wait for metadata to be extracted from uploaded files before completing the upload.
+If `waitForEncoding` is enabled, this has no effect.
+
+### `params`
+
+The assembly parameters to use for the upload.
+
+### `signature`
+
+An optional signature for the assembly parameters.
+
+If a `signature` is provided, `params` should be a JSON string instead of a JavaScript object, as otherwise the generated JSON in the browser may be different from the JSON string that was used to generate the signature.
+
+### `fields`
+
+An object of form fields to send along to the assembly.
+
+### `getAssemblyOptions(file)`
+
+While `params`, `signature`, and `fields` must be determined ahead of time, the `getAssemblyOptions` allows using dynamically generated values for these options.
+This way, it is possible to use different assembly parameters for different files.
+
+A custom `getAssemblyOptions()` option should return an object or a Promise for an object with properties `{ params, signature, fields }`.
+For example, to add a field with some user-provided data from the `MetaData` plugin:
+
+```js
+uppy.use(MetaData, {
+  fields: [
+    { id: 'caption' }
+  ]
+})
+uppy.use(Transloadit, {
+  getAssemblyOptions (file) {
+    return {
+      params: {
+        auth: { key: 'TRANSLOADIT_AUTH_KEY_HERE' },
+        template_id: 'xyz'
+      },
+      fields: {
+        caption: file.meta.caption
+      }
+    }
+  }
+})
+```
+
+Now, the `${fields.caption}` variable will be available in the assembly template.
+
+`getAssemblyOptions()` may also return a Promise, so it could retrieve signed assembly parameters from a server.
+For example, assuming an endpoint `/transloadit-params` that responds with a JSON object with `{ params, signature }` properties:
+
+```js
+uppy.use(Transloadit, {
+  getAssemblyOptions (file) {
+    return fetch('/transloadit-params').then((response) => {
+      return response.json()
+    })
+  }
+})
+```
+
+## Events
+
+### `transloadit:assembly-created`
+
+Fired when an assembly is created.
+
+**Parameters**
+
+  - `assembly` - The initial assembly status.
+  - `fileIDs` - The IDs of the files that will be uploaded to this assembly.
+
+```js
+uppy.on('transloadit:assembly-created', (assembly, fileIDs) => {
+  console.group('Created', assembly.assembly_id, 'for files:')
+  for (const id of fileIDs) {
+    console.log(uppy.getFile(id).name)
+  }
+  console.groupEnd()
+})
+```
+
+### `transloadit:upload`
+
+Fired when Transloadit has received an upload.
+
+**Parameters**
+
+  - `file` - The Transloadit file object that was uploaded.
+  - `assembly` - The assembly status of the assembly the file was uploaded to.
+
+### `transloadit:result`
+
+Fired when a result came in from an assembly.
+
+**Parameters**
+
+  - `stepName` - The name of the assembly step that generated this result.
+  - `result` - The result object from Transloadit.
+    This result object contains one additional property, namely `localId`.
+    This is the ID of the file in Uppy's local state, and can be used with `uppy.getFile(id)`.
+  - `assembly` - The assembly status of the assembly that generated this result.
+
+```js
+uppy.on('transloadit:result', (stepName, result) => {
+  const file = uppy.getFile(result.localId)
+  document.body.appendChild(html`
+    <div>
+      <h2>From ${file.name}</h2>
+      <a href=${result.ssl_url}> View </a>
+    </div>
+  `)
+})
+```
+
+### `transloadit:complete`
+
+Fired when an assembly completed.
+
+**Parameters**
+
+  - `assembly` - The final assembly status of the completed assembly.
+
+```js
+uppy.on('transloadit:complete', (assembly) => {
+  // Could do something fun with this!
+  console.log(assembly.results)
+})
+```

+ 19 - 0
website/src/docs/tus.md

@@ -0,0 +1,19 @@
+---
+order: 7
+title: "Tus"
+permalink: docs/tus/
+---
+
+Tus plugin brings [tus.io](http://tus.io) resumable file uploading to Uppy by wrapping the [tus-js-client](https://github.com/tus/tus-js-client).
+
+## Options
+
+```js
+uppy.use(Tus10, {
+  resume: true,
+  allowPause: true,
+  autoRetry: true,
+  retryDelays: [0, 1000, 3000, 5000]
+})
+```
+

+ 300 - 0
website/src/docs/uppy.md

@@ -0,0 +1,300 @@
+---
+type: docs
+order: 1
+title: "Uppy"
+permalink: docs/uppy/
+---
+
+Core module that orchistrated everything in Uppy, exposing `state`, `events` and `methods`.
+
+## Options
+
+```js
+const uppy = Uppy({
+  autoProceed: true,
+  restrictions: {
+    maxFileSize: false,
+    maxNumberOfFiles: false,
+    minNumberOfFiles: false,
+    allowedFileTypes: false
+  },
+  meta: {},
+  onBeforeFileAdded: (currentFile, files) => Promise.resolve(),
+  onBeforeUpload: (files, done) => Promise.resolve(),
+  locale: defaultLocale
+})
+```
+
+### `autoProceed: true`
+
+Starts upload automatically after the first file is selected.
+
+### `restrictions: {}`
+
+Optionally provide rules and conditions for which files can be selected.
+
+**Parameters**
+
+- `maxFileSize` *number*
+- `maxNumberOfFiles` *number*
+- `minNumberOfFiles` *number*
+- `allowedFileTypes` *array* of wildcards or exact mime types, like `image/*`
+
+### `meta: {}`
+
+Metadata object, pass things like public keys, usernames, tags or whatever:
+
+```js
+meta: {
+  username: 'John'
+}
+```
+
+Can be altered with `uppy.setMeta({username: 'Peter'})` method.
+
+### `onBeforeFileAdded: (currentFile, files) => Promise.resolve()`
+
+A function run before a file is added to Uppy. Gets passed `(currentFile, files)` where `currentFile` is a file that is about to be added, and `files` is an object with all files that already are in Uppy. Return `Promise.resolve` to proceed with adding the file or `Promise.reject` to abort. Use this function to run any number of custom checks on the selected file, or manipulating it, like optimizing a file name, for example.
+
+```js
+onBeforeFileAdded: (currentFile, files) => {
+  if (currentFile.name === 'pitercss-IMG_0616.jpg') {
+    return Promise.resolve()
+  }
+  return Promise.reject('this is not the file I was looking for')
+}
+```
+
+### `onBeforeUpload: (files, done) => Promise.resolve()`
+
+A function run before an upload begins. Gets passed `files` object with all files that already are in Uppy. Return `Promise.resolve` to proceed with adding the file or `Promise.reject` to abort. Use this to check if all files or their total number match your requirements, or manipulate all the files at once before upload.
+
+```js
+onBeforeUpload: (files) => {
+  if (Object.keys(files).length < 2) {
+    return Promise.reject('too few files')
+  }
+  return Promise.resolve()
+}
+```
+
+### `locale: {}`
+
+Same deal as in plugins, this allows you to override language strings:
+
+```js
+locale: {
+  strings: {
+    youCanOnlyUploadX: {
+      0: 'You can only upload %{smart_count} file',
+      1: 'You can only upload %{smart_count} files'
+    },
+    youHaveToAtLeastSelectX: {
+      0: 'You have to select at least %{smart_count} file',
+      1: 'You have to select at least %{smart_count} files'
+    },
+    exceedsSize: 'This file exceeds maximum allowed size of',
+    youCanOnlyUploadFileTypes: 'You can only upload:'
+  }
+}
+```
+
+As well as the pluralization function, which is used to determin which string will be used for the provided `smart_count` number.
+
+For example, for Icelandic language the pluralization function will be:
+
+``` js
+locale: {
+  pluralize: (n) => (n % 10 !== 1 || n % 100 === 11) ? 1 : 0
+}
+```
+
+We are using a forked [Polyglot.js](https://github.com/airbnb/polyglot.js/blob/master/index.js#L37-L60).
+
+## Methods
+
+### `uppy.use(plugin, opts)`
+
+Add a plugin to Uppy, with an optional plugin options object.
+
+```js
+const Uppy = require('uppy/lib/core')
+const DragDrop = require('uppy/lib/plugins/DragDrop')
+
+const uppy = Uppy()
+uppy.use(DragDrop, {target: 'body'})
+```
+
+### `uppy.run()`
+
+Initializes everything after setup. Must be called before calling `.upload()` or using Uppy in any meaningful way.
+
+### `uppy.addFile(fileObject)`
+
+Add a new file to Uppy’s internal state.
+
+```js
+uppy.addFile({
+  name: 'my-file.jpg', // file name
+  type: 'image/jpeg', // file type
+  data: fileBlob, // file blob
+  source: 'Local', // optional, sets what added the file, for example, Instagram
+  isRemote: false // optional, set to true if actual file is not in the browser, but on some remote server, like when using uppy-server + Instagram, for example
+})
+```
+
+`addFile` attemps to determine file type by [magic bytes](https://github.com/sindresorhus/file-type) + the provided `type` + extension; then checks if the file can be added, considering `uppy.opts.restrictions`, sets metadata and generates a preview, if it’s an image.
+
+If `uppy.opts.autoProceed === true`, Uppy will begin uploading after the first file is added.
+
+### `uppy.getFile(fileID)`
+
+A shortcut method that returns a specific file object from `uppy.state` by its `fileID`.
+
+```js
+const file = uppy.getFile('uppyteamkongjpg1501851828779')
+const img = document.createElement('img')
+img.src = file.preivew
+document.body.appendChild(img)
+```
+
+### `uppy.setState(patch)`
+
+Update `uppy.state`. Usually this method is called internally, but in some cases it might be useful to alter something in `uppy.state` directly.
+
+Uppy’s default state on initialization:
+
+```js
+this.state = {
+  files: {},
+  capabilities: {
+    resumableUploads: false
+  },
+  totalProgress: 0,
+  meta: Object.assign({}, this.opts.meta)
+}
+```
+
+Updating state:
+
+```js
+uppy.setState({
+  smth: true
+})
+```
+
+We don’t mutate `uppy.state`, so internally `setState` creates a new copy of state and replaces uppy.state with it. However, when updating values, it’s your responsibility to not mutate them, but instead create copies. See [Redux docs](http://redux.js.org/docs/recipes/UsingObjectSpreadOperator.html) for more info on this. Here’s an example from Uppy.Core that updates progress for a particular file in state:
+
+```js
+const updatedFiles = Object.assign({}, uppy.getState().files)
+const updatedFile = Object.assign({}, updatedFiles[fileID],
+  Object.assign({}, {
+    progress: Object.assign({}, updatedFiles[fileID].progress, {
+      bytesUploaded: data.bytesUploaded,
+      bytesTotal: data.bytesTotal,
+      percentage: Math.floor((data.bytesUploaded / data.bytesTotal * 100).toFixed(2))
+    })
+  }
+))
+updatedFiles[data.id] = updatedFile
+uppy.setState({files: updatedFiles})
+```
+
+### `uppy.getState()`
+
+Returns `uppy.state`, which you can also use directly.
+
+### `uppy.setMeta(data)`
+
+Alters global `meta` object is state, the one that can be set in Uppy options and gets merged with all newly added files.
+
+```js
+uppy.setMeta({resize: 1500})
+```
+
+### `uppy.updateMeta(data, fileID)`
+
+Updated metadata for a specific file.
+
+```js
+uppy.updateMeta('myfileID', {resize: 1500})
+```
+
+### `uppy.reset()`
+
+Stop all uploads in progress and clear file selection, set progress to 0. Basically, return things to the way they were before any user input. 
+
+### `uppy.close()`
+
+Uninstall all plugins and close down this Uppy instance. Also runs `uppy.reset()` before uninstalling.
+
+### `uppy.log(msgString)`
+
+Logs stuff to console, only if `uppy.opts.debug` is set to true. Silent in production.
+
+### `uppy.info()`
+
+```js
+this.info('Oh my, something good happened!', 'success', 5000)
+```
+
+#### Parameters
+
+- **message** *string*
+- **type** *string* `info`, `warning`, `success` or `error`
+- **duration** *number* in milliseconds
+
+### `uppy.upload()`
+
+Start uploading selected files.
+
+### `uppy.on('event', action)`
+
+Subscribe to an uppy-event. See full list of events below.
+
+## Events
+
+Uppy exposes events that you can subscribe to in your app:
+
+### `core:upload-progress`
+
+Fired each time file upload progress is available, `data` object looks like this:
+
+```javascript
+data = {
+  id: myimg12321323,
+  bytesUploaded: 2323254,
+  bytesTotal
+}
+```
+
+```javascript
+uppy.on('core:upload-progress', (data) => {
+  console.log(data.id, data.bytesUploaded, data.bytesTotal)
+})
+```
+
+### `core:upload-success`
+
+Fired when single upload is complete.
+
+``` javascript
+uppy.on('core:upload-success', (fileId, url) => {
+  console.log(url)
+  var img = new Image()
+  img.width = 300
+  img.alt = fileId
+  img.src = url
+  document.body.appendChild(img)
+})
+```
+
+### `core:success`
+
+Fired when all uploads are complete.
+
+``` javascript
+uppy.on('core:success', (fileCount) => {
+  console.log(fileCount)
+})
+```

+ 0 - 83
website/src/guide/index.md

@@ -1,83 +0,0 @@
----
-title: "Getting Started"
-type: guide
-order: 0
----
-
-*Uppy is in development, some features are unavailable and things may break.*
-
-## Installing from NPM
-
-NPM is the recommended installation method when building large scale apps with Uppy. It pairs nicely with a CommonJS module bundler such as [Webpack](http://webpack.github.io/), [Browserify](http://browserify.org/) or [Rollup.js](http://rollupjs.org/).
-
-``` bash
-$ npm install uppy --save
-```
-
-``` javascript
-// ES6
-import { Core, DragDrop, Tus10 } from 'uppy'
-
-const uppy = new Core({wait: false})
-const files = uppy
-  .use(DragDrop, {target: 'body'})
-  .use(Tus10, {endpoint: '//tusd.tus.io/files'})
-  .run()
-```
-
-or
-
-``` javascript
-// ES5
-// warning: bundling with `require` will currently include the whole Uppy package, with all plugins.
-// If you want to pick and choose, use `import`
-var Uppy = require('uppy')
-
-var uppy = new Uppy.Core({wait: false})
-var files = uppy
-  .use(Uppy.DragDrop, {target: 'body'})
-  .use(Uppy.Tus10, {endpoint: '//tusd.tus.io/files'})
-  .run()
-```
-
-Add CSS [uppy.min.css](https://unpkg.com/uppy/dist/uppy.min.css), either to `head` of your HTML or include in JS, if your bundler of choice supports it — transforms and plugins are available for Browserify and Webpack.
-
-Give Uppy a spin [on RequireBin](http://requirebin.com/?gist=54e076cccc929cc567cb0aba38815105).
-
-## Installing from CDN
-
-But if you like, you can also use a pre-built bundle, for example from [unpkg CDN](https://unpkg.com/uppy/). In that case `Uppy` will attach itself to the global `window` object.
-
-1\. Add a script to your the bottom of your HTML’s `<body>`:
-
-``` html
-<script src="https://unpkg.com/uppy/dist/uppy.min.js"></script>
-```
-
-2\. Add CSS to your HTML’s `<head>`:
-``` html
-<link href="https://unpkg.com/uppy/dist/uppy.min.css" rel="stylesheet">
-```
-
-3\. Initialize:
-
-``` html
-<script>
-  var uppy = new Uppy.Core({locales: Uppy.locales.ru_RU, debug: true})
-  uppy.use(Uppy.DragDrop, {target: '.UppyDragDrop'})
-  uppy.use(Uppy.Tus10, {endpoint: '//tusd.tus.io/files/'})
-  uppy.run()
-</script>
-```
-
-## API
-
-Check out the [API section](/api).
-
-## Browser Support
-
-<a href="https://saucelabs.com/u/transloadit-uppy">
-  <img src="https://saucelabs.com/browser-matrix/transloadit-uppy.svg" alt="Sauce Test Status"/>
-</a>
-
-Note: we aim to support IE10+ and recent versions of Safari, Edge, Chrome, Firefox and Opera. IE6 on the chart above means we recommend setting Uppy to target a `<form>` element, so when Uppy has not yet loaded or is not supported, upload still works. Even on the refrigerator browser. Or, yes, IE6.

+ 2 - 2
website/themes/uppy/layout/partials/main_menu.ejs

@@ -4,8 +4,8 @@
     <input type="text" id="search-query" class="MainMenu-searchQuery st-default-search-input">
   </form>
 </li> -->
-<li><a href="/guide/" class="nav-link<%- page.path.match(/guide/) ? ' current' : '' %>">Guide</a></li>
-<li><a href="/api/" class="nav-link<%- page.path.match(/api/) ? ' current' : '' %>">API</a></li>
+<!--li><a href="/guide/" class="nav-link<%- page.path.match(/guide/) ? ' current' : '' %>">Guide</a></li-->
+<li><a href="/docs/" class="nav-link<%- page.path.match(/docs/) ? ' current' : '' %>">Docs</a></li>
 <li><a href="/examples/dashboard/" class="nav-link<%- page.path.match(/examples/) ? ' current' : '' %>">Examples</a></li>
 <li><a href="/stats/" class="nav-link<%- page.path.match(/stats/) ? ' current' : '' %>">Stats</a></li>
 <li><a href="/blog/" class="nav-link<%- page.path.match(/blog/) ? ' current' : '' %>">Blog</a></li>