├── src ├── index.ts ├── utils │ ├── validate-path.util.ts │ └── flat-routes.util.ts ├── test │ ├── utils │ │ ├── validate-path.spec.ts │ │ └── flat-routes.spec.ts │ └── router.module.spec.ts ├── routes.interface.ts └── router.module.ts ├── tsconfig.prod.json ├── .prettierrc ├── examples ├── nest-v4x │ ├── index.js │ ├── src │ │ ├── cats │ │ │ ├── cats.controller.ts │ │ │ ├── ketty.controller.ts │ │ │ └── cats.module.ts │ │ ├── dogs │ │ │ ├── dogs.controller.ts │ │ │ ├── puppy.controller.ts │ │ │ └── dogs.module.ts │ │ ├── ninja │ │ │ ├── ninja.controller.ts │ │ │ ├── katana.controller.ts │ │ │ └── ninja.module.ts │ │ ├── main.ts │ │ ├── routes.ts │ │ └── app.module.ts │ ├── jest.json │ ├── tsconfig.json │ ├── package.json │ ├── tslint.json │ └── yarn.lock ├── nest-v5x │ ├── nodemon.json │ ├── src │ │ ├── cats │ │ │ ├── dto │ │ │ │ └── create-cat.dto.ts │ │ │ ├── ketty.controller.ts │ │ │ ├── cats.module.ts │ │ │ └── cats.controller.ts │ │ ├── dogs │ │ │ ├── dogs.controller.ts │ │ │ ├── puppy.controller.ts │ │ │ └── dogs.module.ts │ │ ├── ninja │ │ │ ├── ninja.controller.ts │ │ │ ├── katana.controller.ts │ │ │ └── ninja.module.ts │ │ ├── main.ts │ │ ├── main.hmr.ts │ │ ├── routes.ts │ │ ├── logger.middleware.ts │ │ └── app.module.ts │ ├── tsconfig.spec.json │ ├── test │ │ ├── jest-e2e.json │ │ └── app.e2e-spec.ts │ ├── tsconfig.json │ ├── webpack.config.js │ ├── tslint.json │ └── package.json └── nest-v5x-m2m │ ├── nodemon.json │ ├── src │ ├── cats │ │ ├── dto │ │ │ └── create-cat.dto.ts │ │ ├── ketty.controller.ts │ │ ├── cats.module.ts │ │ └── cats.controller.ts │ ├── dogs │ │ ├── dogs.controller.ts │ │ ├── puppy.controller.ts │ │ └── dogs.module.ts │ ├── ninja │ │ ├── katana.controller.ts │ │ ├── ninja.module.ts │ │ └── ninja.controller.ts │ ├── main.ts │ ├── main.hmr.ts │ ├── routes.ts │ ├── logger.middleware.ts │ └── app.module.ts │ ├── tsconfig.spec.json │ ├── test │ ├── jest-e2e.json │ └── app.e2e-spec.ts │ ├── tsconfig.json │ ├── webpack.config.js │ ├── tslint.json │ └── package.json ├── .travis.yml ├── wallaby.js ├── tsconfig.json ├── jest.json ├── tslint.json ├── scripts └── build.sh ├── LICENSE ├── .npmignore ├── .gitignore ├── package.json ├── CHANGELOG.md └── README.md /src/index.ts: -------------------------------------------------------------------------------- 1 | export * from './router.module'; 2 | export * from './routes.interface'; 3 | -------------------------------------------------------------------------------- /tsconfig.prod.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "exclude": [ 4 | "src/**/*.spec.ts" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": true, 3 | "useTabs": false, 4 | "singleQuote": true, 5 | "printWidth": 100, 6 | "trailingComma": "all" 7 | } 8 | -------------------------------------------------------------------------------- /examples/nest-v4x/index.js: -------------------------------------------------------------------------------- 1 | require('ts-node/register'); 2 | require('./src/main'); 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /examples/nest-v5x/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src"], 3 | "ext": "ts", 4 | "ignore": ["src/**/*.spec.ts"], 5 | "exec": "ts-node -r tsconfig-paths/register src/main.ts" 6 | } 7 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/cats/dto/create-cat.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString } from 'class-validator'; 2 | export class CreateCatDTO { 3 | @IsString() 4 | public readonly name: string; 5 | } 6 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/nodemon.json: -------------------------------------------------------------------------------- 1 | { 2 | "watch": ["src"], 3 | "ext": "ts", 4 | "ignore": ["src/**/*.spec.ts"], 5 | "exec": "ts-node -r tsconfig-paths/register src/main.ts" 6 | } 7 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/cats/dto/create-cat.dto.ts: -------------------------------------------------------------------------------- 1 | import { IsString } from 'class-validator'; 2 | export class CreateCatDTO { 3 | @IsString() 4 | public readonly name: string; 5 | } 6 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["jest", "node"] 5 | }, 6 | "include": ["**/*.spec.ts", "**/*.d.ts"] 7 | } 8 | -------------------------------------------------------------------------------- /examples/nest-v5x/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "tsconfig.json", 3 | "compilerOptions": { 4 | "types": ["jest", "node"] 5 | }, 6 | "include": ["**/*.spec.ts", "**/*.d.ts"] 7 | } 8 | -------------------------------------------------------------------------------- /examples/nest-v5x/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testRegex": ".e2e-spec.ts$", 5 | "transform": { 6 | "^.+\\.(t|j)s$": "ts-jest" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/test/jest-e2e.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["js", "json", "ts"], 3 | "rootDir": ".", 4 | "testRegex": ".e2e-spec.ts$", 5 | "transform": { 6 | "^.+\\.(t|j)s$": "ts-jest" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/utils/validate-path.util.ts: -------------------------------------------------------------------------------- 1 | export const validatePath = (path: string): string => 2 | path 3 | ? path.startsWith('/') 4 | ? ('/' + path.replace(/\/+$/, '')).replace(/\/+/g, '/') 5 | : '/' + path.replace(/\/+$/, '') 6 | : '/'; 7 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/cats/cats.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class CatsController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From CatsController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/dogs/dogs.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class DogsController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From DogsController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/ninja/ninja.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class NinjaController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From NinjaController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/dogs/dogs.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class DogsController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From DogsController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/dogs/dogs.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class DogsController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From DogsController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/ninja/ninja.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class NinjaController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From NinjaController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/cats/ketty.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/ketty') 4 | export class KettyController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From KettyController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/dogs/puppy.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/puppy') 4 | export class PuppyController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From PuppyController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/cats/ketty.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/ketty') 4 | export class KettyController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From KettyController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/dogs/puppy.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/puppy') 4 | export class PuppyController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From PuppyController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/ninja/katana.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/katana') 4 | export class KatanaController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From KatanaController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/cats/ketty.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/ketty') 4 | export class KettyController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From KettyController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/dogs/puppy.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/puppy') 4 | export class PuppyController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From PuppyController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/ninja/katana.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/katana') 4 | export class KatanaController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From KatanaController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/ninja/katana.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get } from '@nestjs/common'; 2 | 3 | @Controller('/katana') 4 | export class KatanaController { 5 | @Get('/') 6 | sayHello() { 7 | return `Hello From KatanaController`; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { ApplicationModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(ApplicationModule); 6 | await app.listen(3000); 7 | } 8 | bootstrap(); 9 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { ApplicationModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(ApplicationModule); 6 | await app.listen(3000); 7 | } 8 | bootstrap(); 9 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/main.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { ApplicationModule } from './app.module'; 3 | 4 | async function bootstrap() { 5 | const app = await NestFactory.create(ApplicationModule); 6 | await app.listen(3000); 7 | } 8 | bootstrap(); 9 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/cats/cats.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { CatsController } from './cats.controller'; 3 | import { KettyController } from './ketty.controller'; 4 | 5 | @Module({ 6 | controllers: [CatsController, KettyController], 7 | }) 8 | export class CatsModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/dogs/dogs.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { DogsController } from './dogs.controller'; 3 | import { PuppyController } from './puppy.controller'; 4 | 5 | @Module({ 6 | controllers: [DogsController, PuppyController], 7 | }) 8 | export class DogsModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/cats/cats.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { CatsController } from './cats.controller'; 3 | import { KettyController } from './ketty.controller'; 4 | 5 | @Module({ 6 | controllers: [CatsController, KettyController], 7 | }) 8 | export class CatsModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/dogs/dogs.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { DogsController } from './dogs.controller'; 3 | import { PuppyController } from './puppy.controller'; 4 | 5 | @Module({ 6 | controllers: [DogsController, PuppyController], 7 | }) 8 | export class DogsModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/cats/cats.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { CatsController } from './cats.controller'; 3 | import { KettyController } from './ketty.controller'; 4 | 5 | @Module({ 6 | controllers: [CatsController, KettyController], 7 | }) 8 | export class CatsModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/dogs/dogs.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { DogsController } from './dogs.controller'; 3 | import { PuppyController } from './puppy.controller'; 4 | 5 | @Module({ 6 | controllers: [DogsController, PuppyController], 7 | }) 8 | export class DogsModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/ninja/ninja.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { NinjaController } from './ninja.controller'; 3 | import { KatanaController } from './katana.controller'; 4 | 5 | @Module({ 6 | controllers: [NinjaController, KatanaController], 7 | }) 8 | export class NinjaModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/ninja/ninja.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { NinjaController } from './ninja.controller'; 3 | import { KatanaController } from './katana.controller'; 4 | 5 | @Module({ 6 | controllers: [NinjaController, KatanaController], 7 | }) 8 | export class NinjaModule {} 9 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/ninja/ninja.module.ts: -------------------------------------------------------------------------------- 1 | import { Module } from '@nestjs/common'; 2 | import { NinjaController } from './ninja.controller'; 3 | import { KatanaController } from './katana.controller'; 4 | 5 | @Module({ 6 | controllers: [NinjaController, KatanaController], 7 | }) 8 | export class NinjaModule {} 9 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "8" 4 | - "9" 5 | - "10" 6 | before_script: 7 | - export DISPLAY=:99.0 8 | - sh -e /etc/init.d/xvfb start 9 | install: 10 | - npm install 11 | - npm run build 12 | script: 13 | - npm test 14 | after_success: 15 | - npm run test:coverage 16 | - "npm install coveralls && cat ./coverage/lcov.info | coveralls" -------------------------------------------------------------------------------- /wallaby.js: -------------------------------------------------------------------------------- 1 | module.exports = function() { 2 | return { 3 | files: ['src/**/*.ts', 'jest.json', '!src/**/*.spec.ts'], // <-- 4 | tests: ['src/**/*.spec.ts'], 5 | env: { type: 'node', runner: 'node' }, 6 | testFramework: 'jest', 7 | setup: function(wallaby) { 8 | var jestConfig = require('./jest.json').jest; 9 | wallaby.testFramework.configure(jestConfig); 10 | }, 11 | }; 12 | }; 13 | -------------------------------------------------------------------------------- /examples/nest-v4x/src/routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from 'nest-router'; 2 | import { CatsModule } from './cats/cats.module'; 3 | import { DogsModule } from './dogs/dogs.module'; 4 | import { NinjaModule } from './ninja/ninja.module'; 5 | export const routes: Routes = [ 6 | { 7 | path: '/ninja', 8 | module: NinjaModule, 9 | children: [{ path: '/cats', module: CatsModule }, { path: '/dogs', module: DogsModule }], 10 | }, 11 | ]; 12 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/main.hmr.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { ApplicationModule } from './app.module'; 3 | 4 | declare const module: any; 5 | 6 | async function bootstrap() { 7 | const app = await NestFactory.create(ApplicationModule); 8 | await app.listen(3000); 9 | 10 | if (module.hot) { 11 | module.hot.accept(); 12 | module.hot.dispose(() => app.close()); 13 | } 14 | } 15 | bootstrap(); 16 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/main.hmr.ts: -------------------------------------------------------------------------------- 1 | import { NestFactory } from '@nestjs/core'; 2 | import { ApplicationModule } from './app.module'; 3 | 4 | declare const module: any; 5 | 6 | async function bootstrap() { 7 | const app = await NestFactory.create(ApplicationModule); 8 | await app.listen(3000); 9 | 10 | if (module.hot) { 11 | module.hot.accept(); 12 | module.hot.dispose(() => app.close()); 13 | } 14 | } 15 | bootstrap(); 16 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from 'nest-router'; 2 | import { CatsModule } from './cats/cats.module'; 3 | import { DogsModule } from './dogs/dogs.module'; 4 | import { NinjaModule } from './ninja/ninja.module'; 5 | export const routes: Routes = [ 6 | { 7 | path: '/ninja', 8 | module: NinjaModule, 9 | children: [{ path: '/cats', module: CatsModule }, { path: '/dogs', module: DogsModule }], 10 | }, 11 | ]; 12 | -------------------------------------------------------------------------------- /examples/nest-v4x/jest.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": [ 3 | "ts", 4 | "tsx", 5 | "js", 6 | "json" 7 | ], 8 | "transform": { 9 | "^.+\\.tsx?$": "/node_modules/ts-jest/preprocessor.js" 10 | }, 11 | "testRegex": "/src/.*\\.(test|spec).(ts|tsx|js)$", 12 | "collectCoverageFrom" : ["src/**/*.{js,jsx,tsx,ts}", "!**/node_modules/**", "!**/vendor/**"], 13 | "coverageReporters": ["json", "lcov"] 14 | } -------------------------------------------------------------------------------- /examples/nest-v4x/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, NestModule, MiddlewaresConsumer, RequestMethod } from '@nestjs/common'; 2 | import { RouterModule } from 'nest-router'; 3 | import { CatsModule } from './cats/cats.module'; 4 | import { DogsModule } from './dogs/dogs.module'; 5 | import { NinjaModule } from './ninja/ninja.module'; 6 | import { routes } from './routes'; 7 | @Module({ 8 | imports: [RouterModule.forRoutes(routes), CatsModule, DogsModule, NinjaModule], 9 | }) 10 | export class ApplicationModule {} 11 | -------------------------------------------------------------------------------- /examples/nest-v4x/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": false, 5 | "noImplicitAny": false, 6 | "removeComments": true, 7 | "noLib": false, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "target": "es6", 11 | "sourceMap": true, 12 | "allowJs": true, 13 | "outDir": "./dist" 14 | }, 15 | "include": [ 16 | "src/**/*" 17 | ], 18 | "exclude": [ 19 | "node_modules", 20 | "**/*.spec.ts" 21 | ] 22 | } -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from 'nest-router'; 2 | import { CatsModule } from './cats/cats.module'; 3 | import { DogsModule } from './dogs/dogs.module'; 4 | import { NinjaModule } from './ninja/ninja.module'; 5 | export const routes: Routes = [ 6 | { 7 | path: '/ninja', 8 | module: NinjaModule, 9 | children: [ 10 | { path: 'nested/cats', module: CatsModule }, 11 | { path: ':ninjaId/cats', module: CatsModule }, 12 | { path: '/dogs', module: DogsModule }, 13 | ], 14 | }, 15 | ]; 16 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/cats/cats.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Post, Body, ValidationPipe } from '@nestjs/common'; 2 | import { CreateCatDTO } from './dto/create-cat.dto'; 3 | 4 | @Controller() 5 | export class CatsController { 6 | private cats: string[] = []; 7 | @Get('/') 8 | sayHello() { 9 | return `Hello From CatsController`; 10 | } 11 | 12 | // For testing Pipes 13 | @Post('/create') 14 | public testing(@Body(new ValidationPipe()) data: CreateCatDTO): string[] { 15 | this.cats.push(data.name); 16 | return this.cats; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/nest-v5x/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "noImplicitAny": false, 6 | "removeComments": true, 7 | "noLib": false, 8 | "allowSyntheticDefaultImports": true, 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es6", 12 | "sourceMap": true, 13 | "outDir": "./dist", 14 | "baseUrl": "./src" 15 | }, 16 | "include": [ 17 | "src/**/*" 18 | ], 19 | "exclude": [ 20 | "node_modules", 21 | "**/*.spec.ts" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "declaration": true, 5 | "noImplicitAny": false, 6 | "removeComments": true, 7 | "noLib": false, 8 | "allowSyntheticDefaultImports": true, 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es6", 12 | "sourceMap": true, 13 | "outDir": "./dist", 14 | "baseUrl": "./src" 15 | }, 16 | "include": [ 17 | "src/**/*" 18 | ], 19 | "exclude": [ 20 | "node_modules", 21 | "**/*.spec.ts" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": true, 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "outDir": "./lib", 7 | "preserveConstEnums": true, 8 | "rootDir": "./src", 9 | "baseUrl": ".", 10 | "experimentalDecorators": true, 11 | "emitDecoratorMetadata": true, 12 | "sourceMap": true, 13 | "target": "es6", 14 | "typeRoots": [ 15 | "node_modules/@types" 16 | ], 17 | "lib": [ 18 | "es7" 19 | ] 20 | }, 21 | "include": [ 22 | "src/**/*" 23 | ], 24 | "exclude": [ 25 | "node_modules" 26 | ] 27 | } -------------------------------------------------------------------------------- /jest.json: -------------------------------------------------------------------------------- 1 | { 2 | "moduleFileExtensions": ["ts", "tsx", "js", "json"], 3 | "transform": { 4 | "^.+\\.tsx?$": "/node_modules/ts-jest/preprocessor.js" 5 | }, 6 | "testRegex": "/src/.*\\.(test|spec).(ts|tsx|js)$", 7 | "testEnvironment": "node", 8 | "collectCoverageFrom": [ 9 | "src/**/*.ts", 10 | "!src/main.ts", 11 | "!src/app/constants.ts", 12 | "!src/**/index.ts", 13 | "!src/**/*.module.ts", 14 | "!src/**/*.interface.ts", 15 | "!src/**/*.enum.ts", 16 | "!**/node_modules/**", 17 | "!**/vendor/**" 18 | ], 19 | "coverageReporters": ["json", "lcov"] 20 | } 21 | -------------------------------------------------------------------------------- /examples/nest-v5x/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import request from 'supertest'; 2 | import { Test } from '@nestjs/testing'; 3 | import { AppModule } from './../src/app.module'; 4 | import { INestApplication } from '@nestjs/common'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeAll(async () => { 10 | const moduleFixture = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/GET /', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/test/app.e2e-spec.ts: -------------------------------------------------------------------------------- 1 | import request from 'supertest'; 2 | import { Test } from '@nestjs/testing'; 3 | import { AppModule } from './../src/app.module'; 4 | import { INestApplication } from '@nestjs/common'; 5 | 6 | describe('AppController (e2e)', () => { 7 | let app: INestApplication; 8 | 9 | beforeAll(async () => { 10 | const moduleFixture = await Test.createTestingModule({ 11 | imports: [AppModule], 12 | }).compile(); 13 | 14 | app = moduleFixture.createNestApplication(); 15 | await app.init(); 16 | }); 17 | 18 | it('/GET /', () => { 19 | return request(app.getHttpServer()) 20 | .get('/') 21 | .expect(200) 22 | .expect('Hello World!'); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/logger.middleware.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common'; 2 | import { Routes } from 'nest-router'; 3 | 4 | @Injectable() 5 | export class LoggerMiddleware implements NestMiddleware { 6 | resolve(...excluded: Routes): MiddlewareFunction { 7 | return (req, _res, next) => { 8 | const isExcluded = 9 | excluded.filter(route => { 10 | console.log(LoggerMiddleware.name, ':', '{ Request Path ->', req.path, ' }'); 11 | const excludePath = route.path === req.path; 12 | return excludePath; 13 | }).length > 0; 14 | console.log(LoggerMiddleware.name, ':', '{ Is Excluded ->', isExcluded, ' }'); 15 | next(); 16 | }; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/logger.middleware.ts: -------------------------------------------------------------------------------- 1 | import { Injectable, NestMiddleware, MiddlewareFunction } from '@nestjs/common'; 2 | import { Routes } from 'nest-router'; 3 | 4 | @Injectable() 5 | export class LoggerMiddleware implements NestMiddleware { 6 | resolve(...excluded: Routes): MiddlewareFunction { 7 | return (req, _res, next) => { 8 | const isExcluded = 9 | excluded.filter(route => { 10 | console.log(LoggerMiddleware.name, ':', '{ Request Path ->', req.path, ' }'); 11 | const excludePath = route.path === req.path; 12 | return excludePath; 13 | }).length > 0; 14 | console.log(LoggerMiddleware.name, ':', '{ Is Excluded ->', isExcluded, ' }'); 15 | next(); 16 | }; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/ninja/ninja.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Param, Post, Body } from '@nestjs/common'; 2 | 3 | @Controller() 4 | export class NinjaController { 5 | private readonly ninjas: string[] = []; 6 | @Get('/') 7 | sayHello() { 8 | return `Hello From NinjaController`; 9 | } 10 | 11 | @Get('/all') 12 | getAllNinja() { 13 | return this.ninjas; 14 | } 15 | 16 | @Get('/:ninjaId') 17 | getNinja(@Param('ninjaId') id: string) { 18 | const idx = parseInt(id, 10) || 0; 19 | return { ninja: this.ninjas[idx - 1] || null }; 20 | } 21 | 22 | @Post('/create') 23 | createNinja(@Body('name') name: string) { 24 | const id = this.ninjas.push(name); 25 | return { ninja: this.ninjas[id - 1] || null }; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; 2 | import { RouterModule, Route } from 'nest-router'; 3 | import { CatsModule } from './cats/cats.module'; 4 | import { DogsModule } from './dogs/dogs.module'; 5 | import { NinjaModule } from './ninja/ninja.module'; 6 | import { routes } from './routes'; 7 | import { LoggerMiddleware } from './logger.middleware'; 8 | @Module({ 9 | imports: [RouterModule.forRoutes(routes), CatsModule, DogsModule, NinjaModule], 10 | }) 11 | export class ApplicationModule implements NestModule { 12 | configure(consumer: MiddlewareConsumer) { 13 | consumer 14 | .apply(LoggerMiddleware) 15 | .with({ path: '/ninja' } as Route) 16 | .forRoutes('/'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/nest-v5x/src/app.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; 2 | import { RouterModule, Route } from 'nest-router'; 3 | import { CatsModule } from './cats/cats.module'; 4 | import { DogsModule } from './dogs/dogs.module'; 5 | import { NinjaModule } from './ninja/ninja.module'; 6 | import { routes } from './routes'; 7 | import { LoggerMiddleware } from './logger.middleware'; 8 | @Module({ 9 | imports: [RouterModule.forRoutes(routes), CatsModule, DogsModule, NinjaModule], 10 | }) 11 | export class ApplicationModule implements NestModule { 12 | configure(consumer: MiddlewareConsumer) { 13 | consumer 14 | .apply(LoggerMiddleware) 15 | .with({ path: '/ninja' } as Route) 16 | .forRoutes('/'); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/test/utils/validate-path.spec.ts: -------------------------------------------------------------------------------- 1 | import { validatePath } from '../../utils/validate-path.util'; 2 | 3 | describe('ValidatePath', () => { 4 | const v = validatePath; 5 | test('it should add a / if it dose not exist', () => { 6 | expect(v('')).toEqual('/'); 7 | expect(v('path')).toEqual('/path'); 8 | }); 9 | 10 | test('it should remove all trailing slashes at the end of the path', () => { 11 | expect(v('path/')).toEqual('/path'); 12 | expect(v('path///')).toEqual('/path'); 13 | expect(v('/path/path///')).toEqual('/path/path'); 14 | }); 15 | 16 | test('it should replace all slashes with only one slash', () => { 17 | expect(v('////path/')).toEqual('/path'); 18 | expect(v('///')).toEqual('/'); 19 | expect(v('/path////path///')).toEqual('/path/path'); 20 | }); 21 | }); 22 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "warn", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": { 5 | "no-unused-expression": true 6 | }, 7 | "rules": { 8 | "eofline": false, 9 | "quotemark": [true, "single"], 10 | "indent": false, 11 | "ordered-imports": [false], 12 | "max-line-length": [true, 100], 13 | "member-ordering": [false], 14 | "curly": false, 15 | "interface-name": [false], 16 | "array-type": [false], 17 | "no-empty-interface": false, 18 | "no-empty": false, 19 | "arrow-parens": false, 20 | "object-literal-sort-keys": false, 21 | "no-unused-expression": false, 22 | "max-classes-per-file": [false], 23 | "ban-types": false, 24 | "variable-name": [false], 25 | "one-line": [false], 26 | "one-variable-per-declaration": [false] 27 | }, 28 | "rulesDirectory": [] 29 | } 30 | -------------------------------------------------------------------------------- /examples/nest-v5x/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const nodeExternals = require('webpack-node-externals'); 4 | 5 | module.exports = { 6 | entry: ['webpack/hot/poll?1000', './src/main.hmr.ts'], 7 | watch: true, 8 | target: 'node', 9 | externals: [ 10 | nodeExternals({ 11 | whitelist: ['webpack/hot/poll?1000'], 12 | }), 13 | ], 14 | module: { 15 | rules: [ 16 | { 17 | test: /\.tsx?$/, 18 | use: 'ts-loader', 19 | exclude: /node_modules/, 20 | }, 21 | ], 22 | }, 23 | mode: "development", 24 | resolve: { 25 | extensions: ['.tsx', '.ts', '.js'], 26 | }, 27 | plugins: [ 28 | new webpack.HotModuleReplacementPlugin(), 29 | ], 30 | output: { 31 | path: path.join(__dirname, 'dist'), 32 | filename: 'server.js', 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const path = require('path'); 3 | const nodeExternals = require('webpack-node-externals'); 4 | 5 | module.exports = { 6 | entry: ['webpack/hot/poll?1000', './src/main.hmr.ts'], 7 | watch: true, 8 | target: 'node', 9 | externals: [ 10 | nodeExternals({ 11 | whitelist: ['webpack/hot/poll?1000'], 12 | }), 13 | ], 14 | module: { 15 | rules: [ 16 | { 17 | test: /\.tsx?$/, 18 | use: 'ts-loader', 19 | exclude: /node_modules/, 20 | }, 21 | ], 22 | }, 23 | mode: "development", 24 | resolve: { 25 | extensions: ['.tsx', '.ts', '.js'], 26 | }, 27 | plugins: [ 28 | new webpack.HotModuleReplacementPlugin(), 29 | ], 30 | output: { 31 | path: path.join(__dirname, 'dist'), 32 | filename: 'server.js', 33 | }, 34 | }; 35 | -------------------------------------------------------------------------------- /examples/nest-v5x/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": { 5 | "no-unused-expression": true 6 | }, 7 | "rules": { 8 | "eofline": false, 9 | "quotemark": [true, "single"], 10 | "indent": false, 11 | "member-access": [false], 12 | "ordered-imports": [false], 13 | "max-line-length": [true, 150], 14 | "member-ordering": [false], 15 | "curly": false, 16 | "interface-name": [false], 17 | "array-type": [false], 18 | "no-empty-interface": false, 19 | "no-empty": false, 20 | "arrow-parens": false, 21 | "object-literal-sort-keys": false, 22 | "no-unused-expression": false, 23 | "no-console": false, 24 | "variable-name": [false], 25 | "one-line": [false], 26 | "one-variable-per-declaration": [false] 27 | }, 28 | "rulesDirectory": [] 29 | } 30 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": { 5 | "no-unused-expression": true 6 | }, 7 | "rules": { 8 | "eofline": false, 9 | "quotemark": [true, "single"], 10 | "indent": false, 11 | "member-access": [false], 12 | "ordered-imports": [false], 13 | "max-line-length": [true, 150], 14 | "member-ordering": [false], 15 | "curly": false, 16 | "interface-name": [false], 17 | "array-type": [false], 18 | "no-empty-interface": false, 19 | "no-empty": false, 20 | "arrow-parens": false, 21 | "object-literal-sort-keys": false, 22 | "no-unused-expression": false, 23 | "no-console": false, 24 | "variable-name": [false], 25 | "one-line": [false], 26 | "one-variable-per-declaration": [false] 27 | }, 28 | "rulesDirectory": [] 29 | } 30 | -------------------------------------------------------------------------------- /src/routes.interface.ts: -------------------------------------------------------------------------------- 1 | import { Type } from '@nestjs/common'; 2 | 3 | /** 4 | * Defines the Routes Tree 5 | * - `path` - a string describe the Module path which will be applied 6 | * to all it's controllers and childs 7 | * - `module` - the parent Module. 8 | * - `children` - an array of child Modules. 9 | * - `childrens` @deprecated - @see children 10 | */ 11 | export interface Route { 12 | path: string; 13 | module?: Type | string; 14 | childrens?: Routes | Type[] | string[]; 15 | children?: Routes | Type[] | string[]; 16 | } 17 | 18 | /** 19 | * Defines the Routes Tree 20 | * - `path` - a string describe the Module path which will be applied 21 | * to all it's controllers and childs 22 | * - `module` - the parent Module. 23 | * - `children` - an array of child Modules. 24 | * - `childrens` @deprecated - @see children 25 | */ 26 | export type Routes = Route[]; 27 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/src/cats/cats.controller.ts: -------------------------------------------------------------------------------- 1 | import { Controller, Get, Post, Body, ValidationPipe, Param } from '@nestjs/common'; 2 | import { CreateCatDTO } from './dto/create-cat.dto'; 3 | 4 | @Controller() 5 | export class CatsController { 6 | private cats: string[] = []; 7 | @Get('/') 8 | sayHello() { 9 | return `Hello From CatsController`; 10 | } 11 | 12 | @Get('/parent') 13 | whatIsTheNinjaId(@Param('ninjaId') ninjaId: string) { 14 | return `Hello From CatsController the ninjeId: ${ninjaId}`; 15 | } 16 | 17 | @Get('/:catId') 18 | getCat(@Param('catId') id: string) { 19 | const idx = parseInt(id, 10) || 0; 20 | return { cat: this.cats[idx - 1] || null }; 21 | } 22 | 23 | // For testing Pipes 24 | @Post('/create') 25 | public testing(@Body(new ValidationPipe()) data: CreateCatDTO): string[] { 26 | this.cats.push(data.name); 27 | return this.cats; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /scripts/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # A basic script to build and compile the typescript files using tsc 3 | 4 | # Set an error handler 5 | trap onExit EXIT 6 | 7 | # printing the simple stack trace 8 | onExit() { 9 | while caller $((n++)); 10 | do :; 11 | done; 12 | } 13 | 14 | build() { 15 | echo 'Start building..' 16 | # Run tsc 17 | tsc -p tsconfig.prod.json 18 | echo 'tsc exist with status code:' $? 19 | echo 'Copying Other files..' 20 | cp -rf package.json lib 21 | cp -rf README.md lib 22 | echo 'Done.' 23 | echo '--------' 24 | } 25 | 26 | move() { 27 | echo 'Copying files to examples/**/node_modules ..' 28 | for d in examples/*; do 29 | if [ -d "$d" ]; then 30 | dist="$d"/node_modules/nest-router 31 | echo 'Start copying to' "$dist" 32 | mkdir -p "$dist" && cp -rf lib/* "$dist" 33 | fi 34 | done 35 | echo 'Done.' 36 | echo '--------' 37 | } 38 | 39 | build 40 | 41 | if [ "$1" = "andMove" ]; then 42 | move 43 | fi -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Shady Khalifa 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/nest-v4x/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nest-router-example-v4x", 3 | "version": "1.0.0", 4 | "description": "Nest TypeScript starter repository", 5 | "license": "MIT", 6 | "scripts": { 7 | "start": "node index.js", 8 | "prestart:prod": "tsc", 9 | "start:prod": "node dist/main.js", 10 | "test": "jest --config=jest.json", 11 | "test:watch": "jest --watch --config=jest.json", 12 | "test:coverage": "jest --config=jest.json --coverage --coverageDirectory=coverage", 13 | "e2e": "jest --config=e2e/jest-e2e.json --forceExit", 14 | "e2e:watch": "jest --watch --config=e2e/jest-e2e.json" 15 | }, 16 | "dependencies": { 17 | "@nestjs/common": "^4.6.4", 18 | "@nestjs/core": "^4.6.4", 19 | "@nestjs/testing": "^4.6.1", 20 | "class-transformer": "^0.1.7", 21 | "class-validator": "^0.7.2", 22 | "nest-router": "^1.0.5", 23 | "reflect-metadata": "^0.1.10", 24 | "rxjs": "^5.4.3", 25 | "typescript": "^2.4.2" 26 | }, 27 | "devDependencies": { 28 | "@types/jest": "^20.0.8", 29 | "@types/node": "^7.0.41", 30 | "jest": "^20.0.4", 31 | "supertest": "^3.0.0", 32 | "ts-jest": "^20.0.14", 33 | "ts-node": "^3.3.0" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/utils/flat-routes.util.ts: -------------------------------------------------------------------------------- 1 | import { isString } from 'util'; 2 | import { Routes } from '../routes.interface'; 3 | import { validatePath } from './validate-path.util'; 4 | 5 | const result = []; 6 | export function flatRoutes(routes: Routes) { 7 | routes.forEach(element => { 8 | if (element.module && element.path) { 9 | result.push(element); 10 | } 11 | // this block will be removed soon 12 | if (!element.children && element.childrens) { 13 | element.children = element.childrens; 14 | console.log( 15 | `\x1b[33m%s\x1b[0m`, 16 | `WARNING: 'childrens' is deprecated, use 'children' instead.`, 17 | ); 18 | } 19 | if (element.children) { 20 | const childrenRef = element.children as Routes; 21 | childrenRef.forEach(child => { 22 | if (!isString(child) && child.path) { 23 | child.path = validatePath(validatePath(element.path) + validatePath(child.path)); 24 | } else { 25 | result.push({ path: element.path, module: child }); 26 | } 27 | }); 28 | return flatRoutes(childrenRef); 29 | } 30 | }); 31 | result.forEach(route => { 32 | delete route.children; 33 | }); 34 | return result; 35 | } 36 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | #ide 30 | .vscode 31 | .idea 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (http://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | # NPM 65 | src 66 | example 67 | gulpfile.js 68 | .prettierrc 69 | .travis.yml -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | 8 | # Runtime data 9 | pids 10 | *.pid 11 | *.seed 12 | *.pid.lock 13 | 14 | # Directory for instrumented libs generated by jscoverage/JSCover 15 | lib-cov 16 | 17 | # Coverage directory used by tools like istanbul 18 | coverage 19 | 20 | # nyc test coverage 21 | .nyc_output 22 | 23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 24 | .grunt 25 | 26 | # Bower dependency directory (https://bower.io/) 27 | bower_components 28 | 29 | #ide 30 | .vscode 31 | .idea 32 | 33 | # node-waf configuration 34 | .lock-wscript 35 | 36 | # Compiled binary addons (http://nodejs.org/api/addons.html) 37 | build/Release 38 | 39 | # Dependency directories 40 | node_modules/ 41 | jspm_packages/ 42 | 43 | # Typescript v1 declaration files 44 | typings/ 45 | 46 | # Optional npm cache directory 47 | .npm 48 | 49 | # Optional eslint cache 50 | .eslintcache 51 | 52 | # Optional REPL history 53 | .node_repl_history 54 | 55 | # Output of 'npm pack' 56 | *.tgz 57 | 58 | # Yarn Integrity file 59 | .yarn-integrity 60 | 61 | # dotenv environment variables file 62 | .env 63 | 64 | # build and Play 65 | play 66 | 67 | # remove build or lib from repo 68 | lib 69 | dist -------------------------------------------------------------------------------- /examples/nest-v4x/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": [ 4 | "tslint:recommended" 5 | ], 6 | "jsRules": { 7 | "no-unused-expression": true 8 | }, 9 | "rules": { 10 | "eofline": false, 11 | "quotemark": [ 12 | true, 13 | "single" 14 | ], 15 | "ordered-imports": [ 16 | false 17 | ], 18 | "max-line-length": [ 19 | 150 20 | ], 21 | "member-ordering": [ 22 | false 23 | ], 24 | "curly": false, 25 | "interface-name": [ 26 | false 27 | ], 28 | "array-type": [ 29 | false 30 | ], 31 | "member-access": [ 32 | false 33 | ], 34 | "no-empty-interface": false, 35 | "no-empty": false, 36 | "arrow-parens": false, 37 | "object-literal-sort-keys": false, 38 | "no-unused-expression": false, 39 | "max-classes-per-file": [ 40 | false 41 | ], 42 | "variable-name": [ 43 | false 44 | ], 45 | "one-line": [ 46 | false 47 | ], 48 | "one-variable-per-declaration": [ 49 | false 50 | ] 51 | }, 52 | "rulesDirectory": [] 53 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nest-router", 3 | "version": "1.0.9", 4 | "description": "Router Module For Nestjs Framework", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "jest --notify --config=jest.json", 8 | "test:watch": "jest --watch --config=jest.json", 9 | "test:coverage": "jest --config=jest.json --coverage --coverageDirectory=coverage", 10 | "build": "./scripts/build.sh", 11 | "build:andMove": "./scripts/build.sh andMove", 12 | "npm:publish": "cd lib && npm publish" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/shekohex/nest-router.git" 17 | }, 18 | "keywords": [ 19 | "nestjs", 20 | "router", 21 | "addons" 22 | ], 23 | "author": "Shady Khalifa ", 24 | "license": "MIT", 25 | "devDependencies": { 26 | "@nestjs/common": "^5.0.0", 27 | "@nestjs/core": "^5.0.0", 28 | "@nestjs/testing": "^5.3.11", 29 | "@types/jest": "^24.0.0", 30 | "@types/node": "^12.0.0", 31 | "coveralls": "^3.0.2", 32 | "jest": "^23.6.0", 33 | "reflect-metadata": "^0.1.12", 34 | "rxjs": "^6.3.0", 35 | "ts-jest": "^24.0.0", 36 | "typescript": "^3.0.0" 37 | }, 38 | "bugs": { 39 | "url": "https://github.com/shekohex/nest-router/issues" 40 | }, 41 | "homepage": "https://github.com/shekohex/nest-router#readme" 42 | } 43 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | All notable changes to this project will be documented in this file. 4 | 5 | The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) 6 | and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). 7 | 8 | ## [Unreleased] 9 | 10 | ## [1.0.9] 11 | ## Bugs 12 | * Fix Bug [#41](https://github.com/shekohex/nest-router/issues/41) 13 | 14 | ## [1.0.8] 15 | ### Added 16 | * Resolve Full Controller Path from anywhere ([#32](https://github.com/shekohex/nest-router/pull/32)) 17 | 18 | ## Changed 19 | * Update Dev Dependencies 20 | 21 | ## [1.0.7] - 2018-09-28 22 | ### Changed 23 | * Project dependency refactor 24 | * add node v10 as a test target 25 | 26 | ## [1.0.6] - 2018-06-20 27 | ### Changed 28 | * Now Nest Router Module Using Nest V5+ 29 | > See examples folder, there is `nest-v5x`. 30 | 31 | ## [1.0.5] - 2018-02-27 32 | 33 | ### Deprecated 34 | 35 | * `childrens`, use `children` instead. 36 | see [why](https://github.com/shekohex/nest-router/issues/6)? 37 | 38 | ## [1.0.4] - 2018-02-12 39 | 40 | ### Added 41 | 42 | * You can now Omit the `module` keyword and just using an arry 43 | of `children` and one `path` proparty. 44 | 45 | ## [1.0.3] - 2018-02-10 46 | 47 | ### Added 48 | 49 | * `children` array can be array with just modules. 50 | this means you can omit the `path` keyword. 51 | * Unreleased section to gather unreleased changes and encourage note 52 | keeping prior to releases. 53 | 54 | ## [1.0.2] - 2018-02-08 55 | 56 | ### Added 57 | 58 | * Routes now can be endless nested array. 59 | 60 | ## [1.0.1] - 2018-02-05 61 | 62 | ### Changed 63 | 64 | * `children` now an Array insted of `object` 65 | 66 | ## [1.0.0] - 2018-02-05 67 | 68 | * Published to NPM :rocket: 69 | * add continuous integration "Travis CI" 70 | 71 | ## [0.0.0] - 2018-01-31 72 | 73 | ### Added 74 | 75 | * Greenkeeper badge 76 | * README 77 | * Good examples and basic guidelines, in example folder and README. 78 | * Build status badge 79 | -------------------------------------------------------------------------------- /examples/nest-v5x/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nest-router-example-v5x", 3 | "version": "1.0.0", 4 | "description": "Nest TypeScript starter repository", 5 | "license": "MIT", 6 | "scripts": { 7 | "format": "prettier --write \"src/**/*.ts\"", 8 | "start": "ts-node -r tsconfig-paths/register src/main.ts", 9 | "start:dev": "nodemon", 10 | "prestart:prod": "rm -rf dist && tsc", 11 | "start:prod": "node dist/main.js", 12 | "start:hmr": "node dist/server", 13 | "lint": "tslint -p tsconfig.json -c tslint.json", 14 | "test": "jest", 15 | "test:cov": "jest --coverage", 16 | "test:e2e": "jest --config ./test/jest-e2e.json", 17 | "webpack": "webpack --config webpack.config.js" 18 | }, 19 | "dependencies": { 20 | "@nestjs/common": "^5.5.0", 21 | "@nestjs/core": "^5.5.0", 22 | "@nestjs/microservices": "^5.5.0", 23 | "@nestjs/testing": "^5.5.0", 24 | "@nestjs/websockets": "^5.5.0", 25 | "class-transformer": "^0.2.0", 26 | "class-validator": "^0.9.1", 27 | "nest-router": "^1.0.8", 28 | "reflect-metadata": "^0.1.12", 29 | "rxjs": "^6.3.0", 30 | "typescript": "^2.9.2" 31 | }, 32 | "devDependencies": { 33 | "@types/express": "^4.0.39", 34 | "@types/jest": "^21.1.8", 35 | "@types/node": "^9.3.0", 36 | "@types/supertest": "^2.0.4", 37 | "jest": "^21.2.1", 38 | "nodemon": "^1.14.1", 39 | "prettier": "^1.11.1", 40 | "supertest": "^3.0.0", 41 | "ts-jest": "^21.2.4", 42 | "ts-loader": "^4.1.0", 43 | "ts-node": "^4.1.0", 44 | "tsconfig-paths": "^3.1.1", 45 | "tslint": "5.3.2", 46 | "webpack": "^4.2.0", 47 | "webpack-cli": "^5.0.1", 48 | "webpack-node-externals": "^1.6.0" 49 | }, 50 | "jest": { 51 | "moduleFileExtensions": [ 52 | "js", 53 | "json", 54 | "ts" 55 | ], 56 | "rootDir": "src", 57 | "testRegex": ".spec.ts$", 58 | "transform": { 59 | "^.+\\.(t|j)s$": "ts-jest" 60 | }, 61 | "coverageDirectory": "../coverage" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /examples/nest-v5x-m2m/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nest-router-example-v5x-m2m", 3 | "version": "1.0.0", 4 | "description": "Nest TypeScript starter repository", 5 | "license": "MIT", 6 | "scripts": { 7 | "format": "prettier --write \"src/**/*.ts\"", 8 | "start": "ts-node -r tsconfig-paths/register src/main.ts", 9 | "start:dev": "nodemon", 10 | "prestart:prod": "rm -rf dist && tsc", 11 | "start:prod": "node dist/main.js", 12 | "start:hmr": "node dist/server", 13 | "lint": "tslint -p tsconfig.json -c tslint.json", 14 | "test": "jest", 15 | "test:cov": "jest --coverage", 16 | "test:e2e": "jest --config ./test/jest-e2e.json", 17 | "webpack": "webpack --config webpack.config.js" 18 | }, 19 | "dependencies": { 20 | "@nestjs/common": "^5.5.0", 21 | "@nestjs/core": "^5.5.0", 22 | "@nestjs/microservices": "^5.5.0", 23 | "@nestjs/testing": "^5.5.0", 24 | "@nestjs/websockets": "^5.5.0", 25 | "class-transformer": "^0.2.0", 26 | "class-validator": "^0.9.1", 27 | "nest-router": "^1.0.9", 28 | "reflect-metadata": "^0.1.12", 29 | "rxjs": "^6.3.0", 30 | "typescript": "^2.9.2" 31 | }, 32 | "devDependencies": { 33 | "@types/express": "^4.0.39", 34 | "@types/jest": "^21.1.8", 35 | "@types/node": "^9.3.0", 36 | "@types/supertest": "^2.0.4", 37 | "jest": "^21.2.1", 38 | "nodemon": "^1.14.1", 39 | "prettier": "^1.11.1", 40 | "supertest": "^3.0.0", 41 | "ts-jest": "^21.2.4", 42 | "ts-loader": "^4.1.0", 43 | "ts-node": "^4.1.0", 44 | "tsconfig-paths": "^3.1.1", 45 | "tslint": "5.3.2", 46 | "webpack": "^4.28.0", 47 | "webpack-cli": "^3.1.2", 48 | "webpack-node-externals": "^1.7.2" 49 | }, 50 | "jest": { 51 | "moduleFileExtensions": [ 52 | "js", 53 | "json", 54 | "ts" 55 | ], 56 | "rootDir": "src", 57 | "testRegex": ".spec.ts$", 58 | "transform": { 59 | "^.+\\.(t|j)s$": "ts-jest" 60 | }, 61 | "coverageDirectory": "../coverage" 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /src/test/utils/flat-routes.spec.ts: -------------------------------------------------------------------------------- 1 | import { flatRoutes } from '../../utils/flat-routes.util'; 2 | describe('FlatRoutes', () => { 3 | const f = flatRoutes; 4 | test('it should flat all Routes to endless, and we could also ommit the path', () => { 5 | const routes = [ 6 | { 7 | path: '/parent', 8 | module: 'ParentModule', 9 | children: [ 10 | { 11 | path: '/child', 12 | module: 'ChildModule', 13 | children: [ 14 | { path: '/child2', module: 'ChildModule2' }, 15 | { 16 | path: '/parentchild', 17 | module: 'ParentChildModule', 18 | children: [ 19 | { 20 | path: '/childchild', 21 | module: 'ChildChildModule', 22 | children: [{ path: '/child2child', module: 'ChildChildModule2' }], 23 | }, 24 | ], 25 | }, 26 | ], 27 | }, 28 | ], 29 | }, 30 | { path: '/v1', children: ['AuthModule', 'CatsModule', 'DogsModule'] }, 31 | { path: '/v2', children: ['AuthModule2', 'CatsModule2'] }, 32 | { path: '/v3', childrens: ['AuthModule3', 'CatsModule3'] }, 33 | ]; 34 | const expectedRoutes = [ 35 | { path: '/parent', module: 'ParentModule' }, 36 | { path: '/parent/child', module: 'ChildModule' }, 37 | { path: '/parent/child/child2', module: 'ChildModule2' }, 38 | { path: '/parent/child/parentchild', module: 'ParentChildModule' }, 39 | { path: '/parent/child/parentchild/childchild', module: 'ChildChildModule' }, 40 | { path: '/parent/child/parentchild/childchild/child2child', module: 'ChildChildModule2' }, 41 | { path: '/v1', module: 'AuthModule' }, 42 | { path: '/v1', module: 'CatsModule' }, 43 | { path: '/v1', module: 'DogsModule' }, 44 | { path: '/v2', module: 'AuthModule2' }, 45 | { path: '/v2', module: 'CatsModule2' }, 46 | { path: '/v3', module: 'AuthModule3' }, 47 | { path: '/v3', module: 'CatsModule3' }, 48 | ]; 49 | expect(f(routes)).toEqual(expectedRoutes); 50 | }); 51 | }); 52 | -------------------------------------------------------------------------------- /src/router.module.ts: -------------------------------------------------------------------------------- 1 | import { Module, DynamicModule } from '@nestjs/common'; 2 | import { MODULE_PATH, PATH_METADATA } from '@nestjs/common/constants'; 3 | import { ModulesContainer } from '@nestjs/core/injector/modules-container'; 4 | import { Controller, Type } from '@nestjs/common/interfaces'; 5 | import { UnknownElementException } from '@nestjs/core/errors/exceptions/unknown-element.exception'; 6 | import { validatePath } from './utils/validate-path.util'; 7 | import { flatRoutes } from './utils/flat-routes.util'; 8 | import { Routes } from './routes.interface'; 9 | 10 | /** 11 | * A utility Module to Organize your Routes, 12 | * it could be imported in the Root Module of you application. 13 | */ 14 | @Module({}) 15 | export class RouterModule { 16 | private static readonly routesContainer: Map = new Map(); 17 | constructor(readonly modulesContainer: ModulesContainer) { 18 | const modules = [...modulesContainer.values()]; 19 | for (const nestModule of modules) { 20 | const modulePath: string = Reflect.getMetadata(MODULE_PATH, nestModule.metatype); 21 | for (const route of nestModule.routes.values()) { 22 | RouterModule.routesContainer.set(route.name, validatePath(modulePath)); 23 | } 24 | } 25 | } 26 | 27 | /** 28 | * takes an array of modules and organize them in hierarchy way 29 | * @param {Routes} routes Array of Routes 30 | */ 31 | public static forRoutes(routes: Routes): DynamicModule { 32 | RouterModule.buildPathMap(routes); 33 | return { 34 | module: RouterModule, 35 | }; 36 | } 37 | 38 | /** 39 | * get the controller full route path eg: (controller's module prefix + controller's path). 40 | * @param {Type} controller the controller you need to get it's full path 41 | */ 42 | public static resolvePath(controller: Type): string { 43 | const controllerPath: string = Reflect.getMetadata(PATH_METADATA, controller); 44 | const modulePath = RouterModule.routesContainer.get(controller.name); 45 | if (modulePath && controllerPath) { 46 | return validatePath(modulePath + validatePath(controllerPath)); 47 | } else { 48 | throw new UnknownElementException(); 49 | } 50 | } 51 | 52 | private static buildPathMap(routes: Routes) { 53 | const flattenRoutes = flatRoutes(routes); 54 | flattenRoutes.forEach(route => { 55 | Reflect.defineMetadata(MODULE_PATH, validatePath(route.path), route.module); 56 | }); 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /src/test/router.module.spec.ts: -------------------------------------------------------------------------------- 1 | import { RouterModule } from '../router.module'; 2 | import { Routes } from '../routes.interface'; 3 | import { Module, Controller } from '@nestjs/common'; 4 | import { MODULE_PATH } from '@nestjs/common/constants'; 5 | import { Test } from '@nestjs/testing'; 6 | import { INestApplication } from '@nestjs/common'; 7 | 8 | describe('RouterModule', () => { 9 | let app: INestApplication; 10 | 11 | @Controller('/parent-controller') 12 | class ParentController {} 13 | @Controller('/child-controller') 14 | class ChildController {} 15 | @Controller('no-slash-controller') 16 | class NoSlashController {} 17 | 18 | class UnknownController {} 19 | @Module({ controllers: [ParentController] }) 20 | class ParentModule {} 21 | 22 | @Module({ controllers: [ChildController] }) 23 | class ChildModule {} 24 | 25 | @Module({}) 26 | class AuthModule {} 27 | @Module({}) 28 | class PaymentsModule {} 29 | 30 | @Module({ controllers: [NoSlashController] }) 31 | class NoSlashModule {} 32 | 33 | const routes1: Routes = [ 34 | { 35 | path: 'parent', 36 | module: ParentModule, 37 | children: [ 38 | { 39 | path: 'child', 40 | module: ChildModule, 41 | }, 42 | ], 43 | }, 44 | ]; 45 | const routes2: Routes = [{ path: 'v1', children: [AuthModule, PaymentsModule, NoSlashModule] }]; 46 | 47 | @Module({ imports: [ParentModule, ChildModule, RouterModule.forRoutes(routes1)] }) 48 | class MainModule {} 49 | 50 | @Module({ imports: [AuthModule, PaymentsModule, NoSlashModule, RouterModule.forRoutes(routes2)] }) 51 | class AppModule {} 52 | 53 | test('it should add Path Metadata to all Routes', () => { 54 | const parentPath = Reflect.getMetadata(MODULE_PATH, ParentModule); 55 | const childPath = Reflect.getMetadata(MODULE_PATH, ChildModule); 56 | expect(parentPath).toEqual('/parent'); 57 | expect(childPath).toEqual('/parent/child'); 58 | }); 59 | 60 | test('it should add paths even we omitted the module keyword', () => { 61 | const authPath = Reflect.getMetadata(MODULE_PATH, AuthModule); 62 | const paymentPath = Reflect.getMetadata(MODULE_PATH, PaymentsModule); 63 | expect(authPath).toEqual('/v1'); 64 | expect(paymentPath).toEqual('/v1'); 65 | }); 66 | 67 | describe('Full Running App', async () => { 68 | beforeAll(async () => { 69 | const module = await Test.createTestingModule({ 70 | imports: [MainModule, AppModule], 71 | }).compile(); 72 | app = module.createNestApplication(); 73 | await app.init(); 74 | }); 75 | 76 | it('should Resolve Controllers path with its Module Path if any', async () => { 77 | expect(RouterModule.resolvePath(ParentController)).toEqual('/parent/parent-controller'); 78 | expect(RouterModule.resolvePath(ChildController)).toEqual('/parent/child/child-controller'); 79 | }); 80 | 81 | it('should throw error when we cannot find the controller', async () => { 82 | expect(() => RouterModule.resolvePath(UnknownController)).toThrowError( 83 | 'Nest cannot find given element (it does not exist in current context)', 84 | ); 85 | }); 86 | 87 | it('should resolve controllers path concatinated with its module path correctly', async () => { 88 | expect(RouterModule.resolvePath(NoSlashController)).toEqual('/v1/no-slash-controller'); 89 | }); 90 | 91 | afterAll(async () => { 92 | await app.close(); 93 | }); 94 | }); 95 | }); 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nest Router :vertical_traffic_light: 2 | 3 | [![Greenkeeper badge](https://badges.greenkeeper.io/shekohex/nest-router.svg)](https://greenkeeper.io/) [![Build Status](https://travis-ci.org/shekohex/nest-router.svg?branch=master)](https://travis-ci.org/shekohex/nest-router) [![npm version](https://badge.fury.io/js/nest-router.svg)](Https://www.npmjs.com/package/nest-router) [![Coverage Status](https://coveralls.io/repos/github/shekohex/nest-router/badge.svg?branch=master)](https://coveralls.io/github/shekohex/nest-router?branch=master) 4 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fshekohex%2Fnest-router.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fshekohex%2Fnest-router?ref=badge_shield) 5 | 6 | Router Module For [Nestjs](https://github.com/nestjs/nest) Framework 7 | 8 | ## Important Note 9 | 10 | As of Nestjs `v8.0.0` This module got added into the `@nestjs/core`. 11 | see the [docs](https://docs.nestjs.com/recipes/router-module) 12 | with that being said, this package is still maintained (for now). 13 | 14 | ## Quick Overview 15 | 16 | `RouterModule` helps you organize your routes and lets you create a routes tree. 17 | 18 | ### How ? 19 | 20 | Every module could have a path property. That path will be a prefix for all controllers in this module. If that module has a parent, it will be a child of it and again all controllers in this child module will be prefixed by `parent module prefix` + `this module prefix` 21 | 22 | > see issue [#255](https://github.com/nestjs/nest/issues/255) . 23 | 24 | ## Install 25 | 26 | IMPORTANT: you need Nest > v4.5.10+ 27 | 28 | ```bash 29 | npm install nest-router --save 30 | ``` 31 | 32 | OR 33 | 34 | ```bash 35 | yarn add nest-router 36 | ``` 37 | 38 | ## Setup 39 | 40 | See how easy it is to set up. 41 | 42 | ```ts 43 | ... //imports 44 | const routes: Routes = [ 45 | { 46 | path: '/ninja', 47 | module: NinjaModule, 48 | children: [ 49 | { 50 | path: '/cats', 51 | module: CatsModule, 52 | }, 53 | { 54 | path: '/dogs', 55 | module: DogsModule, 56 | }, 57 | ], 58 | }, 59 | ]; 60 | 61 | @Module({ 62 | imports: [ 63 | RouterModule.forRoutes(routes), // setup the routes 64 | CatsModule, 65 | DogsModule, 66 | NinjaModule 67 | ], // as usual, nothing new 68 | }) 69 | export class ApplicationModule {} 70 | ``` 71 | 72 | > :+1: TIP: Keep all of your routes in a separate file like `routes.ts` 73 | 74 | In this example, all the controllers in `NinjaModule` will be prefixed by `/ninja` and it 75 | has two childs, `CatsModule` and `DogsModule`. 76 | 77 | Will the controllers of `CatsModule` be prefixed by `/cats`? NO!! :open_mouth: 78 | The `CatsModule` is a child of `NinjaModule` so it will be prefixed by `/ninja/cats/` instead. 79 | And so will `DogsModule`. 80 | 81 | > See examples folder for more information. 82 | 83 | #### Example Folder Project Structure 84 | 85 | ```bash 86 | . 87 | ├── app.module.ts 88 | ├── cats 89 | │   ├── cats.controller.ts 90 | │   ├── cats.module.ts 91 | │   └── ketty.controller.ts 92 | ├── dogs 93 | │   ├── dogs.controller.ts 94 | │   ├── dogs.module.ts 95 | │   └── puppy.controller.ts 96 | ├── main.ts 97 | └── ninja 98 | ├── katana.controller.ts 99 | ├── ninja.controller.ts 100 | └── ninja.module.ts 101 | ``` 102 | 103 | And here is a simple, nice route tree of `example` folder: 104 | 105 | ```bash 106 | ninja 107 | ├── / 108 | ├── /katana 109 | ├── cats 110 | │   ├── / 111 | │   └── /ketty 112 | ├── dogs 113 |    ├── / 114 |    └── /puppy 115 | ``` 116 | 117 | Nice! 118 | 119 | #### Params in nested routes 120 | 121 | In a standard REST API, you probably would need to add some params to your nested routes. Here is an example of how you can achieve it: 122 | 123 | ```ts 124 | ... //imports 125 | const routes: Routes = [ 126 | { 127 | path: '/ninja', 128 | module: NinjaModule, 129 | children: [ 130 | { 131 | path: '/:ninjaId/cats', 132 | module: CatsModule, 133 | }, 134 | { 135 | path: '/:ninjaId/dogs', 136 | module: DogsModule, 137 | }, 138 | ], 139 | }, 140 | ]; 141 | ``` 142 | 143 | The `ninjaId` param will be available inside `CatsModule` controllers and `DogsModule` controllers. Please, find the [instruction how to handle params in the official documentation](https://docs.nestjs.com/controllers#route-parameters). It might be a good practice to use a [pipe for transformation use case](https://docs.nestjs.com/pipes#transformation-use-case) to have an access to `ninja` object instead of just id. 144 | 145 | 146 | #### Resolve Full Controller Path: 147 | Nestjs dosen't resolve or take into account `MODULE_PATH` metadata when it is coming to resolve Controller path in Middleware resolver for example, so that i introduced a new fancy method `RouterModule#resolvePath` that will resolve the full path of any controller so instead of doing so: 148 | 149 | ```ts 150 | consumer.apply(someMiddleware).forRoutes(SomeController); 151 | ``` 152 | you should do 153 | 154 | ```ts 155 | consumer.apply(someMiddleware).forRoutes(RouterModule.resolvePath(SomeController)); 156 | ``` 157 | 158 | see [#32](https://github.com/shekohex/nest-router/pull/32) for more information about this. 159 | 160 | ## CHANGELOG 161 | 162 | See [CHANGELOG](CHANGELOG.md) for more information. 163 | 164 | ## Contributing 165 | 166 | You are welcome to contribute to this project, just open a PR. 167 | 168 | ## Authors 169 | 170 | * **Shady Khalifa** - _Initial work_ 171 | 172 | See also the list of [contributors](https://github.com/shekohex/nest-router/contributors) who participated in this project. 173 | 174 | ## License 175 | 176 | This project is licensed under the MIT License - see the [LICENSE.md](LICENSE.md) file for details. 177 | 178 | [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fshekohex%2Fnest-router.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fshekohex%2Fnest-router?ref=badge_large) 179 | -------------------------------------------------------------------------------- /examples/nest-v4x/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@nestjs/common@^4.6.4": 6 | version "4.6.4" 7 | resolved "https://registry.yarnpkg.com/@nestjs/common/-/common-4.6.4.tgz#c71be24117f6d93e7d4494927a9d2267c50af931" 8 | dependencies: 9 | axios "0.17.1" 10 | class-transformer "0.1.8" 11 | class-validator "0.8.1" 12 | cli-color "1.1.0" 13 | 14 | "@nestjs/core@^4.6.4": 15 | version "4.6.4" 16 | resolved "https://registry.yarnpkg.com/@nestjs/core/-/core-4.6.4.tgz#bd9e682f7f51008f4a20d0a1c1e0df2265383d4a" 17 | dependencies: 18 | body-parser "1.17.2" 19 | cors "2.8.4" 20 | express "4.16.2" 21 | iterare "0.0.8" 22 | multer "1.3.0" 23 | optional "0.1.4" 24 | 25 | "@nestjs/testing@^4.6.1": 26 | version "4.6.1" 27 | resolved "https://registry.yarnpkg.com/@nestjs/testing/-/testing-4.6.1.tgz#82b63bfbe7cdadf0d126d0c8b169eef948a8aa17" 28 | dependencies: 29 | optional "0.1.4" 30 | 31 | "@types/jest@^20.0.8": 32 | version "20.0.8" 33 | resolved "https://registry.yarnpkg.com/@types/jest/-/jest-20.0.8.tgz#7f8c97f73d20d3bf5448fbe33661a342002b5954" 34 | 35 | "@types/node@^7.0.41": 36 | version "7.0.52" 37 | resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.52.tgz#8990d3350375542b0c21a83cd0331e6a8fc86716" 38 | 39 | abab@^1.0.3: 40 | version "1.0.4" 41 | resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" 42 | 43 | accepts@~1.3.4: 44 | version "1.3.4" 45 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" 46 | dependencies: 47 | mime-types "~2.1.16" 48 | negotiator "0.6.1" 49 | 50 | acorn-globals@^3.1.0: 51 | version "3.1.0" 52 | resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" 53 | dependencies: 54 | acorn "^4.0.4" 55 | 56 | acorn@^4.0.4: 57 | version "4.0.13" 58 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" 59 | 60 | ajv@^5.1.0: 61 | version "5.5.2" 62 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" 63 | dependencies: 64 | co "^4.6.0" 65 | fast-deep-equal "^1.0.0" 66 | fast-json-stable-stringify "^2.0.0" 67 | json-schema-traverse "^0.3.0" 68 | 69 | ansi-escapes@^1.4.0: 70 | version "1.4.0" 71 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 72 | 73 | ansi-regex@2, ansi-regex@^2.0.0, ansi-regex@^2.1.1: 74 | version "2.1.1" 75 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 76 | 77 | ansi-regex@^3.0.0: 78 | version "3.0.0" 79 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 80 | 81 | ansi-styles@^2.2.1: 82 | version "2.2.1" 83 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 84 | 85 | ansi-styles@^3.0.0, ansi-styles@^3.1.0: 86 | version "3.2.0" 87 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 88 | dependencies: 89 | color-convert "^1.9.0" 90 | 91 | anymatch@^1.3.0: 92 | version "1.3.2" 93 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 94 | dependencies: 95 | micromatch "^2.1.5" 96 | normalize-path "^2.0.0" 97 | 98 | append-field@^0.1.0: 99 | version "0.1.0" 100 | resolved "https://registry.yarnpkg.com/append-field/-/append-field-0.1.0.tgz#6ddc58fa083c7bc545d3c5995b2830cc2366d44a" 101 | 102 | append-transform@^0.4.0: 103 | version "0.4.0" 104 | resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" 105 | dependencies: 106 | default-require-extensions "^1.0.0" 107 | 108 | argparse@^1.0.7: 109 | version "1.0.9" 110 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 111 | dependencies: 112 | sprintf-js "~1.0.2" 113 | 114 | arr-diff@^2.0.0: 115 | version "2.0.0" 116 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 117 | dependencies: 118 | arr-flatten "^1.0.1" 119 | 120 | arr-flatten@^1.0.1: 121 | version "1.1.0" 122 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 123 | 124 | array-equal@^1.0.0: 125 | version "1.0.0" 126 | resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" 127 | 128 | array-flatten@1.1.1: 129 | version "1.1.1" 130 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 131 | 132 | array-unique@^0.2.1: 133 | version "0.2.1" 134 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 135 | 136 | arrify@^1.0.0, arrify@^1.0.1: 137 | version "1.0.1" 138 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 139 | 140 | asn1@~0.2.3: 141 | version "0.2.3" 142 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 143 | 144 | assert-plus@1.0.0, assert-plus@^1.0.0: 145 | version "1.0.0" 146 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 147 | 148 | async@^2.1.4: 149 | version "2.6.0" 150 | resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" 151 | dependencies: 152 | lodash "^4.14.0" 153 | 154 | asynckit@^0.4.0: 155 | version "0.4.0" 156 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 157 | 158 | aws-sign2@~0.7.0: 159 | version "0.7.0" 160 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" 161 | 162 | aws4@^1.6.0: 163 | version "1.6.0" 164 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 165 | 166 | axios@0.17.1: 167 | version "0.17.1" 168 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.17.1.tgz#2d8e3e5d0bdbd7327f91bc814f5c57660f81824d" 169 | dependencies: 170 | follow-redirects "^1.2.5" 171 | is-buffer "^1.1.5" 172 | 173 | babel-code-frame@^6.26.0: 174 | version "6.26.0" 175 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 176 | dependencies: 177 | chalk "^1.1.3" 178 | esutils "^2.0.2" 179 | js-tokens "^3.0.2" 180 | 181 | babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: 182 | version "6.26.0" 183 | resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" 184 | dependencies: 185 | babel-code-frame "^6.26.0" 186 | babel-generator "^6.26.0" 187 | babel-helpers "^6.24.1" 188 | babel-messages "^6.23.0" 189 | babel-register "^6.26.0" 190 | babel-runtime "^6.26.0" 191 | babel-template "^6.26.0" 192 | babel-traverse "^6.26.0" 193 | babel-types "^6.26.0" 194 | babylon "^6.18.0" 195 | convert-source-map "^1.5.0" 196 | debug "^2.6.8" 197 | json5 "^0.5.1" 198 | lodash "^4.17.4" 199 | minimatch "^3.0.4" 200 | path-is-absolute "^1.0.1" 201 | private "^0.1.7" 202 | slash "^1.0.0" 203 | source-map "^0.5.6" 204 | 205 | babel-generator@^6.18.0, babel-generator@^6.26.0: 206 | version "6.26.0" 207 | resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" 208 | dependencies: 209 | babel-messages "^6.23.0" 210 | babel-runtime "^6.26.0" 211 | babel-types "^6.26.0" 212 | detect-indent "^4.0.0" 213 | jsesc "^1.3.0" 214 | lodash "^4.17.4" 215 | source-map "^0.5.6" 216 | trim-right "^1.0.1" 217 | 218 | babel-helpers@^6.24.1: 219 | version "6.24.1" 220 | resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" 221 | dependencies: 222 | babel-runtime "^6.22.0" 223 | babel-template "^6.24.1" 224 | 225 | babel-jest@^20.0.3: 226 | version "20.0.3" 227 | resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671" 228 | dependencies: 229 | babel-core "^6.0.0" 230 | babel-plugin-istanbul "^4.0.0" 231 | babel-preset-jest "^20.0.3" 232 | 233 | babel-messages@^6.23.0: 234 | version "6.23.0" 235 | resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" 236 | dependencies: 237 | babel-runtime "^6.22.0" 238 | 239 | babel-plugin-istanbul@^4.0.0, babel-plugin-istanbul@^4.1.4: 240 | version "4.1.5" 241 | resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" 242 | dependencies: 243 | find-up "^2.1.0" 244 | istanbul-lib-instrument "^1.7.5" 245 | test-exclude "^4.1.1" 246 | 247 | babel-plugin-jest-hoist@^20.0.3: 248 | version "20.0.3" 249 | resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767" 250 | 251 | babel-plugin-transform-es2015-modules-commonjs@^6.24.1: 252 | version "6.26.0" 253 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" 254 | dependencies: 255 | babel-plugin-transform-strict-mode "^6.24.1" 256 | babel-runtime "^6.26.0" 257 | babel-template "^6.26.0" 258 | babel-types "^6.26.0" 259 | 260 | babel-plugin-transform-strict-mode@^6.24.1: 261 | version "6.24.1" 262 | resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" 263 | dependencies: 264 | babel-runtime "^6.22.0" 265 | babel-types "^6.24.1" 266 | 267 | babel-preset-jest@^20.0.3: 268 | version "20.0.3" 269 | resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a" 270 | dependencies: 271 | babel-plugin-jest-hoist "^20.0.3" 272 | 273 | babel-register@^6.26.0: 274 | version "6.26.0" 275 | resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" 276 | dependencies: 277 | babel-core "^6.26.0" 278 | babel-runtime "^6.26.0" 279 | core-js "^2.5.0" 280 | home-or-tmp "^2.0.0" 281 | lodash "^4.17.4" 282 | mkdirp "^0.5.1" 283 | source-map-support "^0.4.15" 284 | 285 | babel-runtime@^6.22.0, babel-runtime@^6.26.0: 286 | version "6.26.0" 287 | resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" 288 | dependencies: 289 | core-js "^2.4.0" 290 | regenerator-runtime "^0.11.0" 291 | 292 | babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: 293 | version "6.26.0" 294 | resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" 295 | dependencies: 296 | babel-runtime "^6.26.0" 297 | babel-traverse "^6.26.0" 298 | babel-types "^6.26.0" 299 | babylon "^6.18.0" 300 | lodash "^4.17.4" 301 | 302 | babel-traverse@^6.18.0, babel-traverse@^6.26.0: 303 | version "6.26.0" 304 | resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" 305 | dependencies: 306 | babel-code-frame "^6.26.0" 307 | babel-messages "^6.23.0" 308 | babel-runtime "^6.26.0" 309 | babel-types "^6.26.0" 310 | babylon "^6.18.0" 311 | debug "^2.6.8" 312 | globals "^9.18.0" 313 | invariant "^2.2.2" 314 | lodash "^4.17.4" 315 | 316 | babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: 317 | version "6.26.0" 318 | resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" 319 | dependencies: 320 | babel-runtime "^6.26.0" 321 | esutils "^2.0.2" 322 | lodash "^4.17.4" 323 | to-fast-properties "^1.0.3" 324 | 325 | babylon@^6.18.0: 326 | version "6.18.0" 327 | resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" 328 | 329 | balanced-match@^1.0.0: 330 | version "1.0.0" 331 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 332 | 333 | bcrypt-pbkdf@^1.0.0: 334 | version "1.0.1" 335 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 336 | dependencies: 337 | tweetnacl "^0.14.3" 338 | 339 | body-parser@1.17.2: 340 | version "1.17.2" 341 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.2.tgz#f8892abc8f9e627d42aedafbca66bf5ab99104ee" 342 | dependencies: 343 | bytes "2.4.0" 344 | content-type "~1.0.2" 345 | debug "2.6.7" 346 | depd "~1.1.0" 347 | http-errors "~1.6.1" 348 | iconv-lite "0.4.15" 349 | on-finished "~2.3.0" 350 | qs "6.4.0" 351 | raw-body "~2.2.0" 352 | type-is "~1.6.15" 353 | 354 | body-parser@1.18.2: 355 | version "1.18.2" 356 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" 357 | dependencies: 358 | bytes "3.0.0" 359 | content-type "~1.0.4" 360 | debug "2.6.9" 361 | depd "~1.1.1" 362 | http-errors "~1.6.2" 363 | iconv-lite "0.4.19" 364 | on-finished "~2.3.0" 365 | qs "6.5.1" 366 | raw-body "2.3.2" 367 | type-is "~1.6.15" 368 | 369 | boom@4.x.x: 370 | version "4.3.1" 371 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" 372 | dependencies: 373 | hoek "4.x.x" 374 | 375 | boom@5.x.x: 376 | version "5.2.0" 377 | resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" 378 | dependencies: 379 | hoek "4.x.x" 380 | 381 | brace-expansion@^1.1.7: 382 | version "1.1.8" 383 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 384 | dependencies: 385 | balanced-match "^1.0.0" 386 | concat-map "0.0.1" 387 | 388 | braces@^1.8.2: 389 | version "1.8.5" 390 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 391 | dependencies: 392 | expand-range "^1.8.1" 393 | preserve "^0.2.0" 394 | repeat-element "^1.1.2" 395 | 396 | browser-resolve@^1.11.2: 397 | version "1.11.2" 398 | resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" 399 | dependencies: 400 | resolve "1.1.7" 401 | 402 | bser@1.0.2: 403 | version "1.0.2" 404 | resolved "https://registry.yarnpkg.com/bser/-/bser-1.0.2.tgz#381116970b2a6deea5646dd15dd7278444b56169" 405 | dependencies: 406 | node-int64 "^0.4.0" 407 | 408 | bser@^2.0.0: 409 | version "2.0.0" 410 | resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" 411 | dependencies: 412 | node-int64 "^0.4.0" 413 | 414 | builtin-modules@^1.0.0: 415 | version "1.1.1" 416 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 417 | 418 | busboy@^0.2.11: 419 | version "0.2.14" 420 | resolved "https://registry.yarnpkg.com/busboy/-/busboy-0.2.14.tgz#6c2a622efcf47c57bbbe1e2a9c37ad36c7925453" 421 | dependencies: 422 | dicer "0.2.5" 423 | readable-stream "1.1.x" 424 | 425 | bytes@2.4.0: 426 | version "2.4.0" 427 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" 428 | 429 | bytes@3.0.0: 430 | version "3.0.0" 431 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 432 | 433 | callsites@^2.0.0: 434 | version "2.0.0" 435 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" 436 | 437 | camelcase@^3.0.0: 438 | version "3.0.0" 439 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 440 | 441 | camelcase@^4.1.0: 442 | version "4.1.0" 443 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 444 | 445 | caseless@~0.12.0: 446 | version "0.12.0" 447 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 448 | 449 | chalk@^1.1.3: 450 | version "1.1.3" 451 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 452 | dependencies: 453 | ansi-styles "^2.2.1" 454 | escape-string-regexp "^1.0.2" 455 | has-ansi "^2.0.0" 456 | strip-ansi "^3.0.0" 457 | supports-color "^2.0.0" 458 | 459 | chalk@^2.0.0: 460 | version "2.3.0" 461 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 462 | dependencies: 463 | ansi-styles "^3.1.0" 464 | escape-string-regexp "^1.0.5" 465 | supports-color "^4.0.0" 466 | 467 | ci-info@^1.0.0: 468 | version "1.1.2" 469 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" 470 | 471 | class-transformer@0.1.8, class-transformer@^0.1.7: 472 | version "0.1.8" 473 | resolved "https://registry.yarnpkg.com/class-transformer/-/class-transformer-0.1.8.tgz#be04dd2afb7b301e4c8c79c5349fedaac3d5a7e1" 474 | 475 | class-validator@0.8.1: 476 | version "0.8.1" 477 | resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.8.1.tgz#f5efd5c613927e3c2f68692e8f14d53a2644fb2f" 478 | dependencies: 479 | validator "9.2.0" 480 | 481 | class-validator@^0.7.2: 482 | version "0.7.3" 483 | resolved "https://registry.yarnpkg.com/class-validator/-/class-validator-0.7.3.tgz#3c2821b8cf35fd8d5f4fcb8063bc57fb50049e7e" 484 | dependencies: 485 | validator "^7.0.0" 486 | 487 | cli-color@1.1.0: 488 | version "1.1.0" 489 | resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.1.0.tgz#de188cdc4929d83b67aea04110fbed40fdbf6775" 490 | dependencies: 491 | ansi-regex "2" 492 | d "^0.1.1" 493 | es5-ext "^0.10.8" 494 | es6-iterator "2" 495 | memoizee "^0.3.9" 496 | timers-ext "0.1" 497 | 498 | cliui@^3.2.0: 499 | version "3.2.0" 500 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 501 | dependencies: 502 | string-width "^1.0.1" 503 | strip-ansi "^3.0.1" 504 | wrap-ansi "^2.0.0" 505 | 506 | co@^4.6.0: 507 | version "4.6.0" 508 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 509 | 510 | code-point-at@^1.0.0: 511 | version "1.1.0" 512 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 513 | 514 | color-convert@^1.9.0: 515 | version "1.9.1" 516 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 517 | dependencies: 518 | color-name "^1.1.1" 519 | 520 | color-name@^1.1.1: 521 | version "1.1.3" 522 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 523 | 524 | combined-stream@^1.0.5, combined-stream@~1.0.5: 525 | version "1.0.5" 526 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 527 | dependencies: 528 | delayed-stream "~1.0.0" 529 | 530 | commander@~2.20.0: 531 | version "2.20.0" 532 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" 533 | 534 | component-emitter@^1.2.0: 535 | version "1.2.1" 536 | resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" 537 | 538 | concat-map@0.0.1: 539 | version "0.0.1" 540 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 541 | 542 | concat-stream@^1.5.0: 543 | version "1.6.0" 544 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 545 | dependencies: 546 | inherits "^2.0.3" 547 | readable-stream "^2.2.2" 548 | typedarray "^0.0.6" 549 | 550 | content-disposition@0.5.2: 551 | version "0.5.2" 552 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 553 | 554 | content-type-parser@^1.0.1: 555 | version "1.0.2" 556 | resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" 557 | 558 | content-type@~1.0.2, content-type@~1.0.4: 559 | version "1.0.4" 560 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 561 | 562 | convert-source-map@^1.4.0, convert-source-map@^1.5.0: 563 | version "1.5.1" 564 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" 565 | 566 | cookie-signature@1.0.6: 567 | version "1.0.6" 568 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 569 | 570 | cookie@0.3.1: 571 | version "0.3.1" 572 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 573 | 574 | cookiejar@^2.1.0: 575 | version "2.1.1" 576 | resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.1.tgz#41ad57b1b555951ec171412a81942b1e8200d34a" 577 | 578 | core-js@^2.4.0, core-js@^2.5.0: 579 | version "2.5.3" 580 | resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" 581 | 582 | core-util-is@1.0.2, core-util-is@~1.0.0: 583 | version "1.0.2" 584 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 585 | 586 | cors@2.8.4: 587 | version "2.8.4" 588 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.4.tgz#2bd381f2eb201020105cd50ea59da63090694686" 589 | dependencies: 590 | object-assign "^4" 591 | vary "^1" 592 | 593 | cross-spawn@^5.0.1: 594 | version "5.1.0" 595 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 596 | dependencies: 597 | lru-cache "^4.0.1" 598 | shebang-command "^1.2.0" 599 | which "^1.2.9" 600 | 601 | cryptiles@3.x.x: 602 | version "3.1.2" 603 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" 604 | dependencies: 605 | boom "5.x.x" 606 | 607 | cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": 608 | version "0.3.2" 609 | resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" 610 | 611 | "cssstyle@>= 0.2.37 < 0.3.0": 612 | version "0.2.37" 613 | resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" 614 | dependencies: 615 | cssom "0.3.x" 616 | 617 | d@1: 618 | version "1.0.0" 619 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 620 | dependencies: 621 | es5-ext "^0.10.9" 622 | 623 | d@^0.1.1, d@~0.1.1: 624 | version "0.1.1" 625 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 626 | dependencies: 627 | es5-ext "~0.10.2" 628 | 629 | dashdash@^1.12.0: 630 | version "1.14.1" 631 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 632 | dependencies: 633 | assert-plus "^1.0.0" 634 | 635 | debug@2.6.7: 636 | version "2.6.7" 637 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" 638 | dependencies: 639 | ms "2.0.0" 640 | 641 | debug@2.6.9, debug@^2.6.8: 642 | version "2.6.9" 643 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 644 | dependencies: 645 | ms "2.0.0" 646 | 647 | debug@^3.1.0: 648 | version "3.1.0" 649 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 650 | dependencies: 651 | ms "2.0.0" 652 | 653 | decamelize@^1.1.1: 654 | version "1.2.0" 655 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 656 | 657 | deep-is@~0.1.3: 658 | version "0.1.3" 659 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 660 | 661 | default-require-extensions@^1.0.0: 662 | version "1.0.0" 663 | resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" 664 | dependencies: 665 | strip-bom "^2.0.0" 666 | 667 | delayed-stream@~1.0.0: 668 | version "1.0.0" 669 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 670 | 671 | depd@1.1.1: 672 | version "1.1.1" 673 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 674 | 675 | depd@~1.1.0, depd@~1.1.1: 676 | version "1.1.2" 677 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 678 | 679 | destroy@~1.0.4: 680 | version "1.0.4" 681 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 682 | 683 | detect-indent@^4.0.0: 684 | version "4.0.0" 685 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" 686 | dependencies: 687 | repeating "^2.0.0" 688 | 689 | dicer@0.2.5: 690 | version "0.2.5" 691 | resolved "https://registry.yarnpkg.com/dicer/-/dicer-0.2.5.tgz#5996c086bb33218c812c090bddc09cd12facb70f" 692 | dependencies: 693 | readable-stream "1.1.x" 694 | streamsearch "0.1.2" 695 | 696 | diff@^3.1.0, diff@^3.2.0: 697 | version "3.4.0" 698 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" 699 | 700 | ecc-jsbn@~0.1.1: 701 | version "0.1.1" 702 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 703 | dependencies: 704 | jsbn "~0.1.0" 705 | 706 | ee-first@1.1.1: 707 | version "1.1.1" 708 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 709 | 710 | encodeurl@~1.0.1: 711 | version "1.0.2" 712 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 713 | 714 | errno@^0.1.4: 715 | version "0.1.6" 716 | resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.6.tgz#c386ce8a6283f14fc09563b71560908c9bf53026" 717 | dependencies: 718 | prr "~1.0.1" 719 | 720 | error-ex@^1.2.0: 721 | version "1.3.1" 722 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 723 | dependencies: 724 | is-arrayish "^0.2.1" 725 | 726 | es5-ext@^0.10.35, es5-ext@^0.10.8, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.5, es5-ext@~0.10.6: 727 | version "0.10.38" 728 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3" 729 | dependencies: 730 | es6-iterator "~2.0.3" 731 | es6-symbol "~3.1.1" 732 | 733 | es6-iterator@2, es6-iterator@~2.0.3: 734 | version "2.0.3" 735 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" 736 | dependencies: 737 | d "1" 738 | es5-ext "^0.10.35" 739 | es6-symbol "^3.1.1" 740 | 741 | es6-iterator@~0.1.3: 742 | version "0.1.3" 743 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-0.1.3.tgz#d6f58b8c4fc413c249b4baa19768f8e4d7c8944e" 744 | dependencies: 745 | d "~0.1.1" 746 | es5-ext "~0.10.5" 747 | es6-symbol "~2.0.1" 748 | 749 | es6-symbol@^3.1.1, es6-symbol@~3.1.1: 750 | version "3.1.1" 751 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" 752 | dependencies: 753 | d "1" 754 | es5-ext "~0.10.14" 755 | 756 | es6-symbol@~2.0.1: 757 | version "2.0.1" 758 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-2.0.1.tgz#761b5c67cfd4f1d18afb234f691d678682cb3bf3" 759 | dependencies: 760 | d "~0.1.1" 761 | es5-ext "~0.10.5" 762 | 763 | es6-weak-map@~0.1.4: 764 | version "0.1.4" 765 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-0.1.4.tgz#706cef9e99aa236ba7766c239c8b9e286ea7d228" 766 | dependencies: 767 | d "~0.1.1" 768 | es5-ext "~0.10.6" 769 | es6-iterator "~0.1.3" 770 | es6-symbol "~2.0.1" 771 | 772 | escape-html@~1.0.3: 773 | version "1.0.3" 774 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 775 | 776 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 777 | version "1.0.5" 778 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 779 | 780 | escodegen@^1.6.1: 781 | version "1.9.0" 782 | resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" 783 | dependencies: 784 | esprima "^3.1.3" 785 | estraverse "^4.2.0" 786 | esutils "^2.0.2" 787 | optionator "^0.8.1" 788 | optionalDependencies: 789 | source-map "~0.5.6" 790 | 791 | esprima@^3.1.3: 792 | version "3.1.3" 793 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 794 | 795 | esprima@^4.0.0: 796 | version "4.0.0" 797 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" 798 | 799 | estraverse@^4.2.0: 800 | version "4.2.0" 801 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 802 | 803 | esutils@^2.0.2: 804 | version "2.0.2" 805 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 806 | 807 | etag@~1.8.1: 808 | version "1.8.1" 809 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 810 | 811 | event-emitter@~0.3.4: 812 | version "0.3.5" 813 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" 814 | dependencies: 815 | d "1" 816 | es5-ext "~0.10.14" 817 | 818 | exec-sh@^0.2.0: 819 | version "0.2.1" 820 | resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" 821 | dependencies: 822 | merge "^1.1.3" 823 | 824 | execa@^0.7.0: 825 | version "0.7.0" 826 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 827 | dependencies: 828 | cross-spawn "^5.0.1" 829 | get-stream "^3.0.0" 830 | is-stream "^1.1.0" 831 | npm-run-path "^2.0.0" 832 | p-finally "^1.0.0" 833 | signal-exit "^3.0.0" 834 | strip-eof "^1.0.0" 835 | 836 | expand-brackets@^0.1.4: 837 | version "0.1.5" 838 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 839 | dependencies: 840 | is-posix-bracket "^0.1.0" 841 | 842 | expand-range@^1.8.1: 843 | version "1.8.2" 844 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 845 | dependencies: 846 | fill-range "^2.1.0" 847 | 848 | express@4.16.2: 849 | version "4.16.2" 850 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" 851 | dependencies: 852 | accepts "~1.3.4" 853 | array-flatten "1.1.1" 854 | body-parser "1.18.2" 855 | content-disposition "0.5.2" 856 | content-type "~1.0.4" 857 | cookie "0.3.1" 858 | cookie-signature "1.0.6" 859 | debug "2.6.9" 860 | depd "~1.1.1" 861 | encodeurl "~1.0.1" 862 | escape-html "~1.0.3" 863 | etag "~1.8.1" 864 | finalhandler "1.1.0" 865 | fresh "0.5.2" 866 | merge-descriptors "1.0.1" 867 | methods "~1.1.2" 868 | on-finished "~2.3.0" 869 | parseurl "~1.3.2" 870 | path-to-regexp "0.1.7" 871 | proxy-addr "~2.0.2" 872 | qs "6.5.1" 873 | range-parser "~1.2.0" 874 | safe-buffer "5.1.1" 875 | send "0.16.1" 876 | serve-static "1.13.1" 877 | setprototypeof "1.1.0" 878 | statuses "~1.3.1" 879 | type-is "~1.6.15" 880 | utils-merge "1.0.1" 881 | vary "~1.1.2" 882 | 883 | extend@^3.0.0, extend@~3.0.1: 884 | version "3.0.1" 885 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 886 | 887 | extglob@^0.3.1: 888 | version "0.3.2" 889 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 890 | dependencies: 891 | is-extglob "^1.0.0" 892 | 893 | extsprintf@1.3.0: 894 | version "1.3.0" 895 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 896 | 897 | extsprintf@^1.2.0: 898 | version "1.4.0" 899 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" 900 | 901 | fast-deep-equal@^1.0.0: 902 | version "1.0.0" 903 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" 904 | 905 | fast-json-stable-stringify@^2.0.0: 906 | version "2.0.0" 907 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 908 | 909 | fast-levenshtein@~2.0.4: 910 | version "2.0.6" 911 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 912 | 913 | fb-watchman@^1.8.0: 914 | version "1.9.2" 915 | resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-1.9.2.tgz#a24cf47827f82d38fb59a69ad70b76e3b6ae7383" 916 | dependencies: 917 | bser "1.0.2" 918 | 919 | fb-watchman@^2.0.0: 920 | version "2.0.0" 921 | resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" 922 | dependencies: 923 | bser "^2.0.0" 924 | 925 | filename-regex@^2.0.0: 926 | version "2.0.1" 927 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 928 | 929 | fileset@^2.0.2: 930 | version "2.0.3" 931 | resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" 932 | dependencies: 933 | glob "^7.0.3" 934 | minimatch "^3.0.3" 935 | 936 | fill-range@^2.1.0: 937 | version "2.2.3" 938 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 939 | dependencies: 940 | is-number "^2.1.0" 941 | isobject "^2.0.0" 942 | randomatic "^1.1.3" 943 | repeat-element "^1.1.2" 944 | repeat-string "^1.5.2" 945 | 946 | finalhandler@1.1.0: 947 | version "1.1.0" 948 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" 949 | dependencies: 950 | debug "2.6.9" 951 | encodeurl "~1.0.1" 952 | escape-html "~1.0.3" 953 | on-finished "~2.3.0" 954 | parseurl "~1.3.2" 955 | statuses "~1.3.1" 956 | unpipe "~1.0.0" 957 | 958 | find-up@^1.0.0: 959 | version "1.1.2" 960 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 961 | dependencies: 962 | path-exists "^2.0.0" 963 | pinkie-promise "^2.0.0" 964 | 965 | find-up@^2.0.0, find-up@^2.1.0: 966 | version "2.1.0" 967 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 968 | dependencies: 969 | locate-path "^2.0.0" 970 | 971 | follow-redirects@^1.2.5: 972 | version "1.4.1" 973 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.4.1.tgz#d8120f4518190f55aac65bb6fc7b85fcd666d6aa" 974 | dependencies: 975 | debug "^3.1.0" 976 | 977 | for-in@^1.0.1: 978 | version "1.0.2" 979 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 980 | 981 | for-own@^0.1.4: 982 | version "0.1.5" 983 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 984 | dependencies: 985 | for-in "^1.0.1" 986 | 987 | forever-agent@~0.6.1: 988 | version "0.6.1" 989 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 990 | 991 | form-data@^2.3.1, form-data@~2.3.1: 992 | version "2.3.1" 993 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" 994 | dependencies: 995 | asynckit "^0.4.0" 996 | combined-stream "^1.0.5" 997 | mime-types "^2.1.12" 998 | 999 | formidable@^1.1.1: 1000 | version "1.1.1" 1001 | resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.1.1.tgz#96b8886f7c3c3508b932d6bd70c4d3a88f35f1a9" 1002 | 1003 | forwarded@~0.1.2: 1004 | version "0.1.2" 1005 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 1006 | 1007 | fresh@0.5.2: 1008 | version "0.5.2" 1009 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1010 | 1011 | fs-extra@^4.0.0: 1012 | version "4.0.3" 1013 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" 1014 | dependencies: 1015 | graceful-fs "^4.1.2" 1016 | jsonfile "^4.0.0" 1017 | universalify "^0.1.0" 1018 | 1019 | fs.realpath@^1.0.0: 1020 | version "1.0.0" 1021 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1022 | 1023 | get-caller-file@^1.0.1: 1024 | version "1.0.2" 1025 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 1026 | 1027 | get-stream@^3.0.0: 1028 | version "3.0.0" 1029 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 1030 | 1031 | getpass@^0.1.1: 1032 | version "0.1.7" 1033 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 1034 | dependencies: 1035 | assert-plus "^1.0.0" 1036 | 1037 | glob-base@^0.3.0: 1038 | version "0.3.0" 1039 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 1040 | dependencies: 1041 | glob-parent "^2.0.0" 1042 | is-glob "^2.0.0" 1043 | 1044 | glob-parent@^2.0.0: 1045 | version "2.0.0" 1046 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 1047 | dependencies: 1048 | is-glob "^2.0.0" 1049 | 1050 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: 1051 | version "7.1.2" 1052 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 1053 | dependencies: 1054 | fs.realpath "^1.0.0" 1055 | inflight "^1.0.4" 1056 | inherits "2" 1057 | minimatch "^3.0.4" 1058 | once "^1.3.0" 1059 | path-is-absolute "^1.0.0" 1060 | 1061 | globals@^9.18.0: 1062 | version "9.18.0" 1063 | resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" 1064 | 1065 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 1066 | version "4.1.11" 1067 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 1068 | 1069 | growly@^1.3.0: 1070 | version "1.3.0" 1071 | resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" 1072 | 1073 | handlebars@^4.0.3: 1074 | version "4.1.2" 1075 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.1.2.tgz#b6b37c1ced0306b221e094fc7aca3ec23b131b67" 1076 | dependencies: 1077 | neo-async "^2.6.0" 1078 | optimist "^0.6.1" 1079 | source-map "^0.6.1" 1080 | optionalDependencies: 1081 | uglify-js "^3.1.4" 1082 | 1083 | har-schema@^2.0.0: 1084 | version "2.0.0" 1085 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" 1086 | 1087 | har-validator@~5.0.3: 1088 | version "5.0.3" 1089 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" 1090 | dependencies: 1091 | ajv "^5.1.0" 1092 | har-schema "^2.0.0" 1093 | 1094 | has-ansi@^2.0.0: 1095 | version "2.0.0" 1096 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 1097 | dependencies: 1098 | ansi-regex "^2.0.0" 1099 | 1100 | has-flag@^1.0.0: 1101 | version "1.0.0" 1102 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" 1103 | 1104 | has-flag@^2.0.0: 1105 | version "2.0.0" 1106 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 1107 | 1108 | hawk@~6.0.2: 1109 | version "6.0.2" 1110 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" 1111 | dependencies: 1112 | boom "4.x.x" 1113 | cryptiles "3.x.x" 1114 | hoek "4.x.x" 1115 | sntp "2.x.x" 1116 | 1117 | hoek@4.x.x: 1118 | version "4.2.0" 1119 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" 1120 | 1121 | home-or-tmp@^2.0.0: 1122 | version "2.0.0" 1123 | resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" 1124 | dependencies: 1125 | os-homedir "^1.0.0" 1126 | os-tmpdir "^1.0.1" 1127 | 1128 | homedir-polyfill@^1.0.1: 1129 | version "1.0.1" 1130 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" 1131 | dependencies: 1132 | parse-passwd "^1.0.0" 1133 | 1134 | hosted-git-info@^2.1.4: 1135 | version "2.5.0" 1136 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" 1137 | 1138 | html-encoding-sniffer@^1.0.1: 1139 | version "1.0.2" 1140 | resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" 1141 | dependencies: 1142 | whatwg-encoding "^1.0.1" 1143 | 1144 | http-errors@1.6.2, http-errors@~1.6.1, http-errors@~1.6.2: 1145 | version "1.6.2" 1146 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 1147 | dependencies: 1148 | depd "1.1.1" 1149 | inherits "2.0.3" 1150 | setprototypeof "1.0.3" 1151 | statuses ">= 1.3.1 < 2" 1152 | 1153 | http-signature@~1.2.0: 1154 | version "1.2.0" 1155 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" 1156 | dependencies: 1157 | assert-plus "^1.0.0" 1158 | jsprim "^1.2.2" 1159 | sshpk "^1.7.0" 1160 | 1161 | iconv-lite@0.4.15: 1162 | version "0.4.15" 1163 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" 1164 | 1165 | iconv-lite@0.4.19: 1166 | version "0.4.19" 1167 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 1168 | 1169 | inflight@^1.0.4: 1170 | version "1.0.6" 1171 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1172 | dependencies: 1173 | once "^1.3.0" 1174 | wrappy "1" 1175 | 1176 | inherits@2, inherits@2.0.3, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: 1177 | version "2.0.3" 1178 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 1179 | 1180 | invariant@^2.2.2: 1181 | version "2.2.2" 1182 | resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" 1183 | dependencies: 1184 | loose-envify "^1.0.0" 1185 | 1186 | invert-kv@^1.0.0: 1187 | version "1.0.0" 1188 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 1189 | 1190 | ipaddr.js@1.5.2: 1191 | version "1.5.2" 1192 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" 1193 | 1194 | is-arrayish@^0.2.1: 1195 | version "0.2.1" 1196 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 1197 | 1198 | is-buffer@^1.1.5: 1199 | version "1.1.6" 1200 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 1201 | 1202 | is-builtin-module@^1.0.0: 1203 | version "1.0.0" 1204 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 1205 | dependencies: 1206 | builtin-modules "^1.0.0" 1207 | 1208 | is-ci@^1.0.10: 1209 | version "1.1.0" 1210 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" 1211 | dependencies: 1212 | ci-info "^1.0.0" 1213 | 1214 | is-dotfile@^1.0.0: 1215 | version "1.0.3" 1216 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 1217 | 1218 | is-equal-shallow@^0.1.3: 1219 | version "0.1.3" 1220 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 1221 | dependencies: 1222 | is-primitive "^2.0.0" 1223 | 1224 | is-extendable@^0.1.1: 1225 | version "0.1.1" 1226 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 1227 | 1228 | is-extglob@^1.0.0: 1229 | version "1.0.0" 1230 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 1231 | 1232 | is-finite@^1.0.0: 1233 | version "1.0.2" 1234 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 1235 | dependencies: 1236 | number-is-nan "^1.0.0" 1237 | 1238 | is-fullwidth-code-point@^1.0.0: 1239 | version "1.0.0" 1240 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 1241 | dependencies: 1242 | number-is-nan "^1.0.0" 1243 | 1244 | is-fullwidth-code-point@^2.0.0: 1245 | version "2.0.0" 1246 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 1247 | 1248 | is-glob@^2.0.0, is-glob@^2.0.1: 1249 | version "2.0.1" 1250 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 1251 | dependencies: 1252 | is-extglob "^1.0.0" 1253 | 1254 | is-number@^2.1.0: 1255 | version "2.1.0" 1256 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 1257 | dependencies: 1258 | kind-of "^3.0.2" 1259 | 1260 | is-number@^3.0.0: 1261 | version "3.0.0" 1262 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 1263 | dependencies: 1264 | kind-of "^3.0.2" 1265 | 1266 | is-posix-bracket@^0.1.0: 1267 | version "0.1.1" 1268 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 1269 | 1270 | is-primitive@^2.0.0: 1271 | version "2.0.0" 1272 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 1273 | 1274 | is-stream@^1.1.0: 1275 | version "1.1.0" 1276 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 1277 | 1278 | is-typedarray@~1.0.0: 1279 | version "1.0.0" 1280 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1281 | 1282 | is-utf8@^0.2.0: 1283 | version "0.2.1" 1284 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1285 | 1286 | isarray@0.0.1: 1287 | version "0.0.1" 1288 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 1289 | 1290 | isarray@1.0.0, isarray@~1.0.0: 1291 | version "1.0.0" 1292 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1293 | 1294 | isexe@^2.0.0: 1295 | version "2.0.0" 1296 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1297 | 1298 | isobject@^2.0.0: 1299 | version "2.1.0" 1300 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1301 | dependencies: 1302 | isarray "1.0.0" 1303 | 1304 | isstream@~0.1.2: 1305 | version "0.1.2" 1306 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1307 | 1308 | istanbul-api@^1.1.1: 1309 | version "1.2.1" 1310 | resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" 1311 | dependencies: 1312 | async "^2.1.4" 1313 | fileset "^2.0.2" 1314 | istanbul-lib-coverage "^1.1.1" 1315 | istanbul-lib-hook "^1.1.0" 1316 | istanbul-lib-instrument "^1.9.1" 1317 | istanbul-lib-report "^1.1.2" 1318 | istanbul-lib-source-maps "^1.2.2" 1319 | istanbul-reports "^1.1.3" 1320 | js-yaml "^3.7.0" 1321 | mkdirp "^0.5.1" 1322 | once "^1.4.0" 1323 | 1324 | istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.1: 1325 | version "1.1.1" 1326 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" 1327 | 1328 | istanbul-lib-hook@^1.1.0: 1329 | version "1.1.0" 1330 | resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" 1331 | dependencies: 1332 | append-transform "^0.4.0" 1333 | 1334 | istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: 1335 | version "1.9.1" 1336 | resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" 1337 | dependencies: 1338 | babel-generator "^6.18.0" 1339 | babel-template "^6.16.0" 1340 | babel-traverse "^6.18.0" 1341 | babel-types "^6.18.0" 1342 | babylon "^6.18.0" 1343 | istanbul-lib-coverage "^1.1.1" 1344 | semver "^5.3.0" 1345 | 1346 | istanbul-lib-report@^1.1.2: 1347 | version "1.1.2" 1348 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" 1349 | dependencies: 1350 | istanbul-lib-coverage "^1.1.1" 1351 | mkdirp "^0.5.1" 1352 | path-parse "^1.0.5" 1353 | supports-color "^3.1.2" 1354 | 1355 | istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.2: 1356 | version "1.2.2" 1357 | resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" 1358 | dependencies: 1359 | debug "^3.1.0" 1360 | istanbul-lib-coverage "^1.1.1" 1361 | mkdirp "^0.5.1" 1362 | rimraf "^2.6.1" 1363 | source-map "^0.5.3" 1364 | 1365 | istanbul-reports@^1.1.3: 1366 | version "1.1.3" 1367 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" 1368 | dependencies: 1369 | handlebars "^4.0.3" 1370 | 1371 | iterare@0.0.8: 1372 | version "0.0.8" 1373 | resolved "https://registry.yarnpkg.com/iterare/-/iterare-0.0.8.tgz#a969a80a1fbff6b78f28776594d7bc2bdfab6aad" 1374 | 1375 | jest-changed-files@^20.0.3: 1376 | version "20.0.3" 1377 | resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8" 1378 | 1379 | jest-cli@^20.0.4: 1380 | version "20.0.4" 1381 | resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.4.tgz#e532b19d88ae5bc6c417e8b0593a6fe954b1dc93" 1382 | dependencies: 1383 | ansi-escapes "^1.4.0" 1384 | callsites "^2.0.0" 1385 | chalk "^1.1.3" 1386 | graceful-fs "^4.1.11" 1387 | is-ci "^1.0.10" 1388 | istanbul-api "^1.1.1" 1389 | istanbul-lib-coverage "^1.0.1" 1390 | istanbul-lib-instrument "^1.4.2" 1391 | istanbul-lib-source-maps "^1.1.0" 1392 | jest-changed-files "^20.0.3" 1393 | jest-config "^20.0.4" 1394 | jest-docblock "^20.0.3" 1395 | jest-environment-jsdom "^20.0.3" 1396 | jest-haste-map "^20.0.4" 1397 | jest-jasmine2 "^20.0.4" 1398 | jest-message-util "^20.0.3" 1399 | jest-regex-util "^20.0.3" 1400 | jest-resolve-dependencies "^20.0.3" 1401 | jest-runtime "^20.0.4" 1402 | jest-snapshot "^20.0.3" 1403 | jest-util "^20.0.3" 1404 | micromatch "^2.3.11" 1405 | node-notifier "^5.0.2" 1406 | pify "^2.3.0" 1407 | slash "^1.0.0" 1408 | string-length "^1.0.1" 1409 | throat "^3.0.0" 1410 | which "^1.2.12" 1411 | worker-farm "^1.3.1" 1412 | yargs "^7.0.2" 1413 | 1414 | jest-config@^20.0.0, jest-config@^20.0.4: 1415 | version "20.0.4" 1416 | resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea" 1417 | dependencies: 1418 | chalk "^1.1.3" 1419 | glob "^7.1.1" 1420 | jest-environment-jsdom "^20.0.3" 1421 | jest-environment-node "^20.0.3" 1422 | jest-jasmine2 "^20.0.4" 1423 | jest-matcher-utils "^20.0.3" 1424 | jest-regex-util "^20.0.3" 1425 | jest-resolve "^20.0.4" 1426 | jest-validate "^20.0.3" 1427 | pretty-format "^20.0.3" 1428 | 1429 | jest-diff@^20.0.3: 1430 | version "20.0.3" 1431 | resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617" 1432 | dependencies: 1433 | chalk "^1.1.3" 1434 | diff "^3.2.0" 1435 | jest-matcher-utils "^20.0.3" 1436 | pretty-format "^20.0.3" 1437 | 1438 | jest-docblock@^20.0.3: 1439 | version "20.0.3" 1440 | resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712" 1441 | 1442 | jest-environment-jsdom@^20.0.3: 1443 | version "20.0.3" 1444 | resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99" 1445 | dependencies: 1446 | jest-mock "^20.0.3" 1447 | jest-util "^20.0.3" 1448 | jsdom "^9.12.0" 1449 | 1450 | jest-environment-node@^20.0.3: 1451 | version "20.0.3" 1452 | resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403" 1453 | dependencies: 1454 | jest-mock "^20.0.3" 1455 | jest-util "^20.0.3" 1456 | 1457 | jest-haste-map@^20.0.4: 1458 | version "20.0.5" 1459 | resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.5.tgz#abad74efb1a005974a7b6517e11010709cab9112" 1460 | dependencies: 1461 | fb-watchman "^2.0.0" 1462 | graceful-fs "^4.1.11" 1463 | jest-docblock "^20.0.3" 1464 | micromatch "^2.3.11" 1465 | sane "~1.6.0" 1466 | worker-farm "^1.3.1" 1467 | 1468 | jest-jasmine2@^20.0.4: 1469 | version "20.0.4" 1470 | resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1" 1471 | dependencies: 1472 | chalk "^1.1.3" 1473 | graceful-fs "^4.1.11" 1474 | jest-diff "^20.0.3" 1475 | jest-matcher-utils "^20.0.3" 1476 | jest-matchers "^20.0.3" 1477 | jest-message-util "^20.0.3" 1478 | jest-snapshot "^20.0.3" 1479 | once "^1.4.0" 1480 | p-map "^1.1.1" 1481 | 1482 | jest-matcher-utils@^20.0.3: 1483 | version "20.0.3" 1484 | resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612" 1485 | dependencies: 1486 | chalk "^1.1.3" 1487 | pretty-format "^20.0.3" 1488 | 1489 | jest-matchers@^20.0.3: 1490 | version "20.0.3" 1491 | resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60" 1492 | dependencies: 1493 | jest-diff "^20.0.3" 1494 | jest-matcher-utils "^20.0.3" 1495 | jest-message-util "^20.0.3" 1496 | jest-regex-util "^20.0.3" 1497 | 1498 | jest-message-util@^20.0.3: 1499 | version "20.0.3" 1500 | resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c" 1501 | dependencies: 1502 | chalk "^1.1.3" 1503 | micromatch "^2.3.11" 1504 | slash "^1.0.0" 1505 | 1506 | jest-mock@^20.0.3: 1507 | version "20.0.3" 1508 | resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59" 1509 | 1510 | jest-regex-util@^20.0.3: 1511 | version "20.0.3" 1512 | resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762" 1513 | 1514 | jest-resolve-dependencies@^20.0.3: 1515 | version "20.0.3" 1516 | resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a" 1517 | dependencies: 1518 | jest-regex-util "^20.0.3" 1519 | 1520 | jest-resolve@^20.0.4: 1521 | version "20.0.4" 1522 | resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5" 1523 | dependencies: 1524 | browser-resolve "^1.11.2" 1525 | is-builtin-module "^1.0.0" 1526 | resolve "^1.3.2" 1527 | 1528 | jest-runtime@^20.0.4: 1529 | version "20.0.4" 1530 | resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8" 1531 | dependencies: 1532 | babel-core "^6.0.0" 1533 | babel-jest "^20.0.3" 1534 | babel-plugin-istanbul "^4.0.0" 1535 | chalk "^1.1.3" 1536 | convert-source-map "^1.4.0" 1537 | graceful-fs "^4.1.11" 1538 | jest-config "^20.0.4" 1539 | jest-haste-map "^20.0.4" 1540 | jest-regex-util "^20.0.3" 1541 | jest-resolve "^20.0.4" 1542 | jest-util "^20.0.3" 1543 | json-stable-stringify "^1.0.1" 1544 | micromatch "^2.3.11" 1545 | strip-bom "3.0.0" 1546 | yargs "^7.0.2" 1547 | 1548 | jest-snapshot@^20.0.3: 1549 | version "20.0.3" 1550 | resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566" 1551 | dependencies: 1552 | chalk "^1.1.3" 1553 | jest-diff "^20.0.3" 1554 | jest-matcher-utils "^20.0.3" 1555 | jest-util "^20.0.3" 1556 | natural-compare "^1.4.0" 1557 | pretty-format "^20.0.3" 1558 | 1559 | jest-util@^20.0.0, jest-util@^20.0.3: 1560 | version "20.0.3" 1561 | resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad" 1562 | dependencies: 1563 | chalk "^1.1.3" 1564 | graceful-fs "^4.1.11" 1565 | jest-message-util "^20.0.3" 1566 | jest-mock "^20.0.3" 1567 | jest-validate "^20.0.3" 1568 | leven "^2.1.0" 1569 | mkdirp "^0.5.1" 1570 | 1571 | jest-validate@^20.0.3: 1572 | version "20.0.3" 1573 | resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab" 1574 | dependencies: 1575 | chalk "^1.1.3" 1576 | jest-matcher-utils "^20.0.3" 1577 | leven "^2.1.0" 1578 | pretty-format "^20.0.3" 1579 | 1580 | jest@^20.0.4: 1581 | version "20.0.4" 1582 | resolved "https://registry.yarnpkg.com/jest/-/jest-20.0.4.tgz#3dd260c2989d6dad678b1e9cc4d91944f6d602ac" 1583 | dependencies: 1584 | jest-cli "^20.0.4" 1585 | 1586 | js-tokens@^3.0.0, js-tokens@^3.0.2: 1587 | version "3.0.2" 1588 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 1589 | 1590 | js-yaml@^3.7.0: 1591 | version "3.10.0" 1592 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" 1593 | dependencies: 1594 | argparse "^1.0.7" 1595 | esprima "^4.0.0" 1596 | 1597 | jsbn@~0.1.0: 1598 | version "0.1.1" 1599 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1600 | 1601 | jsdom@^9.12.0: 1602 | version "9.12.0" 1603 | resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" 1604 | dependencies: 1605 | abab "^1.0.3" 1606 | acorn "^4.0.4" 1607 | acorn-globals "^3.1.0" 1608 | array-equal "^1.0.0" 1609 | content-type-parser "^1.0.1" 1610 | cssom ">= 0.3.2 < 0.4.0" 1611 | cssstyle ">= 0.2.37 < 0.3.0" 1612 | escodegen "^1.6.1" 1613 | html-encoding-sniffer "^1.0.1" 1614 | nwmatcher ">= 1.3.9 < 2.0.0" 1615 | parse5 "^1.5.1" 1616 | request "^2.79.0" 1617 | sax "^1.2.1" 1618 | symbol-tree "^3.2.1" 1619 | tough-cookie "^2.3.2" 1620 | webidl-conversions "^4.0.0" 1621 | whatwg-encoding "^1.0.1" 1622 | whatwg-url "^4.3.0" 1623 | xml-name-validator "^2.0.1" 1624 | 1625 | jsesc@^1.3.0: 1626 | version "1.3.0" 1627 | resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" 1628 | 1629 | json-schema-traverse@^0.3.0: 1630 | version "0.3.1" 1631 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" 1632 | 1633 | json-schema@0.2.3: 1634 | version "0.2.3" 1635 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1636 | 1637 | json-stable-stringify@^1.0.1: 1638 | version "1.0.1" 1639 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1640 | dependencies: 1641 | jsonify "~0.0.0" 1642 | 1643 | json-stringify-safe@~5.0.1: 1644 | version "5.0.1" 1645 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1646 | 1647 | json5@^0.5.1: 1648 | version "0.5.1" 1649 | resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 1650 | 1651 | jsonfile@^4.0.0: 1652 | version "4.0.0" 1653 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 1654 | optionalDependencies: 1655 | graceful-fs "^4.1.6" 1656 | 1657 | jsonify@~0.0.0: 1658 | version "0.0.0" 1659 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1660 | 1661 | jsprim@^1.2.2: 1662 | version "1.4.1" 1663 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1664 | dependencies: 1665 | assert-plus "1.0.0" 1666 | extsprintf "1.3.0" 1667 | json-schema "0.2.3" 1668 | verror "1.10.0" 1669 | 1670 | kind-of@^3.0.2: 1671 | version "3.2.2" 1672 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1673 | dependencies: 1674 | is-buffer "^1.1.5" 1675 | 1676 | kind-of@^4.0.0: 1677 | version "4.0.0" 1678 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1679 | dependencies: 1680 | is-buffer "^1.1.5" 1681 | 1682 | lcid@^1.0.0: 1683 | version "1.0.0" 1684 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1685 | dependencies: 1686 | invert-kv "^1.0.0" 1687 | 1688 | leven@^2.1.0: 1689 | version "2.1.0" 1690 | resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 1691 | 1692 | levn@~0.3.0: 1693 | version "0.3.0" 1694 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 1695 | dependencies: 1696 | prelude-ls "~1.1.2" 1697 | type-check "~0.3.2" 1698 | 1699 | load-json-file@^1.0.0: 1700 | version "1.1.0" 1701 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1702 | dependencies: 1703 | graceful-fs "^4.1.2" 1704 | parse-json "^2.2.0" 1705 | pify "^2.0.0" 1706 | pinkie-promise "^2.0.0" 1707 | strip-bom "^2.0.0" 1708 | 1709 | load-json-file@^2.0.0: 1710 | version "2.0.0" 1711 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1712 | dependencies: 1713 | graceful-fs "^4.1.2" 1714 | parse-json "^2.2.0" 1715 | pify "^2.0.0" 1716 | strip-bom "^3.0.0" 1717 | 1718 | locate-path@^2.0.0: 1719 | version "2.0.0" 1720 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1721 | dependencies: 1722 | p-locate "^2.0.0" 1723 | path-exists "^3.0.0" 1724 | 1725 | lodash@^4.14.0, lodash@^4.17.4: 1726 | version "4.17.4" 1727 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1728 | 1729 | loose-envify@^1.0.0: 1730 | version "1.3.1" 1731 | resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" 1732 | dependencies: 1733 | js-tokens "^3.0.0" 1734 | 1735 | lru-cache@^4.0.1: 1736 | version "4.1.1" 1737 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 1738 | dependencies: 1739 | pseudomap "^1.0.2" 1740 | yallist "^2.1.2" 1741 | 1742 | lru-queue@0.1: 1743 | version "0.1.0" 1744 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 1745 | dependencies: 1746 | es5-ext "~0.10.2" 1747 | 1748 | make-error@^1.1.1: 1749 | version "1.3.2" 1750 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.2.tgz#8762ffad2444dd8ff1f7c819629fa28e24fea1c4" 1751 | 1752 | makeerror@1.0.x: 1753 | version "1.0.11" 1754 | resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" 1755 | dependencies: 1756 | tmpl "1.0.x" 1757 | 1758 | media-typer@0.3.0: 1759 | version "0.3.0" 1760 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1761 | 1762 | mem@^1.1.0: 1763 | version "1.1.0" 1764 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 1765 | dependencies: 1766 | mimic-fn "^1.0.0" 1767 | 1768 | memoizee@^0.3.9: 1769 | version "0.3.10" 1770 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.3.10.tgz#4eca0d8aed39ec9d017f4c5c2f2f6432f42e5c8f" 1771 | dependencies: 1772 | d "~0.1.1" 1773 | es5-ext "~0.10.11" 1774 | es6-weak-map "~0.1.4" 1775 | event-emitter "~0.3.4" 1776 | lru-queue "0.1" 1777 | next-tick "~0.2.2" 1778 | timers-ext "0.1" 1779 | 1780 | merge-descriptors@1.0.1: 1781 | version "1.0.1" 1782 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1783 | 1784 | merge@^1.1.3: 1785 | version "1.2.0" 1786 | resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" 1787 | 1788 | methods@^1.1.1, methods@~1.1.2: 1789 | version "1.1.2" 1790 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1791 | 1792 | micromatch@^2.1.5, micromatch@^2.3.11: 1793 | version "2.3.11" 1794 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1795 | dependencies: 1796 | arr-diff "^2.0.0" 1797 | array-unique "^0.2.1" 1798 | braces "^1.8.2" 1799 | expand-brackets "^0.1.4" 1800 | extglob "^0.3.1" 1801 | filename-regex "^2.0.0" 1802 | is-extglob "^1.0.0" 1803 | is-glob "^2.0.1" 1804 | kind-of "^3.0.2" 1805 | normalize-path "^2.0.1" 1806 | object.omit "^2.0.0" 1807 | parse-glob "^3.0.4" 1808 | regex-cache "^0.4.2" 1809 | 1810 | mime-db@~1.30.0: 1811 | version "1.30.0" 1812 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 1813 | 1814 | mime-db@~1.33.0: 1815 | version "1.33.0" 1816 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" 1817 | 1818 | mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17: 1819 | version "2.1.17" 1820 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 1821 | dependencies: 1822 | mime-db "~1.30.0" 1823 | 1824 | mime-types@~2.1.18: 1825 | version "2.1.18" 1826 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" 1827 | dependencies: 1828 | mime-db "~1.33.0" 1829 | 1830 | mime@1.4.1: 1831 | version "1.4.1" 1832 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 1833 | 1834 | mime@^1.4.1: 1835 | version "1.6.0" 1836 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1837 | 1838 | mimic-fn@^1.0.0: 1839 | version "1.1.0" 1840 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 1841 | 1842 | minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: 1843 | version "3.0.4" 1844 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1845 | dependencies: 1846 | brace-expansion "^1.1.7" 1847 | 1848 | minimist@0.0.8: 1849 | version "0.0.8" 1850 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1851 | 1852 | minimist@^1.1.1, minimist@^1.2.0: 1853 | version "1.2.0" 1854 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1855 | 1856 | minimist@~0.0.1: 1857 | version "0.0.10" 1858 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1859 | 1860 | mkdirp@^0.5.1: 1861 | version "0.5.1" 1862 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1863 | dependencies: 1864 | minimist "0.0.8" 1865 | 1866 | ms@2.0.0: 1867 | version "2.0.0" 1868 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1869 | 1870 | multer@1.3.0: 1871 | version "1.3.0" 1872 | resolved "https://registry.yarnpkg.com/multer/-/multer-1.3.0.tgz#092b2670f6846fa4914965efc8cf94c20fec6cd2" 1873 | dependencies: 1874 | append-field "^0.1.0" 1875 | busboy "^0.2.11" 1876 | concat-stream "^1.5.0" 1877 | mkdirp "^0.5.1" 1878 | object-assign "^3.0.0" 1879 | on-finished "^2.3.0" 1880 | type-is "^1.6.4" 1881 | xtend "^4.0.0" 1882 | 1883 | natural-compare@^1.4.0: 1884 | version "1.4.0" 1885 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1886 | 1887 | negotiator@0.6.1: 1888 | version "0.6.1" 1889 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1890 | 1891 | neo-async@^2.6.0: 1892 | version "2.6.1" 1893 | resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" 1894 | 1895 | nest-router@^1.0.5: 1896 | version "1.0.5" 1897 | resolved "https://registry.yarnpkg.com/nest-router/-/nest-router-1.0.5.tgz#d5e57d1a8266143f4b63850b80b2167c1d874668" 1898 | dependencies: 1899 | lodash "^4.17.4" 1900 | 1901 | next-tick@1: 1902 | version "1.0.0" 1903 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1904 | 1905 | next-tick@~0.2.2: 1906 | version "0.2.2" 1907 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" 1908 | 1909 | node-int64@^0.4.0: 1910 | version "0.4.0" 1911 | resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" 1912 | 1913 | node-notifier@^5.0.2: 1914 | version "5.2.1" 1915 | resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" 1916 | dependencies: 1917 | growly "^1.3.0" 1918 | semver "^5.4.1" 1919 | shellwords "^0.1.1" 1920 | which "^1.3.0" 1921 | 1922 | normalize-package-data@^2.3.2: 1923 | version "2.4.0" 1924 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" 1925 | dependencies: 1926 | hosted-git-info "^2.1.4" 1927 | is-builtin-module "^1.0.0" 1928 | semver "2 || 3 || 4 || 5" 1929 | validate-npm-package-license "^3.0.1" 1930 | 1931 | normalize-path@^2.0.0, normalize-path@^2.0.1: 1932 | version "2.1.1" 1933 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1934 | dependencies: 1935 | remove-trailing-separator "^1.0.1" 1936 | 1937 | npm-run-path@^2.0.0: 1938 | version "2.0.2" 1939 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1940 | dependencies: 1941 | path-key "^2.0.0" 1942 | 1943 | number-is-nan@^1.0.0: 1944 | version "1.0.1" 1945 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1946 | 1947 | "nwmatcher@>= 1.3.9 < 2.0.0": 1948 | version "1.4.3" 1949 | resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" 1950 | 1951 | oauth-sign@~0.8.2: 1952 | version "0.8.2" 1953 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1954 | 1955 | object-assign@^3.0.0: 1956 | version "3.0.0" 1957 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" 1958 | 1959 | object-assign@^4, object-assign@^4.1.0: 1960 | version "4.1.1" 1961 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1962 | 1963 | object.omit@^2.0.0: 1964 | version "2.0.1" 1965 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1966 | dependencies: 1967 | for-own "^0.1.4" 1968 | is-extendable "^0.1.1" 1969 | 1970 | on-finished@^2.3.0, on-finished@~2.3.0: 1971 | version "2.3.0" 1972 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1973 | dependencies: 1974 | ee-first "1.1.1" 1975 | 1976 | once@^1.3.0, once@^1.4.0: 1977 | version "1.4.0" 1978 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1979 | dependencies: 1980 | wrappy "1" 1981 | 1982 | optimist@^0.6.1: 1983 | version "0.6.1" 1984 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1985 | dependencies: 1986 | minimist "~0.0.1" 1987 | wordwrap "~0.0.2" 1988 | 1989 | optional@0.1.4: 1990 | version "0.1.4" 1991 | resolved "https://registry.yarnpkg.com/optional/-/optional-0.1.4.tgz#cdb1a9bedc737d2025f690ceeb50e049444fd5b3" 1992 | 1993 | optionator@^0.8.1: 1994 | version "0.8.2" 1995 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 1996 | dependencies: 1997 | deep-is "~0.1.3" 1998 | fast-levenshtein "~2.0.4" 1999 | levn "~0.3.0" 2000 | prelude-ls "~1.1.2" 2001 | type-check "~0.3.2" 2002 | wordwrap "~1.0.0" 2003 | 2004 | os-homedir@^1.0.0: 2005 | version "1.0.2" 2006 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 2007 | 2008 | os-locale@^1.4.0: 2009 | version "1.4.0" 2010 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 2011 | dependencies: 2012 | lcid "^1.0.0" 2013 | 2014 | os-locale@^2.0.0: 2015 | version "2.1.0" 2016 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" 2017 | dependencies: 2018 | execa "^0.7.0" 2019 | lcid "^1.0.0" 2020 | mem "^1.1.0" 2021 | 2022 | os-tmpdir@^1.0.1: 2023 | version "1.0.2" 2024 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 2025 | 2026 | p-finally@^1.0.0: 2027 | version "1.0.0" 2028 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 2029 | 2030 | p-limit@^1.1.0: 2031 | version "1.2.0" 2032 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" 2033 | dependencies: 2034 | p-try "^1.0.0" 2035 | 2036 | p-locate@^2.0.0: 2037 | version "2.0.0" 2038 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 2039 | dependencies: 2040 | p-limit "^1.1.0" 2041 | 2042 | p-map@^1.1.1: 2043 | version "1.2.0" 2044 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" 2045 | 2046 | p-try@^1.0.0: 2047 | version "1.0.0" 2048 | resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" 2049 | 2050 | parse-glob@^3.0.4: 2051 | version "3.0.4" 2052 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 2053 | dependencies: 2054 | glob-base "^0.3.0" 2055 | is-dotfile "^1.0.0" 2056 | is-extglob "^1.0.0" 2057 | is-glob "^2.0.0" 2058 | 2059 | parse-json@^2.2.0: 2060 | version "2.2.0" 2061 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 2062 | dependencies: 2063 | error-ex "^1.2.0" 2064 | 2065 | parse-passwd@^1.0.0: 2066 | version "1.0.0" 2067 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 2068 | 2069 | parse5@^1.5.1: 2070 | version "1.5.1" 2071 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" 2072 | 2073 | parseurl@~1.3.2: 2074 | version "1.3.2" 2075 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 2076 | 2077 | path-exists@^2.0.0: 2078 | version "2.1.0" 2079 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 2080 | dependencies: 2081 | pinkie-promise "^2.0.0" 2082 | 2083 | path-exists@^3.0.0: 2084 | version "3.0.0" 2085 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 2086 | 2087 | path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: 2088 | version "1.0.1" 2089 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 2090 | 2091 | path-key@^2.0.0: 2092 | version "2.0.1" 2093 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 2094 | 2095 | path-parse@^1.0.5: 2096 | version "1.0.5" 2097 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 2098 | 2099 | path-to-regexp@0.1.7: 2100 | version "0.1.7" 2101 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 2102 | 2103 | path-type@^1.0.0: 2104 | version "1.1.0" 2105 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 2106 | dependencies: 2107 | graceful-fs "^4.1.2" 2108 | pify "^2.0.0" 2109 | pinkie-promise "^2.0.0" 2110 | 2111 | path-type@^2.0.0: 2112 | version "2.0.0" 2113 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 2114 | dependencies: 2115 | pify "^2.0.0" 2116 | 2117 | performance-now@^2.1.0: 2118 | version "2.1.0" 2119 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" 2120 | 2121 | pify@^2.0.0, pify@^2.3.0: 2122 | version "2.3.0" 2123 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 2124 | 2125 | pinkie-promise@^2.0.0: 2126 | version "2.0.1" 2127 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 2128 | dependencies: 2129 | pinkie "^2.0.0" 2130 | 2131 | pinkie@^2.0.0: 2132 | version "2.0.4" 2133 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 2134 | 2135 | pkg-dir@^2.0.0: 2136 | version "2.0.0" 2137 | resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 2138 | dependencies: 2139 | find-up "^2.1.0" 2140 | 2141 | prelude-ls@~1.1.2: 2142 | version "1.1.2" 2143 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 2144 | 2145 | preserve@^0.2.0: 2146 | version "0.2.0" 2147 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 2148 | 2149 | pretty-format@^20.0.3: 2150 | version "20.0.3" 2151 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14" 2152 | dependencies: 2153 | ansi-regex "^2.1.1" 2154 | ansi-styles "^3.0.0" 2155 | 2156 | private@^0.1.7: 2157 | version "0.1.8" 2158 | resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" 2159 | 2160 | process-nextick-args@~1.0.6: 2161 | version "1.0.7" 2162 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 2163 | 2164 | process-nextick-args@~2.0.0: 2165 | version "2.0.0" 2166 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" 2167 | 2168 | proxy-addr@~2.0.2: 2169 | version "2.0.2" 2170 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" 2171 | dependencies: 2172 | forwarded "~0.1.2" 2173 | ipaddr.js "1.5.2" 2174 | 2175 | prr@~1.0.1: 2176 | version "1.0.1" 2177 | resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" 2178 | 2179 | pseudomap@^1.0.2: 2180 | version "1.0.2" 2181 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 2182 | 2183 | punycode@^1.4.1: 2184 | version "1.4.1" 2185 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 2186 | 2187 | qs@6.4.0: 2188 | version "6.4.0" 2189 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 2190 | 2191 | qs@6.5.1, qs@^6.5.1, qs@~6.5.1: 2192 | version "6.5.1" 2193 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 2194 | 2195 | randomatic@^1.1.3: 2196 | version "1.1.7" 2197 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 2198 | dependencies: 2199 | is-number "^3.0.0" 2200 | kind-of "^4.0.0" 2201 | 2202 | range-parser@~1.2.0: 2203 | version "1.2.0" 2204 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 2205 | 2206 | raw-body@2.3.2: 2207 | version "2.3.2" 2208 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" 2209 | dependencies: 2210 | bytes "3.0.0" 2211 | http-errors "1.6.2" 2212 | iconv-lite "0.4.19" 2213 | unpipe "1.0.0" 2214 | 2215 | raw-body@~2.2.0: 2216 | version "2.2.0" 2217 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" 2218 | dependencies: 2219 | bytes "2.4.0" 2220 | iconv-lite "0.4.15" 2221 | unpipe "1.0.0" 2222 | 2223 | read-pkg-up@^1.0.1: 2224 | version "1.0.1" 2225 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 2226 | dependencies: 2227 | find-up "^1.0.0" 2228 | read-pkg "^1.0.0" 2229 | 2230 | read-pkg-up@^2.0.0: 2231 | version "2.0.0" 2232 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 2233 | dependencies: 2234 | find-up "^2.0.0" 2235 | read-pkg "^2.0.0" 2236 | 2237 | read-pkg@^1.0.0: 2238 | version "1.1.0" 2239 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 2240 | dependencies: 2241 | load-json-file "^1.0.0" 2242 | normalize-package-data "^2.3.2" 2243 | path-type "^1.0.0" 2244 | 2245 | read-pkg@^2.0.0: 2246 | version "2.0.0" 2247 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 2248 | dependencies: 2249 | load-json-file "^2.0.0" 2250 | normalize-package-data "^2.3.2" 2251 | path-type "^2.0.0" 2252 | 2253 | readable-stream@1.1.x: 2254 | version "1.1.14" 2255 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" 2256 | dependencies: 2257 | core-util-is "~1.0.0" 2258 | inherits "~2.0.1" 2259 | isarray "0.0.1" 2260 | string_decoder "~0.10.x" 2261 | 2262 | readable-stream@^2.0.5: 2263 | version "2.3.3" 2264 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 2265 | dependencies: 2266 | core-util-is "~1.0.0" 2267 | inherits "~2.0.3" 2268 | isarray "~1.0.0" 2269 | process-nextick-args "~1.0.6" 2270 | safe-buffer "~5.1.1" 2271 | string_decoder "~1.0.3" 2272 | util-deprecate "~1.0.1" 2273 | 2274 | readable-stream@^2.2.2: 2275 | version "2.3.4" 2276 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" 2277 | dependencies: 2278 | core-util-is "~1.0.0" 2279 | inherits "~2.0.3" 2280 | isarray "~1.0.0" 2281 | process-nextick-args "~2.0.0" 2282 | safe-buffer "~5.1.1" 2283 | string_decoder "~1.0.3" 2284 | util-deprecate "~1.0.1" 2285 | 2286 | reflect-metadata@^0.1.10: 2287 | version "0.1.12" 2288 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" 2289 | 2290 | regenerator-runtime@^0.11.0: 2291 | version "0.11.1" 2292 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" 2293 | 2294 | regex-cache@^0.4.2: 2295 | version "0.4.4" 2296 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 2297 | dependencies: 2298 | is-equal-shallow "^0.1.3" 2299 | 2300 | remove-trailing-separator@^1.0.1: 2301 | version "1.1.0" 2302 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 2303 | 2304 | repeat-element@^1.1.2: 2305 | version "1.1.2" 2306 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 2307 | 2308 | repeat-string@^1.5.2: 2309 | version "1.6.1" 2310 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 2311 | 2312 | repeating@^2.0.0: 2313 | version "2.0.1" 2314 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 2315 | dependencies: 2316 | is-finite "^1.0.0" 2317 | 2318 | request@^2.79.0: 2319 | version "2.83.0" 2320 | resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" 2321 | dependencies: 2322 | aws-sign2 "~0.7.0" 2323 | aws4 "^1.6.0" 2324 | caseless "~0.12.0" 2325 | combined-stream "~1.0.5" 2326 | extend "~3.0.1" 2327 | forever-agent "~0.6.1" 2328 | form-data "~2.3.1" 2329 | har-validator "~5.0.3" 2330 | hawk "~6.0.2" 2331 | http-signature "~1.2.0" 2332 | is-typedarray "~1.0.0" 2333 | isstream "~0.1.2" 2334 | json-stringify-safe "~5.0.1" 2335 | mime-types "~2.1.17" 2336 | oauth-sign "~0.8.2" 2337 | performance-now "^2.1.0" 2338 | qs "~6.5.1" 2339 | safe-buffer "^5.1.1" 2340 | stringstream "~0.0.5" 2341 | tough-cookie "~2.3.3" 2342 | tunnel-agent "^0.6.0" 2343 | uuid "^3.1.0" 2344 | 2345 | require-directory@^2.1.1: 2346 | version "2.1.1" 2347 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 2348 | 2349 | require-main-filename@^1.0.1: 2350 | version "1.0.1" 2351 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 2352 | 2353 | resolve@1.1.7: 2354 | version "1.1.7" 2355 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 2356 | 2357 | resolve@^1.3.2: 2358 | version "1.5.0" 2359 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 2360 | dependencies: 2361 | path-parse "^1.0.5" 2362 | 2363 | rimraf@^2.6.1: 2364 | version "2.6.2" 2365 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 2366 | dependencies: 2367 | glob "^7.0.5" 2368 | 2369 | rxjs@^5.4.3: 2370 | version "5.5.6" 2371 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" 2372 | dependencies: 2373 | symbol-observable "1.0.1" 2374 | 2375 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 2376 | version "5.1.1" 2377 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 2378 | 2379 | sane@~1.6.0: 2380 | version "1.6.0" 2381 | resolved "https://registry.yarnpkg.com/sane/-/sane-1.6.0.tgz#9610c452307a135d29c1fdfe2547034180c46775" 2382 | dependencies: 2383 | anymatch "^1.3.0" 2384 | exec-sh "^0.2.0" 2385 | fb-watchman "^1.8.0" 2386 | minimatch "^3.0.2" 2387 | minimist "^1.1.1" 2388 | walker "~1.0.5" 2389 | watch "~0.10.0" 2390 | 2391 | sax@^1.2.1: 2392 | version "1.2.4" 2393 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 2394 | 2395 | "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: 2396 | version "5.5.0" 2397 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" 2398 | 2399 | send@0.16.1: 2400 | version "0.16.1" 2401 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" 2402 | dependencies: 2403 | debug "2.6.9" 2404 | depd "~1.1.1" 2405 | destroy "~1.0.4" 2406 | encodeurl "~1.0.1" 2407 | escape-html "~1.0.3" 2408 | etag "~1.8.1" 2409 | fresh "0.5.2" 2410 | http-errors "~1.6.2" 2411 | mime "1.4.1" 2412 | ms "2.0.0" 2413 | on-finished "~2.3.0" 2414 | range-parser "~1.2.0" 2415 | statuses "~1.3.1" 2416 | 2417 | serve-static@1.13.1: 2418 | version "1.13.1" 2419 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" 2420 | dependencies: 2421 | encodeurl "~1.0.1" 2422 | escape-html "~1.0.3" 2423 | parseurl "~1.3.2" 2424 | send "0.16.1" 2425 | 2426 | set-blocking@^2.0.0: 2427 | version "2.0.0" 2428 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 2429 | 2430 | setprototypeof@1.0.3: 2431 | version "1.0.3" 2432 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 2433 | 2434 | setprototypeof@1.1.0: 2435 | version "1.1.0" 2436 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 2437 | 2438 | shebang-command@^1.2.0: 2439 | version "1.2.0" 2440 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 2441 | dependencies: 2442 | shebang-regex "^1.0.0" 2443 | 2444 | shebang-regex@^1.0.0: 2445 | version "1.0.0" 2446 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 2447 | 2448 | shellwords@^0.1.1: 2449 | version "0.1.1" 2450 | resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" 2451 | 2452 | signal-exit@^3.0.0: 2453 | version "3.0.2" 2454 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 2455 | 2456 | slash@^1.0.0: 2457 | version "1.0.0" 2458 | resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" 2459 | 2460 | sntp@2.x.x: 2461 | version "2.1.0" 2462 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" 2463 | dependencies: 2464 | hoek "4.x.x" 2465 | 2466 | source-map-support@^0.4.0, source-map-support@^0.4.15, source-map-support@^0.4.4: 2467 | version "0.4.18" 2468 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 2469 | dependencies: 2470 | source-map "^0.5.6" 2471 | 2472 | source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.6: 2473 | version "0.5.7" 2474 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 2475 | 2476 | source-map@^0.6.1, source-map@~0.6.1: 2477 | version "0.6.1" 2478 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 2479 | 2480 | spdx-correct@~1.0.0: 2481 | version "1.0.2" 2482 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 2483 | dependencies: 2484 | spdx-license-ids "^1.0.2" 2485 | 2486 | spdx-expression-parse@~1.0.0: 2487 | version "1.0.4" 2488 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 2489 | 2490 | spdx-license-ids@^1.0.2: 2491 | version "1.2.2" 2492 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 2493 | 2494 | sprintf-js@~1.0.2: 2495 | version "1.0.3" 2496 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 2497 | 2498 | sshpk@^1.7.0: 2499 | version "1.13.1" 2500 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 2501 | dependencies: 2502 | asn1 "~0.2.3" 2503 | assert-plus "^1.0.0" 2504 | dashdash "^1.12.0" 2505 | getpass "^0.1.1" 2506 | optionalDependencies: 2507 | bcrypt-pbkdf "^1.0.0" 2508 | ecc-jsbn "~0.1.1" 2509 | jsbn "~0.1.0" 2510 | tweetnacl "~0.14.0" 2511 | 2512 | "statuses@>= 1.3.1 < 2": 2513 | version "1.4.0" 2514 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 2515 | 2516 | statuses@~1.3.1: 2517 | version "1.3.1" 2518 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 2519 | 2520 | streamsearch@0.1.2: 2521 | version "0.1.2" 2522 | resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-0.1.2.tgz#808b9d0e56fc273d809ba57338e929919a1a9f1a" 2523 | 2524 | string-length@^1.0.1: 2525 | version "1.0.1" 2526 | resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" 2527 | dependencies: 2528 | strip-ansi "^3.0.0" 2529 | 2530 | string-width@^1.0.1, string-width@^1.0.2: 2531 | version "1.0.2" 2532 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 2533 | dependencies: 2534 | code-point-at "^1.0.0" 2535 | is-fullwidth-code-point "^1.0.0" 2536 | strip-ansi "^3.0.0" 2537 | 2538 | string-width@^2.0.0: 2539 | version "2.1.1" 2540 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 2541 | dependencies: 2542 | is-fullwidth-code-point "^2.0.0" 2543 | strip-ansi "^4.0.0" 2544 | 2545 | string_decoder@~0.10.x: 2546 | version "0.10.31" 2547 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 2548 | 2549 | string_decoder@~1.0.3: 2550 | version "1.0.3" 2551 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 2552 | dependencies: 2553 | safe-buffer "~5.1.0" 2554 | 2555 | stringstream@~0.0.5: 2556 | version "0.0.5" 2557 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 2558 | 2559 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 2560 | version "3.0.1" 2561 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 2562 | dependencies: 2563 | ansi-regex "^2.0.0" 2564 | 2565 | strip-ansi@^4.0.0: 2566 | version "4.0.0" 2567 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 2568 | dependencies: 2569 | ansi-regex "^3.0.0" 2570 | 2571 | strip-bom@3.0.0, strip-bom@^3.0.0: 2572 | version "3.0.0" 2573 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 2574 | 2575 | strip-bom@^2.0.0: 2576 | version "2.0.0" 2577 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 2578 | dependencies: 2579 | is-utf8 "^0.2.0" 2580 | 2581 | strip-eof@^1.0.0: 2582 | version "1.0.0" 2583 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 2584 | 2585 | strip-json-comments@^2.0.0: 2586 | version "2.0.1" 2587 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 2588 | 2589 | superagent@^3.0.0: 2590 | version "3.8.2" 2591 | resolved "https://registry.yarnpkg.com/superagent/-/superagent-3.8.2.tgz#e4a11b9d047f7d3efeb3bbe536d9ec0021d16403" 2592 | dependencies: 2593 | component-emitter "^1.2.0" 2594 | cookiejar "^2.1.0" 2595 | debug "^3.1.0" 2596 | extend "^3.0.0" 2597 | form-data "^2.3.1" 2598 | formidable "^1.1.1" 2599 | methods "^1.1.1" 2600 | mime "^1.4.1" 2601 | qs "^6.5.1" 2602 | readable-stream "^2.0.5" 2603 | 2604 | supertest@^3.0.0: 2605 | version "3.0.0" 2606 | resolved "https://registry.yarnpkg.com/supertest/-/supertest-3.0.0.tgz#8d4bb68fd1830ee07033b1c5a5a9a4021c965296" 2607 | dependencies: 2608 | methods "~1.1.2" 2609 | superagent "^3.0.0" 2610 | 2611 | supports-color@^2.0.0: 2612 | version "2.0.0" 2613 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 2614 | 2615 | supports-color@^3.1.2: 2616 | version "3.2.3" 2617 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 2618 | dependencies: 2619 | has-flag "^1.0.0" 2620 | 2621 | supports-color@^4.0.0: 2622 | version "4.5.0" 2623 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 2624 | dependencies: 2625 | has-flag "^2.0.0" 2626 | 2627 | symbol-observable@1.0.1: 2628 | version "1.0.1" 2629 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" 2630 | 2631 | symbol-tree@^3.2.1: 2632 | version "3.2.2" 2633 | resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" 2634 | 2635 | test-exclude@^4.1.1: 2636 | version "4.1.1" 2637 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" 2638 | dependencies: 2639 | arrify "^1.0.1" 2640 | micromatch "^2.3.11" 2641 | object-assign "^4.1.0" 2642 | read-pkg-up "^1.0.1" 2643 | require-main-filename "^1.0.1" 2644 | 2645 | throat@^3.0.0: 2646 | version "3.2.0" 2647 | resolved "https://registry.yarnpkg.com/throat/-/throat-3.2.0.tgz#50cb0670edbc40237b9e347d7e1f88e4620af836" 2648 | 2649 | timers-ext@0.1: 2650 | version "0.1.2" 2651 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.2.tgz#61cc47a76c1abd3195f14527f978d58ae94c5204" 2652 | dependencies: 2653 | es5-ext "~0.10.14" 2654 | next-tick "1" 2655 | 2656 | tmpl@1.0.x: 2657 | version "1.0.4" 2658 | resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" 2659 | 2660 | to-fast-properties@^1.0.3: 2661 | version "1.0.3" 2662 | resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" 2663 | 2664 | tough-cookie@^2.3.2, tough-cookie@~2.3.3: 2665 | version "2.3.3" 2666 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 2667 | dependencies: 2668 | punycode "^1.4.1" 2669 | 2670 | tr46@~0.0.3: 2671 | version "0.0.3" 2672 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 2673 | 2674 | trim-right@^1.0.1: 2675 | version "1.0.1" 2676 | resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" 2677 | 2678 | ts-jest@^20.0.14: 2679 | version "20.0.14" 2680 | resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-20.0.14.tgz#9e82130cea6b6df718b2c2b6055452af46bb248d" 2681 | dependencies: 2682 | babel-core "^6.24.1" 2683 | babel-plugin-istanbul "^4.1.4" 2684 | babel-plugin-transform-es2015-modules-commonjs "^6.24.1" 2685 | babel-preset-jest "^20.0.3" 2686 | fs-extra "^4.0.0" 2687 | jest-config "^20.0.0" 2688 | jest-util "^20.0.0" 2689 | pkg-dir "^2.0.0" 2690 | source-map-support "^0.4.4" 2691 | yargs "^8.0.1" 2692 | 2693 | ts-node@^3.3.0: 2694 | version "3.3.0" 2695 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-3.3.0.tgz#c13c6a3024e30be1180dd53038fc209289d4bf69" 2696 | dependencies: 2697 | arrify "^1.0.0" 2698 | chalk "^2.0.0" 2699 | diff "^3.1.0" 2700 | make-error "^1.1.1" 2701 | minimist "^1.2.0" 2702 | mkdirp "^0.5.1" 2703 | source-map-support "^0.4.0" 2704 | tsconfig "^6.0.0" 2705 | v8flags "^3.0.0" 2706 | yn "^2.0.0" 2707 | 2708 | tsconfig@^6.0.0: 2709 | version "6.0.0" 2710 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-6.0.0.tgz#6b0e8376003d7af1864f8df8f89dd0059ffcd032" 2711 | dependencies: 2712 | strip-bom "^3.0.0" 2713 | strip-json-comments "^2.0.0" 2714 | 2715 | tunnel-agent@^0.6.0: 2716 | version "0.6.0" 2717 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2718 | dependencies: 2719 | safe-buffer "^5.0.1" 2720 | 2721 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2722 | version "0.14.5" 2723 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2724 | 2725 | type-check@~0.3.2: 2726 | version "0.3.2" 2727 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 2728 | dependencies: 2729 | prelude-ls "~1.1.2" 2730 | 2731 | type-is@^1.6.4: 2732 | version "1.6.16" 2733 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 2734 | dependencies: 2735 | media-typer "0.3.0" 2736 | mime-types "~2.1.18" 2737 | 2738 | type-is@~1.6.15: 2739 | version "1.6.15" 2740 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 2741 | dependencies: 2742 | media-typer "0.3.0" 2743 | mime-types "~2.1.15" 2744 | 2745 | typedarray@^0.0.6: 2746 | version "0.0.6" 2747 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 2748 | 2749 | typescript@^2.4.2: 2750 | version "2.6.2" 2751 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" 2752 | 2753 | uglify-js@^3.1.4: 2754 | version "3.6.0" 2755 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.6.0.tgz#704681345c53a8b2079fb6cec294b05ead242ff5" 2756 | dependencies: 2757 | commander "~2.20.0" 2758 | source-map "~0.6.1" 2759 | 2760 | universalify@^0.1.0: 2761 | version "0.1.1" 2762 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" 2763 | 2764 | unpipe@1.0.0, unpipe@~1.0.0: 2765 | version "1.0.0" 2766 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2767 | 2768 | util-deprecate@~1.0.1: 2769 | version "1.0.2" 2770 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2771 | 2772 | utils-merge@1.0.1: 2773 | version "1.0.1" 2774 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2775 | 2776 | uuid@^3.1.0: 2777 | version "3.2.1" 2778 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" 2779 | 2780 | v8flags@^3.0.0: 2781 | version "3.0.1" 2782 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.0.1.tgz#dce8fc379c17d9f2c9e9ed78d89ce00052b1b76b" 2783 | dependencies: 2784 | homedir-polyfill "^1.0.1" 2785 | 2786 | validate-npm-package-license@^3.0.1: 2787 | version "3.0.1" 2788 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 2789 | dependencies: 2790 | spdx-correct "~1.0.0" 2791 | spdx-expression-parse "~1.0.0" 2792 | 2793 | validator@9.2.0: 2794 | version "9.2.0" 2795 | resolved "https://registry.yarnpkg.com/validator/-/validator-9.2.0.tgz#ad216eed5f37cac31a6fe00ceab1f6b88bded03e" 2796 | 2797 | validator@^7.0.0: 2798 | version "7.2.0" 2799 | resolved "https://registry.yarnpkg.com/validator/-/validator-7.2.0.tgz#a63dcbaba51d4350bf8df20988e0d5a54d711791" 2800 | 2801 | vary@^1, vary@~1.1.2: 2802 | version "1.1.2" 2803 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2804 | 2805 | verror@1.10.0: 2806 | version "1.10.0" 2807 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2808 | dependencies: 2809 | assert-plus "^1.0.0" 2810 | core-util-is "1.0.2" 2811 | extsprintf "^1.2.0" 2812 | 2813 | walker@~1.0.5: 2814 | version "1.0.7" 2815 | resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" 2816 | dependencies: 2817 | makeerror "1.0.x" 2818 | 2819 | watch@~0.10.0: 2820 | version "0.10.0" 2821 | resolved "https://registry.yarnpkg.com/watch/-/watch-0.10.0.tgz#77798b2da0f9910d595f1ace5b0c2258521f21dc" 2822 | 2823 | webidl-conversions@^3.0.0: 2824 | version "3.0.1" 2825 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 2826 | 2827 | webidl-conversions@^4.0.0: 2828 | version "4.0.2" 2829 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" 2830 | 2831 | whatwg-encoding@^1.0.1: 2832 | version "1.0.3" 2833 | resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" 2834 | dependencies: 2835 | iconv-lite "0.4.19" 2836 | 2837 | whatwg-url@^4.3.0: 2838 | version "4.8.0" 2839 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" 2840 | dependencies: 2841 | tr46 "~0.0.3" 2842 | webidl-conversions "^3.0.0" 2843 | 2844 | which-module@^1.0.0: 2845 | version "1.0.0" 2846 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 2847 | 2848 | which-module@^2.0.0: 2849 | version "2.0.0" 2850 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 2851 | 2852 | which@^1.2.12, which@^1.2.9, which@^1.3.0: 2853 | version "1.3.0" 2854 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2855 | dependencies: 2856 | isexe "^2.0.0" 2857 | 2858 | wordwrap@~0.0.2: 2859 | version "0.0.3" 2860 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2861 | 2862 | wordwrap@~1.0.0: 2863 | version "1.0.0" 2864 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 2865 | 2866 | worker-farm@^1.3.1: 2867 | version "1.5.2" 2868 | resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.5.2.tgz#32b312e5dc3d5d45d79ef44acc2587491cd729ae" 2869 | dependencies: 2870 | errno "^0.1.4" 2871 | xtend "^4.0.1" 2872 | 2873 | wrap-ansi@^2.0.0: 2874 | version "2.1.0" 2875 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 2876 | dependencies: 2877 | string-width "^1.0.1" 2878 | strip-ansi "^3.0.1" 2879 | 2880 | wrappy@1: 2881 | version "1.0.2" 2882 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2883 | 2884 | xml-name-validator@^2.0.1: 2885 | version "2.0.1" 2886 | resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" 2887 | 2888 | xtend@^4.0.0, xtend@^4.0.1: 2889 | version "4.0.1" 2890 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2891 | 2892 | y18n@^3.2.1: 2893 | version "3.2.1" 2894 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2895 | 2896 | yallist@^2.1.2: 2897 | version "2.1.2" 2898 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2899 | 2900 | yargs-parser@^5.0.0: 2901 | version "5.0.0" 2902 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" 2903 | dependencies: 2904 | camelcase "^3.0.0" 2905 | 2906 | yargs-parser@^7.0.0: 2907 | version "7.0.0" 2908 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" 2909 | dependencies: 2910 | camelcase "^4.1.0" 2911 | 2912 | yargs@^7.0.2: 2913 | version "7.1.0" 2914 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" 2915 | dependencies: 2916 | camelcase "^3.0.0" 2917 | cliui "^3.2.0" 2918 | decamelize "^1.1.1" 2919 | get-caller-file "^1.0.1" 2920 | os-locale "^1.4.0" 2921 | read-pkg-up "^1.0.1" 2922 | require-directory "^2.1.1" 2923 | require-main-filename "^1.0.1" 2924 | set-blocking "^2.0.0" 2925 | string-width "^1.0.2" 2926 | which-module "^1.0.0" 2927 | y18n "^3.2.1" 2928 | yargs-parser "^5.0.0" 2929 | 2930 | yargs@^8.0.1: 2931 | version "8.0.2" 2932 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" 2933 | dependencies: 2934 | camelcase "^4.1.0" 2935 | cliui "^3.2.0" 2936 | decamelize "^1.1.1" 2937 | get-caller-file "^1.0.1" 2938 | os-locale "^2.0.0" 2939 | read-pkg-up "^2.0.0" 2940 | require-directory "^2.1.1" 2941 | require-main-filename "^1.0.1" 2942 | set-blocking "^2.0.0" 2943 | string-width "^2.0.0" 2944 | which-module "^2.0.0" 2945 | y18n "^3.2.1" 2946 | yargs-parser "^7.0.0" 2947 | 2948 | yn@^2.0.0: 2949 | version "2.0.0" 2950 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 2951 | --------------------------------------------------------------------------------