├── .editorconfig ├── .gitignore ├── LICENSE ├── NOTICE ├── README.md ├── docker-compose.yml ├── server ├── .dockerignore ├── config.yaml ├── migrations │ └── .gitkeep ├── ormconfig.json ├── package.json ├── src │ ├── config.ts │ ├── controllers │ │ ├── auth.ts │ │ ├── base.ts │ │ └── users.ts │ ├── index.ts │ ├── logging.ts │ ├── models │ │ ├── entity │ │ │ ├── session.ts │ │ │ └── user.ts │ │ └── subscriber │ │ │ └── .gitkeep │ ├── plugins │ │ ├── auth-cookie.ts │ │ └── good.ts │ ├── routes.ts │ └── server.ts ├── tsconfig.json ├── tslint.json ├── typings.d.ts ├── typings │ └── .gitkeep └── yarn.lock └── webapp ├── package.json ├── src ├── app │ ├── about │ │ ├── about.component.css │ │ ├── about.component.html │ │ └── about.component.ts │ ├── app.component.html │ ├── app.component.ts │ ├── app.module.ts │ ├── app.routes.ts │ ├── contact │ │ ├── contact-component.css │ │ ├── contact.component.html │ │ └── contact.component.ts │ ├── forms │ │ └── CustomValidators.ts │ ├── github │ │ ├── repo-browser │ │ │ ├── repo-browser.component.css │ │ │ ├── repo-browser.component.html │ │ │ └── repo-browser.component.ts │ │ ├── repo-detail │ │ │ ├── repo-detail.component.css │ │ │ ├── repo-detail.component.html │ │ │ └── repo-detail.component.ts │ │ ├── repo-list │ │ │ ├── repo-list.component.css │ │ │ ├── repo-list.component.html │ │ │ └── repo-list.component.ts │ │ └── shared │ │ │ └── github.service.ts │ └── home │ │ ├── home.component.css │ │ ├── home.component.html │ │ └── home.component.ts ├── custom-typings.d.ts ├── favicon.ico ├── index.html ├── main.browser.ts └── polyfills.browser.ts ├── tsconfig.aot.json ├── tsconfig.json ├── tslint.json ├── webpack.config.js └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | indent_style = space 8 | indent_size = 4 9 | end_of_line = lf 10 | insert_final_newline = true 11 | # trim_trailing_whitespace = true 12 | 13 | [*.md] 14 | insert_final_newline = false 15 | # trim_trailing_whitespace = false 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules/ 2 | **/dist/ 3 | **/npm-debug.log 4 | **/.vscode 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Michael Haselton 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | 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, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /NOTICE: -------------------------------------------------------------------------------- 1 | This application makes use of third-party code. 2 | 3 | angular-seed 4 | ============ 5 | 6 | The MIT License 7 | 8 | Copyright (c) 2010-2016 Google, Inc. http://angularjs.org 9 | 10 | Permission is hereby granted, free of charge, to any person obtaining a copy 11 | of this software and associated documentation files (the "Software"), to deal 12 | in the Software without restriction, including without limitation the rights 13 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | copies of the Software, and to permit persons to whom the Software is 15 | furnished to do so, subject to the following conditions: 16 | 17 | The above copyright notice and this permission notice shall be included in 18 | all copies or substantial portions of the Software. 19 | 20 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 23 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 26 | THE SOFTWARE. 27 | 28 | typeorm 29 | ======= 30 | 31 | The MIT License 32 | 33 | Copyright (c) 2015-2016 Yakdu. http://typeorm.github.io 34 | 35 | Permission is hereby granted, free of charge, to any person obtaining a copy 36 | of this software and associated documentation files (the "Software"), to deal 37 | in the Software without restriction, including without limitation the rights 38 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 39 | copies of the Software, and to permit persons to whom the Software is 40 | furnished to do so, subject to the following conditions: 41 | 42 | The above copyright notice and this permission notice shall be included in 43 | all copies or substantial portions of the Software. 44 | 45 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 46 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 47 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 48 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 49 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 50 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 51 | THE SOFTWARE. 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Typescript Seed 2 | 3 | ## Requirements 4 | 5 | - [Yarn](https://yarnpkg.com/lang/en/docs/install/#mac-tab) 6 | - [NodeJS (NPM)](https://nodejs.org/en/) 7 | - [Docker Client](https://www.docker.com/community-edition#/download) 8 | - Developed with [Visual Studio Code](https://code.visualstudio.com/) _(optional)_ 9 | 10 | ## Services 11 | 12 | - `docker-compose up` 13 | - postgres 14 | 15 | ## Server 16 | 17 | ### Install and Run 18 | 19 | - `yarn install` 20 | - `npm start` 21 | 22 | ### Migrations 23 | 24 | - `npm run migrate schema:sync` 25 | - `npm run migrate migrations:create` 26 | - `npm run migrate migrations:run` 27 | 28 | ### API 29 | 30 | Local Server: http://localhost:5000/ 31 | 32 | Endpoint|Method|URI 33 | --- | --- | --- 34 | Login | `POST` | `/login` 35 | Logout | `DELETE` | `/logout` 36 | Sign Up | `POST` | `/signup` 37 | Show User Info | `GET` | `/users/{id}` 38 | Show My User Info | `GET` | `/users/me` 39 | Update My User Info | `PUT` | `/users/me` 40 | 41 | ## WebApp 42 | 43 | - `yarn install` 44 | - `npm start` 45 | 46 | Local Server: http://localhost:3000/ 47 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '2' 2 | 3 | volumes: 4 | postgres_data_vol: 5 | external: false 6 | 7 | services: 8 | 9 | postgres: 10 | image: postgres:9.6 11 | command: |- 12 | /bin/bash -c " 13 | echo \"$$POSTGRES_INITDB\" > /docker-entrypoint-initdb.d/commands.sh && 14 | chmod +x /docker-entrypoint-initdb.d/commands.sh && 15 | /docker-entrypoint.sh postgres" 16 | ports: 17 | - 5432:5432 18 | environment: 19 | POSTGRES_DB: test 20 | POSTGRES_INITDB: | 21 | sed -i -e 's/max_connections.*/max_connections = 5000/' /var/lib/postgresql/data/postgresql.conf 22 | sed -i -e 's/#log_min_duration_statement = .*/log_min_duration_statement = 0/' /var/lib/postgresql/data/postgresql.conf 23 | volumes: 24 | - postgres_data_vol:/var/lib/postgresql/data/ 25 | stdin_open: true 26 | tty: true 27 | -------------------------------------------------------------------------------- /server/.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | **/bower_components 3 | **/node_modules 4 | -------------------------------------------------------------------------------- /server/config.yaml: -------------------------------------------------------------------------------- 1 | server: 2 | host: $SERVER_HOST 3 | port: $SERVER_PORT 4 | routes: 5 | cors: true 6 | 7 | app: 8 | base: $APP_BASE 9 | cookie_name: $APP_COOKIE_NAME 10 | cookie_secret: $APP_COOKIE_SECRET 11 | cookie_expiration: 30 # days 12 | encryption_password: $APP_ENCRYPTION_PASSWORD 13 | 14 | api: 15 | base: $API_BASE 16 | 17 | logging: 18 | console: 19 | level: debug 20 | prettyPrint: true 21 | colorize: true 22 | silent: false 23 | timestamp: true 24 | # humanReadableUnhandledException: true 25 | # handleExceptions: true 26 | 27 | APP_BASE: http://$SERVER_HOST:$SERVER_PORT 28 | APP_COOKIE_NAME: test 29 | APP_COOKIE_SECRET: password-should-be-32-characters 30 | APP_ENCRYPTION_PASSWORD: password-for-encrypted-data 31 | API_BASE: http://$SERVER_HOST:$SERVER_PORT 32 | SERVER_HOST: localhost 33 | SERVER_PORT: 5000 34 | -------------------------------------------------------------------------------- /server/migrations/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/server/migrations/.gitkeep -------------------------------------------------------------------------------- /server/ormconfig.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "default", 4 | "driver": { 5 | "type": "postgres", 6 | "host": "localhost", 7 | "port": 5432, 8 | "username": "postgres", 9 | "password": "", 10 | "database": "test" 11 | }, 12 | "autoSchemaSync": true, 13 | "logging": { 14 | "logQueries": false, 15 | "logOnlyFailedQueries": false, 16 | "logSchemaCreation": false 17 | }, 18 | "entities": ["./src/models/entity/*.ts"], 19 | "migrations": ["./migrations/*.ts"], 20 | "subscribers": ["./src/models/subscriber/*.ts"] 21 | } 22 | ] 23 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typescript-seed", 3 | "version": "0.0.1", 4 | "description": "Typescript Seed", 5 | "author": { 6 | "name": "Michael Haselton" 7 | }, 8 | "license": "MIT", 9 | "private": true, 10 | "repository": { 11 | "type": "git", 12 | "url": "git://github.com/icereval/typescript-seed" 13 | }, 14 | "scripts": { 15 | "start": "ts-node src/index.ts", 16 | "migrate": "ts-node node_modules/.bin/typeorm" 17 | }, 18 | "devDependencies": { 19 | "@types/bcrypt": "^1.0.0", 20 | "@types/boom": "^0.0.33", 21 | "@types/hapi": "^16.0.0", 22 | "@types/joi": "^10.0.0", 23 | "@types/nconf": "^0.0.33", 24 | "@types/node": "^7.0.5", 25 | "@types/pg": "^6.1.36", 26 | "@types/pg-pool": "^0.0.2", 27 | "@types/winston": "^2.2.0", 28 | "ts-node": "^2.1.0", 29 | "tslint": "^4.4.2", 30 | "typescript": "^2.1.6" 31 | }, 32 | "dependencies": { 33 | "bcrypt": "^1.0.2", 34 | "boom": "^4.2.0", 35 | "good": "^7.1.0", 36 | "good-console": "^6.4.0", 37 | "good-squeeze": "^5.0.1", 38 | "hapi": "^16.1.0", 39 | "hapi-auth-cookie": "^6.1.1", 40 | "hapi-config": "^0.2.2", 41 | "inert": "^4.1.0", 42 | "moment": "^2.17.1", 43 | "nconf": "^0.8.4", 44 | "nconf-yaml": "^1.0.2", 45 | "pg": "^6.1.2", 46 | "pg-pool": "^1.6.0", 47 | "purdy": "^2.2.0", 48 | "reflect-metadata": "^0.1.9", 49 | "request": "^2.79.0", 50 | "typeorm": "^0.0.9", 51 | "vision": "^4.1.1", 52 | "winston": "^2.3.1", 53 | "winston-console-formatter": "^0.3.1" 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /server/src/config.ts: -------------------------------------------------------------------------------- 1 | import * as nconf from 'nconf'; 2 | import * as nconfYaml from 'nconf-yaml'; 3 | import * as SmartConfig from 'hapi-config/lib/smart-config'; 4 | import { ConnectionOptions } from 'typeorm'; 5 | import { PlatformTools } from 'typeorm/platform/PlatformTools'; 6 | 7 | nconf.argv().env().file({ 8 | file: './config.yaml', 9 | format: nconfYaml, 10 | }); 11 | 12 | export default SmartConfig(nconf); 13 | 14 | export function getDatabaseConfig(): ConnectionOptions[] { 15 | // Source: https://github.com/typeorm/typeorm/blob/c12dc0002c84737b21fd2a1437e61fe9d3ed91fe/src/connection/ConnectionManager.ts#L362 16 | 17 | const path: string = undefined; 18 | 19 | const optionsArray: ConnectionOptions[] = PlatformTools.load(path || (PlatformTools.load("app-root-path").path + "/ormconfig.json")); 20 | if (!optionsArray) 21 | throw new Error(`Configuration ${path || "ormconfig.json"} was not found. Add connection configuration inside ormconfig.json file.`); 22 | 23 | // const promises = optionsArray 24 | // .filter(options => !options.environment || options.environment === PlatformTools.getEnvVariable("NODE_ENV")) // skip connection creation if environment is set in the options, and its not equal to the value in the NODE_ENV variable 25 | // .map(options => this.createAndConnectByConnectionOptions(options)); 26 | 27 | return optionsArray.filter(options => !options.environment || options.environment === PlatformTools.getEnvVariable("NODE_ENV")); 28 | } 29 | -------------------------------------------------------------------------------- /server/src/controllers/auth.ts: -------------------------------------------------------------------------------- 1 | import * as Hapi from 'hapi'; 2 | import * as Boom from 'boom'; 3 | import * as TypeOrm from 'typeorm'; 4 | import { Controller, IHttpResponse, HttpResponseRedirect, JsonResponse } from './base'; 5 | import Session from '../models/entity/session'; 6 | import User from '../models/entity/user'; 7 | import logger from '../logging'; 8 | import config from '../config'; 9 | 10 | 11 | export class AuthLoginController extends Controller { 12 | 13 | static handler(request: Hapi.Request, reply: Hapi.IReply): void { 14 | new AuthLoginController(request, reply).handleInternal(); 15 | } 16 | 17 | protected async post(): Promise { 18 | const username = this.request.params['username']; 19 | const password = this.request.params['password']; 20 | 21 | let user: User; 22 | try { 23 | user = await User.verify(username, password); 24 | } catch (e) { 25 | throw Boom.unauthorized(); 26 | } 27 | 28 | if (!user.active) { 29 | throw Boom.unauthorized(); 30 | } 31 | 32 | const session = await Session.create(user); 33 | this.request['cookieAuth'].set({ id: session.id }); 34 | 35 | return new JsonResponse({ 36 | id: user.id, 37 | fullname: user.fullname, 38 | active: user.active, 39 | }); 40 | } 41 | } 42 | 43 | export class AuthLogoutController extends Controller { 44 | 45 | static handler(request: Hapi.Request, reply: Hapi.IReply): void { 46 | new AuthLogoutController(request, reply).handleInternal(); 47 | } 48 | 49 | protected async delete(): Promise { 50 | // TODO: cleanup session data 51 | this.request['cookieAuth'].clear(); 52 | return new JsonResponse({ success: true }); 53 | } 54 | } 55 | 56 | export class AuthSignUpController extends Controller { 57 | 58 | static handler(request: Hapi.Request, reply: Hapi.IReply): void { 59 | new AuthSignUpController(request, reply).handleInternal(); 60 | } 61 | 62 | protected async post(): Promise { 63 | const user = await User.create({ 64 | username: this.request.params['username'], 65 | password: this.request.params['password'], 66 | fullname: this.request.params['fullname'], 67 | }); 68 | 69 | const session = await Session.create(user); 70 | this.request['cookieAuth'].set({ id: session.id }); 71 | 72 | return new JsonResponse({ 73 | id: user.id, 74 | fullname: user.fullname, 75 | active: user.active, 76 | }); 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /server/src/controllers/base.ts: -------------------------------------------------------------------------------- 1 | import * as Hapi from 'hapi'; 2 | import * as Boom from 'boom'; 3 | import logger from '../logging'; 4 | 5 | 6 | export interface IHttpResponse { 7 | data: any; 8 | code?: number; 9 | headers?: Map; 10 | handler(reply: Hapi.IReply): Hapi.Response 11 | } 12 | 13 | export class HttpResponse implements IHttpResponse { 14 | public data: any = null; 15 | public code = 200; 16 | public headers = new Map(); 17 | 18 | constructor(data?: any, code?: number, headers?: Map) { 19 | this.data = data || this.data; 20 | this.code = code || this.code; 21 | this.headers = headers || this.headers; 22 | } 23 | 24 | handler(reply: Hapi.IReply): Hapi.Response { 25 | const response = reply(this.data); 26 | 27 | if (this.code !== undefined) { 28 | response.code(this.code); 29 | } 30 | 31 | for (const [key, value] of this.headers) { 32 | response.header(key, value); 33 | } 34 | 35 | return response; 36 | } 37 | } 38 | 39 | export class HttpResponseRedirect extends HttpResponse { 40 | public uri: string; 41 | 42 | constructor(uri: any) { 43 | super(); 44 | this.uri = uri; 45 | } 46 | 47 | handler(reply: Hapi.IReply): Hapi.Response { 48 | return reply.redirect(this.uri); 49 | } 50 | } 51 | 52 | export class JsonResponse extends HttpResponse {} 53 | 54 | export abstract class Controller { 55 | protected request: Hapi.Request; 56 | protected reply: Hapi.IReply; 57 | 58 | constructor(request: Hapi.Request, reply: Hapi.IReply) { 59 | this.request = request; 60 | this.reply = reply; 61 | } 62 | 63 | private isBoomError(arg: any): arg is Boom.BoomError { 64 | return arg.isBoom !== undefined; 65 | } 66 | 67 | private responseHandler(response: IHttpResponse): void { 68 | response.handler(this.reply); 69 | } 70 | 71 | private errorHandler(e: Error): void { 72 | if (this.isBoomError(e)) { 73 | logger.debug(e.message, { name: e.name }); 74 | this.reply(e); 75 | } else { 76 | logger.error(e.message, { name: e.name, stack: e.stack }); 77 | this.reply(Boom.wrap(e)); 78 | } 79 | } 80 | 81 | protected handleInternal(): void { 82 | let promise: Promise; 83 | const method = this.request.method; 84 | 85 | if (method === 'delete') { 86 | promise = this.delete(); 87 | } else if (method === 'get') { 88 | promise = this.get(); 89 | } else if (method === 'patch') { 90 | promise = this.patch(); 91 | } else if (method === 'post') { 92 | promise = this.post(); 93 | } else if (method === 'put') { 94 | promise = this.put(); 95 | } else { 96 | this.reply(Boom.notImplemented()); 97 | return; 98 | } 99 | 100 | promise.then(this.responseHandler.bind(this)).catch(this.errorHandler.bind(this)); 101 | } 102 | 103 | protected async delete(): Promise { 104 | throw Boom.notImplemented(); 105 | } 106 | 107 | protected async get(): Promise { 108 | throw Boom.notImplemented(); 109 | } 110 | 111 | protected async patch(): Promise { 112 | throw Boom.notImplemented(); 113 | } 114 | 115 | protected async post(): Promise { 116 | throw Boom.notImplemented(); 117 | } 118 | 119 | protected async put(): Promise { 120 | throw Boom.notImplemented(); 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /server/src/controllers/users.ts: -------------------------------------------------------------------------------- 1 | import * as Hapi from 'hapi'; 2 | import * as Boom from 'boom'; 3 | import * as TypeOrm from 'typeorm'; 4 | import { Controller, IHttpResponse, JsonResponse } from './base'; 5 | import Session from '../models/entity/session'; 6 | import User from '../models/entity/user'; 7 | import logger from '../logging'; 8 | 9 | 10 | export class UsersController extends Controller { 11 | 12 | static handler(request: Hapi.Request, reply: Hapi.IReply): void { 13 | new UsersController(request, reply).handleInternal(); 14 | } 15 | 16 | protected async get(): Promise { 17 | const id = this.request.params['id']; 18 | 19 | const repo = TypeOrm.getConnection().getRepository(User); 20 | const user = await repo.findOne({ id: id, active: true }); 21 | if (!user) { 22 | throw Boom.notFound(); 23 | } 24 | 25 | return new JsonResponse({ 26 | id: user.id, 27 | fullname: user.fullname, 28 | active: user.active, 29 | }); 30 | } 31 | } 32 | 33 | export class UsersMeController extends Controller { 34 | 35 | static handler(request: Hapi.Request, reply: Hapi.IReply): void { 36 | new UsersMeController(request, reply).handleInternal(); 37 | } 38 | 39 | protected async get(): Promise { 40 | const session = this.request.auth.credentials; 41 | const user = session.user; 42 | 43 | return new JsonResponse({ 44 | id: user.id, 45 | fullname: user.fullname, 46 | active: user.active, 47 | }); 48 | } 49 | 50 | protected async put(): Promise { 51 | const session = this.request.auth.credentials; 52 | 53 | const user = await User.update({ 54 | id: session.user.id, 55 | fullname: this.request.payload.fullname, 56 | active: this.request.payload.active, 57 | password: this.request.payload.password, 58 | }); 59 | 60 | return new JsonResponse({ 61 | id: user.id, 62 | fullname: user.fullname, 63 | active: user.active, 64 | }); 65 | } 66 | } 67 | 68 | export default UsersController; 69 | -------------------------------------------------------------------------------- /server/src/index.ts: -------------------------------------------------------------------------------- 1 | import 'reflect-metadata'; 2 | import { getDatabaseConfig } from './config'; 3 | import { Server } from './server'; 4 | import { getConnectionManager, createConnection } from 'typeorm'; 5 | import logger from './logging'; 6 | 7 | 8 | async function main(): Promise { 9 | logger.info(`Running enviroment ${process.env.NODE_ENV || 'dev'}`); 10 | 11 | // setup the database connection w/ our pretty logger 12 | const databaseConfigs = getDatabaseConfig(); 13 | for (const databaseConfig of databaseConfigs) { 14 | (databaseConfig.logging).logger = logger.info; 15 | getConnectionManager().createAndConnect(databaseConfig) 16 | } 17 | 18 | const server = await Server.init(); 19 | await server.start(() => { 20 | logger.info('Server running at:', server.info.uri); 21 | }); 22 | 23 | server.once('stop', () => { 24 | getConnectionManager().get().close(); 25 | }); 26 | } 27 | 28 | main(); 29 | -------------------------------------------------------------------------------- /server/src/logging.ts: -------------------------------------------------------------------------------- 1 | import * as Purdy from 'purdy'; 2 | import * as Winston from 'winston'; 3 | import config from './config'; 4 | 5 | const loggingConfig = config.get('logging'); 6 | const transports: Winston.TransportInstance[] = []; 7 | 8 | if (loggingConfig.console) { 9 | transports.push(new Winston.transports.Console(loggingConfig.console)); 10 | } 11 | 12 | export default new Winston.Logger({ 13 | transports: transports, 14 | rewriters: [ 15 | ((level, msg, meta) => { Object.keys(meta).length > 0 ? Purdy(meta) : null }) 16 | ], 17 | }); 18 | 19 | -------------------------------------------------------------------------------- /server/src/models/entity/session.ts: -------------------------------------------------------------------------------- 1 | import * as TypeOrm from 'typeorm'; 2 | import User from './user'; 3 | import config from '../../config'; 4 | import logger from '../../logging'; 5 | 6 | 7 | @TypeOrm.Entity() 8 | export class Session { 9 | 10 | @TypeOrm.PrimaryColumn('bigint', { generated: true }) 11 | id: number; 12 | 13 | @TypeOrm.OneToOne(type => User) 14 | @TypeOrm.JoinColumn() 15 | user: User; 16 | 17 | static async create(user: User): Promise { 18 | const repo = TypeOrm.getConnection().getRepository(Session); 19 | const session = repo.create({ user }); 20 | 21 | return await repo.persist(session); 22 | } 23 | } 24 | 25 | export default Session; 26 | -------------------------------------------------------------------------------- /server/src/models/entity/user.ts: -------------------------------------------------------------------------------- 1 | import * as bcrypt from 'bcrypt'; 2 | import * as crypto from 'crypto'; 3 | import * as TypeOrm from 'typeorm'; 4 | import config from '../../config'; 5 | import logger from '../../logging'; 6 | 7 | 8 | @TypeOrm.Entity() 9 | @TypeOrm.Index("username_unique", (user: User) => [ user.username ], { unique: true }) 10 | export class User { 11 | 12 | @TypeOrm.PrimaryColumn('int', { generated: true }) 13 | id: number; 14 | 15 | @TypeOrm.Column('text') 16 | username: string; 17 | 18 | @TypeOrm.Column('text') 19 | password: string; 20 | 21 | @TypeOrm.Column('text') 22 | fullname: string; 23 | 24 | @TypeOrm.Column('boolean') 25 | active: boolean; 26 | 27 | static async create(user: User): Promise { 28 | const repo = TypeOrm.getConnection().getRepository(User); 29 | 30 | const exists = await repo.count({ username: user.username }); 31 | if (exists) { 32 | throw new Error('User Already Exists'); 33 | } 34 | 35 | let entity = repo.create(user); 36 | // Source: https://blogs.dropbox.com/tech/2016/09/how-dropbox-securely-stores-your-passwords/ 37 | entity.password = User.encrypt(await User.bcrypt(User.sha512(entity.password))); 38 | entity.active = true; 39 | entity = await repo.persist(entity); 40 | 41 | return entity; 42 | } 43 | 44 | static async update(user: User): Promise { 45 | const repo = TypeOrm.getConnection().getRepository(User); 46 | 47 | const queryBuilder = await repo.createQueryBuilder('user') 48 | .where('user.id = :id') 49 | .setParameters({ id: user.id }); 50 | 51 | let entity = await queryBuilder.getOne(); 52 | if (!entity) { 53 | throw new Error('User Not Fond'); 54 | } 55 | 56 | entity = repo.merge(entity, user); 57 | 58 | if (user.password) { 59 | // Source: https://blogs.dropbox.com/tech/2016/09/how-dropbox-securely-stores-your-passwords/ 60 | entity.password = User.encrypt(await User.bcrypt(User.sha512(entity.password))); 61 | } 62 | 63 | return await repo.persist(entity); 64 | } 65 | 66 | static async verify(username: string, password: string): Promise { 67 | const repo = TypeOrm.getConnection().getRepository(User); 68 | 69 | return await repo.transaction(async (repo) => { 70 | const user = await repo.findOne({ username }); 71 | if (!user) { 72 | throw new Error('User Not Found'); 73 | } 74 | 75 | const validPassword = await new Promise((resolve, reject) => { 76 | // TODO: Ensure constant time bcrypt 77 | bcrypt.compare(User.sha512(password), User.decrypt(user.password), ((err, same) => resolve(same))); 78 | }); 79 | 80 | if (!validPassword) { 81 | throw new Error('Invalid Password'); 82 | } 83 | 84 | return user; 85 | }); 86 | } 87 | 88 | private static sha512(data: string): string { 89 | return crypto.createHash('sha512') 90 | .update(data) 91 | .digest() 92 | .toString(); 93 | } 94 | 95 | private static async bcrypt(data: string): Promise { 96 | return await new Promise((resolve, reject) => { 97 | bcrypt.hash(data, 10, (err, hash) => resolve(hash)); 98 | }); 99 | } 100 | 101 | private static encrypt(data: string): string { 102 | let cipher = crypto.createCipher('aes256', config.get('app:encryption_password')); 103 | 104 | let encrypted = cipher.update(data, 'utf8', 'binary'); 105 | encrypted += cipher.final('binary'); 106 | 107 | return encrypted; 108 | } 109 | 110 | private static decrypt(data: string): string { 111 | let decipher = crypto.createDecipher('aes256', config.get('app:encryption_password')); 112 | 113 | let decrypted = decipher.update(data, 'binary', 'utf8'); 114 | decrypted += decipher.final('utf8'); 115 | 116 | return decrypted; 117 | } 118 | } 119 | 120 | export default User; 121 | -------------------------------------------------------------------------------- /server/src/models/subscriber/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/server/src/models/subscriber/.gitkeep -------------------------------------------------------------------------------- /server/src/plugins/auth-cookie.ts: -------------------------------------------------------------------------------- 1 | import * as hapi from 'hapi'; 2 | import * as hapiAuthCookie from 'hapi-auth-cookie'; 3 | import * as moment from 'moment'; 4 | import * as TypeOrm from 'typeorm'; 5 | import logger from '../logging'; 6 | import config from '../config'; 7 | import Session from '../models/entity/session'; 8 | import User from '../models/entity/user'; 9 | 10 | 11 | export default class AuthCookiePlugin { 12 | 13 | public static register(server: hapi.Server): Promise { 14 | return new Promise((resolve, reject) => { 15 | server.register({ 16 | register: hapiAuthCookie, 17 | }, (error) => { 18 | if (error) { 19 | logger.error('error', error); 20 | return reject(error); 21 | } 22 | 23 | server.auth.strategy('session', 'cookie', 'try', { 24 | cookie: config.get('app:cookie_name'), 25 | password: config.get('app:cookie_secret'), 26 | isSecure: false, 27 | ttl: moment().add(config.get('app:cookie_expiration'), 'days').valueOf(), 28 | validateFunc: function (request, session, callback) { 29 | TypeOrm.getConnection() 30 | .getRepository(Session) 31 | .createQueryBuilder('session') 32 | .innerJoinAndMapOne('session.user', User, 'user', 'user.id=session.user') 33 | .where('session.id = :id') 34 | .setParameter('id', session.id) 35 | .getOne() 36 | .then((entity) => { 37 | if (!entity) { 38 | logger.debug('session.id %d could not be found', session.id); 39 | return callback(null, false); 40 | } 41 | 42 | logger.debug('session.id %d loaded', session.id); 43 | return callback(null, true, entity); 44 | }, (err) => { 45 | return callback(err, false); 46 | }); 47 | } 48 | }); 49 | 50 | resolve(); 51 | }); 52 | }) 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /server/src/plugins/good.ts: -------------------------------------------------------------------------------- 1 | import * as hapi from 'hapi'; 2 | import * as good from 'good'; 3 | import logger from '../logging' 4 | 5 | 6 | export default class GoodPlugin { 7 | public static register(server: hapi.Server): Promise { 8 | return new Promise((resolve, reject) => { 9 | server.register({ 10 | register: good, 11 | options: { 12 | ops: { 13 | interval: 1000, 14 | }, 15 | reporters: { 16 | myConsoleReporter: [{ 17 | module: 'good-squeeze', 18 | name: 'Squeeze', 19 | args: [{ log: '*', response: '*' }] 20 | }, { 21 | module: 'good-console', 22 | args: [{format: 'YYYY-MM-DDTHH:mm:ss.SSS[Z]'}] 23 | }, 'stdout'], 24 | } 25 | } 26 | }, (error) => { 27 | if (error) { 28 | logger.error('error', error); 29 | return reject(error); 30 | } 31 | }); 32 | 33 | resolve(); 34 | }); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /server/src/routes.ts: -------------------------------------------------------------------------------- 1 | import * as Hapi from 'hapi'; 2 | import * as Joi from 'joi'; 3 | import { AuthLoginController, AuthLogoutController, AuthSignUpController } from './controllers/auth'; 4 | import { UsersController, UsersMeController } from './controllers/users'; 5 | 6 | 7 | export default class Routes { 8 | 9 | public static async init(server: Hapi.Server): Promise { 10 | server.route({ method: [ 'POST' ], path: '/login', handler: AuthLoginController.handler, config: { 11 | validate: { 12 | payload: Joi.object({ 13 | username: Joi.string().required(), 14 | password: Joi.string().required(), 15 | }) 16 | } 17 | }}); 18 | server.route({ method: [ 'DELETE' ], path: '/logout', handler: AuthLogoutController.handler }); 19 | server.route({ method: [ 'POST' ], path: '/signup', handler: AuthSignUpController.handler, config: { 20 | validate: { 21 | payload: Joi.object({ 22 | username: Joi.string().required(), 23 | password: Joi.string().required(), 24 | fullname: Joi.string().required(), 25 | }) 26 | } 27 | }}); 28 | 29 | server.route({ method: [ 'GET' ], path: '/users/me', handler: UsersMeController.handler, config: { auth: { mode: 'required' } } }); 30 | server.route({ method: [ 'PUT' ], path: '/users/me', handler: UsersMeController.handler, config: { 31 | auth: { mode: 'required' }, 32 | validate: { 33 | payload: Joi.object({ 34 | fullname: Joi.string(), 35 | active: Joi.boolean(), 36 | password: Joi.string(), 37 | }) 38 | } 39 | }}); 40 | server.route({ method: [ 'GET' ], path: '/users/{id}', handler: UsersController.handler, config: { 41 | validate: { 42 | params: { 43 | id: Joi.number().required() 44 | } 45 | } 46 | }}); 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /server/src/server.ts: -------------------------------------------------------------------------------- 1 | import { Server as HapiServer } from 'hapi'; 2 | import GoodPlugin from './plugins/good'; 3 | import AuthCookiePlugin from './plugins/auth-cookie'; 4 | import { getConnection } from 'typeorm'; 5 | import Routes from './routes'; 6 | import config from './config'; 7 | 8 | export class Server { 9 | public static async init(): Promise { 10 | const server = new HapiServer(); 11 | server.connection({ 12 | host: config.get('server:host'), 13 | port: config.get('server:port'), 14 | router: { 15 | isCaseSensitive: false, 16 | stripTrailingSlash: true, 17 | }, 18 | routes: { 19 | cors: config.get('server:routes:cors'), 20 | }, 21 | }); 22 | 23 | await GoodPlugin.register(server); 24 | await AuthCookiePlugin.register(server); 25 | 26 | await Routes.init(server); 27 | 28 | return server; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "declaration": false, 5 | "emitDecoratorMetadata": true, 6 | "experimentalDecorators": true, 7 | "module": "commonjs", 8 | "moduleResolution": "node", 9 | "noEmitOnError": true, 10 | "noImplicitAny": false, 11 | "target": "es6" 12 | }, 13 | "exclude": [ 14 | "node_modules", 15 | "typings/browser", 16 | "typings/browser.d.ts" 17 | ] 18 | } 19 | -------------------------------------------------------------------------------- /server/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": [ 3 | "node_modules", 4 | "typtings" 5 | ], 6 | "rules": { 7 | "align": [ 8 | true, 9 | "parameters", 10 | "statements" 11 | ], 12 | "ban": false, 13 | "class-name": true, 14 | "comment-format": [ 15 | true, 16 | "check-space" 17 | ], 18 | "curly": false, 19 | "eofline": true, 20 | "forin": true, 21 | "indent": [ 22 | true, 23 | 2 24 | ], 25 | "interface-name": false, 26 | "jsdoc-format": true, 27 | "label-position": true, 28 | "label-undefined": true, 29 | "max-line-length": [ 30 | true, 31 | 140 32 | ], 33 | "member-ordering": [ 34 | true, 35 | "public-before-private", 36 | "static-before-instance", 37 | "variables-before-functions" 38 | ], 39 | "no-any": false, 40 | "no-arg": true, 41 | "no-bitwise": true, 42 | "no-construct": true, 43 | "no-constructor-vars": true, 44 | "no-debugger": true, 45 | "no-duplicate-key": true, 46 | "no-shadowed-variable": true, 47 | "no-duplicate-variable": true, 48 | "no-empty": true, 49 | "no-eval": true, 50 | "no-require-imports": true, 51 | "no-string-literal": true, 52 | "no-switch-case-fall-through": true, 53 | "trailing-comma": [true, { 54 | "singleline": "never", 55 | "multiline": "always" 56 | }], 57 | "no-trailing-whitespace": true, 58 | "no-unreachable": true, 59 | "no-unused-expression": true, 60 | "no-unused-variable": true, 61 | "no-use-before-declare": true, 62 | "no-var-keyword": true, 63 | "no-var-requires": false, 64 | "one-line": [ 65 | true, 66 | "check-open-brace", 67 | "check-catch", 68 | "check-else", 69 | "check-whitespace" 70 | ], 71 | "quotemark": [ 72 | true, 73 | "single" 74 | ], 75 | "radix": true, 76 | "semicolon": true, 77 | "switch-default": true, 78 | "triple-equals": [ 79 | true, 80 | "allow-null-check" 81 | ], 82 | "typedef": [ 83 | true, 84 | "call-signature", 85 | "parameter", 86 | "property-declaration", 87 | "member-variable-declaration" 88 | ], 89 | "typedef-whitespace": [ 90 | true, 91 | { 92 | "call-signature": "nospace", 93 | "index-signature": "nospace", 94 | "parameter": "nospace", 95 | "property-declaration": "nospace", 96 | "variable-declaration": "nospace" 97 | } 98 | ], 99 | "use-strict": [ 100 | false, 101 | "check-module", 102 | "check-function" 103 | ], 104 | "variable-name": false, 105 | "whitespace": [ 106 | true, 107 | "check-branch", 108 | "check-decl", 109 | "check-operator", 110 | "check-separator", 111 | "check-type" 112 | ] 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /server/typings.d.ts: -------------------------------------------------------------------------------- 1 | ///// 2 | -------------------------------------------------------------------------------- /server/typings/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/server/typings/.gitkeep -------------------------------------------------------------------------------- /server/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/bcrypt@^1.0.0": 6 | version "1.0.0" 7 | resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-1.0.0.tgz#2c523da191db7d41c06d17de235335c985effe9b" 8 | 9 | "@types/boom@^0.0.33": 10 | version "0.0.33" 11 | resolved "https://registry.yarnpkg.com/@types/boom/-/boom-0.0.33.tgz#5fffdd8a2f430d9e85e664bb1abaa3932b6a4295" 12 | dependencies: 13 | "@types/node" "*" 14 | 15 | "@types/hapi@^16.0.0": 16 | version "16.0.0" 17 | resolved "https://registry.yarnpkg.com/@types/hapi/-/hapi-16.0.0.tgz#d55a1697e9e1a0c23fb7a9a9ee6ab77781b67d71" 18 | dependencies: 19 | "@types/node" "*" 20 | 21 | "@types/joi@^10.0.0": 22 | version "10.0.0" 23 | resolved "https://registry.yarnpkg.com/@types/joi/-/joi-10.0.0.tgz#cfc8ac03b6d9e89b31577d6742b3d489a7aefd9c" 24 | 25 | "@types/nconf@^0.0.33": 26 | version "0.0.33" 27 | resolved "https://registry.yarnpkg.com/@types/nconf/-/nconf-0.0.33.tgz#725f11736f480090256c11cc1d0d5d5453c84da2" 28 | 29 | "@types/node@*", "@types/node@^7.0.5": 30 | version "7.0.5" 31 | resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.5.tgz#96a0f0a618b7b606f1ec547403c00650210bfbb7" 32 | 33 | "@types/pg-pool@^0.0.2": 34 | version "0.0.2" 35 | resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-0.0.2.tgz#6b7917d508809d2df1debf32712a48638ca80565" 36 | dependencies: 37 | "@types/pg" "*" 38 | 39 | "@types/pg-types@*": 40 | version "1.11.1" 41 | resolved "https://registry.yarnpkg.com/@types/pg-types/-/pg-types-1.11.1.tgz#eab15cbe339dd8009112b2a6e225d78165e66f54" 42 | dependencies: 43 | moment ">=2.14.0" 44 | 45 | "@types/pg@*", "@types/pg@^6.1.36": 46 | version "6.1.36" 47 | resolved "https://registry.yarnpkg.com/@types/pg/-/pg-6.1.36.tgz#26f6bc6a17324cf455f4af0e9826fbc09bdebb0b" 48 | dependencies: 49 | "@types/node" "*" 50 | "@types/pg-types" "*" 51 | 52 | "@types/winston@^2.2.0": 53 | version "2.2.0" 54 | resolved "https://registry.yarnpkg.com/@types/winston/-/winston-2.2.0.tgz#3ca062f1cb8bb5fbcc30d450d5621b57a6e9d42b" 55 | dependencies: 56 | "@types/node" "*" 57 | 58 | abbrev@1: 59 | version "1.1.0" 60 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" 61 | 62 | accept@2.x.x: 63 | version "2.1.3" 64 | resolved "https://registry.yarnpkg.com/accept/-/accept-2.1.3.tgz#ab0f5bda4c449bbe926aea607b3522562f5acf86" 65 | dependencies: 66 | boom "4.x.x" 67 | hoek "4.x.x" 68 | 69 | ammo@2.x.x: 70 | version "2.0.3" 71 | resolved "https://registry.yarnpkg.com/ammo/-/ammo-2.0.3.tgz#914bbcf65b043ed0f58a8a9d0196e250ec51e6a7" 72 | dependencies: 73 | boom "4.x.x" 74 | hoek "4.x.x" 75 | 76 | ansi-align@^1.1.0: 77 | version "1.1.0" 78 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-1.1.0.tgz#2f0c1658829739add5ebb15e6b0c6e3423f016ba" 79 | dependencies: 80 | string-width "^1.0.1" 81 | 82 | ansi-regex@^2.0.0, ansi-regex@^2.1.1: 83 | version "2.1.1" 84 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 85 | 86 | ansi-styles@^2.2.1: 87 | version "2.2.1" 88 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 89 | 90 | ansi-styles@~1.0.0: 91 | version "1.0.0" 92 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178" 93 | 94 | any-promise@^1.3.0: 95 | version "1.3.0" 96 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 97 | 98 | ap@~0.2.0: 99 | version "0.2.0" 100 | resolved "https://registry.yarnpkg.com/ap/-/ap-0.2.0.tgz#ae0942600b29912f0d2b14ec60c45e8f330b6110" 101 | 102 | app-root-path@^2.0.1: 103 | version "2.0.1" 104 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" 105 | 106 | aproba@^1.0.3: 107 | version "1.1.1" 108 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" 109 | 110 | are-we-there-yet@~1.1.2: 111 | version "1.1.2" 112 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.2.tgz#80e470e95a084794fe1899262c5667c6e88de1b3" 113 | dependencies: 114 | delegates "^1.0.0" 115 | readable-stream "^2.0.0 || ^1.1.13" 116 | 117 | argparse@^1.0.7: 118 | version "1.0.9" 119 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 120 | dependencies: 121 | sprintf-js "~1.0.2" 122 | 123 | arrify@^1.0.0: 124 | version "1.0.1" 125 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 126 | 127 | asn1@~0.2.3: 128 | version "0.2.3" 129 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 130 | 131 | assert-plus@^0.2.0: 132 | version "0.2.0" 133 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 134 | 135 | assert-plus@^1.0.0: 136 | version "1.0.0" 137 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 138 | 139 | async@^1.4.0: 140 | version "1.5.2" 141 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 142 | 143 | async@~1.0.0: 144 | version "1.0.0" 145 | resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" 146 | 147 | asynckit@^0.4.0: 148 | version "0.4.0" 149 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 150 | 151 | aws-sign2@~0.6.0: 152 | version "0.6.0" 153 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 154 | 155 | aws4@^1.2.1: 156 | version "1.6.0" 157 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 158 | 159 | b64@3.x.x: 160 | version "3.0.2" 161 | resolved "https://registry.yarnpkg.com/b64/-/b64-3.0.2.tgz#7a9d60466adf7b8de114cbdf651a5fdfcc90894d" 162 | 163 | babel-code-frame@^6.20.0: 164 | version "6.22.0" 165 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" 166 | dependencies: 167 | chalk "^1.1.0" 168 | esutils "^2.0.2" 169 | js-tokens "^3.0.0" 170 | 171 | balanced-match@^0.4.1: 172 | version "0.4.2" 173 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 174 | 175 | bcrypt-pbkdf@^1.0.0: 176 | version "1.0.1" 177 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 178 | dependencies: 179 | tweetnacl "^0.14.3" 180 | 181 | bcrypt@^1.0.2: 182 | version "1.0.2" 183 | resolved "https://registry.yarnpkg.com/bcrypt/-/bcrypt-1.0.2.tgz#d05fc5d223173e0e28ec381c0f00cc25ffaf2736" 184 | dependencies: 185 | bindings "1.2.1" 186 | nan "2.5.0" 187 | node-pre-gyp "0.6.32" 188 | 189 | bindings@1.2.1: 190 | version "1.2.1" 191 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" 192 | 193 | block-stream@*: 194 | version "0.0.9" 195 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 196 | dependencies: 197 | inherits "~2.0.0" 198 | 199 | boom@2.x.x: 200 | version "2.10.1" 201 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 202 | dependencies: 203 | hoek "2.x.x" 204 | 205 | boom@3.x.x: 206 | version "3.2.2" 207 | resolved "https://registry.yarnpkg.com/boom/-/boom-3.2.2.tgz#0f0cc5d04adc5003b8c7d71f42cca7271fef0e78" 208 | dependencies: 209 | hoek "4.x.x" 210 | 211 | boom@4.x.x, boom@^4.2.0: 212 | version "4.2.0" 213 | resolved "https://registry.yarnpkg.com/boom/-/boom-4.2.0.tgz#c1a74174b11fbba223f6162d4fd8851a1b82a536" 214 | dependencies: 215 | hoek "4.x.x" 216 | 217 | boxen@^0.6.0: 218 | version "0.6.0" 219 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-0.6.0.tgz#8364d4248ac34ff0ef1b2f2bf49a6c60ce0d81b6" 220 | dependencies: 221 | ansi-align "^1.1.0" 222 | camelcase "^2.1.0" 223 | chalk "^1.1.1" 224 | cli-boxes "^1.0.0" 225 | filled-array "^1.0.0" 226 | object-assign "^4.0.1" 227 | repeating "^2.0.0" 228 | string-width "^1.0.1" 229 | widest-line "^1.0.0" 230 | 231 | brace-expansion@^1.0.0: 232 | version "1.1.6" 233 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 234 | dependencies: 235 | balanced-match "^0.4.1" 236 | concat-map "0.0.1" 237 | 238 | buffer-shims@^1.0.0: 239 | version "1.0.0" 240 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 241 | 242 | buffer-writer@1.0.1: 243 | version "1.0.1" 244 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" 245 | 246 | builtin-modules@^1.0.0: 247 | version "1.1.1" 248 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 249 | 250 | call@4.x.x: 251 | version "4.0.0" 252 | resolved "https://registry.yarnpkg.com/call/-/call-4.0.0.tgz#cd29381a98046a132db26e2628e70bd8321a1ddf" 253 | dependencies: 254 | boom "4.x.x" 255 | hoek "4.x.x" 256 | 257 | camelcase@^2.0.1, camelcase@^2.1.0: 258 | version "2.1.1" 259 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 260 | 261 | camelcase@^3.0.0: 262 | version "3.0.0" 263 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 264 | 265 | capture-stack-trace@^1.0.0: 266 | version "1.0.0" 267 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 268 | 269 | caseless@~0.11.0: 270 | version "0.11.0" 271 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" 272 | 273 | catbox-memory@2.x.x: 274 | version "2.0.4" 275 | resolved "https://registry.yarnpkg.com/catbox-memory/-/catbox-memory-2.0.4.tgz#433e255902caf54233d1286429c8f4df14e822d5" 276 | dependencies: 277 | hoek "4.x.x" 278 | 279 | catbox@7.x.x: 280 | version "7.1.3" 281 | resolved "https://registry.yarnpkg.com/catbox/-/catbox-7.1.3.tgz#9817edec5a921743282addfc9c45ace52847eebb" 282 | dependencies: 283 | boom "4.x.x" 284 | hoek "4.x.x" 285 | joi "10.x.x" 286 | 287 | chalk@0.4.x: 288 | version "0.4.0" 289 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" 290 | dependencies: 291 | ansi-styles "~1.0.0" 292 | has-color "~0.1.0" 293 | strip-ansi "~0.1.0" 294 | 295 | chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: 296 | version "1.1.3" 297 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 298 | dependencies: 299 | ansi-styles "^2.2.1" 300 | escape-string-regexp "^1.0.2" 301 | has-ansi "^2.0.0" 302 | strip-ansi "^3.0.0" 303 | supports-color "^2.0.0" 304 | 305 | cli-boxes@^1.0.0: 306 | version "1.0.0" 307 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 308 | 309 | cli-color@^1.1.0: 310 | version "1.2.0" 311 | resolved "https://registry.yarnpkg.com/cli-color/-/cli-color-1.2.0.tgz#3a5ae74fd76b6267af666e69e2afbbd01def34d1" 312 | dependencies: 313 | ansi-regex "^2.1.1" 314 | d "1" 315 | es5-ext "^0.10.12" 316 | es6-iterator "2" 317 | memoizee "^0.4.3" 318 | timers-ext "0.1" 319 | 320 | cliui@^3.0.3, cliui@^3.2.0: 321 | version "3.2.0" 322 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 323 | dependencies: 324 | string-width "^1.0.1" 325 | strip-ansi "^3.0.1" 326 | wrap-ansi "^2.0.0" 327 | 328 | code-point-at@^1.0.0: 329 | version "1.1.0" 330 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 331 | 332 | colors@1.0.x: 333 | version "1.0.3" 334 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 335 | 336 | colors@^1.1.2: 337 | version "1.1.2" 338 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" 339 | 340 | combined-stream@^1.0.5, combined-stream@~1.0.5: 341 | version "1.0.5" 342 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 343 | dependencies: 344 | delayed-stream "~1.0.0" 345 | 346 | commander@^2.9.0: 347 | version "2.9.0" 348 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 349 | dependencies: 350 | graceful-readlink ">= 1.0.0" 351 | 352 | concat-map@0.0.1: 353 | version "0.0.1" 354 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 355 | 356 | configstore@^2.0.0: 357 | version "2.1.0" 358 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-2.1.0.tgz#737a3a7036e9886102aa6099e47bb33ab1aba1a1" 359 | dependencies: 360 | dot-prop "^3.0.0" 361 | graceful-fs "^4.1.2" 362 | mkdirp "^0.5.0" 363 | object-assign "^4.0.1" 364 | os-tmpdir "^1.0.0" 365 | osenv "^0.1.0" 366 | uuid "^2.0.1" 367 | write-file-atomic "^1.1.2" 368 | xdg-basedir "^2.0.0" 369 | 370 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 371 | version "1.1.0" 372 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 373 | 374 | content@3.x.x: 375 | version "3.0.3" 376 | resolved "https://registry.yarnpkg.com/content/-/content-3.0.3.tgz#000f8a01371b95c66afe99be9390fa6cb91aa87a" 377 | dependencies: 378 | boom "4.x.x" 379 | 380 | core-util-is@~1.0.0: 381 | version "1.0.2" 382 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 383 | 384 | create-error-class@^3.0.1: 385 | version "3.0.2" 386 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 387 | dependencies: 388 | capture-stack-trace "^1.0.0" 389 | 390 | cryptiles@2.x.x: 391 | version "2.0.5" 392 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 393 | dependencies: 394 | boom "2.x.x" 395 | 396 | cryptiles@3.x.x: 397 | version "3.1.1" 398 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.1.tgz#86a9203f7367a0e9324bc7555ff0fcf5f81979ee" 399 | dependencies: 400 | boom "4.x.x" 401 | 402 | cycle@1.0.x: 403 | version "1.0.3" 404 | resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" 405 | 406 | d@1: 407 | version "1.0.0" 408 | resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" 409 | dependencies: 410 | es5-ext "^0.10.9" 411 | 412 | d@^0.1.1, d@~0.1.1: 413 | version "0.1.1" 414 | resolved "https://registry.yarnpkg.com/d/-/d-0.1.1.tgz#da184c535d18d8ee7ba2aa229b914009fae11309" 415 | dependencies: 416 | es5-ext "~0.10.2" 417 | 418 | dashdash@^1.12.0: 419 | version "1.14.1" 420 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 421 | dependencies: 422 | assert-plus "^1.0.0" 423 | 424 | debug@~2.2.0: 425 | version "2.2.0" 426 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" 427 | dependencies: 428 | ms "0.7.1" 429 | 430 | decamelize@^1.1.1: 431 | version "1.2.0" 432 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 433 | 434 | deep-extend@~0.4.0: 435 | version "0.4.1" 436 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.1.tgz#efe4113d08085f4e6f9687759810f807469e2253" 437 | 438 | delayed-stream@~1.0.0: 439 | version "1.0.0" 440 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 441 | 442 | delegates@^1.0.0: 443 | version "1.0.0" 444 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 445 | 446 | diff@^3.0.1, diff@^3.1.0: 447 | version "3.2.0" 448 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" 449 | 450 | dot-prop@^3.0.0: 451 | version "3.0.0" 452 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 453 | dependencies: 454 | is-obj "^1.0.0" 455 | 456 | duplexer2@^0.1.4: 457 | version "0.1.4" 458 | resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" 459 | dependencies: 460 | readable-stream "^2.0.2" 461 | 462 | duplexify@^3.1.2: 463 | version "3.5.0" 464 | resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" 465 | dependencies: 466 | end-of-stream "1.0.0" 467 | inherits "^2.0.1" 468 | readable-stream "^2.0.0" 469 | stream-shift "^1.0.0" 470 | 471 | ecc-jsbn@~0.1.1: 472 | version "0.1.1" 473 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 474 | dependencies: 475 | jsbn "~0.1.0" 476 | 477 | end-of-stream@1.0.0: 478 | version "1.0.0" 479 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" 480 | dependencies: 481 | once "~1.3.0" 482 | 483 | end-of-stream@^1.1.0: 484 | version "1.1.0" 485 | resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.1.0.tgz#e9353258baa9108965efc41cb0ef8ade2f3cfb07" 486 | dependencies: 487 | once "~1.3.0" 488 | 489 | error-ex@^1.2.0: 490 | version "1.3.0" 491 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 492 | dependencies: 493 | is-arrayish "^0.2.1" 494 | 495 | es5-ext@^0.10.12, es5-ext@^0.10.7, es5-ext@^0.10.8, es5-ext@^0.10.9, es5-ext@~0.10.11, es5-ext@~0.10.2, es5-ext@~0.10.7: 496 | version "0.10.12" 497 | resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.12.tgz#aa84641d4db76b62abba5e45fd805ecbab140047" 498 | dependencies: 499 | es6-iterator "2" 500 | es6-symbol "~3.1" 501 | 502 | es6-iterator@2: 503 | version "2.0.0" 504 | resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.0.tgz#bd968567d61635e33c0b80727613c9cb4b096bac" 505 | dependencies: 506 | d "^0.1.1" 507 | es5-ext "^0.10.7" 508 | es6-symbol "3" 509 | 510 | es6-symbol@3, es6-symbol@~3.1: 511 | version "3.1.0" 512 | resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.0.tgz#94481c655e7a7cad82eba832d97d5433496d7ffa" 513 | dependencies: 514 | d "~0.1.1" 515 | es5-ext "~0.10.11" 516 | 517 | es6-weak-map@^2.0.1: 518 | version "2.0.1" 519 | resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.1.tgz#0d2bbd8827eb5fb4ba8f97fbfea50d43db21ea81" 520 | dependencies: 521 | d "^0.1.1" 522 | es5-ext "^0.10.8" 523 | es6-iterator "2" 524 | es6-symbol "3" 525 | 526 | escape-string-regexp@^1.0.2: 527 | version "1.0.5" 528 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 529 | 530 | esprima@^3.1.1: 531 | version "3.1.3" 532 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 533 | 534 | esutils@^2.0.2: 535 | version "2.0.2" 536 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 537 | 538 | event-emitter@^0.3.4: 539 | version "0.3.4" 540 | resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.4.tgz#8d63ddfb4cfe1fae3b32ca265c4c720222080bb5" 541 | dependencies: 542 | d "~0.1.1" 543 | es5-ext "~0.10.7" 544 | 545 | extend@~3.0.0: 546 | version "3.0.0" 547 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.0.tgz#5a474353b9f3353ddd8176dfd37b91c83a46f1d4" 548 | 549 | extsprintf@1.0.2: 550 | version "1.0.2" 551 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" 552 | 553 | eyes@0.1.x: 554 | version "0.1.8" 555 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 556 | 557 | fast-safe-stringify@1.1.0: 558 | version "1.1.0" 559 | resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.1.0.tgz#4ca98c502e00c387ca1b0e7184e955718bf512e8" 560 | 561 | figlet@^1.1.1: 562 | version "1.2.0" 563 | resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.2.0.tgz#6c46537378fab649146b5a6143dda019b430b410" 564 | 565 | filled-array@^1.0.0: 566 | version "1.1.0" 567 | resolved "https://registry.yarnpkg.com/filled-array/-/filled-array-1.1.0.tgz#c3c4f6c663b923459a9aa29912d2d031f1507f84" 568 | 569 | find-up@^1.0.0: 570 | version "1.1.2" 571 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 572 | dependencies: 573 | path-exists "^2.0.0" 574 | pinkie-promise "^2.0.0" 575 | 576 | findup-sync@~0.3.0: 577 | version "0.3.0" 578 | resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" 579 | dependencies: 580 | glob "~5.0.0" 581 | 582 | forever-agent@~0.6.1: 583 | version "0.6.1" 584 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 585 | 586 | form-data@~2.1.1: 587 | version "2.1.2" 588 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.2.tgz#89c3534008b97eada4cbb157d58f6f5df025eae4" 589 | dependencies: 590 | asynckit "^0.4.0" 591 | combined-stream "^1.0.5" 592 | mime-types "^2.1.12" 593 | 594 | fs.realpath@^1.0.0: 595 | version "1.0.0" 596 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 597 | 598 | fstream-ignore@~1.0.5: 599 | version "1.0.5" 600 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 601 | dependencies: 602 | fstream "^1.0.0" 603 | inherits "2" 604 | minimatch "^3.0.0" 605 | 606 | fstream@^1.0.0, fstream@^1.0.2, fstream@~1.0.10: 607 | version "1.0.10" 608 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.10.tgz#604e8a92fe26ffd9f6fae30399d4984e1ab22822" 609 | dependencies: 610 | graceful-fs "^4.1.2" 611 | inherits "~2.0.0" 612 | mkdirp ">=0.5 0" 613 | rimraf "2" 614 | 615 | gauge@~2.7.1: 616 | version "2.7.3" 617 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.3.tgz#1c23855f962f17b3ad3d0dc7443f304542edfe09" 618 | dependencies: 619 | aproba "^1.0.3" 620 | console-control-strings "^1.0.0" 621 | has-unicode "^2.0.0" 622 | object-assign "^4.1.0" 623 | signal-exit "^3.0.0" 624 | string-width "^1.0.1" 625 | strip-ansi "^3.0.1" 626 | wide-align "^1.1.0" 627 | 628 | generate-function@^2.0.0: 629 | version "2.0.0" 630 | resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" 631 | 632 | generate-object-property@^1.1.0: 633 | version "1.2.0" 634 | resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" 635 | dependencies: 636 | is-property "^1.0.0" 637 | 638 | generic-pool@2.4.2: 639 | version "2.4.2" 640 | resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.2.tgz#886bc5bf0beb7db96e81bcbba078818de5a62683" 641 | 642 | get-caller-file@^1.0.1: 643 | version "1.0.2" 644 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 645 | 646 | getpass@^0.1.1: 647 | version "0.1.6" 648 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" 649 | dependencies: 650 | assert-plus "^1.0.0" 651 | 652 | glob@^7.0.5, glob@^7.1.1: 653 | version "7.1.1" 654 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 655 | dependencies: 656 | fs.realpath "^1.0.0" 657 | inflight "^1.0.4" 658 | inherits "2" 659 | minimatch "^3.0.2" 660 | once "^1.3.0" 661 | path-is-absolute "^1.0.0" 662 | 663 | glob@~5.0.0: 664 | version "5.0.15" 665 | resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" 666 | dependencies: 667 | inflight "^1.0.4" 668 | inherits "2" 669 | minimatch "2 || 3" 670 | once "^1.3.0" 671 | path-is-absolute "^1.0.0" 672 | 673 | good-console@^6.4.0: 674 | version "6.4.0" 675 | resolved "https://registry.yarnpkg.com/good-console/-/good-console-6.4.0.tgz#7294c9d90c4c9f059a082e180625495966d2ba59" 676 | dependencies: 677 | hoek "4.x.x" 678 | joi "8.1.x" 679 | json-stringify-safe "5.0.x" 680 | moment "2.15.x" 681 | 682 | good-squeeze@^5.0.1: 683 | version "5.0.1" 684 | resolved "https://registry.yarnpkg.com/good-squeeze/-/good-squeeze-5.0.1.tgz#2bf53c28a77c072b18a64691f6e862cd68ea0891" 685 | dependencies: 686 | fast-safe-stringify "1.1.0" 687 | hoek "4.x.x" 688 | 689 | good@^7.1.0: 690 | version "7.1.0" 691 | resolved "https://registry.yarnpkg.com/good/-/good-7.1.0.tgz#9e05ad24c58a11b71cf5081700f3778db0b22c1c" 692 | dependencies: 693 | hoek "4.x.x" 694 | joi "10.x.x" 695 | oppsy "1.x.x" 696 | pumpify "1.3.x" 697 | 698 | got@^5.0.0: 699 | version "5.7.1" 700 | resolved "https://registry.yarnpkg.com/got/-/got-5.7.1.tgz#5f81635a61e4a6589f180569ea4e381680a51f35" 701 | dependencies: 702 | create-error-class "^3.0.1" 703 | duplexer2 "^0.1.4" 704 | is-redirect "^1.0.0" 705 | is-retry-allowed "^1.0.0" 706 | is-stream "^1.0.0" 707 | lowercase-keys "^1.0.0" 708 | node-status-codes "^1.0.0" 709 | object-assign "^4.0.1" 710 | parse-json "^2.1.0" 711 | pinkie-promise "^2.0.0" 712 | read-all-stream "^3.0.0" 713 | readable-stream "^2.0.5" 714 | timed-out "^3.0.0" 715 | unzip-response "^1.0.2" 716 | url-parse-lax "^1.0.0" 717 | 718 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 719 | version "4.1.11" 720 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 721 | 722 | "graceful-readlink@>= 1.0.0": 723 | version "1.0.1" 724 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 725 | 726 | hapi-auth-cookie@^6.1.1: 727 | version "6.1.1" 728 | resolved "https://registry.yarnpkg.com/hapi-auth-cookie/-/hapi-auth-cookie-6.1.1.tgz#927db39e434916d81ab870d4181d70d53e745572" 729 | dependencies: 730 | boom "3.x.x" 731 | hoek "3.x.x" 732 | joi "7.x.x" 733 | 734 | hapi-config@^0.2.2: 735 | version "0.2.2" 736 | resolved "https://registry.yarnpkg.com/hapi-config/-/hapi-config-0.2.2.tgz#fe54536b9e1c1d4c06f3793bca643d7445baedc3" 737 | dependencies: 738 | js-yaml "^3.4.6" 739 | lodash "^3.10.1" 740 | nconf "^0.8.2" 741 | 742 | hapi@^16.1.0: 743 | version "16.1.0" 744 | resolved "https://registry.yarnpkg.com/hapi/-/hapi-16.1.0.tgz#419dd86347588821eb5a0a5f493bce019802d33b" 745 | dependencies: 746 | accept "2.x.x" 747 | ammo "2.x.x" 748 | boom "4.x.x" 749 | call "4.x.x" 750 | catbox "7.x.x" 751 | catbox-memory "2.x.x" 752 | cryptiles "3.x.x" 753 | heavy "4.x.x" 754 | hoek "4.x.x" 755 | iron "4.x.x" 756 | items "2.x.x" 757 | joi "10.x.x" 758 | mimos "3.x.x" 759 | podium "^1.2.x" 760 | shot "3.x.x" 761 | statehood "5.x.x" 762 | subtext "^4.3.x" 763 | topo "2.x.x" 764 | 765 | har-validator@~2.0.6: 766 | version "2.0.6" 767 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" 768 | dependencies: 769 | chalk "^1.1.1" 770 | commander "^2.9.0" 771 | is-my-json-valid "^2.12.4" 772 | pinkie-promise "^2.0.0" 773 | 774 | has-ansi@^2.0.0: 775 | version "2.0.0" 776 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 777 | dependencies: 778 | ansi-regex "^2.0.0" 779 | 780 | has-color@~0.1.0: 781 | version "0.1.7" 782 | resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" 783 | 784 | has-unicode@^2.0.0: 785 | version "2.0.1" 786 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 787 | 788 | hawk@~3.1.3: 789 | version "3.1.3" 790 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 791 | dependencies: 792 | boom "2.x.x" 793 | cryptiles "2.x.x" 794 | hoek "2.x.x" 795 | sntp "1.x.x" 796 | 797 | heavy@4.x.x: 798 | version "4.0.3" 799 | resolved "https://registry.yarnpkg.com/heavy/-/heavy-4.0.3.tgz#976bba118b011b15fe904aa4f292a168bfc6232f" 800 | dependencies: 801 | boom "4.x.x" 802 | hoek "4.x.x" 803 | joi "10.x.x" 804 | 805 | hoek@2.x.x: 806 | version "2.16.3" 807 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 808 | 809 | hoek@3.x.x: 810 | version "3.0.4" 811 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-3.0.4.tgz#268adff66bb6695c69b4789a88b1e0847c3f3123" 812 | 813 | hoek@4.x.x: 814 | version "4.1.0" 815 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.1.0.tgz#4a4557460f69842ed463aa00628cc26d2683afa7" 816 | 817 | hosted-git-info@^2.1.4: 818 | version "2.2.0" 819 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.2.0.tgz#7a0d097863d886c0fabbdcd37bf1758d8becf8a5" 820 | 821 | http-signature@~1.1.0: 822 | version "1.1.1" 823 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 824 | dependencies: 825 | assert-plus "^0.2.0" 826 | jsprim "^1.2.2" 827 | sshpk "^1.7.0" 828 | 829 | imurmurhash@^0.1.4: 830 | version "0.1.4" 831 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 832 | 833 | inert@^4.1.0: 834 | version "4.1.0" 835 | resolved "https://registry.yarnpkg.com/inert/-/inert-4.1.0.tgz#e68df9fb0b87d8ad688e3428daaf35d623b64f5d" 836 | dependencies: 837 | ammo "2.x.x" 838 | boom "4.x.x" 839 | hoek "4.x.x" 840 | items "2.x.x" 841 | joi "10.x.x" 842 | lru-cache "4.0.x" 843 | 844 | inflight@^1.0.4: 845 | version "1.0.6" 846 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 847 | dependencies: 848 | once "^1.3.0" 849 | wrappy "1" 850 | 851 | inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: 852 | version "2.0.3" 853 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 854 | 855 | ini@^1.3.0, ini@~1.3.0: 856 | version "1.3.4" 857 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 858 | 859 | invert-kv@^1.0.0: 860 | version "1.0.0" 861 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 862 | 863 | iron@4.x.x: 864 | version "4.0.4" 865 | resolved "https://registry.yarnpkg.com/iron/-/iron-4.0.4.tgz#c1f8cc4c91454194ab8920d9247ba882e528061a" 866 | dependencies: 867 | boom "4.x.x" 868 | cryptiles "3.x.x" 869 | hoek "4.x.x" 870 | 871 | is-arrayish@^0.2.1: 872 | version "0.2.1" 873 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 874 | 875 | is-builtin-module@^1.0.0: 876 | version "1.0.0" 877 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 878 | dependencies: 879 | builtin-modules "^1.0.0" 880 | 881 | is-finite@^1.0.0: 882 | version "1.0.2" 883 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 884 | dependencies: 885 | number-is-nan "^1.0.0" 886 | 887 | is-fullwidth-code-point@^1.0.0: 888 | version "1.0.0" 889 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 890 | dependencies: 891 | number-is-nan "^1.0.0" 892 | 893 | is-my-json-valid@^2.12.4: 894 | version "2.15.0" 895 | resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.15.0.tgz#936edda3ca3c211fd98f3b2d3e08da43f7b2915b" 896 | dependencies: 897 | generate-function "^2.0.0" 898 | generate-object-property "^1.1.0" 899 | jsonpointer "^4.0.0" 900 | xtend "^4.0.0" 901 | 902 | is-npm@^1.0.0: 903 | version "1.0.0" 904 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 905 | 906 | is-obj@^1.0.0: 907 | version "1.0.1" 908 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 909 | 910 | is-promise@^2.1: 911 | version "2.1.0" 912 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 913 | 914 | is-property@^1.0.0: 915 | version "1.0.2" 916 | resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" 917 | 918 | is-redirect@^1.0.0: 919 | version "1.0.0" 920 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 921 | 922 | is-retry-allowed@^1.0.0: 923 | version "1.1.0" 924 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 925 | 926 | is-stream@^1.0.0: 927 | version "1.1.0" 928 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 929 | 930 | is-typedarray@~1.0.0: 931 | version "1.0.0" 932 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 933 | 934 | is-utf8@^0.2.0: 935 | version "0.2.1" 936 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 937 | 938 | isarray@~1.0.0: 939 | version "1.0.0" 940 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 941 | 942 | isemail@1.x.x: 943 | version "1.2.0" 944 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-1.2.0.tgz#be03df8cc3e29de4d2c5df6501263f1fa4595e9a" 945 | 946 | isemail@2.x.x: 947 | version "2.2.1" 948 | resolved "https://registry.yarnpkg.com/isemail/-/isemail-2.2.1.tgz#0353d3d9a62951080c262c2aa0a42b8ea8e9e2a6" 949 | 950 | isstream@0.1.x, isstream@~0.1.2: 951 | version "0.1.2" 952 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 953 | 954 | items@2.x.x: 955 | version "2.1.1" 956 | resolved "https://registry.yarnpkg.com/items/-/items-2.1.1.tgz#8bd16d9c83b19529de5aea321acaada78364a198" 957 | 958 | jodid25519@^1.0.0: 959 | version "1.0.2" 960 | resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" 961 | dependencies: 962 | jsbn "~0.1.0" 963 | 964 | joi@10.x.x: 965 | version "10.2.2" 966 | resolved "https://registry.yarnpkg.com/joi/-/joi-10.2.2.tgz#dc5a792b7b4c6fffa562242a95b55d9d3f077e24" 967 | dependencies: 968 | hoek "4.x.x" 969 | isemail "2.x.x" 970 | items "2.x.x" 971 | topo "2.x.x" 972 | 973 | joi@7.x.x: 974 | version "7.3.0" 975 | resolved "https://registry.yarnpkg.com/joi/-/joi-7.3.0.tgz#4d9c9f181830444083665b5b6cd5b8ca6779a5e9" 976 | dependencies: 977 | hoek "3.x.x" 978 | isemail "2.x.x" 979 | moment "2.x.x" 980 | topo "2.x.x" 981 | 982 | joi@8.1.x: 983 | version "8.1.1" 984 | resolved "https://registry.yarnpkg.com/joi/-/joi-8.1.1.tgz#2d8b52a5d909d217ed47248577eefe8b1798f48f" 985 | dependencies: 986 | hoek "4.x.x" 987 | isemail "2.x.x" 988 | moment "2.x.x" 989 | topo "2.x.x" 990 | 991 | joi@^6.10.1: 992 | version "6.10.1" 993 | resolved "https://registry.yarnpkg.com/joi/-/joi-6.10.1.tgz#4d50c318079122000fe5f16af1ff8e1917b77e06" 994 | dependencies: 995 | hoek "2.x.x" 996 | isemail "1.x.x" 997 | moment "2.x.x" 998 | topo "1.x.x" 999 | 1000 | js-tokens@^3.0.0: 1001 | version "3.0.1" 1002 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" 1003 | 1004 | js-yaml@^3.2.3, js-yaml@^3.4.6: 1005 | version "3.8.1" 1006 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.8.1.tgz#782ba50200be7b9e5a8537001b7804db3ad02628" 1007 | dependencies: 1008 | argparse "^1.0.7" 1009 | esprima "^3.1.1" 1010 | 1011 | jsbn@~0.1.0: 1012 | version "0.1.1" 1013 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1014 | 1015 | json-schema@0.2.3: 1016 | version "0.2.3" 1017 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1018 | 1019 | json-stringify-safe@5.0.x, json-stringify-safe@~5.0.1: 1020 | version "5.0.1" 1021 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1022 | 1023 | jsonpointer@^4.0.0: 1024 | version "4.0.1" 1025 | resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" 1026 | 1027 | jsprim@^1.2.2: 1028 | version "1.3.1" 1029 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.3.1.tgz#2a7256f70412a29ee3670aaca625994c4dcff252" 1030 | dependencies: 1031 | extsprintf "1.0.2" 1032 | json-schema "0.2.3" 1033 | verror "1.3.6" 1034 | 1035 | latest-version@^2.0.0: 1036 | version "2.0.0" 1037 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-2.0.0.tgz#56f8d6139620847b8017f8f1f4d78e211324168b" 1038 | dependencies: 1039 | package-json "^2.0.0" 1040 | 1041 | lazy-req@^1.1.0: 1042 | version "1.1.0" 1043 | resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-1.1.0.tgz#bdaebead30f8d824039ce0ce149d4daa07ba1fac" 1044 | 1045 | lcid@^1.0.0: 1046 | version "1.0.0" 1047 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 1048 | dependencies: 1049 | invert-kv "^1.0.0" 1050 | 1051 | load-json-file@^1.0.0: 1052 | version "1.1.0" 1053 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1054 | dependencies: 1055 | graceful-fs "^4.1.2" 1056 | parse-json "^2.2.0" 1057 | pify "^2.0.0" 1058 | pinkie-promise "^2.0.0" 1059 | strip-bom "^2.0.0" 1060 | 1061 | lodash@^3.10.1: 1062 | version "3.10.1" 1063 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" 1064 | 1065 | lowercase-keys@^1.0.0: 1066 | version "1.0.0" 1067 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1068 | 1069 | lru-cache@4.0.x: 1070 | version "4.0.2" 1071 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 1072 | dependencies: 1073 | pseudomap "^1.0.1" 1074 | yallist "^2.0.0" 1075 | 1076 | lru-queue@0.1: 1077 | version "0.1.0" 1078 | resolved "https://registry.yarnpkg.com/lru-queue/-/lru-queue-0.1.0.tgz#2738bd9f0d3cf4f84490c5736c48699ac632cda3" 1079 | dependencies: 1080 | es5-ext "~0.10.2" 1081 | 1082 | make-error@^1.1.1: 1083 | version "1.2.1" 1084 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.2.1.tgz#9a6dfb4844423b9f145806728d05c6e935670e75" 1085 | 1086 | memoizee@^0.4.3: 1087 | version "0.4.3" 1088 | resolved "https://registry.yarnpkg.com/memoizee/-/memoizee-0.4.3.tgz#1e9dc26b3a309a0aefcce5f476747b8e845276b6" 1089 | dependencies: 1090 | d "1" 1091 | es5-ext "^0.10.12" 1092 | es6-weak-map "^2.0.1" 1093 | event-emitter "^0.3.4" 1094 | is-promise "^2.1" 1095 | lru-queue "0.1" 1096 | next-tick "1" 1097 | timers-ext "0.1" 1098 | 1099 | mime-db@1.x.x, mime-db@~1.26.0: 1100 | version "1.26.0" 1101 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.26.0.tgz#eaffcd0e4fc6935cf8134da246e2e6c35305adff" 1102 | 1103 | mime-types@^2.1.12, mime-types@~2.1.7: 1104 | version "2.1.14" 1105 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee" 1106 | dependencies: 1107 | mime-db "~1.26.0" 1108 | 1109 | mimos@3.x.x: 1110 | version "3.0.3" 1111 | resolved "https://registry.yarnpkg.com/mimos/-/mimos-3.0.3.tgz#b9109072ad378c2b72f6a0101c43ddfb2b36641f" 1112 | dependencies: 1113 | hoek "4.x.x" 1114 | mime-db "1.x.x" 1115 | 1116 | "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2: 1117 | version "3.0.3" 1118 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 1119 | dependencies: 1120 | brace-expansion "^1.0.0" 1121 | 1122 | minimist@0.0.8, minimist@~0.0.1: 1123 | version "0.0.8" 1124 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1125 | 1126 | minimist@^1.2.0: 1127 | version "1.2.0" 1128 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1129 | 1130 | "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: 1131 | version "0.5.1" 1132 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1133 | dependencies: 1134 | minimist "0.0.8" 1135 | 1136 | moment@2.15.x: 1137 | version "2.15.2" 1138 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.15.2.tgz#1bfdedf6a6e345f322fe956d5df5bd08a8ce84dc" 1139 | 1140 | moment@2.x.x, moment@>=2.14.0, moment@^2.17.1: 1141 | version "2.17.1" 1142 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.17.1.tgz#fed9506063f36b10f066c8b59a144d7faebe1d82" 1143 | 1144 | ms@0.7.1: 1145 | version "0.7.1" 1146 | resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" 1147 | 1148 | nan@2.5.0: 1149 | version "2.5.0" 1150 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.5.0.tgz#aa8f1e34531d807e9e27755b234b4a6ec0c152a8" 1151 | 1152 | nconf-yaml@^1.0.2: 1153 | version "1.0.2" 1154 | resolved "https://registry.yarnpkg.com/nconf-yaml/-/nconf-yaml-1.0.2.tgz#fea065333cf42b77a5e8060517969799d4156575" 1155 | dependencies: 1156 | js-yaml "^3.2.3" 1157 | 1158 | nconf@^0.8.2, nconf@^0.8.4: 1159 | version "0.8.4" 1160 | resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.8.4.tgz#9502234f7ad6238cab7f92d7c068c20434d3ff93" 1161 | dependencies: 1162 | async "^1.4.0" 1163 | ini "^1.3.0" 1164 | secure-keys "^1.0.0" 1165 | yargs "^3.19.0" 1166 | 1167 | next-tick@1: 1168 | version "1.0.0" 1169 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" 1170 | 1171 | next-tick@~0.2.2: 1172 | version "0.2.2" 1173 | resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-0.2.2.tgz#75da4a927ee5887e39065880065b7336413b310d" 1174 | 1175 | nigel@2.x.x: 1176 | version "2.0.2" 1177 | resolved "https://registry.yarnpkg.com/nigel/-/nigel-2.0.2.tgz#93a1866fb0c52d87390aa75e2b161f4b5c75e5b1" 1178 | dependencies: 1179 | hoek "4.x.x" 1180 | vise "2.x.x" 1181 | 1182 | node-pre-gyp@0.6.32: 1183 | version "0.6.32" 1184 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.32.tgz#fc452b376e7319b3d255f5f34853ef6fd8fe1fd5" 1185 | dependencies: 1186 | mkdirp "~0.5.1" 1187 | nopt "~3.0.6" 1188 | npmlog "^4.0.1" 1189 | rc "~1.1.6" 1190 | request "^2.79.0" 1191 | rimraf "~2.5.4" 1192 | semver "~5.3.0" 1193 | tar "~2.2.1" 1194 | tar-pack "~3.3.0" 1195 | 1196 | node-status-codes@^1.0.0: 1197 | version "1.0.0" 1198 | resolved "https://registry.yarnpkg.com/node-status-codes/-/node-status-codes-1.0.0.tgz#5ae5541d024645d32a58fcddc9ceecea7ae3ac2f" 1199 | 1200 | nopt@~3.0.6: 1201 | version "3.0.6" 1202 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 1203 | dependencies: 1204 | abbrev "1" 1205 | 1206 | normalize-package-data@^2.3.2: 1207 | version "2.3.5" 1208 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 1209 | dependencies: 1210 | hosted-git-info "^2.1.4" 1211 | is-builtin-module "^1.0.0" 1212 | semver "2 || 3 || 4 || 5" 1213 | validate-npm-package-license "^3.0.1" 1214 | 1215 | npmlog@^4.0.1: 1216 | version "4.0.2" 1217 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.0.2.tgz#d03950e0e78ce1527ba26d2a7592e9348ac3e75f" 1218 | dependencies: 1219 | are-we-there-yet "~1.1.2" 1220 | console-control-strings "~1.1.0" 1221 | gauge "~2.7.1" 1222 | set-blocking "~2.0.0" 1223 | 1224 | number-is-nan@^1.0.0: 1225 | version "1.0.1" 1226 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1227 | 1228 | oauth-sign@~0.8.1: 1229 | version "0.8.2" 1230 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1231 | 1232 | object-assign@4.1.0, object-assign@^4.0.1, object-assign@^4.1.0: 1233 | version "4.1.0" 1234 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1235 | 1236 | once@^1.3.0, once@^1.3.1: 1237 | version "1.4.0" 1238 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1239 | dependencies: 1240 | wrappy "1" 1241 | 1242 | once@~1.3.0, once@~1.3.3: 1243 | version "1.3.3" 1244 | resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" 1245 | dependencies: 1246 | wrappy "1" 1247 | 1248 | oppsy@1.x.x: 1249 | version "1.0.2" 1250 | resolved "https://registry.yarnpkg.com/oppsy/-/oppsy-1.0.2.tgz#98014cd6967653a83cfffa554226dc90050baad4" 1251 | dependencies: 1252 | hoek "4.x.x" 1253 | items "2.x.x" 1254 | 1255 | optimist@~0.6.0: 1256 | version "0.6.1" 1257 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1258 | dependencies: 1259 | minimist "~0.0.1" 1260 | wordwrap "~0.0.2" 1261 | 1262 | os-homedir@^1.0.0: 1263 | version "1.0.2" 1264 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1265 | 1266 | os-locale@^1.4.0: 1267 | version "1.4.0" 1268 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1269 | dependencies: 1270 | lcid "^1.0.0" 1271 | 1272 | os-tmpdir@^1.0.0: 1273 | version "1.0.2" 1274 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1275 | 1276 | osenv@^0.1.0: 1277 | version "0.1.4" 1278 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1279 | dependencies: 1280 | os-homedir "^1.0.0" 1281 | os-tmpdir "^1.0.0" 1282 | 1283 | package-json@^2.0.0: 1284 | version "2.4.0" 1285 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-2.4.0.tgz#0d15bd67d1cbbddbb2ca222ff2edb86bcb31a8bb" 1286 | dependencies: 1287 | got "^5.0.0" 1288 | registry-auth-token "^3.0.1" 1289 | registry-url "^3.0.3" 1290 | semver "^5.1.0" 1291 | 1292 | packet-reader@0.2.0: 1293 | version "0.2.0" 1294 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.2.0.tgz#819df4d010b82d5ea5671f8a1a3acf039bcd7700" 1295 | 1296 | parent-require@^1.0.0: 1297 | version "1.0.0" 1298 | resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977" 1299 | 1300 | parse-json@^2.1.0, parse-json@^2.2.0: 1301 | version "2.2.0" 1302 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1303 | dependencies: 1304 | error-ex "^1.2.0" 1305 | 1306 | path-exists@^2.0.0: 1307 | version "2.1.0" 1308 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1309 | dependencies: 1310 | pinkie-promise "^2.0.0" 1311 | 1312 | path-is-absolute@^1.0.0: 1313 | version "1.0.1" 1314 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1315 | 1316 | path-type@^1.0.0: 1317 | version "1.1.0" 1318 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1319 | dependencies: 1320 | graceful-fs "^4.1.2" 1321 | pify "^2.0.0" 1322 | pinkie-promise "^2.0.0" 1323 | 1324 | pez@2.x.x: 1325 | version "2.1.4" 1326 | resolved "https://registry.yarnpkg.com/pez/-/pez-2.1.4.tgz#73f822fa62d599d65c4606f490d54d345191bc7c" 1327 | dependencies: 1328 | b64 "3.x.x" 1329 | boom "4.x.x" 1330 | content "3.x.x" 1331 | hoek "4.x.x" 1332 | nigel "2.x.x" 1333 | 1334 | pg-connection-string@0.1.3: 1335 | version "0.1.3" 1336 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" 1337 | 1338 | pg-pool@1.*, pg-pool@^1.6.0: 1339 | version "1.6.0" 1340 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.6.0.tgz#2e300199927b6d7db6be71e2e3435dddddf07b41" 1341 | dependencies: 1342 | generic-pool "2.4.2" 1343 | object-assign "4.1.0" 1344 | 1345 | pg-types@1.*: 1346 | version "1.11.0" 1347 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.11.0.tgz#aae91a82d952b633bb88d006350a166daaf6ea90" 1348 | dependencies: 1349 | ap "~0.2.0" 1350 | postgres-array "~1.0.0" 1351 | postgres-bytea "~1.0.0" 1352 | postgres-date "~1.0.0" 1353 | postgres-interval "~1.0.0" 1354 | 1355 | pg@^6.1.2: 1356 | version "6.1.2" 1357 | resolved "https://registry.yarnpkg.com/pg/-/pg-6.1.2.tgz#2c896a7434502e2b938c100fc085b4e974a186db" 1358 | dependencies: 1359 | buffer-writer "1.0.1" 1360 | packet-reader "0.2.0" 1361 | pg-connection-string "0.1.3" 1362 | pg-pool "1.*" 1363 | pg-types "1.*" 1364 | pgpass "1.x" 1365 | semver "4.3.2" 1366 | 1367 | pgpass@1.x: 1368 | version "1.0.1" 1369 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.1.tgz#0de8b5bef993295d90a7e17d976f568dcd25d49f" 1370 | dependencies: 1371 | split "^1.0.0" 1372 | 1373 | pify@^2.0.0: 1374 | version "2.3.0" 1375 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1376 | 1377 | pinkie-promise@^2.0.0: 1378 | version "2.0.1" 1379 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1380 | dependencies: 1381 | pinkie "^2.0.0" 1382 | 1383 | pinkie@^2.0.0, pinkie@^2.0.4: 1384 | version "2.0.4" 1385 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1386 | 1387 | podium@^1.2.x: 1388 | version "1.2.5" 1389 | resolved "https://registry.yarnpkg.com/podium/-/podium-1.2.5.tgz#87c566c2f0365bcf0a1ec7602c4d01948cdd2ad5" 1390 | dependencies: 1391 | hoek "4.x.x" 1392 | items "2.x.x" 1393 | joi "10.x.x" 1394 | 1395 | postgres-array@~1.0.0: 1396 | version "1.0.2" 1397 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.2.tgz#8e0b32eb03bf77a5c0a7851e0441c169a256a238" 1398 | 1399 | postgres-bytea@~1.0.0: 1400 | version "1.0.0" 1401 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 1402 | 1403 | postgres-date@~1.0.0: 1404 | version "1.0.3" 1405 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" 1406 | 1407 | postgres-interval@~1.0.0: 1408 | version "1.0.2" 1409 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.0.2.tgz#7261438d862b412921c6fdb7617668424b73a6ed" 1410 | dependencies: 1411 | xtend "^4.0.0" 1412 | 1413 | prepend-http@^1.0.1: 1414 | version "1.0.4" 1415 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1416 | 1417 | process-nextick-args@~1.0.6: 1418 | version "1.0.7" 1419 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1420 | 1421 | pseudomap@^1.0.1: 1422 | version "1.0.2" 1423 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1424 | 1425 | pump@^1.0.0: 1426 | version "1.0.2" 1427 | resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.2.tgz#3b3ee6512f94f0e575538c17995f9f16990a5d51" 1428 | dependencies: 1429 | end-of-stream "^1.1.0" 1430 | once "^1.3.1" 1431 | 1432 | pumpify@1.3.x: 1433 | version "1.3.5" 1434 | resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.3.5.tgz#1b671c619940abcaeac0ad0e3a3c164be760993b" 1435 | dependencies: 1436 | duplexify "^3.1.2" 1437 | inherits "^2.0.1" 1438 | pump "^1.0.0" 1439 | 1440 | punycode@^1.4.1: 1441 | version "1.4.1" 1442 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1443 | 1444 | purdy@^2.2.0: 1445 | version "2.2.0" 1446 | resolved "https://registry.yarnpkg.com/purdy/-/purdy-2.2.0.tgz#ad74be54b0e8b108d107aa7cbfba2a38d24168b6" 1447 | dependencies: 1448 | chalk "0.4.x" 1449 | hoek "2.x.x" 1450 | joi "^6.10.1" 1451 | 1452 | qs@~6.3.0: 1453 | version "6.3.1" 1454 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.1.tgz#918c0b3bcd36679772baf135b1acb4c1651ed79d" 1455 | 1456 | rc@^1.0.1, rc@^1.1.6, rc@~1.1.6: 1457 | version "1.1.6" 1458 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.1.6.tgz#43651b76b6ae53b5c802f1151fa3fc3b059969c9" 1459 | dependencies: 1460 | deep-extend "~0.4.0" 1461 | ini "~1.3.0" 1462 | minimist "^1.2.0" 1463 | strip-json-comments "~1.0.4" 1464 | 1465 | read-all-stream@^3.0.0: 1466 | version "3.1.0" 1467 | resolved "https://registry.yarnpkg.com/read-all-stream/-/read-all-stream-3.1.0.tgz#35c3e177f2078ef789ee4bfafa4373074eaef4fa" 1468 | dependencies: 1469 | pinkie-promise "^2.0.0" 1470 | readable-stream "^2.0.0" 1471 | 1472 | read-pkg-up@^1.0.1: 1473 | version "1.0.1" 1474 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1475 | dependencies: 1476 | find-up "^1.0.0" 1477 | read-pkg "^1.0.0" 1478 | 1479 | read-pkg@^1.0.0: 1480 | version "1.1.0" 1481 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1482 | dependencies: 1483 | load-json-file "^1.0.0" 1484 | normalize-package-data "^2.3.2" 1485 | path-type "^1.0.0" 1486 | 1487 | readable-stream@^2.0.0, "readable-stream@^2.0.0 || ^1.1.13", readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@~2.1.4: 1488 | version "2.1.5" 1489 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" 1490 | dependencies: 1491 | buffer-shims "^1.0.0" 1492 | core-util-is "~1.0.0" 1493 | inherits "~2.0.1" 1494 | isarray "~1.0.0" 1495 | process-nextick-args "~1.0.6" 1496 | string_decoder "~0.10.x" 1497 | util-deprecate "~1.0.1" 1498 | 1499 | reflect-metadata@^0.1.9: 1500 | version "0.1.9" 1501 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.9.tgz#987238dc87a516895fe457f130435ffbd763a4d4" 1502 | 1503 | registry-auth-token@^3.0.1: 1504 | version "3.1.0" 1505 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.1.0.tgz#997c08256e0c7999837b90e944db39d8a790276b" 1506 | dependencies: 1507 | rc "^1.1.6" 1508 | 1509 | registry-url@^3.0.3: 1510 | version "3.1.0" 1511 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1512 | dependencies: 1513 | rc "^1.0.1" 1514 | 1515 | repeating@^2.0.0: 1516 | version "2.0.1" 1517 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1518 | dependencies: 1519 | is-finite "^1.0.0" 1520 | 1521 | request@^2.79.0: 1522 | version "2.79.0" 1523 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" 1524 | dependencies: 1525 | aws-sign2 "~0.6.0" 1526 | aws4 "^1.2.1" 1527 | caseless "~0.11.0" 1528 | combined-stream "~1.0.5" 1529 | extend "~3.0.0" 1530 | forever-agent "~0.6.1" 1531 | form-data "~2.1.1" 1532 | har-validator "~2.0.6" 1533 | hawk "~3.1.3" 1534 | http-signature "~1.1.0" 1535 | is-typedarray "~1.0.0" 1536 | isstream "~0.1.2" 1537 | json-stringify-safe "~5.0.1" 1538 | mime-types "~2.1.7" 1539 | oauth-sign "~0.8.1" 1540 | qs "~6.3.0" 1541 | stringstream "~0.0.4" 1542 | tough-cookie "~2.3.0" 1543 | tunnel-agent "~0.4.1" 1544 | uuid "^3.0.0" 1545 | 1546 | require-directory@^2.1.1: 1547 | version "2.1.1" 1548 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1549 | 1550 | require-main-filename@^1.0.1: 1551 | version "1.0.1" 1552 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1553 | 1554 | resolve@^1.1.7: 1555 | version "1.2.0" 1556 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.2.0.tgz#9589c3f2f6149d1417a40becc1663db6ec6bc26c" 1557 | 1558 | rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4: 1559 | version "2.5.4" 1560 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" 1561 | dependencies: 1562 | glob "^7.0.5" 1563 | 1564 | secure-keys@^1.0.0: 1565 | version "1.0.0" 1566 | resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" 1567 | 1568 | semver-diff@^2.0.0: 1569 | version "2.1.0" 1570 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1571 | dependencies: 1572 | semver "^5.0.3" 1573 | 1574 | "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@~5.3.0: 1575 | version "5.3.0" 1576 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1577 | 1578 | semver@4.3.2: 1579 | version "4.3.2" 1580 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" 1581 | 1582 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1583 | version "2.0.0" 1584 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1585 | 1586 | shot@3.x.x: 1587 | version "3.4.0" 1588 | resolved "https://registry.yarnpkg.com/shot/-/shot-3.4.0.tgz#e7125ee72575ae5218349e933636808d790d4b92" 1589 | dependencies: 1590 | hoek "4.x.x" 1591 | joi "10.x.x" 1592 | 1593 | signal-exit@^3.0.0: 1594 | version "3.0.2" 1595 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1596 | 1597 | slide@^1.1.5: 1598 | version "1.1.6" 1599 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1600 | 1601 | sntp@1.x.x: 1602 | version "1.0.9" 1603 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1604 | dependencies: 1605 | hoek "2.x.x" 1606 | 1607 | source-map-support@^0.4.0: 1608 | version "0.4.11" 1609 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.11.tgz#647f939978b38535909530885303daf23279f322" 1610 | dependencies: 1611 | source-map "^0.5.3" 1612 | 1613 | source-map@^0.5.3: 1614 | version "0.5.6" 1615 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1616 | 1617 | spdx-correct@~1.0.0: 1618 | version "1.0.2" 1619 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1620 | dependencies: 1621 | spdx-license-ids "^1.0.2" 1622 | 1623 | spdx-expression-parse@~1.0.0: 1624 | version "1.0.4" 1625 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1626 | 1627 | spdx-license-ids@^1.0.2: 1628 | version "1.2.2" 1629 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1630 | 1631 | split@^1.0.0: 1632 | version "1.0.0" 1633 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 1634 | dependencies: 1635 | through "2" 1636 | 1637 | sprintf-js@~1.0.2: 1638 | version "1.0.3" 1639 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1640 | 1641 | sshpk@^1.7.0: 1642 | version "1.10.2" 1643 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.10.2.tgz#d5a804ce22695515638e798dbe23273de070a5fa" 1644 | dependencies: 1645 | asn1 "~0.2.3" 1646 | assert-plus "^1.0.0" 1647 | dashdash "^1.12.0" 1648 | getpass "^0.1.1" 1649 | optionalDependencies: 1650 | bcrypt-pbkdf "^1.0.0" 1651 | ecc-jsbn "~0.1.1" 1652 | jodid25519 "^1.0.0" 1653 | jsbn "~0.1.0" 1654 | tweetnacl "~0.14.0" 1655 | 1656 | stack-trace@0.0.x: 1657 | version "0.0.9" 1658 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" 1659 | 1660 | statehood@5.x.x: 1661 | version "5.0.1" 1662 | resolved "https://registry.yarnpkg.com/statehood/-/statehood-5.0.1.tgz#fc13c97b37751c18e70513d2b97e896ac8b73005" 1663 | dependencies: 1664 | boom "4.x.x" 1665 | cryptiles "3.x.x" 1666 | hoek "4.x.x" 1667 | iron "4.x.x" 1668 | items "2.x.x" 1669 | joi "10.x.x" 1670 | 1671 | stream-shift@^1.0.0: 1672 | version "1.0.0" 1673 | resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" 1674 | 1675 | string-width@^1.0.1, string-width@^1.0.2: 1676 | version "1.0.2" 1677 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1678 | dependencies: 1679 | code-point-at "^1.0.0" 1680 | is-fullwidth-code-point "^1.0.0" 1681 | strip-ansi "^3.0.0" 1682 | 1683 | string_decoder@~0.10.x: 1684 | version "0.10.31" 1685 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1686 | 1687 | stringstream@~0.0.4: 1688 | version "0.0.5" 1689 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1690 | 1691 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1692 | version "3.0.1" 1693 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1694 | dependencies: 1695 | ansi-regex "^2.0.0" 1696 | 1697 | strip-ansi@~0.1.0: 1698 | version "0.1.1" 1699 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.1.1.tgz#39e8a98d044d150660abe4a6808acf70bb7bc991" 1700 | 1701 | strip-bom@^2.0.0: 1702 | version "2.0.0" 1703 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1704 | dependencies: 1705 | is-utf8 "^0.2.0" 1706 | 1707 | strip-json-comments@^2.0.0: 1708 | version "2.0.1" 1709 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1710 | 1711 | strip-json-comments@~1.0.4: 1712 | version "1.0.4" 1713 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-1.0.4.tgz#1e15fbcac97d3ee99bf2d73b4c656b082bbafb91" 1714 | 1715 | subtext@^4.3.x: 1716 | version "4.3.0" 1717 | resolved "https://registry.yarnpkg.com/subtext/-/subtext-4.3.0.tgz#dfac90492ec35669fd6e00c6e5d938b06d7ccfbb" 1718 | dependencies: 1719 | boom "4.x.x" 1720 | content "3.x.x" 1721 | hoek "4.x.x" 1722 | pez "2.x.x" 1723 | wreck "10.x.x" 1724 | 1725 | supports-color@^2.0.0: 1726 | version "2.0.0" 1727 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1728 | 1729 | tar-pack@~3.3.0: 1730 | version "3.3.0" 1731 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.3.0.tgz#30931816418f55afc4d21775afdd6720cee45dae" 1732 | dependencies: 1733 | debug "~2.2.0" 1734 | fstream "~1.0.10" 1735 | fstream-ignore "~1.0.5" 1736 | once "~1.3.3" 1737 | readable-stream "~2.1.4" 1738 | rimraf "~2.5.1" 1739 | tar "~2.2.1" 1740 | uid-number "~0.0.6" 1741 | 1742 | tar@~2.2.1: 1743 | version "2.2.1" 1744 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1745 | dependencies: 1746 | block-stream "*" 1747 | fstream "^1.0.2" 1748 | inherits "2" 1749 | 1750 | through@2: 1751 | version "2.3.8" 1752 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1753 | 1754 | timed-out@^3.0.0: 1755 | version "3.1.3" 1756 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-3.1.3.tgz#95860bfcc5c76c277f8f8326fd0f5b2e20eba217" 1757 | 1758 | timers-ext@0.1: 1759 | version "0.1.0" 1760 | resolved "https://registry.yarnpkg.com/timers-ext/-/timers-ext-0.1.0.tgz#00345a2ca93089d1251322054389d263e27b77e2" 1761 | dependencies: 1762 | es5-ext "~0.10.2" 1763 | next-tick "~0.2.2" 1764 | 1765 | topo@1.x.x: 1766 | version "1.1.0" 1767 | resolved "https://registry.yarnpkg.com/topo/-/topo-1.1.0.tgz#e9d751615d1bb87dc865db182fa1ca0a5ef536d5" 1768 | dependencies: 1769 | hoek "2.x.x" 1770 | 1771 | topo@2.x.x: 1772 | version "2.0.2" 1773 | resolved "https://registry.yarnpkg.com/topo/-/topo-2.0.2.tgz#cd5615752539057c0dc0491a621c3bc6fbe1d182" 1774 | dependencies: 1775 | hoek "4.x.x" 1776 | 1777 | tough-cookie@~2.3.0: 1778 | version "2.3.2" 1779 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" 1780 | dependencies: 1781 | punycode "^1.4.1" 1782 | 1783 | ts-node@^2.1.0: 1784 | version "2.1.0" 1785 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-2.1.0.tgz#aa2bf4b2e25c5fb6a7c54701edc3666d3a9db25d" 1786 | dependencies: 1787 | arrify "^1.0.0" 1788 | chalk "^1.1.1" 1789 | diff "^3.1.0" 1790 | make-error "^1.1.1" 1791 | minimist "^1.2.0" 1792 | mkdirp "^0.5.1" 1793 | pinkie "^2.0.4" 1794 | source-map-support "^0.4.0" 1795 | tsconfig "^5.0.2" 1796 | v8flags "^2.0.11" 1797 | xtend "^4.0.0" 1798 | yn "^1.2.0" 1799 | 1800 | tsconfig@^5.0.2: 1801 | version "5.0.3" 1802 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-5.0.3.tgz#5f4278e701800967a8fc383fd19648878f2a6e3a" 1803 | dependencies: 1804 | any-promise "^1.3.0" 1805 | parse-json "^2.2.0" 1806 | strip-bom "^2.0.0" 1807 | strip-json-comments "^2.0.0" 1808 | 1809 | tslint@^4.4.2: 1810 | version "4.4.2" 1811 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-4.4.2.tgz#b14cb79ae039c72471ab4c2627226b940dda19c6" 1812 | dependencies: 1813 | babel-code-frame "^6.20.0" 1814 | colors "^1.1.2" 1815 | diff "^3.0.1" 1816 | findup-sync "~0.3.0" 1817 | glob "^7.1.1" 1818 | optimist "~0.6.0" 1819 | resolve "^1.1.7" 1820 | update-notifier "^1.0.2" 1821 | 1822 | tunnel-agent@~0.4.1: 1823 | version "0.4.3" 1824 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" 1825 | 1826 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 1827 | version "0.14.5" 1828 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 1829 | 1830 | typeorm@^0.0.9: 1831 | version "0.0.9" 1832 | resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.0.9.tgz#bf4b6e63e9606aecd8c17304a33558f36fcde513" 1833 | dependencies: 1834 | app-root-path "^2.0.1" 1835 | glob "^7.1.1" 1836 | reflect-metadata "^0.1.9" 1837 | yargonaut "^1.1.2" 1838 | yargs "^6.6.0" 1839 | 1840 | typescript@^2.1.6: 1841 | version "2.1.6" 1842 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.1.6.tgz#40c7e6e9e5da7961b7718b55505f9cac9487a607" 1843 | 1844 | uid-number@~0.0.6: 1845 | version "0.0.6" 1846 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 1847 | 1848 | unzip-response@^1.0.2: 1849 | version "1.0.2" 1850 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" 1851 | 1852 | update-notifier@^1.0.2: 1853 | version "1.0.3" 1854 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-1.0.3.tgz#8f92c515482bd6831b7c93013e70f87552c7cf5a" 1855 | dependencies: 1856 | boxen "^0.6.0" 1857 | chalk "^1.0.0" 1858 | configstore "^2.0.0" 1859 | is-npm "^1.0.0" 1860 | latest-version "^2.0.0" 1861 | lazy-req "^1.1.0" 1862 | semver-diff "^2.0.0" 1863 | xdg-basedir "^2.0.0" 1864 | 1865 | url-parse-lax@^1.0.0: 1866 | version "1.0.0" 1867 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 1868 | dependencies: 1869 | prepend-http "^1.0.1" 1870 | 1871 | user-home@^1.1.1: 1872 | version "1.1.1" 1873 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 1874 | 1875 | util-deprecate@~1.0.1: 1876 | version "1.0.2" 1877 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1878 | 1879 | uuid@^2.0.1: 1880 | version "2.0.3" 1881 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 1882 | 1883 | uuid@^3.0.0: 1884 | version "3.0.1" 1885 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1886 | 1887 | v8flags@^2.0.11: 1888 | version "2.0.11" 1889 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881" 1890 | dependencies: 1891 | user-home "^1.1.1" 1892 | 1893 | validate-npm-package-license@^3.0.1: 1894 | version "3.0.1" 1895 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1896 | dependencies: 1897 | spdx-correct "~1.0.0" 1898 | spdx-expression-parse "~1.0.0" 1899 | 1900 | verror@1.3.6: 1901 | version "1.3.6" 1902 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" 1903 | dependencies: 1904 | extsprintf "1.0.2" 1905 | 1906 | vise@2.x.x: 1907 | version "2.0.2" 1908 | resolved "https://registry.yarnpkg.com/vise/-/vise-2.0.2.tgz#6b08e8fb4cb76e3a50cd6dd0ec37338e811a0d39" 1909 | dependencies: 1910 | hoek "4.x.x" 1911 | 1912 | vision@^4.1.1: 1913 | version "4.1.1" 1914 | resolved "https://registry.yarnpkg.com/vision/-/vision-4.1.1.tgz#e1b612b2d2e2f20310a039290fd49d51248f82da" 1915 | dependencies: 1916 | boom "4.x.x" 1917 | hoek "4.x.x" 1918 | items "2.x.x" 1919 | joi "10.x.x" 1920 | 1921 | which-module@^1.0.0: 1922 | version "1.0.0" 1923 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1924 | 1925 | wide-align@^1.1.0: 1926 | version "1.1.0" 1927 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.0.tgz#40edde802a71fea1f070da3e62dcda2e7add96ad" 1928 | dependencies: 1929 | string-width "^1.0.1" 1930 | 1931 | widest-line@^1.0.0: 1932 | version "1.0.0" 1933 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 1934 | dependencies: 1935 | string-width "^1.0.1" 1936 | 1937 | window-size@^0.1.4: 1938 | version "0.1.4" 1939 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" 1940 | 1941 | winston-console-formatter@^0.3.1: 1942 | version "0.3.1" 1943 | resolved "https://registry.yarnpkg.com/winston-console-formatter/-/winston-console-formatter-0.3.1.tgz#44ac4f77f8bcb57fc225a0a5941543b1ce3cafc6" 1944 | dependencies: 1945 | cli-color "^1.1.0" 1946 | 1947 | winston@^2.3.1: 1948 | version "2.3.1" 1949 | resolved "https://registry.yarnpkg.com/winston/-/winston-2.3.1.tgz#0b48420d978c01804cf0230b648861598225a119" 1950 | dependencies: 1951 | async "~1.0.0" 1952 | colors "1.0.x" 1953 | cycle "1.0.x" 1954 | eyes "0.1.x" 1955 | isstream "0.1.x" 1956 | stack-trace "0.0.x" 1957 | 1958 | wordwrap@~0.0.2: 1959 | version "0.0.3" 1960 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1961 | 1962 | wrap-ansi@^2.0.0: 1963 | version "2.1.0" 1964 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1965 | dependencies: 1966 | string-width "^1.0.1" 1967 | strip-ansi "^3.0.1" 1968 | 1969 | wrappy@1: 1970 | version "1.0.2" 1971 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1972 | 1973 | wreck@10.x.x: 1974 | version "10.0.0" 1975 | resolved "https://registry.yarnpkg.com/wreck/-/wreck-10.0.0.tgz#98ab882f85e16a526332507f101f5a7841162278" 1976 | dependencies: 1977 | boom "4.x.x" 1978 | hoek "4.x.x" 1979 | 1980 | write-file-atomic@^1.1.2: 1981 | version "1.3.1" 1982 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.1.tgz#7d45ba32316328dd1ec7d90f60ebc0d845bb759a" 1983 | dependencies: 1984 | graceful-fs "^4.1.11" 1985 | imurmurhash "^0.1.4" 1986 | slide "^1.1.5" 1987 | 1988 | xdg-basedir@^2.0.0: 1989 | version "2.0.0" 1990 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-2.0.0.tgz#edbc903cc385fc04523d966a335504b5504d1bd2" 1991 | dependencies: 1992 | os-homedir "^1.0.0" 1993 | 1994 | xtend@^4.0.0: 1995 | version "4.0.1" 1996 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1997 | 1998 | y18n@^3.2.0, y18n@^3.2.1: 1999 | version "3.2.1" 2000 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 2001 | 2002 | yallist@^2.0.0: 2003 | version "2.0.0" 2004 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 2005 | 2006 | yargonaut@^1.1.2: 2007 | version "1.1.2" 2008 | resolved "https://registry.yarnpkg.com/yargonaut/-/yargonaut-1.1.2.tgz#ee7b89e98121a3f241fa926a2a6e1b6641c81b3f" 2009 | dependencies: 2010 | chalk "^1.1.1" 2011 | figlet "^1.1.1" 2012 | parent-require "^1.0.0" 2013 | 2014 | yargs-parser@^4.2.0: 2015 | version "4.2.1" 2016 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 2017 | dependencies: 2018 | camelcase "^3.0.0" 2019 | 2020 | yargs@^3.19.0: 2021 | version "3.32.0" 2022 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" 2023 | dependencies: 2024 | camelcase "^2.0.1" 2025 | cliui "^3.0.3" 2026 | decamelize "^1.1.1" 2027 | os-locale "^1.4.0" 2028 | string-width "^1.0.1" 2029 | window-size "^0.1.4" 2030 | y18n "^3.2.0" 2031 | 2032 | yargs@^6.6.0: 2033 | version "6.6.0" 2034 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" 2035 | dependencies: 2036 | camelcase "^3.0.0" 2037 | cliui "^3.2.0" 2038 | decamelize "^1.1.1" 2039 | get-caller-file "^1.0.1" 2040 | os-locale "^1.4.0" 2041 | read-pkg-up "^1.0.1" 2042 | require-directory "^2.1.1" 2043 | require-main-filename "^1.0.1" 2044 | set-blocking "^2.0.0" 2045 | string-width "^1.0.2" 2046 | which-module "^1.0.0" 2047 | y18n "^3.2.1" 2048 | yargs-parser "^4.2.0" 2049 | 2050 | yn@^1.2.0: 2051 | version "1.2.0" 2052 | resolved "https://registry.yarnpkg.com/yn/-/yn-1.2.0.tgz#d237a4c533f279b2b89d3acac2db4b8c795e4a63" 2053 | -------------------------------------------------------------------------------- /webapp/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "webapp", 3 | "version": "1.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "build": "webpack --progress", 7 | "watch": "npm run build -- --watch", 8 | "server": "webpack-dev-server --inline --progress --port 3000 --content-base src", 9 | "start": "npm run server" 10 | }, 11 | "dependencies": { 12 | "@angular/common": "2.4.8", 13 | "@angular/compiler": "2.4.8", 14 | "@angular/core": "2.4.8", 15 | "@angular/forms": "2.4.8", 16 | "@angular/http": "2.4.8", 17 | "@angular/platform-browser": "2.4.8", 18 | "@angular/platform-browser-dynamic": "2.4.8", 19 | "@angular/router": "3.4.8", 20 | "bootstrap": "3.3.7", 21 | "core-js": "2.4.1", 22 | "ie-shim": "0.1.0", 23 | "reflect-metadata": "0.1.10", 24 | "rxjs": "5.0.1", 25 | "zone.js": "0.7.7" 26 | }, 27 | "devDependencies": { 28 | "@types/node": "^7.0.5", 29 | "angular2-router-loader": "^0.3.4", 30 | "angular2-template-loader": "^0.6.0", 31 | "awesome-typescript-loader": "^2.2.4", 32 | "css-loader": "^0.25.0", 33 | "raw-loader": "^0.5.1", 34 | "to-string-loader": "^1.1.4", 35 | "typescript": "~2.0.10", 36 | "webpack": "2.2.1", 37 | "webpack-dev-server": "^2.4.1", 38 | "webpack-merge": "^0.15.0" 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /webapp/src/app/about/about.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/webapp/src/app/about/about.component.css -------------------------------------------------------------------------------- /webapp/src/app/about/about.component.html: -------------------------------------------------------------------------------- 1 |

About Component

2 |

This is the about component!

-------------------------------------------------------------------------------- /webapp/src/app/about/about.component.ts: -------------------------------------------------------------------------------- 1 | import {Component} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'about', 5 | styleUrls: ['./about.component.css'], 6 | templateUrl: './about.component.html' 7 | }) 8 | export class AboutComponent { 9 | } 10 | -------------------------------------------------------------------------------- /webapp/src/app/app.component.html: -------------------------------------------------------------------------------- 1 |

2 | Angular 2 Seed 3 |

4 | 21 | 22 |
23 | 24 |
25 | 26 | 27 |
28 | © 2016 29 |
30 | -------------------------------------------------------------------------------- /webapp/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import {Component} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'app', 5 | templateUrl: './app.component.html', 6 | }) 7 | export class AppComponent { 8 | } 9 | -------------------------------------------------------------------------------- /webapp/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { NgModule } from '@angular/core' 2 | import { RouterModule } from '@angular/router'; 3 | import { rootRouterConfig } from './app.routes'; 4 | import { AppComponent } from './app.component'; 5 | import { GithubService } from './github/shared/github.service'; 6 | import { FormsModule, ReactiveFormsModule } from '@angular/forms'; 7 | import { BrowserModule } from '@angular/platform-browser'; 8 | import { HttpModule } from '@angular/http'; 9 | 10 | import { AboutComponent } from './about/about.component'; 11 | import { HomeComponent } from './home/home.component'; 12 | import { RepoBrowserComponent } from './github/repo-browser/repo-browser.component'; 13 | import { RepoListComponent } from './github/repo-list/repo-list.component'; 14 | import { RepoDetailComponent } from './github/repo-detail/repo-detail.component'; 15 | import { LocationStrategy, HashLocationStrategy } from '@angular/common'; 16 | import { ContactComponent } from './contact/contact.component'; 17 | 18 | @NgModule({ 19 | declarations: [ 20 | AppComponent, 21 | AboutComponent, 22 | RepoBrowserComponent, 23 | RepoListComponent, 24 | RepoDetailComponent, 25 | HomeComponent, 26 | ContactComponent 27 | ], 28 | imports: [ 29 | BrowserModule, 30 | FormsModule, 31 | ReactiveFormsModule, 32 | HttpModule, 33 | RouterModule.forRoot(rootRouterConfig, { useHash: true }) 34 | ], 35 | providers: [ 36 | GithubService 37 | ], 38 | bootstrap: [ AppComponent ] 39 | }) 40 | export class AppModule { 41 | 42 | } 43 | -------------------------------------------------------------------------------- /webapp/src/app/app.routes.ts: -------------------------------------------------------------------------------- 1 | import { Routes } from '@angular/router'; 2 | 3 | import { AboutComponent } from './about/about.component'; 4 | import { HomeComponent } from './home/home.component'; 5 | import { RepoBrowserComponent } from './github/repo-browser/repo-browser.component'; 6 | import { RepoListComponent } from './github/repo-list/repo-list.component'; 7 | import { RepoDetailComponent } from './github/repo-detail/repo-detail.component'; 8 | import { ContactComponent } from './contact/contact.component'; 9 | 10 | export const rootRouterConfig: Routes = [ 11 | { path: '', redirectTo: 'home', pathMatch: 'full' }, 12 | { path: 'home', component: HomeComponent }, 13 | { path: 'about', component: AboutComponent }, 14 | { path: 'github', component: RepoBrowserComponent, 15 | children: [ 16 | { path: '', component: RepoListComponent }, 17 | { path: ':org', component: RepoListComponent, 18 | children: [ 19 | { path: '', component: RepoDetailComponent }, 20 | { path: ':repo', component: RepoDetailComponent } 21 | ] 22 | }] 23 | }, 24 | { path: 'contact', component: ContactComponent } 25 | ]; 26 | 27 | -------------------------------------------------------------------------------- /webapp/src/app/contact/contact-component.css: -------------------------------------------------------------------------------- 1 | .form-content { 2 | width: 90%; 3 | max-width: 600px; 4 | margin: 0 auto; 5 | } 6 | .form-content .sd-form-control { 7 | display: block; 8 | margin-bottom: 10px; 9 | width: 100%; 10 | padding: 10px; 11 | } 12 | .form-content textarea.sd-form-control { 13 | max-width: 100%; 14 | } 15 | -------------------------------------------------------------------------------- /webapp/src/app/contact/contact.component.html: -------------------------------------------------------------------------------- 1 |

Contact Reactive Form

2 | 3 |
4 |
5 | 9 | 13 | 17 |
18 | 19 |
20 |
21 |
22 | 23 |
24 | Form value: 25 |
26 |     {{contactForm.value | json}}
27 |   
28 |

29 | Status: {{contactForm.status}} 30 |

31 |

32 | Valid: {{contactForm.valid}} 33 |

34 |

Submit then open console to see full form.

35 |
36 | 37 | -------------------------------------------------------------------------------- /webapp/src/app/contact/contact.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit } from '@angular/core'; 2 | import { FormBuilder, FormGroup, Validators } from '@angular/forms'; 3 | import CustomValidators from '../forms/CustomValidators'; 4 | 5 | @Component({ 6 | selector: 'app-contact', 7 | templateUrl: './contact.component.html', 8 | styleUrls: ['./contact-component.css'] 9 | }) 10 | export class ContactComponent implements OnInit { 11 | contactForm: FormGroup; 12 | constructor(private formBuilder: FormBuilder) {} 13 | 14 | ngOnInit() { 15 | this.contactForm = this.formBuilder.group({ 16 | name: ['', Validators.required], 17 | email: ['', [Validators.required, CustomValidators.validateEmail]], 18 | content: ['', [Validators.required, Validators.minLength(10)]] 19 | }); 20 | } 21 | submitForm(): void { 22 | console.log(this.contactForm); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /webapp/src/app/forms/CustomValidators.ts: -------------------------------------------------------------------------------- 1 | import {FormControl} from '@angular/forms'; 2 | 3 | export default class CustomValidators { 4 | /** 5 | * sample from http://blog.thoughtram.io/angular/2016/03/14/custom-validators-in-angular-2.html 6 | */ 7 | static validateEmail(c: FormControl) { 8 | let EMAIL_REGEXP = /(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/; 9 | 10 | return EMAIL_REGEXP.test(c.value) ? null : { 11 | validateEmail: { 12 | valid: false 13 | } 14 | }; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /webapp/src/app/github/repo-browser/repo-browser.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/webapp/src/app/github/repo-browser/repo-browser.component.css -------------------------------------------------------------------------------- /webapp/src/app/github/repo-browser/repo-browser.component.html: -------------------------------------------------------------------------------- 1 |

GitHub Browser

2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /webapp/src/app/github/repo-browser/repo-browser.component.ts: -------------------------------------------------------------------------------- 1 | import { Component } from '@angular/core'; 2 | import { Router } from '@angular/router'; 3 | import { GithubService } from '../shared/github.service'; 4 | 5 | @Component({ 6 | selector: 'repo-browser', 7 | templateUrl: './repo-browser.component.html', 8 | styleUrls: ['./repo-browser.component.css'] 9 | }) 10 | export class RepoBrowserComponent { 11 | 12 | constructor(private router: Router, private github: GithubService) { 13 | } 14 | 15 | searchForOrg(orgName: string) { 16 | this.github.getOrg(orgName) 17 | .subscribe(({name}) => { 18 | console.log(name); 19 | this.router.navigate(['/github', orgName]); 20 | }); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /webapp/src/app/github/repo-detail/repo-detail.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/webapp/src/app/github/repo-detail/repo-detail.component.css -------------------------------------------------------------------------------- /webapp/src/app/github/repo-detail/repo-detail.component.html: -------------------------------------------------------------------------------- 1 |

{{ repoDetails.full_name }}

2 | 3 |
this.repoDetails = {{ repoDetails | json }}
4 | -------------------------------------------------------------------------------- /webapp/src/app/github/repo-detail/repo-detail.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit} from '@angular/core'; 2 | import {ActivatedRoute} from '@angular/router'; 3 | import {GithubService} from '../shared/github.service'; 4 | 5 | @Component({ 6 | selector: 'repo-detail', 7 | styleUrls: ['./repo-detail.component.css'], 8 | templateUrl: './repo-detail.component.html' 9 | }) 10 | export class RepoDetailComponent implements OnInit { 11 | private org:string; 12 | private repo:string; 13 | public repoDetails:any = {}; 14 | 15 | constructor(public github:GithubService, private route:ActivatedRoute) { 16 | } 17 | 18 | ngOnInit() { 19 | this.route.params.subscribe(params => { 20 | this.org = this.route.snapshot.parent.params['org']; 21 | this.repo = params['repo'] || ''; 22 | 23 | if (this.repo) { 24 | this.github.getRepoForOrg(this.org, this.repo) 25 | .subscribe(repoDetails => { 26 | this.repoDetails = repoDetails; 27 | }); 28 | } 29 | }); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /webapp/src/app/github/repo-list/repo-list.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/webapp/src/app/github/repo-list/repo-list.component.css -------------------------------------------------------------------------------- /webapp/src/app/github/repo-list/repo-list.component.html: -------------------------------------------------------------------------------- 1 |

Repo list

2 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /webapp/src/app/github/repo-list/repo-list.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit} from '@angular/core'; 2 | import {GithubService} from '../shared/github.service'; 3 | import {Observable} from 'rxjs/Observable'; 4 | import {ActivatedRoute} from '@angular/router'; 5 | 6 | @Component({ 7 | selector: 'repo-list', 8 | styleUrls: ['./repo-list.component.css'], 9 | templateUrl: './repo-list.component.html', 10 | }) 11 | export class RepoListComponent implements OnInit { 12 | org: string; 13 | repos: Observable; 14 | 15 | constructor(public github: GithubService, private route: ActivatedRoute) { 16 | } 17 | 18 | ngOnInit() { 19 | this.route.params.subscribe(params => { 20 | this.org = params['org']; 21 | if (this.org) { 22 | this.repos = this.github.getReposForOrg(this.org); 23 | } 24 | }); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /webapp/src/app/github/shared/github.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import { Http, URLSearchParams } from '@angular/http'; 3 | import 'rxjs/add/operator/map'; 4 | 5 | @Injectable() 6 | export class GithubService { 7 | constructor(private http: Http) {} 8 | 9 | getOrg(org: string) { 10 | return this.makeRequest(`orgs/${org}`); 11 | } 12 | 13 | getReposForOrg(org: string) { 14 | return this.makeRequest(`orgs/${org}/repos`); 15 | } 16 | 17 | getRepoForOrg(org: string, repo: string) { 18 | return this.makeRequest(`repos/${org}/${repo}`); 19 | } 20 | 21 | private makeRequest(path: string) { 22 | let params = new URLSearchParams(); 23 | params.set('per_page', '100'); 24 | 25 | let url = `https://api.github.com/${ path }`; 26 | return this.http.get(url, {search: params}) 27 | .map((res) => res.json()); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /webapp/src/app/home/home.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/webapp/src/app/home/home.component.css -------------------------------------------------------------------------------- /webapp/src/app/home/home.component.html: -------------------------------------------------------------------------------- 1 |

Home Component

2 |

Welcome to Angular Seed

-------------------------------------------------------------------------------- /webapp/src/app/home/home.component.ts: -------------------------------------------------------------------------------- 1 | import {Component} from '@angular/core'; 2 | 3 | @Component({ 4 | selector: 'home', 5 | styleUrls: ['./home.component.css'], 6 | templateUrl: './home.component.html' 7 | }) 8 | export class HomeComponent { 9 | } 10 | -------------------------------------------------------------------------------- /webapp/src/custom-typings.d.ts: -------------------------------------------------------------------------------- 1 | /* 2 | * Custom Type Definitions 3 | * When including 3rd party modules you also need to include the type definition for the module 4 | * if they don't provide one within the module. You can try to install it with typings 5 | 6 | typings install node --save 7 | 8 | * If you can't find the type definition in the registry we can make an ambient definition in 9 | * this file for now. For example 10 | 11 | declare module "my-module" { 12 | export function doesSomething(value: string): string; 13 | } 14 | 15 | * 16 | * If you're prototying and you will fix the types later you can also declare it as type any 17 | * 18 | 19 | declare var assert: any; 20 | 21 | * 22 | * If you're importing a module that uses Node.js modules which are CommonJS you need to import as 23 | * 24 | 25 | import * as _ from 'lodash' 26 | 27 | * You can include your type definitions in this file until you create one for the typings registry 28 | * see https://github.com/typings/registry 29 | * 30 | */ 31 | -------------------------------------------------------------------------------- /webapp/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/icereval/typescript-seed/5e3ee6860036bf4c6f354a1b33a2fddd6aafd472/webapp/src/favicon.ico -------------------------------------------------------------------------------- /webapp/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Angular2 Seed 7 | 8 | 9 | 10 | 11 | 12 | Loading... 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /webapp/src/main.browser.ts: -------------------------------------------------------------------------------- 1 | import './polyfills.browser'; 2 | 3 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 4 | import { AppModule } from './app/app.module'; 5 | 6 | export const platformRef = platformBrowserDynamic(); 7 | 8 | export function main() { 9 | return platformRef.bootstrapModule(AppModule) 10 | .catch(err => console.error(err)); 11 | } 12 | 13 | // support async tag or hmr 14 | switch (document.readyState) { 15 | case 'interactive': 16 | case 'complete': 17 | main(); 18 | break; 19 | case 'loading': 20 | default: 21 | document.addEventListener('DOMContentLoaded', () => main()); 22 | } 23 | -------------------------------------------------------------------------------- /webapp/src/polyfills.browser.ts: -------------------------------------------------------------------------------- 1 | // Polyfills 2 | 3 | import 'ie-shim'; // Internet Explorer 9 support 4 | 5 | // import 'core-js/es6'; 6 | // Added parts of es6 which are necessary for your project or your browser support requirements. 7 | import 'core-js/es6/symbol'; 8 | import 'core-js/es6/object'; 9 | import 'core-js/es6/function'; 10 | import 'core-js/es6/parse-int'; 11 | import 'core-js/es6/parse-float'; 12 | import 'core-js/es6/number'; 13 | import 'core-js/es6/math'; 14 | import 'core-js/es6/string'; 15 | import 'core-js/es6/date'; 16 | import 'core-js/es6/array'; 17 | import 'core-js/es6/regexp'; 18 | import 'core-js/es6/map'; 19 | import 'core-js/es6/set'; 20 | import 'core-js/es6/weak-map'; 21 | import 'core-js/es6/weak-set'; 22 | import 'core-js/es6/typed'; 23 | import 'core-js/es6/reflect'; 24 | // see issue https://github.com/AngularClass/angular2-webpack-starter/issues/709 25 | // import 'core-js/es6/promise'; 26 | 27 | import 'core-js/es7/reflect'; 28 | import 'zone.js/dist/zone'; 29 | import 'zone.js/dist/long-stack-trace-zone'; 30 | -------------------------------------------------------------------------------- /webapp/tsconfig.aot.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "declaration": false, 4 | "emitDecoratorMetadata": true, 5 | "experimentalDecorators": true, 6 | "module": "commonjs", 7 | "moduleResolution": "node", 8 | "outDir": "dist", 9 | "sourceMap": true, 10 | "sourceRoot": "src", 11 | "noEmitHelpers": true, 12 | "target": "es5", 13 | "typeRoots": [ 14 | "node_modules/@types" 15 | ], 16 | "lib": ["es6", "dom"] 17 | }, 18 | "include": [ 19 | "./src/**/*.module.ts", 20 | "./src/*.d.ts" 21 | ], 22 | "angularCompilerOptions": { 23 | "debug": false 24 | }, 25 | "compileOnSave": false, 26 | "buildOnSave": false, 27 | "atom": { "rewriteTsconfig": false } 28 | } 29 | -------------------------------------------------------------------------------- /webapp/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "outDir": "dist", 6 | "rootDir": ".", 7 | "sourceMap": true, 8 | "emitDecoratorMetadata": true, 9 | "experimentalDecorators": true, 10 | "moduleResolution": "node", 11 | "typeRoots": [ 12 | "node_modules/@types" 13 | ], 14 | "lib": ["es6", "dom"] 15 | }, 16 | "exclude": [ 17 | "node_modules" 18 | ], 19 | "awesomeTypescriptLoaderOptions": { 20 | "useWebpackText": true 21 | }, 22 | "angularCompilerOptions": { 23 | "debug": false 24 | }, 25 | "compileOnSave": false, 26 | "buildOnSave": false, 27 | "atom": { "rewriteTsconfig": false } 28 | } 29 | -------------------------------------------------------------------------------- /webapp/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "exclude": [ 3 | "node_modules", 4 | "typtings" 5 | ], 6 | "rules": { 7 | "align": [ 8 | true, 9 | "parameters", 10 | "statements" 11 | ], 12 | "ban": false, 13 | "class-name": true, 14 | "comment-format": [ 15 | true, 16 | "check-space" 17 | ], 18 | "curly": false, 19 | "eofline": true, 20 | "forin": true, 21 | "indent": [ 22 | true, 23 | 2 24 | ], 25 | "interface-name": false, 26 | "jsdoc-format": true, 27 | "label-position": true, 28 | "label-undefined": true, 29 | "max-line-length": [ 30 | true, 31 | 140 32 | ], 33 | "member-ordering": [ 34 | true, 35 | "public-before-private", 36 | "static-before-instance", 37 | "variables-before-functions" 38 | ], 39 | "no-any": false, 40 | "no-arg": true, 41 | "no-bitwise": true, 42 | "no-construct": true, 43 | "no-constructor-vars": true, 44 | "no-debugger": true, 45 | "no-duplicate-key": true, 46 | "no-shadowed-variable": true, 47 | "no-duplicate-variable": true, 48 | "no-empty": true, 49 | "no-eval": true, 50 | "no-require-imports": true, 51 | "no-string-literal": true, 52 | "no-switch-case-fall-through": true, 53 | "trailing-comma": [true, { 54 | "singleline": "never", 55 | "multiline": "always" 56 | }], 57 | "no-trailing-whitespace": true, 58 | "no-unreachable": true, 59 | "no-unused-expression": true, 60 | "no-unused-variable": true, 61 | "no-use-before-declare": true, 62 | "no-var-keyword": true, 63 | "no-var-requires": false, 64 | "one-line": [ 65 | true, 66 | "check-open-brace", 67 | "check-catch", 68 | "check-else", 69 | "check-whitespace" 70 | ], 71 | "quotemark": [ 72 | true, 73 | "single" 74 | ], 75 | "radix": true, 76 | "semicolon": true, 77 | "switch-default": true, 78 | "triple-equals": [ 79 | true, 80 | "allow-null-check" 81 | ], 82 | "typedef": [ 83 | true, 84 | "call-signature", 85 | "parameter", 86 | "property-declaration", 87 | "member-variable-declaration" 88 | ], 89 | "typedef-whitespace": [ 90 | true, 91 | { 92 | "call-signature": "nospace", 93 | "index-signature": "nospace", 94 | "parameter": "nospace", 95 | "property-declaration": "nospace", 96 | "variable-declaration": "nospace" 97 | } 98 | ], 99 | "use-strict": [ 100 | false, 101 | "check-module", 102 | "check-function" 103 | ], 104 | "variable-name": false, 105 | "whitespace": [ 106 | true, 107 | "check-branch", 108 | "check-decl", 109 | "check-operator", 110 | "check-separator", 111 | "check-type" 112 | ] 113 | } 114 | } 115 | -------------------------------------------------------------------------------- /webapp/webpack.config.js: -------------------------------------------------------------------------------- 1 | var webpack = require('webpack'); 2 | var path = require('path'); 3 | var webpackMerge = require('webpack-merge'); 4 | 5 | // Webpack Config 6 | var webpackConfig = { 7 | entry: { 8 | 'main': './src/main.browser.ts', 9 | }, 10 | 11 | output: { 12 | publicPath: '', 13 | path: path.resolve(__dirname, './dist'), 14 | }, 15 | 16 | plugins: [ 17 | new webpack.ContextReplacementPlugin( 18 | // The (\\|\/) piece accounts for path separators in *nix and Windows 19 | /angular(\\|\/)core(\\|\/)src(\\|\/)linker/, 20 | path.resolve(__dirname, './src'), 21 | { 22 | // your Angular Async Route paths relative to this root directory 23 | } 24 | ), 25 | ], 26 | 27 | module: { 28 | loaders: [ 29 | // .ts files for TypeScript 30 | { 31 | test: /\.ts$/, 32 | loaders: [ 33 | 'awesome-typescript-loader', 34 | 'angular2-template-loader', 35 | 'angular2-router-loader' 36 | ] 37 | }, 38 | { test: /\.css$/, loaders: ['to-string-loader', 'css-loader'] }, 39 | { test: /\.html$/, loader: 'raw-loader' } 40 | ] 41 | } 42 | 43 | }; 44 | 45 | 46 | // Our Webpack Defaults 47 | var defaultConfig = { 48 | devtool: 'source-map', 49 | 50 | output: { 51 | filename: '[name].bundle.js', 52 | sourceMapFilename: '[name].map', 53 | chunkFilename: '[id].chunk.js' 54 | }, 55 | 56 | resolve: { 57 | extensions: [ '.ts', '.js' ], 58 | modules: [ path.resolve(__dirname, 'node_modules') ] 59 | }, 60 | 61 | devServer: { 62 | historyApiFallback: true, 63 | watchOptions: { aggregateTimeout: 300, poll: 1000 }, 64 | headers: { 65 | "Access-Control-Allow-Origin": "*", 66 | "Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, PATCH, OPTIONS", 67 | "Access-Control-Allow-Headers": "X-Requested-With, content-type, Authorization" 68 | } 69 | }, 70 | 71 | node: { 72 | global: true, 73 | crypto: 'empty', 74 | __dirname: true, 75 | __filename: true, 76 | process: true, 77 | Buffer: false, 78 | clearImmediate: false, 79 | setImmediate: false 80 | } 81 | }; 82 | 83 | 84 | module.exports = webpackMerge(defaultConfig, webpackConfig); 85 | --------------------------------------------------------------------------------