├── README.md ├── app ├── __tests__ │ ├── index.d.ts │ └── user │ │ ├── UserStore.spec.ts │ │ ├── UserView.spec.tsx │ │ └── __snapshots__ │ │ └── UserView.spec.tsx.snap ├── index.d.ts ├── package.json ├── preprocessor.js ├── src │ ├── index.html │ ├── scripts │ │ ├── App.tsx │ │ ├── app │ │ │ ├── Config.ts │ │ │ ├── DIContext.ts │ │ │ └── Rest.ts │ │ ├── index.tsx │ │ ├── route │ │ │ ├── Menu.tsx │ │ │ └── RouteStore.ts │ │ ├── settigs │ │ │ └── SettingsView.tsx │ │ └── user │ │ │ ├── UserDetailsView.tsx │ │ │ ├── UserService.ts │ │ │ ├── UserStore.ts │ │ │ ├── UsersView.tsx │ │ │ └── model.ts │ └── styles │ │ └── styles.scss ├── tsconfig.json ├── tslint.json ├── webpack.commons.js ├── webpack.config.js └── webpack.production.config.js ├── backend-mock ├── db.json ├── package.json └── yarn.lock └── typescript-template.gif /README.md: -------------------------------------------------------------------------------- 1 | # Ready-to-use template for a TypeScript application. 2 | 3 | ![typescript-template](typescript-template.gif) 4 | 5 | This is an example of TypeScript application that uses: 6 | 7 | * TypeScript 8 | * React.js 9 | * React-router 10 | * MobX 11 | * Rx.js 12 | * Jest 13 | * webpack 1 14 | * tslint 15 | 16 | It can be used as a template for a new application. 17 | 18 | ## Requirements 19 | 20 | * node.js >=7 21 | 22 | ## How to start 23 | 24 | * Run fake backend 25 | 26 | ```$bash 27 | cd ./backend-mock 28 | npm install 29 | npm run serve 30 | ``` 31 | 32 | * Run the app 33 | 34 | ```$bash 35 | cd ./app 36 | npm install 37 | npm run dev 38 | ``` 39 | Open http://localhost:8888 in a web browser. 40 | 41 | ## How to test & lint 42 | 43 | ```$bash 44 | cd ./app 45 | npm run test 46 | npm run lint 47 | ``` 48 | 49 | ## How to build 50 | 51 | TODO 52 | 53 | ## License 54 | 55 | The MIT License (MIT) 56 | 57 | Copyright (c) 2017 Dmitry Fedosov 58 | 59 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated 60 | documentation files (the "Software"), to deal in the Software without restriction, including without limitation the 61 | rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit 62 | persons to whom the Software is furnished to do so, subject to the following conditions: 63 | 64 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the 65 | Software. 66 | 67 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE 68 | WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 69 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 70 | OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -------------------------------------------------------------------------------- /app/__tests__/index.d.ts: -------------------------------------------------------------------------------- 1 | /// -------------------------------------------------------------------------------- /app/__tests__/user/UserStore.spec.ts: -------------------------------------------------------------------------------- 1 | import {UserViewStore} from '../../src/scripts/user/UserStore'; 2 | import * as TypeMoq from "typemoq"; 3 | import {UserService} from '../../src/scripts/user/UserService'; 4 | import {diContext} from '../../src/scripts/app/DIContext'; 5 | import {Observable} from 'rx'; 6 | import {User} from '../../src/scripts/user/model'; 7 | 8 | it('UserViewStore should be filled with data', () => { 9 | const user: User = { 10 | id: 1, 11 | firstName: "test", 12 | lastName: "test" 13 | }; 14 | 15 | const userServiceMock = TypeMoq.Mock.ofType(UserService); 16 | userServiceMock.setup(x => x.getUsers()).returns(() => Observable.just([user])); 17 | 18 | diContext.userService = userServiceMock.object; 19 | const store = new UserViewStore(); 20 | 21 | expect(store.users.length).toEqual(1); 22 | expect(store.users[0].firstName).toEqual("test"); 23 | }); -------------------------------------------------------------------------------- /app/__tests__/user/UserView.spec.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {create} from 'react-test-renderer'; 3 | import {diContext} from '../../src/scripts/app/DIContext'; 4 | import {UsersView} from '../../src/scripts/user/UsersView'; 5 | import * as TypeMoq from 'typemoq'; 6 | import {UserStore, UserViewStore} from '../../src/scripts/user/UserStore'; 7 | import {User} from '../../src/scripts/user/model'; 8 | import {BrowserRouter as Router} from 'react-router-dom'; 9 | 10 | it('UsersView should render proper DOM', () => { 11 | const user1: User = { 12 | id: 1, 13 | firstName: "test", 14 | lastName: "test" 15 | }; 16 | const user2: User = { 17 | id: 2, 18 | firstName: "test2", 19 | lastName: "test2" 20 | }; 21 | 22 | const userStoreMock = TypeMoq.Mock.ofType(); 23 | const userViewStoreMock = TypeMoq.Mock.ofType(); 24 | userStoreMock.setup(x => x.createUserViewStore()).returns(() => userViewStoreMock.object); 25 | userViewStoreMock.setup(x => x.users).returns(() => [user1, user2]); 26 | 27 | diContext.userStore = userStoreMock.object; 28 | 29 | expect(create().toJSON()).toMatchSnapshot(); 30 | }); -------------------------------------------------------------------------------- /app/__tests__/user/__snapshots__/UserView.spec.tsx.snap: -------------------------------------------------------------------------------- 1 | exports[`test UsersView should render proper DOM 1`] = ` 2 |
3 | 5 | 6 | 7 | 10 | 13 | 15 | 16 | 17 | 18 | 21 | 24 | 34 | 35 | 36 | 39 | 42 | 52 | 53 | 54 |
8 | First Name 9 | 11 | Last Name 12 | 14 |
19 | test 20 | 22 | test 23 | 25 | 29 | 32 | 33 |
37 | test2 38 | 40 | test2 41 | 43 | 47 | 50 | 51 |
55 |
56 | `; 57 | -------------------------------------------------------------------------------- /app/index.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | declare const process: any; -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-react-template", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "build": "NODE_ENV=production webpack -p --config webpack.production.config.js --progress --profile --colors", 8 | "dev": "webpack-dev-server --progress --profile --colors --hot", 9 | "lint": "tslint \"src/**/*.ts*\"", 10 | "test": "jest" 11 | }, 12 | "dependencies": { 13 | "@types/history": "4.5.0", 14 | "@types/react": "15.0.18", 15 | "@types/react-bootstrap": "0.0.47", 16 | "@types/react-dom": "0.14.23", 17 | "@types/react-fontawesome": "1.5.0", 18 | "@types/react-router": "4.0.0", 19 | "@types/react-router-dom": "4.0.0", 20 | "@types/react-router-bootstrap": "0.23.02", 21 | "bootstrap": "3.3.7", 22 | "font-awesome": "4.7.0", 23 | "history": "4.5.1", 24 | "mobx": "3.1.7", 25 | "mobx-react": "4.1.3", 26 | "mobx-utils": "2.0.1", 27 | "react": "15.4.2", 28 | "react-bootstrap": "0.30.8", 29 | "react-dom": "15.4.2", 30 | "react-fontawesome": "1.5.0", 31 | "react-router": "4.0.0", 32 | "react-router-dom": "4.0.0", 33 | "react-router-bootstrap": "0.23.1", 34 | "rx": "4.1.0", 35 | "ts-option": "1.1.2", 36 | "ts-rx-rest": "0.7.0" 37 | }, 38 | "jest": { 39 | "transform": { 40 | ".(ts|tsx)": "/node_modules/ts-jest/preprocessor.js" 41 | }, 42 | "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$", 43 | "moduleFileExtensions": [ 44 | "ts", 45 | "tsx", 46 | "js" 47 | ] 48 | }, 49 | "devDependencies": { 50 | "@types/jest": "19.2.2", 51 | "clean-webpack-plugin": "0.1.16", 52 | "copy-webpack-plugin": "4.0.1", 53 | "css-loader": "0.27.3", 54 | "extract-text-webpack-plugin": "1.0.1", 55 | "file-loader": "0.10.1", 56 | "html-webpack-plugin": "2.28.0", 57 | "json-loader": "0.5.4", 58 | "jsx-loader": "0.13.2", 59 | "node-sass": "4.5.2", 60 | "react-hot-loader": "3.0.0-beta.5", 61 | "react-test-renderer": "15.4.2", 62 | "sass-loader": "4.1.1", 63 | "style-loader": "0.15.0", 64 | "ts-jest": "19.0.6", 65 | "ts-loader": "2.0.2", 66 | "tslint": "4.5.1", 67 | "tslint-loader": "3.4.3", 68 | "tslint-react": "2.5.0", 69 | "typemoq": "1.4.1", 70 | "typescript": "2.2.1", 71 | "typescript-require": "0.2.9", 72 | "typings": "2.1.0", 73 | "url-loader": "0.5.8", 74 | "webpack": "1.14.0", 75 | "webpack-dev-server": "1.16.2", 76 | "webpack-fail-plugin": "1.0.5", 77 | "webpack-merge": "2.4.0" 78 | }, 79 | "author": "dimafeng", 80 | "license": "MIT" 81 | } 82 | -------------------------------------------------------------------------------- /app/preprocessor.js: -------------------------------------------------------------------------------- 1 | const tsc = require('typescript'); 2 | 3 | module.exports = { 4 | process: function (src, path) { 5 | if (path.endsWith('.ts') || path.endsWith('.tsx')) { 6 | return tsc.transpile( 7 | src, 8 | { 9 | module: tsc.ModuleKind.CommonJS, 10 | jsx: tsc.JsxEmit.React 11 | }, 12 | path, 13 | [] 14 | ); 15 | } 16 | return src; 17 | }, 18 | }; -------------------------------------------------------------------------------- /app/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | App 7 | 8 | 9 |
10 | 11 | 12 | -------------------------------------------------------------------------------- /app/src/scripts/App.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {BrowserRouter as Router, Route, Switch, Redirect} from 'react-router-dom'; 3 | import {Provider} from 'mobx-react'; 4 | import {Menu} from './route/Menu'; 5 | import {RouteStore, USERS_MAPPING} from './route/RouteStore'; 6 | import '../styles/styles.scss'; 7 | import {diContext} from './app/DIContext'; 8 | import {UserService} from './user/UserService'; 9 | import {UserStore} from './user/UserStore'; 10 | 11 | export class App extends React.Component { 12 | 13 | constructor(props: any, context: any) { 14 | super(props, context); 15 | diContext.routeStore = new RouteStore(); 16 | diContext.userStore = new UserStore(); 17 | diContext.userService = new UserService(); 18 | } 19 | 20 | render() { 21 | return ( 22 | 23 | 24 | 25 | 26 | {diContext.routeStore.routes 27 | .map(r => )} 28 | 29 | 30 | 31 | 32 | 33 | 34 | ) 35 | } 36 | } 37 | 38 | export const Container = (props: {children?: any}) => 39 |
40 |
41 |
42 |
43 | App Name 44 |
45 |
46 |
47 | 48 |
49 |
50 | 51 | 54 |
55 | {props.children} 56 |
57 |
58 |
59 |
; 60 | 61 | export const NotFound = () =>
Page not found
; -------------------------------------------------------------------------------- /app/src/scripts/app/Config.ts: -------------------------------------------------------------------------------- 1 | export class Config { 2 | static BASE_URL = process.env.NODE_ENV === 'development' ? 'http://localhost:3004' : ''; 3 | } -------------------------------------------------------------------------------- /app/src/scripts/app/DIContext.ts: -------------------------------------------------------------------------------- 1 | export const diContext: any = {}; 2 | 3 | export function diInject(): any { 4 | return function (target: any, propertyKey: string) { 5 | Object.defineProperty(target, propertyKey, { 6 | get() { 7 | const bean = diContext[propertyKey]; 8 | if (bean) { 9 | return bean; 10 | } else if (process.env.NODE_ENV === 'development') { 11 | console.error(`Context has no bean with name ${propertyKey}. 12 | Available beans: ${Object.getOwnPropertyNames(diContext).join(', ')}`); 13 | } 14 | }, 15 | set() { 16 | throw new Error('Not allowed'); 17 | }, 18 | enumerable: true, 19 | configurable: true 20 | }); 21 | }; 22 | }; -------------------------------------------------------------------------------- /app/src/scripts/app/Rest.ts: -------------------------------------------------------------------------------- 1 | import RxRest, {jsonInterceptor, errorInterceptor} from 'ts-rx-rest'; 2 | 3 | export const Rest = new RxRest() 4 | .wrapRequest(r => { 5 | r.withCredentials = process.env.NODE_ENV === 'development'; 6 | return r; 7 | }) 8 | .wrap(errorInterceptor) 9 | .wrap(jsonInterceptor); -------------------------------------------------------------------------------- /app/src/scripts/index.tsx: -------------------------------------------------------------------------------- 1 | import '../../node_modules/bootstrap/dist/css/bootstrap.css'; 2 | import '../../node_modules/font-awesome/css/font-awesome.css'; 3 | import * as React from 'react'; 4 | import * as ReactDOM from 'react-dom'; 5 | import {App} from './App'; 6 | 7 | ReactDOM.render(, document.getElementById('root')); -------------------------------------------------------------------------------- /app/src/scripts/route/Menu.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {inject} from 'mobx-react'; 3 | import {RouteStore} from './RouteStore'; 4 | import {Link} from 'react-router-dom'; 5 | import FontAwesome = require('react-fontawesome'); 6 | 7 | interface Props { 8 | routeStore?: RouteStore; 9 | } 10 | 11 | @inject('routeStore') 12 | export class Menu extends React.Component { 13 | render() { 14 | return ( 15 | 24 | ); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/scripts/route/RouteStore.ts: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {SettingsView} from '../settigs/SettingsView'; 3 | import {UsersView} from '../user/UsersView'; 4 | import {UsersDetailsView} from '../user/UserDetailsView'; 5 | 6 | export const USERS_MAPPING = '/users'; 7 | export const USER_DETAILS_MAPPING = '/user/:userId'; 8 | 9 | export const linkToUserDetails = 10 | (userId: number) => USER_DETAILS_MAPPING.replace(':userId', userId.toString()); 11 | 12 | export class RouteStore { 13 | routes: Array = [ 14 | { 15 | title: 'Users', 16 | icon: 'users', 17 | mapping: USERS_MAPPING, 18 | component: UsersView 19 | }, 20 | { 21 | title: 'Settings', 22 | icon: 'cogs', 23 | mapping: '/settings', 24 | component: SettingsView 25 | }, 26 | { 27 | mapping: USER_DETAILS_MAPPING, 28 | component: UsersDetailsView 29 | } 30 | ]; 31 | } 32 | 33 | interface Route { 34 | title?: string; 35 | icon?: string; 36 | mapping: string; 37 | component: React.ReactType; 38 | } -------------------------------------------------------------------------------- /app/src/scripts/settigs/SettingsView.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | 3 | export const SettingsView = () =>

Settings

; -------------------------------------------------------------------------------- /app/src/scripts/user/UserDetailsView.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {observer} from 'mobx-react'; 3 | import {UserStore, UserDetailsViewStore} from './UserStore'; 4 | import {diInject} from '../app/DIContext'; 5 | 6 | interface Props { 7 | match: {params: Params}; 8 | } 9 | 10 | interface Params { 11 | userId: number; 12 | } 13 | 14 | @observer 15 | export class UsersDetailsView extends React.Component { 16 | 17 | @diInject() userStore: UserStore; 18 | viewStore: UserDetailsViewStore; 19 | 20 | constructor(props: Props, context: any) { 21 | super(props, context); 22 | this.viewStore = this.userStore.createUserDetailsViewStore(props.match.params.userId); 23 | } 24 | 25 | render() { 26 | if (this.viewStore.user) { 27 | return (
28 |

{this.viewStore.user.firstName} {this.viewStore.user.lastName}

29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | {this.viewStore.transactions.map(t => 38 | 39 | 40 | 41 | )} 42 | 43 |
Transactions
{t.description}
44 |
); 45 | } else { 46 | return null; 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/scripts/user/UserService.ts: -------------------------------------------------------------------------------- 1 | import {Observable} from 'rx'; 2 | import {User, Transaction} from './model'; 3 | import {Rest} from '../app/Rest'; 4 | import {Config} from '../app/Config'; 5 | 6 | export class UserService { 7 | getUsers(): Observable { 8 | return Rest.doGet(`${Config.BASE_URL}/users`); 9 | } 10 | 11 | getUser(userId: number): Observable { 12 | return Rest.doGet(`${Config.BASE_URL}/users/${userId}`); 13 | } 14 | 15 | getUserTransactions(userId: number): Observable { 16 | return Rest.doGet(`${Config.BASE_URL}/users/${userId}/transactions`); 17 | } 18 | } -------------------------------------------------------------------------------- /app/src/scripts/user/UserStore.ts: -------------------------------------------------------------------------------- 1 | import {diInject} from '../app/DIContext'; 2 | import {UserService} from './UserService'; 3 | import {observable, runInAction} from 'mobx'; 4 | import {User, Transaction} from './model'; 5 | import {Observable} from 'rx'; 6 | 7 | export class UserStore { 8 | createUserViewStore() { 9 | return new UserViewStore(); 10 | } 11 | 12 | createUserDetailsViewStore(userId: number) { 13 | return new UserDetailsViewStore(userId); 14 | } 15 | } 16 | 17 | export class UserViewStore { 18 | @diInject() userService: UserService; 19 | 20 | @observable users: User[] = []; 21 | 22 | constructor() { 23 | this.userService.getUsers().subscribe( 24 | users => this.users = users 25 | ) 26 | } 27 | } 28 | 29 | export class UserDetailsViewStore { 30 | @diInject() userService: UserService; 31 | 32 | @observable user: User; 33 | @observable transactions: Transaction[] = []; 34 | 35 | constructor(userId: number) { 36 | const user$ = this.userService.getUser(userId); 37 | const transactions$ = this.userService.getUserTransactions(userId); 38 | Observable.zip(user$, transactions$) 39 | .subscribe( 40 | ([user, transactions]) => 41 | runInAction(() => { 42 | this.user = user; 43 | this.transactions = transactions; 44 | }) 45 | ); 46 | } 47 | } -------------------------------------------------------------------------------- /app/src/scripts/user/UsersView.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import {observer} from 'mobx-react'; 3 | import {UserViewStore, UserStore} from './UserStore'; 4 | import FontAwesome = require('react-fontawesome'); 5 | import {diInject} from '../app/DIContext'; 6 | import {Link} from 'react-router-dom'; 7 | import {linkToUserDetails} from '../route/RouteStore'; 8 | 9 | interface Props { 10 | } 11 | 12 | @observer 13 | export class UsersView extends React.Component { 14 | 15 | @diInject() userStore: UserStore; 16 | viewStore: UserViewStore; 17 | 18 | constructor(props: Props, context: any) { 19 | super(props, context); 20 | this.viewStore = this.userStore.createUserViewStore(); 21 | } 22 | 23 | render() { 24 | return (
25 | 26 | 27 | 28 | 29 | 30 | 32 | 33 | 34 | {this.viewStore.users.map(u => 35 | 36 | 37 | 38 | 43 | 44 | )} 45 | 46 |
First NameLast Name 31 |
{u.firstName}{u.lastName} 39 | 40 | 41 | 42 |
47 |
); 48 | } 49 | } -------------------------------------------------------------------------------- /app/src/scripts/user/model.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | id: number; 3 | firstName: string; 4 | lastName: string; 5 | } 6 | 7 | export interface Transaction { 8 | id: number; 9 | description: string; 10 | } -------------------------------------------------------------------------------- /app/src/styles/styles.scss: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 51px; 3 | } 4 | 5 | .text-center { 6 | padding-top: 20px; 7 | } 8 | 9 | .col-xs-12 { 10 | background-color: #fff; 11 | } 12 | 13 | #sidebar { 14 | height: 100%; 15 | padding-right: 0; 16 | padding-top: 20px; 17 | } 18 | 19 | #sidebar .nav { 20 | width: 95%; 21 | } 22 | 23 | #sidebar li { 24 | border: 0 #f2f2f2 solid; 25 | border-bottom-width: 1px; 26 | } 27 | 28 | @media screen and (max-width: 767px) { 29 | .row-offcanvas { 30 | position: relative; 31 | -webkit-transition: all 0.25s ease-out; 32 | -moz-transition: all 0.25s ease-out; 33 | transition: all 0.25s ease-out; 34 | } 35 | .row-offcanvas-right 36 | .sidebar-offcanvas { 37 | right: -41.6%; 38 | } 39 | 40 | .row-offcanvas-left 41 | .sidebar-offcanvas { 42 | left: -41.6%; 43 | } 44 | .row-offcanvas-right.active { 45 | right: 41.6%; 46 | } 47 | .row-offcanvas-left.active { 48 | left: 41.6%; 49 | } 50 | .sidebar-offcanvas { 51 | position: absolute; 52 | top: 0; 53 | width: 41.6%; 54 | } 55 | #sidebar { 56 | padding-top: 0; 57 | } 58 | } -------------------------------------------------------------------------------- /app/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.0.0", 3 | "compilerOptions": { 4 | "module": "commonjs", 5 | "target": "es5", 6 | "jsx": "react", 7 | "sourceMap": true, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "noUnusedLocals": true, 11 | "noUnusedParameters": true, 12 | "outDir": "dist" 13 | }, 14 | "typeRoots": ["node_modules/@types"], 15 | "exclude": [ 16 | "dist", 17 | "node_modules", 18 | "build" 19 | ] 20 | } -------------------------------------------------------------------------------- /app/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": true, 4 | "comment-format": [true, "check-space"], 5 | "indent": [true, "spaces"], 6 | "no-duplicate-variable": true, 7 | "no-eval": true, 8 | "no-internal-module": true, 9 | "no-trailing-whitespace": true, 10 | "no-var-keyword": true, 11 | "one-line": [true, "check-open-brace", "check-whitespace"], 12 | "quotemark": [true, "single", "jsx-double"], 13 | "semicolon": false, 14 | "triple-equals": [true, "allow-null-check"], 15 | "typedef-whitespace": [true, { 16 | "call-signature": "nospace", 17 | "index-signature": "nospace", 18 | "parameter": "nospace", 19 | "property-declaration": "nospace", 20 | "variable-declaration": "nospace" 21 | }], 22 | "whitespace": [true, 23 | "check-branch", 24 | "check-decl", 25 | "check-operator", 26 | "check-separator", 27 | "check-type" 28 | ], 29 | "curly": true, 30 | "no-console": [true, "log"], 31 | "no-unused-expression": true, 32 | "max-file-line-count": [true, 300], 33 | "max-line-length": [true, 150], 34 | "trailing-comma": [true, {"multiline": "never", "singleline": "never"}], 35 | "no-consecutive-blank-lines": true, 36 | "object-literal-shorthand": true, 37 | 38 | "jsx-no-lambda": true, 39 | "jsx-no-string-ref": true, 40 | "jsx-self-close": true 41 | }, 42 | "rulesDirectory": [ 43 | "node_modules/tslint-react/rules" 44 | ] 45 | } -------------------------------------------------------------------------------- /app/webpack.commons.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const webpack = require("webpack"); 3 | const HtmlWebpackPlugin = require('html-webpack-plugin'); 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 5 | const CopyWebpackPlugin = require('copy-webpack-plugin'); 6 | 7 | function isExternal(module) { 8 | var userRequest = module.userRequest; 9 | 10 | if (typeof userRequest !== 'string') { 11 | return false; 12 | } 13 | 14 | return userRequest.indexOf('/node_modules/') >= 0; 15 | } 16 | 17 | module.exports = { 18 | context: path.join(__dirname, './src'), 19 | entry: ['./scripts/index.tsx'], 20 | output: { 21 | path: path.join(__dirname, 'out', 'public'), 22 | filename: 'js/app.min.js', 23 | publicPath: '/', 24 | }, 25 | module: { 26 | loaders: [ 27 | { 28 | test: /\.(ts|tsx)$/, 29 | exclude: /(node_modules|bower_components|__tests__)/, 30 | loaders: ['react-hot-loader/webpack', 'ts-loader'] 31 | }, 32 | { 33 | test: /\.css$/, 34 | loader: ExtractTextPlugin.extract( 35 | "style-loader", 36 | "css") 37 | }, 38 | { 39 | test: /\.scss$/, 40 | loader: ExtractTextPlugin.extract( 41 | "style-loader", 42 | "css!sass?sourceMap=true") 43 | }, 44 | { 45 | test: /\.eot(\?v=\d+\.\d+\.\d+)?$/, 46 | loader: "file" 47 | }, 48 | { 49 | test: /\.json$/, 50 | loader: "json-loader" 51 | }, 52 | { 53 | test: /\.(woff|woff2)(\?v=\d+\.\d+\.\d+)?$/, 54 | loader: "url?prefix=font/&limit=5000" 55 | }, 56 | { 57 | test: /\.ttf(\?v=\d+\.\d+\.\d+)?$/, 58 | loader: "url?limit=10000&mimetype=application/octet-stream" 59 | }, 60 | { 61 | test: /\.svg(\?v=\d+\.\d+\.\d+)?$/, 62 | loader: "url?limit=10000&mimetype=image/svg+xml" 63 | }, 64 | { 65 | test: /\.gif/, 66 | loader: "url-loader?limit=10000&mimetype=image/gif" 67 | }, 68 | { 69 | test: /\.jpg/, 70 | loader: "url-loader?limit=10000&mimetype=image/jpg" 71 | }, 72 | { 73 | test: /\.png/, 74 | loader: "url-loader?limit=10000&mimetype=image/png" 75 | } 76 | ] 77 | }, 78 | resolve: { 79 | extensions: ['', '.ts', '.tsx', '.js', '.jsx'] 80 | }, 81 | plugins: [ 82 | new ExtractTextPlugin('./css/[name].min.css'), 83 | new webpack.optimize.CommonsChunkPlugin({ 84 | name: 'vendors', 85 | filename: 'js/vendor.min.js', 86 | minChunks: function (module) { 87 | return isExternal(module); 88 | } 89 | }), 90 | new HtmlWebpackPlugin({ 91 | template: './index.html', 92 | inject: true 93 | }) 94 | ] 95 | }; 96 | -------------------------------------------------------------------------------- /app/webpack.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const merge = require('webpack-merge'); 3 | const commons = require('./webpack.commons.js'); 4 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 5 | 6 | const HOST = process.env.HOST || "0.0.0.0"; 7 | const PORT = process.env.PORT || "8888"; 8 | 9 | module.exports = merge(commons, { 10 | entry: [ 11 | './scripts/index.tsx', 12 | `webpack-dev-server/client?http://${HOST}:${PORT}`, 13 | `webpack/hot/only-dev-server` 14 | ], 15 | devtool: 'source-map', 16 | module: { 17 | preLoaders: [ 18 | { 19 | test: /\.ts[x]*$/, 20 | loader: "tslint" 21 | } 22 | ] 23 | }, 24 | tslint: { 25 | failOnHint: false //true? 26 | }, 27 | devServer: { 28 | noInfo: true, 29 | hot: true, 30 | inline: true, 31 | historyApiFallback: { 32 | index: 'index.html', 33 | rewrites: [ 34 | {from: /^(?!css|js|[^\\.]*\\.hot-update\\.json)/, to: '/index.html'} 35 | ] 36 | }, 37 | port: PORT, 38 | host: HOST 39 | }, 40 | plugins: [ 41 | new webpack.NoErrorsPlugin(), 42 | new webpack.DefinePlugin({ 43 | 'process.env.NODE_ENV': '"development"' 44 | }) 45 | ] 46 | }); 47 | -------------------------------------------------------------------------------- /app/webpack.production.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack'); 2 | const merge = require('webpack-merge'); 3 | const commons = require('./webpack.commons.js'); 4 | const failPlugin = require('webpack-fail-plugin'); 5 | const CleanWebpackPlugin = require('clean-webpack-plugin'); 6 | 7 | module.exports = merge(commons, { 8 | output: { 9 | publicPath: '/public/' 10 | }, 11 | plugins: [ 12 | new CleanWebpackPlugin(['out']), 13 | new webpack.DefinePlugin({ 14 | 'process.env.NODE_ENV': '"production"' 15 | }), 16 | new webpack.optimize.UglifyJsPlugin({ 17 | compress: { 18 | warnings: true 19 | } 20 | }), 21 | failPlugin 22 | ] 23 | }); 24 | -------------------------------------------------------------------------------- /backend-mock/db.json: -------------------------------------------------------------------------------- 1 | { 2 | "users": [ 3 | { 4 | "id": 1, 5 | "firstName": "John", 6 | "lastName": "Brown" 7 | }, 8 | { 9 | "id": 2, 10 | "firstName": "Ben", 11 | "lastName": "Smith" 12 | } 13 | ], 14 | "transactions": [ 15 | { 16 | "id": 1, 17 | "description": "Transaction 1", 18 | "userId": 1 19 | }, 20 | { 21 | "id": 2, 22 | "description": "Transaction 2", 23 | "userId": 1 24 | }, 25 | { 26 | "id": 3, 27 | "description": "Transaction 3", 28 | "userId": 1 29 | }, 30 | { 31 | "id": 4, 32 | "description": "Transaction 4", 33 | "userId": 1 34 | }, 35 | { 36 | "id": 5, 37 | "description": "Transaction 5", 38 | "userId": 2 39 | } 40 | ] 41 | } -------------------------------------------------------------------------------- /backend-mock/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend-mock", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "serve": "json-server --watch db.json --port 3004" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "json-server": "0.9.6" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /backend-mock/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | accepts@~1.3.3: 6 | version "1.3.3" 7 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca" 8 | dependencies: 9 | mime-types "~2.1.11" 10 | negotiator "0.6.1" 11 | 12 | ajv@^4.9.1: 13 | version "4.11.5" 14 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.5.tgz#b6ee74657b993a01dce44b7944d56f485828d5bd" 15 | dependencies: 16 | co "^4.6.0" 17 | json-stable-stringify "^1.0.1" 18 | 19 | ansi-align@^1.1.0: 20 | version "1.1.0" 21 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" 22 | dependencies: 23 | string-width "^1.0.1" 24 | 25 | ansi-regex@^2.0.0: 26 | version "2.1.1" 27 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 28 | 29 | ansi-styles@^2.2.1: 30 | version "2.2.1" 31 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 32 | 33 | array-flatten@1.1.1: 34 | version "1.1.1" 35 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 36 | 37 | asn1@~0.2.3: 38 | version "0.2.3" 39 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 40 | 41 | assert-plus@1.0.0, assert-plus@^1.0.0: 42 | version "1.0.0" 43 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 44 | 45 | assert-plus@^0.2.0: 46 | version "0.2.0" 47 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 48 | 49 | asynckit@^0.4.0: 50 | version "0.4.0" 51 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 52 | 53 | aws-sign2@~0.6.0: 54 | version "0.6.0" 55 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 56 | 57 | aws4@^1.2.1: 58 | version "1.6.0" 59 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 60 | 61 | basic-auth@~1.1.0: 62 | version "1.1.0" 63 | resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-1.1.0.tgz#45221ee429f7ee1e5035be3f51533f1cdfd29884" 64 | 65 | bcrypt-pbkdf@^1.0.0: 66 | version "1.0.1" 67 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 68 | dependencies: 69 | tweetnacl "^0.14.3" 70 | 71 | body-parser@^1.15.2: 72 | version "1.17.1" 73 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.17.1.tgz#75b3bc98ddd6e7e0d8ffe750dfaca5c66993fa47" 74 | dependencies: 75 | bytes "2.4.0" 76 | content-type "~1.0.2" 77 | debug "2.6.1" 78 | depd "~1.1.0" 79 | http-errors "~1.6.1" 80 | iconv-lite "0.4.15" 81 | on-finished "~2.3.0" 82 | qs "6.4.0" 83 | raw-body "~2.2.0" 84 | type-is "~1.6.14" 85 | 86 | boom@2.x.x: 87 | version "2.10.1" 88 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 89 | dependencies: 90 | hoek "2.x.x" 91 | 92 | boxen@^0.6.0: 93 | version "0.6.0" 94 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" 95 | dependencies: 96 | ansi-align "^1.1.0" 97 | camelcase "^2.1.0" 98 | chalk "^1.1.1" 99 | cli-boxes "^1.0.0" 100 | filled-array "^1.0.0" 101 | object-assign "^4.0.1" 102 | repeating "^2.0.0" 103 | string-width "^1.0.1" 104 | widest-line "^1.0.0" 105 | 106 | buffer-shims@^1.0.0: 107 | version "1.0.0" 108 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 109 | 110 | builtin-modules@^1.0.0: 111 | version "1.1.1" 112 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 113 | 114 | bytes@2.3.0: 115 | version "2.3.0" 116 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.3.0.tgz#d5b680a165b6201739acb611542aabc2d8ceb070" 117 | 118 | bytes@2.4.0: 119 | version "2.4.0" 120 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-2.4.0.tgz#7d97196f9d5baf7f6935e25985549edd2a6c2339" 121 | 122 | camelcase@^2.1.0: 123 | version "2.1.1" 124 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 125 | 126 | camelcase@^3.0.0: 127 | version "3.0.0" 128 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 129 | 130 | capture-stack-trace@^1.0.0: 131 | version "1.0.0" 132 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 133 | 134 | caseless@~0.12.0: 135 | version "0.12.0" 136 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 137 | 138 | chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 139 | version "1.1.3" 140 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 141 | dependencies: 142 | ansi-styles "^2.2.1" 143 | escape-string-regexp "^1.0.2" 144 | has-ansi "^2.0.0" 145 | strip-ansi "^3.0.0" 146 | supports-color "^2.0.0" 147 | 148 | cli-boxes@^1.0.0: 149 | version "1.0.0" 150 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 151 | 152 | cliui@^3.2.0: 153 | version "3.2.0" 154 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 155 | dependencies: 156 | string-width "^1.0.1" 157 | strip-ansi "^3.0.1" 158 | wrap-ansi "^2.0.0" 159 | 160 | co@^4.6.0: 161 | version "4.6.0" 162 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 163 | 164 | code-point-at@^1.0.0: 165 | version "1.1.0" 166 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 167 | 168 | combined-stream@^1.0.5, combined-stream@~1.0.5: 169 | version "1.0.5" 170 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 171 | dependencies: 172 | delayed-stream "~1.0.0" 173 | 174 | compressible@~2.0.8: 175 | version "2.0.10" 176 | resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" 177 | dependencies: 178 | mime-db ">= 1.27.0 < 2" 179 | 180 | compression@^1.6.0: 181 | version "1.6.2" 182 | resolved "https://registry.yarnpkg.com/compression/-/compression-1.6.2.tgz#cceb121ecc9d09c52d7ad0c3350ea93ddd402bc3" 183 | dependencies: 184 | accepts "~1.3.3" 185 | bytes "2.3.0" 186 | compressible "~2.0.8" 187 | debug "~2.2.0" 188 | on-headers "~1.0.1" 189 | vary "~1.1.0" 190 | 191 | configstore@^2.0.0: 192 | version "2.1.0" 193 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" 194 | dependencies: 195 | dot-prop "^3.0.0" 196 | graceful-fs "^4.1.2" 197 | mkdirp "^0.5.0" 198 | object-assign "^4.0.1" 199 | os-tmpdir "^1.0.0" 200 | osenv "^0.1.0" 201 | uuid "^2.0.1" 202 | write-file-atomic "^1.1.2" 203 | xdg-basedir "^2.0.0" 204 | 205 | connect-pause@^0.1.0: 206 | version "0.1.1" 207 | resolved "https://registry.yarnpkg.com/connect-pause/-/connect-pause-0.1.1.tgz#b269b2bb82ddb1ac3db5099c0fb582aba99fb37a" 208 | 209 | content-disposition@0.5.2: 210 | version "0.5.2" 211 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 212 | 213 | content-type@~1.0.2: 214 | version "1.0.2" 215 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.2.tgz#b7d113aee7a8dd27bd21133c4dc2529df1721eed" 216 | 217 | cookie-signature@1.0.6: 218 | version "1.0.6" 219 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 220 | 221 | cookie@0.3.1: 222 | version "0.3.1" 223 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 224 | 225 | core-util-is@~1.0.0: 226 | version "1.0.2" 227 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 228 | 229 | cors@^2.3.0: 230 | version "2.8.3" 231 | resolved "https://registry.yarnpkg.com/cors/-/cors-2.8.3.tgz#4cf78e1d23329a7496b2fc2225b77ca5bb5eb802" 232 | dependencies: 233 | object-assign "^4" 234 | vary "^1" 235 | 236 | create-error-class@^3.0.1: 237 | version "3.0.2" 238 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 239 | dependencies: 240 | capture-stack-trace "^1.0.0" 241 | 242 | cryptiles@2.x.x: 243 | version "2.0.5" 244 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 245 | dependencies: 246 | boom "2.x.x" 247 | 248 | dashdash@^1.12.0: 249 | version "1.14.1" 250 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 251 | dependencies: 252 | assert-plus "^1.0.0" 253 | 254 | debug@2.6.1: 255 | version "2.6.1" 256 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" 257 | dependencies: 258 | ms "0.7.2" 259 | 260 | debug@2.6.3: 261 | version "2.6.3" 262 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.3.tgz#0f7eb8c30965ec08c72accfa0130c8b79984141d" 263 | dependencies: 264 | ms "0.7.2" 265 | 266 | debug@~2.2.0: 267 | version "2.2.0" 268 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 269 | dependencies: 270 | ms "0.7.1" 271 | 272 | decamelize@^1.1.1: 273 | version "1.2.0" 274 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 275 | 276 | deep-extend@~0.4.0: 277 | version "0.4.1" 278 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 279 | 280 | delayed-stream@~1.0.0: 281 | version "1.0.0" 282 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 283 | 284 | depd@1.1.0, depd@~1.1.0: 285 | version "1.1.0" 286 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" 287 | 288 | destroy@~1.0.4: 289 | version "1.0.4" 290 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 291 | 292 | dot-prop@^3.0.0: 293 | version "3.0.0" 294 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 295 | dependencies: 296 | is-obj "^1.0.0" 297 | 298 | duplexer2@^0.1.4: 299 | version "0.1.4" 300 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 301 | dependencies: 302 | readable-stream "^2.0.2" 303 | 304 | ecc-jsbn@~0.1.1: 305 | version "0.1.1" 306 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 307 | dependencies: 308 | jsbn "~0.1.0" 309 | 310 | ee-first@1.1.1: 311 | version "1.1.1" 312 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 313 | 314 | encodeurl@~1.0.1: 315 | version "1.0.1" 316 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 317 | 318 | error-ex@^1.2.0: 319 | version "1.3.1" 320 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 321 | dependencies: 322 | is-arrayish "^0.2.1" 323 | 324 | errorhandler@^1.2.0: 325 | version "1.5.0" 326 | resolved "https://registry.yarnpkg.com/errorhandler/-/errorhandler-1.5.0.tgz#eaba64ca5d542a311ac945f582defc336165d9f4" 327 | dependencies: 328 | accepts "~1.3.3" 329 | escape-html "~1.0.3" 330 | 331 | escape-html@~1.0.3: 332 | version "1.0.3" 333 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 334 | 335 | escape-string-regexp@^1.0.2: 336 | version "1.0.5" 337 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 338 | 339 | etag@~1.8.0: 340 | version "1.8.0" 341 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.0.tgz#6f631aef336d6c46362b51764044ce216be3c051" 342 | 343 | express@^4.9.5: 344 | version "4.15.2" 345 | resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35" 346 | dependencies: 347 | accepts "~1.3.3" 348 | array-flatten "1.1.1" 349 | content-disposition "0.5.2" 350 | content-type "~1.0.2" 351 | cookie "0.3.1" 352 | cookie-signature "1.0.6" 353 | debug "2.6.1" 354 | depd "~1.1.0" 355 | encodeurl "~1.0.1" 356 | escape-html "~1.0.3" 357 | etag "~1.8.0" 358 | finalhandler "~1.0.0" 359 | fresh "0.5.0" 360 | merge-descriptors "1.0.1" 361 | methods "~1.1.2" 362 | on-finished "~2.3.0" 363 | parseurl "~1.3.1" 364 | path-to-regexp "0.1.7" 365 | proxy-addr "~1.1.3" 366 | qs "6.4.0" 367 | range-parser "~1.2.0" 368 | send "0.15.1" 369 | serve-static "1.12.1" 370 | setprototypeof "1.0.3" 371 | statuses "~1.3.1" 372 | type-is "~1.6.14" 373 | utils-merge "1.0.0" 374 | vary "~1.1.0" 375 | 376 | extend@~3.0.0: 377 | version "3.0.0" 378 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 379 | 380 | extsprintf@1.0.2: 381 | version "1.0.2" 382 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 383 | 384 | filled-array@^1.0.0: 385 | version "1.1.0" 386 | resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" 387 | 388 | finalhandler@~1.0.0: 389 | version "1.0.1" 390 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.1.tgz#bcd15d1689c0e5ed729b6f7f541a6df984117db8" 391 | dependencies: 392 | debug "2.6.3" 393 | encodeurl "~1.0.1" 394 | escape-html "~1.0.3" 395 | on-finished "~2.3.0" 396 | parseurl "~1.3.1" 397 | statuses "~1.3.1" 398 | unpipe "~1.0.0" 399 | 400 | find-up@^1.0.0: 401 | version "1.1.2" 402 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 403 | dependencies: 404 | path-exists "^2.0.0" 405 | pinkie-promise "^2.0.0" 406 | 407 | forever-agent@~0.6.1: 408 | version "0.6.1" 409 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 410 | 411 | form-data@~2.1.1: 412 | version "2.1.2" 413 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 414 | dependencies: 415 | asynckit "^0.4.0" 416 | combined-stream "^1.0.5" 417 | mime-types "^2.1.12" 418 | 419 | forwarded@~0.1.0: 420 | version "0.1.0" 421 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" 422 | 423 | fresh@0.5.0: 424 | version "0.5.0" 425 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" 426 | 427 | get-caller-file@^1.0.1: 428 | version "1.0.2" 429 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 430 | 431 | getpass@^0.1.1: 432 | version "0.1.6" 433 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 434 | dependencies: 435 | assert-plus "^1.0.0" 436 | 437 | got@^5.0.0: 438 | version "5.7.1" 439 | resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" 440 | dependencies: 441 | create-error-class "^3.0.1" 442 | duplexer2 "^0.1.4" 443 | is-redirect "^1.0.0" 444 | is-retry-allowed "^1.0.0" 445 | is-stream "^1.0.0" 446 | lowercase-keys "^1.0.0" 447 | node-status-codes "^1.0.0" 448 | object-assign "^4.0.1" 449 | parse-json "^2.1.0" 450 | pinkie-promise "^2.0.0" 451 | read-all-stream "^3.0.0" 452 | readable-stream "^2.0.5" 453 | timed-out "^3.0.0" 454 | unzip-response "^1.0.2" 455 | url-parse-lax "^1.0.0" 456 | 457 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3: 458 | version "4.1.11" 459 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 460 | 461 | har-schema@^1.0.5: 462 | version "1.0.5" 463 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 464 | 465 | har-validator@~4.2.1: 466 | version "4.2.1" 467 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 468 | dependencies: 469 | ajv "^4.9.1" 470 | har-schema "^1.0.5" 471 | 472 | has-ansi@^2.0.0: 473 | version "2.0.0" 474 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 475 | dependencies: 476 | ansi-regex "^2.0.0" 477 | 478 | hawk@~3.1.3: 479 | version "3.1.3" 480 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 481 | dependencies: 482 | boom "2.x.x" 483 | cryptiles "2.x.x" 484 | hoek "2.x.x" 485 | sntp "1.x.x" 486 | 487 | hoek@2.x.x: 488 | version "2.16.3" 489 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 490 | 491 | hosted-git-info@^2.1.4: 492 | version "2.4.1" 493 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.1.tgz#4b0445e41c004a8bd1337773a4ff790ca40318c8" 494 | 495 | http-errors@~1.6.1: 496 | version "1.6.1" 497 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.1.tgz#5f8b8ed98aca545656bf572997387f904a722257" 498 | dependencies: 499 | depd "1.1.0" 500 | inherits "2.0.3" 501 | setprototypeof "1.0.3" 502 | statuses ">= 1.3.1 < 2" 503 | 504 | http-signature@~1.1.0: 505 | version "1.1.1" 506 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 507 | dependencies: 508 | assert-plus "^0.2.0" 509 | jsprim "^1.2.2" 510 | sshpk "^1.7.0" 511 | 512 | iconv-lite@0.4.15: 513 | version "0.4.15" 514 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.15.tgz#fe265a218ac6a57cfe854927e9d04c19825eddeb" 515 | 516 | imurmurhash@^0.1.4: 517 | version "0.1.4" 518 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 519 | 520 | inherits@2.0.3, inherits@~2.0.1: 521 | version "2.0.3" 522 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 523 | 524 | ini@~1.3.0: 525 | version "1.3.4" 526 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 527 | 528 | invert-kv@^1.0.0: 529 | version "1.0.0" 530 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 531 | 532 | ipaddr.js@1.3.0: 533 | version "1.3.0" 534 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.3.0.tgz#1e03a52fdad83a8bbb2b25cbf4998b4cffcd3dec" 535 | 536 | is-arrayish@^0.2.1: 537 | version "0.2.1" 538 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 539 | 540 | is-builtin-module@^1.0.0: 541 | version "1.0.0" 542 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 543 | dependencies: 544 | builtin-modules "^1.0.0" 545 | 546 | is-finite@^1.0.0: 547 | version "1.0.2" 548 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 549 | dependencies: 550 | number-is-nan "^1.0.0" 551 | 552 | is-fullwidth-code-point@^1.0.0: 553 | version "1.0.0" 554 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 555 | dependencies: 556 | number-is-nan "^1.0.0" 557 | 558 | is-npm@^1.0.0: 559 | version "1.0.0" 560 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 561 | 562 | is-obj@^1.0.0: 563 | version "1.0.1" 564 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 565 | 566 | is-promise@^2.1.0: 567 | version "2.1.0" 568 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 569 | 570 | is-redirect@^1.0.0: 571 | version "1.0.0" 572 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 573 | 574 | is-retry-allowed@^1.0.0: 575 | version "1.1.0" 576 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 577 | 578 | is-stream@^1.0.0: 579 | version "1.1.0" 580 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 581 | 582 | is-typedarray@~1.0.0: 583 | version "1.0.0" 584 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 585 | 586 | is-utf8@^0.2.0: 587 | version "0.2.1" 588 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 589 | 590 | isarray@~1.0.0: 591 | version "1.0.0" 592 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 593 | 594 | isstream@~0.1.2: 595 | version "0.1.2" 596 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 597 | 598 | jju@^1.1.0: 599 | version "1.3.0" 600 | resolved "https://registry.yarnpkg.com/jju/-/jju-1.3.0.tgz#dadd9ef01924bc728b03f2f7979bdbd62f7a2aaa" 601 | 602 | jodid25519@^1.0.0: 603 | version "1.0.2" 604 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 605 | dependencies: 606 | jsbn "~0.1.0" 607 | 608 | jsbn@~0.1.0: 609 | version "0.1.1" 610 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 611 | 612 | json-parse-helpfulerror@^1.0.3: 613 | version "1.0.3" 614 | resolved "https://registry.yarnpkg.com/json-parse-helpfulerror/-/json-parse-helpfulerror-1.0.3.tgz#13f14ce02eed4e981297b64eb9e3b932e2dd13dc" 615 | dependencies: 616 | jju "^1.1.0" 617 | 618 | json-schema@0.2.3: 619 | version "0.2.3" 620 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 621 | 622 | json-server@^0.9.6: 623 | version "0.9.6" 624 | resolved "https://registry.yarnpkg.com/json-server/-/json-server-0.9.6.tgz#0d6894876c5fb2a5d25ca4139dab673ab536984f" 625 | dependencies: 626 | body-parser "^1.15.2" 627 | chalk "^1.1.3" 628 | compression "^1.6.0" 629 | connect-pause "^0.1.0" 630 | cors "^2.3.0" 631 | errorhandler "^1.2.0" 632 | express "^4.9.5" 633 | json-parse-helpfulerror "^1.0.3" 634 | lodash "^4.11.2" 635 | lodash-id "^0.13.0" 636 | lowdb "^0.15.0" 637 | method-override "^2.1.2" 638 | morgan "^1.3.1" 639 | object-assign "^4.0.1" 640 | pluralize "^3.0.0" 641 | request "^2.72.0" 642 | server-destroy "^1.0.1" 643 | shortid "^2.2.6" 644 | update-notifier "^1.0.2" 645 | yargs "^6.0.0" 646 | 647 | json-stable-stringify@^1.0.1: 648 | version "1.0.1" 649 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 650 | dependencies: 651 | jsonify "~0.0.0" 652 | 653 | json-stringify-safe@~5.0.1: 654 | version "5.0.1" 655 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 656 | 657 | jsonify@~0.0.0: 658 | version "0.0.0" 659 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 660 | 661 | jsprim@^1.2.2: 662 | version "1.4.0" 663 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" 664 | dependencies: 665 | assert-plus "1.0.0" 666 | extsprintf "1.0.2" 667 | json-schema "0.2.3" 668 | verror "1.3.6" 669 | 670 | latest-version@^2.0.0: 671 | version "2.0.0" 672 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" 673 | dependencies: 674 | package-json "^2.0.0" 675 | 676 | lazy-req@^1.1.0: 677 | version "1.1.0" 678 | resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" 679 | 680 | lcid@^1.0.0: 681 | version "1.0.0" 682 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 683 | dependencies: 684 | invert-kv "^1.0.0" 685 | 686 | load-json-file@^1.0.0: 687 | version "1.1.0" 688 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 689 | dependencies: 690 | graceful-fs "^4.1.2" 691 | parse-json "^2.2.0" 692 | pify "^2.0.0" 693 | pinkie-promise "^2.0.0" 694 | strip-bom "^2.0.0" 695 | 696 | lodash-id@^0.13.0: 697 | version "0.13.0" 698 | resolved "https://registry.yarnpkg.com/lodash-id/-/lodash-id-0.13.0.tgz#1b2086c24f004f07411bdb09b775072114bcddc6" 699 | 700 | lodash@4, lodash@^4.11.2: 701 | version "4.17.4" 702 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 703 | 704 | lowdb@^0.15.0: 705 | version "0.15.5" 706 | resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-0.15.5.tgz#9ade105df8aa573692d1221622b85414fbf4fa96" 707 | dependencies: 708 | graceful-fs "^4.1.3" 709 | is-promise "^2.1.0" 710 | json-parse-helpfulerror "^1.0.3" 711 | lodash "4" 712 | steno "^0.4.1" 713 | 714 | lowercase-keys@^1.0.0: 715 | version "1.0.0" 716 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 717 | 718 | media-typer@0.3.0: 719 | version "0.3.0" 720 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 721 | 722 | merge-descriptors@1.0.1: 723 | version "1.0.1" 724 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 725 | 726 | method-override@^2.1.2: 727 | version "2.3.8" 728 | resolved "https://registry.yarnpkg.com/method-override/-/method-override-2.3.8.tgz#178234bf4bab869f89df9444b06fc6147b44828c" 729 | dependencies: 730 | debug "2.6.3" 731 | methods "~1.1.2" 732 | parseurl "~1.3.1" 733 | vary "~1.1.0" 734 | 735 | methods@~1.1.2: 736 | version "1.1.2" 737 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 738 | 739 | "mime-db@>= 1.27.0 < 2", mime-db@~1.27.0: 740 | version "1.27.0" 741 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" 742 | 743 | mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.13, mime-types@~2.1.7: 744 | version "2.1.15" 745 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" 746 | dependencies: 747 | mime-db "~1.27.0" 748 | 749 | mime@1.3.4: 750 | version "1.3.4" 751 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 752 | 753 | minimist@0.0.8: 754 | version "0.0.8" 755 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 756 | 757 | minimist@^1.2.0: 758 | version "1.2.0" 759 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 760 | 761 | mkdirp@^0.5.0: 762 | version "0.5.1" 763 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 764 | dependencies: 765 | minimist "0.0.8" 766 | 767 | morgan@^1.3.1: 768 | version "1.8.1" 769 | resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.8.1.tgz#f93023d3887bd27b78dfd6023cea7892ee27a4b1" 770 | dependencies: 771 | basic-auth "~1.1.0" 772 | debug "2.6.1" 773 | depd "~1.1.0" 774 | on-finished "~2.3.0" 775 | on-headers "~1.0.1" 776 | 777 | ms@0.7.1: 778 | version "0.7.1" 779 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 780 | 781 | ms@0.7.2: 782 | version "0.7.2" 783 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" 784 | 785 | negotiator@0.6.1: 786 | version "0.6.1" 787 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 788 | 789 | node-status-codes@^1.0.0: 790 | version "1.0.0" 791 | resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" 792 | 793 | normalize-package-data@^2.3.2: 794 | version "2.3.6" 795 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.6.tgz#498fa420c96401f787402ba21e600def9f981fff" 796 | dependencies: 797 | hosted-git-info "^2.1.4" 798 | is-builtin-module "^1.0.0" 799 | semver "2 || 3 || 4 || 5" 800 | validate-npm-package-license "^3.0.1" 801 | 802 | number-is-nan@^1.0.0: 803 | version "1.0.1" 804 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 805 | 806 | oauth-sign@~0.8.1: 807 | version "0.8.2" 808 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 809 | 810 | object-assign@^4, object-assign@^4.0.1: 811 | version "4.1.1" 812 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 813 | 814 | on-finished@~2.3.0: 815 | version "2.3.0" 816 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 817 | dependencies: 818 | ee-first "1.1.1" 819 | 820 | on-headers@~1.0.1: 821 | version "1.0.1" 822 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 823 | 824 | os-homedir@^1.0.0: 825 | version "1.0.2" 826 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 827 | 828 | os-locale@^1.4.0: 829 | version "1.4.0" 830 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 831 | dependencies: 832 | lcid "^1.0.0" 833 | 834 | os-tmpdir@^1.0.0: 835 | version "1.0.2" 836 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 837 | 838 | osenv@^0.1.0: 839 | version "0.1.4" 840 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 841 | dependencies: 842 | os-homedir "^1.0.0" 843 | os-tmpdir "^1.0.0" 844 | 845 | package-json@^2.0.0: 846 | version "2.4.0" 847 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" 848 | dependencies: 849 | got "^5.0.0" 850 | registry-auth-token "^3.0.1" 851 | registry-url "^3.0.3" 852 | semver "^5.1.0" 853 | 854 | parse-json@^2.1.0, parse-json@^2.2.0: 855 | version "2.2.0" 856 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 857 | dependencies: 858 | error-ex "^1.2.0" 859 | 860 | parseurl@~1.3.1: 861 | version "1.3.1" 862 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.1.tgz#c8ab8c9223ba34888aa64a297b28853bec18da56" 863 | 864 | path-exists@^2.0.0: 865 | version "2.1.0" 866 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 867 | dependencies: 868 | pinkie-promise "^2.0.0" 869 | 870 | path-to-regexp@0.1.7: 871 | version "0.1.7" 872 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 873 | 874 | path-type@^1.0.0: 875 | version "1.1.0" 876 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 877 | dependencies: 878 | graceful-fs "^4.1.2" 879 | pify "^2.0.0" 880 | pinkie-promise "^2.0.0" 881 | 882 | performance-now@^0.2.0: 883 | version "0.2.0" 884 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 885 | 886 | pify@^2.0.0: 887 | version "2.3.0" 888 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 889 | 890 | pinkie-promise@^2.0.0: 891 | version "2.0.1" 892 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 893 | dependencies: 894 | pinkie "^2.0.0" 895 | 896 | pinkie@^2.0.0: 897 | version "2.0.4" 898 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 899 | 900 | pluralize@^3.0.0: 901 | version "3.1.0" 902 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-3.1.0.tgz#84213d0a12356069daa84060c559242633161368" 903 | 904 | prepend-http@^1.0.1: 905 | version "1.0.4" 906 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 907 | 908 | process-nextick-args@~1.0.6: 909 | version "1.0.7" 910 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 911 | 912 | proxy-addr@~1.1.3: 913 | version "1.1.4" 914 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.4.tgz#27e545f6960a44a627d9b44467e35c1b6b4ce2f3" 915 | dependencies: 916 | forwarded "~0.1.0" 917 | ipaddr.js "1.3.0" 918 | 919 | punycode@^1.4.1: 920 | version "1.4.1" 921 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 922 | 923 | qs@6.4.0, qs@~6.4.0: 924 | version "6.4.0" 925 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 926 | 927 | range-parser@~1.2.0: 928 | version "1.2.0" 929 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 930 | 931 | raw-body@~2.2.0: 932 | version "2.2.0" 933 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.2.0.tgz#994976cf6a5096a41162840492f0bdc5d6e7fb96" 934 | dependencies: 935 | bytes "2.4.0" 936 | iconv-lite "0.4.15" 937 | unpipe "1.0.0" 938 | 939 | rc@^1.0.1, rc@^1.1.6: 940 | version "1.2.0" 941 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.0.tgz#c7de973b7b46297c041366b2fd3d2363b1697c66" 942 | dependencies: 943 | deep-extend "~0.4.0" 944 | ini "~1.3.0" 945 | minimist "^1.2.0" 946 | strip-json-comments "~2.0.1" 947 | 948 | read-all-stream@^3.0.0: 949 | version "3.1.0" 950 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" 951 | dependencies: 952 | pinkie-promise "^2.0.0" 953 | readable-stream "^2.0.0" 954 | 955 | read-pkg-up@^1.0.1: 956 | version "1.0.1" 957 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 958 | dependencies: 959 | find-up "^1.0.0" 960 | read-pkg "^1.0.0" 961 | 962 | read-pkg@^1.0.0: 963 | version "1.1.0" 964 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 965 | dependencies: 966 | load-json-file "^1.0.0" 967 | normalize-package-data "^2.3.2" 968 | path-type "^1.0.0" 969 | 970 | readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5: 971 | version "2.2.6" 972 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.6.tgz#8b43aed76e71483938d12a8d46c6cf1a00b1f816" 973 | dependencies: 974 | buffer-shims "^1.0.0" 975 | core-util-is "~1.0.0" 976 | inherits "~2.0.1" 977 | isarray "~1.0.0" 978 | process-nextick-args "~1.0.6" 979 | string_decoder "~0.10.x" 980 | util-deprecate "~1.0.1" 981 | 982 | registry-auth-token@^3.0.1: 983 | version "3.1.0" 984 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" 985 | dependencies: 986 | rc "^1.1.6" 987 | 988 | registry-url@^3.0.3: 989 | version "3.1.0" 990 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 991 | dependencies: 992 | rc "^1.0.1" 993 | 994 | repeating@^2.0.0: 995 | version "2.0.1" 996 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 997 | dependencies: 998 | is-finite "^1.0.0" 999 | 1000 | request@^2.72.0: 1001 | version "2.81.0" 1002 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1003 | dependencies: 1004 | aws-sign2 "~0.6.0" 1005 | aws4 "^1.2.1" 1006 | caseless "~0.12.0" 1007 | combined-stream "~1.0.5" 1008 | extend "~3.0.0" 1009 | forever-agent "~0.6.1" 1010 | form-data "~2.1.1" 1011 | har-validator "~4.2.1" 1012 | hawk "~3.1.3" 1013 | http-signature "~1.1.0" 1014 | is-typedarray "~1.0.0" 1015 | isstream "~0.1.2" 1016 | json-stringify-safe "~5.0.1" 1017 | mime-types "~2.1.7" 1018 | oauth-sign "~0.8.1" 1019 | performance-now "^0.2.0" 1020 | qs "~6.4.0" 1021 | safe-buffer "^5.0.1" 1022 | stringstream "~0.0.4" 1023 | tough-cookie "~2.3.0" 1024 | tunnel-agent "^0.6.0" 1025 | uuid "^3.0.0" 1026 | 1027 | require-directory@^2.1.1: 1028 | version "2.1.1" 1029 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1030 | 1031 | require-main-filename@^1.0.1: 1032 | version "1.0.1" 1033 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1034 | 1035 | safe-buffer@^5.0.1: 1036 | version "5.0.1" 1037 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1038 | 1039 | semver-diff@^2.0.0: 1040 | version "2.1.0" 1041 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1042 | dependencies: 1043 | semver "^5.0.3" 1044 | 1045 | "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0: 1046 | version "5.3.0" 1047 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1048 | 1049 | send@0.15.1: 1050 | version "0.15.1" 1051 | resolved "https://registry.yarnpkg.com/send/-/send-0.15.1.tgz#8a02354c26e6f5cca700065f5f0cdeba90ec7b5f" 1052 | dependencies: 1053 | debug "2.6.1" 1054 | depd "~1.1.0" 1055 | destroy "~1.0.4" 1056 | encodeurl "~1.0.1" 1057 | escape-html "~1.0.3" 1058 | etag "~1.8.0" 1059 | fresh "0.5.0" 1060 | http-errors "~1.6.1" 1061 | mime "1.3.4" 1062 | ms "0.7.2" 1063 | on-finished "~2.3.0" 1064 | range-parser "~1.2.0" 1065 | statuses "~1.3.1" 1066 | 1067 | serve-static@1.12.1: 1068 | version "1.12.1" 1069 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.1.tgz#7443a965e3ced647aceb5639fa06bf4d1bbe0039" 1070 | dependencies: 1071 | encodeurl "~1.0.1" 1072 | escape-html "~1.0.3" 1073 | parseurl "~1.3.1" 1074 | send "0.15.1" 1075 | 1076 | server-destroy@^1.0.1: 1077 | version "1.0.1" 1078 | resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd" 1079 | 1080 | set-blocking@^2.0.0: 1081 | version "2.0.0" 1082 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1083 | 1084 | setprototypeof@1.0.3: 1085 | version "1.0.3" 1086 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 1087 | 1088 | shortid@^2.2.6: 1089 | version "2.2.8" 1090 | resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.8.tgz#033b117d6a2e975804f6f0969dbe7d3d0b355131" 1091 | 1092 | slide@^1.1.5: 1093 | version "1.1.6" 1094 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1095 | 1096 | sntp@1.x.x: 1097 | version "1.0.9" 1098 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1099 | dependencies: 1100 | hoek "2.x.x" 1101 | 1102 | spdx-correct@~1.0.0: 1103 | version "1.0.2" 1104 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1105 | dependencies: 1106 | spdx-license-ids "^1.0.2" 1107 | 1108 | spdx-expression-parse@~1.0.0: 1109 | version "1.0.4" 1110 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1111 | 1112 | spdx-license-ids@^1.0.2: 1113 | version "1.2.2" 1114 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1115 | 1116 | sshpk@^1.7.0: 1117 | version "1.11.0" 1118 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.11.0.tgz#2d8d5ebb4a6fab28ffba37fa62a90f4a3ea59d77" 1119 | dependencies: 1120 | asn1 "~0.2.3" 1121 | assert-plus "^1.0.0" 1122 | dashdash "^1.12.0" 1123 | getpass "^0.1.1" 1124 | optionalDependencies: 1125 | bcrypt-pbkdf "^1.0.0" 1126 | ecc-jsbn "~0.1.1" 1127 | jodid25519 "^1.0.0" 1128 | jsbn "~0.1.0" 1129 | tweetnacl "~0.14.0" 1130 | 1131 | "statuses@>= 1.3.1 < 2", statuses@~1.3.1: 1132 | version "1.3.1" 1133 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 1134 | 1135 | steno@^0.4.1: 1136 | version "0.4.4" 1137 | resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb" 1138 | dependencies: 1139 | graceful-fs "^4.1.3" 1140 | 1141 | string-width@^1.0.1, string-width@^1.0.2: 1142 | version "1.0.2" 1143 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1144 | dependencies: 1145 | code-point-at "^1.0.0" 1146 | is-fullwidth-code-point "^1.0.0" 1147 | strip-ansi "^3.0.0" 1148 | 1149 | string_decoder@~0.10.x: 1150 | version "0.10.31" 1151 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1152 | 1153 | stringstream@~0.0.4: 1154 | version "0.0.5" 1155 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1156 | 1157 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1158 | version "3.0.1" 1159 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1160 | dependencies: 1161 | ansi-regex "^2.0.0" 1162 | 1163 | strip-bom@^2.0.0: 1164 | version "2.0.0" 1165 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1166 | dependencies: 1167 | is-utf8 "^0.2.0" 1168 | 1169 | strip-json-comments@~2.0.1: 1170 | version "2.0.1" 1171 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1172 | 1173 | supports-color@^2.0.0: 1174 | version "2.0.0" 1175 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1176 | 1177 | timed-out@^3.0.0: 1178 | version "3.1.3" 1179 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" 1180 | 1181 | tough-cookie@~2.3.0: 1182 | version "2.3.2" 1183 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1184 | dependencies: 1185 | punycode "^1.4.1" 1186 | 1187 | tunnel-agent@^0.6.0: 1188 | version "0.6.0" 1189 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 1190 | dependencies: 1191 | safe-buffer "^5.0.1" 1192 | 1193 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1194 | version "0.14.5" 1195 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1196 | 1197 | type-is@~1.6.14: 1198 | version "1.6.14" 1199 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.14.tgz#e219639c17ded1ca0789092dd54a03826b817cb2" 1200 | dependencies: 1201 | media-typer "0.3.0" 1202 | mime-types "~2.1.13" 1203 | 1204 | unpipe@1.0.0, unpipe@~1.0.0: 1205 | version "1.0.0" 1206 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1207 | 1208 | unzip-response@^1.0.2: 1209 | version "1.0.2" 1210 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" 1211 | 1212 | update-notifier@^1.0.2: 1213 | version "1.0.3" 1214 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" 1215 | dependencies: 1216 | boxen "^0.6.0" 1217 | chalk "^1.0.0" 1218 | configstore "^2.0.0" 1219 | is-npm "^1.0.0" 1220 | latest-version "^2.0.0" 1221 | lazy-req "^1.1.0" 1222 | semver-diff "^2.0.0" 1223 | xdg-basedir "^2.0.0" 1224 | 1225 | url-parse-lax@^1.0.0: 1226 | version "1.0.0" 1227 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1228 | dependencies: 1229 | prepend-http "^1.0.1" 1230 | 1231 | util-deprecate@~1.0.1: 1232 | version "1.0.2" 1233 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1234 | 1235 | utils-merge@1.0.0: 1236 | version "1.0.0" 1237 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 1238 | 1239 | uuid@^2.0.1: 1240 | version "2.0.3" 1241 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 1242 | 1243 | uuid@^3.0.0: 1244 | version "3.0.1" 1245 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1246 | 1247 | validate-npm-package-license@^3.0.1: 1248 | version "3.0.1" 1249 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1250 | dependencies: 1251 | spdx-correct "~1.0.0" 1252 | spdx-expression-parse "~1.0.0" 1253 | 1254 | vary@^1, vary@~1.1.0: 1255 | version "1.1.1" 1256 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" 1257 | 1258 | verror@1.3.6: 1259 | version "1.3.6" 1260 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1261 | dependencies: 1262 | extsprintf "1.0.2" 1263 | 1264 | which-module@^1.0.0: 1265 | version "1.0.0" 1266 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1267 | 1268 | widest-line@^1.0.0: 1269 | version "1.0.0" 1270 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 1271 | dependencies: 1272 | string-width "^1.0.1" 1273 | 1274 | wrap-ansi@^2.0.0: 1275 | version "2.1.0" 1276 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1277 | dependencies: 1278 | string-width "^1.0.1" 1279 | strip-ansi "^3.0.1" 1280 | 1281 | write-file-atomic@^1.1.2: 1282 | version "1.3.1" 1283 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" 1284 | dependencies: 1285 | graceful-fs "^4.1.11" 1286 | imurmurhash "^0.1.4" 1287 | slide "^1.1.5" 1288 | 1289 | xdg-basedir@^2.0.0: 1290 | version "2.0.0" 1291 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" 1292 | dependencies: 1293 | os-homedir "^1.0.0" 1294 | 1295 | y18n@^3.2.1: 1296 | version "3.2.1" 1297 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1298 | 1299 | yargs-parser@^4.2.0: 1300 | version "4.2.1" 1301 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 1302 | dependencies: 1303 | camelcase "^3.0.0" 1304 | 1305 | yargs@^6.0.0: 1306 | version "6.6.0" 1307 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" 1308 | dependencies: 1309 | camelcase "^3.0.0" 1310 | cliui "^3.2.0" 1311 | decamelize "^1.1.1" 1312 | get-caller-file "^1.0.1" 1313 | os-locale "^1.4.0" 1314 | read-pkg-up "^1.0.1" 1315 | require-directory "^2.1.1" 1316 | require-main-filename "^1.0.1" 1317 | set-blocking "^2.0.0" 1318 | string-width "^1.0.2" 1319 | which-module "^1.0.0" 1320 | y18n "^3.2.1" 1321 | yargs-parser "^4.2.0" 1322 | -------------------------------------------------------------------------------- /typescript-template.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dimafeng/typescript-react-mobx-template/e290f4ac532c2641c1284849e556d7bae795f97e/typescript-template.gif --------------------------------------------------------------------------------