Kaynağa Gözat

Switch to Nestjs

Provides all the various parts from the initial commit out of the box.
Michael Bromley 7 yıl önce
ebeveyn
işleme
73cbe5bced

+ 50 - 0
modules/core/app.module.ts

@@ -0,0 +1,50 @@
+import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
+import { TypeOrmModule } from '@nestjs/typeorm';
+import { GraphQLModule } from '@nestjs/graphql';
+import { graphqlExpress, graphiqlExpress } from 'apollo-server-express';
+import { GraphQLFactory } from '@nestjs/graphql';
+import { UserService } from './users/user.service';
+import { UserController } from './users/user.controller';
+import { UserResolver } from './users/user.resolver';
+
+@Module({
+    imports: [
+        GraphQLModule,
+        TypeOrmModule.forRoot({
+            type: 'mysql',
+            entities: ['./**/entities/*.ts'],
+            synchronize: true,
+            logging: true,
+            host: '192.168.99.100',
+            port: 3306,
+            username: 'root',
+            password: '',
+            database: 'test',
+        }),
+    ],
+    controllers: [UserController],
+    providers: [UserService, UserResolver],
+})
+export class AppModule implements NestModule {
+    constructor(private readonly graphQLFactory: GraphQLFactory) {}
+
+    configure(consumer: MiddlewareConsumer) {
+        const schema = this.createSchema();
+
+        consumer
+            .apply(
+                graphiqlExpress({
+                    endpointURL: '/graphql',
+                    subscriptionsEndpoint: `ws://localhost:3001/subscriptions`,
+                }),
+            )
+            .forRoutes('/graphiql')
+            .apply(graphqlExpress(req => ({ schema, rootValue: req })))
+            .forRoutes('/graphql');
+    }
+
+    createSchema() {
+        const typeDefs = this.graphQLFactory.mergeTypesByPaths('./**/*.graphql');
+        return this.graphQLFactory.createSchema({ typeDefs });
+    }
+}

+ 0 - 55
modules/core/bootstrap.ts

@@ -1,55 +0,0 @@
-import 'reflect-metadata';
-import { ConnectionOptions, createConnection, useContainer as typeOrmUseContainer } from 'typeorm';
-import * as express from 'express';
-import * as bodyParser from 'body-parser';
-import { graphqlExpress } from 'apollo-server-express';
-import { makeExecutableSchema } from 'graphql-tools';
-import { Container } from 'typedi';
-import { useContainer as typeGraphQlUseContainer, buildSchema } from 'type-graphql';
-import { User } from './entities/User';
-import { UserResolver } from './resolvers/userResolver';
-import {populate} from '../testing/populate';
-
-export interface BootstrapOptions {
-    host: string;
-    port: number;
-    username: string;
-    password: string;
-    database: string;
-    synchronize?: boolean;
-    logging?: boolean;
-}
-
-const PORT = 3000;
-
-// Set up dependency injection for TypeORM and TypeGraphQL
-typeOrmUseContainer(Container);
-typeGraphQlUseContainer(Container);
-
-const defaultConnectionOptions: ConnectionOptions = {
-    type: 'mysql',
-    entities: ['./**/entities/*.ts'],
-    synchronize: true,
-    logging: false,
-};
-
-export async function bootstrap(options: BootstrapOptions) {
-    try {
-        const connectionOptions = {
-            ...defaultConnectionOptions,
-            ...options,
-        } as ConnectionOptions;
-        const connection = await createConnection(connectionOptions);
-
-        populate(connection);
-
-        const schema = await buildSchema({
-            resolvers: [UserResolver],
-        });
-        const app = express();
-        app.use('/graphql', bodyParser.json(), graphqlExpress({ schema }));
-        app.listen(PORT);
-    } catch (error) {
-        console.log(error);
-    }
-}

+ 15 - 46
modules/core/entities/Address.ts

@@ -1,67 +1,36 @@
-import {Field, ObjectType, ID} from 'type-graphql';
 import {Column, CreateDateColumn, Entity, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn} from 'typeorm';
 import {User} from './User';
 
-@ObjectType()
 @Entity()
 export class Address {
-    @PrimaryGeneratedColumn()
-    @Field(() => ID)
-    id: number;
+    @PrimaryGeneratedColumn() id: number;
 
-    @Field(type => User)
     @ManyToOne(type => User, user => user.addresses)
-    user: User
+    user: User;
 
-    @Column()
-    @Field()
-    fullName: string;
+    @Column() fullName: string;
 
-    @Column()
-    @Field({ nullable: true })
-    company: string;
+    @Column() company: string;
 
-    @Column()
-    @Field()
-    streetLine1: string;
+    @Column() streetLine1: string;
 
-    @Column()
-    @Field({ nullable: true })
-    streetLine2: string;
+    @Column() streetLine2: string;
 
-    @Column()
-    @Field()
-    city: string;
+    @Column() city: string;
 
-    @Column()
-    @Field({ nullable: true })
-    province: string;
+    @Column() province: string;
 
-    @Column()
-    @Field({ nullable: true })
-    postalCode: string;
+    @Column() postalCode: string;
 
-    @Column()
-    @Field()
-    country: string;
+    @Column() country: string;
 
-    @Column()
-    @Field({ nullable: true })
-    phoneNumber: string;
+    @Column() phoneNumber: string;
 
-    @Column()
-    @Field()
-    defaultShippingAddress: boolean;
+    @Column() defaultShippingAddress: boolean;
 
-    @Column()
-    @Field()
-    defaultBillingAddress: boolean;
+    @Column() defaultBillingAddress: boolean;
 
-    @CreateDateColumn()
-    @Field()
-    createdAt: string;
+    @CreateDateColumn() createdAt: string;
 
-    @UpdateDateColumn()
-    @Field()
-    updatedAt: string;
+    @UpdateDateColumn() updatedAt: string;
 }

+ 0 - 16
modules/core/entities/LocaleString.ts

@@ -1,16 +0,0 @@
-import {Field, ID} from 'type-graphql';
-import {Column, PrimaryGeneratedColumn} from 'typeorm';
-
-export class LocaleString {
-    @PrimaryGeneratedColumn()
-    @Field(() => ID)
-    id: number;
-
-    @Column()
-    @Field()
-    sku: string;
-
-    @Column()
-    @Field()
-    name: string;
-}

+ 7 - 21
modules/core/entities/Product.ts

@@ -1,32 +1,18 @@
-import {Column, Entity, OneToMany, PrimaryGeneratedColumn} from 'typeorm';
-import {Field, ID, ObjectType} from 'type-graphql';
-import {ProductVariant} from './ProductVariant';
+import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from 'typeorm';
+import { ProductVariant } from './ProductVariant';
 
-@ObjectType()
 @Entity()
 export class Product {
-    @PrimaryGeneratedColumn()
-    @Field(() => ID)
-    id: number;
+    @PrimaryGeneratedColumn() id: number;
 
-    @Column()
-    @Field()
-    name: string;
+    @Column() name: string;
 
-    @Column()
-    @Field()
-    slug: string;
+    @Column() slug: string;
 
-    @Column()
-    @Field()
-    description: string;
+    @Column() description: string;
 
-    @Column()
-    @Field()
-    image: string;
+    @Column() image: string;
 
-    @Field()
     @OneToMany(type => ProductVariant, variant => variant.product)
     variants: string;
 }
-

+ 8 - 21
modules/core/entities/ProductVariant.ts

@@ -1,31 +1,18 @@
-import {Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn} from 'typeorm';
-import {Field, ID, ObjectType} from 'type-graphql';
-import {Product} from './Product';
+import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from 'typeorm';
+import { Product } from './Product';
 
-@ObjectType()
 @Entity()
 export class ProductVariant {
-    @PrimaryGeneratedColumn()
-    @Field(() => ID)
-    id: number;
+    @PrimaryGeneratedColumn() id: number;
 
-    @Column()
-    @Field()
-    sku: string;
+    @Column() sku: string;
 
-    @Column()
-    @Field()
-    name: string;
+    @Column() name: string;
 
-    @Column()
-    @Field()
-    image: string;
+    @Column() image: string;
 
-    @Column()
-    @Field()
-    price: string;
+    @Column() price: string;
 
-    @Field(type => [Product])
     @ManyToOne(type => Product, product => product.variants)
-    product: Product[]
+    product: Product[];
 }

+ 10 - 27
modules/core/entities/User.ts

@@ -1,39 +1,22 @@
-import {Column, CreateDateColumn, Entity, OneToMany, PrimaryGeneratedColumn, UpdateDateColumn} from 'typeorm';
-import {Field, ID, ObjectType} from 'type-graphql';
-import {Address} from './Address';
+import { Column, CreateDateColumn, Entity, OneToMany, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm';
+import { Address } from './Address';
 
-@ObjectType()
 @Entity()
 export class User {
-    @PrimaryGeneratedColumn()
-    @Field(() => ID)
-    id: number;
+    @PrimaryGeneratedColumn() id: number;
 
-    @Column()
-    @Field()
-    firstName: string;
+    @Column() firstName: string;
 
-    @Column()
-    @Field()
-    lastName: string;
+    @Column() lastName: string;
 
-    @Column()
-    @Field()
-    phoneNumber: string;
+    @Column() phoneNumber: string;
 
-    @Column()
-    @Field()
-    emailAddress: string;
+    @Column() emailAddress: string;
 
-    @Field(type => [Address])
     @OneToMany(type => Address, address => address.user)
-    addresses: Address[]
+    addresses: Address[];
 
-    @CreateDateColumn()
-    @Field()
-    createdAt: string;
+    @CreateDateColumn() createdAt: string;
 
-    @UpdateDateColumn()
-    @Field()
-    updatedAt: string;
+    @UpdateDateColumn() updatedAt: string;
 }

+ 15 - 0
modules/core/main.hmr.ts

@@ -0,0 +1,15 @@
+import { NestFactory } from '@nestjs/core';
+import { AppModule } from './app.module';
+
+declare const module: any;
+
+async function bootstrap() {
+  const app = await NestFactory.create(AppModule);
+  await app.listen(3000);
+
+  if (module.hot) {
+    module.hot.accept();
+    module.hot.dispose(() => app.close());
+  }
+}
+bootstrap();

+ 8 - 0
modules/core/main.ts

@@ -0,0 +1,8 @@
+import { NestFactory } from '@nestjs/core';
+import { AppModule } from './app.module';
+
+async function bootstrap() {
+    const app = await NestFactory.create(AppModule);
+    await app.listen(3000);
+}
+bootstrap();

+ 0 - 24
modules/core/resolvers/userResolver.ts

@@ -1,24 +0,0 @@
-import {Connection, EntityManager, Repository} from 'typeorm';
-import { User } from '../entities/User';
-import {FieldResolver, Query, Resolver, Root} from 'type-graphql';
-import {InjectConnection, InjectManager, InjectRepository} from 'typeorm-typedi-extensions';
-import {Address} from '../entities/Address';
-
-@Resolver(User)
-export class UserResolver {
-    constructor(@InjectManager() private entityManager: EntityManager,
-                @InjectConnection() private connection: Connection) {}
-
-    @Query(() => [User])
-    users() {
-        return this.entityManager.find(User);
-    }
-
-    @FieldResolver()
-    addresses(@Root() user: User) {
-        return this.connection.createQueryBuilder()
-            .relation(User, 'addresses')
-            .of(user)
-            .loadMany();
-    }
-}

+ 18 - 0
modules/core/users/user.controller.ts

@@ -0,0 +1,18 @@
+import { Controller, Get, Param } from '@nestjs/common';
+import { UserService } from './user.service';
+import { User } from '../entities/User';
+
+@Controller('users')
+export class UserController {
+    constructor(private userService: UserService) {}
+
+    @Get()
+    findAll(): Promise<User[]> {
+        return this.userService.findAll();
+    }
+
+    @Get(':id')
+    findOne(@Param() params): Promise<User> {
+        return this.userService.findOne(params.id);
+    }
+}

+ 25 - 0
modules/core/users/user.resolver.ts

@@ -0,0 +1,25 @@
+import { Resolver, Query, ResolveProperty } from '@nestjs/graphql';
+import { Connection, EntityManager, Repository } from 'typeorm';
+import { User } from '../entities/User';
+import { Address } from '../entities/Address';
+import { UserService } from './user.service';
+
+@Resolver('User')
+export class UserResolver {
+    constructor(private userService: UserService) {}
+
+    @Query('users')
+    users(): Promise<User[]> {
+        return this.userService.findAll();
+    }
+
+    @Query('user')
+    user(obj, args): Promise<User> {
+        return this.userService.findOne(args.id);
+    }
+
+    @ResolveProperty('addresses')
+    addresses(user: User): Promise<Address[]> {
+        return this.userService.findAddressesByUserId(user.id);
+    }
+}

+ 26 - 0
modules/core/users/user.service.ts

@@ -0,0 +1,26 @@
+import { Injectable } from '@nestjs/common';
+import { InjectConnection } from '@nestjs/typeorm';
+import { Connection } from 'typeorm';
+import { User } from '../entities/User';
+import { Address } from '../entities/Address';
+
+@Injectable()
+export class UserService {
+    constructor(@InjectConnection() private connection: Connection) {}
+
+    findAll(): Promise<User[]> {
+        return this.connection.manager.find(User);
+    }
+
+    findOne(userId: number): Promise<User> {
+        return this.connection.manager.findOne(User, userId);
+    }
+
+    findAddressesByUserId(userId: number): Promise<Address[]> {
+        return this.connection
+            .getRepository(Address)
+            .createQueryBuilder('address')
+            .where('address.userId = :id', { id: userId })
+            .getMany();
+    }
+}

+ 33 - 0
modules/core/users/user.types.graphql

@@ -0,0 +1,33 @@
+type Query {
+  users: [User]
+  user(id: Int!): User
+}
+
+type User {
+  id: Int
+  firstName: String
+  lastName: String
+  phoneNumber: String
+  emailAddress: String
+  addresses: [Address]
+  createdAt: String
+  updatedAt: String
+}
+
+type Address {
+  id: Int
+  user: User
+  fullName: String
+  company: String
+  streetLine1: String
+  streetLine2: String
+  city: String
+  province: String
+  postalCode: String
+  country: String
+  phoneNumber: String
+  defaultShippingAddress: Boolean
+  defaultBillingAddress: Boolean
+  createdAt: String
+  updatedAt: String
+}

+ 0 - 12
modules/server.ts

@@ -1,12 +0,0 @@
-import { bootstrap } from './core/bootstrap';
-import { User } from './core/entities/User';
-
-bootstrap({
-    host: '192.168.99.100',
-    port: 3306,
-    username: 'root',
-    password: '',
-    database: 'test',
-    synchronize: true,
-    logging: true,
-});

+ 6 - 10
modules/testing/populate.ts

@@ -1,29 +1,25 @@
-import {Connection} from 'typeorm';
+import { Connection } from 'typeorm';
 import * as faker from 'faker/locale/en_GB';
-import {User} from '../core/entities/User';
-import {Address} from '../core/entities/Address';
-
+import { User } from '../core/entities/User';
+import { Address } from '../core/entities/Address';
 
 export async function populate(connection: Connection) {
-
-    for (let i = 0; i < 5; i ++) {
+    for (let i = 0; i < 5; i++) {
         const user = new User();
         user.firstName = faker.name.firstName();
         user.lastName = faker.name.lastName();
         user.emailAddress = faker.internet.email(user.firstName, user.lastName);
         user.phoneNumber = faker.phone.phoneNumber();
 
-
-
         const address = new Address();
         address.fullName = `${user.firstName} ${user.lastName}`;
         address.streetLine1 = faker.address.streetAddress();
         address.city = faker.address.city();
         address.province = faker.address.county();
-        address.postalCode = faker.address.zipCode()
+        address.postalCode = faker.address.zipCode();
         address.country = faker.address.countryCode();
 
-        await connection.manager.save(address)
+        await connection.manager.save(address);
 
         user.addresses = [address];
         await connection.manager.save(user);

+ 1 - 1
nodemon.json

@@ -2,5 +2,5 @@
   "watch": ["modules"],
   "ext": "ts",
   "ignore": ["src/**/*.spec.ts"],
-  "exec": "ts-node -r tsconfig-paths/register modules/server.ts"
+  "exec": "ts-node -r tsconfig-paths/register modules/core/main.ts"
 }

+ 7 - 4
package.json

@@ -19,17 +19,20 @@
     "webpack": "webpack --config webpack.config.js"
   },
   "dependencies": {
+    "@nestjs/common": "^5.0.0",
+    "@nestjs/core": "^5.0.0",
+    "@nestjs/graphql": "^3.0.0",
+    "@nestjs/microservices": "^5.0.0",
+    "@nestjs/testing": "^5.0.0",
+    "@nestjs/typeorm": "^5.0.0",
     "apollo-server-express": "^1.3.6",
     "body-parser": "^1.18.3",
-    "express": "^4.16.3",
     "graphql": "^0.13.2",
     "graphql-tools": "^3.0.2",
     "mysql": "^2.15.0",
     "reflect-metadata": "^0.1.12",
-    "type-graphql": "^0.11.3",
-    "typedi": "^0.7.3",
+    "rxjs": "^6.2.0",
     "typeorm": "^0.2.6",
-    "typeorm-typedi-extensions": "^0.2.1",
     "typescript": "^2.8.0"
   },
   "devDependencies": {

+ 1 - 1
test/app.e2e-spec.ts

@@ -1,7 +1,7 @@
 import request from 'supertest';
 import { Test } from '@nestjs/testing';
-import { AppModule } from './../src/app.module';
 import { INestApplication } from '@nestjs/common';
+import {AppModule} from '../modules/core/app.module';
 
 describe('AppController (e2e)', () => {
   let app: INestApplication;

+ 1 - 1
webpack.config.js

@@ -3,7 +3,7 @@ const path = require('path');
 const nodeExternals = require('webpack-node-externals');
 
 module.exports = {
-  entry: ['webpack/hot/poll?1000', './src/main.hmr.ts'],
+  entry: ['webpack/hot/poll?1000', './modules/core/main.hmr.ts'],
   watch: true,
   target: 'node',
   externals: [

+ 250 - 70
yarn.lock

@@ -9,6 +9,53 @@
     call-me-maybe "^1.0.1"
     glob-to-regexp "^0.3.0"
 
+"@nestjs/common@^5.0.0":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-5.0.1.tgz#98378d3578c8d1f337452b06f83abad42e1e0cee"
+  dependencies:
+    axios "0.17.1"
+    cli-color "1.2.0"
+    deprecate "1.0.0"
+    multer "1.3.0"
+
+"@nestjs/core@^5.0.0":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-5.0.1.tgz#24dd00bf6605ecc786e59cdf29d0f9cbe6b2a828"
+  dependencies:
+    body-parser "1.18.2"
+    cors "2.8.4"
+    express "4.16.3"
+    iterare "0.0.8"
+    object-hash "1.3.0"
+    optional "0.1.4"
+
+"@nestjs/graphql@^3.0.0":
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/@nestjs/graphql/-/graphql-3.0.0.tgz#9e478ca4b6f64a55b65abd0b8e50361a105a404e"
+  dependencies:
+    glob "^7.1.2"
+    lodash "^4.17.4"
+    merge-graphql-schemas "^1.3.0"
+
+"@nestjs/microservices@^5.0.0":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@nestjs/microservices/-/microservices-5.0.1.tgz#468c94178698d8f3ec91a2d1afdd910db3eb8704"
+  dependencies:
+    iterare "0.0.8"
+    json-socket "^0.2.1"
+    optional "0.1.4"
+
+"@nestjs/testing@^5.0.0":
+  version "5.0.1"
+  resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-5.0.1.tgz#a485a44f7613d8243f208d7fb3d7fce740ab5ead"
+  dependencies:
+    deprecate "1.0.0"
+    optional "0.1.4"
+
+"@nestjs/typeorm@^5.0.0":
+  version "5.0.0"
+  resolved "https://registry.yarnpkg.com/@nestjs/typeorm/-/typeorm-5.0.0.tgz#d8ae64cb03d350e1fe4c7cea58d62fa4c3b2e4e2"
+
 "@nodelib/fs.stat@^1.0.1":
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a"
@@ -30,10 +77,6 @@
     "@types/express" "*"
     "@types/node" "*"
 
-"@types/events@*":
-  version "1.2.0"
-  resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86"
-
 "@types/express-serve-static-core@*":
   version "4.0.57"
   resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.57.tgz#3cd8ab4b11d5ecd70393bada7fc1c480491537dd"
@@ -52,18 +95,6 @@
   version "4.1.2"
   resolved "https://registry.yarnpkg.com/@types/faker/-/faker-4.1.2.tgz#f8ab50c9f9af68c160dd71b63f83e24b712d0df5"
 
-"@types/glob@^5.0.35":
-  version "5.0.35"
-  resolved "https://registry.yarnpkg.com/@types/glob/-/glob-5.0.35.tgz#1ae151c802cece940443b5ac246925c85189f32a"
-  dependencies:
-    "@types/events" "*"
-    "@types/minimatch" "*"
-    "@types/node" "*"
-
-"@types/graphql@^0.13.1":
-  version "0.13.1"
-  resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.13.1.tgz#7d39750355c9ecb921816d6f76c080405b5f6bea"
-
 "@types/jest@^21.1.8":
   version "21.1.8"
   resolved "https://registry.yarnpkg.com/@types/jest/-/jest-21.1.8.tgz#d497213725684f1e5a37900b17a47c9c018f1a97"
@@ -72,15 +103,11 @@
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b"
 
-"@types/minimatch@*":
-  version "3.0.3"
-  resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
-
 "@types/node@*":
   version "8.5.1"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-8.5.1.tgz#4ec3020bcdfe2abffeef9ba3fbf26fca097514b5"
 
-"@types/node@^9.3.0", "@types/node@^9.4.6", "@types/node@^9.6.15":
+"@types/node@^9.3.0", "@types/node@^9.4.6":
   version "9.6.18"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-9.6.18.tgz#092e13ef64c47e986802c9c45a61c1454813b31d"
 
@@ -309,7 +336,7 @@ ansi-escapes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92"
 
-ansi-regex@^2.0.0:
+ansi-regex@^2.0.0, ansi-regex@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
 
@@ -406,6 +433,10 @@ app-root-path@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46"
 
+append-field@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a"
+
 append-transform@^0.4.0:
   version "0.4.0"
   resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
@@ -575,6 +606,13 @@ aws4@^1.2.1, aws4@^1.6.0:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
 
+axios@0.17.1:
+  version "0.17.1"
+  resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d"
+  dependencies:
+    follow-redirects "^1.2.5"
+    is-buffer "^1.1.5"
+
 babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@ -1434,6 +1472,13 @@ builtin-status-codes@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
 
+busboy@^0.2.11:
+  version "0.2.14"
+  resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453"
+  dependencies:
+    dicer "0.2.5"
+    readable-stream "1.1.x"
+
 bytes@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@@ -1603,10 +1648,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3:
     inherits "^2.0.1"
     safe-buffer "^5.0.1"
 
-class-transformer@^0.1.9:
-  version "0.1.9"
-  resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.1.9.tgz#29977c528233ca014e6fd9523327ebd31d11ca54"
-
 class-utils@^0.3.5:
   version "0.3.6"
   resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -1616,16 +1657,21 @@ class-utils@^0.3.5:
     isobject "^3.0.0"
     static-extend "^0.1.1"
 
-class-validator@^0.8.5:
-  version "0.8.5"
-  resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.8.5.tgz#484785acda98f68549c3a84dc1bb2f77b736dc58"
-  dependencies:
-    validator "9.2.0"
-
 cli-boxes@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
 
+cli-color@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.2.0.tgz#3a5ae74fd76b6267af666e69e2afbbd01def34d1"
+  dependencies:
+    ansi-regex "^2.1.1"
+    d "1"
+    es5-ext "^0.10.12"
+    es6-iterator "2"
+    memoizee "^0.4.3"
+    timers-ext "0.1"
+
 cli-cursor@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
@@ -1871,6 +1917,13 @@ core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
 
+cors@2.8.4:
+  version "2.8.4"
+  resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686"
+  dependencies:
+    object-assign "^4"
+    vary "^1"
+
 cpx@^1.5.0:
   version "1.5.0"
   resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f"
@@ -1985,6 +2038,12 @@ cyclist@~0.2.2:
   version "0.2.2"
   resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640"
 
+d@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f"
+  dependencies:
+    es5-ext "^0.10.9"
+
 dargs@^5.1.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829"
@@ -2049,6 +2108,10 @@ deepmerge@^2.0.1:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.0.tgz#511a54fff405fc346f0240bb270a3e9533a31102"
 
+deepmerge@^2.1.0:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-2.1.1.tgz#e862b4e45ea0555072bf51e7fd0d9845170ae768"
+
 default-require-extensions@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
@@ -2090,6 +2153,10 @@ depd@~1.1.1, depd@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
 
+deprecate@1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/deprecate/-/deprecate-1.0.0.tgz#661490ed2428916a6c8883d8834e5646f4e4a4a8"
+
 deprecated-decorator@^0.1.6:
   version "0.1.6"
   resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37"
@@ -2119,6 +2186,13 @@ detect-libc@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
 
+dicer@0.2.5:
+  version "0.2.5"
+  resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f"
+  dependencies:
+    readable-stream "1.1.x"
+    streamsearch "0.1.2"
+
 diff@^3.1.0, diff@^3.2.0:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c"
@@ -2258,6 +2332,38 @@ error@^7.0.2:
     string-template "~0.2.1"
     xtend "~4.0.0"
 
+es5-ext@^0.10.12, es5-ext@^0.10.14, es5-ext@^0.10.30, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14, es5-ext@~0.10.2:
+  version "0.10.44"
+  resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.44.tgz#7a877e994bb190aebd4718aa2d62784a12e2ca20"
+  dependencies:
+    es6-iterator "~2.0.3"
+    es6-symbol "~3.1.1"
+    next-tick "1"
+
+es6-iterator@2, es6-iterator@^2.0.1, es6-iterator@~2.0.3:
+  version "2.0.3"
+  resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@~3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
+es6-weak-map@^2.0.2:
+  version "2.0.2"
+  resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.14"
+    es6-iterator "^2.0.1"
+    es6-symbol "^3.1.1"
+
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -2310,6 +2416,13 @@ etag@~1.8.1:
   version "1.8.1"
   resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
 
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
 event-stream@~3.3.0:
   version "3.3.4"
   resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
@@ -2396,7 +2509,7 @@ expect@^21.2.1:
     jest-message-util "^21.2.1"
     jest-regex-util "^21.2.0"
 
-express@^4.16.3:
+express@4.16.3:
   version "4.16.3"
   resolved "https://registry.yarnpkg.com/express/-/express-4.16.3.tgz#6af8a502350db3246ecc4becf6b5a34d22f7ed53"
   dependencies:
@@ -2621,6 +2734,12 @@ flush-write-stream@^1.0.0:
     inherits "^2.0.1"
     readable-stream "^2.0.4"
 
+follow-redirects@^1.2.5:
+  version "1.5.0"
+  resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.0.tgz#234f49cf770b7f35b40e790f636ceba0c3a0ab77"
+  dependencies:
+    debug "^3.1.0"
+
 for-in@^1.0.1, for-in@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -2938,12 +3057,6 @@ graphql-extensions@^0.0.x, graphql-extensions@~0.0.9:
     core-js "^2.5.3"
     source-map-support "^0.5.1"
 
-graphql-subscriptions@^0.5.8:
-  version "0.5.8"
-  resolved "https://registry.yarnpkg.com/graphql-subscriptions/-/graphql-subscriptions-0.5.8.tgz#13a6143c546bce390404657dc73ca501def30aa7"
-  dependencies:
-    iterall "^1.2.1"
-
 graphql-tools@^3.0.2:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-3.0.2.tgz#fb79821c23b0f5d11d842c4d0c15000d856c6c8c"
@@ -3504,7 +3617,7 @@ is-primitive@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575"
 
-is-promise@^2.1.0:
+is-promise@^2.1, is-promise@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
 
@@ -3538,6 +3651,10 @@ is-windows@^1.0.1, is-windows@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
 
+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:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -3646,6 +3763,10 @@ iterall@^1.1.3, iterall@^1.2.1:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7"
 
+iterare@0.0.8:
+  version "0.0.8"
+  resolved "https://registry.yarnpkg.com/iterare/-/iterare-0.0.8.tgz#a969a80a1fbff6b78f28776594d7bc2bdfab6aad"
+
 jest-changed-files@^21.2.0:
   version "21.2.0"
   resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29"
@@ -3981,6 +4102,10 @@ json-schema@0.2.3:
   version "0.2.3"
   resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
 
+json-socket@^0.2.1:
+  version "0.2.1"
+  resolved "https://registry.yarnpkg.com/json-socket/-/json-socket-0.2.1.tgz#26e7ed8cc131f17aa0136c32068f473b5dbefb22"
+
 json-stable-stringify@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af"
@@ -4224,6 +4349,12 @@ lru-cache@^4.1.1:
     pseudomap "^1.0.2"
     yallist "^2.1.2"
 
+lru-queue@0.1:
+  version "0.1.0"
+  resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3"
+  dependencies:
+    es5-ext "~0.10.2"
+
 make-dir@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51"
@@ -4301,6 +4432,19 @@ mem@^1.1.0:
   dependencies:
     mimic-fn "^1.0.0"
 
+memoizee@^0.4.3:
+  version "0.4.12"
+  resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.12.tgz#780e99a219c50c549be6d0fc61765080975c58fb"
+  dependencies:
+    d "1"
+    es5-ext "^0.10.30"
+    es6-weak-map "^2.0.2"
+    event-emitter "^0.3.5"
+    is-promise "^2.1"
+    lru-queue "0.1"
+    next-tick "1"
+    timers-ext "^0.1.2"
+
 memory-fs@^0.4.0, memory-fs@~0.4.1:
   version "0.4.1"
   resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552"
@@ -4312,6 +4456,14 @@ merge-descriptors@1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
 
+merge-graphql-schemas@^1.3.0:
+  version "1.5.1"
+  resolved "https://registry.yarnpkg.com/merge-graphql-schemas/-/merge-graphql-schemas-1.5.1.tgz#a9682d4067c0c80c0db631ec56b4573731e93dc3"
+  dependencies:
+    deepmerge "^2.1.0"
+    glob "^7.1.2"
+    is-glob "^4.0.0"
+
 merge2@^1.2.1:
   version "1.2.2"
   resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.2.2.tgz#03212e3da8d86c4d8523cebd6318193414f94e34"
@@ -4489,6 +4641,19 @@ ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
 
+multer@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2"
+  dependencies:
+    append-field "^0.1.0"
+    busboy "^0.2.11"
+    concat-stream "^1.5.0"
+    mkdirp "^0.5.1"
+    object-assign "^3.0.0"
+    on-finished "^2.3.0"
+    type-is "^1.6.4"
+    xtend "^4.0.0"
+
 multimatch@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b"
@@ -4564,6 +4729,10 @@ neo-async@^2.5.0:
   version "2.5.1"
   resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee"
 
+next-tick@1:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c"
+
 nice-try@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4"
@@ -4740,7 +4909,11 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43"
 
-object-assign@^4.0.1, object-assign@^4.1.0:
+object-assign@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2"
+
+object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
 
@@ -4752,6 +4925,10 @@ object-copy@^0.1.0:
     define-property "^0.2.5"
     kind-of "^3.0.3"
 
+object-hash@1.3.0:
+  version "1.3.0"
+  resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.0.tgz#76d9ba6ff113cf8efc0d996102851fe6723963e2"
+
 object-visit@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
@@ -4771,7 +4948,7 @@ object.pick@^1.3.0:
   dependencies:
     isobject "^3.0.1"
 
-on-finished@~2.3.0:
+on-finished@^2.3.0, on-finished@~2.3.0:
   version "2.3.0"
   resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
   dependencies:
@@ -4800,6 +4977,10 @@ optimist@^0.6.1, optimist@~0.6.0:
     minimist "~0.0.1"
     wordwrap "~0.0.2"
 
+optional@0.1.4:
+  version "0.1.4"
+  resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3"
+
 optionator@^0.8.1:
   version "0.8.2"
   resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64"
@@ -5350,6 +5531,15 @@ read-pkg@^3.0.0:
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
+readable-stream@1.1.x:
+  version "1.1.14"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
 readable-stream@2.3.3, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4:
   version "2.3.3"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c"
@@ -5650,7 +5840,7 @@ rxjs@^5.5.2:
   dependencies:
     symbol-observable "1.0.1"
 
-rxjs@^6.1.0:
+rxjs@^6.1.0, rxjs@^6.2.0:
   version "6.2.0"
   resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.0.tgz#e024d0e180b72756a83c2aaea8f25423751ba978"
   dependencies:
@@ -6039,6 +6229,10 @@ stream-shift@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
 
+streamsearch@0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a"
+
 strict-uri-encode@^1.0.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@@ -6075,6 +6269,10 @@ string_decoder@^1.0.0, string_decoder@~1.1.1:
   dependencies:
     safe-buffer "~5.1.0"
 
+string_decoder@~0.10.x:
+  version "0.10.31"
+  resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+
 string_decoder@~1.0.3:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab"
@@ -6293,6 +6491,13 @@ timers-browserify@^2.0.4:
   dependencies:
     setimmediate "^1.0.4"
 
+timers-ext@0.1, timers-ext@^0.1.2:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.5.tgz#77147dd4e76b660c2abb8785db96574cbbd12922"
+  dependencies:
+    es5-ext "~0.10.14"
+    next-tick "1"
+
 tmp@^0.0.33:
   version "0.0.33"
   resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -6444,20 +6649,7 @@ type-check@~0.3.2:
   dependencies:
     prelude-ls "~1.1.2"
 
-type-graphql@^0.11.3:
-  version "0.11.3"
-  resolved "https://registry.yarnpkg.com/type-graphql/-/type-graphql-0.11.3.tgz#ce04e52f4b03a3c2eebdb3b6df4e91b60ec7f54e"
-  dependencies:
-    "@types/glob" "^5.0.35"
-    "@types/graphql" "^0.13.1"
-    "@types/node" "^9.6.15"
-    class-transformer "^0.1.9"
-    class-validator "^0.8.5"
-    glob "^7.1.2"
-    graphql "^0.13.2"
-    graphql-subscriptions "^0.5.8"
-
-type-is@~1.6.15, type-is@~1.6.16:
+type-is@^1.6.4, type-is@~1.6.15, type-is@~1.6.16:
   version "1.6.16"
   resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194"
   dependencies:
@@ -6468,14 +6660,6 @@ typedarray@^0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
 
-typedi@^0.7.3:
-  version "0.7.3"
-  resolved "https://registry.yarnpkg.com/typedi/-/typedi-0.7.3.tgz#872fb8d608ed6076e95c1f8cbd2bb33b7d089f0f"
-
-typeorm-typedi-extensions@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/typeorm-typedi-extensions/-/typeorm-typedi-extensions-0.2.1.tgz#11d47528cb2986f57f32ad70c50b00690c7d3ba2"
-
 typeorm@^0.2.6:
   version "0.2.6"
   resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.2.6.tgz#04e0ac43f4da9e3cdc2c18d6c5987a58f6ebefb8"
@@ -6681,11 +6865,7 @@ validate-npm-package-license@^3.0.1:
     spdx-correct "~1.0.0"
     spdx-expression-parse "~1.0.0"
 
-validator@9.2.0:
-  version "9.2.0"
-  resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e"
-
-vary@~1.1.2:
+vary@^1, vary@~1.1.2:
   version "1.1.2"
   resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"