From 9c26cd5837ef7fdf693928161d26a8c061345bd8 Mon Sep 17 00:00:00 2001 From: shirlenequah Date: Mon, 26 Feb 2018 18:49:46 +0800 Subject: [PATCH 01/17] Updates --- Dockerfile | 14 - LICENSE | 201 - NodeApp/.dockerignore | 2 + NodeApp/.gitignore | 5 + NodeApp/Dockerfile | 23 + NodeApp/app.js | 96 + NodeApp/assets/app/app.component.html | 5 + NodeApp/assets/app/app.component.ts | 11 + NodeApp/assets/app/app.module.ts | 48 + NodeApp/assets/app/app.routing.ts | 15 + NodeApp/assets/app/auth/auth.routes.ts | 12 + NodeApp/assets/app/auth/auth.service.ts | 67 + .../app/auth/authentication.component.ts | 27 + NodeApp/assets/app/auth/logout.component.ts | 21 + NodeApp/assets/app/auth/signin.component.html | 24 + NodeApp/assets/app/auth/signin.component.ts | 45 + NodeApp/assets/app/auth/signup.component.html | 40 + NodeApp/assets/app/auth/signup.component.ts | 48 + NodeApp/assets/app/auth/user.model.ts | 6 + NodeApp/assets/app/header.component.ts | 19 + NodeApp/assets/app/main.aot.ts | 9 + NodeApp/assets/app/main.ts | 7 + .../app/messages/message-input.component.html | 36 + .../app/messages/message-input.component.ts | 51 + .../app/messages/message-list.component.ts | 32 + .../app/messages/message.component.html | 18 + .../assets/app/messages/message.component.ts | 45 + NodeApp/assets/app/messages/message.model.ts | 15 + .../assets/app/messages/message.service.ts | 142 + .../assets/app/messages/messages.component.ts | 17 + .../myMessages/my-message-list.component.ts | 33 + .../myMessages/my-message.component.html | 22 + .../myMessages/my-message.component.ts | 51 + NodeApp/assets/app/polyfills.ts | 10 + NodeApp/bin/www | 105 + NodeApp/models/counter.js | 12 + NodeApp/models/message.js | 24 + NodeApp/models/user.js | 17 + NodeApp/models/uuid.js | 21 + NodeApp/package-lock.json | 6549 +++++++++++++++++ NodeApp/package.json | 57 + NodeApp/routes/app.js | 25 + NodeApp/routes/messages.js | 228 + NodeApp/routes/user.js | 108 + NodeApp/tsconfig.aot.json | 22 + NodeApp/tsconfig.json | 15 + NodeApp/uiApp.js | 58 + NodeApp/views/index.hbs | 15 + NodeApp/webpack.config.common.js | 26 + NodeApp/webpack.config.dev.js | 30 + NodeApp/webpack.config.prod.js | 46 + README.md | 44 +- docker-compose.yml | 21 + docs/index.html | 571 -- img/samplescreenshot.png | Bin 51332 -> 0 bytes mongo/Dockerfile | 91 + mongo/docker-entrypoint.sh | 340 + run.sh | 13 +- src/html/demo.js | 47 - src/html/index.html | 26 - src/service/app.py | 61 - src/service/start_services.sh | 4 - src/service/team_members.txt | 3 - 63 files changed, 8834 insertions(+), 962 deletions(-) delete mode 100644 Dockerfile delete mode 100644 LICENSE create mode 100755 NodeApp/.dockerignore create mode 100755 NodeApp/.gitignore create mode 100755 NodeApp/Dockerfile create mode 100755 NodeApp/app.js create mode 100755 NodeApp/assets/app/app.component.html create mode 100755 NodeApp/assets/app/app.component.ts create mode 100755 NodeApp/assets/app/app.module.ts create mode 100755 NodeApp/assets/app/app.routing.ts create mode 100755 NodeApp/assets/app/auth/auth.routes.ts create mode 100755 NodeApp/assets/app/auth/auth.service.ts create mode 100755 NodeApp/assets/app/auth/authentication.component.ts create mode 100755 NodeApp/assets/app/auth/logout.component.ts create mode 100755 NodeApp/assets/app/auth/signin.component.html create mode 100755 NodeApp/assets/app/auth/signin.component.ts create mode 100755 NodeApp/assets/app/auth/signup.component.html create mode 100755 NodeApp/assets/app/auth/signup.component.ts create mode 100755 NodeApp/assets/app/auth/user.model.ts create mode 100755 NodeApp/assets/app/header.component.ts create mode 100755 NodeApp/assets/app/main.aot.ts create mode 100755 NodeApp/assets/app/main.ts create mode 100755 NodeApp/assets/app/messages/message-input.component.html create mode 100755 NodeApp/assets/app/messages/message-input.component.ts create mode 100755 NodeApp/assets/app/messages/message-list.component.ts create mode 100755 NodeApp/assets/app/messages/message.component.html create mode 100755 NodeApp/assets/app/messages/message.component.ts create mode 100755 NodeApp/assets/app/messages/message.model.ts create mode 100755 NodeApp/assets/app/messages/message.service.ts create mode 100755 NodeApp/assets/app/messages/messages.component.ts create mode 100755 NodeApp/assets/app/messages/myMessages/my-message-list.component.ts create mode 100755 NodeApp/assets/app/messages/myMessages/my-message.component.html create mode 100755 NodeApp/assets/app/messages/myMessages/my-message.component.ts create mode 100755 NodeApp/assets/app/polyfills.ts create mode 100755 NodeApp/bin/www create mode 100755 NodeApp/models/counter.js create mode 100755 NodeApp/models/message.js create mode 100755 NodeApp/models/user.js create mode 100755 NodeApp/models/uuid.js create mode 100755 NodeApp/package-lock.json create mode 100755 NodeApp/package.json create mode 100755 NodeApp/routes/app.js create mode 100755 NodeApp/routes/messages.js create mode 100755 NodeApp/routes/user.js create mode 100755 NodeApp/tsconfig.aot.json create mode 100755 NodeApp/tsconfig.json create mode 100755 NodeApp/uiApp.js create mode 100755 NodeApp/views/index.hbs create mode 100755 NodeApp/webpack.config.common.js create mode 100755 NodeApp/webpack.config.dev.js create mode 100755 NodeApp/webpack.config.prod.js mode change 100644 => 100755 README.md create mode 100755 docker-compose.yml delete mode 100644 docs/index.html delete mode 100644 img/samplescreenshot.png create mode 100755 mongo/Dockerfile create mode 100755 mongo/docker-entrypoint.sh delete mode 100644 src/html/demo.js delete mode 100644 src/html/index.html delete mode 100644 src/service/app.py delete mode 100644 src/service/start_services.sh delete mode 100644 src/service/team_members.txt diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 77837fc..0000000 --- a/Dockerfile +++ /dev/null @@ -1,14 +0,0 @@ -FROM ubuntu:latest -RUN apt-get update -RUN apt-get install -y python-pip -RUN apt-get install -y apache2 -RUN pip install -U pip -RUN pip install -U flask -RUN pip install -U flask-cors -RUN echo "ServerName localhost " >> /etc/apache2/apache2.conf -RUN echo "$user hard nproc 20" >> /etc/security/limits.conf -ADD ./src/service /service -ADD ./src/html /var/www/html -EXPOSE 80 -EXPOSE 8080 -CMD ["/bin/bash", "/service/start_services.sh"] diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9..0000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/NodeApp/.dockerignore b/NodeApp/.dockerignore new file mode 100755 index 0000000..0a03045 --- /dev/null +++ b/NodeApp/.dockerignore @@ -0,0 +1,2 @@ +node_modules/ +public/ diff --git a/NodeApp/.gitignore b/NodeApp/.gitignore new file mode 100755 index 0000000..fe3b941 --- /dev/null +++ b/NodeApp/.gitignore @@ -0,0 +1,5 @@ +/node_modules +/.idea +/typings +/public/js/ +npm-debug.log diff --git a/NodeApp/Dockerfile b/NodeApp/Dockerfile new file mode 100755 index 0000000..be242ee --- /dev/null +++ b/NodeApp/Dockerfile @@ -0,0 +1,23 @@ +FROM node:8 + +# Create a directory where our app will be placed +RUN mkdir -p /usr/src/app + +# Change directory so that our commands run inside this new directory +WORKDIR /usr/src/app + +# Copy dependency definitions +COPY package.json /usr/src/app + +# Install dependecies +RUN npm install + +# Get all the code needed to run the app +COPY . /usr/src/app + +# Expose the port the app runs in +EXPOSE 3000 8080 + +# Serve the app +RUN npm run build:prod +CMD ["npm", "start"] \ No newline at end of file diff --git a/NodeApp/app.js b/NodeApp/app.js new file mode 100755 index 0000000..f5cb028 --- /dev/null +++ b/NodeApp/app.js @@ -0,0 +1,96 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); +var mongoose = require('mongoose'); + +var messageRoutes = require('./routes/messages'); +var userRoutes = require('./routes/user'); +var app = express(); +var IdCounter = require('./models/counter'); +var dbhost = process.env.DBHOST || 'localhost:27017'; +console.log ("STARTING HERE TEST DB HOST: " + dbhost); +mongoose.connect( dbhost + '/node-angular'); + + +IdCounter.find({type: "message"}, function (err, resultArray) { + if (err) throw err; + console.log(resultArray); + if(resultArray.length ==0) { + var a = new IdCounter({counter: 0, type: "message"}); + a.save(); + } +}); +//Change this to the script later + +// view engine setup +app.set('views', path.join(__dirname, 'views')); +app.set('view engine', 'hbs'); + + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +app.use(logger('dev')); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({extended: false})); +app.use(cookieParser()); +app.use(express.static(path.join(__dirname, 'public'))); + +app.use(function (req, res, next) { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + res.setHeader('Access-Control-Allow-Methods', 'POST, GET'); + // res.status(200); + next(); +}); + + +app.get('/meta/heartbeat', function (req, res) { + res.contentType("application/json"); + res.status(200).json({ + "status": true + }); +}); + +app.get('/meta/members', function (req, res) { + res.contentType("application/json"); + res.status(200).json({ + "status": true, + "result": [ + "Wei Lip", + "James", + "Ben", + "Shirlene" + ] + }); +}); + +app.use('/diary', messageRoutes); +app.use('/users', userRoutes.router); + +// app.use('', appRoutes); +app.get('/', function (req, res, next) { + res.contentType("application/json"); + res.status(200).json({ + "status": true, + "result": [ + "/", + "/meta/heartbeat", + "/meta/members" + ] + }); + // return res.render('index'); +}); + + +// catch 404 and forward to error handler +app.use(function (req, res, next) { + return res.render('index'); +}); + + + + +module.exports = app; diff --git a/NodeApp/assets/app/app.component.html b/NodeApp/assets/app/app.component.html new file mode 100755 index 0000000..b8ec799 --- /dev/null +++ b/NodeApp/assets/app/app.component.html @@ -0,0 +1,5 @@ +
+ +
+ +
\ No newline at end of file diff --git a/NodeApp/assets/app/app.component.ts b/NodeApp/assets/app/app.component.ts new file mode 100755 index 0000000..c155b90 --- /dev/null +++ b/NodeApp/assets/app/app.component.ts @@ -0,0 +1,11 @@ +import { Component } from '@angular/core'; + +import { MessageService } from "./messages/message.service"; + +@Component({ + selector: 'my-app', + templateUrl: './app.component.html', + providers: [MessageService] +}) +export class AppComponent { +} \ No newline at end of file diff --git a/NodeApp/assets/app/app.module.ts b/NodeApp/assets/app/app.module.ts new file mode 100755 index 0000000..27876eb --- /dev/null +++ b/NodeApp/assets/app/app.module.ts @@ -0,0 +1,48 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { FormsModule, ReactiveFormsModule } from "@angular/forms"; +import { HttpModule } from "@angular/http"; + +import { AppComponent } from "./app.component"; +import { MessageComponent } from "./messages/message.component"; +import { MessageListComponent } from "./messages/message-list.component"; +import { MessageInputComponent } from "./messages/message-input.component"; +import { MessagesComponent } from "./messages/messages.component"; +import { AuthenticationComponent } from "./auth/authentication.component"; +import { HeaderComponent } from "./header.component"; +import { routing } from "./app.routing"; +import { LogoutComponent } from "./auth/logout.component"; +import { SignupComponent } from "./auth/signup.component"; +import { SigninComponent } from "./auth/signin.component"; +import { AuthService } from "./auth/auth.service"; +import {MyMessageComponent} from "./messages/myMessages/my-message.component"; +import {MyMessageListComponent} from "./messages/myMessages/my-message-list.component"; + +@NgModule({ + declarations: [ + AppComponent, + MessageComponent, + MessageListComponent, + MessageInputComponent, + MessagesComponent, + AuthenticationComponent, + HeaderComponent, + LogoutComponent, + SignupComponent, + SigninComponent, + MyMessageComponent, + MyMessageListComponent + ], + imports: [ + BrowserModule, + FormsModule, + routing, + ReactiveFormsModule, + HttpModule + ], + providers: [AuthService], + bootstrap: [AppComponent] +}) +export class AppModule { + +} \ No newline at end of file diff --git a/NodeApp/assets/app/app.routing.ts b/NodeApp/assets/app/app.routing.ts new file mode 100755 index 0000000..a525e31 --- /dev/null +++ b/NodeApp/assets/app/app.routing.ts @@ -0,0 +1,15 @@ +import { Routes, RouterModule } from "@angular/router"; + +import { MessagesComponent } from "./messages/messages.component"; +import { AuthenticationComponent } from "./auth/authentication.component"; +import { AUTH_ROUTES } from "./auth/auth.routes"; +import {MyMessageListComponent} from "./messages/myMessages/my-message-list.component"; + +const APP_ROUTES: Routes = [ + { path: '', redirectTo: '/messages', pathMatch: 'full' }, + { path: 'messages', component: MessagesComponent }, + { path: 'mymessages', component: MyMessageListComponent }, + { path: 'auth', component: AuthenticationComponent, children: AUTH_ROUTES } +]; + +export const routing = RouterModule.forRoot(APP_ROUTES); \ No newline at end of file diff --git a/NodeApp/assets/app/auth/auth.routes.ts b/NodeApp/assets/app/auth/auth.routes.ts new file mode 100755 index 0000000..b4a0e30 --- /dev/null +++ b/NodeApp/assets/app/auth/auth.routes.ts @@ -0,0 +1,12 @@ +import { Routes } from "@angular/router"; + +import { SignupComponent } from "./signup.component"; +import { SigninComponent } from "./signin.component"; +import { LogoutComponent } from "./logout.component"; + +export const AUTH_ROUTES: Routes = [ + { path: '', redirectTo: 'signup', pathMatch: 'full' }, + { path: 'signup', component: SignupComponent }, + { path: 'signin', component: SigninComponent }, + { path: 'logout', component: LogoutComponent } +]; \ No newline at end of file diff --git a/NodeApp/assets/app/auth/auth.service.ts b/NodeApp/assets/app/auth/auth.service.ts new file mode 100755 index 0000000..0a926e0 --- /dev/null +++ b/NodeApp/assets/app/auth/auth.service.ts @@ -0,0 +1,67 @@ +import {Injectable} from "@angular/core"; +import {Http, Headers, Response} from "@angular/http"; +import 'rxjs/Rx'; +import {Observable} from "rxjs"; + +import {User} from "./user.model"; + +@Injectable() +export class AuthService { + constructor(private http: Http) { + } + + signup(user: User) { + + const body = JSON.stringify(user); + console.log(body); + const headers = new Headers({'Content-Type': 'application/json'}); + + return this.http.post('http://localhost:8080/users/register', body, {headers: headers}) + .map((response: Response) => response.json()) + .catch((error: Response) => Observable.throw(error.json())); + } + + signin(user: User) { + const body = JSON.stringify(user); + const headers = new Headers({'Content-Type': 'application/json'}); + return this.http.post('http://localhost:8080/users/authenticate', body, {headers: headers}) + .map((response: Response) => response.json()) + .catch((error: Response) => Observable.throw(error.json())); + } + + expire(token: string) { + const body = {"token": token}; + const headers = new Headers({'Content-Type': 'application/json'}); + return this.http.post('http://localhost:8080/users/expire', body, {headers: headers}) + .map((response: Response) => response.json()) + .catch((error: Response) => Observable.throw(error.json())); + } + + getInfo() { + + const headers = new Headers({'Content-Type': 'application/json'}); + const token = localStorage.getItem('token') + ? localStorage.getItem('token') + : ''; + const body = {"token": token}; + console.log("here " + body); + return this.http.post('http://localhost:8080/users', body, {headers: headers}) + .map((response: Response) => { + const result = response.json(); + console.log(result); + }) + .catch((error: Response) => Observable.throw(error.json())); + + } + + + logout() { + console.log("here ") + this.expire(localStorage.getItem('token')).subscribe(); + localStorage.clear(); + } + + isLoggedIn() { + return localStorage.getItem('token') !== null; + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/auth/authentication.component.ts b/NodeApp/assets/app/auth/authentication.component.ts new file mode 100755 index 0000000..ae64a79 --- /dev/null +++ b/NodeApp/assets/app/auth/authentication.component.ts @@ -0,0 +1,27 @@ +import { Component } from "@angular/core"; +import { AuthService } from "./auth.service"; + +@Component({ + selector: 'app-authentication', + template: ` +
+ +
+
+ +
+ ` +}) +export class AuthenticationComponent { + constructor(private authService: AuthService) {} + + isLoggedIn() { + return this.authService.isLoggedIn(); + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/auth/logout.component.ts b/NodeApp/assets/app/auth/logout.component.ts new file mode 100755 index 0000000..ec21d18 --- /dev/null +++ b/NodeApp/assets/app/auth/logout.component.ts @@ -0,0 +1,21 @@ +import { Component } from "@angular/core"; +import { Router } from "@angular/router"; + +import { AuthService } from "./auth.service"; + +@Component({ + selector: 'app-logout', + template: ` +
+ +
+ ` +}) +export class LogoutComponent { + constructor(private authService: AuthService, private router: Router) {} + + onLogout() { + this.authService.logout(); + this.router.navigate(['/auth', 'signin']); + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/auth/signin.component.html b/NodeApp/assets/app/auth/signin.component.html new file mode 100755 index 0000000..9bdbf3e --- /dev/null +++ b/NodeApp/assets/app/auth/signin.component.html @@ -0,0 +1,24 @@ +
+
+
+ + +
+
+ + +
+ +
+
\ No newline at end of file diff --git a/NodeApp/assets/app/auth/signin.component.ts b/NodeApp/assets/app/auth/signin.component.ts new file mode 100755 index 0000000..4321189 --- /dev/null +++ b/NodeApp/assets/app/auth/signin.component.ts @@ -0,0 +1,45 @@ +import { Component } from "@angular/core"; +import { FormGroup, FormControl, Validators } from "@angular/forms"; +import { Router } from "@angular/router"; + +import { User } from "./user.model"; +import { AuthService } from "./auth.service"; + +@Component({ + selector: 'app-signin', + templateUrl: './signin.component.html' +}) +export class SigninComponent { + myForm: FormGroup; + + constructor(private authService: AuthService, private router: Router) {} + + onSubmit() { + const user = new User(this.myForm.value.username, this.myForm.value.password); + this.authService.signin(user) + .subscribe( + data => { + if(data.status == false){ + console.log("Log in Fai led"); + return; + } + + localStorage.setItem('token', data.token); + // localStorage.setItem('userId', data.userId); + console.log("asd"); + this.authService.getInfo().subscribe(); + this.router.navigateByUrl('/'); + }, + error => console.error(error) + ); + + this.myForm.reset(); + } + + ngOnInit() { + this.myForm = new FormGroup({ + username: new FormControl(null, Validators.required), + password: new FormControl(null, Validators.required) + }); + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/auth/signup.component.html b/NodeApp/assets/app/auth/signup.component.html new file mode 100755 index 0000000..119bb95 --- /dev/null +++ b/NodeApp/assets/app/auth/signup.component.html @@ -0,0 +1,40 @@ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
\ No newline at end of file diff --git a/NodeApp/assets/app/auth/signup.component.ts b/NodeApp/assets/app/auth/signup.component.ts new file mode 100755 index 0000000..8993f0e --- /dev/null +++ b/NodeApp/assets/app/auth/signup.component.ts @@ -0,0 +1,48 @@ +import { Component, OnInit } from "@angular/core"; +import { FormGroup, FormControl, Validators } from "@angular/forms"; + +import { AuthService } from "./auth.service"; +import { User } from "./user.model"; + +@Component({ + selector: 'app-signup', + templateUrl: './signup.component.html' +}) +export class SignupComponent implements OnInit { + myForm: FormGroup; + + constructor(private authService: AuthService) { + console.log("started"); + } + + onSubmit() { + console.log("cdcacsdjnajk"); + console.log("alods lol"); + const user = new User( + this.myForm.value.username, + this.myForm.value.password, + this.myForm.value.fullname, + this.myForm.value.age + ); + console.log("alods lvol"); + this.authService.signup(user) + .subscribe( + data => console.log(data), + error => console.error(error) + ); + this.myForm.reset(); + } + + ngOnInit() { + this.myForm = new FormGroup({ + fullname: new FormControl(null, Validators.required), + age: new FormControl(null, Validators.required), + username: new FormControl(null, Validators.required), + // email: new FormControl(null, [ + // Validators.required, + // Validators.pattern("[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?") + // ]), + password: new FormControl(null, Validators.required) + }); + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/auth/user.model.ts b/NodeApp/assets/app/auth/user.model.ts new file mode 100755 index 0000000..a076525 --- /dev/null +++ b/NodeApp/assets/app/auth/user.model.ts @@ -0,0 +1,6 @@ +export class User { + constructor(public username: string, + public password: string, + public fullname?: string, + public age?: string) {} +} \ No newline at end of file diff --git a/NodeApp/assets/app/header.component.ts b/NodeApp/assets/app/header.component.ts new file mode 100755 index 0000000..062dd4a --- /dev/null +++ b/NodeApp/assets/app/header.component.ts @@ -0,0 +1,19 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: 'app-header', + template: ` +
+ +
+ ` +}) +export class HeaderComponent { + +} \ No newline at end of file diff --git a/NodeApp/assets/app/main.aot.ts b/NodeApp/assets/app/main.aot.ts new file mode 100755 index 0000000..f9e32f8 --- /dev/null +++ b/NodeApp/assets/app/main.aot.ts @@ -0,0 +1,9 @@ +import './polyfills'; +import { platformBrowser } from "@angular/platform-browser"; +import { enableProdMode } from "@angular/core"; + +import { AppModuleNgFactory } from './app.module.ngfactory'; + +enableProdMode(); + +platformBrowser().bootstrapModuleFactory(AppModuleNgFactory); \ No newline at end of file diff --git a/NodeApp/assets/app/main.ts b/NodeApp/assets/app/main.ts new file mode 100755 index 0000000..638d357 --- /dev/null +++ b/NodeApp/assets/app/main.ts @@ -0,0 +1,7 @@ +import './polyfills'; + +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from "./app.module"; + +platformBrowserDynamic().bootstrapModule(AppModule); \ No newline at end of file diff --git a/NodeApp/assets/app/messages/message-input.component.html b/NodeApp/assets/app/messages/message-input.component.html new file mode 100755 index 0000000..49dd187 --- /dev/null +++ b/NodeApp/assets/app/messages/message-input.component.html @@ -0,0 +1,36 @@ +
+
+
+ + +
+
+ + +
+
+ +
+ + +
+
\ No newline at end of file diff --git a/NodeApp/assets/app/messages/message-input.component.ts b/NodeApp/assets/app/messages/message-input.component.ts new file mode 100755 index 0000000..07c63b9 --- /dev/null +++ b/NodeApp/assets/app/messages/message-input.component.ts @@ -0,0 +1,51 @@ +import {Component, OnInit} from "@angular/core"; +import {NgForm} from "@angular/forms"; + +import {MessageService} from "./message.service"; +import {Message} from "./message.model"; + +@Component({ + selector: 'app-message-input', + templateUrl: './message-input.component.html' +}) +export class MessageInputComponent implements OnInit { + message: Message; + + constructor(private messageService: MessageService) { + } + + onSubmit(form: NgForm) { + // if (this.message) { + // // Edit + // this.message.text = form.value.text; + // this.messageService.updateMessage(this.message) + // .subscribe( + // result => console.log(result) + // ); + // this.message = null; + // } else { + let formPublic = false; + if (form.value.public) formPublic = true; + console.log(formPublic); + // Create + const message = new Message(form.value.title, formPublic, form.value.text); + this.messageService.addMessage(message) + .subscribe( + data => console.log(JSON.stringify(data)), + error => console.error(error) + ); + // } + form.resetForm(); + } + + onClear(form: NgForm) { + this.message = null; + form.resetForm(); + } + + ngOnInit() { + this.messageService.messageIsEdit.subscribe( + (message: Message) => this.message = message + ); + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/messages/message-list.component.ts b/NodeApp/assets/app/messages/message-list.component.ts new file mode 100755 index 0000000..ecd40b0 --- /dev/null +++ b/NodeApp/assets/app/messages/message-list.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from "@angular/core"; + +import { Message } from "./message.model"; +import { MessageService } from "./message.service"; + +@Component({ + selector: 'app-message-list', + template: ` +
+ +
+ ` +}) +export class MessageListComponent implements OnInit { + messages: Message[]; + + constructor(private messageService: MessageService) {} + + ngOnInit() { + this.messageService.getMessages() + .subscribe( + (messages: Message[]) => { + this.messages = messages; + } + ); + this.messageService.refreshMessage.subscribe((msgs: Message[])=>{ + this.messages = msgs; + }) + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/messages/message.component.html b/NodeApp/assets/app/messages/message.component.html new file mode 100755 index 0000000..f35d7d7 --- /dev/null +++ b/NodeApp/assets/app/messages/message.component.html @@ -0,0 +1,18 @@ +
+ +
+ {{ message.text }} +
+
+
+ Author :{{ message.author }} + Date :{{ message.publish_date }} +
+
+ Edit + Delete +
+
+
\ No newline at end of file diff --git a/NodeApp/assets/app/messages/message.component.ts b/NodeApp/assets/app/messages/message.component.ts new file mode 100755 index 0000000..7eddd8e --- /dev/null +++ b/NodeApp/assets/app/messages/message.component.ts @@ -0,0 +1,45 @@ +import { Component, Input } from "@angular/core"; + +import { Message } from "./message.model"; +import { MessageService } from "./message.service"; + +@Component({ + selector: 'app-message', + templateUrl: './message.component.html', + styles: [` + .author { + display: inline-block; + font-style: italic; + font-size: 12px; + width: 80%; + } + .config { + display: inline-block; + text-align: right; + font-size: 12px; + width: 19%; + } + `] +}) +export class MessageComponent { + public belongs :boolean = false; + @Input() message: Message; + + constructor(private messageService: MessageService) {} + + onEdit() { + this.messageService.editMessage(this.message); + } + + onDelete() { + this.messageService.deleteMessage(this.message) + .subscribe( + result => console.log(result) + + ); + } + + belongsToUser() { + return false; + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/messages/message.model.ts b/NodeApp/assets/app/messages/message.model.ts new file mode 100755 index 0000000..acae1ae --- /dev/null +++ b/NodeApp/assets/app/messages/message.model.ts @@ -0,0 +1,15 @@ +export class Message { + public text: string; + public title: string; + public author: string; + public publish_date: string; + public public: boolean; + public id :number; + + constructor(title?: string, + isPublic?: boolean,text?: string ) { + this.title = title; + this.public = isPublic; + this.text = text; + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/messages/message.service.ts b/NodeApp/assets/app/messages/message.service.ts new file mode 100755 index 0000000..cc30643 --- /dev/null +++ b/NodeApp/assets/app/messages/message.service.ts @@ -0,0 +1,142 @@ +import {Http, Response, Headers} from "@angular/http"; +import {Injectable, EventEmitter} from "@angular/core"; +import 'rxjs/Rx'; +import {Observable} from "rxjs"; + +import {Message} from "./message.model"; + +@Injectable() +export class MessageService { + private messages: Message[] = []; + messageIsEdit = new EventEmitter(); + refreshMessage = new EventEmitter(); + refreshMyMessage = new EventEmitter(); + constructor(private http: Http) { + } + + addMessage(message: Message) { + message["token"] = localStorage.getItem('token'); + const body = JSON.stringify(message); + const headers = new Headers({'Content-Type': 'application/json'}); + console.log(body); + + // const token = localStorage.getItem('token') + // ? '?token=' + localStorage.getItem('token') + // : ''; + return this.http.post('http://localhost:8080/diary/create', body, {headers: headers}) + .map((response: Response) => { + const result = response.json(); + if (result.status == true) { + //Refresh the page with new data + this.getMessages().subscribe((data)=>{ + this.refreshMessage.next(data); + }); + return message; + } else { + } + }) + .catch((error: Response) => Observable.throw(error.json())); + } + + getMessages() { + //asd + return this.http.get('http://localhost:8080/diary') + .map((response: Response) => { + // console.log(response.json()); + const messages = response.json().result; + let transformedMessages: Message[] = []; + for (let message of messages) { + let msg = new Message(); + msg.text = message.text; + msg.title = message.title; + msg.author = message.author; + msg.publish_date = message.publish_date; + msg.public = message.public; + msg.id = message.id; + transformedMessages.push(msg); + } + this.messages = transformedMessages; + return transformedMessages; + }) + .catch((error: Response) => Observable.throw(error.json())); + } +//// + getMyMessages() { + const headers = new Headers({'Content-Type': 'application/json'}); + const token = localStorage.getItem('token') + ? localStorage.getItem('token') + : ''; + const body = {"token": token}; + + return this.http.post('http://localhost:8080/diary', body, {headers: headers}) + .map((response: Response) => { + // console.log(response.json()); + const messages = response.json().result; + let transformedMessages: Message[] = []; + for (let message of messages) { + let msg = new Message(); + msg.text = message.text; + msg.title = message.title; + msg.author = message.author; + msg.publish_date = message.publish_date; + msg.public = message.public; + msg.id = message.id; + transformedMessages.push(msg); + } + this.messages = transformedMessages; + return transformedMessages; + }) + .catch((error: Response) => Observable.throw(error.json())); + } + + + editMessage(message: Message) { + this.messageIsEdit.emit(message); + } + + // updateMessage(message: Message) { + // const body = JSON.stringify(message); + // const headers = new Headers({'Content-Type': 'application/json'}); + // const token = localStorage.getItem('token') + // ? '?token=' + localStorage.getItem('token') + // : ''; + // return this.http.patch('http://localhost:8080/diary/', body, {headers: headers}) + // .map((response: Response) => response.json()) + // .catch((error: Response) => Observable.throw(error.json())); + // } + updatePermission(message : Message){ + const body = { + "token": localStorage.getItem('token'), + "id": message.id, + "private": message.public + }; + const headers = new Headers({'Content-Type': 'application/json'}); + return this.http.post('http://localhost:8080/diary/permission', body, {headers: headers}) + .map((response: Response) => { + console.log("Update Permission Response:" + response); + this.getMyMessages().subscribe((data)=>{ + this.refreshMyMessage.next(data); + }); + }) + .catch((error: Response) => Observable.throw(error.json())); + } + + + deleteMessage(message: Message) { + const body = { + "token": localStorage.getItem('token'), + "id": message.id}; + const headers = new Headers({'Content-Type': 'application/json'}); + return this.http.post('http://localhost:8080/diary/delete', body, {headers: headers}) + .map((response: Response) => { + if (response.json().status == true) { + this.messages.splice(this.messages.indexOf(message), 1); + } + this.getMyMessages().subscribe((data)=>{ + this.refreshMyMessage.next(data); + }); + response.json(); + }) + .catch((error: Response) => Observable.throw(error.json())); + } +} \ No newline at end of file diff --git a/NodeApp/assets/app/messages/messages.component.ts b/NodeApp/assets/app/messages/messages.component.ts new file mode 100755 index 0000000..5f04755 --- /dev/null +++ b/NodeApp/assets/app/messages/messages.component.ts @@ -0,0 +1,17 @@ +import { Component } from "@angular/core"; + +@Component({ + selector: 'app-messages', + template: ` +
+ +
+
+
+ +
+ ` +}) +export class MessagesComponent { + +} \ No newline at end of file diff --git a/NodeApp/assets/app/messages/myMessages/my-message-list.component.ts b/NodeApp/assets/app/messages/myMessages/my-message-list.component.ts new file mode 100755 index 0000000..16c56c3 --- /dev/null +++ b/NodeApp/assets/app/messages/myMessages/my-message-list.component.ts @@ -0,0 +1,33 @@ +import { Component, OnInit } from "@angular/core"; +import {Message} from "../message.model"; +import {MessageService} from "../message.service"; + + +@Component({ + selector: 'app-my-message-list', + template: ` +
+ +
+ ` +}) +export class MyMessageListComponent implements OnInit { + messages: Message[]; + + constructor(private messageService: MessageService) {} + + ngOnInit() { + this.messageService.getMyMessages() + .subscribe( + (messages: Message[]) => { + this.messages = messages; + } + ); + this.messageService.refreshMyMessage.subscribe((data: Message[])=>{ + this.messages = data; + }); + } +} +// \ No newline at end of file diff --git a/NodeApp/assets/app/messages/myMessages/my-message.component.html b/NodeApp/assets/app/messages/myMessages/my-message.component.html new file mode 100755 index 0000000..861743b --- /dev/null +++ b/NodeApp/assets/app/messages/myMessages/my-message.component.html @@ -0,0 +1,22 @@ +
+ +
+ {{ message.text }} +
+
+
+ Author :{{ message.author }} + Date :{{ message.publish_date }} + Public :{{ message.public }} +
+
+ + + + + Delete +
+
+
\ No newline at end of file diff --git a/NodeApp/assets/app/messages/myMessages/my-message.component.ts b/NodeApp/assets/app/messages/myMessages/my-message.component.ts new file mode 100755 index 0000000..37c7ffe --- /dev/null +++ b/NodeApp/assets/app/messages/myMessages/my-message.component.ts @@ -0,0 +1,51 @@ +import { Component, Input } from "@angular/core"; +import {MessageService} from "../message.service"; +import {Message} from "../message.model"; + + +@Component({ + selector: 'app-my-message', + templateUrl: './my-message.component.html', + styles: [` + .author { + display: inline-block; + font-style: italic; + font-size: 12px; + width: 80%; + } + .config { + display: inline-block; + text-align: right; + font-size: 12px; + width: 19%; + } + `] +}) +export class MyMessageComponent { + + @Input() message: Message; + constructor(private messageService: MessageService) { + console.log(this.message); + } + + onEdit() { + this.messageService.editMessage(this.message); + } + + onDelete() { + console.log(this.message); + this.messageService.deleteMessage(this.message) + .subscribe( + result => console.log(result) + ); + } + test(message){ + console.log(message); + } + updatePermission(message : Message){ + // console.log("SE ME"); + this.messageService.updatePermission(message).subscribe(); + + } + +} \ No newline at end of file diff --git a/NodeApp/assets/app/polyfills.ts b/NodeApp/assets/app/polyfills.ts new file mode 100755 index 0000000..5137c23 --- /dev/null +++ b/NodeApp/assets/app/polyfills.ts @@ -0,0 +1,10 @@ +import 'core-js/es6'; +import 'core-js/es7/reflect'; +require('zone.js/dist/zone'); +if (process.env.ENV === 'production') { + // Production +} else { + // Development + Error['stackTraceLimit'] = Infinity; + require('zone.js/dist/long-stack-trace-zone'); +} \ No newline at end of file diff --git a/NodeApp/bin/www b/NodeApp/bin/www new file mode 100755 index 0000000..8c04103 --- /dev/null +++ b/NodeApp/bin/www @@ -0,0 +1,105 @@ +#!/usr/bin/env node + +/** + * Module dependencies. + */ + +var app = require('../app'); +var debug = require('debug')('node-rest:server'); +var http = require('http'); + +//Ui server stuff +var express = require('express'); +var path = require('path'); +var uiApp = require('../uiApp'); + +var uiPort = normalizePort('3000') +uiApp.set('port', uiPort); +var uiServer = http.createServer(uiApp); +uiServer.listen(uiPort); +uiServer.on('error', onError); +uiServer.on('listening', onListening); +// console.log("here"); +//Ui server stuff + + +/** + * Get port from environment and store in Express. + */ + +var port = normalizePort('8080'); +app.set('port', port); + +/** + * Create HTTP server. + */ + +var server = http.createServer(app); + +/** + * Listen on provided port, on all network interfaces. + */ + +server.listen(port); +server.on('error', onError); +server.on('listening', onListening); + +/** + * Normalize a port into a number, string, or false. + */ + +function normalizePort(val) { + var port = parseInt(val, 10); + + if (isNaN(port)) { + // named pipe + return val; + } + + if (port >= 0) { + // port number + return port; + } + + return false; +} + +/** + * Event listener for HTTP server "error" event. + */ + +function onError(error) { + if (error.syscall !== 'listen') { + throw error; + } + + var bind = typeof port === 'string' + ? 'Pipe ' + port + : 'Port ' + port; + + // handle specific listen errors with friendly messages + switch (error.code) { + case 'EACCES': + console.error(bind + ' requires elevated privileges'); + process.exit(1); + break; + case 'EADDRINUSE': + console.error(bind + ' is already in use'); + process.exit(1); + break; + default: + throw error; + } +} + +/** + * Event listener for HTTP server "listening" event. + */ + +function onListening() { + var addr = server.address(); + var bind = typeof addr === 'string' + ? 'pipe ' + addr + : 'port ' + addr.port; + debug('Listening on ' + bind); +} diff --git a/NodeApp/models/counter.js b/NodeApp/models/counter.js new file mode 100755 index 0000000..d588bbe --- /dev/null +++ b/NodeApp/models/counter.js @@ -0,0 +1,12 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; +var mongooseUniqueValidator = require('mongoose-unique-validator'); + +var schema = new Schema({ + counter: {type: Number, required: true}, + type: {type: String, required: true} +}); + +schema.plugin(mongooseUniqueValidator); + +module.exports = mongoose.model('Counter', schema); \ No newline at end of file diff --git a/NodeApp/models/message.js b/NodeApp/models/message.js new file mode 100755 index 0000000..4e3927e --- /dev/null +++ b/NodeApp/models/message.js @@ -0,0 +1,24 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; + +var User = require('./user'); + +var schema = new Schema({ + title: {type: String, required: true}, + author: {type: String, required: true}, + publish_date: {type: String, required: true}, + isPublic: {type: Boolean, required: true}, + text: {type: String, required: true}, + idCounter : {type: Number, required: true}, + user: {type: Schema.Types.ObjectId, ref: 'User', required:true} + +}); + +schema.post('remove', function (message) { + User.findById(message.user, function (err, user) { + user.messages.pull(message._id); + user.save(); + }); +}); + +module.exports = mongoose.model('Message', schema); \ No newline at end of file diff --git a/NodeApp/models/user.js b/NodeApp/models/user.js new file mode 100755 index 0000000..8210a9f --- /dev/null +++ b/NodeApp/models/user.js @@ -0,0 +1,17 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; +var mongooseUniqueValidator = require('mongoose-unique-validator'); + +var schema = new Schema({ + fullname: {type: String, required: true}, + age: {type: String, required: true}, + password: {type: String, required: true}, + username: {type: String, required: true, unique: true}, + // uuid: {type: Schema.Types.ObjectId, ref: 'uuid' ,required: false, unique: true}, + // time: {type: Date, required: false, unique: true}, + messages: [{type: Schema.Types.ObjectId, ref: 'Message'}] +}); + +schema.plugin(mongooseUniqueValidator); + +module.exports = mongoose.model('User', schema); \ No newline at end of file diff --git a/NodeApp/models/uuid.js b/NodeApp/models/uuid.js new file mode 100755 index 0000000..2c12565 --- /dev/null +++ b/NodeApp/models/uuid.js @@ -0,0 +1,21 @@ +var mongoose = require('mongoose'); +var Schema = mongoose.Schema; +var mongooseUniqueValidator = require('mongoose-unique-validator'); + +var schema = new Schema({ + uuid: {type: String, required: true}, + time: {type: String, required: true}, + user: {type: Schema.Types.ObjectId, ref: 'User'} +}); + + +schema.post('remove', function (uuid) { + User.findById(uuid.user, function (err, user) { + user.uuid = undefined; + user.save(); + }); +}); + +schema.plugin(mongooseUniqueValidator); + +module.exports = mongoose.model('uuid', schema); \ No newline at end of file diff --git a/NodeApp/package-lock.json b/NodeApp/package-lock.json new file mode 100755 index 0000000..df77d24 --- /dev/null +++ b/NodeApp/package-lock.json @@ -0,0 +1,6549 @@ +{ + "name": "udemy-nodejs-angular2", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular/animations": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-5.2.5.tgz", + "integrity": "sha512-70ElCmaeDxLQc2OkgYhJjXj4zjtdjI4K1D5ZZm/uSPLlUcqC6uf6skCXlhMawQoPbsL/SXE5xw2HlMgEbhUysw==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/common": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.5.tgz", + "integrity": "sha512-jagCxo+75pcTwjuO1ZheIiTlKBJ6REFKFWoUPTzaSS6fnzReFJ+VPf4Pb0bWtHL1lWvbvnzmITOJPB9wmuM3fg==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/compiler": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.5.tgz", + "integrity": "sha512-YU/r5omexkrrBF3bZaseWrc2Iotk6hIdUWkPIL3gPC0hKJ3wBeB3sHCBujPQXktWdMBbQRujNSMZtgra3Oh1xQ==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-5.2.5.tgz", + "integrity": "sha512-jRFMxUKpodzOBKdZc6OMse+CjK6xfTJssZQrYeIyqz2daobaIsMZP2hZX8s/PCfV8Vxa7XFwCJb7Fq2uyZKfHg==", + "requires": { + "chokidar": "1.7.0", + "minimist": "1.2.0", + "reflect-metadata": "0.1.12", + "tsickle": "0.26.0" + } + }, + "@angular/core": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.5.tgz", + "integrity": "sha512-Uo7R3LrsvA24JkRbwXWUZWp7NSEpwdTUxT1NScyjrBK+t8ybSL5/42Jo21md5M4pjeCsIgUXlGoCm1QtT5aYnQ==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/forms": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.5.tgz", + "integrity": "sha512-3feqqTuv9rIu7ZOsLCtM/ugNFz5RPujLHkE8bU1gsMM4/eMYruIFir2vbjnhMkD3K6KptEg4iO6tDW18diwXug==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/http": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-5.2.5.tgz", + "integrity": "sha512-VqTCkAnebe+M9Bqrfp1QYpBQCTbXide/NxrQfwiJY87kjKFeRBuy9/XH/2S5wIwlF5Yx3bmlaIufd9VI5r/0aQ==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/platform-browser": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.5.tgz", + "integrity": "sha512-iPAuoG/c3pD3hnk1g0VgJu/pzNITvLQyT0W71MDMSuxLxs291kq+U2jklm40pStISd1mPbCNKmvz/7M+WbdLhg==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.5.tgz", + "integrity": "sha512-IMEe2qUTC3CA3KoswmJJs+O2Lkyd5GXgl5ULupqhhm/TOL2FLk00kwv8k3Epaf2d1wXcjK3BMG7aAwc6RLH7QA==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/platform-server": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-5.2.5.tgz", + "integrity": "sha512-IpuEDNyoVfGO94jd1s+4IgoTBkWigwqD4YQTpcsC1mdY2Ax7NXXTAx28ZQF5EvPbSxsHGB5zG3oR7KE7GMNhYQ==", + "requires": { + "domino": "1.0.30", + "tslib": "1.9.0", + "xhr2": "0.1.4" + } + }, + "@angular/router": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.5.tgz", + "integrity": "sha512-I8U0iy59lz0dAxU4zxRQHagfUPWF+MikLNMirRL1lrA49PG+5K1tiuIQ6p+8fZFAJ5UXwNHyXqYuWqsKRiVBHQ==", + "requires": { + "tslib": "1.9.0" + } + }, + "@angular/upgrade": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@angular/upgrade/-/upgrade-5.2.5.tgz", + "integrity": "sha512-N5AXTmwE+FFJH+qe+3zkTnIPd1fiO2DC+YAGgI9lreERbrPE+trZ4tA618h+SCIC5n5wzNDOLgQ0B2glJBkQRw==", + "requires": { + "tslib": "1.9.0" + } + }, + "@ngtools/webpack": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.10.0.tgz", + "integrity": "sha512-QdzPjUgb1VIJ/uIMXGe5mJsufp0gxItDZj/3RD+xfqYCgabLRFPZ89qe88tTCzhburuEfHK6+Uqk5HWlVnA4oA==", + "dev": true, + "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "magic-string": "0.22.4", + "semver": "5.5.0", + "source-map": "0.5.7", + "tree-kill": "1.2.0", + "webpack-sources": "1.1.0" + } + }, + "@types/core-js": { + "version": "0.9.36", + "resolved": "https://registry.npmjs.org/@types/core-js/-/core-js-0.9.36.tgz", + "integrity": "sha1-1yHnzAAH0QzmatJj6/R4pAccU/Q=", + "dev": true + }, + "@types/node": { + "version": "6.0.101", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.101.tgz", + "integrity": "sha512-IQ7V3D6+kK1DArTqTBrnl3M+YgJZLw8ta8w3Q9xjR79HaJzMAoTbZ8TNzUTztrkCKPTqIstE2exdbs1FzsYLUw==", + "dev": true + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "angular-router-loader": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/angular-router-loader/-/angular-router-loader-0.5.0.tgz", + "integrity": "sha1-uBsUgEmDINKprHr7JO16nnNaVpI=", + "dev": true, + "requires": { + "loader-utils": "0.2.17" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "angular2-template-loader": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/angular2-template-loader/-/angular2-template-loader-0.5.0.tgz", + "integrity": "sha1-oW2xkPqvn46OlBDzxGg3DedRJ6Y=", + "dev": true, + "requires": { + "codecov": "1.0.1", + "loader-utils": "0.2.17" + }, + "dependencies": { + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + } + } + }, + "ansi-align": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", + "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "optional": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "awesome-typescript-loader": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-3.4.1.tgz", + "integrity": "sha512-fYxBtN6s4Dm6vtsROWi8IQ4I+KcmwRWePAVvhI06mFcHbtHfZopOs4qGNu9LyCPEw403LDROKFA+NVV6ig5yNw==", + "dev": true, + "requires": { + "colors": "1.1.2", + "enhanced-resolve": "3.3.0", + "loader-utils": "1.1.0", + "lodash": "4.17.5", + "micromatch": "3.1.6", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "source-map-support": "0.4.18" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.1.tgz", + "integrity": "sha512-SO5lYHA3vO6gz66erVvedSCkp7AKWdv6VcQ2N4ysXfPxdAlxAMMAdwegGGcv1Bqwm7naF1hNdk5d6AAIEHV2nQ==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "kind-of": "6.0.2", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "enhanced-resolve": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", + "integrity": "sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.6.tgz", + "integrity": "sha512-6hezhKgmSIRZeSCiVB84GOmH1Ajvo8XgnaEq/uPQ/wv0g+MQlaVonSEru7VMDZXzRWFoclakpADfInbg/5FGjw==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.1", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "base64-js": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz", + "integrity": "sha512-MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==", + "dev": true + }, + "base64url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64url/-/base64url-2.0.0.tgz", + "integrity": "sha1-6sFuA+oUOO/5Qj1puqNiYu0fcLs=" + }, + "basic-auth": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", + "integrity": "sha1-Awk1sB3nyblKgksp8/zLdQ06UpA=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bcryptjs": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz", + "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=" + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bluebird": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.15.2.tgz", + "integrity": "sha1-11eM9PHRHV9uqATO813Hp/9trmc=", + "requires": { + "bytes": "2.4.0", + "content-type": "1.0.4", + "debug": "2.2.0", + "depd": "1.1.2", + "http-errors": "1.5.1", + "iconv-lite": "0.4.13", + "on-finished": "2.3.0", + "qs": "6.2.0", + "raw-body": "2.1.7", + "type-is": "1.6.16" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "boxen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", + "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", + "dev": true, + "requires": { + "ansi-align": "1.1.0", + "camelcase": "2.1.1", + "chalk": "1.1.3", + "cli-boxes": "1.0.0", + "filled-array": "1.1.0", + "object-assign": "4.1.1", + "repeating": "2.0.1", + "string-width": "1.0.2", + "widest-line": "1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "bson": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.4.tgz", + "integrity": "sha1-k8ENOeqltYQVy8QFLz5T5WKwtyw=" + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.3", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=" + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + } + } + }, + "chalk": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.2.tgz", + "integrity": "sha512-LvixLAQ4MYhbf7hgL4o5PeK32gJKvVzDRiSNIApDofQvyhl8adgG2lJVXn4+ekQoK7HL9RF8lqxwerpe0x2pCw==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "codecov": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-1.0.1.tgz", + "integrity": "sha1-lyYM6sDpa47ajVYgBlWKU6E53/0=", + "dev": true, + "requires": { + "argv": "0.0.2", + "execSync": "1.0.2", + "request": "2.83.0", + "urlgrey": "0.4.4" + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "configstore": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", + "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "dev": true, + "requires": { + "dot-prop": "3.0.0", + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "os-tmpdir": "1.0.2", + "osenv": "0.1.5", + "uuid": "2.0.3", + "write-file-atomic": "1.3.4", + "xdg-basedir": "2.0.0" + }, + "dependencies": { + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + } + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" + }, + "cookie-parser": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "requires": { + "cookie": "0.3.1", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true, + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.10" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.10" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + } + } + }, + "del-cli": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-0.2.1.tgz", + "integrity": "sha1-1fjKVA6KuJstkDB1rkcRPHKm2Tc=", + "dev": true, + "requires": { + "del": "2.2.2", + "meow": "3.7.0", + "update-notifier": "1.0.3" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domino": { + "version": "1.0.30", + "resolved": "https://registry.npmjs.org/domino/-/domino-1.0.30.tgz", + "integrity": "sha512-ikq8WiDSkICdkElud317F2Sigc6A3EDpWsxWBwIZqOl95km4p/Vc9Rj98id7qKgsjDmExj0AVM7JOd4bb647Xg==" + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", + "dev": true, + "requires": { + "readable-stream": "2.3.4" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "ecdsa-sig-formatter": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.9.tgz", + "integrity": "sha1-S8kmJ07Dtau1AW5+HWCSGsJisqE=", + "requires": { + "base64url": "2.0.0", + "safe-buffer": "5.1.1" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es6-promise": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.2.1.tgz", + "integrity": "sha1-7FYjOGgDKQkgcXDDlEjiREndH8Q=" + }, + "es6-templates": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", + "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", + "dev": true, + "requires": { + "recast": "0.11.23", + "through": "2.3.8" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execSync": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/execSync/-/execSync-1.0.2.tgz", + "integrity": "sha1-H0LtpYIiUYAFMiTs3T/Rlg/bMTk=", + "dev": true, + "requires": { + "temp": "0.5.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.14.1.tgz", + "integrity": "sha1-ZGwjf3ZvFIwhIK/wc4F7nk1+DTM=", + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.2.0", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.7.0", + "finalhandler": "0.5.1", + "fresh": "0.3.0", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "1.1.5", + "qs": "6.2.0", + "range-parser": "1.2.0", + "send": "0.14.2", + "serve-static": "1.11.2", + "type-is": "1.6.16", + "utils-merge": "1.0.0", + "vary": "1.1.2" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fastparse": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", + "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "filled-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", + "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", + "dev": true + }, + "finalhandler": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.1.tgz", + "integrity": "sha1-LEANjUUwk1vCMlScX6OF7Afeb80=", + "requires": { + "debug": "2.2.0", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "forEachAsync": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/forEachAsync/-/forEachAsync-2.2.1.tgz", + "integrity": "sha1-43I/AJA5EOHrSx2zrVG1xkoxn+w=", + "requires": { + "sequence": "2.2.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "got": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", + "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "dev": true, + "requires": { + "create-error-class": "3.0.2", + "duplexer2": "0.1.4", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "node-status-codes": "1.0.0", + "object-assign": "4.1.1", + "parse-json": "2.2.0", + "pinkie-promise": "2.0.1", + "read-all-stream": "3.1.0", + "readable-stream": "2.3.4", + "timed-out": "3.1.3", + "unzip-response": "1.0.2", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "handlebars": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-3.0.0.tgz", + "integrity": "sha1-f05Tf03WmShp1mwBt1BeujVhpdU=", + "requires": { + "optimist": "0.6.1", + "source-map": "0.1.43", + "uglify-js": "2.3.6" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hbs": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/hbs/-/hbs-3.1.1.tgz", + "integrity": "sha1-qmqGo+r0yy3Kgj7RuRRQDpwlgv0=", + "requires": { + "handlebars": "3.0.0", + "walk": "2.2.1" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "hooks-fixed": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hooks-fixed/-/hooks-fixed-2.0.2.tgz", + "integrity": "sha512-YurCM4gQSetcrhwEtpQHhQ4M7Zo7poNGqY4kQGeBS6eZtOcT3tnNs01ThFa0jYBByAiYt1MjMjP/YApG0EnAvQ==" + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-loader": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz", + "integrity": "sha1-X7zYfNY6XEmn/OL+VvQl4Fcpxow=", + "dev": true, + "requires": { + "es6-templates": "0.2.3", + "fastparse": "1.1.1", + "html-minifier": "3.5.9", + "loader-utils": "1.1.0", + "object-assign": "4.1.1" + } + }, + "html-minifier": { + "version": "3.5.9", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.9.tgz", + "integrity": "sha512-EZqO91XJwkj8BeLx9C12sKB/AHoTANaZax39vEOP9f/X/9jgJ3r1O2+neabuHqpz5kJO71TapP9JrtCY39su1A==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.9", + "commander": "2.14.1", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.3.11" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "uglify-js": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.11.tgz", + "integrity": "sha512-AKLsYcdV+sS5eAE4NtVXF6f2u/DCQynQm0jTGxF261+Vltu1dYNuHzjqDmk11gInj+H/zJIM2EAwXG3MzPb3VA==", + "dev": true, + "requires": { + "commander": "2.14.1", + "source-map": "0.6.1" + } + } + } + }, + "http-errors": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz", + "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=", + "requires": { + "inherits": "2.0.3", + "setprototypeof": "1.0.2", + "statuses": "1.4.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ipaddr.js": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.4.0.tgz", + "integrity": "sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA=" + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", + "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", + "dev": true, + "requires": { + "is-number": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonwebtoken": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-5.7.0.tgz", + "integrity": "sha1-HJD5qGzlt0j1+XnBK3BAK0r83bQ=", + "requires": { + "jws": "3.1.4", + "ms": "0.7.1", + "xtend": "4.0.1" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jwa": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.5.tgz", + "integrity": "sha1-oFUs4CIHQs1S4VN3SjKQXDDnVuU=", + "requires": { + "base64url": "2.0.0", + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.9", + "safe-buffer": "5.1.1" + } + }, + "jws": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.4.tgz", + "integrity": "sha1-+ei5M46KhHJ31kRLFGT2GIDgUKI=", + "requires": { + "base64url": "2.0.0", + "jwa": "1.1.5", + "safe-buffer": "5.1.1" + } + }, + "kareem": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/kareem/-/kareem-1.5.0.tgz", + "integrity": "sha1-4+QQHZ3P3imXadr0tNtk2JXRdEg=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", + "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", + "dev": true, + "requires": { + "package-json": "2.4.0" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + }, + "lazy-req": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", + "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "magic-string": { + "version": "0.22.4", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha512-kxBL06p6iO2qPBHsqGK2b3cRwiRGpnmSuVWNhwHcMX7qJOUr1HvricYP1LZOCdkQBUp0jiWg2d6WJwR3vYgByw==", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.4" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "1.33.0" + } + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "mongodb": { + "version": "2.2.34", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.34.tgz", + "integrity": "sha1-o09Zu+thdUrsQy3nLD/iFSakTBo=", + "requires": { + "es6-promise": "3.2.1", + "mongodb-core": "2.1.18", + "readable-stream": "2.2.7" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "readable-stream": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz", + "integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=", + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + } + } + }, + "mongodb-core": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.18.tgz", + "integrity": "sha1-TEYTm986HwMt7ZHbSfOO7AFlkFA=", + "requires": { + "bson": "1.0.4", + "require_optional": "1.0.1" + } + }, + "mongoose": { + "version": "4.13.11", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-4.13.11.tgz", + "integrity": "sha512-OgXmFc3vzXwq4zWp41XfSBDnKZLqnBc4Kh7mwwGjBE5iWH5tfkixaPK0uFtpEuzDzUvAIg33bgniyTsmc00olA==", + "requires": { + "async": "2.1.4", + "bson": "1.0.4", + "hooks-fixed": "2.0.2", + "kareem": "1.5.0", + "lodash.get": "4.4.2", + "mongodb": "2.2.34", + "mpath": "0.3.0", + "mpromise": "0.5.5", + "mquery": "2.3.3", + "ms": "2.0.0", + "muri": "1.3.0", + "regexp-clone": "0.0.1", + "sliced": "1.0.1" + }, + "dependencies": { + "async": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.1.4.tgz", + "integrity": "sha1-LSFgx3iAMuTdbL4lAvH5osj2zeQ=", + "requires": { + "lodash": "4.17.5" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "mongoose-unique-validator": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/mongoose-unique-validator/-/mongoose-unique-validator-1.0.6.tgz", + "integrity": "sha512-hJf1eiWPw9O5ed7HUtFHtHhqnWDpm42Q5iC3xs6p99kr1qrVMq8WR2x+yobx6rY5F26Ki2NqGvJTe8v/Fax0kw==", + "requires": { + "lodash.foreach": "4.5.0", + "lodash.get": "4.4.2" + } + }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "requires": { + "basic-auth": "1.0.4", + "debug": "2.2.0", + "depd": "1.0.1", + "on-finished": "2.3.0", + "on-headers": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + } + } + }, + "mpath": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.3.0.tgz", + "integrity": "sha1-elj3iem1/TyUUgY0FXlg8mvV70Q=" + }, + "mpromise": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mpromise/-/mpromise-0.5.5.tgz", + "integrity": "sha1-9bJCWddjrMIlewoMjG2Gb9UXMuY=" + }, + "mquery": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/mquery/-/mquery-2.3.3.tgz", + "integrity": "sha512-NC8L14kn+qxJbbJ1gbcEMDxF0sC3sv+1cbRReXXwVvowcwY1y9KoVZFq0ebwARibsadu8lx8nWGvm3V0Pf0ZWQ==", + "requires": { + "bluebird": "3.5.0", + "debug": "2.6.9", + "regexp-clone": "0.0.1", + "sliced": "0.0.5" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "sliced": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", + "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "muri": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/muri/-/muri-1.3.0.tgz", + "integrity": "sha512-FiaFwKl864onHFFUV/a2szAl7X0fxVlSKNdhTf+BM8i8goEgYut8u5P9MqQqIYwvaMxjzVESsoEm/2kfkFH1rg==" + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "optional": true + }, + "nanomatch": { + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", + "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.4", + "stream-browserify": "2.0.1", + "stream-http": "2.8.0", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.6", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } + }, + "node-status-codes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", + "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true, + "requires": { + "lcid": "1.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "package-json": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", + "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", + "dev": true, + "requires": { + "got": "5.7.1", + "registry-auth-token": "3.3.2", + "registry-url": "3.1.0", + "semver": "5.5.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.10" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "proxy-addr": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.5.tgz", + "integrity": "sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg=", + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.4.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.6" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "qs": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.0.tgz", + "integrity": "sha1-O3hIwDwt7OaalSKw+ujEEm10Xzs=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + } + }, + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + }, + "rc": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.5.tgz", + "integrity": "sha1-J1zWh/bjs2zHVrqibf7oCnkDAf0=", + "dev": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-all-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", + "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1", + "readable-stream": "2.3.4" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.4", + "set-immediate-shim": "1.0.1" + } + }, + "recast": { + "version": "0.11.23", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "integrity": "sha1-RR/TAEqx5N+bTktmN2sqIZEkYtM=", + "dev": true, + "requires": { + "ast-types": "0.9.6", + "esprima": "3.1.3", + "private": "0.1.8", + "source-map": "0.5.7" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.12.tgz", + "integrity": "sha512-n+IyV+nGz3+0q3/Yf1ra12KpCyi001bi4XFxSjbiWWjfqb52iTTtpGXmCCAOWWIAn9KEuFZKGqBERHmrtScZ3A==" + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexp-clone": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", + "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" + }, + "registry-auth-token": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", + "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "dev": true, + "requires": { + "rc": "1.2.5", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true, + "requires": { + "rc": "1.2.5" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require_optional": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", + "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", + "requires": { + "resolve-from": "2.0.0", + "semver": "5.5.0" + } + }, + "resolve-from": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.1.4.tgz", + "integrity": "sha1-Wm62Lu2gaPUe3lDymz5c0i89m7I=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3" + }, + "dependencies": { + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true, + "optional": true + } + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "rxjs": { + "version": "5.5.6", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.6.tgz", + "integrity": "sha512-v4Q5HDC0FHAQ7zcBX7T2IL6O5ltl1a2GX4ENjPXg6SjDY69Cmx9v4113C99a4wGF16ClPv5Z8mghuYorVkg/kg==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true, + "requires": { + "semver": "5.5.0" + } + }, + "send": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.14.2.tgz", + "integrity": "sha1-ObBDiz9RC+Xcb2Z6EfcWiTaM3u8=", + "requires": { + "debug": "2.2.0", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.7.0", + "fresh": "0.3.0", + "http-errors": "1.5.1", + "mime": "1.3.4", + "ms": "0.7.2", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + } + } + }, + "sequence": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/sequence/-/sequence-2.2.1.tgz", + "integrity": "sha1-f1YXiV1ENRwKBH52RGdpBJChawM=" + }, + "serve-favicon": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.2.tgz", + "integrity": "sha1-3UGeJo3gEqtysxnTN/IQUBP5OB8=", + "requires": { + "etag": "1.7.0", + "fresh": "0.3.0", + "ms": "0.7.2", + "parseurl": "1.3.2" + }, + "dependencies": { + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=" + } + } + }, + "serve-static": { + "version": "1.11.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.2.tgz", + "integrity": "sha1-LPmIm9RDWjIMw2iVyapXvWYuasc=", + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.14.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "0.3.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz", + "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=" + }, + "sha.js": { + "version": "2.4.10", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.10.tgz", + "integrity": "sha512-vnwmrFDlOExK4Nm16J2KMWHLrp14lBrjxMxBJpu++EnsuBmpiYaM/MEs46Vxxm/4FvdP5yTwuCTO9it5FSjrqA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sliced": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", + "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.2.0", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4" + } + }, + "stream-http": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.0.tgz", + "integrity": "sha512-sZOFxI/5xw058XIRHl4dU3dZ+TTOIGJR78Dvo0oEAejIt4ou27k+3ne1zYmCV+v7UucbxIFQuOgnkTVHh8YPnw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "temp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.5.1.tgz", + "integrity": "sha1-d6sZx5qntZPL5PrCRBdoytmHuN8=", + "dev": true, + "requires": { + "rimraf": "2.1.4" + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "timed-out": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", + "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", + "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", + "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "regex-not": "1.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tree-kill": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz", + "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "ts-loader": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-2.3.7.tgz", + "integrity": "sha512-8t3bu2FcEkXb+D4L+Cn8qiK2E2C6Ms4/GQChvz6IMbVurcFHLXrhW4EMtfaol1a1ASQACZGDUGit4NHnX9g7hQ==", + "dev": true, + "requires": { + "chalk": "2.2.2", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "semver": "5.5.0" + } + }, + "tsickle": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.26.0.tgz", + "integrity": "sha512-eWJ2CUfttGK0LqF9iJ/Avnxbj4M+fCyJ50Zag3wm73Fut1hsasPRHKxKdrMWVj4BMHnQNx7TO+DdNmLmJTSuNw==", + "requires": { + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map": "0.5.7", + "source-map-support": "0.4.18" + } + }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "typescript": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", + "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", + "dev": true + }, + "uglify-js": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.3.6.tgz", + "integrity": "sha1-+gmEdwtCi3qbKoBY9GNV0U/vIRo=", + "optional": true, + "requires": { + "async": "0.2.10", + "optimist": "0.3.7", + "source-map": "0.1.43" + }, + "dependencies": { + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "optional": true, + "requires": { + "wordwrap": "0.0.3" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "optional": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true + }, + "update-notifier": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", + "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", + "dev": true, + "requires": { + "boxen": "0.6.0", + "chalk": "1.1.3", + "configstore": "2.1.0", + "is-npm": "1.0.0", + "latest-version": "2.0.0", + "lazy-req": "1.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true, + "requires": { + "prepend-http": "1.0.4" + } + }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "isobject": "3.0.1", + "lazy-cache": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "walk": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/walk/-/walk-2.2.1.tgz", + "integrity": "sha1-WtofjknkfUt0Rdi+ei4eYxq0MBY=", + "requires": { + "forEachAsync": "2.2.1" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.6.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + } + } + }, + "webpack": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.7.0.tgz", + "integrity": "sha512-MjAA0ZqO1ba7ZQJRnoCdbM56mmFpipOPUv/vQpwwfSI42p5PVDdoiuK2AL2FwFUVgT859Jr43bFZXRg/LNsqvg==", + "dev": true, + "requires": { + "acorn": "5.4.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "interpret": "1.1.0", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "0.2.17", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "3.2.3", + "tapable": "0.2.8", + "uglify-js": "2.8.29", + "watchpack": "1.4.0", + "webpack-sources": "1.1.0", + "yargs": "6.6.0" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + } + } + }, + "webpack-merge": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.1.tgz", + "integrity": "sha512-geQsZ86YkXOVOjvPC5yv3JSNnL6/X3Kzh935AQ/gJNEYXEfJDQFu/sdFuktS9OW2JcH/SJec8TGfRdrpHshH7A==", + "dev": true, + "requires": { + "lodash": "4.17.5" + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", + "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", + "dev": true + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "slide": "1.1.6" + } + }, + "xdg-basedir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-2.0.0.tgz", + "integrity": "sha1-7byQPMOF/ARSPZZqM1UEtVBNG9I=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yargs": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", + "dev": true, + "requires": { + "camelcase": "3.0.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "1.4.0", + "read-pkg-up": "1.0.1", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "1.0.2", + "which-module": "1.0.0", + "y18n": "3.2.1", + "yargs-parser": "4.2.1" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + } + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "dev": true, + "requires": { + "camelcase": "3.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + }, + "zone.js": { + "version": "0.8.20", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz", + "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA==" + } + } +} diff --git a/NodeApp/package.json b/NodeApp/package.json new file mode 100755 index 0000000..381da71 --- /dev/null +++ b/NodeApp/package.json @@ -0,0 +1,57 @@ +{ + "name": "udemy-nodejs-angular2", + "version": "1.0.0", + "private": true, + "scripts": { + "prepare": "npm run build:prod", + "start": "node ./bin/www", + "build": "del-cli public/js/app && webpack --config webpack.config.dev.js --progress --profile --watch", + "build:prod": "del-cli public/js/app && ngc -p tsconfig.aot.json && ngc -p tsconfig.aot.json && webpack --config webpack.config.prod.js --progress --profile --bail && del-cli 'assets/app/**/*.js' 'assets/app/**/*.ngsummary.json' 'assets/app/**/*.ngstyle.*'" + }, + "dependencies": { + "@angular/animations": "^5.0.0", + "@angular/common": "^5.0.0", + "@angular/compiler": "^5.0.0", + "@angular/compiler-cli": "^5.0.0", + "@angular/core": "^5.0.0", + "@angular/forms": "^5.0.0", + "@angular/http": "^5.0.0", + "@angular/platform-browser": "^5.0.0", + "@angular/platform-browser-dynamic": "^5.0.0", + "@angular/platform-server": "^5.0.0", + "@angular/router": "^5.0.0", + "@angular/upgrade": "^5.0.0", + "bcryptjs": "^2.4.3", + "body-parser": "~1.15.2", + "cookie-parser": "~1.4.3", + "core-js": "^2.4.1", + "debug": "~2.2.0", + "express": "~4.14.0", + "hbs": "~3.1.0", + "jsonwebtoken": "^5.7.0", + "mongoose": "^4.4.12", + "mongoose-unique-validator": "^1.0.2", + "morgan": "~1.6.1", + "parseurl": "^1.3.2", + "reflect-metadata": "^0.1.3", + "rxjs": "^5.5.0", + "serve-favicon": "~2.3.0", + "uuid": "^3.2.1", + "zone.js": "^0.8.5" + }, + "devDependencies": { + "@ngtools/webpack": "^1.8.0", + "@types/core-js": "0.9.36", + "@types/node": "^6.0.45", + "angular-router-loader": "^0.5.0", + "angular2-template-loader": "^0.5.0", + "awesome-typescript-loader": "^3.1.2", + "del-cli": "^0.2.0", + "html-loader": "^0.4.4", + "raw-loader": "^0.5.1", + "ts-loader": "^2.0.3", + "typescript": "^2.4.2", + "webpack": "^2.2.1", + "webpack-merge": "^4.1.0" + } +} diff --git a/NodeApp/routes/app.js b/NodeApp/routes/app.js new file mode 100755 index 0000000..9900aa0 --- /dev/null +++ b/NodeApp/routes/app.js @@ -0,0 +1,25 @@ +var express = require('express'); +var router = express.Router(); +var parseUrl = require('parseurl'); + +// router.get('', function (req, res, next) { +// console.log("(:") +// res.render('index'); +// }); +router.get('/', function (req, res, next) { + console.log("Sigh"); + res.contentType("application/json"); + res.status(201).json({ + + "status": true, + "result": [ + "/", + "/meta/heartbeat", + "/meta/team" + ] + + }); +}); + + +module.exports = router; diff --git a/NodeApp/routes/messages.js b/NodeApp/routes/messages.js new file mode 100755 index 0000000..a1feb28 --- /dev/null +++ b/NodeApp/routes/messages.js @@ -0,0 +1,228 @@ +var express = require('express'); +var router = express.Router(); +var jwt = require('jsonwebtoken'); + +var User = require('../models/user'); +var Message = require('../models/message'); +var userRoute = require('./user'); +var IdCounter = require('../models/counter'); + + +router.get('/', function (req, res, next) { + Message.find({isPublic: true}) + .populate('user', 'fullname') + .exec(function (err, messages) { + if (err) { + console.log("Should not be Error"); + + } + // console.log(messages); + var result = [] + for (var i = 0; i < messages.length; i++) { + console.log(messages[i]); + result[i] = {}; + result[i]["id"] = messages[i].idCounter; + result[i]["title"] = messages[i].title; + result[i]["author"] = messages[i].author; + result[i]["publish_date"] = messages[i].publish_date; + result[i]["public"] = true; + result[i]["text"] = messages[i].text; + } + // console.log(result); + res.status(200).json({ + "status": true, + "result": result + }); + }); +}); + +router.use('/', function (req, res, next) { + // console.log("HERE:" + userRoute); + console.log(userRoute.uuidMap[req.body.token]); + jwt.verify(userRoute.uuidMap[req.body.token], 'secret', function (err, decoded) { + if (err) { + console.log("why here 123") + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + console.log("CORRECT"); + next(); + }); +}); +router.post('/', function (req, res, next) { + var decoded = jwt.decode(userRoute.uuidMap[req.body.token]); + Message.find({user: decoded.user._id}) + .populate('user', 'fullname') + .exec(function (err, messages) { + if (err) { + console.log("Should not be Error"); + + } + // console.log(messages); + var result = [] + for (var i = 0; i < messages.length; i++) { + result[i] = {}; + result[i]["id"] = messages[i].idCounter; + result[i]["title"] = messages[i].title; + result[i]["author"] = messages[i].author; + result[i]["publish_date"] = messages[i].publish_date; + result[i]["public"] = messages[i].isPublic; + result[i]["text"] = messages[i].text; + } + res.status(200).json({ + "status": true, + "result": result + }); + }); +}); + +router.post('/create', function (req, res, next) { + console.log("POSTING"); + var decoded = jwt.decode(userRoute.uuidMap[req.body.token]); + IdCounter.find({type: "message"}, function (err, resultArray) { + if (err) throw err; + console.log(resultArray); + var counterResult = resultArray[0]; + counterResult.counter = counterResult.counter + 1; + var newCounter = new IdCounter(counterResult); + console.log(counterResult.counter + "wtf"); + User.findById(decoded.user._id, function (err, user) { + if (err) { + console.log("ADD ERROR" + err); + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + var message = new Message({ + title: req.body.title, + author: user.fullname, + publish_date: new Date().toISOString(), + isPublic: req.body.public, + text: req.body.text, + idCounter: counterResult.counter, + user: user + }); + user.messages.push(message); + user.save(); + message.save(function (err, result) { + if (err) { + console.log("No error should be here"); + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + // user.messages.push(result); + // user.save(); + newCounter.save(); + res.status(201).json({ + "status": true, + "result": counterResult.counter + }); + }); + }); + }); + +}); +router.post('/permission', function (req, res, next) { + var decoded = jwt.decode(userRoute.uuidMap[req.body.token]); + console.log(req.body); + Message.find({idCounter: req.body.id}, function (err, messageArr) { + if(!messageArr){ + //This should not happen + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + message = messageArr[0]; + if (err) { + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + if (!message) { + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + if (message.user != decoded.user._id) { + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + console.log(req.body.private + "\n\n\n CONFUSED"); + message.isPublic = !req.body.private; + console.log(message.isPublic + "\n\n\n CONFUSED"); + message.save(function (err, result) { + if (err) { + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + res.status(200).json({ + "status": true, + }); + }); + }); +}); + +router.post('/delete', function (req, res, next) { + var decoded = jwt.decode(userRoute.uuidMap[req.body.token]); + // console.log(req.query.token + " : lol"); + console.log(req.body.id + " ID"); + Message.find({idCounter: req.body.id}, function (err, messageArr) { + if(!messageArr){ + //This should not happen + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + message = messageArr[0]; + console.log("should only find 1" + messageArr.length); + + if (err) { + return res.status(500).json({ + title: 'An error occurred', + error: err + }); + } + if (!message) { + return res.status(500).json({ + title: 'No Message Found!', + error: {message: 'Message not found'} + }); + } + if (message.user != decoded.user._id) { + console.log("a" + message.user + "\nb" + decoded.user._id); + return res.status(401).json({ + title: 'Not Authenticated', + error: {message: 'Users do not match'} + }); + } + var removeMsg = new Message(message); + console.log("removing"); + removeMsg.remove(function (err, result) { + if (err) { + return res.status(500).json({ + title: 'An error occurred', + error: err + }); + } + res.status(200).json({ + message: 'Deleted message', + obj: result + }); + }); + }); +}); + +module.exports = router; \ No newline at end of file diff --git a/NodeApp/routes/user.js b/NodeApp/routes/user.js new file mode 100755 index 0000000..8c898fe --- /dev/null +++ b/NodeApp/routes/user.js @@ -0,0 +1,108 @@ +var express = require('express'); +var router = express.Router(); +var bcrypt = require('bcryptjs'); +var jwt = require('jsonwebtoken'); +const uuidv4 = require('uuid/v4'); + +var User = require('../models/user'); +var uuidMap = {}; +router.post('/', function (req, res, next) { + res.contentType("application/json"); + console.log(uuidMap[req.body]); + var decoded = jwt.decode(uuidMap[req.body.token]); + console.log("here"); + User.findById(decoded.user._id, function (err, user) { + if (err) { + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + res.status(200).json({ + "status": true, + "username": user.username, + "fullname": user.fullname, + "age": user.age + }); + }); +}); +router.post('/register', function (req, res, next) { + console.log("Registering"); + res.contentType("application/json"); + + var user = new User({ + fullname: req.body.fullname, + age: req.body.age, + password: bcrypt.hashSync(req.body.password, 10), + username: req.body.username, + messages: [] + }); + //For bcrypt.hashSync 10 is the salt + user.save(function(err, result) { + if (err) { + console.log(err); + return res.status(200).json({ + "status": false, + "error": "User already exists!" + }); + } + res.status(201).json({ + "status": true + }); + }); +}); + +router.post('/authenticate', function(req, res, next) { + console.log("wtf"); + res.contentType("application/json"); + User.findOne({username: req.body.username}, function(err, user) { + if (err) { + console.log("1"); + return res.status(200).json({ + "status": false + }); + } + if (!user) { + console.log("2"); + return res.status(200).json({ + "status": false + }); + } + if (!bcrypt.compareSync(req.body.password, user.password)) { + console.log("3"); + return res.status(200).json({ + "status": false + }); + }; + var token = jwt.sign({user: user}, 'secret', {expiresIn: 7200}); + var generatedUUID = uuidv4(); + + console.log("1/Token:" + token + "\nUUID:" + generatedUUID); + uuidMap[generatedUUID] = token; + + console.log(uuidMap); + + res.status(200).json({ + status: true, + token: generatedUUID + }); + }); +}); + +router.post('/expire', function (req, res, next) { + res.contentType("application/json"); + if(uuidMap[req.body.token]){ + delete uuidMap[req.body.token]; + res.status(200).json({ + status: true + }); + }else{ + res.status(200).json({ + status: false + }); + } +}); + + +exports.uuidMap = uuidMap; +module.exports = {router:router, uuidMap:uuidMap}; diff --git a/NodeApp/tsconfig.aot.json b/NodeApp/tsconfig.aot.json new file mode 100755 index 0000000..4af7338 --- /dev/null +++ b/NodeApp/tsconfig.aot.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "es5", + "module": "es2015", + "moduleResolution": "node", + "sourceMap": false, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "removeComments": false, + "noImplicitAny": false + }, + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es5", + "dom" + ], + "angularCompilerOptions": { + "skipMetadataEmit": true + } +} diff --git a/NodeApp/tsconfig.json b/NodeApp/tsconfig.json new file mode 100755 index 0000000..a3e99c8 --- /dev/null +++ b/NodeApp/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es5", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es5", + "dom" + ] + } +} diff --git a/NodeApp/uiApp.js b/NodeApp/uiApp.js new file mode 100755 index 0000000..b4b7246 --- /dev/null +++ b/NodeApp/uiApp.js @@ -0,0 +1,58 @@ +var express = require('express'); +var path = require('path'); +var favicon = require('serve-favicon'); +var logger = require('morgan'); +var cookieParser = require('cookie-parser'); +var bodyParser = require('body-parser'); +var mongoose = require('mongoose'); + +var messageRoutes = require('./routes/messages'); +var userRoutes = require('./routes/user'); +var uiApp = express(); +mongoose.connect('localhost:27017/node-angular'); + + + +var IdCounter = require('./models/counter'); +//Change this to the script later +// var a = new IdCounter({counter: 0, type: "message"}); +// a.save(); +// view engine setup +uiApp.set('views', path.join(__dirname, 'views')); +uiApp.set('view engine', 'hbs'); + + +// uncomment after placing your favicon in /public +//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico'))); +uiApp.use(logger('dev')); +uiApp.use(bodyParser.json()); +uiApp.use(bodyParser.urlencoded({extended: false})); +uiApp.use(cookieParser()); +uiApp.use(express.static(path.join(__dirname, 'public'))); + +uiApp.use(function (req, res, next) { + res.setHeader('Access-Control-Allow-Origin', '*'); + res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + res.setHeader('Access-Control-Allow-Methods', 'POST, GET'); + // res.status(200); + next(); +}); + + +uiApp.use('/diary', messageRoutes); +uiApp.use('/users', userRoutes.router); + +// app.use('', appRoutes); +uiApp.get('/', function (req, res, next) { + return res.render('index'); +}); + + +// catch 404 and forward to error handler +uiApp.use(function (req, res, next) { + return res.render('index'); +}); + + + +module.exports = uiApp; diff --git a/NodeApp/views/index.hbs b/NodeApp/views/index.hbs new file mode 100755 index 0000000..e168b94 --- /dev/null +++ b/NodeApp/views/index.hbs @@ -0,0 +1,15 @@ + + + + + Angular Messenger + + + + + +Loading... + + + + diff --git a/NodeApp/webpack.config.common.js b/NodeApp/webpack.config.common.js new file mode 100755 index 0000000..f1d35e4 --- /dev/null +++ b/NodeApp/webpack.config.common.js @@ -0,0 +1,26 @@ +var webpack = require('webpack'); + +module.exports = { + entry: { + 'app': './assets/app/main.ts' + }, + + resolve: { + extensions: ['.js', '.ts'] + }, + + module: { + rules: [ + { + test: /\.html$/, + use: [{ loader: 'html-loader' }] + }, + { + test: /\.css$/, + use: [{ loader: 'raw-loader' }] + } + ], + exprContextCritical: false + + } +}; \ No newline at end of file diff --git a/NodeApp/webpack.config.dev.js b/NodeApp/webpack.config.dev.js new file mode 100755 index 0000000..68e9444 --- /dev/null +++ b/NodeApp/webpack.config.dev.js @@ -0,0 +1,30 @@ +var path = require('path'); + +var webpackMerge = require('webpack-merge'); +var commonConfig = require('./webpack.config.common.js'); + +module.exports = webpackMerge(commonConfig, { + devtool: 'cheap-module-eval-source-map', + + output: { + path: path.resolve(__dirname + '/public/js/app'), + publicPath: "/js/app/", + filename: 'bundle.js', + chunkFilename: '[id].chunk.js' + }, + module: { + rules: [ + { + test: /\.ts$/, + use: [ + {loader: 'awesome-typescript-loader', options: { + transpileOnly: true + }}, + {loader: 'angular2-template-loader'}, + {loader: 'angular-router-loader'} + ] + } + ] + + } +}); \ No newline at end of file diff --git a/NodeApp/webpack.config.prod.js b/NodeApp/webpack.config.prod.js new file mode 100755 index 0000000..496020e --- /dev/null +++ b/NodeApp/webpack.config.prod.js @@ -0,0 +1,46 @@ +var path = require('path'); + +var webpack = require('webpack'); +var webpackMerge = require('webpack-merge'); +var commonConfig = require('./webpack.config.common.js'); +var ngw = require('@ngtools/webpack'); + +module.exports = webpackMerge.smart(commonConfig, { + entry: { + 'app': './assets/app/main.aot.ts' + }, + + output: { + path: path.resolve(__dirname + '/public/js/app'), + filename: 'bundle.js', + publicPath: '/js/app/', + chunkFilename: '[id].[hash].chunk.js' + }, + + module: { + rules: [ + { + test: /(?:\.ngfactory\.js|\.ngstyle\.js|\.ts)$/, + loader: '@ngtools/webpack' + }, + { + test: /\.ts$/, + use: [ + 'awesome-typescript-loader', + 'angular2-template-loader', + // 'angular-router-loader?aot=true' + ] + } + ] + }, + + plugins: [ + new ngw.AngularCompilerPlugin({ + tsConfigPath: './tsconfig.aot.json', + entryModule: './assets/app/app.module#AppModule' + }), + new webpack.optimize.UglifyJsPlugin({ + sourceMap: false + }) + ] +}); \ No newline at end of file diff --git a/README.md b/README.md old mode 100644 new mode 100755 index 9a814e3..e7525de --- a/README.md +++ b/README.md @@ -41,12 +41,10 @@ sudo add-apt-repository \ sudo apt-get update sudo apt-get install docker-ce -# Verify Docker Works - -sudo docker run hello-world - -# Run the skeleton implementation +# Install Docker Compose +https://docs.docker.com/compose/install/ +# Run the implementation sudo ./run.sh ``` @@ -96,16 +94,16 @@ Please fill out this section with details relevant to your team. ### Team Members -1. Member 1 Name -2. Member 2 Name -3. Member 3 Name -4. Member 4 Name +1. Wei Lip +2. Ben +3. Shirlene +4. James ### Short Answer Questions #### Question 1: Briefly describe the web technology stack used in your implementation. -Answer: Please replace this sentence with your answer. +Answer: MEAN STACK => Mongo, Expressjs, Angular 5, nodejs #### Question 2: Are there any security considerations your team thought about? @@ -113,31 +111,31 @@ Answer: Please replace this sentence with your answer. #### Question 3: Are there any improvements you would make to the API specification to improve the security of the web application? -Answer: Please replace this sentence with your answer. +Answer: Changing the id int.Ids should ever be in int as the space is too small.Making it +susceptible to sequence attacks #### Question 4: Are there any additional features you would like to highlight? -Answer: Please replace this sentence with your answer. +Answer: Nice app #### Question 5: Is your web application vulnerable? If yes, how and why? If not, what measures did you take to secure it? -Answer: Please replace this sentence with your answer. +Answer: No for now #### Feedback: Is there any other feedback you would like to give? -Answer: Please replace this sentence with your answer. +Answer: Give me full marks ### Declaration #### Please declare your individual contributions to the assignment: -1. Member 1 Name - - Integrated feature x into component y - - Implemented z -2. Member 2 Name - - Wrote the front-end code -3. Member 3 Name - - Designed the database schema -4. Member 4 Name - - Implemented x +1. Wei Lip + - Did the authentication api +2. Ben + - Did the Diary api +3. James + - Set up docker and the rest of the end points +4. Shirlene + - User interface and testing. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..cbb3214 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,21 @@ +version: '3' # specify docker-compose version + +# Define the services/containers to be run +services: + database: # name of the third service + image: mongo # specify image to build container from + #ports: DO NOT EXPOSE THE DATA BASE PORT TO THE PUBLIC + restart: on-failure + express: #name of the second service + build: NodeApp # specify the directory of the Dockerfile + ports: + - "80:3000" #specify ports forewarding + - "8080:8080" + environment: + - DBHOST=mongodb://database + depends_on: + - database + restart: on-failure + links: + - database # link this service to the database servic + diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 6d0c9e5..0000000 --- a/docs/index.html +++ /dev/null @@ -1,571 +0,0 @@ -Secret Diary Back to top

Secret Diary

The Secret Diary API allows users to register, login, create, view, and manage -secret encrypted diary entries.

-

Resource Group

Secret Diary API Root

This resource returns a list of implemented endpoints. The automated grading -script will only check the endpoints within this list.

-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    result - a list of all implemented endpoints.

    -
  • -
-

Retrieve the endpoint list
GET/

Example URI

GET /
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "result": [
-    "/",
-    "/meta/heartbeat",
-    "/meta/team"
-  ]
-}

Meta

Resources related to the meta-workings of the assignment.

-

Heartbeat

This resource has the following attributes:

-
    -
  • status - a boolean value indication the success or failure of the query
  • -
-

Retrieve the server heartbeat
GET/meta/heartbeat

Example URI

GET /meta/heartbeat
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true
-}

Team Members

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indication the success or failure of the query

    -
  • -
  • -

    result - a list of all the members full names

    -
  • -
-

Retrieve the team member list
GET/meta/members

Example URI

GET /meta/members
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "result": [
-    "Jeremy Heng",
-    "John Galt",
-    "Audrey Shida"
-  ]
-}

Users

Resources related to users in the API.

-

Register a user

    -
  • -

    username (required, string)

    -
  • -
  • -

    password (required, string)

    -
  • -
  • -

    fullname (required, string)

    -
  • -
  • -

    age (required, int)

    -
  • -
-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    error (Optional) - a string describing the error

    -
  • -
-

If the user does not exist and all the required fields are present, then add -the user to the database and return the Response 201 with status set to -true.

-

Otherwise, return Response 200 with the status set to false and include -an optional error message.

-

The password should not be stored in plain text in the database.

-

Register a new user
POST/users/register

Example URI

POST /users/register
Request
HideShow
Headers
Content-Type: application/json
Body
{
-  "username": "AzureDiamond",
-  "password": "hunter2",
-  "fullname": "Joey Pardella",
-  "age": 15
-}
Response  201
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false,
-  "error": "User already exists!"
-}

Authenticate a user

    -
  • -

    username (required, string)

    -
  • -
  • -

    password (required, string)

    -
  • -
-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    token (Optional) - a UUID version 4 string containing the authentication -token of the successfully logged in user

    -
  • -
-

If the username and password combination exists in the database, then return -a UUID version 4 string as the authentication token. The token should allow -access to the endpoints requiring authentication.

-

Otherwise, return the false status.

-

Authenticate an existing user
POST/users/authenticate

Example URI

POST /users/authenticate
Request
HideShow
Headers
Content-Type: application/json
Body
{
-  "username": "AzureDiamond",
-  "password": "hunter2"
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "token": "6bf00d02-dffc-4849-a635-a21b08500d61"
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false
-}

Expire an authentication token

    -
  • token (required, UUIDv4 string)
  • -
-

This resource has the following attributes:

-
    -
  • status - a boolean value indicating the success or failure of the query
  • -
-

If the token exists in the database and is valid, invalidate the token so that -it may not be used for authentication. Return true status if this is -successful.

-

Otherwise, return the false status.

-

Expire an authentication token
POST/users/expire

Example URI

POST /users/expire
Request
HideShow
Headers
Content-Type: application/json
Body
{
-    "token": "6bf00d02-dffc-4849-a635-a21b08500d61",
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false
-}

Retrieve user information

    -
  • token (required, UUIDv4 string)
  • -
-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    username (Optional) - a string containing the user’s username

    -
  • -
  • -

    fullname (Optional) - a string containing the user’s full name

    -
  • -
  • -

    age (Optional) - a string containing the user’s age

    -
  • -
  • -

    error (Optional) - a string indicating the reason for the error

    -
  • -
-

If the token is valid, return the username, fullname, and age of the user -represented by the token.

-

Otherwise, return the false status.

-

Retrieve authenticated user information
POST/users

Example URI

POST /users
Request
HideShow
Headers
Content-Type: application/json
Body
{
-    "token": "6bf00d02-dffc-4849-a635-a21b08500d61",
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "username": "audrey123talks",
-  "fullname": "Audrey Shida",
-  "age": 14
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false,
-  "error": "Invalid authentication token."
-}

Diary

Resources related to diary entries

-

Retrieve list of diary entries

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    result (Optional) - a list of entry objects representing the requested diary -entries

    -
  • -
  • -

    error (Optional) - a string describing the error

    -
  • -
-

The diary entry object has the following structure:

-
    -
  • -

    id - an int representing the unique entry

    -
  • -
  • -

    title - a string representing the entry title

    -
  • -
  • -

    author - a string representing the author’s name

    -
  • -
  • -

    publish_date - a string in ISO 8601 format representing the date the entry -was published

    -
  • -
  • -

    public - a boolean indicating if the entry is private or public

    -
  • -
  • -

    text - a string containing the body of the entry

    -
  • -
-

The GET request endpoint will return all public diary entries without any -parameters.

-

When querying for the authenticated user’s diary entries with a POST request, -the following parameters are used:

-
    -
  • token (required, UUIDv4 string)
  • -
-

Retrieve all public diary entries
GET/diary

Example URI

GET /diary
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "result": [
-    {
-      "id": 1,
-      "title": "My First Project",
-      "author": "ashrugged",
-      "publish_date": "2013-02-27T13:37:00+00:00",
-      "public": true,
-      "text": "If you don't know, the thing to do is not to get scared, but to learn."
-    },
-    {
-      "id": 2,
-      "title": "A New Lesson!",
-      "author": "audrey123talks",
-      "publish_date": "2013-02-29T13:37:00+00:00",
-      "public": true,
-      "text": "Check out my latest video!"
-    }
-  ]
-}

Retrieve all entries belonging to an authenticated user
POST/diary

Example URI

POST /diary
Request
HideShow
Headers
Content-Type: application/json
Body
{
-    "token": "6bf00d02-dffc-4849-a635-a21b08500d61",
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "result": [
-    {
-      "id": 2,
-      "title": "A New Lesson!",
-      "author": "audrey123talks",
-      "publish_date": "2013-02-29T13:37:00+00:00",
-      "public": true,
-      "text": "Check out my latest video!"
-    },
-    {
-      "id": 3,
-      "title": "No One Can See This Post",
-      "author": "audrey123talks",
-      "publish_date": "2013-02-29T13:38:00+00:00",
-      "public": false,
-      "text": "It is very secret!"
-    }
-  ]
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false,
-  "error": "Invalid authentication token."
-}

Create a new diary entry

    -
  • -

    token (required, UUIDv4 string)

    -
  • -
  • -

    title (required, string)

    -
  • -
  • -

    public (required, boolean)

    -
  • -
  • -

    text (required, string)

    -
  • -
-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    result (Optional) - an int containing the id of the newly created entry

    -
  • -
  • -

    error (Optional) - a string describing the error

    -
  • -
-

The entry should be made committed to a database if the creation is successful.

-

Create a new diary entry
POST/diary/create

Example URI

POST /diary/create
Request
HideShow
Headers
Content-Type: application/json
Body
{
-  "token": "6bf00d02-dffc-4849-a635-a21b08500d61",
-  "title": "No One Can See This Post",
-  "public": false,
-  "text": "It is very secret!"
-}
Response  201
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": true,
-  "result": 2
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false,
-  "error": "Invalid authentication token."
-}

Delete an existing diary entry

    -
  • -

    token (required, UUIDv4 string)

    -
  • -
  • -

    id (required, int)

    -
  • -
-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    error (Optional) - a string describing the error

    -
  • -
-

The entry should be purged from the database if the deletion is successful.

-

Delete an existing diary entry
POST/diary/delete

Example URI

POST /diary/delete
Request
HideShow
Headers
Content-Type: application/json
Body
{
-  "token": "6bf00d02-dffc-4849-a635-a21b08500d61",
-  "id": 2
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-    "status": true,
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false,
-  "error": "Invalid authentication token."
-}

Adjust diary entry permissions

    -
  • -

    token (required, UUIDv4 string)

    -
  • -
  • -

    id (required, int)

    -
  • -
  • -

    public (required, boolean)

    -
  • -
-

This resource has the following attributes:

-
    -
  • -

    status - a boolean value indicating the success or failure of the query

    -
  • -
  • -

    error (Optional) - a string describing the error

    -
  • -
-

The entry should either be made public or private depending on the value of -public if the adjustment is successful.

-

Adjust diary entry permissions
POST/diary/permission

Example URI

POST /diary/permission
Request
HideShow
Headers
Content-Type: application/json
Body
{
-  "token": "6bf00d02-dffc-4849-a635-a21b08500d61",
-  "id": 1,
-  "private": true
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-    "status": true,
-}
Response  200
HideShow
Headers
Content-Type: application/json
Body
{
-  "status": false,
-  "error": "Invalid authentication token."
-}

Generated by aglio on 13 Feb 2018

\ No newline at end of file diff --git a/img/samplescreenshot.png b/img/samplescreenshot.png deleted file mode 100644 index 4b69df059587ecf242282f5aa8af088e187b60f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51332 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 +# https://docs.mongodb.com/manual/tutorial/verify-mongodb-packages/#download-then-import-the-key-file +RUN set -ex; \ + export GNUPGHOME="$(mktemp -d)"; \ + for key in $GPG_KEYS; do \ + gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \ + done; \ + gpg --export $GPG_KEYS > /etc/apt/trusted.gpg.d/mongodb.gpg; \ + rm -r "$GNUPGHOME"; \ + apt-key list + +# Allow build-time overrides (eg. to build image with MongoDB Enterprise version) +# Options for MONGO_PACKAGE: mongodb-org OR mongodb-enterprise +# Options for MONGO_REPO: repo.mongodb.org OR repo.mongodb.com +# Example: docker build --build-arg MONGO_PACKAGE=mongodb-enterprise --build-arg MONGO_REPO=repo.mongodb.com . +ARG MONGO_PACKAGE=mongodb-org +ARG MONGO_REPO=repo.mongodb.org +ENV MONGO_PACKAGE=${MONGO_PACKAGE} MONGO_REPO=${MONGO_REPO} + +ENV MONGO_MAJOR 3.6 +ENV MONGO_VERSION 3.6.2 + +RUN echo "deb http://$MONGO_REPO/apt/debian jessie/${MONGO_PACKAGE%-unstable}/$MONGO_MAJOR main" | tee "/etc/apt/sources.list.d/${MONGO_PACKAGE%-unstable}.list" + +RUN set -x \ + && apt-get update \ + && apt-get install -y \ + ${MONGO_PACKAGE}=$MONGO_VERSION \ + ${MONGO_PACKAGE}-server=$MONGO_VERSION \ + ${MONGO_PACKAGE}-shell=$MONGO_VERSION \ + ${MONGO_PACKAGE}-mongos=$MONGO_VERSION \ + ${MONGO_PACKAGE}-tools=$MONGO_VERSION \ + && rm -rf /var/lib/apt/lists/* \ + && rm -rf /var/lib/mongodb \ + && mv /etc/mongod.conf /etc/mongod.conf.orig + +RUN mkdir -p /data/db /data/configdb \ + && chown -R mongodb:mongodb /data/db /data/configdb +VOLUME /data/db /data/configdb + +COPY docker-entrypoint.sh /usr/local/bin/ +ENTRYPOINT ["docker-entrypoint.sh"] + +EXPOSE 27017 +CMD ["mongod"] \ No newline at end of file diff --git a/mongo/docker-entrypoint.sh b/mongo/docker-entrypoint.sh new file mode 100755 index 0000000..125aca1 --- /dev/null +++ b/mongo/docker-entrypoint.sh @@ -0,0 +1,340 @@ +#!/bin/bash +set -Eeuo pipefail + +if [ "${1:0:1}" = '-' ]; then + set -- mongod "$@" +fi + +originalArgOne="$1" + +# allow the container to be started with `--user` +# all mongo* commands should be dropped to the correct user +if [[ "$originalArgOne" == mongo* ]] && [ "$(id -u)" = '0' ]; then + if [ "$originalArgOne" = 'mongod' ]; then + chown -R mongodb /data/configdb /data/db + fi + + # make sure we can write to stdout and stderr as "mongodb" + # (for our "initdb" code later; see "--logpath" below) + chown --dereference mongodb "/proc/$$/fd/1" "/proc/$$/fd/2" || : + # ignore errors thanks to https://github.com/docker-library/mongo/issues/149 + + exec gosu mongodb "$BASH_SOURCE" "$@" +fi + +# you should use numactl to start your mongod instances, including the config servers, mongos instances, and any clients. +# https://docs.mongodb.com/manual/administration/production-notes/#configuring-numa-on-linux +if [[ "$originalArgOne" == mongo* ]]; then + numa='numactl --interleave=all' + if $numa true &> /dev/null; then + set -- $numa "$@" + fi +fi + +# usage: file_env VAR [DEFAULT] +# ie: file_env 'XYZ_DB_PASSWORD' 'example' +# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of +# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature) +file_env() { + local var="$1" + local fileVar="${var}_FILE" + local def="${2:-}" + if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then + echo >&2 "error: both $var and $fileVar are set (but are exclusive)" + exit 1 + fi + local val="$def" + if [ "${!var:-}" ]; then + val="${!var}" + elif [ "${!fileVar:-}" ]; then + val="$(< "${!fileVar}")" + fi + export "$var"="$val" + unset "$fileVar" +} + +# see https://github.com/docker-library/mongo/issues/147 (mongod is picky about duplicated arguments) +_mongod_hack_have_arg() { + local checkArg="$1"; shift + local arg + for arg; do + case "$arg" in + "$checkArg"|"$checkArg"=*) + return 0 + ;; + esac + done + return 1 +} +# _mongod_hack_get_arg_val '--some-arg' "$@" +_mongod_hack_get_arg_val() { + local checkArg="$1"; shift + while [ "$#" -gt 0 ]; do + local arg="$1"; shift + case "$arg" in + "$checkArg") + echo "$1" + return 0 + ;; + "$checkArg"=*) + echo "${arg#$checkArg=}" + return 0 + ;; + esac + done + return 1 +} +declare -a mongodHackedArgs +# _mongod_hack_ensure_arg '--some-arg' "$@" +# set -- "${mongodHackedArgs[@]}" +_mongod_hack_ensure_arg() { + local ensureArg="$1"; shift + mongodHackedArgs=( "$@" ) + if ! _mongod_hack_have_arg "$ensureArg" "$@"; then + mongodHackedArgs+=( "$ensureArg" ) + fi +} +# _mongod_hack_ensure_no_arg '--some-unwanted-arg' "$@" +# set -- "${mongodHackedArgs[@]}" +_mongod_hack_ensure_no_arg() { + local ensureNoArg="$1"; shift + mongodHackedArgs=() + while [ "$#" -gt 0 ]; do + local arg="$1"; shift + if [ "$arg" = "$ensureNoArg" ]; then + continue + fi + mongodHackedArgs+=( "$arg" ) + done +} +# _mongod_hack_ensure_no_arg '--some-unwanted-arg' "$@" +# set -- "${mongodHackedArgs[@]}" +_mongod_hack_ensure_no_arg_val() { + local ensureNoArg="$1"; shift + mongodHackedArgs=() + while [ "$#" -gt 0 ]; do + local arg="$1"; shift + case "$arg" in + "$ensureNoArg") + shift # also skip the value + continue + ;; + "$ensureNoArg"=*) + # value is already included + continue + ;; + esac + mongodHackedArgs+=( "$arg" ) + done +} +# _mongod_hack_ensure_arg_val '--some-arg' 'some-val' "$@" +# set -- "${mongodHackedArgs[@]}" +_mongod_hack_ensure_arg_val() { + local ensureArg="$1"; shift + local ensureVal="$1"; shift + _mongod_hack_ensure_no_arg_val "$ensureArg" "$@" + mongodHackedArgs+=( "$ensureArg" "$ensureVal" ) +} + +# _js_escape 'some "string" value' +_js_escape() { + jq --null-input --arg 'str' "$1" '$str' +} + +jsonConfigFile="${TMPDIR:-/tmp}/docker-entrypoint-config.json" +tempConfigFile="${TMPDIR:-/tmp}/docker-entrypoint-temp-config.json" +_parse_config() { + if [ -s "$tempConfigFile" ]; then + return 0 + fi + + local configPath + if configPath="$(_mongod_hack_get_arg_val --config "$@")"; then + # if --config is specified, parse it into a JSON file so we can remove a few problematic keys (especially SSL-related keys) + # see https://docs.mongodb.com/manual/reference/configuration-options/ + mongo --norc --nodb --quiet --eval "load('/js-yaml.js'); printjson(jsyaml.load(cat($(_js_escape "$configPath"))))" > "$jsonConfigFile" + jq 'del(.systemLog, .processManagement, .net, .security)' "$jsonConfigFile" > "$tempConfigFile" + return 0 + fi + + return 1 +} +dbPath= +_dbPath() { + if [ -n "$dbPath" ]; then + echo "$dbPath" + return + fi + + if ! dbPath="$(_mongod_hack_get_arg_val --dbpath "$@")"; then + if _parse_config "$@"; then + dbPath="$(jq '.storage.dbPath' "$jsonConfigFile")" + fi + fi + + : "${dbPath:=/data/db}" + + echo "$dbPath" +} + +if [ "$originalArgOne" = 'mongod' ]; then + file_env 'MONGO_INITDB_ROOT_USERNAME' + file_env 'MONGO_INITDB_ROOT_PASSWORD' + # pre-check a few factors to see if it's even worth bothering with initdb + shouldPerformInitdb= + if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then + # if we have a username/password, let's set "--auth" + _mongod_hack_ensure_arg '--auth' "$@" + set -- "${mongodHackedArgs[@]}" + shouldPerformInitdb='true' + elif [ "$MONGO_INITDB_ROOT_USERNAME" ] || [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then + cat >&2 <<-'EOF' + + error: missing 'MONGO_INITDB_ROOT_USERNAME' or 'MONGO_INITDB_ROOT_PASSWORD' + both must be specified for a user to be created + + EOF + exit 1 + fi + + if [ -z "$shouldPerformInitdb" ]; then + # if we've got any /docker-entrypoint-initdb.d/* files to parse later, we should initdb + for f in /docker-entrypoint-initdb.d/*; do + case "$f" in + *.sh|*.js) # this should match the set of files we check for below + shouldPerformInitdb="$f" + break + ;; + esac + done + fi + + # check for a few known paths (to determine whether we've already initialized and should thus skip our initdb scripts) + if [ -n "$shouldPerformInitdb" ]; then + dbPath="$(_dbPath "$@")" + for path in \ + "$dbPath/WiredTiger" \ + "$dbPath/journal" \ + "$dbPath/local.0" \ + "$dbPath/storage.bson" \ + ; do + if [ -e "$path" ]; then + shouldPerformInitdb= + break + fi + done + fi + + if [ -n "$shouldPerformInitdb" ]; then + mongodHackedArgs=( "$@" ) + if _parse_config "$@"; then + _mongod_hack_ensure_arg_val --config "$tempConfigFile" "${mongodHackedArgs[@]}" + fi + _mongod_hack_ensure_arg_val --bind_ip 127.0.0.1 "${mongodHackedArgs[@]}" + _mongod_hack_ensure_arg_val --port 27017 "${mongodHackedArgs[@]}" + _mongod_hack_ensure_no_arg --bind_ip_all "${mongodHackedArgs[@]}" + + # remove "--auth" and "--replSet" for our initial startup (see https://docs.mongodb.com/manual/tutorial/enable-authentication/#start-mongodb-without-access-control) + # https://github.com/docker-library/mongo/issues/211 + _mongod_hack_ensure_no_arg --auth "${mongodHackedArgs[@]}" + if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then + _mongod_hack_ensure_no_arg_val --replSet "${mongodHackedArgs[@]}" + fi + + sslMode="$(_mongod_hack_have_arg '--sslPEMKeyFile' "$@" && echo 'allowSSL' || echo 'disabled')" # "BadValue: need sslPEMKeyFile when SSL is enabled" vs "BadValue: need to enable SSL via the sslMode flag when using SSL configuration parameters" + _mongod_hack_ensure_arg_val --sslMode "$sslMode" "${mongodHackedArgs[@]}" + + if stat "/proc/$$/fd/1" > /dev/null && [ -w "/proc/$$/fd/1" ]; then + # https://github.com/mongodb/mongo/blob/38c0eb538d0fd390c6cb9ce9ae9894153f6e8ef5/src/mongo/db/initialize_server_global_state.cpp#L237-L251 + # https://github.com/docker-library/mongo/issues/164#issuecomment-293965668 + _mongod_hack_ensure_arg_val --logpath "/proc/$$/fd/1" "${mongodHackedArgs[@]}" + else + initdbLogPath="$(_dbPath "$@")/docker-initdb.log" + echo >&2 "warning: initdb logs cannot write to '/proc/$$/fd/1', so they are in '$initdbLogPath' instead" + _mongod_hack_ensure_arg_val --logpath "$initdbLogPath" "${mongodHackedArgs[@]}" + fi + _mongod_hack_ensure_arg --logappend "${mongodHackedArgs[@]}" + + pidfile="${TMPDIR:-/tmp}/docker-entrypoint-temp-mongod.pid" + rm -f "$pidfile" + _mongod_hack_ensure_arg_val --pidfilepath "$pidfile" "${mongodHackedArgs[@]}" + + "${mongodHackedArgs[@]}" --fork + + mongo=( mongo --host 127.0.0.1 --port 27017 --quiet ) + + # check to see that our "mongod" actually did start up (catches "--help", "--version", MongoDB 3.2 being silly, slow prealloc, etc) + # https://jira.mongodb.org/browse/SERVER-16292 + tries=30 + while true; do + if ! { [ -s "$pidfile" ] && ps "$(< "$pidfile")" &> /dev/null; }; then + # bail ASAP if "mongod" isn't even running + echo >&2 + echo >&2 "error: $originalArgOne does not appear to have stayed running -- perhaps it had an error?" + echo >&2 + exit 1 + fi + if "${mongo[@]}" 'admin' --eval 'quit(0)' &> /dev/null; then + # success! + break + fi + (( tries-- )) + if [ "$tries" -le 0 ]; then + echo >&2 + echo >&2 "error: $originalArgOne does not appear to have accepted connections quickly enough -- perhaps it had an error?" + echo >&2 + exit 1 + fi + sleep 1 + done + + if [ "$MONGO_INITDB_ROOT_USERNAME" ] && [ "$MONGO_INITDB_ROOT_PASSWORD" ]; then + rootAuthDatabase='admin' + + "${mongo[@]}" "$rootAuthDatabase" <<-EOJS + db.createUser({ + user: $(_js_escape "$MONGO_INITDB_ROOT_USERNAME"), + pwd: $(_js_escape "$MONGO_INITDB_ROOT_PASSWORD"), + roles: [ { role: 'root', db: $(_js_escape "$rootAuthDatabase") } ] + }) + EOJS + fi + + export MONGO_INITDB_DATABASE="${MONGO_INITDB_DATABASE:-test}" + + echo + for f in /docker-entrypoint-initdb.d/*; do + case "$f" in + *.sh) echo "$0: running $f"; . "$f" ;; + *.js) echo "$0: running $f"; "${mongo[@]}" "$MONGO_INITDB_DATABASE" "$f"; echo ;; + *) echo "$0: ignoring $f" ;; + esac + echo + done + + "$@" --pidfilepath="$pidfile" --shutdown + rm -f "$pidfile" + + echo + echo 'MongoDB init process complete; ready for start up.' + echo + fi + + # MongoDB 3.6+ defaults to localhost-only binding + haveBindIp= + if _mongod_hack_have_arg --bind_ip "$@" || _mongod_hack_have_arg --bind_ip_all "$@"; then + haveBindIp=1 + elif _parse_config "$@" && jq --exit-status '.net.bindIp // .net.bindIpAll' "$jsonConfigFile" > /dev/null; then + haveBindIp=1 + fi + if [ -z "$haveBindIp" ]; then + # so if no "--bind_ip" is specified, let's add "--bind_ip_all" + set -- "$@" --bind_ip_all + fi + + unset "${!MONGO_INITDB_@}" +fi + +rm -f "$jsonConfigFile" "$tempConfigFile" + +exec "$@" \ No newline at end of file diff --git a/run.sh b/run.sh index 97e50da..972a7e8 100755 --- a/run.sh +++ b/run.sh @@ -1,12 +1 @@ -#!/bin/bash - -if [ "$EUID" -ne 0 ] - then echo "Please run as root" - exit -fi - -TEAMID=`md5sum README.md | cut -d' ' -f 1` -docker kill $(docker ps -q) -docker rm $(docker ps -a -q) -docker build . -t $TEAMID -docker run -p 80:80 -p 8080:8080 -t $TEAMID +docker-compose up --build \ No newline at end of file diff --git a/src/html/demo.js b/src/html/demo.js deleted file mode 100644 index ada1b22..0000000 --- a/src/html/demo.js +++ /dev/null @@ -1,47 +0,0 @@ -var API_ENDPOINT = "http://localhost:8080" - -// From https://code-maven.com/ajax-request-for-json-data - -function ajax_get(url, callback) { - var xmlhttp = new XMLHttpRequest(); - xmlhttp.onreadystatechange = function() { - if (xmlhttp.readyState == 4 && xmlhttp.status == 200) { - console.log('responseText:' + xmlhttp.responseText); - try { - var data = JSON.parse(xmlhttp.responseText); - } catch(err) { - console.log(err.message + " in " + xmlhttp.responseText); - return; - } - callback(data); - } - }; - - xmlhttp.open("GET", url, true); - xmlhttp.send(); -} - -ajax_get(API_ENDPOINT + '/meta/heartbeat', function(data) { - if (data.status) { - document.getElementById("demo_heartbeat").innerHTML = "Heartbeat success"; - } - else { - document.getElementById("demo_heartbeat").innerHTML = "Heartbeat failed"; - } -}); - -ajax_get(API_ENDPOINT + '/meta/members', function(data) { - if (data.status) { - var members = data.result; - var output = "

Team Members:

    "; - for (var i = 0; i < members.length; i++) { - output += "
  • " + members[i] + "
  • "; - } - output += "
"; - document.getElementById("demo_members").innerHTML = output; - } - else { - document.getElementById("demo_members").innerHTML = "Members failed"; - } -}); - diff --git a/src/html/index.html b/src/html/index.html deleted file mode 100644 index 2a847c7..0000000 --- a/src/html/index.html +++ /dev/null @@ -1,26 +0,0 @@ - - - - -

Secret Diary Front End

-

Requirements for the front end are as follows:

-
    -
  • Register a user
  • -
  • Login
  • -
  • Logout
  • -
  • Display all public diary entries
  • -
  • Display an authenticated user's diary entries
  • -
  • Create a new diary entry
  • -
  • Delete an existing diary entry
  • -
  • Toggle the permissions on an existing diary entry
  • -
- -
-
-
-
- - - diff --git a/src/service/app.py b/src/service/app.py deleted file mode 100644 index ade6772..0000000 --- a/src/service/app.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/python - -from flask import Flask -from flask_cors import CORS -import json -import os - -app = Flask(__name__) -# Enable cross origin sharing for all endpoints -CORS(app) - -# Remember to update this list -ENDPOINT_LIST = ['/', '/meta/heartbeat', '/meta/members'] - -def make_json_response(data, status=True, code=200): - """Utility function to create the JSON responses.""" - - to_serialize = {} - if status: - to_serialize['status'] = True - if data is not None: - to_serialize['result'] = data - else: - to_serialize['status'] = False - to_serialize['error'] = data - response = app.response_class( - response=json.dumps(to_serialize), - status=code, - mimetype='application/json' - ) - return response - - -@app.route("/") -def index(): - """Returns a list of implemented endpoints.""" - return make_json_response(ENDPOINT_LIST) - - -@app.route("/meta/heartbeat") -def meta_heartbeat(): - """Returns true""" - return make_json_response(None) - - -@app.route("/meta/members") -def meta_members(): - """Returns a list of team members""" - with open("./team_members.txt") as f: - team_members = f.read().strip().split("\n") - return make_json_response(team_members) - - -if __name__ == '__main__': - # Change the working directory to the script directory - abspath = os.path.abspath(__file__) - dname = os.path.dirname(abspath) - os.chdir(dname) - - # Run the application - app.run(debug=False, port=8080, host="0.0.0.0") diff --git a/src/service/start_services.sh b/src/service/start_services.sh deleted file mode 100644 index a970fe8..0000000 --- a/src/service/start_services.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -apachectl start -python /service/app.py diff --git a/src/service/team_members.txt b/src/service/team_members.txt deleted file mode 100644 index 50bdea8..0000000 --- a/src/service/team_members.txt +++ /dev/null @@ -1,3 +0,0 @@ -Jeremy Heng -John Galt -Audrey Shida From a7e52fb2c755105f69ab99ad84316110fa4b1f8e Mon Sep 17 00:00:00 2001 From: shirlenequah Date: Mon, 26 Feb 2018 18:51:28 +0800 Subject: [PATCH 02/17] Updates --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..eb79dd5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +node_modules +.idea From bd0012e05d7d4134dac9f65d99ce42e160514187 Mon Sep 17 00:00:00 2001 From: shirlenequah Date: Mon, 26 Feb 2018 20:06:32 +0800 Subject: [PATCH 03/17] Change package name and id implementation --- NodeApp/app.js | 18 +++++----- NodeApp/models/counter.js | 12 ------- NodeApp/models/message.js | 6 +++- NodeApp/models/uuid.js | 21 ----------- NodeApp/package.json | 5 +-- NodeApp/routes/app.js | 5 +-- NodeApp/routes/messages.js | 74 ++++++++++++++++++-------------------- NodeApp/uiApp.js | 1 - clean.sh | 3 ++ 9 files changed, 56 insertions(+), 89 deletions(-) delete mode 100755 NodeApp/models/counter.js delete mode 100755 NodeApp/models/uuid.js create mode 100755 clean.sh diff --git a/NodeApp/app.js b/NodeApp/app.js index f5cb028..ed57f99 100755 --- a/NodeApp/app.js +++ b/NodeApp/app.js @@ -9,20 +9,20 @@ var mongoose = require('mongoose'); var messageRoutes = require('./routes/messages'); var userRoutes = require('./routes/user'); var app = express(); -var IdCounter = require('./models/counter'); +// var IdCounter = require('./models/counter'); var dbhost = process.env.DBHOST || 'localhost:27017'; console.log ("STARTING HERE TEST DB HOST: " + dbhost); mongoose.connect( dbhost + '/node-angular'); -IdCounter.find({type: "message"}, function (err, resultArray) { - if (err) throw err; - console.log(resultArray); - if(resultArray.length ==0) { - var a = new IdCounter({counter: 0, type: "message"}); - a.save(); - } -}); +// IdCounter.find({type: "message"}, function (err, resultArray) { +// if (err) throw err; +// console.log(resultArray); +// if(resultArray.length ==0) { +// var a = new IdCounter({counter: 0, type: "message"}); +// a.save(); +// } +// }); //Change this to the script later // view engine setup diff --git a/NodeApp/models/counter.js b/NodeApp/models/counter.js deleted file mode 100755 index d588bbe..0000000 --- a/NodeApp/models/counter.js +++ /dev/null @@ -1,12 +0,0 @@ -var mongoose = require('mongoose'); -var Schema = mongoose.Schema; -var mongooseUniqueValidator = require('mongoose-unique-validator'); - -var schema = new Schema({ - counter: {type: Number, required: true}, - type: {type: String, required: true} -}); - -schema.plugin(mongooseUniqueValidator); - -module.exports = mongoose.model('Counter', schema); \ No newline at end of file diff --git a/NodeApp/models/message.js b/NodeApp/models/message.js index 4e3927e..b5bdc4c 100755 --- a/NodeApp/models/message.js +++ b/NodeApp/models/message.js @@ -1,8 +1,11 @@ var mongoose = require('mongoose'); var Schema = mongoose.Schema; - var User = require('./user'); +const autoIncrement = require('mongoose-auto-increment'); +autoIncrement.initialize(mongoose.connection); + + var schema = new Schema({ title: {type: String, required: true}, author: {type: String, required: true}, @@ -13,6 +16,7 @@ var schema = new Schema({ user: {type: Schema.Types.ObjectId, ref: 'User', required:true} }); +schema.plugin(autoIncrement.plugin, { model: 'Message', field: 'idCounter', startAt: 1 }); schema.post('remove', function (message) { User.findById(message.user, function (err, user) { diff --git a/NodeApp/models/uuid.js b/NodeApp/models/uuid.js deleted file mode 100755 index 2c12565..0000000 --- a/NodeApp/models/uuid.js +++ /dev/null @@ -1,21 +0,0 @@ -var mongoose = require('mongoose'); -var Schema = mongoose.Schema; -var mongooseUniqueValidator = require('mongoose-unique-validator'); - -var schema = new Schema({ - uuid: {type: String, required: true}, - time: {type: String, required: true}, - user: {type: Schema.Types.ObjectId, ref: 'User'} -}); - - -schema.post('remove', function (uuid) { - User.findById(uuid.user, function (err, user) { - user.uuid = undefined; - user.save(); - }); -}); - -schema.plugin(mongooseUniqueValidator); - -module.exports = mongoose.model('uuid', schema); \ No newline at end of file diff --git a/NodeApp/package.json b/NodeApp/package.json index 381da71..3a493de 100755 --- a/NodeApp/package.json +++ b/NodeApp/package.json @@ -1,5 +1,5 @@ { - "name": "udemy-nodejs-angular2", + "name": "CS5331", "version": "1.0.0", "private": true, "scripts": { @@ -31,6 +31,7 @@ "jsonwebtoken": "^5.7.0", "mongoose": "^4.4.12", "mongoose-unique-validator": "^1.0.2", + "mongoose-auto-increment": "^5.0.1", "morgan": "~1.6.1", "parseurl": "^1.3.2", "reflect-metadata": "^0.1.3", @@ -50,7 +51,7 @@ "html-loader": "^0.4.4", "raw-loader": "^0.5.1", "ts-loader": "^2.0.3", - "typescript": "^2.4.2", + "typescript": "^2.7.2", "webpack": "^2.2.1", "webpack-merge": "^4.1.0" } diff --git a/NodeApp/routes/app.js b/NodeApp/routes/app.js index 9900aa0..4673343 100755 --- a/NodeApp/routes/app.js +++ b/NodeApp/routes/app.js @@ -2,10 +2,7 @@ var express = require('express'); var router = express.Router(); var parseUrl = require('parseurl'); -// router.get('', function (req, res, next) { -// console.log("(:") -// res.render('index'); -// }); + router.get('/', function (req, res, next) { console.log("Sigh"); res.contentType("application/json"); diff --git a/NodeApp/routes/messages.js b/NodeApp/routes/messages.js index a1feb28..9cec320 100755 --- a/NodeApp/routes/messages.js +++ b/NodeApp/routes/messages.js @@ -5,7 +5,7 @@ var jwt = require('jsonwebtoken'); var User = require('../models/user'); var Message = require('../models/message'); var userRoute = require('./user'); -var IdCounter = require('../models/counter'); +// var IdCounter = require('../models/counter'); router.get('/', function (req, res, next) { @@ -79,59 +79,55 @@ router.post('/', function (req, res, next) { }); router.post('/create', function (req, res, next) { - console.log("POSTING"); var decoded = jwt.decode(userRoute.uuidMap[req.body.token]); - IdCounter.find({type: "message"}, function (err, resultArray) { - if (err) throw err; - console.log(resultArray); - var counterResult = resultArray[0]; - counterResult.counter = counterResult.counter + 1; - var newCounter = new IdCounter(counterResult); - console.log(counterResult.counter + "wtf"); - User.findById(decoded.user._id, function (err, user) { + // IdCounter.find({type: "message"}, function (err, resultArray) { + // if (err) throw err; + // console.log(resultArray); + // var counterResult = resultArray[0]; + // counterResult.counter = counterResult.counter + 1; + // var newCounter = new IdCounter(counterResult); + // console.log(counterResult.counter + "wtf"); + User.findById(decoded.user._id, function (err, user) { + if (err) { + console.log("ADD ERROR" + err); + return res.status(200).json({ + "status": false, + "error": "Invalid authentication token." + }); + } + var message = new Message({ + title: req.body.title, + author: user.fullname, + publish_date: new Date().toISOString(), + isPublic: req.body.public, + text: req.body.text, + user: user + }); + user.messages.push(message); + user.save(); + message.save(function (err, result) { if (err) { - console.log("ADD ERROR" + err); + console.log("No error should be here"); return res.status(200).json({ "status": false, "error": "Invalid authentication token." }); } - var message = new Message({ - title: req.body.title, - author: user.fullname, - publish_date: new Date().toISOString(), - isPublic: req.body.public, - text: req.body.text, - idCounter: counterResult.counter, - user: user - }); - user.messages.push(message); - user.save(); - message.save(function (err, result) { - if (err) { - console.log("No error should be here"); - return res.status(200).json({ - "status": false, - "error": "Invalid authentication token." - }); - } - // user.messages.push(result); - // user.save(); - newCounter.save(); - res.status(201).json({ - "status": true, - "result": counterResult.counter - }); + + res.status(201).json({ + "status": true, + "result": result.idCounter }); }); }); + // }); }); router.post('/permission', function (req, res, next) { var decoded = jwt.decode(userRoute.uuidMap[req.body.token]); console.log(req.body); Message.find({idCounter: req.body.id}, function (err, messageArr) { - if(!messageArr){ + if (!messageArr) { //This should not happen return res.status(200).json({ "status": false, @@ -179,7 +175,7 @@ router.post('/delete', function (req, res, next) { // console.log(req.query.token + " : lol"); console.log(req.body.id + " ID"); Message.find({idCounter: req.body.id}, function (err, messageArr) { - if(!messageArr){ + if (!messageArr) { //This should not happen return res.status(200).json({ "status": false, diff --git a/NodeApp/uiApp.js b/NodeApp/uiApp.js index b4b7246..5b824df 100755 --- a/NodeApp/uiApp.js +++ b/NodeApp/uiApp.js @@ -13,7 +13,6 @@ mongoose.connect('localhost:27017/node-angular'); -var IdCounter = require('./models/counter'); //Change this to the script later // var a = new IdCounter({counter: 0, type: "message"}); // a.save(); diff --git a/clean.sh b/clean.sh new file mode 100755 index 0000000..22e4f92 --- /dev/null +++ b/clean.sh @@ -0,0 +1,3 @@ +docker stop $(sudo docker ps -a -q) +docker rmi $(sudo docker images -a -q) +docker rm $(sudo docker ps -a -q) From ddb95cb9e6b415ca9bf4e2cba3d5d9f6c8011338 Mon Sep 17 00:00:00 2001 From: Wei Lip Date: Wed, 28 Feb 2018 17:45:01 +0800 Subject: [PATCH 04/17] Updated UI validation and updated endpoint to latest requirements --- NodeApp/Dockerfile | 2 +- NodeApp/app.js | 23 ++---- NodeApp/assets/app/app.component.ts | 1 + NodeApp/assets/app/auth/signin.component.html | 13 +++- NodeApp/assets/app/auth/signin.component.ts | 15 ++-- NodeApp/assets/app/auth/signup.component.html | 15 +++- NodeApp/assets/app/auth/signup.component.ts | 17 ++-- .../assets/app/messages/message.service.ts | 3 +- .../myMessages/my-message.component.ts | 1 + NodeApp/bin/www | 2 +- NodeApp/models/user.js | 2 +- NodeApp/routes/app.js | 22 ------ NodeApp/routes/messages.js | 78 +++++++++---------- NodeApp/routes/user.js | 11 ++- NodeApp/uiApp.js | 20 +---- README.md | 26 ++++--- curlScript.sh | 3 + docker-compose.yml | 2 +- 18 files changed, 117 insertions(+), 139 deletions(-) delete mode 100755 NodeApp/routes/app.js create mode 100644 curlScript.sh diff --git a/NodeApp/Dockerfile b/NodeApp/Dockerfile index be242ee..270b454 100755 --- a/NodeApp/Dockerfile +++ b/NodeApp/Dockerfile @@ -16,7 +16,7 @@ RUN npm install COPY . /usr/src/app # Expose the port the app runs in -EXPOSE 3000 8080 +EXPOSE 80 8080 # Serve the app RUN npm run build:prod diff --git a/NodeApp/app.js b/NodeApp/app.js index ed57f99..0e026a9 100755 --- a/NodeApp/app.js +++ b/NodeApp/app.js @@ -9,21 +9,11 @@ var mongoose = require('mongoose'); var messageRoutes = require('./routes/messages'); var userRoutes = require('./routes/user'); var app = express(); -// var IdCounter = require('./models/counter'); var dbhost = process.env.DBHOST || 'localhost:27017'; console.log ("STARTING HERE TEST DB HOST: " + dbhost); mongoose.connect( dbhost + '/node-angular'); -// IdCounter.find({type: "message"}, function (err, resultArray) { -// if (err) throw err; -// console.log(resultArray); -// if(resultArray.length ==0) { -// var a = new IdCounter({counter: 0, type: "message"}); -// a.save(); -// } -// }); -//Change this to the script later // view engine setup app.set('views', path.join(__dirname, 'views')); @@ -39,7 +29,8 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use(function (req, res, next) { - res.setHeader('Access-Control-Allow-Origin', '*'); + console.log(req.hostname); + res.setHeader('Access-Control-Allow-Origin', 'http://localhost'); res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); res.setHeader('Access-Control-Allow-Methods', 'POST, GET'); // res.status(200); @@ -59,10 +50,10 @@ app.get('/meta/members', function (req, res) { res.status(200).json({ "status": true, "result": [ - "Wei Lip", - "James", - "Ben", - "Shirlene" + "Ho Wei Lip", + "James Tan Wee Jing", + "Cao Shuai Benjamin", + "Shirlene Quah Jiamin" ] }); }); @@ -78,7 +69,7 @@ app.get('/', function (req, res, next) { "result": [ "/", "/meta/heartbeat", - "/meta/members" + "/meta/team" ] }); // return res.render('index'); diff --git a/NodeApp/assets/app/app.component.ts b/NodeApp/assets/app/app.component.ts index c155b90..7b77546 100755 --- a/NodeApp/assets/app/app.component.ts +++ b/NodeApp/assets/app/app.component.ts @@ -8,4 +8,5 @@ import { MessageService } from "./messages/message.service"; providers: [MessageService] }) export class AppComponent { + } \ No newline at end of file diff --git a/NodeApp/assets/app/auth/signin.component.html b/NodeApp/assets/app/auth/signin.component.html index 9bdbf3e..5f8969d 100755 --- a/NodeApp/assets/app/auth/signin.component.html +++ b/NodeApp/assets/app/auth/signin.component.html @@ -1,12 +1,14 @@
- + + formControlName="username" required> +

Username Min length 6

+
@@ -14,11 +16,16 @@ type="password" id="password" class="form-control" - formControlName="password"> + formControlName="password" required> +

Password Min Length 8

+
+
+

Sign In failed

+
\ No newline at end of file diff --git a/NodeApp/assets/app/auth/signin.component.ts b/NodeApp/assets/app/auth/signin.component.ts index 4321189..78c3ed5 100755 --- a/NodeApp/assets/app/auth/signin.component.ts +++ b/NodeApp/assets/app/auth/signin.component.ts @@ -11,8 +11,10 @@ import { AuthService } from "./auth.service"; }) export class SigninComponent { myForm: FormGroup; - - constructor(private authService: AuthService, private router: Router) {} + public isWrong :boolean = false; + constructor(private authService: AuthService, private router: Router) { + console.log(window.location.host); + } onSubmit() { const user = new User(this.myForm.value.username, this.myForm.value.password); @@ -21,6 +23,7 @@ export class SigninComponent { data => { if(data.status == false){ console.log("Log in Fai led"); + this.failedSignIn = true; return; } @@ -35,11 +38,13 @@ export class SigninComponent { this.myForm.reset(); } - + public userNameControl =new FormControl(null, [Validators.required,Validators.minLength(6)]); + public passWordControl = new FormControl(null, [Validators.required,Validators.minLength(8)]); + public failedSignIn = false; ngOnInit() { this.myForm = new FormGroup({ - username: new FormControl(null, Validators.required), - password: new FormControl(null, Validators.required) + username: this.userNameControl, + password: this.passWordControl }); } } \ No newline at end of file diff --git a/NodeApp/assets/app/auth/signup.component.html b/NodeApp/assets/app/auth/signup.component.html index 119bb95..9f6179c 100755 --- a/NodeApp/assets/app/auth/signup.component.html +++ b/NodeApp/assets/app/auth/signup.component.html @@ -6,7 +6,9 @@ type="text" id="fullname" class="form-control" - formControlName="fullname"> + formControlName="fullname" required> +

Invalid Name

+
@@ -14,7 +16,8 @@ type="text" id="age" class="form-control" - formControlName="age"> + formControlName="age" required> +

Invalid Age

@@ -22,7 +25,9 @@ type="text" id="username" class="form-control" - formControlName="username"> + formControlName="username" required> +

Minimum length 6

+
@@ -30,7 +35,9 @@ type="password" id="password" class="form-control" - formControlName="password"> + formControlName="password" required> +

Minimum length 8

+