From d3d37ad7ffda7f82cd5ab2baa546726802338bfd Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Mon, 9 Jan 2017 20:50:48 +0100 Subject: [PATCH 01/10] chore(server): Upgrade dependencies. affects: tessellate-server --- packages/tessellate-server/.flowconfig | 7 ++----- packages/tessellate-server/package.json | 19 +++++++++---------- 2 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/tessellate-server/.flowconfig b/packages/tessellate-server/.flowconfig index 6b525a2..a8f1d91 100644 --- a/packages/tessellate-server/.flowconfig +++ b/packages/tessellate-server/.flowconfig @@ -10,8 +10,5 @@ esproposal.class_static_fields=enable esproposal.class_instance_fields=enable experimental.strict_type_args=true -suppress_type=$FlowIssue -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue - -[version] -^0.36.0 +suppress_type=$FlowIgnore +suppress_comment=\\(.\\|\n\\)*\\$FlowIgnore diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index 49e2d0a..c38c878 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -26,24 +26,23 @@ "js-yaml": "3.7.0", "koa": "2.0.0-alpha.7", "koa-morgan": "1.0.1", - "koa-router-rx": "0.1.2", + "koa-router-rx": "0.3.0", "mz": "2.6.0", "nconf": "0.8.4", - "prom-client": "6.2.0", - "prometheus-gc-stats": "0.3.1", - "rxjs": "5.0.0-rc.4" + "prom-client": "7.0.0", + "prometheus-gc-stats": "0.3.2" }, "devDependencies": { "babel-cli": "6.18.0", - "babel-core": "6.18.2", - "babel-jest": "17.0.2", - "babel-loader": "6.2.8", + "babel-core": "6.21.0", + "babel-jest": "18.0.0", + "babel-loader": "6.2.10", "babel-plugin-syntax-flow": "6.18.0", - "babel-plugin-transform-flow-strip-types": "6.18.0", + "babel-plugin-transform-flow-strip-types": "6.21.0", "babel-preset-latest-minimal": "1.1.2", - "flow-bin": "0.36.0", + "flow-bin": "0.37.4", "flow-typed": "2.0.0", - "jest": "17.0.3", + "jest": "18.1.0", "supertest": "2.0.1", "supertest-as-promised": "4.0.2", "webpack": "2.1.0-beta.25" From 65a02692ad0dd4a8a1cd402a814861c0654be69f Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Mon, 9 Jan 2017 20:53:15 +0100 Subject: [PATCH 02/10] feat(server): Allow additional middleware to be added. affects: tessellate-server --- packages/tessellate-server/package.json | 1 + .../tessellate-server/src/TessellateServer.js | 35 +- .../test/TessellateServer.test.js | 85 ++- packages/tessellate-server/yarn.lock | 531 +++++++++--------- 4 files changed, 364 insertions(+), 288 deletions(-) diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index c38c878..dd7e36d 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -25,6 +25,7 @@ "dependencies": { "js-yaml": "3.7.0", "koa": "2.0.0-alpha.7", + "koa-compose": "3.2.1", "koa-morgan": "1.0.1", "koa-router-rx": "0.3.0", "mz": "2.6.0", diff --git a/packages/tessellate-server/src/TessellateServer.js b/packages/tessellate-server/src/TessellateServer.js index a09ea6c..8257dbb 100644 --- a/packages/tessellate-server/src/TessellateServer.js +++ b/packages/tessellate-server/src/TessellateServer.js @@ -2,6 +2,7 @@ import Koa from 'koa' import http from 'http' +import compose from 'koa-compose' import morgan from 'koa-morgan' import RxRouter from 'koa-router-rx' import MetricsApp from './MetricsApp' @@ -13,6 +14,7 @@ import type { Server } from 'http' type Options = { name?: string; }; +type Middleware = (ctx: Object, next: () => Promise) => Promise; function startServer(listener: () => void, port: number): Promise { return new Promise((resolve, reject) => { @@ -29,18 +31,31 @@ function stopServer(server: ?Server): Promise { }) } +function additionalMiddleware(middleware: Array): Middleware { + let composed, length + return (ctx, next) => { + if (!composed || middleware.length !== length) { + composed = compose(middleware) + length = middleware.length + } + return composed(ctx, next) + } +} + export default class TessellateServer { app: Koa; metrics: Koa; router: RxRouter; appServer: ?Server; metricsServer: ?Server; + middleware: Array; constructor(options: Options = {}) { this.app = new Koa() this.app.name = options.name this.router = new RxRouter() this.metrics = new MetricsApp().app + this.middleware = [] const morganFormat = String(nconf.get('MORGAN_FORMAT')) const morganThresh = parseInt(nconf.get('MORGAN_THRESHOLD')) @@ -49,15 +64,29 @@ export default class TessellateServer { this.app .use(morgan(morganFormat, {skip: morganSkip})) .use(error) + .use(additionalMiddleware(this.middleware)) .use(this.router.routes()) .use(this.router.allowedMethods()) } - async start(port: number, metricsPort: number = port + 1): Promise { + use(middleware: Middleware, defer: boolean = false): TessellateServer { + if (defer) { + this.middleware.push(async (ctx, next) => { + await next() + await middleware(ctx, next) + }) + } else { + this.middleware.push(middleware) + } + return this + } + + async start(port: number | string, metricsPort: ?number | ?string): Promise { + if (!port) throw new Error('No port specified!') const [appServer, metricsServer] = await Promise.all([ - startServer(this.app.callback(), port), - startServer(this.metrics.callback(), metricsPort) + startServer(this.app.callback(), parseInt(port)), + startServer(this.metrics.callback(), parseInt(metricsPort) || parseInt(port) + 1) ]) this.appServer = appServer diff --git a/packages/tessellate-server/test/TessellateServer.test.js b/packages/tessellate-server/test/TessellateServer.test.js index 9994fb9..b19421e 100644 --- a/packages/tessellate-server/test/TessellateServer.test.js +++ b/packages/tessellate-server/test/TessellateServer.test.js @@ -4,17 +4,19 @@ import supertest from 'supertest-as-promised' import TessellateServer from '../src/TessellateServer' describe('TessellateServer', () => { - let server, appRequest, metricsRequest + let _server - beforeEach(async () => { - server = await new TessellateServer().start(3001) - appRequest = supertest.agent(server.appServer) - metricsRequest = supertest.agent(server.metricsServer) - }) + afterEach(async () => _server.stop()) - afterEach(() => server.stop()) + async function startServer(server: TessellateServer): Promise<*> { + server = _server = await server.start(3001) + const appRequest = supertest.agent(server.appServer) + const metricsRequest = supertest.agent(server.metricsServer) + return {server, appRequest, metricsRequest} + } it('should support a simple route', async () => { + const {server, appRequest} = await startServer(new TessellateServer()) server.router.get('/', observable => observable.mapTo('Hello, test!')) await appRequest.get('/') @@ -23,8 +25,77 @@ describe('TessellateServer', () => { }) it('should return metrics', async () => { + const {server, metricsRequest} = await startServer(new TessellateServer()) + + await metricsRequest.get('/metrics') + .expect(200) + .expect('Content-Type', /^text\/plain/) + }) + + it('should return metrics', async () => { + const {server, metricsRequest} = await startServer(new TessellateServer()) + await metricsRequest.get('/metrics') .expect(200) .expect('Content-Type', /^text\/plain/) }) + + it('should use additional middleware', async () => { + const server = new TessellateServer() + let middlewareWasCalled = false + server.use((ctx, next) => { + middlewareWasCalled = true + ctx.body = 'NOPE' + return next() + }) + + const {appRequest} = await startServer(server) + server.router.get('/', observable => observable.mapTo('OK')) + + expect(middlewareWasCalled).toBe(false) + + await appRequest.get('/') + .expect(200) + .expect('OK') + + expect(middlewareWasCalled).toBe(true) + }) + + it('should use additional middleware after the server was started', async () => { + const {server, appRequest} = await startServer(new TessellateServer()) + server.router.get('/', observable => observable.mapTo('OK')) + + let middlewareWasCalled = false + + await appRequest.get('/') + .expect(200) + .expect('OK') + + expect(middlewareWasCalled).toBe(false) + + server.use((ctx, next) => { + middlewareWasCalled = true + ctx.body = 'NOPE' + return next() + }) + + expect(middlewareWasCalled).toBe(false) + + await appRequest.get('/') + .expect(200) + .expect('OK') + + expect(middlewareWasCalled).toBe(true) + }) + + it('should use deferred middleware', async () => { + const {server, appRequest} = await startServer(new TessellateServer()) + server.router.get('/', observable => observable.mapTo('NOPE :(')) + + server.use(async (ctx, next) => ctx.body = 'YAY :)', true) + + await appRequest.get('/') + .expect(200) + .expect('YAY :)') + }) }) diff --git a/packages/tessellate-server/yarn.lock b/packages/tessellate-server/yarn.lock index 082fb8d..61b8666 100644 --- a/packages/tessellate-server/yarn.lock +++ b/packages/tessellate-server/yarn.lock @@ -6,7 +6,7 @@ abab@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.3.tgz#b81de5f7274ec4e756d797cd834f303642724e5d" -abbrev@1, abbrev@1.0.x: +abbrev@1: version "1.0.9" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" @@ -108,24 +108,10 @@ arr-flatten@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.1.tgz#e5ffe54d45e19f32f216e91eb99c8ce892bb604b" -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" @@ -164,16 +150,22 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@1.x, async@^1.3.0, async@^1.4.0, async@^1.4.2, async@^1.5.2: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - async@2.0.0-rc.4: version "2.0.0-rc.4" resolved "https://registry.yarnpkg.com/async/-/async-2.0.0-rc.4.tgz#9b7f60724c17962a973f787419e0ebc5571dbad8" dependencies: lodash "^4.3.0" +async@^1.3.0, async@^1.4.0, async@^1.4.2, async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.1.4.tgz#2d2160c7788032e4dd6cbe2502f1f9a2c8f6cde4" + dependencies: + lodash "^4.14.0" + async@~0.2.6: version "0.2.10" resolved "https://registry.yarnpkg.com/async/-/async-0.2.10.tgz#b6bbe0b0674b9d719708ca38de8c237cb526c3d1" @@ -211,27 +203,27 @@ babel-cli@6.18.0: optionalDependencies: chokidar "^1.0.0" -babel-code-frame@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.16.0.tgz#f90e60da0862909d3ce098733b5d3987c97cb8de" +babel-code-frame@^6.20.0: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" dependencies: chalk "^1.1.0" esutils "^2.0.2" js-tokens "^2.0.0" -babel-core@6.18.2, babel-core@^6.0.0, babel-core@^6.18.0: - version "6.18.2" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.18.2.tgz#d8bb14dd6986fa4f3566a26ceda3964fa0e04e5b" +babel-core@6.21.0, babel-core@^6.0.0, babel-core@^6.18.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.21.0.tgz#75525480c21c803f826ef3867d22c19f080a3724" dependencies: - babel-code-frame "^6.16.0" - babel-generator "^6.18.0" + babel-code-frame "^6.20.0" + babel-generator "^6.21.0" babel-helpers "^6.16.0" babel-messages "^6.8.0" babel-register "^6.18.0" - babel-runtime "^6.9.1" + babel-runtime "^6.20.0" babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" + babel-traverse "^6.21.0" + babel-types "^6.21.0" babylon "^6.11.0" convert-source-map "^1.1.0" debug "^2.1.1" @@ -243,13 +235,13 @@ babel-core@6.18.2, babel-core@^6.0.0, babel-core@^6.18.0: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.19.0.tgz#9b2f244204777a3d6810ec127c673c87b349fac5" +babel-generator@^6.18.0, babel-generator@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.21.0.tgz#605f1269c489a1c75deeca7ea16d43d4656c8494" dependencies: babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" + babel-runtime "^6.20.0" + babel-types "^6.21.0" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" @@ -356,17 +348,17 @@ babel-helpers@^6.16.0: babel-runtime "^6.0.0" babel-template "^6.16.0" -babel-jest@17.0.2, babel-jest@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-17.0.2.tgz#8d51e0d03759713c331f108eb0b2eaa4c6efff74" +babel-jest@18.0.0, babel-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3" dependencies: babel-core "^6.0.0" - babel-plugin-istanbul "^2.0.0" - babel-preset-jest "^17.0.2" + babel-plugin-istanbul "^3.0.0" + babel-preset-jest "^18.0.0" -babel-loader@6.2.8: - version "6.2.8" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.8.tgz#30d7183aef60afc140b36443676b7acb4c12ac9c" +babel-loader@6.2.10: + version "6.2.10" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.10.tgz#adefc2b242320cd5d15e65b31cea0e8b1b02d4b0" dependencies: find-cache-dir "^0.1.1" loader-utils "^0.2.11" @@ -385,18 +377,18 @@ babel-plugin-check-es2015-constants@^6.8.0: dependencies: babel-runtime "^6.0.0" -babel-plugin-istanbul@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-2.0.3.tgz#266b304b9109607d60748474394676982f660df4" +babel-plugin-istanbul@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-3.1.2.tgz#11d5abde18425ec24b5d648c7e0b5d25cd354a22" dependencies: find-up "^1.1.2" - istanbul-lib-instrument "^1.1.4" + istanbul-lib-instrument "^1.4.2" object-assign "^4.1.0" - test-exclude "^2.1.1" + test-exclude "^3.3.0" -babel-plugin-jest-hoist@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-17.0.2.tgz#213488ce825990acd4c30f887dca09fffeb45235" +babel-plugin-jest-hoist@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" @@ -575,9 +567,9 @@ babel-plugin-transform-exponentiation-operator@^6.8.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.0.0" -babel-plugin-transform-flow-strip-types@6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.18.0.tgz#4d3e642158661e9b40db457c004a30817fa32592" +babel-plugin-transform-flow-strip-types@6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.21.0.tgz#2eea3f8b5bb234339b47283feac155cfb237b948" dependencies: babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.0.0" @@ -605,11 +597,11 @@ babel-polyfill@^6.16.0, babel-polyfill@^6.6.1: core-js "^2.4.0" regenerator-runtime "^0.9.5" -babel-preset-jest@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-17.0.2.tgz#141e935debe164aaa0364c220d31ccb2176493b2" +babel-preset-jest@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e" dependencies: - babel-plugin-jest-hoist "^17.0.2" + babel-plugin-jest-hoist "^18.0.0" babel-preset-latest-minimal@1.1.2: version "1.1.2" @@ -653,7 +645,14 @@ babel-register@^6.18.0: mkdirp "^0.5.1" source-map-support "^0.4.2" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.9.0, babel-runtime@^6.9.1: +babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.20.0, babel-runtime@^6.9.1: + version "6.20.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.10.0" + +babel-runtime@^6.9.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" dependencies: @@ -670,25 +669,25 @@ babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-te babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.16.0, babel-traverse@^6.18.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.19.0.tgz#68363fb821e26247d52a519a84b2ceab8df4f55a" +babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" dependencies: - babel-code-frame "^6.16.0" + babel-code-frame "^6.20.0" babel-messages "^6.8.0" - babel-runtime "^6.9.0" - babel-types "^6.19.0" + babel-runtime "^6.20.0" + babel-types "^6.21.0" babylon "^6.11.0" debug "^2.2.0" globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.19.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.19.0.tgz#8db2972dbed01f1192a8b602ba1e1e4c516240b9" +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" dependencies: - babel-runtime "^6.9.1" + babel-runtime "^6.20.0" esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^1.0.1" @@ -1260,7 +1259,7 @@ escape-string-regexp@^1.0.2: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@1.8.x, escodegen@^1.6.1: +escodegen@^1.6.1: version "1.8.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" dependencies: @@ -1271,7 +1270,7 @@ escodegen@1.8.x, escodegen@^1.6.1: optionalDependencies: source-map "~0.2.0" -esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: +esprima@^2.6.0, esprima@^2.7.1: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" @@ -1343,12 +1342,12 @@ filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" -fileset@0.2.x: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-0.2.1.tgz#588ef8973c6623b2a76df465105696b96aac8067" +fileset@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" dependencies: - glob "5.x" - minimatch "2.x" + glob "^7.0.3" + minimatch "^3.0.3" fill-range@^2.1.0: version "2.2.3" @@ -1375,9 +1374,9 @@ find-up@^1.0.0, find-up@^1.1.2: path-exists "^2.0.0" pinkie-promise "^2.0.0" -flow-bin@0.36.0: - version "0.36.0" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.36.0.tgz#557907bd9c2ab0670cfad9e7e906a74b0631e39a" +flow-bin@0.37.4: + version "0.37.4" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" flow-typed@2.0.0: version "2.0.0" @@ -1528,7 +1527,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@5.x, glob@^5.0.15, glob@^5.0.5: +glob@^5.0.5: version "5.0.15" resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" dependencies: @@ -1538,7 +1537,7 @@ glob@5.x, glob@^5.0.15, glob@^5.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.5, glob@^7.0.6: +glob@^7.0.3, glob@^7.0.5, glob@^7.0.6: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1565,7 +1564,7 @@ growly@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" -handlebars@^4.0.1, handlebars@^4.0.3: +handlebars@^4.0.3: version "4.0.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.6.tgz#2ce4484850537f9c97a8026d5399b935c4ed4ed7" dependencies: @@ -1844,36 +1843,35 @@ isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.0.0-aplha.10: - version "1.0.0-aplha.10" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.0.0-aplha.10.tgz#902edf5cf5404e0eba7e00ef46408488a0d3e337" +istanbul-api@^1.1.0-alpha.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.0.tgz#fb3f62edd5bfc6ae09da09453ded6e10ae7e483b" dependencies: - async "1.x" - clone "^1.0.2" - fileset "0.2.x" - istanbul-lib-coverage "^1.0.0-alpha" - istanbul-lib-hook "^1.0.0-alpha" - istanbul-lib-instrument "^1.0.0-alpha" - istanbul-lib-report "^1.0.0-alpha" - istanbul-lib-source-maps "^1.0.0-alpha" - istanbul-reports "^1.0.0-alpha" - js-yaml "3.x" - mkdirp "0.5.x" - once "1.x" + async "^2.1.4" + fileset "^2.0.2" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-hook "^1.0.0-alpha.4" + istanbul-lib-instrument "^1.3.0" + istanbul-lib-report "^1.0.0-alpha.3" + istanbul-lib-source-maps "^1.1.0" + istanbul-reports "^1.0.0" + js-yaml "^3.7.0" + mkdirp "^0.5.1" + once "^1.4.0" istanbul-lib-coverage@^1.0.0, istanbul-lib-coverage@^1.0.0-alpha, istanbul-lib-coverage@^1.0.0-alpha.0: version "1.0.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.0.tgz#c3f9b6d226da12424064cce87fce0fb57fdfa7a2" -istanbul-lib-hook@^1.0.0-alpha: +istanbul-lib-hook@^1.0.0-alpha.4: version "1.0.0-alpha.4" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.0-alpha.4.tgz#8c5bb9f6fbd8526e0ae6cf639af28266906b938f" dependencies: append-transform "^0.3.0" -istanbul-lib-instrument@^1.0.0-alpha, istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.1.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.3.0.tgz#19f0a973397454989b98330333063a5b56df0e58" +istanbul-lib-instrument@^1.1.1, istanbul-lib-instrument@^1.3.0, istanbul-lib-instrument@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.4.2.tgz#0e2fdfac93c1dabf2e31578637dc78a19089f43e" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" @@ -1883,7 +1881,7 @@ istanbul-lib-instrument@^1.0.0-alpha, istanbul-lib-instrument@^1.1.1, istanbul-l istanbul-lib-coverage "^1.0.0" semver "^5.3.0" -istanbul-lib-report@^1.0.0-alpha: +istanbul-lib-report@^1.0.0-alpha.3: version "1.0.0-alpha.3" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.0.0-alpha.3.tgz#32d5f6ec7f33ca3a602209e278b2e6ff143498af" dependencies: @@ -1894,7 +1892,7 @@ istanbul-lib-report@^1.0.0-alpha: rimraf "^2.4.3" supports-color "^3.1.2" -istanbul-lib-source-maps@^1.0.0-alpha: +istanbul-lib-source-maps@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.0.tgz#9d429218f35b823560ea300a96ff0c3bbdab785f" dependencies: @@ -1903,59 +1901,40 @@ istanbul-lib-source-maps@^1.0.0-alpha: rimraf "^2.4.4" source-map "^0.5.3" -istanbul-reports@^1.0.0-alpha: +istanbul-reports@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.0.0.tgz#24b4eb2b1d29d50f103b369bd422f6e640aa0777" dependencies: handlebars "^4.0.3" -istanbul@^0.4.5: - version "0.4.5" - resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - jest-changed-files@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" -jest-cli@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-17.0.3.tgz#700b8c02a9ea0ec9eab0cd5a9fd42d8a858ce146" +jest-cli@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" dependencies: ansi-escapes "^1.4.0" callsites "^2.0.0" chalk "^1.1.1" graceful-fs "^4.1.6" is-ci "^1.0.9" - istanbul-api "^1.0.0-aplha.10" + istanbul-api "^1.1.0-alpha.1" istanbul-lib-coverage "^1.0.0" istanbul-lib-instrument "^1.1.1" jest-changed-files "^17.0.2" - jest-config "^17.0.3" - jest-environment-jsdom "^17.0.2" + jest-config "^18.1.0" + jest-environment-jsdom "^18.1.0" jest-file-exists "^17.0.0" - jest-haste-map "^17.0.3" - jest-jasmine2 "^17.0.3" - jest-mock "^17.0.2" - jest-resolve "^17.0.3" - jest-resolve-dependencies "^17.0.3" - jest-runtime "^17.0.3" - jest-snapshot "^17.0.3" - jest-util "^17.0.2" + jest-haste-map "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-resolve-dependencies "^18.1.0" + jest-runtime "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" json-stable-stringify "^1.0.0" node-notifier "^4.6.1" sane "~1.4.1" @@ -1965,149 +1944,150 @@ jest-cli@^17.0.3: worker-farm "^1.3.1" yargs "^6.3.0" -jest-config@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-17.0.3.tgz#b6ed75d90d090b731fd894231904cadb7d5a5df2" +jest-config@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" dependencies: chalk "^1.1.1" - istanbul "^0.4.5" - jest-environment-jsdom "^17.0.2" - jest-environment-node "^17.0.2" - jest-jasmine2 "^17.0.3" - jest-mock "^17.0.2" - jest-resolve "^17.0.3" - jest-util "^17.0.2" + jest-environment-jsdom "^18.1.0" + jest-environment-node "^18.1.0" + jest-jasmine2 "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-util "^18.1.0" json-stable-stringify "^1.0.0" -jest-diff@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-17.0.3.tgz#8fb31efab3b314d7b61b7b66b0bdea617ef1c02f" +jest-diff@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" dependencies: chalk "^1.1.3" diff "^3.0.0" - jest-matcher-utils "^17.0.3" - pretty-format "~4.2.1" + jest-matcher-utils "^18.1.0" + pretty-format "^18.1.0" -jest-environment-jsdom@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-17.0.2.tgz#a3098dc29806d40802c52b62b848ab6aa00fdba0" +jest-environment-jsdom@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" dependencies: - jest-mock "^17.0.2" - jest-util "^17.0.2" - jsdom "^9.8.1" + jest-mock "^18.0.0" + jest-util "^18.1.0" + jsdom "^9.9.1" -jest-environment-node@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-17.0.2.tgz#aff6133f4ca2faddcc5b0ce7d25cec83e16d8463" +jest-environment-node@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" dependencies: - jest-mock "^17.0.2" - jest-util "^17.0.2" + jest-mock "^18.0.0" + jest-util "^18.1.0" jest-file-exists@^17.0.0: version "17.0.0" resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" -jest-haste-map@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-17.0.3.tgz#5232783e70577217b6b17d2a1c1766637a1d2fbd" +jest-haste-map@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" dependencies: fb-watchman "^1.9.0" graceful-fs "^4.1.6" - multimatch "^2.1.0" + micromatch "^2.3.11" sane "~1.4.1" worker-farm "^1.3.1" -jest-jasmine2@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-17.0.3.tgz#d4336b89f3ad288269a1c8e2bfc180dcf89c6ad1" +jest-jasmine2@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" dependencies: graceful-fs "^4.1.6" - jest-matchers "^17.0.3" - jest-snapshot "^17.0.3" - jest-util "^17.0.2" + jest-matcher-utils "^18.1.0" + jest-matchers "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" -jest-matcher-utils@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-17.0.3.tgz#f108e49b956e152c6626dcc0aba864f59ab7b0d3" +jest-matcher-utils@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" dependencies: chalk "^1.1.3" - pretty-format "~4.2.1" + pretty-format "^18.1.0" -jest-matchers@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-17.0.3.tgz#88b95348c919343db86d08f12354a8650ae7eddf" +jest-matchers@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" dependencies: - jest-diff "^17.0.3" - jest-matcher-utils "^17.0.3" - jest-util "^17.0.2" + jest-diff "^18.1.0" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" + pretty-format "^18.1.0" -jest-mock@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-17.0.2.tgz#3dfe9221afd9aa61b3d9992840813a358bb2f429" +jest-mock@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" -jest-resolve-dependencies@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-17.0.3.tgz#bbd37f4643704b97a980927212f3ab12b06e8894" +jest-resolve-dependencies@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" dependencies: jest-file-exists "^17.0.0" - jest-resolve "^17.0.3" + jest-resolve "^18.1.0" -jest-resolve@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-17.0.3.tgz#7692a79de2831874375e9d664bc782c29e4da262" +jest-resolve@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" dependencies: browser-resolve "^1.11.2" jest-file-exists "^17.0.0" - jest-haste-map "^17.0.3" - resolve "^1.1.6" + jest-haste-map "^18.1.0" + resolve "^1.2.0" -jest-runtime@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-17.0.3.tgz#eff4055fe8c3e17c95ed1aaaf5f719c420b86b1f" +jest-runtime@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" dependencies: babel-core "^6.0.0" - babel-jest "^17.0.2" - babel-plugin-istanbul "^2.0.0" + babel-jest "^18.0.0" + babel-plugin-istanbul "^3.0.0" chalk "^1.1.3" graceful-fs "^4.1.6" - jest-config "^17.0.3" + jest-config "^18.1.0" jest-file-exists "^17.0.0" - jest-haste-map "^17.0.3" - jest-mock "^17.0.2" - jest-resolve "^17.0.3" - jest-snapshot "^17.0.3" - jest-util "^17.0.2" + jest-haste-map "^18.1.0" + jest-mock "^18.0.0" + jest-resolve "^18.1.0" + jest-snapshot "^18.1.0" + jest-util "^18.1.0" json-stable-stringify "^1.0.0" - multimatch "^2.1.0" + micromatch "^2.3.11" yargs "^6.3.0" -jest-snapshot@^17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-17.0.3.tgz#c8199db4ccbd5515cfecc8e800ab076bdda7abc0" +jest-snapshot@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" dependencies: - jest-diff "^17.0.3" + jest-diff "^18.1.0" jest-file-exists "^17.0.0" - jest-matcher-utils "^17.0.3" - jest-util "^17.0.2" + jest-matcher-utils "^18.1.0" + jest-util "^18.1.0" natural-compare "^1.4.0" - pretty-format "~4.2.1" + pretty-format "^18.1.0" -jest-util@^17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-17.0.2.tgz#9fd9da8091e9904fb976da7e4d8912ca26968638" +jest-util@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" dependencies: chalk "^1.1.1" diff "^3.0.0" graceful-fs "^4.1.6" jest-file-exists "^17.0.0" - jest-mock "^17.0.2" + jest-mock "^18.0.0" mkdirp "^0.5.1" -jest@17.0.3: - version "17.0.3" - resolved "https://registry.yarnpkg.com/jest/-/jest-17.0.3.tgz#89c43b30b0aaad42462e9ea701352dacbad4a354" +jest@18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/jest/-/jest-18.1.0.tgz#bcebf1e203dee5c2ad2091c805300a343d9e6c7d" dependencies: - jest-cli "^17.0.3" + jest-cli "^18.1.0" jodid25519@^1.0.0: version "1.0.2" @@ -2119,7 +2099,7 @@ js-tokens@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" -js-yaml@3.7.0, js-yaml@3.x: +js-yaml@3.7.0, js-yaml@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" dependencies: @@ -2130,9 +2110,9 @@ jsbn@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.0.tgz#650987da0dd74f4ebf5a11377a2aa2d273e97dfd" -jsdom@^9.8.1: - version "9.8.3" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.8.3.tgz#fde29c109c32a1131e0b6c65914e64198f97c370" +jsdom@^9.9.1: + version "9.9.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.9.1.tgz#84f3972ad394ab963233af8725211bce4d01bfd5" dependencies: abab "^1.0.0" acorn "^2.4.0" @@ -2144,7 +2124,7 @@ jsdom@^9.8.1: escodegen "^1.6.1" html-encoding-sniffer "^1.0.1" iconv-lite "^0.4.13" - nwmatcher ">= 1.3.7 < 2.0.0" + nwmatcher ">= 1.3.9 < 2.0.0" parse5 "^1.5.1" request "^2.55.0" sax "^1.1.4" @@ -2152,7 +2132,7 @@ jsdom@^9.8.1: tough-cookie "^2.3.1" webidl-conversions "^3.0.1" whatwg-encoding "^1.0.1" - whatwg-url "^3.0.0" + whatwg-url "^4.1.0" xml-name-validator ">= 2.0.1 < 3.0.0" jsesc@^1.3.0: @@ -2207,7 +2187,7 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" -koa-compose@^3.0.0: +koa-compose@3.2.1, koa-compose@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" dependencies: @@ -2230,16 +2210,16 @@ koa-morgan@1.0.1: dependencies: morgan "^1.6.1" -koa-router-rx@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/koa-router-rx/-/koa-router-rx-0.1.2.tgz#65f6fbf9dc5d1ed2ac518ce8a620e02a662b1220" +koa-router-rx@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/koa-router-rx/-/koa-router-rx-0.3.0.tgz#4093981ca7a0e23f031acafb88f57cd566805610" dependencies: - koa-router "7.0.1" - rxjs "5.0.0-rc.4" + koa-router "7.1.0" + rxjs "5.0.2" -koa-router@7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.0.1.tgz#800a61d0a3342d3d1f96d8c688b84ed2a6314d97" +koa-router@7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/koa-router/-/koa-router-7.1.0.tgz#2fe6d7e6da7e3c46d8781953835c70513a6871f5" dependencies: debug "^2.2.0" http-errors "^1.3.1" @@ -2385,7 +2365,7 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash@^4.0.0, lodash@^4.11.2, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.11.2, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" @@ -2489,18 +2469,12 @@ minimalistic-assert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: brace-expansion "^1.0.0" -minimatch@2.x: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -2509,7 +2483,7 @@ minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2533,15 +2507,6 @@ ms@0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" -multimatch@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - mz@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.6.0.tgz#c8b8521d958df0a4f2768025db69c719ee4ef1ce" @@ -2635,7 +2600,7 @@ node-pre-gyp@^0.6.29: tar "~2.2.1" tar-pack "~3.3.0" -nopt@3.x, nopt@~3.0.6: +nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: @@ -2667,7 +2632,7 @@ number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" -"nwmatcher@>= 1.3.7 < 2.0.0": +"nwmatcher@>= 1.3.9 < 2.0.0": version "1.3.9" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a" @@ -2696,7 +2661,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@1.x, once@^1.3.0: +once@^1.3.0, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -2863,9 +2828,11 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -pretty-format@~4.2.1: - version "4.2.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-4.2.3.tgz#8894c2ac81419cf801629d8f66320a25380d8b05" +pretty-format@^18.1.0: + version "18.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-18.1.0.tgz#fb65a86f7a7f9194963eee91865c1bcf1039e284" + dependencies: + ansi-styles "^2.2.1" private@^0.1.6, private@~0.1.5: version "0.1.6" @@ -2879,16 +2846,16 @@ process@^0.11.0, process@~0.11.0: version "0.11.9" resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" -prom-client@6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-6.2.0.tgz#efdcd944448c57406cea7762595fc98f2ac14f41" +prom-client@7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-7.0.0.tgz#4d755a7b18c55b38fae8028e78340dc1874948eb" dependencies: tdigest "^0.1.1" util-extend "^1.0.1" -prometheus-gc-stats@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/prometheus-gc-stats/-/prometheus-gc-stats-0.3.1.tgz#b98b4a22eebaedbbbf376cde6f80516ad624f71d" +prometheus-gc-stats@0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/prometheus-gc-stats/-/prometheus-gc-stats-0.3.2.tgz#e5772ee124627feb4d9169a2ffcc8de082951b81" dependencies: optional "^0.1.3" optionalDependencies: @@ -3006,6 +2973,10 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" +regenerator-runtime@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" + regenerator-runtime@^0.9.5: version "0.9.6" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" @@ -3082,10 +3053,14 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -resolve@1.1.7, resolve@1.1.x, resolve@^1.1.6: +resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" +resolve@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -3106,9 +3081,9 @@ rx-lite@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -rxjs@5.0.0-rc.4: - version "5.0.0-rc.4" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.0.0-rc.4.tgz#a4d08bc5d7f30d48ed7130e2995490c326a325c4" +rxjs@5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.0.2.tgz#cc6513756daa93cab4085c1b5a19a3e28fb6c6bf" dependencies: symbol-observable "^1.0.1" @@ -3386,9 +3361,9 @@ tdigest@^0.1.1: dependencies: bintrees "1.0.1" -test-exclude@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-2.1.3.tgz#a8d8968e1da83266f9864f2852c55e220f06434a" +test-exclude@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-3.3.0.tgz#7a17ca1239988c98367b0621456dbb7d4bc38977" dependencies: arrify "^1.0.1" micromatch "^2.3.11" @@ -3607,9 +3582,9 @@ whatwg-encoding@^1.0.1: dependencies: iconv-lite "0.4.13" -whatwg-url@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-3.1.0.tgz#7bdcae490f921aef6451fb6739ec6bbd8e907bf6" +whatwg-url@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.2.0.tgz#abf1a3f5ff4bc2005b3f0c2119382631789d8e44" dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" @@ -3646,7 +3621,7 @@ wordwrap@0.0.2, wordwrap@~0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" -wordwrap@^1.0.0, wordwrap@~1.0.0: +wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" From 78a43e4fd05d667009ce8eae7ca226de8ae1f66a Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Mon, 9 Jan 2017 20:54:55 +0100 Subject: [PATCH 03/10] feat(server): Add convenience methods to nconf. affects: tessellate-server --- packages/tessellate-server/src/nconf.js | 52 +++++++++++++++++++++---- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/packages/tessellate-server/src/nconf.js b/packages/tessellate-server/src/nconf.js index c1cf7fb..080eaed 100644 --- a/packages/tessellate-server/src/nconf.js +++ b/packages/tessellate-server/src/nconf.js @@ -51,11 +51,47 @@ function readYamlOrJsonFile(file: string): Object { const readConfigFile = () => readYamlOrJsonFile(path.resolve(process.cwd(), 'config')) -export default nconf.use('memory') - .argv() - .env() - .add('config', {type: 'literal', store: readConfigFile()}) - .defaults({ - MORGAN_FORMAT: 'common', - MORGAN_THRESHOLD: 0 - }) +class IllegalTypeError extends Error { + constructor(message: string) { + super(message) + } +} + +function parseConfigValue(value: mixed): Object { + if (typeof value === 'string') { + try { + return JSON.parse(value) + } catch(e) { + throw new IllegalTypeError('Cannot parse: ' + value) + } + } else if (typeof value === 'object' && value) { + return value + } else { + throw new IllegalTypeError('Not a valid object: ' + JSON.stringify(value)) + } +} + +nconf + .use('memory') + .argv() + .env() + .add('config', {type: 'literal', store: readConfigFile()}) + .defaults({ + MORGAN_FORMAT: 'common', + MORGAN_THRESHOLD: 0 + }) + +export default { + set: (key: string, value: any) => nconf.set(key, value), + get: (key: string) => nconf.get(key), + getObject: (key: string) => parseConfigValue(nconf.get(key)), + getString: (key: string) => '' + nconf.get(key), + argv: function(args: Object) { + nconf.argv(args) + return this + }, + defaults: function(defaults: Object) { + nconf.defaults(defaults) + return this + } +} From 039bb917b3627c599c3cca4d23d3c8f71039970e Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Wed, 25 Jan 2017 10:26:51 +0100 Subject: [PATCH 04/10] fix(server): Upgrade dependencies. affects: tessellate-server --- packages/tessellate-server/package.json | 15 +++++++-------- packages/tessellate-server/src/MetricsApp.js | 2 -- .../test/TessellateServer.test.js | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index dd7e36d..1b017c3 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -24,28 +24,27 @@ }, "dependencies": { "js-yaml": "3.7.0", - "koa": "2.0.0-alpha.7", + "koa": "2.0.0", "koa-compose": "3.2.1", "koa-morgan": "1.0.1", - "koa-router-rx": "0.3.0", + "koa-router-rx": "0.3.1", "mz": "2.6.0", "nconf": "0.8.4", - "prom-client": "7.0.0", + "prom-client": "7.0.1", "prometheus-gc-stats": "0.3.2" }, "devDependencies": { - "babel-cli": "6.18.0", - "babel-core": "6.21.0", + "babel-cli": "6.22.2", + "babel-core": "6.22.1", "babel-jest": "18.0.0", "babel-loader": "6.2.10", "babel-plugin-syntax-flow": "6.18.0", - "babel-plugin-transform-flow-strip-types": "6.21.0", + "babel-plugin-transform-flow-strip-types": "6.22.0", "babel-preset-latest-minimal": "1.1.2", - "flow-bin": "0.37.4", + "flow-bin": "0.38.0", "flow-typed": "2.0.0", "jest": "18.1.0", "supertest": "2.0.1", - "supertest-as-promised": "4.0.2", "webpack": "2.1.0-beta.25" }, "jest": { diff --git a/packages/tessellate-server/src/MetricsApp.js b/packages/tessellate-server/src/MetricsApp.js index 830cfd8..3851354 100644 --- a/packages/tessellate-server/src/MetricsApp.js +++ b/packages/tessellate-server/src/MetricsApp.js @@ -5,8 +5,6 @@ import RxRouter from 'koa-router-rx' import prometheus from 'prom-client' import prometheusGCStats from 'prometheus-gc-stats' -import type { Epic } from 'koa-router-rx' - export default class MetricsApp { app: Koa; router: RxRouter; diff --git a/packages/tessellate-server/test/TessellateServer.test.js b/packages/tessellate-server/test/TessellateServer.test.js index b19421e..5172498 100644 --- a/packages/tessellate-server/test/TessellateServer.test.js +++ b/packages/tessellate-server/test/TessellateServer.test.js @@ -1,6 +1,6 @@ // @flow -import supertest from 'supertest-as-promised' +import supertest from 'supertest' import TessellateServer from '../src/TessellateServer' describe('TessellateServer', () => { From 9a040fc6c806e1988af048d9723e3440136add7b Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Wed, 25 Jan 2017 10:27:37 +0100 Subject: [PATCH 05/10] test(server): Add nconf tests. affects: tessellate-server --- packages/tessellate-server/config.yaml | 5 ++++ packages/tessellate-server/test/nconf.test.js | 26 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 packages/tessellate-server/config.yaml create mode 100644 packages/tessellate-server/test/nconf.test.js diff --git a/packages/tessellate-server/config.yaml b/packages/tessellate-server/config.yaml new file mode 100644 index 0000000..6f81040 --- /dev/null +++ b/packages/tessellate-server/config.yaml @@ -0,0 +1,5 @@ +# Example config file +FOO: bar +BAR: + what: is + code: 42 diff --git a/packages/tessellate-server/test/nconf.test.js b/packages/tessellate-server/test/nconf.test.js new file mode 100644 index 0000000..b1f4354 --- /dev/null +++ b/packages/tessellate-server/test/nconf.test.js @@ -0,0 +1,26 @@ +// @flow + +import nconf from '../src/nconf' + +describe('nconf', () => { + it('should store a value', () => { + const foo = nconf.get('FOO') + expect(foo).toBe('bar') + }) + + it('should store a string value', () => { + const foo = nconf.getString('FOO') + expect(foo).toBe('bar') + }) + + it('should store an object value', () => { + const bar = nconf.getObject('BAR') + expect(bar).toEqual({what: 'is', code: 42}) + }) + + it('should set a value', () => { + nconf.set('NEW_VALUE', 41) + const value = nconf.get('NEW_VALUE') + expect(value).toEqual(41) + }) +}) From dda9e7af56771aa0efae03d8f8cfe6a87a2872ae Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Wed, 25 Jan 2017 10:29:48 +0100 Subject: [PATCH 06/10] fix(server): Build distribution with babel onlz and export flow type files. affects: tessellate-server Part of #39. --- packages/tessellate-server/package.json | 12 +- packages/tessellate-server/yarn.lock | 801 +++++------------------- 2 files changed, 166 insertions(+), 647 deletions(-) diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index 1b017c3..9fc3ed4 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -16,11 +16,14 @@ "url": "https://github.com/zalando-incubator/tessellate.git" }, "scripts": { + "clean": "rm -rf dist/*", + "dist": "babel -d dist src", "start": "babel-node example/server.js", - "dist": "webpack", "test": "NODE_ENV=test MORGAN_THRESHOLD=500 jest --coverage", "flow-check": "flow check", - "flow-typed-install": "flow-typed install" + "flow-gen-files": "flow-copy-source -v src dist", + "flow-typed-install": "flow-typed install -o", + "prepublish": "npm run clean && npm run dist && npm run flow-gen-files" }, "dependencies": { "js-yaml": "3.7.0", @@ -37,15 +40,14 @@ "babel-cli": "6.22.2", "babel-core": "6.22.1", "babel-jest": "18.0.0", - "babel-loader": "6.2.10", "babel-plugin-syntax-flow": "6.18.0", "babel-plugin-transform-flow-strip-types": "6.22.0", "babel-preset-latest-minimal": "1.1.2", "flow-bin": "0.38.0", + "flow-copy-source": "1.1.0", "flow-typed": "2.0.0", "jest": "18.1.0", - "supertest": "2.0.1", - "webpack": "2.1.0-beta.25" + "supertest": "2.0.1" }, "jest": { "testEnvironment": "node", diff --git a/packages/tessellate-server/yarn.lock b/packages/tessellate-server/yarn.lock index 61b8666..7c10e12 100644 --- a/packages/tessellate-server/yarn.lock +++ b/packages/tessellate-server/yarn.lock @@ -27,17 +27,6 @@ acorn@^2.1.0, acorn@^2.4.0: version "2.7.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" -acorn@^3.2.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - -ajv@^4.7.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.9.0.tgz#5a358085747b134eb567d6d15e015f1d7802f45c" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -120,14 +109,6 @@ arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" -asn1.js@^4.0.0: - version "4.9.0" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.0.tgz#f71a1243f3e79d46d7b07d7fbf4824ee73af054a" - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" @@ -140,23 +121,11 @@ assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - dependencies: - util "0.10.3" - async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@2.0.0-rc.4: - version "2.0.0-rc.4" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.0-rc.4.tgz#9b7f60724c17962a973f787419e0ebc5571dbad8" - dependencies: - lodash "^4.3.0" - -async@^1.3.0, async@^1.4.0, async@^1.4.2, async@^1.5.2: +async@^1.4.0, async@^1.4.2, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -182,18 +151,18 @@ aws4@^1.2.1: version "1.5.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755" -babel-cli@6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.18.0.tgz#92117f341add9dead90f6fa7d0a97c0cc08ec186" +babel-cli@6.22.2: + version "6.22.2" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.22.2.tgz#3f814c8acf52759082b8fedd9627f938936ab559" dependencies: - babel-core "^6.18.0" - babel-polyfill "^6.16.0" - babel-register "^6.18.0" - babel-runtime "^6.9.0" + babel-core "^6.22.1" + babel-polyfill "^6.22.0" + babel-register "^6.22.0" + babel-runtime "^6.22.0" commander "^2.8.1" convert-source-map "^1.1.0" fs-readdir-recursive "^1.0.0" - glob "^5.0.5" + glob "^7.0.0" lodash "^4.2.0" output-file-sync "^1.1.0" path-is-absolute "^1.0.0" @@ -201,29 +170,29 @@ babel-cli@6.18.0: source-map "^0.5.0" v8flags "^2.0.10" optionalDependencies: - chokidar "^1.0.0" + chokidar "^1.6.1" -babel-code-frame@^6.20.0: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.20.0.tgz#b968f839090f9a8bc6d41938fb96cb84f7387b26" +babel-code-frame@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" dependencies: chalk "^1.1.0" esutils "^2.0.2" - js-tokens "^2.0.0" - -babel-core@6.21.0, babel-core@^6.0.0, babel-core@^6.18.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.21.0.tgz#75525480c21c803f826ef3867d22c19f080a3724" - dependencies: - babel-code-frame "^6.20.0" - babel-generator "^6.21.0" - babel-helpers "^6.16.0" - babel-messages "^6.8.0" - babel-register "^6.18.0" - babel-runtime "^6.20.0" - babel-template "^6.16.0" - babel-traverse "^6.21.0" - babel-types "^6.21.0" + js-tokens "^3.0.0" + +babel-core@6.22.1, babel-core@^6.0.0, babel-core@^6.22.0, babel-core@^6.22.1: + version "6.22.1" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.22.1.tgz#9c5fd658ba1772d28d721f6d25d968fc7ae21648" + dependencies: + babel-code-frame "^6.22.0" + babel-generator "^6.22.0" + babel-helpers "^6.22.0" + babel-messages "^6.22.0" + babel-register "^6.22.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" + babel-traverse "^6.22.1" + babel-types "^6.22.0" babylon "^6.11.0" convert-source-map "^1.1.0" debug "^2.1.1" @@ -235,13 +204,13 @@ babel-core@6.21.0, babel-core@^6.0.0, babel-core@^6.18.0: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.18.0, babel-generator@^6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.21.0.tgz#605f1269c489a1c75deeca7ea16d43d4656c8494" +babel-generator@^6.18.0, babel-generator@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.22.0.tgz#d642bf4961911a8adc7c692b0c9297f325cda805" dependencies: - babel-messages "^6.8.0" - babel-runtime "^6.20.0" - babel-types "^6.21.0" + babel-messages "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.2.0" @@ -341,12 +310,12 @@ babel-helper-replace-supers@^6.18.0, babel-helper-replace-supers@^6.8.0: babel-traverse "^6.18.0" babel-types "^6.18.0" -babel-helpers@^6.16.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.16.0.tgz#1095ec10d99279460553e67eb3eee9973d3867e3" +babel-helpers@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.22.0.tgz#d275f55f2252b8101bff07bc0c556deda657392c" dependencies: - babel-runtime "^6.0.0" - babel-template "^6.16.0" + babel-runtime "^6.22.0" + babel-template "^6.22.0" babel-jest@18.0.0, babel-jest@^18.0.0: version "18.0.0" @@ -356,20 +325,11 @@ babel-jest@18.0.0, babel-jest@^18.0.0: babel-plugin-istanbul "^3.0.0" babel-preset-jest "^18.0.0" -babel-loader@6.2.10: - version "6.2.10" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-6.2.10.tgz#adefc2b242320cd5d15e65b31cea0e8b1b02d4b0" - dependencies: - find-cache-dir "^0.1.1" - loader-utils "^0.2.11" - mkdirp "^0.5.1" - object-assign "^4.0.1" - -babel-messages@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.8.0.tgz#bf504736ca967e6d65ef0adb5a2a5f947c8e0eb9" +babel-messages@^6.22.0, babel-messages@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.22.0.tgz#36066a214f1217e4ed4164867669ecb39e3ea575" dependencies: - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-check-es2015-constants@^6.8.0: version "6.8.0" @@ -567,12 +527,12 @@ babel-plugin-transform-exponentiation-operator@^6.8.0: babel-plugin-syntax-exponentiation-operator "^6.8.0" babel-runtime "^6.0.0" -babel-plugin-transform-flow-strip-types@6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.21.0.tgz#2eea3f8b5bb234339b47283feac155cfb237b948" +babel-plugin-transform-flow-strip-types@6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" dependencies: babel-plugin-syntax-flow "^6.18.0" - babel-runtime "^6.0.0" + babel-runtime "^6.22.0" babel-plugin-transform-regenerator@^6.14.0: version "6.16.1" @@ -589,13 +549,13 @@ babel-plugin-transform-strict-mode@^6.18.0: babel-runtime "^6.0.0" babel-types "^6.18.0" -babel-polyfill@^6.16.0, babel-polyfill@^6.6.1: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.16.0.tgz#2d45021df87e26a374b6d4d1a9c65964d17f2422" +babel-polyfill@^6.22.0, babel-polyfill@^6.6.1: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.22.0.tgz#1ac99ebdcc6ba4db1e2618c387b2084a82154a3b" dependencies: - babel-runtime "^6.9.1" + babel-runtime "^6.22.0" core-js "^2.4.0" - regenerator-runtime "^0.9.5" + regenerator-runtime "^0.10.0" babel-preset-jest@^18.0.0: version "18.0.0" @@ -633,77 +593,70 @@ babel-preset-latest-minimal@1.1.2: babel-plugin-transform-regenerator "^6.14.0" es-feature-detect "^1.0.0" -babel-register@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.18.0.tgz#892e2e03865078dd90ad2c715111ec4449b32a68" +babel-register@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.22.0.tgz#a61dd83975f9ca4a9e7d6eff3059494cd5ea4c63" dependencies: - babel-core "^6.18.0" - babel-runtime "^6.11.6" + babel-core "^6.22.0" + babel-runtime "^6.22.0" core-js "^2.4.0" home-or-tmp "^2.0.0" lodash "^4.2.0" mkdirp "^0.5.1" source-map-support "^0.4.2" -babel-runtime@^6.0.0, babel-runtime@^6.11.6, babel-runtime@^6.20.0, babel-runtime@^6.9.1: - version "6.20.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.20.0.tgz#87300bdcf4cd770f09bf0048c64204e17806d16f" +babel-runtime@^6.0.0, babel-runtime@^6.22.0, babel-runtime@^6.9.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611" dependencies: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-runtime@^6.9.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.18.0.tgz#0f4177ffd98492ef13b9f823e9994a02584c9078" +babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.8.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.22.0.tgz#403d110905a4626b317a2a1fcb8f3b73204b2edb" dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.9.5" - -babel-template@^6.14.0, babel-template@^6.15.0, babel-template@^6.16.0, babel-template@^6.8.0: - version "6.16.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.16.0.tgz#e149dd1a9f03a35f817ddbc4d0481988e7ebc8ca" - dependencies: - babel-runtime "^6.9.0" - babel-traverse "^6.16.0" - babel-types "^6.16.0" + babel-runtime "^6.22.0" + babel-traverse "^6.22.0" + babel-types "^6.22.0" babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.16.0, babel-traverse@^6.18.0, babel-traverse@^6.21.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.21.0.tgz#69c6365804f1a4f69eb1213f85b00a818b8c21ad" +babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1: + version "6.22.1" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.22.1.tgz#3b95cd6b7427d6f1f757704908f2fc9748a5f59f" dependencies: - babel-code-frame "^6.20.0" - babel-messages "^6.8.0" - babel-runtime "^6.20.0" - babel-types "^6.21.0" - babylon "^6.11.0" + babel-code-frame "^6.22.0" + babel-messages "^6.22.0" + babel-runtime "^6.22.0" + babel-types "^6.22.0" + babylon "^6.15.0" debug "^2.2.0" globals "^9.0.0" invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.21.0, babel-types@^6.8.0, babel-types@^6.9.0: - version "6.21.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.21.0.tgz#314b92168891ef6d3806b7f7a917fdf87c11a4b2" +babel-types@^6.16.0, babel-types@^6.18.0, babel-types@^6.22.0, babel-types@^6.8.0, babel-types@^6.9.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.22.0.tgz#2a447e8d0ea25d2512409e4175479fd78cc8b1db" dependencies: - babel-runtime "^6.20.0" + babel-runtime "^6.22.0" esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^1.0.1" -babylon@^6.11.0, babylon@^6.13.0: +babylon@^6.11.0: version "6.14.1" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815" +babylon@^6.13.0, babylon@^6.15.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e" + balanced-match@^0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" -base64-js@^1.0.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" - basic-auth@~1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.0.4.tgz#030935b01de7c9b94a824b29f3fccb750d3a5290" @@ -714,10 +667,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -big.js@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.1.3.tgz#4cada2193652eb3ca9ec8e55c9015669c9806978" - binary-extensions@^1.0.0: version "1.7.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.7.0.tgz#6c1610db163abfb34edfe42fa423343a1e01185d" @@ -736,14 +685,10 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.1.1, bluebird@^3.3.1: +bluebird@^3.1.1: version "3.4.6" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.4.6.tgz#01da8d821d87813d158967e743d5fe6c62cf8c0f" -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.6" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" - boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -765,67 +710,12 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -brorand@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.0.6.tgz#4028706b915f91f7b349a2e0bf3c376039d216e5" - browser-resolve@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" dependencies: resolve "1.1.7" -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.0.6.tgz#5e7725dbdef1fd5930d4ebab48567ce451c48a0a" - dependencies: - buffer-xor "^1.0.2" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - inherits "^2.0.1" - -browserify-cipher@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.0.tgz#9988244874bf5ed4e28da95666dcd66ac8fc363a" - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.0.tgz#daa277717470922ed2fe18594118a175439721dd" - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.0.tgz#10773910c3c206d5420a46aad8694f820b85968f" - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.1.4.tgz#bb35f8a519f600e0fa6b8485241c979d0141fb2d" - dependencies: - pako "~0.2.0" - bser@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" @@ -836,26 +726,10 @@ buffer-shims@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" -buffer-xor@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" -builtin-status-codes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-2.0.0.tgz#6f22003baacf003ccd287afe6872151fddc58579" - callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" @@ -904,7 +778,7 @@ charenc@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/charenc/-/charenc-0.0.1.tgz#004cff9feaf102382ed12db58dd6f962796d6e88" -chokidar@^1.0.0, chokidar@^1.4.3: +chokidar@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.6.1.tgz#2f4447ab5e96e50fb3d789fd90d4c72e0e4c70c2" dependencies: @@ -923,12 +797,6 @@ ci-info@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" -cipher-base@^1.0.0, cipher-base@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.3.tgz#eeabf194419ce900da3018c207d212f2a6df0a07" - dependencies: - inherits "^2.0.1" - cli-table@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" @@ -958,10 +826,6 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" -clone@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -994,10 +858,6 @@ commander@^2.8.1, commander@^2.9.0: dependencies: graceful-readlink ">= 1.0.0" -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - component-emitter@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -1006,20 +866,10 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - dependencies: - date-now "^0.1.4" - console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - content-disposition@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.1.tgz#87476c6a67c8daa87e32e87616df883ba7fb071b" @@ -1055,29 +905,6 @@ 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" -create-ecdh@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.0.tgz#888c723596cdf7612f6498233eebd7a35301737d" - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.1.2.tgz#51210062d7bb7479f6c65bb41a92208b1d61abad" - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - ripemd160 "^1.0.0" - sha.js "^2.3.6" - -create-hmac@^1.1.0, create-hmac@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.4.tgz#d3fb4ba253eb8b3f56e39ea2fbcb8af747bd3170" - dependencies: - create-hash "^1.1.0" - inherits "^2.0.1" - crypt@~0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/crypt/-/crypt-0.0.1.tgz#5f11b21a6c05ef1b5e79708366da6374ece1e6a2" @@ -1088,21 +915,6 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" -crypto-browserify@^3.11.0: - version "3.11.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.11.0.tgz#3652a0906ab9b2a7e0c3ce66a408e957a2485522" - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": version "0.3.1" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.1.tgz#c9e37ef2490e64f6d1baa10fda852257082c25d3" @@ -1119,10 +931,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - debug@*, debug@^2.1.1, debug@^2.2.0: version "2.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-2.3.3.tgz#40c453e67e6e13c901ddec317af8986cda9eff8c" @@ -1163,13 +971,6 @@ depd@^1.1.0, depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - destroy@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -1184,18 +985,6 @@ diff@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.1.0.tgz#9406c73a401e6c2b3ba901c5e2c44eb6a60c5385" -diffie-hellman@^5.0.0: - version "5.0.2" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.2.tgz#b5835739270cfe26acf632099fded2a07f209e5e" - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.1.7" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.1.7.tgz#867aa4b093faa05f1de08c06f4d7b21fdf8698bc" - ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" @@ -1206,29 +995,7 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -elliptic@^6.0.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.3.2.tgz#e4c81e0829cf0a65ab70e998b8232723b5c1bc48" - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - inherits "^2.0.1" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - -enhanced-resolve@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-2.3.0.tgz#a115c32504b6302e85a76269d7a57ccdd962e359" - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.3.0" - object-assign "^4.0.1" - tapable "^0.2.3" - -"errno@>=0.1.1 <0.2.0-0", errno@^0.1.3: +"errno@>=0.1.1 <0.2.0-0": version "0.1.4" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" dependencies: @@ -1286,16 +1053,6 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - -evp_bytestokey@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz#497b66ad9fef65cd7c08a6180824ba1476b66e53" - dependencies: - create-hash "^1.1.1" - exec-sh@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.0.tgz#14f75de3f20d286ef933099b2ce50a90359cef10" @@ -1359,14 +1116,6 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - find-up@^1.0.0, find-up@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -1374,9 +1123,18 @@ find-up@^1.0.0, find-up@^1.1.2: path-exists "^2.0.0" pinkie-promise "^2.0.0" -flow-bin@0.37.4: - version "0.37.4" - resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.37.4.tgz#3d8da2ef746e80e730d166e09040f4198969b76b" +flow-bin@0.38.0: + version "0.38.0" + resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.38.0.tgz#3ae096d401c969cc8b5798253fb82381e2d0237a" + +flow-copy-source@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/flow-copy-source/-/flow-copy-source-1.1.0.tgz#0779692ff81693d304021b2d49753898a0772237" + dependencies: + fs-extra "^0.26.5" + glob "^7.0.0" + kefir "^3.2.0" + yargs "^3.32.0" flow-typed@2.0.0: version "2.0.0" @@ -1435,6 +1193,16 @@ fresh@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.3.0.tgz#651f838e22424e7566de161d8358caa199f83d4f" +fs-extra@^0.26.5: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + fs-readdir-recursive@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560" @@ -1527,17 +1295,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^5.0.5: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.3, glob@^7.0.5, glob@^7.0.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1552,7 +1310,7 @@ globals@^9.0.0: version "9.14.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.14.0.tgz#8859936af0038741263053b39d0e76ca241e4034" -graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6: +graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1601,12 +1359,6 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" -hash.js@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.0.3.tgz#1332ff00156c0a0ffdd8236013d07b77a0451573" - dependencies: - inherits "^2.0.1" - hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -1667,10 +1419,6 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-0.0.1.tgz#3f91365cabe60b77ed0ebba24b454e3e09d95a82" - iconv-lite@0.4.13: version "0.4.13" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.13.tgz#1f88aba4ab0b1508e8312acc39345f36e992e2f2" @@ -1679,14 +1427,6 @@ iconv-lite@^0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" -ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1706,10 +1446,6 @@ ini@^1.3.0, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" -interpret@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.1.tgz#d579fb7f693b858004947af39fa0db49f795602c" - invariant@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -1825,7 +1561,7 @@ isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: +isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2099,6 +1835,10 @@ js-tokens@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-2.0.0.tgz#79903f5563ee778cc1162e6dcf1a0027c97f9cb5" +js-tokens@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.0.tgz#a2f2a969caae142fb3cd56228358c89366957bd1" + js-yaml@3.7.0, js-yaml@^3.7.0: version "3.7.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" @@ -2147,7 +1887,7 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -2161,6 +1901,12 @@ json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -2177,6 +1923,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.3.6" +kefir@^3.2.0: + version "3.7.1" + resolved "https://registry.yarnpkg.com/kefir/-/kefir-3.7.1.tgz#e77f56feeec46f4a2ee2997e5c3226e904877b5b" + dependencies: + symbol-observable "^1.0.1" + keygrip@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.0.1.tgz#b02fa4816eef21a8c4b35ca9e52921ffc89a30e9" @@ -2187,6 +1939,12 @@ kind-of@^3.0.2: dependencies: is-buffer "^1.0.2" +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + koa-compose@3.2.1, koa-compose@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" @@ -2210,12 +1968,12 @@ koa-morgan@1.0.1: dependencies: morgan "^1.6.1" -koa-router-rx@0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/koa-router-rx/-/koa-router-rx-0.3.0.tgz#4093981ca7a0e23f031acafb88f57cd566805610" +koa-router-rx@0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/koa-router-rx/-/koa-router-rx-0.3.1.tgz#abf7bcd51b3d0ad48c3c776a014cfd033445c491" dependencies: koa-router "7.1.0" - rxjs "5.0.2" + rxjs "5.0.3" koa-router@7.1.0: version "7.1.0" @@ -2227,9 +1985,9 @@ koa-router@7.1.0: methods "^1.0.1" path-to-regexp "^1.1.1" -koa@2.0.0-alpha.7: - version "2.0.0-alpha.7" - resolved "https://registry.yarnpkg.com/koa/-/koa-2.0.0-alpha.7.tgz#6e75c18d287c16b314ed1dc77e97c106b7b9e7fc" +koa@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/koa/-/koa-2.0.0.tgz#da865ae8ee4afae070425290455d2cdf4885f9dc" dependencies: accepts "^1.2.2" content-disposition "~0.5.0" @@ -2283,19 +2041,6 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" -loader-runner@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.2.0.tgz#824c1b699c4e7a2b6501b85902d5b862bf45b3fa" - -loader-utils@^0.2.11: - version "0.2.16" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.16.tgz#f08632066ed8282835dff88dfb52704765adee6d" - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - object-assign "^4.0.1" - lodash._arraycopy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" @@ -2365,7 +2110,7 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" -lodash@^4.0.0, lodash@^4.11.2, lodash@^4.14.0, lodash@^4.2.0, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.11.2, lodash@^4.14.0, lodash@^4.2.0: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" @@ -2411,13 +2156,6 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" -memory-fs@^0.3.0, memory-fs@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" @@ -2444,13 +2182,6 @@ micromatch@^2.1.5, micromatch@^2.3.11: parse-glob "^3.0.4" regex-cache "^0.4.2" -miller-rabin@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.0.tgz#4a62fb1d42933c05583982f4c716f6fb9e6c6d3d" - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - mime-db@~1.25.0: version "1.25.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" @@ -2465,11 +2196,7 @@ mime@^1.2.11, mime@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" -minimalistic-assert@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz#702be2dda6b37f4836bcb3f5db56641b64a1d3d3" - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: +minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" dependencies: @@ -2483,7 +2210,7 @@ minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: +"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2546,34 +2273,6 @@ node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" -node-libs-browser@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-1.1.1.tgz#2a38243abedd7dffcd07a97c9aca5668975a6fea" - dependencies: - assert "^1.1.1" - browserify-zlib "^0.1.4" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "0.0.1" - os-browserify "^0.2.0" - path-browserify "0.0.0" - process "^0.11.0" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.0.5" - stream-browserify "^2.0.1" - stream-http "^2.3.1" - string_decoder "^0.10.25" - timers-browserify "^1.4.2" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - node-notifier@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-4.6.1.tgz#056d14244f3dcc1ceadfe68af9cff0c5473a33f3" @@ -2699,10 +2398,6 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -os-browserify@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" - os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -2725,20 +2420,6 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" -pako@~0.2.0: - version "0.2.9" - resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" - -parse-asn1@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.0.0.tgz#35060f6d5015d37628c770f4e091a0b5a278bc23" - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -2762,10 +2443,6 @@ parseurl@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" @@ -2794,12 +2471,6 @@ path-type@^1.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -pbkdf2@^3.0.3: - version "3.0.9" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.9.tgz#f2c4b25a600058b3c3773c086c37dbbee1ffe693" - dependencies: - create-hmac "^1.1.2" - pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -2814,12 +2485,6 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" -pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - dependencies: - find-up "^1.0.0" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -2842,13 +2507,9 @@ process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" -process@^0.11.0, process@~0.11.0: - version "0.11.9" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.9.tgz#7bd5ad21aa6253e7da8682264f1e11d11c0318c1" - -prom-client@7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-7.0.0.tgz#4d755a7b18c55b38fae8028e78340dc1874948eb" +prom-client@7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/prom-client/-/prom-client-7.0.1.tgz#fa93ba31b76554b2ef1160be804762a9f6f3afe4" dependencies: tdigest "^0.1.1" util-extend "^1.0.1" @@ -2865,21 +2526,7 @@ prr@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" -public-encrypt@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.0.tgz#39f699f3a46560dd5ebacbca693caf7c65c18cc6" - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - -punycode@^1.2.4, punycode@^1.4.1: +punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -2887,14 +2534,6 @@ qs@^6.1.0, qs@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -2902,10 +2541,6 @@ randomatic@^1.1.3: is-number "^2.0.2" kind-of "^3.0.2" -randombytes@^2.0.0, randombytes@^2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec" - rc@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" @@ -2930,7 +2565,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.1.0: +"readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5: version "2.2.2" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" dependencies: @@ -2977,10 +2612,6 @@ regenerator-runtime@^0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.1.tgz#257f41961ce44558b18f7814af48c17559f9faeb" -regenerator-runtime@^0.9.5: - version "0.9.6" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.9.6.tgz#d33eb95d0d2001a4be39659707c51b0cb71ce029" - regex-cache@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" @@ -3067,23 +2698,19 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: +rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: glob "^7.0.5" -ripemd160@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-1.0.1.tgz#93a4bbd4942bc574b69a8fa57c71de10ecca7d6e" - rx-lite@4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -rxjs@5.0.2: - version "5.0.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.0.2.tgz#cc6513756daa93cab4085c1b5a19a3e28fb6c6bf" +rxjs@5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.0.3.tgz#fc8bdf464ebf938812748e4196788f392fef9754" dependencies: symbol-observable "^1.0.1" @@ -3122,12 +2749,6 @@ setprototypeof@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.2.tgz#81a552141ec104b88e89ce383103ad5c66564d08" -sha.js@^2.3.6: - version "2.4.8" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.8.tgz#37068c2c476b6baf402d14a49c67f597921f634f" - dependencies: - inherits "^2.0.1" - shellwords@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.0.tgz#66afd47b6a12932d9071cbfd98a52e785cd0ba14" @@ -3150,10 +2771,6 @@ sntp@1.x.x: dependencies: hoek "2.x.x" -source-list-map@~0.1.0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-0.1.7.tgz#d4b5ce2a46535c72c7e8527c71a77d250618172e" - source-map-support@^0.4.2: version "0.4.6" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.6.tgz#32552aa64b458392a85eab3b0b5ee61527167aeb" @@ -3166,7 +2783,7 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1, source-map@~0.5.3: +source-map@^0.5.0, source-map@^0.5.3, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" @@ -3217,23 +2834,6 @@ sshpk@^1.7.0: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-http@^2.3.1: - version "2.5.0" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.5.0.tgz#585eee513217ed98fe199817e7313b6f772a6802" - dependencies: - builtin-status-codes "^2.0.0" - inherits "^2.0.1" - readable-stream "^2.1.0" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -3246,7 +2846,7 @@ string.prototype.codepointat@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/string.prototype.codepointat/-/string.prototype.codepointat-0.2.0.tgz#6b26e9bd3afcaa7be3b4269b526de1b82000ac78" -string_decoder@^0.10.25, string_decoder@~0.10.x: +string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -3285,13 +2885,6 @@ superagent@^2.0.0: qs "^6.1.0" readable-stream "^2.0.5" -supertest-as-promised@4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/supertest-as-promised/-/supertest-as-promised-4.0.2.tgz#0464f2bd256568d4a59bce84269c0548f6879f1a" - dependencies: - bluebird "^3.3.1" - methods "^1.1.1" - supertest@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/supertest/-/supertest-2.0.1.tgz#a058081d788f1515d4700d7502881e6b759e44cd" @@ -3303,7 +2896,7 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.0, supports-color@^3.1.2: +supports-color@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" dependencies: @@ -3330,10 +2923,6 @@ table@3.7.8: tv4 "^1.2.7" xregexp "^3.0.0" -tapable@^0.2.3, tapable@~0.2.3: - version "0.2.4" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.4.tgz#a7814605089d4ba896c33c7e3566e13dcd194aa5" - tar-pack@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" @@ -3391,20 +2980,10 @@ through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -timers-browserify@^1.4.2: - version "1.4.2" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-1.4.2.tgz#c9c58b575be8407375cb5e2462dacee74359f41d" - dependencies: - process "~0.11.0" - tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - to-fast-properties@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.2.tgz#f3f5c0c3ba7299a7ef99427e44633257ade43320" @@ -3419,10 +2998,6 @@ tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -3448,7 +3023,7 @@ type-is@^1.5.5: media-typer "0.3.0" mime-types "~2.1.13" -uglify-js@^2.6, uglify-js@~2.7.3: +uglify-js@^2.6: version "2.7.5" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.7.5.tgz#4612c0c7baaee2ba7c487de4904ae122079f2ca8" dependencies: @@ -3465,13 +3040,6 @@ uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - dependencies: - punycode "1.3.2" - querystring "0.2.0" - user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" @@ -3484,12 +3052,6 @@ util-extend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" -util@0.10.3, util@^0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - dependencies: - inherits "2.0.1" - uuid@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" @@ -3517,12 +3079,6 @@ verror@1.3.6: dependencies: extsprintf "1.0.2" -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - dependencies: - indexof "0.0.1" - walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -3533,49 +3089,10 @@ watch@~0.10.0: version "0.10.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" -watchpack@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.1.0.tgz#42d44627464a2fadffc9308c0f7562cfde795f24" - dependencies: - async "2.0.0-rc.4" - chokidar "^1.4.3" - graceful-fs "^4.1.2" - webidl-conversions@^3.0.0, webidl-conversions@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" -webpack-sources@^0.1.0: - version "0.1.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.3.tgz#15ce2fb79d0a1da727444ba7c757bf164294f310" - dependencies: - source-list-map "~0.1.0" - source-map "~0.5.3" - -webpack@2.1.0-beta.25: - version "2.1.0-beta.25" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-2.1.0-beta.25.tgz#c35ff4da4ee70344a2f14c35258d95412709e9ed" - dependencies: - acorn "^3.2.0" - ajv "^4.7.0" - async "^1.3.0" - clone "^1.0.2" - enhanced-resolve "^2.2.0" - interpret "^1.0.0" - loader-runner "^2.2.0" - loader-utils "^0.2.11" - memory-fs "~0.3.0" - mkdirp "~0.5.0" - node-libs-browser "^1.0.0" - object-assign "^4.0.1" - source-map "^0.5.3" - supports-color "^3.1.0" - tapable "~0.2.3" - uglify-js "~2.7.3" - watchpack "^1.0.0" - webpack-sources "^0.1.0" - yargs "^4.7.1" - whatwg-encoding@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz#3c6c451a198ee7aec55b1ec61d0920c67801a5f4" @@ -3672,7 +3189,7 @@ yargs-parser@^4.2.0: dependencies: camelcase "^3.0.0" -yargs@^3.19.0: +yargs@^3.19.0, yargs@^3.32.0: version "3.32.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" dependencies: @@ -3684,7 +3201,7 @@ yargs@^3.19.0: window-size "^0.1.4" y18n "^3.2.0" -yargs@^4.2.0, yargs@^4.7.1: +yargs@^4.2.0: version "4.8.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-4.8.1.tgz#c0c42924ca4aaa6b0e6da1739dfb216439f9ddc0" dependencies: From 4d46c7341de6fc25c3d8ce04d4e5a3e00696737a Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Tue, 31 Jan 2017 15:44:19 +0100 Subject: [PATCH 07/10] fix(server): Update typings. affects: tessellate-server --- packages/tessellate-server/package.json | 9 ++-- .../tessellate-server/src/TessellateServer.js | 11 ++--- packages/tessellate-server/src/error.js | 15 ++++--- packages/tessellate-server/yarn.lock | 42 ++++++++----------- 4 files changed, 35 insertions(+), 42 deletions(-) diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index 9fc3ed4..4e14b6c 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -16,13 +16,13 @@ "url": "https://github.com/zalando-incubator/tessellate.git" }, "scripts": { - "clean": "rm -rf dist/*", + "clean": "rimraf dist/*", "dist": "babel -d dist src", "start": "babel-node example/server.js", "test": "NODE_ENV=test MORGAN_THRESHOLD=500 jest --coverage", "flow-check": "flow check", "flow-gen-files": "flow-copy-source -v src dist", - "flow-typed-install": "flow-typed install -o", + "flow-typed-install": "rimraf flow-typed/npm/*_vx.x.x.js && flow-typed install -o", "prepublish": "npm run clean && npm run dist && npm run flow-gen-files" }, "dependencies": { @@ -30,7 +30,7 @@ "koa": "2.0.0", "koa-compose": "3.2.1", "koa-morgan": "1.0.1", - "koa-router-rx": "0.3.1", + "koa-router-rx": "0.3.3", "mz": "2.6.0", "nconf": "0.8.4", "prom-client": "7.0.1", @@ -47,7 +47,8 @@ "flow-copy-source": "1.1.0", "flow-typed": "2.0.0", "jest": "18.1.0", - "supertest": "2.0.1" + "rimraf": "2.5.4", + "supertest": "3.0.0" }, "jest": { "testEnvironment": "node", diff --git a/packages/tessellate-server/src/TessellateServer.js b/packages/tessellate-server/src/TessellateServer.js index 8257dbb..3a9ecf9 100644 --- a/packages/tessellate-server/src/TessellateServer.js +++ b/packages/tessellate-server/src/TessellateServer.js @@ -9,14 +9,15 @@ import MetricsApp from './MetricsApp' import nconf from './nconf' import error from './error' -import type { Server } from 'http' +import type { Middleware } from 'koa' +import type { Server, IncomingMessage, ServerResponse } from 'http' type Options = { name?: string; }; -type Middleware = (ctx: Object, next: () => Promise) => Promise; +type Listener = (req: IncomingMessage, res: ServerResponse) => void; -function startServer(listener: () => void, port: number): Promise { +function startServer(listener: Listener, port: number): Promise { return new Promise((resolve, reject) => { let server = http .createServer(listener) @@ -59,11 +60,11 @@ export default class TessellateServer { const morganFormat = String(nconf.get('MORGAN_FORMAT')) const morganThresh = parseInt(nconf.get('MORGAN_THRESHOLD')) - const morganSkip = (req, res) => res.statusCode < morganThresh + const morganSkip = (req: IncomingMessage, res: ServerResponse) => res.statusCode < morganThresh this.app .use(morgan(morganFormat, {skip: morganSkip})) - .use(error) + .use(error()) .use(additionalMiddleware(this.middleware)) .use(this.router.routes()) .use(this.router.allowedMethods()) diff --git a/packages/tessellate-server/src/error.js b/packages/tessellate-server/src/error.js index e52523c..0cc01c9 100644 --- a/packages/tessellate-server/src/error.js +++ b/packages/tessellate-server/src/error.js @@ -1,5 +1,7 @@ // @flow +import type { Middleware } from 'koa' + export class Problem extends Error { title: string; detail: ?string; @@ -17,16 +19,13 @@ export class Problem extends Error { } } -export default async function error(ctx: Object, next: () => Promise): Promise { - try { - return await next() - } catch (err) { - console.error(err) +export default function middleware(): Middleware { + return async (ctx, next) => next().catch(err => { ctx.status = err.status || err.code || 500 ctx.body = { - title: err.title || err.message, - detail: err.detail, + title: err.title || err.name, + detail: err.detail || err.message, status: ctx.status } - } + }) } diff --git a/packages/tessellate-server/yarn.lock b/packages/tessellate-server/yarn.lock index 7c10e12..5172c3c 100644 --- a/packages/tessellate-server/yarn.lock +++ b/packages/tessellate-server/yarn.lock @@ -125,7 +125,7 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" -async@^1.4.0, async@^1.4.2, async@^1.5.2: +async@^1.4.0, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -1169,15 +1169,7 @@ forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" -form-data@1.0.0-rc4: - version "1.0.0-rc4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.0-rc4.tgz#05ac6bc22227b43e4461f488161554699d4f8b5e" - dependencies: - async "^1.5.2" - combined-stream "^1.0.5" - mime-types "^2.1.10" - -form-data@~2.1.1: +form-data@^2.1.1, form-data@~2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" dependencies: @@ -1968,9 +1960,9 @@ koa-morgan@1.0.1: dependencies: morgan "^1.6.1" -koa-router-rx@0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/koa-router-rx/-/koa-router-rx-0.3.1.tgz#abf7bcd51b3d0ad48c3c776a014cfd033445c491" +koa-router-rx@0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/koa-router-rx/-/koa-router-rx-0.3.3.tgz#f93c3ff7c02a084006db32d12f61b53f30d6710a" dependencies: koa-router "7.1.0" rxjs "5.0.3" @@ -2160,7 +2152,7 @@ merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" -methods@1.x, methods@^1.0.1, methods@^1.1.1: +methods@^1.0.1, methods@^1.1.1, methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -2186,7 +2178,7 @@ mime-db@~1.25.0: version "1.25.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.25.0.tgz#c18dbd7c73a5dbf6f44a024dc0d165a1e7b1c392" -mime-types@^2.0.7, mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: +mime-types@^2.0.7, mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: version "2.1.13" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.13.tgz#e07aaa9c6c6b9a7ca3012c69003ad25a39e92a88" dependencies: @@ -2698,7 +2690,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: +rimraf@2, rimraf@2.5.4, rimraf@^2.2.8, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@~2.5.1, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -2870,27 +2862,27 @@ strip-json-comments@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" -superagent@^2.0.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-2.3.0.tgz#703529a0714e57e123959ddefbce193b2e50d115" +superagent@^3.0.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.4.1.tgz#4bd12741224d0ece6d9f757f1c3becbe7f24c115" dependencies: component-emitter "^1.2.0" cookiejar "^2.0.6" debug "^2.2.0" extend "^3.0.0" - form-data "1.0.0-rc4" + form-data "^2.1.1" formidable "^1.0.17" methods "^1.1.1" mime "^1.3.4" qs "^6.1.0" readable-stream "^2.0.5" -supertest@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/supertest/-/supertest-2.0.1.tgz#a058081d788f1515d4700d7502881e6b759e44cd" +supertest@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.0.0.tgz#8d4bb68fd1830ee07033b1c5a5a9a4021c965296" dependencies: - methods "1.x" - superagent "^2.0.0" + methods "~1.1.2" + superagent "^3.0.0" supports-color@^2.0.0: version "2.0.0" From 9c2d789444c730ebb66c5249854fa809f8e20dda Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Tue, 31 Jan 2017 15:46:01 +0100 Subject: [PATCH 08/10] test(server): Update tests. affects: tessellate-server --- packages/tessellate-server/package.json | 2 +- .../test/TessellateServer.test.js | 37 ++++++++++++++++++- packages/tessellate-server/test/nconf.test.js | 6 +++ 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index 4e14b6c..a920966 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -19,7 +19,7 @@ "clean": "rimraf dist/*", "dist": "babel -d dist src", "start": "babel-node example/server.js", - "test": "NODE_ENV=test MORGAN_THRESHOLD=500 jest --coverage", + "test": "NODE_ENV=test MORGAN_THRESHOLD=999 jest --coverage", "flow-check": "flow check", "flow-gen-files": "flow-copy-source -v src dist", "flow-typed-install": "rimraf flow-typed/npm/*_vx.x.x.js && flow-typed install -o", diff --git a/packages/tessellate-server/test/TessellateServer.test.js b/packages/tessellate-server/test/TessellateServer.test.js index 5172498..4c2a03f 100644 --- a/packages/tessellate-server/test/TessellateServer.test.js +++ b/packages/tessellate-server/test/TessellateServer.test.js @@ -2,6 +2,7 @@ import supertest from 'supertest' import TessellateServer from '../src/TessellateServer' +import { Problem } from '../src/error' describe('TessellateServer', () => { let _server @@ -92,10 +93,44 @@ describe('TessellateServer', () => { const {server, appRequest} = await startServer(new TessellateServer()) server.router.get('/', observable => observable.mapTo('NOPE :(')) - server.use(async (ctx, next) => ctx.body = 'YAY :)', true) + server.use(async (ctx, next) => {ctx.body = 'YAY :)'}, true) await appRequest.get('/') .expect(200) .expect('YAY :)') }) + + it('should handle Errors', async () => { + const {server, appRequest} = await startServer(new TessellateServer()) + + server.use(async (ctx, next) => { throw new Error('Oops!') }) + + const {body} = await appRequest.get('/') + .expect(500) + .expect('Content-Type', /^application\/json/) + + expect(body.title).toBe('Error') + expect(body.detail).toBe('Oops!') + expect(body.status).toBe(500) + }) + + it('should handle Problems', async () => { + const {server, appRequest} = await startServer(new TessellateServer()) + + server.use(async (ctx, next) => { + throw new Problem({ + title: 'A Problem', + detail: 'This is a problem.', + status: 502 + }) + }) + + const {body} = await appRequest.get('/') + .expect(502) + .expect('Content-Type', /^application\/json/) + + expect(body.title).toBe('A Problem') + expect(body.detail).toBe('This is a problem.') + expect(body.status).toBe(502) + }) }) diff --git a/packages/tessellate-server/test/nconf.test.js b/packages/tessellate-server/test/nconf.test.js index b1f4354..52c335c 100644 --- a/packages/tessellate-server/test/nconf.test.js +++ b/packages/tessellate-server/test/nconf.test.js @@ -23,4 +23,10 @@ describe('nconf', () => { const value = nconf.get('NEW_VALUE') expect(value).toEqual(41) }) + + it('should use defaults', () => { + nconf.defaults({'SOME_DEFAULT': 'default'}) + const value = nconf.get('SOME_DEFAULT') + expect(value).toEqual('default') + }) }) From e99fb6e48b78acf7d0ae8814a0e4dd61ca37c7f5 Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Tue, 31 Jan 2017 17:34:20 +0100 Subject: [PATCH 09/10] feat(server): Add bodyparser and export Problem. affects: tessellate-server --- packages/tessellate-server/package.json | 1 + .../tessellate-server/src/TessellateServer.js | 2 + packages/tessellate-server/src/index.js | 1 + .../test/TessellateServer.test.js | 17 ++++++++ packages/tessellate-server/yarn.lock | 41 ++++++++++++++++++- 5 files changed, 61 insertions(+), 1 deletion(-) diff --git a/packages/tessellate-server/package.json b/packages/tessellate-server/package.json index a920966..a6bec53 100644 --- a/packages/tessellate-server/package.json +++ b/packages/tessellate-server/package.json @@ -28,6 +28,7 @@ "dependencies": { "js-yaml": "3.7.0", "koa": "2.0.0", + "koa-bodyparser": "3.2.0", "koa-compose": "3.2.1", "koa-morgan": "1.0.1", "koa-router-rx": "0.3.3", diff --git a/packages/tessellate-server/src/TessellateServer.js b/packages/tessellate-server/src/TessellateServer.js index 3a9ecf9..f3659ea 100644 --- a/packages/tessellate-server/src/TessellateServer.js +++ b/packages/tessellate-server/src/TessellateServer.js @@ -4,6 +4,7 @@ import Koa from 'koa' import http from 'http' import compose from 'koa-compose' import morgan from 'koa-morgan' +import bodyParser from 'koa-bodyparser' import RxRouter from 'koa-router-rx' import MetricsApp from './MetricsApp' import nconf from './nconf' @@ -65,6 +66,7 @@ export default class TessellateServer { this.app .use(morgan(morganFormat, {skip: morganSkip})) .use(error()) + .use(bodyParser({enableTypes: ['json'], strict: true})) .use(additionalMiddleware(this.middleware)) .use(this.router.routes()) .use(this.router.allowedMethods()) diff --git a/packages/tessellate-server/src/index.js b/packages/tessellate-server/src/index.js index 4710c4d..98a989d 100644 --- a/packages/tessellate-server/src/index.js +++ b/packages/tessellate-server/src/index.js @@ -2,3 +2,4 @@ export { default as TessellateServer } from './TessellateServer' export { default as nconf } from './nconf' +export { Problem as Problem } from './error' diff --git a/packages/tessellate-server/test/TessellateServer.test.js b/packages/tessellate-server/test/TessellateServer.test.js index 4c2a03f..a910556 100644 --- a/packages/tessellate-server/test/TessellateServer.test.js +++ b/packages/tessellate-server/test/TessellateServer.test.js @@ -133,4 +133,21 @@ describe('TessellateServer', () => { expect(body.detail).toBe('This is a problem.') expect(body.status).toBe(502) }) + + it('should parse JSON request payloads', async () => { + const {server, appRequest} = await startServer(new TessellateServer()) + const payload = {foo: 'bar'} + let body + + server.router.post('/', observable => observable.map(ctx => { + body = ctx.request.body + return 'OK' + })) + + await appRequest.post('/') + .send(payload) + .expect('OK') + + expect(body).toEqual(payload) + }) }) diff --git a/packages/tessellate-server/yarn.lock b/packages/tessellate-server/yarn.lock index 5172c3c..c79fd46 100644 --- a/packages/tessellate-server/yarn.lock +++ b/packages/tessellate-server/yarn.lock @@ -730,6 +730,10 @@ builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +bytes@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" + callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" @@ -826,6 +830,15 @@ cliui@^3.0.3, cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +co-body@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/co-body/-/co-body-4.2.0.tgz#74df20fa73262125dc45482af04e342ea8db3515" + dependencies: + inflation "~2.0.0" + qs "~4.0.0" + raw-body "~2.1.2" + type-is "~1.6.6" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1419,6 +1432,10 @@ iconv-lite@^0.4.13: version "0.4.15" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" +inflation@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f" + inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" @@ -1937,6 +1954,12 @@ klaw@^1.0.0: optionalDependencies: graceful-fs "^4.1.9" +koa-bodyparser@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/koa-bodyparser/-/koa-bodyparser-3.2.0.tgz#b916de17e2039fe82650481973d7c294f10b5719" + dependencies: + co-body "^4.2.0" + koa-compose@3.2.1, koa-compose@^3.0.0: version "3.2.1" resolved "https://registry.yarnpkg.com/koa-compose/-/koa-compose-3.2.1.tgz#a85ccb40b7d986d8e5a345b3a1ace8eabcf54de7" @@ -2526,6 +2549,10 @@ qs@^6.1.0, qs@~6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.0.tgz#f403b264f23bc01228c74131b407f18d5ea5d442" +qs@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" + randomatic@^1.1.3: version "1.1.6" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" @@ -2533,6 +2560,14 @@ randomatic@^1.1.3: is-number "^2.0.2" kind-of "^3.0.2" +raw-body@~2.1.2: + version "2.1.7" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.1.7.tgz#adfeace2e4fb3098058014d08c072dcc59758774" + dependencies: + bytes "2.4.0" + iconv-lite "0.4.13" + unpipe "1.0.0" + rc@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" @@ -3008,7 +3043,7 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" -type-is@^1.5.5: +type-is@^1.5.5, type-is@~1.6.6: version "1.6.14" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" dependencies: @@ -3032,6 +3067,10 @@ uid-number@~0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" From 9a2f5fc29bca588228abdcc42e3f85e3d33af8e7 Mon Sep 17 00:00:00 2001 From: Maximilian Fellner Date: Wed, 1 Feb 2017 12:23:55 +0100 Subject: [PATCH 10/10] docs(server): Add documentation. affects: tessellate-server --- packages/tessellate-server/README.md | 77 +++++++++++++++++++ packages/tessellate-server/example/server.js | 19 ++++- .../tessellate-server/src/TessellateServer.js | 11 ++- 3 files changed, 100 insertions(+), 7 deletions(-) diff --git a/packages/tessellate-server/README.md b/packages/tessellate-server/README.md index 47edb33..8665b06 100644 --- a/packages/tessellate-server/README.md +++ b/packages/tessellate-server/README.md @@ -1,3 +1,80 @@ # tessellate-server Web service runtime for tessellate services. + +### TessellateServer + +``` +import { TessellateServer } from 'tessellate-server' +``` + +##### constructor(options: Options = {}) + +* `name: string` Optional application name (see [koa.app.name](https://github.com/koajs/koa/blob/v2.x/docs/api/index.md#settings)) + +##### use(middleware: Middleware, defer: boolean = false): TessellateServer + +Add koa [Middleware](https://github.com/koajs/koa/wiki#middleware) that runs **before** any routes are handled. If `defer` is set to `true`, the middleware will run **after** all routes. Also see [koa.app.use](https://github.com/koajs/koa/blob/v2.x/docs/api/index.md#appusefunction). + +##### start(port: number | string, metricsPort?: number | string): Promise + +Start the koa application server and [prometheus](https://github.com/siimon/prom-client) metrics server on the specified ports. The default value for `metricsPort` is `port + 1`. + +#### TessellateServer.router + +[koa-rx-router](https://github.com/mfellner/koa-router-rx) instance. Use it to add routes. + +##### stop(): Promise + +Stop all koa servers. + +### nconf + +```javascript +import { nconf } from 'tessellate-server' +``` + +Wrapper around [nconf](https://github.com/indexzero/nconf) with default values and convenience methods. + +* `set(key: string, value: any)` - see [nconf](https://github.com/indexzero/nconf) +* `get(key: string)` - see [nconf](https://github.com/indexzero/nconf) +* `getObject(key: string): Object` - see `get` +* `getString(key: string): string` - see `get` +* `argv(args: Object)` - see [nconf](https://github.com/indexzero/nconf#argv) +* `defaults(defaults: Object)` - see [nconf](https://github.com/indexzero/nconf) + +### Problem + +```javascript +import { Problem } from 'tessellate-server' +``` + +A throwable Error class modeled after [Zalando Problem](https://github.com/zalando/problem). + +### Example + +Run `npm start` or check out the code below: + +```javascript +import { TessellateServer, Problem } from '../src' +import { Observable } from 'rxjs' + +const server = new TessellateServer() + +server.use((ctx, next) => { + console.log('Hi, this is middleware.') + return next() +}) + +server.router.get('/', o => o.mapTo('Hello!')) + +server.router.get('/error', o => o.switchMapTo(Observable.throw( + new Problem({ + title: 'Teapot', + detail: 'I am a teapot.', + status: 418 + })) +)) + +server.start(3001) +``` diff --git a/packages/tessellate-server/example/server.js b/packages/tessellate-server/example/server.js index 0485de9..a4e6d2e 100644 --- a/packages/tessellate-server/example/server.js +++ b/packages/tessellate-server/example/server.js @@ -1,10 +1,23 @@ // @flow -import { TessellateServer } from '../src' +import { TessellateServer, Problem } from '../src' +import { Observable } from 'rxjs' const server = new TessellateServer() -server.router.get('/', observable => observable.mapTo('Hello, tessellate!')) +server.use((ctx, next) => { + console.log('Hi, this is middleware.') + return next() +}) + +server.router.get('/', o => o.mapTo('Hello!')) + +server.router.get('/error', o => o.switchMapTo(Observable.throw( + new Problem({ + title: 'Teapot', + detail: 'I am a teapot.', + status: 418 + })) +)) server.start(3001) -console.log('listening on http://localhost:3001') diff --git a/packages/tessellate-server/src/TessellateServer.js b/packages/tessellate-server/src/TessellateServer.js index f3659ea..1c43918 100644 --- a/packages/tessellate-server/src/TessellateServer.js +++ b/packages/tessellate-server/src/TessellateServer.js @@ -66,7 +66,7 @@ export default class TessellateServer { this.app .use(morgan(morganFormat, {skip: morganSkip})) .use(error()) - .use(bodyParser({enableTypes: ['json'], strict: true})) + .use(bodyParser({enableTypes: ['json']})) .use(additionalMiddleware(this.middleware)) .use(this.router.routes()) .use(this.router.allowedMethods()) @@ -84,12 +84,15 @@ export default class TessellateServer { return this } - async start(port: number | string, metricsPort: ?number | ?string): Promise { + async start(port: number | string, metricsPort?: number | string): Promise { if (!port) throw new Error('No port specified!') + const portNumber = parseInt(port) + const metricsPortNumber = parseInt(metricsPort) + const [appServer, metricsServer] = await Promise.all([ - startServer(this.app.callback(), parseInt(port)), - startServer(this.metrics.callback(), parseInt(metricsPort) || parseInt(port) + 1) + startServer(this.app.callback(), portNumber), + startServer(this.metrics.callback(), metricsPortNumber || portNumber + 1) ]) this.appServer = appServer