aboutsummaryrefslogtreecommitdiff
path: root/node_modules/koa-connect
diff options
context:
space:
mode:
authorruki <waruqi@gmail.com>2018-11-08 00:38:48 +0800
committerruki <waruqi@gmail.com>2018-11-07 21:53:09 +0800
commit26105034da4fcce7ac883c899d781f016559310d (patch)
treec459a5dc4e3aa0972d9919033ece511ce76dd129 /node_modules/koa-connect
parent2c77f00f1a7ecb6c8192f9c16d3b2001b254a107 (diff)
downloadxmake-docs-26105034da4fcce7ac883c899d781f016559310d.tar.gz
xmake-docs-26105034da4fcce7ac883c899d781f016559310d.zip
switch to vuepress
Diffstat (limited to 'node_modules/koa-connect')
-rw-r--r--node_modules/koa-connect/README.md78
-rw-r--r--node_modules/koa-connect/examples/auth.js13
-rw-r--r--node_modules/koa-connect/examples/directory.js15
-rw-r--r--node_modules/koa-connect/examples/logger.js12
-rw-r--r--node_modules/koa-connect/examples/session.js15
-rw-r--r--node_modules/koa-connect/examples/simple.js16
-rw-r--r--node_modules/koa-connect/index.js38
-rw-r--r--node_modules/koa-connect/package.json27
-rw-r--r--node_modules/koa-connect/test/index.js114
-rw-r--r--node_modules/koa-connect/tests.js121
-rw-r--r--node_modules/koa-connect/yarn.lock408
11 files changed, 857 insertions, 0 deletions
diff --git a/node_modules/koa-connect/README.md b/node_modules/koa-connect/README.md
new file mode 100644
index 00000000..11567010
--- /dev/null
+++ b/node_modules/koa-connect/README.md
@@ -0,0 +1,78 @@
+# koa-connect [![npm package badge][npm badge]][npm]
+
+[npm badge]: https://badge.fury.io/js/koa-connect.svg
+[npm]: https://www.npmjs.com/package/koa-connect
+
+Use [Express](https://github.com/strongloop/express)/[Connect](https://github.com/senchalabs/connect) middleware with [Koa](https://github.com/koajs/koa).
+
+## Warning
+
+It is **highly** recommended to use a Koa-specific middleware instead of trying to convert an Express version when they're available. There is a non-trivial difference in the Koa and Express designs and you will inevitably run into some issues. This module is a workaround for the specific cases where the differences can be ignored. Additionally, it also enables library authors to write 1 version of their HTTP middleware.
+
+### Always use `next` middleware parameter
+
+Express middlewares need to declare and invoke the `next` callback appropriately for the koa-connect integration to work correctly.
+
+### For library authors
+
+If you're attempting to write a framework-agnostic middleware library, be sure to use only core HTTP methods and not any Express-dependent APIs like `res.send`.
+
+## Installation
+
+```sh
+npm install koa-connect
+```
+
+## Usage
+
+See [`examples/`](./examples) for more practical usage.
+
+```javascript
+const Koa = require('koa')
+const c2k = require('koa-connect')
+
+// A generic Express-style middleware function
+function connectMiddlware(req, res, next) {
+ res.writeHead(200, { 'Content-Type': 'text/plain' })
+ res.end('From the Connect middleware')
+ next()
+}
+
+// A generic Koa middlware, without async/await
+function koaMiddlware(ctx, next) {
+ next()
+ .then(() => {
+ // The control flow will bubble back to here, like usual
+ })
+ .catch(err => {
+ // Error handling from downstream middleware, like usual
+ })
+}
+
+// A generic Koa middlware with async/await
+async function koaMiddleware(ctx, next) {
+ try {
+ await next()
+ } catch (e) {
+ // Normal error handling
+ }
+ // Normal control flow
+}
+
+const app = new Koa()
+app.use(koaMiddlware)
+app.use(c2k(connectMiddlware))
+app.use((ctx, next) => {
+ console.log('It will continue on to here')
+})
+
+app.listen(3000)
+```
+
+## Testing
+
+Tests are in `tests.js` and are made with the [Mocha](https://mochajs.org) framework. You can run them with `npm test` or `npm run test:watch`
+
+## License
+
+MIT
diff --git a/node_modules/koa-connect/examples/auth.js b/node_modules/koa-connect/examples/auth.js
new file mode 100644
index 00000000..0ef15cdd
--- /dev/null
+++ b/node_modules/koa-connect/examples/auth.js
@@ -0,0 +1,13 @@
+const Koa = require('koa')
+const connect = require('connect')
+const c2k = require('..')
+
+const app = new Koa()
+app.use(c2k(connect.logger('dev')))
+app.use(c2k(connect.basicAuth('username', 'password')))
+
+app.use((ctx) => {
+ ctx.body = 'Hello'
+})
+
+app.listen(3000)
diff --git a/node_modules/koa-connect/examples/directory.js b/node_modules/koa-connect/examples/directory.js
new file mode 100644
index 00000000..f404a2d6
--- /dev/null
+++ b/node_modules/koa-connect/examples/directory.js
@@ -0,0 +1,15 @@
+const Koa = require('koa')
+const connect = require('connect')
+const c2k = require('..')
+
+const app = new Koa()
+app.use(c2k(connect.logger('dev')))
+app.use(c2k(connect.directory(__dirname)))
+app.use(c2k(connect.static(__dirname)))
+
+app.use((ctx, next) => {
+ ctx.body = 'koa'
+ next()
+})
+
+app.listen(3000)
diff --git a/node_modules/koa-connect/examples/logger.js b/node_modules/koa-connect/examples/logger.js
new file mode 100644
index 00000000..ff4e2323
--- /dev/null
+++ b/node_modules/koa-connect/examples/logger.js
@@ -0,0 +1,12 @@
+const Koa = require('koa')
+const connect = require('connect')
+const c2k = require('..')
+
+const app = new Koa()
+app.use(c2k(connect.logger('dev')))
+
+app.use((ctx) => {
+ ctx.body = 'koa'
+})
+
+app.listen(3000)
diff --git a/node_modules/koa-connect/examples/session.js b/node_modules/koa-connect/examples/session.js
new file mode 100644
index 00000000..407b18f9
--- /dev/null
+++ b/node_modules/koa-connect/examples/session.js
@@ -0,0 +1,15 @@
+const Koa = require('koa')
+const connect = require('connect')
+const c2k = require('..')
+
+const app = new Koa()
+app.use(c2k(connect.logger('dev')))
+app.use(c2k(connect.cookieParser()))
+app.use(c2k(connect.cookieSession({ secret: 'keyboard cat'})))
+
+app.use((ctx) {
+ const name = ctx.req.session.name = ctx.query.name || ctx.req.session.name
+ ctx.body = name || 'Please, enter your name'
+})
+
+app.listen(3000)
diff --git a/node_modules/koa-connect/examples/simple.js b/node_modules/koa-connect/examples/simple.js
new file mode 100644
index 00000000..0762adc8
--- /dev/null
+++ b/node_modules/koa-connect/examples/simple.js
@@ -0,0 +1,16 @@
+const Koa = require('koa')
+const c2k = require('..')
+
+function middleware (req, res, next) {
+ console.log('connect')
+ next()
+}
+
+const app = new Koa()
+app.use(c2k(middleware))
+
+app.use((ctx) {
+ ctx.body = 'koa'
+})
+
+app.listen(3000)
diff --git a/node_modules/koa-connect/index.js b/node_modules/koa-connect/index.js
new file mode 100644
index 00000000..20139f1e
--- /dev/null
+++ b/node_modules/koa-connect/index.js
@@ -0,0 +1,38 @@
+/**
+ * If the middleware function does declare receiving the `next` callback
+ * assume that it's synchronous and invoke `next` ourselves
+ */
+function noCallbackHandler(ctx, connectMiddleware, next) {
+ connectMiddleware(ctx.req, ctx.res)
+ return next()
+}
+
+/**
+ * The middleware function does include the `next` callback so only resolve
+ * the Promise when it's called. If it's never called, the middleware stack
+ * completion will stall
+ */
+function withCallbackHandler(ctx, connectMiddleware, next) {
+ return new Promise((resolve, reject) => {
+ connectMiddleware(ctx.req, ctx.res, err => {
+ if (err) reject(err)
+ else resolve(next())
+ })
+ })
+}
+
+/**
+ * Returns a Koa middleware function that varies its async logic based on if the
+ * given middleware function declares at least 3 parameters, i.e. includes
+ * the `next` callback function
+ */
+function koaConnect(connectMiddleware) {
+ const handler = connectMiddleware.length < 3
+ ? noCallbackHandler
+ : withCallbackHandler
+ return function koaConnect(ctx, next) {
+ return handler(ctx, connectMiddleware, next)
+ }
+}
+
+module.exports = koaConnect
diff --git a/node_modules/koa-connect/package.json b/node_modules/koa-connect/package.json
new file mode 100644
index 00000000..8a323864
--- /dev/null
+++ b/node_modules/koa-connect/package.json
@@ -0,0 +1,27 @@
+{
+ "name": "koa-connect",
+ "version": "2.0.1",
+ "description": "Use Connect/Express middleware in Koa",
+ "repository": "vkurchatkin/koa-connect",
+ "main": "index.js",
+ "author": "Vladimir Kurchatkin <vladimir.kurchatkin@gmail.com>",
+ "contributors": [
+ "Louis DeScioli (https://descioli.design)"
+ ],
+ "license": "MIT",
+ "scripts": {
+ "test": "mocha tests.js",
+ "test:watch": "npm run test -- --watch --reporter nyan"
+ },
+ "devDependencies": {
+ "koa": "^2.0.0",
+ "mocha": "^2.3.4",
+ "supertest": "^1.1.0"
+ },
+ "keywords": [
+ "koa",
+ "connect",
+ "express",
+ "middleware"
+ ]
+}
diff --git a/node_modules/koa-connect/test/index.js b/node_modules/koa-connect/test/index.js
new file mode 100644
index 00000000..6a3d6065
--- /dev/null
+++ b/node_modules/koa-connect/test/index.js
@@ -0,0 +1,114 @@
+'use strict';
+
+const Koa = require('koa');
+const supertest = require('supertest');
+const c2k = require('..');
+
+describe('koa-connect', () => {
+ let app;
+
+ beforeEach(() => {
+ app = new Koa();
+ app.use( function * (next) {
+ this.status = 404;
+ this.body = 'Original';
+ yield next;
+ })
+ });
+
+ it('works with a single noop Connect middleware', (done) => {
+ app.use(c2k((req, res, next) => {
+ next()
+ }));
+ supertest(app.callback())
+ .get('/')
+ .expect('Original')
+ .end(done);
+ });
+
+ it('works with two noop Connect middleware', (done) => {
+ app.use(c2k((req, res, next) => next()));
+ app.use(c2k((req, res, next) => next()));
+ supertest(app.callback())
+ .get('/')
+ .expect('Original')
+ .end(done);
+ });
+
+ it('passes correctly to downstream Koa middlewares', (done) => {
+ app.use(c2k((req, res, next) => next()));
+ app.use(function * () { this.status = 200; });
+ supertest(app.callback())
+ .get('/')
+ .expect(200)
+ .end(done);
+ });
+
+ it('bubbles back to earlier middleware', (done) => {
+ app.use(function * (next) {
+ yield next;
+ // Ensures that the following middleware is reached
+ if ( this.status !== 200 ) {
+ done(new Error('Never reached connect middleware'))
+ }
+ this.status = 201;
+ });
+
+ app.use(c2k((req, res) => res.statusCode = 200 ));
+
+ supertest(app.callback())
+ .get('/')
+ .expect(201)
+ .end(done);
+ });
+
+ it('receives errors from Connect middleware', (done) => {
+ app.use(function * (next) {
+ try {
+ yield next;
+ } catch (err) {
+ this.status = 500;
+ }
+ })
+
+ app.use(c2k((req, res, next) => {
+ next(new Error('How Connect does error handling'));
+ }));
+
+ app.use(function * () {
+ // Fail the test if this is reached
+ done(new Error('Improper error handling'))
+ })
+
+ supertest(app.callback())
+ .get('/')
+ .expect(500)
+ .end(done);
+ });
+
+ it('Setting the body or status in Koa middlewares does not do anything if res.end was used in a Connect middleware', (done) => {
+ const message = 'The message that makes it';
+ app.use(function * (next) {
+ yield next;
+ if ( this.status !== 200 ) {
+ done(new Error('Never reached connect middleware'));
+ }
+ // These calls won't end up doing anything
+ // And will cause Koa to log a "Can't set headers after they are sent" error
+ this.status = 500;
+ this.body = 'A story already written';
+ });
+
+ app.use(c2k((req, res) => {
+ res.statusCode = 200;
+ res.setHeader('Content-Length', message.length)
+ res.end(message);
+ }));
+
+ supertest(app.callback())
+ .get('/')
+ .expect(200)
+ .expect(message)
+ .end(done);
+ });
+})
diff --git a/node_modules/koa-connect/tests.js b/node_modules/koa-connect/tests.js
new file mode 100644
index 00000000..43cb904d
--- /dev/null
+++ b/node_modules/koa-connect/tests.js
@@ -0,0 +1,121 @@
+'use strict'
+
+const Koa = require('koa')
+const supertest = require('supertest')
+const c2k = require('./index')
+const assert = require('assert')
+
+describe('koa-connect', () => {
+ let app
+
+ beforeEach(() => {
+ app = new Koa()
+ app.use((ctx, next) => {
+ ctx.status = 404
+ ctx.body = 'Original'
+ return next()
+ })
+ })
+
+ it('works with a single noop Connect middleware', (done) => {
+ function noop(req, res, next) { next() }
+ app.use(c2k(noop))
+ supertest(app.callback())
+ .get('/')
+ .expect('Original')
+ .end(done)
+ })
+
+ it('works with two noop Connect middleware', (done) => {
+ function noop(req, res, next) { next() }
+ app.use(c2k(noop))
+ app.use(c2k(noop))
+ supertest(app.callback())
+ .get('/')
+ .expect('Original')
+ .end(done)
+ })
+
+ it('passes correctly to downstream Koa middlewares', (done) => {
+ function noop(req, res, next) { next() }
+ function goodStatusSetter(ctx) { ctx.status = 200 }
+ app.use(c2k(noop))
+ app.use(goodStatusSetter)
+ supertest(app.callback())
+ .get('/')
+ .expect(200)
+ .end(done)
+ })
+
+ it('bubbles back to earlier middleware', (done) => {
+ let callOne = false
+ let callTwo = false
+ app.use((ctx, next) => {
+ return next()
+ .then(() => {
+ callTwo = true
+ })
+ })
+
+ app.use(c2k((req, res) => {
+ res.statusCode = 200
+ callOne = true
+ }))
+
+ supertest(app.callback())
+ .get('/')
+ .expect(200)
+ .then(() => {
+ assert(callOne === true, 'Second middleware never called')
+ assert(callTwo === true, 'Never bubbled back to first middleware')
+ done()
+ })
+ })
+
+ it('receives errors from Connect middleware', (done) => {
+ app.use((ctx, next) => {
+ next().catch((err) => ctx.status = 505)
+ })
+
+ app.use(c2k((req, res, next) => {
+ next(new Error('How Connect does error handling'))
+ }))
+
+ app.use((ctx) => {
+ // Fail the test if this is reached
+ done(new Error('Improper error handling'))
+ })
+
+ supertest(app.callback())
+ .get('/')
+ .expect(505)
+ .end(done)
+ })
+
+ it('Setting the body or status in Koa middlewares does not do anything if res.end was used in a Connect middleware', (done) => {
+ const message = 'The message that makes it'
+ app.use((ctx, next) => {
+ next()
+ .then(() => {
+ if ( ctx.status !== 200 ) {
+ done(new Error('Never reached connect middleware'))
+ }
+ // These calls won't end up doing anything
+ ctx.status = 500
+ ctx.body = 'A story already written'
+ })
+ })
+
+ app.use(c2k((req, res) => {
+ res.statusCode = 200
+ res.setHeader('Content-Length', message.length)
+ res.end(message)
+ }))
+
+ supertest(app.callback())
+ .get('/')
+ .expect(200)
+ .expect(message)
+ .end(done)
+ })
+})
diff --git a/node_modules/koa-connect/yarn.lock b/node_modules/koa-connect/yarn.lock
new file mode 100644
index 00000000..f39207bc
--- /dev/null
+++ b/node_modules/koa-connect/yarn.lock
@@ -0,0 +1,408 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+accepts@^1.2.2:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f"
+ dependencies:
+ mime-types "~2.1.16"
+ negotiator "0.6.1"
+
+any-promise@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
+
+async@^1.4.0:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
+
+combined-stream@^1.0.5:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818"
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06"
+
+commander@2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873"
+
+component-emitter@~1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6"
+
+content-disposition@~0.5.0:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4"
+
+content-type@^1.0.0:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
+
+cookiejar@2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.0.6.tgz#0abf356ad00d1c5a219d88d44518046dd026acfe"
+
+cookies@~0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.7.1.tgz#7c8a615f5481c61ab9f16c833731bcb8f663b99b"
+ dependencies:
+ depd "~1.1.1"
+ keygrip "~1.0.2"
+
+core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+
+debug@*:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ dependencies:
+ ms "2.0.0"
+
+debug@2:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ dependencies:
+ ms "2.0.0"
+
+debug@2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da"
+ dependencies:
+ ms "0.7.1"
+
+deep-equal@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
+
+depd@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359"
+
+depd@^1.1.0, depd@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
+
+destroy@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
+
+diff@1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+
+error-inject@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
+
+escape-html@~1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+
+escape-string-regexp@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1"
+
+extend@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4"
+
+form-data@1.0.0-rc3:
+ version "1.0.0-rc3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc3.tgz#d35bc62e7fbc2937ae78f948aaa0d38d90607577"
+ dependencies:
+ async "^1.4.0"
+ combined-stream "^1.0.5"
+ mime-types "^2.1.3"
+
+formidable@~1.0.14:
+ version "1.0.17"
+ resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.0.17.tgz#ef5491490f9433b705faa77249c99029ae348559"
+
+fresh@^0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+
+glob@3.2.11:
+ version "3.2.11"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d"
+ dependencies:
+ inherits "2"
+ minimatch "0.3"
+
+growl@1.9.2:
+ version "1.9.2"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f"
+
+http-assert@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.3.0.tgz#a31a5cf88c873ecbb5796907d4d6f132e8c01e4a"
+ dependencies:
+ deep-equal "~1.0.1"
+ http-errors "~1.6.1"
+
+http-errors@^1.2.8, http-errors@~1.6.1:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736"
+ dependencies:
+ depd "1.1.1"
+ inherits "2.0.3"
+ setprototypeof "1.0.3"
+ statuses ">= 1.3.1 < 2"
+
+inherits@2, inherits@2.0.3, inherits@~2.0.1:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
+
+is-generator-function@^1.0.3:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+
+jade@0.26.3:
+ version "0.26.3"
+ resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c"
+ dependencies:
+ commander "0.6.1"
+ mkdirp "0.3.0"
+
+keygrip@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.2.tgz#ad3297c557069dea8bcfe7a4fa491b75c5ddeb91"
+
+koa-compose@^3.0.0:
+ version "3.2.1"
+ resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7"
+ dependencies:
+ any-promise "^1.1.0"
+
+koa-compose@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-4.0.0.tgz#2800a513d9c361ef0d63852b038e4f6f2d5a773c"
+
+koa-convert@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/koa-convert/-/koa-convert-1.2.0.tgz#da40875df49de0539098d1700b50820cebcd21d0"
+ dependencies:
+ co "^4.6.0"
+ koa-compose "^3.0.0"
+
+koa-is-json@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14"
+
+koa@^2.0.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/koa/-/koa-2.5.0.tgz#b0fbe1e195e43b27588a04fd0be0ddaeca2c154c"
+ dependencies:
+ accepts "^1.2.2"
+ content-disposition "~0.5.0"
+ content-type "^1.0.0"
+ cookies "~0.7.0"
+ debug "*"
+ delegates "^1.0.0"
+ depd "^1.1.0"
+ destroy "^1.0.3"
+ error-inject "~1.0.0"
+ escape-html "~1.0.1"
+ fresh "^0.5.2"
+ http-assert "^1.1.0"
+ http-errors "^1.2.8"
+ is-generator-function "^1.0.3"
+ koa-compose "^4.0.0"
+ koa-convert "^1.2.0"
+ koa-is-json "^1.0.0"
+ mime-types "^2.0.7"
+ on-finished "^2.1.0"
+ only "0.0.2"
+ parseurl "^1.3.0"
+ statuses "^1.2.0"
+ type-is "^1.5.5"
+ vary "^1.0.0"
+
+lru-cache@2:
+ version "2.7.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952"
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+
+methods@1.x, methods@~1.1.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+
+mime-db@~1.30.0:
+ version "1.30.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01"
+
+mime-types@^2.0.7, mime-types@^2.1.3, mime-types@~2.1.15, mime-types@~2.1.16:
+ version "2.1.17"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a"
+ dependencies:
+ mime-db "~1.30.0"
+
+mime@1.3.4:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
+
+minimatch@0.3:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd"
+ dependencies:
+ lru-cache "2"
+ sigmund "~1.0.0"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+
+mkdirp@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e"
+
+mkdirp@0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ dependencies:
+ minimist "0.0.8"
+
+mocha@^2.3.4:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58"
+ dependencies:
+ commander "2.3.0"
+ debug "2.2.0"
+ diff "1.4.0"
+ escape-string-regexp "1.0.2"
+ glob "3.2.11"
+ growl "1.9.2"
+ jade "0.26.3"
+ mkdirp "0.5.1"
+ supports-color "1.2.0"
+ to-iso-string "0.0.2"
+
+ms@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+
+negotiator@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9"
+
+on-finished@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
+ dependencies:
+ ee-first "1.1.1"
+
+only@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
+
+parseurl@^1.3.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3"
+
+qs@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404"
+
+readable-stream@1.0.27-1:
+ version "1.0.27-1"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.27-1.tgz#6b67983c20357cefd07f0165001a16d710d91078"
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+reduce-component@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/reduce-component/-/reduce-component-1.0.1.tgz#e0c93542c574521bea13df0f9488ed82ab77c5da"
+
+setprototypeof@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04"
+
+sigmund@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590"
+
+"statuses@>= 1.3.1 < 2", statuses@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
+superagent@^1.7.2:
+ version "1.8.5"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-1.8.5.tgz#1c0ddc3af30e80eb84ebc05cb2122da8fe940b55"
+ dependencies:
+ component-emitter "~1.2.0"
+ cookiejar "2.0.6"
+ debug "2"
+ extend "3.0.0"
+ form-data "1.0.0-rc3"
+ formidable "~1.0.14"
+ methods "~1.1.1"
+ mime "1.3.4"
+ qs "2.3.3"
+ readable-stream "1.0.27-1"
+ reduce-component "1.0.1"
+
+supertest@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/supertest/-/supertest-1.2.0.tgz#850a795f9068d2faf19e01799ff09962e0ce43be"
+ dependencies:
+ methods "1.x"
+ superagent "^1.7.2"
+
+supports-color@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e"
+
+to-iso-string@0.0.2:
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1"
+
+type-is@^1.5.5:
+ version "1.6.15"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410"
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.15"
+
+vary@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"