├── .gitattributes
├── LICENSE
├── README.md
├── app.css
├── app
├── _directives
│ ├── alert.component.html
│ ├── alert.component.js
│ ├── alert.component.js.map
│ ├── alert.component.ts
│ ├── index.js
│ ├── index.js.map
│ └── index.ts
├── _guards
│ ├── auth.guard.js
│ ├── auth.guard.js.map
│ ├── auth.guard.ts
│ ├── index.js
│ ├── index.js.map
│ └── index.ts
├── _helpers
│ ├── fake-backend.js
│ ├── fake-backend.js.map
│ ├── fake-backend.ts
│ ├── index.js
│ ├── index.js.map
│ ├── index.ts
│ ├── jwt.interceptor.js
│ ├── jwt.interceptor.js.map
│ └── jwt.interceptor.ts
├── _models
│ ├── index.js
│ ├── index.js.map
│ ├── index.ts
│ ├── user.js
│ ├── user.js.map
│ └── user.ts
├── _services
│ ├── alert.service.js
│ ├── alert.service.js.map
│ ├── alert.service.ts
│ ├── authentication.service.js
│ ├── authentication.service.js.map
│ ├── authentication.service.ts
│ ├── index.js
│ ├── index.js.map
│ ├── index.ts
│ ├── user.service.js
│ ├── user.service.js.map
│ └── user.service.ts
├── app.component.html
├── app.component.js
├── app.component.js.map
├── app.component.ts
├── app.module.js
├── app.module.js.map
├── app.module.ts
├── app.routing.js
├── app.routing.js.map
├── app.routing.ts
├── home
│ ├── home.component.html
│ ├── home.component.js
│ ├── home.component.js.map
│ ├── home.component.ts
│ ├── index.js
│ ├── index.js.map
│ └── index.ts
├── login
│ ├── index.js
│ ├── index.js.map
│ ├── index.ts
│ ├── login.component.html
│ ├── login.component.js
│ ├── login.component.js.map
│ └── login.component.ts
├── main.js
├── main.js.map
├── main.ts
└── register
│ ├── index.js
│ ├── index.js.map
│ ├── index.ts
│ ├── register.component.html
│ ├── register.component.js
│ ├── register.component.js.map
│ └── register.component.ts
├── index.html
├── package-lock.json
├── package.json
├── systemjs.config.js
└── tsconfig.json
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Jason Watmore
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # angular2-registration-login-example
2 |
3 | Angular 2/5 User Registration and Login Example & Tutorial
4 |
5 | To see a demo and further details go to http://jasonwatmore.com/post/2016/09/29/angular-2-user-registration-and-login-example-tutorial
6 |
--------------------------------------------------------------------------------
/app.css:
--------------------------------------------------------------------------------
1 | a {
2 | cursor: pointer;
3 | }
4 |
5 | .help-block {
6 | font-size: 12px;
7 | }
--------------------------------------------------------------------------------
/app/_directives/alert.component.html:
--------------------------------------------------------------------------------
1 |
{{message.text}}
--------------------------------------------------------------------------------
/app/_directives/alert.component.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var index_1 = require("../_services/index");
14 | var AlertComponent = /** @class */ (function () {
15 | function AlertComponent(alertService) {
16 | var _this = this;
17 | this.alertService = alertService;
18 | // subscribe to alert messages
19 | this.subscription = alertService.getMessage().subscribe(function (message) { _this.message = message; });
20 | }
21 | AlertComponent.prototype.ngOnDestroy = function () {
22 | // unsubscribe on destroy to prevent memory leaks
23 | this.subscription.unsubscribe();
24 | };
25 | AlertComponent = __decorate([
26 | core_1.Component({
27 | moduleId: module.id,
28 | selector: 'alert',
29 | templateUrl: 'alert.component.html'
30 | }),
31 | __metadata("design:paramtypes", [index_1.AlertService])
32 | ], AlertComponent);
33 | return AlertComponent;
34 | }());
35 | exports.AlertComponent = AlertComponent;
36 | //# sourceMappingURL=alert.component.js.map
--------------------------------------------------------------------------------
/app/_directives/alert.component.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"alert.component.js","sourceRoot":"","sources":["alert.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAAqD;AAGrD,4CAAkD;AAQlD;IAII,wBAAoB,YAA0B;QAA9C,iBAGC;QAHmB,iBAAY,GAAZ,YAAY,CAAc;QAC1C,8BAA8B;QAC9B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,UAAA,OAAO,IAAM,KAAI,CAAC,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,CAAC;IAED,oCAAW,GAAX;QACI,iDAAiD;QACjD,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC;IAZQ,cAAc;QAN1B,gBAAS,CAAC;YACP,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,QAAQ,EAAE,OAAO;YACjB,WAAW,EAAE,sBAAsB;SACtC,CAAC;yCAMoC,oBAAY;OAJrC,cAAc,CAa1B;IAAD,qBAAC;CAAA,AAbD,IAaC;AAbY,wCAAc"}
--------------------------------------------------------------------------------
/app/_directives/alert.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnDestroy } from '@angular/core';
2 | import { Subscription } from 'rxjs/Subscription';
3 |
4 | import { AlertService } from '../_services/index';
5 |
6 | @Component({
7 | moduleId: module.id,
8 | selector: 'alert',
9 | templateUrl: 'alert.component.html'
10 | })
11 |
12 | export class AlertComponent implements OnDestroy {
13 | private subscription: Subscription;
14 | message: any;
15 |
16 | constructor(private alertService: AlertService) {
17 | // subscribe to alert messages
18 | this.subscription = alertService.getMessage().subscribe(message => { this.message = message; });
19 | }
20 |
21 | ngOnDestroy(): void {
22 | // unsubscribe on destroy to prevent memory leaks
23 | this.subscription.unsubscribe();
24 | }
25 | }
--------------------------------------------------------------------------------
/app/_directives/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./alert.component"));
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/_directives/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,uCAAkC"}
--------------------------------------------------------------------------------
/app/_directives/index.ts:
--------------------------------------------------------------------------------
1 | export * from './alert.component';
--------------------------------------------------------------------------------
/app/_guards/auth.guard.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var router_1 = require("@angular/router");
14 | var AuthGuard = /** @class */ (function () {
15 | function AuthGuard(router) {
16 | this.router = router;
17 | }
18 | AuthGuard.prototype.canActivate = function (route, state) {
19 | if (localStorage.getItem('currentUser')) {
20 | // logged in so return true
21 | return true;
22 | }
23 | // not logged in so redirect to login page with the return url
24 | this.router.navigate(['login'], { queryParams: { returnUrl: state.url } });
25 | return false;
26 | };
27 | AuthGuard = __decorate([
28 | core_1.Injectable(),
29 | __metadata("design:paramtypes", [router_1.Router])
30 | ], AuthGuard);
31 | return AuthGuard;
32 | }());
33 | exports.AuthGuard = AuthGuard;
34 | //# sourceMappingURL=auth.guard.js.map
--------------------------------------------------------------------------------
/app/_guards/auth.guard.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"auth.guard.js","sourceRoot":"","sources":["auth.guard.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA2C;AAC3C,0CAAmG;AAGnG;IAEI,mBAAoB,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAI,CAAC;IAEvC,+BAAW,GAAX,UAAY,KAA6B,EAAE,KAA0B;QACjE,EAAE,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACtC,2BAA2B;YAC3B,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC;QAED,8DAA8D;QAC9D,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,GAAG,EAAE,EAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;IAbQ,SAAS;QADrB,iBAAU,EAAE;yCAGmB,eAAM;OAFzB,SAAS,CAcrB;IAAD,gBAAC;CAAA,AAdD,IAcC;AAdY,8BAAS"}
--------------------------------------------------------------------------------
/app/_guards/auth.guard.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Router, CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
3 |
4 | @Injectable()
5 | export class AuthGuard implements CanActivate {
6 |
7 | constructor(private router: Router) { }
8 |
9 | canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot) {
10 | if (localStorage.getItem('currentUser')) {
11 | // logged in so return true
12 | return true;
13 | }
14 |
15 | // not logged in so redirect to login page with the return url
16 | this.router.navigate(['login'], { queryParams: { returnUrl: state.url }});
17 | return false;
18 | }
19 | }
--------------------------------------------------------------------------------
/app/_guards/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./auth.guard"));
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/_guards/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,kCAA6B"}
--------------------------------------------------------------------------------
/app/_guards/index.ts:
--------------------------------------------------------------------------------
1 | export * from './auth.guard';
--------------------------------------------------------------------------------
/app/_helpers/fake-backend.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var http_1 = require("@angular/common/http");
14 | var Observable_1 = require("rxjs/Observable");
15 | require("rxjs/add/observable/of");
16 | require("rxjs/add/observable/throw");
17 | require("rxjs/add/operator/delay");
18 | require("rxjs/add/operator/mergeMap");
19 | require("rxjs/add/operator/materialize");
20 | require("rxjs/add/operator/dematerialize");
21 | var FakeBackendInterceptor = /** @class */ (function () {
22 | function FakeBackendInterceptor() {
23 | }
24 | FakeBackendInterceptor.prototype.intercept = function (request, next) {
25 | // array in local storage for registered users
26 | var users = JSON.parse(localStorage.getItem('users')) || [];
27 | // wrap in delayed observable to simulate server api call
28 | return Observable_1.Observable.of(null).mergeMap(function () {
29 | // authenticate
30 | if (request.url.endsWith('/api/authenticate') && request.method === 'POST') {
31 | // find if any user matches login credentials
32 | var filteredUsers = users.filter(function (user) {
33 | return user.username === request.body.username && user.password === request.body.password;
34 | });
35 | if (filteredUsers.length) {
36 | // if login details are valid return 200 OK with user details and fake jwt token
37 | var user = filteredUsers[0];
38 | var body = {
39 | id: user.id,
40 | username: user.username,
41 | firstName: user.firstName,
42 | lastName: user.lastName,
43 | token: 'fake-jwt-token'
44 | };
45 | return Observable_1.Observable.of(new http_1.HttpResponse({ status: 200, body: body }));
46 | }
47 | else {
48 | // else return 400 bad request
49 | return Observable_1.Observable.throw('Username or password is incorrect');
50 | }
51 | }
52 | // get users
53 | if (request.url.endsWith('/api/users') && request.method === 'GET') {
54 | // check for fake auth token in header and return users if valid, this security is implemented server side in a real application
55 | if (request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
56 | return Observable_1.Observable.of(new http_1.HttpResponse({ status: 200, body: users }));
57 | }
58 | else {
59 | // return 401 not authorised if token is null or invalid
60 | return Observable_1.Observable.throw('Unauthorised');
61 | }
62 | }
63 | // get user by id
64 | if (request.url.match(/\/api\/users\/\d+$/) && request.method === 'GET') {
65 | // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
66 | if (request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
67 | // find user by id in users array
68 | var urlParts = request.url.split('/');
69 | var id_1 = parseInt(urlParts[urlParts.length - 1]);
70 | var matchedUsers = users.filter(function (user) { return user.id === id_1; });
71 | var user = matchedUsers.length ? matchedUsers[0] : null;
72 | return Observable_1.Observable.of(new http_1.HttpResponse({ status: 200, body: user }));
73 | }
74 | else {
75 | // return 401 not authorised if token is null or invalid
76 | return Observable_1.Observable.throw('Unauthorised');
77 | }
78 | }
79 | // create user
80 | if (request.url.endsWith('/api/users') && request.method === 'POST') {
81 | // get new user object from post body
82 | var newUser_1 = request.body;
83 | // validation
84 | var duplicateUser = users.filter(function (user) { return user.username === newUser_1.username; }).length;
85 | if (duplicateUser) {
86 | return Observable_1.Observable.throw('Username "' + newUser_1.username + '" is already taken');
87 | }
88 | // save new user
89 | newUser_1.id = users.length + 1;
90 | users.push(newUser_1);
91 | localStorage.setItem('users', JSON.stringify(users));
92 | // respond 200 OK
93 | return Observable_1.Observable.of(new http_1.HttpResponse({ status: 200 }));
94 | }
95 | // update user
96 | if (request.url.match(/\/api\/users\/\d+$/) && request.method === 'PUT') {
97 | // get new user object from post body
98 | var updateUser_1 = request.body;
99 | // validation
100 | var duplicateUser = users.filter(function (user) { return user.username === updateUser_1.username; }).length;
101 | if (duplicateUser) {
102 | return Observable_1.Observable.throw('Username "' + updateUser_1.username + '" is already taken');
103 | }
104 | var urlParts = request.url.split('/');
105 | var id = parseInt(urlParts[urlParts.length - 1]);
106 | for (var i = 0; i < users.length; i++) {
107 | var user = users[i];
108 | if (user.id === id) {
109 | // delete user
110 | users[i] = updateUser_1;
111 | localStorage.setItem('users', JSON.stringify(users));
112 | break;
113 | }
114 | }
115 | localStorage.setItem('users', JSON.stringify(users));
116 | // respond 200 OK
117 | return Observable_1.Observable.of(new http_1.HttpResponse({ status: 200 }));
118 | }
119 | // delete user
120 | if (request.url.match(/\/api\/users\/\d+$/) && request.method === 'DELETE') {
121 | // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
122 | if (request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
123 | // find user by id in users array
124 | var urlParts = request.url.split('/');
125 | var id = parseInt(urlParts[urlParts.length - 1]);
126 | for (var i = 0; i < users.length; i++) {
127 | var user = users[i];
128 | if (user.id === id) {
129 | // delete user
130 | users.splice(i, 1);
131 | localStorage.setItem('users', JSON.stringify(users));
132 | break;
133 | }
134 | }
135 | // respond 200 OK
136 | return Observable_1.Observable.of(new http_1.HttpResponse({ status: 200 }));
137 | }
138 | else {
139 | // return 401 not authorised if token is null or invalid
140 | return Observable_1.Observable.throw('Unauthorised');
141 | }
142 | }
143 | // pass through any requests not handled above
144 | return next.handle(request);
145 | })
146 | .materialize()
147 | .delay(500)
148 | .dematerialize();
149 | };
150 | FakeBackendInterceptor = __decorate([
151 | core_1.Injectable(),
152 | __metadata("design:paramtypes", [])
153 | ], FakeBackendInterceptor);
154 | return FakeBackendInterceptor;
155 | }());
156 | exports.FakeBackendInterceptor = FakeBackendInterceptor;
157 | exports.fakeBackendProvider = {
158 | // use fake backend in place of Http service for backend-less development
159 | provide: http_1.HTTP_INTERCEPTORS,
160 | useClass: FakeBackendInterceptor,
161 | multi: true
162 | };
163 | //# sourceMappingURL=fake-backend.js.map
--------------------------------------------------------------------------------
/app/_helpers/fake-backend.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"fake-backend.js","sourceRoot":"","sources":["fake-backend.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA2C;AAC3C,6CAA6H;AAC7H,8CAA6C;AAC7C,kCAAgC;AAChC,qCAAmC;AACnC,mCAAiC;AACjC,sCAAoC;AACpC,yCAAuC;AACvC,2CAAyC;AAGzC;IAEI;IAAgB,CAAC;IAEjB,0CAAS,GAAT,UAAU,OAAyB,EAAE,IAAiB;QAClD,8CAA8C;QAC9C,IAAI,KAAK,GAAU,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAEnE,yDAAyD;QACzD,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;YAEhC,eAAe;YACf,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;gBACzE,6CAA6C;gBAC7C,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI;oBACjC,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;gBAC9F,CAAC,CAAC,CAAC;gBAEH,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;oBACvB,gFAAgF;oBAChF,IAAI,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;oBAC5B,IAAI,IAAI,GAAG;wBACP,EAAE,EAAE,IAAI,CAAC,EAAE;wBACX,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;wBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,KAAK,EAAE,gBAAgB;qBAC1B,CAAC;oBAEF,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,mBAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,8BAA8B;oBAC9B,MAAM,CAAC,uBAAU,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACjE,CAAC;YACL,CAAC;YAED,YAAY;YACZ,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;gBACjE,gIAAgI;gBAChI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,uBAAuB,CAAC,CAAC,CAAC;oBACnE,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,mBAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;gBACzE,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,wDAAwD;oBACxD,MAAM,CAAC,uBAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YAED,iBAAiB;YACjB,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;gBACtE,+HAA+H;gBAC/H,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,uBAAuB,CAAC,CAAC,CAAC;oBACnE,iCAAiC;oBACjC,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtC,IAAI,IAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjD,IAAI,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI,IAAM,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,IAAE,CAAC,CAAC,CAAC,CAAC,CAAC;oBACpE,IAAI,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAExD,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,mBAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACxE,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,wDAAwD;oBACxD,MAAM,CAAC,uBAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YAED,cAAc;YACd,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC;gBAClE,qCAAqC;gBACrC,IAAI,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;gBAE3B,aAAa;gBACb,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI,IAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChG,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;oBAChB,MAAM,CAAC,uBAAU,CAAC,KAAK,CAAC,YAAY,GAAG,SAAO,CAAC,QAAQ,GAAG,oBAAoB,CAAC,CAAC;gBACpF,CAAC;gBAED,gBAAgB;gBAChB,SAAO,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,SAAO,CAAC,CAAC;gBACpB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBAErD,iBAAiB;gBACjB,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,mBAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,cAAc;YACd,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC;gBACtE,qCAAqC;gBACrC,IAAI,YAAU,GAAG,OAAO,CAAC,IAAI,CAAC;gBAE9B,aAAa;gBACb,IAAI,aAAa,GAAG,KAAK,CAAC,MAAM,CAAC,UAAA,IAAI,IAAM,MAAM,CAAC,IAAI,CAAC,QAAQ,KAAK,YAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;gBACnG,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;oBAChB,MAAM,CAAC,uBAAU,CAAC,KAAK,CAAC,YAAY,GAAG,YAAU,CAAC,QAAQ,GAAG,oBAAoB,CAAC,CAAC;gBACvF,CAAC;gBAED,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACtC,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;gBACjD,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACpC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACpB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;wBACjB,cAAc;wBACd,KAAK,CAAC,CAAC,CAAC,GAAG,YAAU,CAAC;wBACtB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;wBACrD,KAAK,CAAC;oBACV,CAAC;gBACL,CAAC;gBAED,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBAErD,iBAAiB;gBACjB,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,mBAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAC5D,CAAC;YAED,cAAc;YACd,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACzE,+HAA+H;gBAC/H,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,uBAAuB,CAAC,CAAC,CAAC;oBACnE,iCAAiC;oBACjC,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACtC,IAAI,EAAE,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;oBACjD,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBACpC,IAAI,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;wBACpB,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;4BACjB,cAAc;4BACd,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;4BACnB,YAAY,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;4BACrD,KAAK,CAAC;wBACV,CAAC;oBACL,CAAC;oBAED,iBAAiB;oBACjB,MAAM,CAAC,uBAAU,CAAC,EAAE,CAAC,IAAI,mBAAY,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,wDAAwD;oBACxD,MAAM,CAAC,uBAAU,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;gBAC5C,CAAC;YACL,CAAC;YAED,8CAA8C;YAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEhC,CAAC,CAAC;aAGD,WAAW,EAAE;aACb,KAAK,CAAC,GAAG,CAAC;aACV,aAAa,EAAE,CAAC;IACrB,CAAC;IAnJQ,sBAAsB;QADlC,iBAAU,EAAE;;OACA,sBAAsB,CAoJlC;IAAD,6BAAC;CAAA,AApJD,IAoJC;AApJY,wDAAsB;AAsJxB,QAAA,mBAAmB,GAAG;IAC7B,yEAAyE;IACzE,OAAO,EAAE,wBAAiB;IAC1B,QAAQ,EAAE,sBAAsB;IAChC,KAAK,EAAE,IAAI;CACd,CAAC"}
--------------------------------------------------------------------------------
/app/_helpers/fake-backend.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpRequest, HttpResponse, HttpHandler, HttpEvent, HttpInterceptor, HTTP_INTERCEPTORS } from '@angular/common/http';
3 | import { Observable } from 'rxjs/Observable';
4 | import 'rxjs/add/observable/of';
5 | import 'rxjs/add/observable/throw';
6 | import 'rxjs/add/operator/delay';
7 | import 'rxjs/add/operator/mergeMap';
8 | import 'rxjs/add/operator/materialize';
9 | import 'rxjs/add/operator/dematerialize';
10 |
11 | @Injectable()
12 | export class FakeBackendInterceptor implements HttpInterceptor {
13 |
14 | constructor() { }
15 |
16 | intercept(request: HttpRequest, next: HttpHandler): Observable> {
17 | // array in local storage for registered users
18 | let users: any[] = JSON.parse(localStorage.getItem('users')) || [];
19 |
20 | // wrap in delayed observable to simulate server api call
21 | return Observable.of(null).mergeMap(() => {
22 |
23 | // authenticate
24 | if (request.url.endsWith('/api/authenticate') && request.method === 'POST') {
25 | // find if any user matches login credentials
26 | let filteredUsers = users.filter(user => {
27 | return user.username === request.body.username && user.password === request.body.password;
28 | });
29 |
30 | if (filteredUsers.length) {
31 | // if login details are valid return 200 OK with user details and fake jwt token
32 | let user = filteredUsers[0];
33 | let body = {
34 | id: user.id,
35 | username: user.username,
36 | firstName: user.firstName,
37 | lastName: user.lastName,
38 | token: 'fake-jwt-token'
39 | };
40 |
41 | return Observable.of(new HttpResponse({ status: 200, body: body }));
42 | } else {
43 | // else return 400 bad request
44 | return Observable.throw('Username or password is incorrect');
45 | }
46 | }
47 |
48 | // get users
49 | if (request.url.endsWith('/api/users') && request.method === 'GET') {
50 | // check for fake auth token in header and return users if valid, this security is implemented server side in a real application
51 | if (request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
52 | return Observable.of(new HttpResponse({ status: 200, body: users }));
53 | } else {
54 | // return 401 not authorised if token is null or invalid
55 | return Observable.throw('Unauthorised');
56 | }
57 | }
58 |
59 | // get user by id
60 | if (request.url.match(/\/api\/users\/\d+$/) && request.method === 'GET') {
61 | // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
62 | if (request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
63 | // find user by id in users array
64 | let urlParts = request.url.split('/');
65 | let id = parseInt(urlParts[urlParts.length - 1]);
66 | let matchedUsers = users.filter(user => { return user.id === id; });
67 | let user = matchedUsers.length ? matchedUsers[0] : null;
68 |
69 | return Observable.of(new HttpResponse({ status: 200, body: user }));
70 | } else {
71 | // return 401 not authorised if token is null or invalid
72 | return Observable.throw('Unauthorised');
73 | }
74 | }
75 |
76 | // create user
77 | if (request.url.endsWith('/api/users') && request.method === 'POST') {
78 | // get new user object from post body
79 | let newUser = request.body;
80 |
81 | // validation
82 | let duplicateUser = users.filter(user => { return user.username === newUser.username; }).length;
83 | if (duplicateUser) {
84 | return Observable.throw('Username "' + newUser.username + '" is already taken');
85 | }
86 |
87 | // save new user
88 | newUser.id = users.length + 1;
89 | users.push(newUser);
90 | localStorage.setItem('users', JSON.stringify(users));
91 |
92 | // respond 200 OK
93 | return Observable.of(new HttpResponse({ status: 200 }));
94 | }
95 |
96 | // update user
97 | if (request.url.match(/\/api\/users\/\d+$/) && request.method === 'PUT') {
98 | // get new user object from post body
99 | let updateUser = request.body;
100 |
101 | // validation
102 | let duplicateUser = users.filter(user => { return user.username === updateUser.username; }).length;
103 | if (duplicateUser) {
104 | return Observable.throw('Username "' + updateUser.username + '" is already taken');
105 | }
106 |
107 | let urlParts = request.url.split('/');
108 | let id = parseInt(urlParts[urlParts.length - 1]);
109 | for (let i = 0; i < users.length; i++) {
110 | let user = users[i];
111 | if (user.id === id) {
112 | // delete user
113 | users[i] = updateUser;
114 | localStorage.setItem('users', JSON.stringify(users));
115 | break;
116 | }
117 | }
118 |
119 | localStorage.setItem('users', JSON.stringify(users));
120 |
121 | // respond 200 OK
122 | return Observable.of(new HttpResponse({ status: 200 }));
123 | }
124 |
125 | // delete user
126 | if (request.url.match(/\/api\/users\/\d+$/) && request.method === 'DELETE') {
127 | // check for fake auth token in header and return user if valid, this security is implemented server side in a real application
128 | if (request.headers.get('Authorization') === 'Bearer fake-jwt-token') {
129 | // find user by id in users array
130 | let urlParts = request.url.split('/');
131 | let id = parseInt(urlParts[urlParts.length - 1]);
132 | for (let i = 0; i < users.length; i++) {
133 | let user = users[i];
134 | if (user.id === id) {
135 | // delete user
136 | users.splice(i, 1);
137 | localStorage.setItem('users', JSON.stringify(users));
138 | break;
139 | }
140 | }
141 |
142 | // respond 200 OK
143 | return Observable.of(new HttpResponse({ status: 200 }));
144 | } else {
145 | // return 401 not authorised if token is null or invalid
146 | return Observable.throw('Unauthorised');
147 | }
148 | }
149 |
150 | // pass through any requests not handled above
151 | return next.handle(request);
152 |
153 | })
154 |
155 | // call materialize and dematerialize to ensure delay even if an error is thrown (https://github.com/Reactive-Extensions/RxJS/issues/648)
156 | .materialize()
157 | .delay(500)
158 | .dematerialize();
159 | }
160 | }
161 |
162 | export let fakeBackendProvider = {
163 | // use fake backend in place of Http service for backend-less development
164 | provide: HTTP_INTERCEPTORS,
165 | useClass: FakeBackendInterceptor,
166 | multi: true
167 | };
--------------------------------------------------------------------------------
/app/_helpers/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./jwt.interceptor"));
7 | __export(require("./fake-backend"));
8 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/_helpers/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,uCAAkC;AAClC,oCAA+B"}
--------------------------------------------------------------------------------
/app/_helpers/index.ts:
--------------------------------------------------------------------------------
1 | export * from './jwt.interceptor';
2 | export * from './fake-backend';
--------------------------------------------------------------------------------
/app/_helpers/jwt.interceptor.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | Object.defineProperty(exports, "__esModule", { value: true });
9 | var core_1 = require("@angular/core");
10 | var JwtInterceptor = /** @class */ (function () {
11 | function JwtInterceptor() {
12 | }
13 | JwtInterceptor.prototype.intercept = function (request, next) {
14 | // add authorization header with jwt token if available
15 | var currentUser = JSON.parse(localStorage.getItem('currentUser'));
16 | if (currentUser && currentUser.token) {
17 | request = request.clone({
18 | setHeaders: {
19 | Authorization: "Bearer " + currentUser.token
20 | }
21 | });
22 | }
23 | return next.handle(request);
24 | };
25 | JwtInterceptor = __decorate([
26 | core_1.Injectable()
27 | ], JwtInterceptor);
28 | return JwtInterceptor;
29 | }());
30 | exports.JwtInterceptor = JwtInterceptor;
31 | //# sourceMappingURL=jwt.interceptor.js.map
--------------------------------------------------------------------------------
/app/_helpers/jwt.interceptor.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"jwt.interceptor.js","sourceRoot":"","sources":["jwt.interceptor.ts"],"names":[],"mappings":";;;;;;;;AAAA,sCAA2C;AAK3C;IAAA;IAcA,CAAC;IAbG,kCAAS,GAAT,UAAU,OAAyB,EAAE,IAAiB;QAClD,uDAAuD;QACvD,IAAI,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,EAAE,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;YACnC,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;gBACpB,UAAU,EAAE;oBACR,aAAa,EAAE,YAAU,WAAW,CAAC,KAAO;iBAC/C;aACJ,CAAC,CAAC;QACP,CAAC;QAED,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAbQ,cAAc;QAD1B,iBAAU,EAAE;OACA,cAAc,CAc1B;IAAD,qBAAC;CAAA,AAdD,IAcC;AAdY,wCAAc"}
--------------------------------------------------------------------------------
/app/_helpers/jwt.interceptor.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor } from '@angular/common/http';
3 | import { Observable } from 'rxjs/Observable';
4 |
5 | @Injectable()
6 | export class JwtInterceptor implements HttpInterceptor {
7 | intercept(request: HttpRequest, next: HttpHandler): Observable> {
8 | // add authorization header with jwt token if available
9 | let currentUser = JSON.parse(localStorage.getItem('currentUser'));
10 | if (currentUser && currentUser.token) {
11 | request = request.clone({
12 | setHeaders: {
13 | Authorization: `Bearer ${currentUser.token}`
14 | }
15 | });
16 | }
17 |
18 | return next.handle(request);
19 | }
20 | }
--------------------------------------------------------------------------------
/app/_models/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./user"));
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/_models/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,4BAAuB"}
--------------------------------------------------------------------------------
/app/_models/index.ts:
--------------------------------------------------------------------------------
1 | export * from './user';
--------------------------------------------------------------------------------
/app/_models/user.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | var User = /** @class */ (function () {
4 | function User() {
5 | }
6 | return User;
7 | }());
8 | exports.User = User;
9 | //# sourceMappingURL=user.js.map
--------------------------------------------------------------------------------
/app/_models/user.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"user.js","sourceRoot":"","sources":["user.ts"],"names":[],"mappings":";;AAAA;IAAA;IAMA,CAAC;IAAD,WAAC;AAAD,CAAC,AAND,IAMC;AANY,oBAAI"}
--------------------------------------------------------------------------------
/app/_models/user.ts:
--------------------------------------------------------------------------------
1 | export class User {
2 | id: number;
3 | username: string;
4 | password: string;
5 | firstName: string;
6 | lastName: string;
7 | }
--------------------------------------------------------------------------------
/app/_services/alert.service.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var router_1 = require("@angular/router");
14 | var Subject_1 = require("rxjs/Subject");
15 | var AlertService = /** @class */ (function () {
16 | function AlertService(router) {
17 | var _this = this;
18 | this.router = router;
19 | this.subject = new Subject_1.Subject();
20 | this.keepAfterNavigationChange = false;
21 | // clear alert message on route change
22 | router.events.subscribe(function (event) {
23 | if (event instanceof router_1.NavigationStart) {
24 | if (_this.keepAfterNavigationChange) {
25 | // only keep for a single location change
26 | _this.keepAfterNavigationChange = false;
27 | }
28 | else {
29 | // clear alert
30 | _this.subject.next();
31 | }
32 | }
33 | });
34 | }
35 | AlertService.prototype.success = function (message, keepAfterNavigationChange) {
36 | if (keepAfterNavigationChange === void 0) { keepAfterNavigationChange = false; }
37 | this.keepAfterNavigationChange = keepAfterNavigationChange;
38 | this.subject.next({ type: 'success', text: message });
39 | };
40 | AlertService.prototype.error = function (message, keepAfterNavigationChange) {
41 | if (keepAfterNavigationChange === void 0) { keepAfterNavigationChange = false; }
42 | this.keepAfterNavigationChange = keepAfterNavigationChange;
43 | this.subject.next({ type: 'error', text: message });
44 | };
45 | AlertService.prototype.getMessage = function () {
46 | return this.subject.asObservable();
47 | };
48 | AlertService = __decorate([
49 | core_1.Injectable(),
50 | __metadata("design:paramtypes", [router_1.Router])
51 | ], AlertService);
52 | return AlertService;
53 | }());
54 | exports.AlertService = AlertService;
55 | //# sourceMappingURL=alert.service.js.map
--------------------------------------------------------------------------------
/app/_services/alert.service.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"alert.service.js","sourceRoot":"","sources":["alert.service.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA2C;AAC3C,0CAA0D;AAE1D,wCAAuC;AAGvC;IAII,sBAAoB,MAAc;QAAlC,iBAaC;QAbmB,WAAM,GAAN,MAAM,CAAQ;QAH1B,YAAO,GAAG,IAAI,iBAAO,EAAO,CAAC;QAC7B,8BAAyB,GAAG,KAAK,CAAC;QAGtC,sCAAsC;QACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,UAAA,KAAK;YACzB,EAAE,CAAC,CAAC,KAAK,YAAY,wBAAe,CAAC,CAAC,CAAC;gBACnC,EAAE,CAAC,CAAC,KAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC;oBACjC,yCAAyC;oBACzC,KAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC;gBAC3C,CAAC;gBAAC,IAAI,CAAC,CAAC;oBACJ,cAAc;oBACd,KAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;gBACxB,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAED,8BAAO,GAAP,UAAQ,OAAe,EAAE,yBAAiC;QAAjC,0CAAA,EAAA,iCAAiC;QACtD,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,4BAAK,GAAL,UAAM,OAAe,EAAE,yBAAiC;QAAjC,0CAAA,EAAA,iCAAiC;QACpD,IAAI,CAAC,yBAAyB,GAAG,yBAAyB,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,iCAAU,GAAV;QACI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;IA/BQ,YAAY;QADxB,iBAAU,EAAE;yCAKmB,eAAM;OAJzB,YAAY,CAgCxB;IAAD,mBAAC;CAAA,AAhCD,IAgCC;AAhCY,oCAAY"}
--------------------------------------------------------------------------------
/app/_services/alert.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { Router, NavigationStart } from '@angular/router';
3 | import { Observable } from 'rxjs';
4 | import { Subject } from 'rxjs/Subject';
5 |
6 | @Injectable()
7 | export class AlertService {
8 | private subject = new Subject();
9 | private keepAfterNavigationChange = false;
10 |
11 | constructor(private router: Router) {
12 | // clear alert message on route change
13 | router.events.subscribe(event => {
14 | if (event instanceof NavigationStart) {
15 | if (this.keepAfterNavigationChange) {
16 | // only keep for a single location change
17 | this.keepAfterNavigationChange = false;
18 | } else {
19 | // clear alert
20 | this.subject.next();
21 | }
22 | }
23 | });
24 | }
25 |
26 | success(message: string, keepAfterNavigationChange = false) {
27 | this.keepAfterNavigationChange = keepAfterNavigationChange;
28 | this.subject.next({ type: 'success', text: message });
29 | }
30 |
31 | error(message: string, keepAfterNavigationChange = false) {
32 | this.keepAfterNavigationChange = keepAfterNavigationChange;
33 | this.subject.next({ type: 'error', text: message });
34 | }
35 |
36 | getMessage(): Observable {
37 | return this.subject.asObservable();
38 | }
39 | }
--------------------------------------------------------------------------------
/app/_services/authentication.service.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var http_1 = require("@angular/common/http");
14 | require("rxjs/add/operator/map");
15 | var AuthenticationService = /** @class */ (function () {
16 | function AuthenticationService(http) {
17 | this.http = http;
18 | }
19 | AuthenticationService.prototype.login = function (username, password) {
20 | return this.http.post('/api/authenticate', { username: username, password: password })
21 | .map(function (user) {
22 | // login successful if there's a jwt token in the response
23 | if (user && user.token) {
24 | // store user details and jwt token in local storage to keep user logged in between page refreshes
25 | localStorage.setItem('currentUser', JSON.stringify(user));
26 | }
27 | return user;
28 | });
29 | };
30 | AuthenticationService.prototype.logout = function () {
31 | // remove user from local storage to log user out
32 | localStorage.removeItem('currentUser');
33 | };
34 | AuthenticationService = __decorate([
35 | core_1.Injectable(),
36 | __metadata("design:paramtypes", [http_1.HttpClient])
37 | ], AuthenticationService);
38 | return AuthenticationService;
39 | }());
40 | exports.AuthenticationService = AuthenticationService;
41 | //# sourceMappingURL=authentication.service.js.map
--------------------------------------------------------------------------------
/app/_services/authentication.service.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"authentication.service.js","sourceRoot":"","sources":["authentication.service.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA2C;AAC3C,6CAA+D;AAE/D,iCAA8B;AAG9B;IACI,+BAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAI,CAAC;IAEzC,qCAAK,GAAL,UAAM,QAAgB,EAAE,QAAgB;QACpC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAM,mBAAmB,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;aACtF,GAAG,CAAC,UAAA,IAAI;YACL,0DAA0D;YAC1D,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrB,kGAAkG;gBAClG,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,MAAM,CAAC,IAAI,CAAC;QAChB,CAAC,CAAC,CAAC;IACX,CAAC;IAED,sCAAM,GAAN;QACI,iDAAiD;QACjD,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAC3C,CAAC;IAnBQ,qBAAqB;QADjC,iBAAU,EAAE;yCAEiB,iBAAU;OAD3B,qBAAqB,CAoBjC;IAAD,4BAAC;CAAA,AApBD,IAoBC;AApBY,sDAAqB"}
--------------------------------------------------------------------------------
/app/_services/authentication.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient, HttpHeaders } from '@angular/common/http';
3 | import { Observable } from 'rxjs/Observable';
4 | import 'rxjs/add/operator/map'
5 |
6 | @Injectable()
7 | export class AuthenticationService {
8 | constructor(private http: HttpClient) { }
9 |
10 | login(username: string, password: string) {
11 | return this.http.post('/api/authenticate', { username: username, password: password })
12 | .map(user => {
13 | // login successful if there's a jwt token in the response
14 | if (user && user.token) {
15 | // store user details and jwt token in local storage to keep user logged in between page refreshes
16 | localStorage.setItem('currentUser', JSON.stringify(user));
17 | }
18 |
19 | return user;
20 | });
21 | }
22 |
23 | logout() {
24 | // remove user from local storage to log user out
25 | localStorage.removeItem('currentUser');
26 | }
27 | }
--------------------------------------------------------------------------------
/app/_services/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./alert.service"));
7 | __export(require("./authentication.service"));
8 | __export(require("./user.service"));
9 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/_services/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,qCAAgC;AAChC,8CAAyC;AACzC,oCAA+B"}
--------------------------------------------------------------------------------
/app/_services/index.ts:
--------------------------------------------------------------------------------
1 | export * from './alert.service';
2 | export * from './authentication.service';
3 | export * from './user.service';
--------------------------------------------------------------------------------
/app/_services/user.service.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var http_1 = require("@angular/common/http");
14 | var UserService = /** @class */ (function () {
15 | function UserService(http) {
16 | this.http = http;
17 | }
18 | UserService.prototype.getAll = function () {
19 | return this.http.get('/api/users');
20 | };
21 | UserService.prototype.getById = function (id) {
22 | return this.http.get('/api/users/' + id);
23 | };
24 | UserService.prototype.create = function (user) {
25 | return this.http.post('/api/users', user);
26 | };
27 | UserService.prototype.update = function (user) {
28 | return this.http.put('/api/users/' + user.id, user);
29 | };
30 | UserService.prototype.delete = function (id) {
31 | return this.http.delete('/api/users/' + id);
32 | };
33 | UserService = __decorate([
34 | core_1.Injectable(),
35 | __metadata("design:paramtypes", [http_1.HttpClient])
36 | ], UserService);
37 | return UserService;
38 | }());
39 | exports.UserService = UserService;
40 | //# sourceMappingURL=user.service.js.map
--------------------------------------------------------------------------------
/app/_services/user.service.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"user.service.js","sourceRoot":"","sources":["user.service.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA2C;AAC3C,6CAAkD;AAKlD;IACI,qBAAoB,IAAgB;QAAhB,SAAI,GAAJ,IAAI,CAAY;IAAI,CAAC;IAEzC,4BAAM,GAAN;QACI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAS,YAAY,CAAC,CAAC;IAC/C,CAAC;IAED,6BAAO,GAAP,UAAQ,EAAU;QACd,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAO,aAAa,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,4BAAM,GAAN,UAAO,IAAU;QACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,4BAAM,GAAN,UAAO,IAAU;QACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,4BAAM,GAAN,UAAO,EAAU;QACb,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,EAAE,CAAC,CAAC;IAChD,CAAC;IArBQ,WAAW;QADvB,iBAAU,EAAE;yCAEiB,iBAAU;OAD3B,WAAW,CAsBvB;IAAD,kBAAC;CAAA,AAtBD,IAsBC;AAtBY,kCAAW"}
--------------------------------------------------------------------------------
/app/_services/user.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@angular/core';
2 | import { HttpClient } from '@angular/common/http';
3 |
4 | import { User } from '../_models/index';
5 |
6 | @Injectable()
7 | export class UserService {
8 | constructor(private http: HttpClient) { }
9 |
10 | getAll() {
11 | return this.http.get('/api/users');
12 | }
13 |
14 | getById(id: number) {
15 | return this.http.get('/api/users/' + id);
16 | }
17 |
18 | create(user: User) {
19 | return this.http.post('/api/users', user);
20 | }
21 |
22 | update(user: User) {
23 | return this.http.put('/api/users/' + user.id, user);
24 | }
25 |
26 | delete(id: number) {
27 | return this.http.delete('/api/users/' + id);
28 | }
29 | }
--------------------------------------------------------------------------------
/app/app.component.html:
--------------------------------------------------------------------------------
1 |
2 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/app.component.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | Object.defineProperty(exports, "__esModule", { value: true });
9 | var core_1 = require("@angular/core");
10 | var AppComponent = /** @class */ (function () {
11 | function AppComponent() {
12 | }
13 | AppComponent = __decorate([
14 | core_1.Component({
15 | moduleId: module.id,
16 | selector: 'app',
17 | templateUrl: 'app.component.html'
18 | })
19 | ], AppComponent);
20 | return AppComponent;
21 | }());
22 | exports.AppComponent = AppComponent;
23 | //# sourceMappingURL=app.component.js.map
--------------------------------------------------------------------------------
/app/app.component.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"app.component.js","sourceRoot":"","sources":["app.component.ts"],"names":[],"mappings":";;;;;;;;AAAA,sCAA0C;AAQ1C;IAAA;IAA4B,CAAC;IAAhB,YAAY;QANxB,gBAAS,CAAC;YACP,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,oBAAoB;SACpC,CAAC;OAEW,YAAY,CAAI;IAAD,mBAAC;CAAA,AAA7B,IAA6B;AAAhB,oCAAY"}
--------------------------------------------------------------------------------
/app/app.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 |
3 | @Component({
4 | moduleId: module.id,
5 | selector: 'app',
6 | templateUrl: 'app.component.html'
7 | })
8 |
9 | export class AppComponent { }
--------------------------------------------------------------------------------
/app/app.module.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | Object.defineProperty(exports, "__esModule", { value: true });
9 | var core_1 = require("@angular/core");
10 | var platform_browser_1 = require("@angular/platform-browser");
11 | var forms_1 = require("@angular/forms");
12 | var http_1 = require("@angular/common/http");
13 | // used to create fake backend
14 | var index_1 = require("./_helpers/index");
15 | var app_component_1 = require("./app.component");
16 | var app_routing_1 = require("./app.routing");
17 | var index_2 = require("./_directives/index");
18 | var index_3 = require("./_guards/index");
19 | var index_4 = require("./_helpers/index");
20 | var index_5 = require("./_services/index");
21 | var index_6 = require("./home/index");
22 | var index_7 = require("./login/index");
23 | var index_8 = require("./register/index");
24 | var AppModule = /** @class */ (function () {
25 | function AppModule() {
26 | }
27 | AppModule = __decorate([
28 | core_1.NgModule({
29 | imports: [
30 | platform_browser_1.BrowserModule,
31 | forms_1.FormsModule,
32 | http_1.HttpClientModule,
33 | app_routing_1.routing
34 | ],
35 | declarations: [
36 | app_component_1.AppComponent,
37 | index_2.AlertComponent,
38 | index_6.HomeComponent,
39 | index_7.LoginComponent,
40 | index_8.RegisterComponent
41 | ],
42 | providers: [
43 | index_3.AuthGuard,
44 | index_5.AlertService,
45 | index_5.AuthenticationService,
46 | index_5.UserService,
47 | {
48 | provide: http_1.HTTP_INTERCEPTORS,
49 | useClass: index_4.JwtInterceptor,
50 | multi: true
51 | },
52 | // provider used to create fake backend
53 | index_1.fakeBackendProvider
54 | ],
55 | bootstrap: [app_component_1.AppComponent]
56 | })
57 | ], AppModule);
58 | return AppModule;
59 | }());
60 | exports.AppModule = AppModule;
61 | //# sourceMappingURL=app.module.js.map
--------------------------------------------------------------------------------
/app/app.module.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"app.module.js","sourceRoot":"","sources":["app.module.ts"],"names":[],"mappings":";;;;;;;;AAAA,sCAA8C;AAC9C,8DAA0D;AAC1D,wCAAgD;AAChD,6CAA2E;AAE3E,8BAA8B;AAC9B,0CAAuD;AAEvD,iDAAgD;AAChD,6CAA+C;AAE/C,6CAAqD;AACrD,yCAA4C;AAC5C,0CAAkD;AAClD,2CAAqF;AACrF,sCAA6C;AAC7C,uCAA+C;AAC/C,0CAAqD;AAiCrD;IAAA;IAAyB,CAAC;IAAb,SAAS;QA/BrB,eAAQ,CAAC;YACN,OAAO,EAAE;gBACL,gCAAa;gBACb,mBAAW;gBACX,uBAAgB;gBAChB,qBAAO;aACV;YACD,YAAY,EAAE;gBACV,4BAAY;gBACZ,sBAAc;gBACd,qBAAa;gBACb,sBAAc;gBACd,yBAAiB;aACpB;YACD,SAAS,EAAE;gBACP,iBAAS;gBACT,oBAAY;gBACZ,6BAAqB;gBACrB,mBAAW;gBACX;oBACI,OAAO,EAAE,wBAAiB;oBAC1B,QAAQ,EAAE,sBAAc;oBACxB,KAAK,EAAE,IAAI;iBACd;gBAED,uCAAuC;gBACvC,2BAAmB;aACtB;YACD,SAAS,EAAE,CAAC,4BAAY,CAAC;SAC5B,CAAC;OAEW,SAAS,CAAI;IAAD,gBAAC;CAAA,AAA1B,IAA0B;AAAb,8BAAS"}
--------------------------------------------------------------------------------
/app/app.module.ts:
--------------------------------------------------------------------------------
1 | import { NgModule } from '@angular/core';
2 | import { BrowserModule } from '@angular/platform-browser';
3 | import { FormsModule } from '@angular/forms';
4 | import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http';
5 |
6 | // used to create fake backend
7 | import { fakeBackendProvider } from './_helpers/index';
8 |
9 | import { AppComponent } from './app.component';
10 | import { routing } from './app.routing';
11 |
12 | import { AlertComponent } from './_directives/index';
13 | import { AuthGuard } from './_guards/index';
14 | import { JwtInterceptor } from './_helpers/index';
15 | import { AlertService, AuthenticationService, UserService } from './_services/index';
16 | import { HomeComponent } from './home/index';
17 | import { LoginComponent } from './login/index';
18 | import { RegisterComponent } from './register/index';
19 |
20 | @NgModule({
21 | imports: [
22 | BrowserModule,
23 | FormsModule,
24 | HttpClientModule,
25 | routing
26 | ],
27 | declarations: [
28 | AppComponent,
29 | AlertComponent,
30 | HomeComponent,
31 | LoginComponent,
32 | RegisterComponent
33 | ],
34 | providers: [
35 | AuthGuard,
36 | AlertService,
37 | AuthenticationService,
38 | UserService,
39 | {
40 | provide: HTTP_INTERCEPTORS,
41 | useClass: JwtInterceptor,
42 | multi: true
43 | },
44 |
45 | // provider used to create fake backend
46 | fakeBackendProvider
47 | ],
48 | bootstrap: [AppComponent]
49 | })
50 |
51 | export class AppModule { }
--------------------------------------------------------------------------------
/app/app.routing.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | var router_1 = require("@angular/router");
4 | var index_1 = require("./home/index");
5 | var index_2 = require("./login/index");
6 | var index_3 = require("./register/index");
7 | var index_4 = require("./_guards/index");
8 | var appRoutes = [
9 | { path: '', component: index_1.HomeComponent, canActivate: [index_4.AuthGuard] },
10 | { path: 'login', component: index_2.LoginComponent },
11 | { path: 'register', component: index_3.RegisterComponent },
12 | { path: 'update/:id', component: index_3.RegisterComponent },
13 | // otherwise redirect to home
14 | { path: '**', redirectTo: '' }
15 | ];
16 | exports.routing = router_1.RouterModule.forRoot(appRoutes);
17 | //# sourceMappingURL=app.routing.js.map
--------------------------------------------------------------------------------
/app/app.routing.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"app.routing.js","sourceRoot":"","sources":["app.routing.ts"],"names":[],"mappings":";;AAAA,0CAAuD;AAEvD,sCAA6C;AAC7C,uCAA+C;AAC/C,0CAAqD;AACrD,yCAA4C;AAE5C,IAAM,SAAS,GAAW;IACtB,EAAE,IAAI,EAAE,EAAE,EAAE,SAAS,EAAE,qBAAa,EAAE,WAAW,EAAE,CAAC,iBAAS,CAAC,EAAE;IAChE,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,sBAAc,EAAE;IAC5C,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,yBAAiB,EAAE;IAClD,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,yBAAiB,EAAE;IACpD,6BAA6B;IAC7B,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE;CACjC,CAAC;AAEW,QAAA,OAAO,GAAG,qBAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC"}
--------------------------------------------------------------------------------
/app/app.routing.ts:
--------------------------------------------------------------------------------
1 | import { Routes, RouterModule } from '@angular/router';
2 |
3 | import { HomeComponent } from './home/index';
4 | import { LoginComponent } from './login/index';
5 | import { RegisterComponent } from './register/index';
6 | import { AuthGuard } from './_guards/index';
7 |
8 | const appRoutes: Routes = [
9 | { path: '', component: HomeComponent, canActivate: [AuthGuard] },
10 | { path: 'login', component: LoginComponent },
11 | { path: 'register', component: RegisterComponent },
12 | { path: 'update/:id', component: RegisterComponent },
13 | // otherwise redirect to home
14 | { path: '**', redirectTo: '' }
15 | ];
16 |
17 | export const routing = RouterModule.forRoot(appRoutes);
--------------------------------------------------------------------------------
/app/home/home.component.html:
--------------------------------------------------------------------------------
1 |
2 |
Hi {{currentUser.firstName}}!
3 |
You're logged in with Angular 2!!
4 |
All registered users:
5 |
6 | -
7 | {{user.username}} ({{user.firstName}} {{user.lastName}})
8 | Update - Delete
9 |
10 |
11 |
Logout
12 |
--------------------------------------------------------------------------------
/app/home/home.component.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var index_1 = require("../_services/index");
14 | var HomeComponent = /** @class */ (function () {
15 | function HomeComponent(userService) {
16 | this.userService = userService;
17 | this.users = [];
18 | this.currentUser = JSON.parse(localStorage.getItem('currentUser'));
19 | }
20 | HomeComponent.prototype.ngOnInit = function () {
21 | this.loadAllUsers();
22 | };
23 | HomeComponent.prototype.deleteUser = function (id) {
24 | var _this = this;
25 | this.userService.delete(id).subscribe(function () { _this.loadAllUsers(); });
26 | };
27 | HomeComponent.prototype.loadAllUsers = function () {
28 | var _this = this;
29 | this.userService.getAll().subscribe(function (users) { _this.users = users; });
30 | };
31 | HomeComponent = __decorate([
32 | core_1.Component({
33 | moduleId: module.id,
34 | templateUrl: 'home.component.html'
35 | }),
36 | __metadata("design:paramtypes", [index_1.UserService])
37 | ], HomeComponent);
38 | return HomeComponent;
39 | }());
40 | exports.HomeComponent = HomeComponent;
41 | //# sourceMappingURL=home.component.js.map
--------------------------------------------------------------------------------
/app/home/home.component.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"home.component.js","sourceRoot":"","sources":["home.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAAkD;AAGlD,4CAAiD;AAOjD;IAII,uBAAoB,WAAwB;QAAxB,gBAAW,GAAX,WAAW,CAAa;QAF5C,UAAK,GAAW,EAAE,CAAC;QAGf,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,gCAAQ,GAAR;QACI,IAAI,CAAC,YAAY,EAAE,CAAC;IACxB,CAAC;IAED,kCAAU,GAAV,UAAW,EAAU;QAArB,iBAEC;QADG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,cAAQ,KAAI,CAAC,YAAY,EAAE,CAAA,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;IAEO,oCAAY,GAApB;QAAA,iBAEC;QADG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAA,KAAK,IAAM,KAAI,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAlBQ,aAAa;QALzB,gBAAS,CAAC;YACP,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,qBAAqB;SACrC,CAAC;yCAMmC,mBAAW;OAJnC,aAAa,CAmBzB;IAAD,oBAAC;CAAA,AAnBD,IAmBC;AAnBY,sCAAa"}
--------------------------------------------------------------------------------
/app/home/home.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 |
3 | import { User } from '../_models/index';
4 | import { UserService } from '../_services/index';
5 |
6 | @Component({
7 | moduleId: module.id,
8 | templateUrl: 'home.component.html'
9 | })
10 |
11 | export class HomeComponent implements OnInit {
12 | currentUser: User;
13 | users: User[] = [];
14 |
15 | constructor(private userService: UserService) {
16 | this.currentUser = JSON.parse(localStorage.getItem('currentUser'));
17 | }
18 |
19 | ngOnInit() {
20 | this.loadAllUsers();
21 | }
22 |
23 | deleteUser(id: number) {
24 | this.userService.delete(id).subscribe(() => { this.loadAllUsers() });
25 | }
26 |
27 | private loadAllUsers() {
28 | this.userService.getAll().subscribe(users => { this.users = users; });
29 | }
30 | }
--------------------------------------------------------------------------------
/app/home/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./home.component"));
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/home/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,sCAAiC"}
--------------------------------------------------------------------------------
/app/home/index.ts:
--------------------------------------------------------------------------------
1 | export * from './home.component';
--------------------------------------------------------------------------------
/app/login/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./login.component"));
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/login/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,uCAAkC"}
--------------------------------------------------------------------------------
/app/login/index.ts:
--------------------------------------------------------------------------------
1 | export * from './login.component';
--------------------------------------------------------------------------------
/app/login/login.component.html:
--------------------------------------------------------------------------------
1 |
21 |
--------------------------------------------------------------------------------
/app/login/login.component.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var router_1 = require("@angular/router");
14 | var index_1 = require("../_services/index");
15 | var LoginComponent = /** @class */ (function () {
16 | function LoginComponent(route, router, authenticationService, alertService) {
17 | this.route = route;
18 | this.router = router;
19 | this.authenticationService = authenticationService;
20 | this.alertService = alertService;
21 | this.model = {};
22 | this.loading = false;
23 | }
24 | LoginComponent.prototype.ngOnInit = function () {
25 | // reset login status
26 | this.authenticationService.logout();
27 | // get return url from route parameters or default to '/'
28 | this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
29 | };
30 | LoginComponent.prototype.login = function () {
31 | var _this = this;
32 | this.loading = true;
33 | this.authenticationService.login(this.model.username, this.model.password)
34 | .subscribe(function (data) {
35 | _this.router.navigate([_this.returnUrl]);
36 | }, function (error) {
37 | _this.alertService.error(error);
38 | _this.loading = false;
39 | });
40 | };
41 | LoginComponent = __decorate([
42 | core_1.Component({
43 | moduleId: module.id,
44 | templateUrl: 'login.component.html'
45 | }),
46 | __metadata("design:paramtypes", [router_1.ActivatedRoute,
47 | router_1.Router,
48 | index_1.AuthenticationService,
49 | index_1.AlertService])
50 | ], LoginComponent);
51 | return LoginComponent;
52 | }());
53 | exports.LoginComponent = LoginComponent;
54 | //# sourceMappingURL=login.component.js.map
--------------------------------------------------------------------------------
/app/login/login.component.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"login.component.js","sourceRoot":"","sources":["login.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAAkD;AAClD,0CAAyD;AAEzD,4CAAyE;AAOzE;IAKI,wBACY,KAAqB,EACrB,MAAc,EACd,qBAA4C,EAC5C,YAA0B;QAH1B,UAAK,GAAL,KAAK,CAAgB;QACrB,WAAM,GAAN,MAAM,CAAQ;QACd,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,iBAAY,GAAZ,YAAY,CAAc;QARtC,UAAK,GAAQ,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;IAO0B,CAAC;IAE3C,iCAAQ,GAAR;QACI,qBAAqB;QACrB,IAAI,CAAC,qBAAqB,CAAC,MAAM,EAAE,CAAC;QAEpC,yDAAyD;QACzD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;IACzE,CAAC;IAED,8BAAK,GAAL;QAAA,iBAWC;QAVG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;aACrE,SAAS,CACN,UAAA,IAAI;YACA,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAI,CAAC,SAAS,CAAC,CAAC,CAAC;QAC3C,CAAC,EACD,UAAA,KAAK;YACD,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;IACf,CAAC;IA9BQ,cAAc;QAL1B,gBAAS,CAAC;YACP,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,sBAAsB;SACtC,CAAC;yCAQqB,uBAAc;YACb,eAAM;YACS,6BAAqB;YAC9B,oBAAY;OAT7B,cAAc,CA+B1B;IAAD,qBAAC;CAAA,AA/BD,IA+BC;AA/BY,wCAAc"}
--------------------------------------------------------------------------------
/app/login/login.component.ts:
--------------------------------------------------------------------------------
1 | import { Component, OnInit } from '@angular/core';
2 | import { Router, ActivatedRoute } from '@angular/router';
3 |
4 | import { AlertService, AuthenticationService } from '../_services/index';
5 |
6 | @Component({
7 | moduleId: module.id,
8 | templateUrl: 'login.component.html'
9 | })
10 |
11 | export class LoginComponent implements OnInit {
12 | model: any = {};
13 | loading = false;
14 | returnUrl: string;
15 |
16 | constructor(
17 | private route: ActivatedRoute,
18 | private router: Router,
19 | private authenticationService: AuthenticationService,
20 | private alertService: AlertService) { }
21 |
22 | ngOnInit() {
23 | // reset login status
24 | this.authenticationService.logout();
25 |
26 | // get return url from route parameters or default to '/'
27 | this.returnUrl = this.route.snapshot.queryParams['returnUrl'] || '/';
28 | }
29 |
30 | login() {
31 | this.loading = true;
32 | this.authenticationService.login(this.model.username, this.model.password)
33 | .subscribe(
34 | data => {
35 | this.router.navigate([this.returnUrl]);
36 | },
37 | error => {
38 | this.alertService.error(error);
39 | this.loading = false;
40 | });
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/app/main.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 | var platform_browser_dynamic_1 = require("@angular/platform-browser-dynamic");
4 | var app_module_1 = require("./app.module");
5 | platform_browser_dynamic_1.platformBrowserDynamic().bootstrapModule(app_module_1.AppModule);
6 | //# sourceMappingURL=main.js.map
--------------------------------------------------------------------------------
/app/main.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":";;AAAA,8EAA2E;AAE3E,2CAAyC;AAEzC,iDAAsB,EAAE,CAAC,eAAe,CAAC,sBAAS,CAAC,CAAC"}
--------------------------------------------------------------------------------
/app/main.ts:
--------------------------------------------------------------------------------
1 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
2 |
3 | import { AppModule } from './app.module';
4 |
5 | platformBrowserDynamic().bootstrapModule(AppModule);
--------------------------------------------------------------------------------
/app/register/index.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | function __export(m) {
3 | for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4 | }
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | __export(require("./register.component"));
7 | //# sourceMappingURL=index.js.map
--------------------------------------------------------------------------------
/app/register/index.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";;;;;AAAA,0CAAqC"}
--------------------------------------------------------------------------------
/app/register/index.ts:
--------------------------------------------------------------------------------
1 | export * from './register.component';
--------------------------------------------------------------------------------
/app/register/register.component.html:
--------------------------------------------------------------------------------
1 |
2 |
{{updateUser ? 'Update' : 'Register'}}
3 |
30 |
31 |
--------------------------------------------------------------------------------
/app/register/register.component.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3 | var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4 | if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5 | else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6 | return c > 3 && r && Object.defineProperty(target, key, r), r;
7 | };
8 | var __metadata = (this && this.__metadata) || function (k, v) {
9 | if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10 | };
11 | Object.defineProperty(exports, "__esModule", { value: true });
12 | var core_1 = require("@angular/core");
13 | var router_1 = require("@angular/router");
14 | var index_1 = require("../_services/index");
15 | var RegisterComponent = /** @class */ (function () {
16 | function RegisterComponent(router, userService, alertService, activatedRoute) {
17 | this.router = router;
18 | this.userService = userService;
19 | this.alertService = alertService;
20 | this.activatedRoute = activatedRoute;
21 | this.model = {};
22 | this.loading = false;
23 | }
24 | RegisterComponent.prototype.ngOnInit = function () {
25 | var _this = this;
26 | this.activatedRoute.params.subscribe(function (params) {
27 | var userId = params['id'];
28 | _this.userService.getById(userId).subscribe(function (user) { _this.model = user; _this.updateUser = user; });
29 | });
30 | };
31 | RegisterComponent.prototype.register = function () {
32 | var _this = this;
33 | this.loading = true;
34 | this.userService.create(this.model)
35 | .subscribe(function (data) {
36 | _this.alertService.success('Registration successful', true);
37 | _this.router.navigate(['login']);
38 | }, function (error) {
39 | _this.alertService.error(error);
40 | _this.loading = false;
41 | });
42 | };
43 | RegisterComponent.prototype.update = function () {
44 | var _this = this;
45 | this.loading = true;
46 | this.userService.update(this.model)
47 | .subscribe(function (data) {
48 | _this.alertService.success('User update successful', true);
49 | _this.router.navigate(['login']);
50 | }, function (error) {
51 | _this.alertService.error(error);
52 | _this.loading = false;
53 | });
54 | };
55 | RegisterComponent = __decorate([
56 | core_1.Component({
57 | moduleId: module.id,
58 | templateUrl: 'register.component.html'
59 | }),
60 | __metadata("design:paramtypes", [router_1.Router,
61 | index_1.UserService,
62 | index_1.AlertService,
63 | router_1.ActivatedRoute])
64 | ], RegisterComponent);
65 | return RegisterComponent;
66 | }());
67 | exports.RegisterComponent = RegisterComponent;
68 | //# sourceMappingURL=register.component.js.map
--------------------------------------------------------------------------------
/app/register/register.component.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"register.component.js","sourceRoot":"","sources":["register.component.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,sCAA0C;AAC1C,0CAAiE;AAEjE,4CAA+D;AAQ/D;IAKI,2BACY,MAAc,EACd,WAAwB,EACxB,YAA0B,EAC1B,cAA8B;QAH9B,WAAM,GAAN,MAAM,CAAQ;QACd,gBAAW,GAAX,WAAW,CAAa;QACxB,iBAAY,GAAZ,YAAY,CAAc;QAC1B,mBAAc,GAAd,cAAc,CAAgB;QAP1C,UAAK,GAAQ,EAAE,CAAC;QAChB,YAAO,GAAG,KAAK,CAAC;IAM8B,CAAC;IAE/C,oCAAQ,GAAR;QAAA,iBAKC;QAJG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,UAAC,MAAc;YAChD,IAAI,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC1B,KAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,UAAA,IAAI,IAAM,KAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,KAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACvG,CAAC,CAAC,CAAC;IACP,CAAC;IAED,oCAAQ,GAAR;QAAA,iBAYC;QAXG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aAC9B,SAAS,CACN,UAAA,IAAI;YACA,KAAI,CAAC,YAAY,CAAC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;YAC3D,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC,EACD,UAAA,KAAK;YACD,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;IACf,CAAC;IAED,kCAAM,GAAN;QAAA,iBAYC;QAXG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;aAC9B,SAAS,CACN,UAAA,IAAI;YACA,KAAI,CAAC,YAAY,CAAC,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;YAC1D,KAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;QACpC,CAAC,EACD,UAAA,KAAK;YACD,KAAI,CAAC,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC/B,KAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACzB,CAAC,CAAC,CAAC;IACf,CAAC;IA5CQ,iBAAiB;QAL7B,gBAAS,CAAC;YACP,QAAQ,EAAE,MAAM,CAAC,EAAE;YACnB,WAAW,EAAE,yBAAyB;SACzC,CAAC;yCAQsB,eAAM;YACD,mBAAW;YACV,oBAAY;YACV,uBAAc;OATjC,iBAAiB,CA6C7B;IAAD,wBAAC;CAAA,AA7CD,IA6CC;AA7CY,8CAAiB"}
--------------------------------------------------------------------------------
/app/register/register.component.ts:
--------------------------------------------------------------------------------
1 | import { Component } from '@angular/core';
2 | import { Router, ActivatedRoute, Params } from '@angular/router';
3 |
4 | import { AlertService, UserService } from '../_services/index';
5 | import { User } from '../_models/index';
6 |
7 | @Component({
8 | moduleId: module.id,
9 | templateUrl: 'register.component.html'
10 | })
11 |
12 | export class RegisterComponent {
13 | updateUser: User;
14 | model: any = {};
15 | loading = false;
16 |
17 | constructor(
18 | private router: Router,
19 | private userService: UserService,
20 | private alertService: AlertService,
21 | private activatedRoute: ActivatedRoute) { }
22 |
23 | ngOnInit() {
24 | this.activatedRoute.params.subscribe((params: Params) => {
25 | let userId = params['id'];
26 | this.userService.getById(userId).subscribe(user => { this.model = user; this.updateUser = user; });
27 | });
28 | }
29 |
30 | register() {
31 | this.loading = true;
32 | this.userService.create(this.model)
33 | .subscribe(
34 | data => {
35 | this.alertService.success('Registration successful', true);
36 | this.router.navigate(['login']);
37 | },
38 | error => {
39 | this.alertService.error(error);
40 | this.loading = false;
41 | });
42 | }
43 |
44 | update() {
45 | this.loading = true;
46 | this.userService.update(this.model)
47 | .subscribe(
48 | data => {
49 | this.alertService.success('User update successful', true);
50 | this.router.navigate(['login']);
51 | },
52 | error => {
53 | this.alertService.error(error);
54 | this.loading = false;
55 | });
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Angular 2/5 User Registration and Login Example
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
23 |
24 |
25 | Loading...
26 |
27 |
28 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular2-registration-login-example",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@angular/common": {
8 | "version": "5.2.9",
9 | "resolved": "https://registry.npmjs.org/@angular/common/-/common-5.2.9.tgz",
10 | "integrity": "sha512-g2hPcI0fnT4TV+Fd+1IohjuqBxPvxwyH9IzTn8PkU9X2M+F6cHCUvHxL1sWI2sF8pYcaHzVjq9WClym10X36Lg==",
11 | "requires": {
12 | "tslib": "1.9.0"
13 | }
14 | },
15 | "@angular/compiler": {
16 | "version": "5.2.9",
17 | "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-5.2.9.tgz",
18 | "integrity": "sha512-mN+ofInk8y/tk2TCJZx8RrGdOKdrfunoCair7tfDy4XoQJE90waGfaYWo07hYU+UYwLhrg19m2Czy6rIDciUJA==",
19 | "requires": {
20 | "tslib": "1.9.0"
21 | }
22 | },
23 | "@angular/core": {
24 | "version": "5.2.9",
25 | "resolved": "https://registry.npmjs.org/@angular/core/-/core-5.2.9.tgz",
26 | "integrity": "sha512-cvHBJGtasrIoARvbLFyHaOsiWKVwMNrrSTZLwrlyHP8oYzkDrE0qKGer6QCqyKt+51hF53cgWEffGzM/u/0wYg==",
27 | "requires": {
28 | "tslib": "1.9.0"
29 | }
30 | },
31 | "@angular/forms": {
32 | "version": "5.2.9",
33 | "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-5.2.9.tgz",
34 | "integrity": "sha512-zyIOiZV/FAm1iVZWTk3Joz6Jt096hbhfDbBUrssmuiTKi9dU6rWG+Z4b88zStqulKe3HFVZkgdixWlminG8nKA==",
35 | "requires": {
36 | "tslib": "1.9.0"
37 | }
38 | },
39 | "@angular/platform-browser": {
40 | "version": "5.2.9",
41 | "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-5.2.9.tgz",
42 | "integrity": "sha512-P6iviRTuLsLRuqtZNOO0fd4cjTo8DWsDCecwntUlI08R3kH5qeqvqarTzlw/4oD+wBzZY6bfb89JyY+n5XbX3Q==",
43 | "requires": {
44 | "tslib": "1.9.0"
45 | }
46 | },
47 | "@angular/platform-browser-dynamic": {
48 | "version": "5.2.9",
49 | "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-5.2.9.tgz",
50 | "integrity": "sha512-8C3MtyguJKDTT8FcHIRDlBxswcIdpfugOf4S2t94pVedCr4h9w2da/lcfwJKUISw1aKjfA77Sl8TDUhoS8ymmQ==",
51 | "requires": {
52 | "tslib": "1.9.0"
53 | }
54 | },
55 | "@angular/router": {
56 | "version": "5.2.9",
57 | "resolved": "https://registry.npmjs.org/@angular/router/-/router-5.2.9.tgz",
58 | "integrity": "sha512-NtDbFK0EA1rfFc+5Dqd5mIv8E1Wcc5rDUnSty4cX2V+HxTEZvQ9DRdpO2Q0abWU5siXyqponuPHJzF08OVGyNA==",
59 | "requires": {
60 | "tslib": "1.9.0"
61 | }
62 | },
63 | "@types/node": {
64 | "version": "8.9.5",
65 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.9.5.tgz",
66 | "integrity": "sha512-jRHfWsvyMtXdbhnz5CVHxaBgnV6duZnPlQuRSo/dm/GnmikNcmZhxIES4E9OZjUmQ8C+HCl4KJux+cXN/ErGDQ==",
67 | "dev": true
68 | },
69 | "accepts": {
70 | "version": "1.3.5",
71 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
72 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
73 | "dev": true,
74 | "requires": {
75 | "mime-types": "2.1.18",
76 | "negotiator": "0.6.1"
77 | }
78 | },
79 | "after": {
80 | "version": "0.8.2",
81 | "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
82 | "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
83 | "dev": true
84 | },
85 | "ajv": {
86 | "version": "4.11.8",
87 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz",
88 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=",
89 | "dev": true,
90 | "requires": {
91 | "co": "4.6.0",
92 | "json-stable-stringify": "1.0.1"
93 | }
94 | },
95 | "ansi-regex": {
96 | "version": "0.2.1",
97 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz",
98 | "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=",
99 | "dev": true
100 | },
101 | "ansi-styles": {
102 | "version": "1.1.0",
103 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz",
104 | "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=",
105 | "dev": true
106 | },
107 | "anymatch": {
108 | "version": "1.3.2",
109 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz",
110 | "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==",
111 | "dev": true,
112 | "requires": {
113 | "micromatch": "2.3.11",
114 | "normalize-path": "2.1.1"
115 | }
116 | },
117 | "arr-diff": {
118 | "version": "2.0.0",
119 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
120 | "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
121 | "dev": true,
122 | "requires": {
123 | "arr-flatten": "1.1.0"
124 | }
125 | },
126 | "arr-flatten": {
127 | "version": "1.1.0",
128 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
129 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
130 | "dev": true
131 | },
132 | "array-unique": {
133 | "version": "0.2.1",
134 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
135 | "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
136 | "dev": true
137 | },
138 | "arraybuffer.slice": {
139 | "version": "0.0.7",
140 | "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
141 | "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
142 | "dev": true
143 | },
144 | "asn1": {
145 | "version": "0.2.3",
146 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
147 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
148 | "dev": true
149 | },
150 | "assert-plus": {
151 | "version": "0.2.0",
152 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz",
153 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=",
154 | "dev": true
155 | },
156 | "async": {
157 | "version": "1.5.2",
158 | "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
159 | "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
160 | "dev": true
161 | },
162 | "async-each": {
163 | "version": "1.0.1",
164 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz",
165 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=",
166 | "dev": true
167 | },
168 | "async-each-series": {
169 | "version": "0.1.1",
170 | "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz",
171 | "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=",
172 | "dev": true
173 | },
174 | "async-limiter": {
175 | "version": "1.0.0",
176 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
177 | "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
178 | "dev": true
179 | },
180 | "asynckit": {
181 | "version": "0.4.0",
182 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
183 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
184 | "dev": true
185 | },
186 | "aws-sign2": {
187 | "version": "0.6.0",
188 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
189 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
190 | "dev": true
191 | },
192 | "aws4": {
193 | "version": "1.6.0",
194 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
195 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
196 | "dev": true
197 | },
198 | "backo2": {
199 | "version": "1.0.2",
200 | "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
201 | "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
202 | "dev": true
203 | },
204 | "balanced-match": {
205 | "version": "1.0.0",
206 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
207 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
208 | "dev": true
209 | },
210 | "base64-arraybuffer": {
211 | "version": "0.1.5",
212 | "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
213 | "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
214 | "dev": true
215 | },
216 | "base64id": {
217 | "version": "1.0.0",
218 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz",
219 | "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=",
220 | "dev": true
221 | },
222 | "batch": {
223 | "version": "0.5.3",
224 | "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz",
225 | "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=",
226 | "dev": true
227 | },
228 | "bcrypt-pbkdf": {
229 | "version": "1.0.1",
230 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
231 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
232 | "dev": true,
233 | "optional": true,
234 | "requires": {
235 | "tweetnacl": "0.14.5"
236 | }
237 | },
238 | "better-assert": {
239 | "version": "1.0.2",
240 | "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
241 | "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
242 | "dev": true,
243 | "requires": {
244 | "callsite": "1.0.0"
245 | }
246 | },
247 | "binary-extensions": {
248 | "version": "1.11.0",
249 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
250 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=",
251 | "dev": true
252 | },
253 | "blob": {
254 | "version": "0.0.4",
255 | "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
256 | "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
257 | "dev": true
258 | },
259 | "boom": {
260 | "version": "2.10.1",
261 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
262 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
263 | "dev": true,
264 | "requires": {
265 | "hoek": "2.16.3"
266 | }
267 | },
268 | "brace-expansion": {
269 | "version": "1.1.11",
270 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
271 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
272 | "dev": true,
273 | "requires": {
274 | "balanced-match": "1.0.0",
275 | "concat-map": "0.0.1"
276 | }
277 | },
278 | "braces": {
279 | "version": "1.8.5",
280 | "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
281 | "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
282 | "dev": true,
283 | "requires": {
284 | "expand-range": "1.8.2",
285 | "preserve": "0.2.0",
286 | "repeat-element": "1.1.2"
287 | }
288 | },
289 | "browser-sync": {
290 | "version": "2.23.6",
291 | "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.23.6.tgz",
292 | "integrity": "sha512-loCO5NQKZXfBJrEvmLwF1TPSECCsPopNd29qduoysLmpw8op2lgolGMjz3oI/MjG4duzB9TfDs7k58djRSwPwg==",
293 | "dev": true,
294 | "requires": {
295 | "browser-sync-ui": "1.0.1",
296 | "bs-recipes": "1.3.4",
297 | "chokidar": "1.7.0",
298 | "connect": "3.5.0",
299 | "connect-history-api-fallback": "1.5.0",
300 | "dev-ip": "1.0.1",
301 | "easy-extender": "2.3.2",
302 | "eazy-logger": "3.0.2",
303 | "emitter-steward": "1.0.0",
304 | "etag": "1.8.1",
305 | "fresh": "0.5.2",
306 | "fs-extra": "3.0.1",
307 | "http-proxy": "1.15.2",
308 | "immutable": "3.8.2",
309 | "localtunnel": "1.8.3",
310 | "micromatch": "2.3.11",
311 | "opn": "4.0.2",
312 | "portscanner": "2.1.1",
313 | "qs": "6.2.1",
314 | "resp-modifier": "6.0.2",
315 | "rx": "4.1.0",
316 | "serve-index": "1.8.0",
317 | "serve-static": "1.12.2",
318 | "server-destroy": "1.0.1",
319 | "socket.io": "2.0.4",
320 | "ua-parser-js": "0.7.12",
321 | "yargs": "6.4.0"
322 | },
323 | "dependencies": {
324 | "rx": {
325 | "version": "4.1.0",
326 | "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
327 | "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=",
328 | "dev": true
329 | }
330 | }
331 | },
332 | "browser-sync-ui": {
333 | "version": "1.0.1",
334 | "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-1.0.1.tgz",
335 | "integrity": "sha512-RIxmwVVcUFhRd1zxp7m2FfLnXHf59x4Gtj8HFwTA//3VgYI3AKkaQAuDL8KDJnE59XqCshxZa13JYuIWtZlKQg==",
336 | "dev": true,
337 | "requires": {
338 | "async-each-series": "0.1.1",
339 | "connect-history-api-fallback": "1.5.0",
340 | "immutable": "3.8.2",
341 | "server-destroy": "1.0.1",
342 | "socket.io-client": "2.0.4",
343 | "stream-throttle": "0.1.3"
344 | }
345 | },
346 | "bs-recipes": {
347 | "version": "1.3.4",
348 | "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.3.4.tgz",
349 | "integrity": "sha1-DS1NSKcYyMBEdp/cT4lZLci2lYU=",
350 | "dev": true
351 | },
352 | "builtin-modules": {
353 | "version": "1.1.1",
354 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
355 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
356 | "dev": true
357 | },
358 | "callsite": {
359 | "version": "1.0.0",
360 | "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
361 | "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
362 | "dev": true
363 | },
364 | "camelcase": {
365 | "version": "1.2.1",
366 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
367 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
368 | "dev": true
369 | },
370 | "caseless": {
371 | "version": "0.12.0",
372 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
373 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
374 | "dev": true
375 | },
376 | "chalk": {
377 | "version": "0.5.1",
378 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz",
379 | "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=",
380 | "dev": true,
381 | "requires": {
382 | "ansi-styles": "1.1.0",
383 | "escape-string-regexp": "1.0.5",
384 | "has-ansi": "0.1.0",
385 | "strip-ansi": "0.3.0",
386 | "supports-color": "0.2.0"
387 | },
388 | "dependencies": {
389 | "supports-color": {
390 | "version": "0.2.0",
391 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz",
392 | "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=",
393 | "dev": true
394 | }
395 | }
396 | },
397 | "chokidar": {
398 | "version": "1.7.0",
399 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz",
400 | "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=",
401 | "dev": true,
402 | "requires": {
403 | "anymatch": "1.3.2",
404 | "async-each": "1.0.1",
405 | "fsevents": "1.1.3",
406 | "glob-parent": "2.0.0",
407 | "inherits": "2.0.3",
408 | "is-binary-path": "1.0.1",
409 | "is-glob": "2.0.1",
410 | "path-is-absolute": "1.0.1",
411 | "readdirp": "2.1.0"
412 | }
413 | },
414 | "cliui": {
415 | "version": "3.2.0",
416 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
417 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
418 | "dev": true,
419 | "requires": {
420 | "string-width": "1.0.2",
421 | "strip-ansi": "3.0.1",
422 | "wrap-ansi": "2.1.0"
423 | },
424 | "dependencies": {
425 | "ansi-regex": {
426 | "version": "2.1.1",
427 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
428 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
429 | "dev": true
430 | },
431 | "strip-ansi": {
432 | "version": "3.0.1",
433 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
434 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
435 | "dev": true,
436 | "requires": {
437 | "ansi-regex": "2.1.1"
438 | }
439 | }
440 | }
441 | },
442 | "co": {
443 | "version": "4.6.0",
444 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
445 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
446 | "dev": true
447 | },
448 | "code-point-at": {
449 | "version": "1.1.0",
450 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
451 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
452 | "dev": true
453 | },
454 | "combined-stream": {
455 | "version": "1.0.6",
456 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
457 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
458 | "dev": true,
459 | "requires": {
460 | "delayed-stream": "1.0.0"
461 | }
462 | },
463 | "commander": {
464 | "version": "2.6.0",
465 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz",
466 | "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=",
467 | "dev": true
468 | },
469 | "component-bind": {
470 | "version": "1.0.0",
471 | "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
472 | "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
473 | "dev": true
474 | },
475 | "component-emitter": {
476 | "version": "1.2.1",
477 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
478 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
479 | "dev": true
480 | },
481 | "component-inherit": {
482 | "version": "0.0.3",
483 | "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
484 | "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
485 | "dev": true
486 | },
487 | "concat-map": {
488 | "version": "0.0.1",
489 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
490 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
491 | "dev": true
492 | },
493 | "concurrently": {
494 | "version": "3.5.1",
495 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-3.5.1.tgz",
496 | "integrity": "sha512-689HrwGw8Rbk1xtV9C4dY6TPJAvIYZbRbnKSAtfJ7tHqICFGoZ0PCWYjxfmerRyxBG0o3sbG3pe7N8vqPwIHuQ==",
497 | "dev": true,
498 | "requires": {
499 | "chalk": "0.5.1",
500 | "commander": "2.6.0",
501 | "date-fns": "1.29.0",
502 | "lodash": "4.17.5",
503 | "rx": "2.3.24",
504 | "spawn-command": "0.0.2-1",
505 | "supports-color": "3.2.3",
506 | "tree-kill": "1.2.0"
507 | }
508 | },
509 | "connect": {
510 | "version": "3.5.0",
511 | "resolved": "https://registry.npmjs.org/connect/-/connect-3.5.0.tgz",
512 | "integrity": "sha1-s1dSWgtMH1BZnNmD4dnv7qlncZg=",
513 | "dev": true,
514 | "requires": {
515 | "debug": "2.2.0",
516 | "finalhandler": "0.5.0",
517 | "parseurl": "1.3.2",
518 | "utils-merge": "1.0.0"
519 | },
520 | "dependencies": {
521 | "debug": {
522 | "version": "2.2.0",
523 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
524 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
525 | "dev": true,
526 | "requires": {
527 | "ms": "0.7.1"
528 | }
529 | },
530 | "ms": {
531 | "version": "0.7.1",
532 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
533 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
534 | "dev": true
535 | }
536 | }
537 | },
538 | "connect-history-api-fallback": {
539 | "version": "1.5.0",
540 | "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz",
541 | "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=",
542 | "dev": true
543 | },
544 | "connect-logger": {
545 | "version": "0.0.1",
546 | "resolved": "https://registry.npmjs.org/connect-logger/-/connect-logger-0.0.1.tgz",
547 | "integrity": "sha1-TZmZeKHSC7RgjnzUNNdBZSJVF0s=",
548 | "dev": true,
549 | "requires": {
550 | "moment": "2.21.0"
551 | }
552 | },
553 | "cookie": {
554 | "version": "0.3.1",
555 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
556 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=",
557 | "dev": true
558 | },
559 | "core-js": {
560 | "version": "2.5.3",
561 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz",
562 | "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4="
563 | },
564 | "core-util-is": {
565 | "version": "1.0.2",
566 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
567 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
568 | "dev": true
569 | },
570 | "cryptiles": {
571 | "version": "2.0.5",
572 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
573 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
574 | "dev": true,
575 | "requires": {
576 | "boom": "2.10.1"
577 | }
578 | },
579 | "dashdash": {
580 | "version": "1.14.1",
581 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
582 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
583 | "dev": true,
584 | "requires": {
585 | "assert-plus": "1.0.0"
586 | },
587 | "dependencies": {
588 | "assert-plus": {
589 | "version": "1.0.0",
590 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
591 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
592 | "dev": true
593 | }
594 | }
595 | },
596 | "date-fns": {
597 | "version": "1.29.0",
598 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz",
599 | "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==",
600 | "dev": true
601 | },
602 | "debug": {
603 | "version": "2.6.9",
604 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
605 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
606 | "dev": true,
607 | "requires": {
608 | "ms": "2.0.0"
609 | }
610 | },
611 | "decamelize": {
612 | "version": "1.2.0",
613 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
614 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
615 | "dev": true
616 | },
617 | "delayed-stream": {
618 | "version": "1.0.0",
619 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
620 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
621 | "dev": true
622 | },
623 | "depd": {
624 | "version": "1.1.2",
625 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
626 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
627 | "dev": true
628 | },
629 | "destroy": {
630 | "version": "1.0.4",
631 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
632 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
633 | "dev": true
634 | },
635 | "dev-ip": {
636 | "version": "1.0.1",
637 | "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz",
638 | "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=",
639 | "dev": true
640 | },
641 | "easy-extender": {
642 | "version": "2.3.2",
643 | "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz",
644 | "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=",
645 | "dev": true,
646 | "requires": {
647 | "lodash": "3.10.1"
648 | },
649 | "dependencies": {
650 | "lodash": {
651 | "version": "3.10.1",
652 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
653 | "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=",
654 | "dev": true
655 | }
656 | }
657 | },
658 | "eazy-logger": {
659 | "version": "3.0.2",
660 | "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-3.0.2.tgz",
661 | "integrity": "sha1-oyWqXlPROiIliJsqxBE7K5Y29Pw=",
662 | "dev": true,
663 | "requires": {
664 | "tfunk": "3.1.0"
665 | }
666 | },
667 | "ecc-jsbn": {
668 | "version": "0.1.1",
669 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
670 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
671 | "dev": true,
672 | "optional": true,
673 | "requires": {
674 | "jsbn": "0.1.1"
675 | }
676 | },
677 | "ee-first": {
678 | "version": "1.1.1",
679 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
680 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
681 | "dev": true
682 | },
683 | "emitter-steward": {
684 | "version": "1.0.0",
685 | "resolved": "https://registry.npmjs.org/emitter-steward/-/emitter-steward-1.0.0.tgz",
686 | "integrity": "sha1-80Ea3pdYp1Zd+Eiy2gy70bRsvWQ=",
687 | "dev": true
688 | },
689 | "encodeurl": {
690 | "version": "1.0.2",
691 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
692 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
693 | "dev": true
694 | },
695 | "engine.io": {
696 | "version": "3.1.5",
697 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.1.5.tgz",
698 | "integrity": "sha512-D06ivJkYxyRrcEe0bTpNnBQNgP9d3xog+qZlLbui8EsMr/DouQpf5o9FzJnWYHEYE0YsFHllUv2R1dkgYZXHcA==",
699 | "dev": true,
700 | "requires": {
701 | "accepts": "1.3.5",
702 | "base64id": "1.0.0",
703 | "cookie": "0.3.1",
704 | "debug": "3.1.0",
705 | "engine.io-parser": "2.1.2",
706 | "uws": "9.14.0",
707 | "ws": "3.3.3"
708 | },
709 | "dependencies": {
710 | "debug": {
711 | "version": "3.1.0",
712 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
713 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
714 | "dev": true,
715 | "requires": {
716 | "ms": "2.0.0"
717 | }
718 | }
719 | }
720 | },
721 | "engine.io-client": {
722 | "version": "3.1.6",
723 | "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.1.6.tgz",
724 | "integrity": "sha512-hnuHsFluXnsKOndS4Hv6SvUrgdYx1pk2NqfaDMW+GWdgfU3+/V25Cj7I8a0x92idSpa5PIhJRKxPvp9mnoLsfg==",
725 | "dev": true,
726 | "requires": {
727 | "component-emitter": "1.2.1",
728 | "component-inherit": "0.0.3",
729 | "debug": "3.1.0",
730 | "engine.io-parser": "2.1.2",
731 | "has-cors": "1.1.0",
732 | "indexof": "0.0.1",
733 | "parseqs": "0.0.5",
734 | "parseuri": "0.0.5",
735 | "ws": "3.3.3",
736 | "xmlhttprequest-ssl": "1.5.5",
737 | "yeast": "0.1.2"
738 | },
739 | "dependencies": {
740 | "debug": {
741 | "version": "3.1.0",
742 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
743 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
744 | "dev": true,
745 | "requires": {
746 | "ms": "2.0.0"
747 | }
748 | }
749 | }
750 | },
751 | "engine.io-parser": {
752 | "version": "2.1.2",
753 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
754 | "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
755 | "dev": true,
756 | "requires": {
757 | "after": "0.8.2",
758 | "arraybuffer.slice": "0.0.7",
759 | "base64-arraybuffer": "0.1.5",
760 | "blob": "0.0.4",
761 | "has-binary2": "1.0.2"
762 | }
763 | },
764 | "error-ex": {
765 | "version": "1.3.1",
766 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
767 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
768 | "dev": true,
769 | "requires": {
770 | "is-arrayish": "0.2.1"
771 | }
772 | },
773 | "escape-html": {
774 | "version": "1.0.3",
775 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
776 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
777 | "dev": true
778 | },
779 | "escape-string-regexp": {
780 | "version": "1.0.5",
781 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
782 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
783 | "dev": true
784 | },
785 | "etag": {
786 | "version": "1.8.1",
787 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
788 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
789 | "dev": true
790 | },
791 | "eventemitter3": {
792 | "version": "1.2.0",
793 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz",
794 | "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=",
795 | "dev": true
796 | },
797 | "expand-brackets": {
798 | "version": "0.1.5",
799 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
800 | "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
801 | "dev": true,
802 | "requires": {
803 | "is-posix-bracket": "0.1.1"
804 | }
805 | },
806 | "expand-range": {
807 | "version": "1.8.2",
808 | "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
809 | "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
810 | "dev": true,
811 | "requires": {
812 | "fill-range": "2.2.3"
813 | }
814 | },
815 | "extend": {
816 | "version": "3.0.1",
817 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
818 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
819 | "dev": true
820 | },
821 | "extglob": {
822 | "version": "0.3.2",
823 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
824 | "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
825 | "dev": true,
826 | "requires": {
827 | "is-extglob": "1.0.0"
828 | }
829 | },
830 | "extsprintf": {
831 | "version": "1.3.0",
832 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
833 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
834 | "dev": true
835 | },
836 | "filename-regex": {
837 | "version": "2.0.1",
838 | "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
839 | "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
840 | "dev": true
841 | },
842 | "fill-range": {
843 | "version": "2.2.3",
844 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz",
845 | "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=",
846 | "dev": true,
847 | "requires": {
848 | "is-number": "2.1.0",
849 | "isobject": "2.1.0",
850 | "randomatic": "1.1.7",
851 | "repeat-element": "1.1.2",
852 | "repeat-string": "1.6.1"
853 | }
854 | },
855 | "finalhandler": {
856 | "version": "0.5.0",
857 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz",
858 | "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=",
859 | "dev": true,
860 | "requires": {
861 | "debug": "2.2.0",
862 | "escape-html": "1.0.3",
863 | "on-finished": "2.3.0",
864 | "statuses": "1.3.1",
865 | "unpipe": "1.0.0"
866 | },
867 | "dependencies": {
868 | "debug": {
869 | "version": "2.2.0",
870 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
871 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
872 | "dev": true,
873 | "requires": {
874 | "ms": "0.7.1"
875 | }
876 | },
877 | "ms": {
878 | "version": "0.7.1",
879 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
880 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
881 | "dev": true
882 | }
883 | }
884 | },
885 | "find-up": {
886 | "version": "1.1.2",
887 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
888 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
889 | "dev": true,
890 | "requires": {
891 | "path-exists": "2.1.0",
892 | "pinkie-promise": "2.0.1"
893 | }
894 | },
895 | "for-in": {
896 | "version": "1.0.2",
897 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
898 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
899 | "dev": true
900 | },
901 | "for-own": {
902 | "version": "0.1.5",
903 | "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
904 | "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
905 | "dev": true,
906 | "requires": {
907 | "for-in": "1.0.2"
908 | }
909 | },
910 | "forever-agent": {
911 | "version": "0.6.1",
912 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
913 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
914 | "dev": true
915 | },
916 | "form-data": {
917 | "version": "2.1.4",
918 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz",
919 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=",
920 | "dev": true,
921 | "requires": {
922 | "asynckit": "0.4.0",
923 | "combined-stream": "1.0.6",
924 | "mime-types": "2.1.18"
925 | }
926 | },
927 | "fresh": {
928 | "version": "0.5.2",
929 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
930 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
931 | "dev": true
932 | },
933 | "fs-extra": {
934 | "version": "3.0.1",
935 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz",
936 | "integrity": "sha1-N5TzeMWLNC6n27sjCVEJxLO2IpE=",
937 | "dev": true,
938 | "requires": {
939 | "graceful-fs": "4.1.11",
940 | "jsonfile": "3.0.1",
941 | "universalify": "0.1.1"
942 | }
943 | },
944 | "fsevents": {
945 | "version": "1.1.3",
946 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz",
947 | "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==",
948 | "dev": true,
949 | "optional": true,
950 | "requires": {
951 | "nan": "2.10.0",
952 | "node-pre-gyp": "0.6.39"
953 | },
954 | "dependencies": {
955 | "abbrev": {
956 | "version": "1.1.0",
957 | "bundled": true,
958 | "dev": true,
959 | "optional": true
960 | },
961 | "ajv": {
962 | "version": "4.11.8",
963 | "bundled": true,
964 | "dev": true,
965 | "optional": true,
966 | "requires": {
967 | "co": "4.6.0",
968 | "json-stable-stringify": "1.0.1"
969 | }
970 | },
971 | "ansi-regex": {
972 | "version": "2.1.1",
973 | "bundled": true,
974 | "dev": true
975 | },
976 | "aproba": {
977 | "version": "1.1.1",
978 | "bundled": true,
979 | "dev": true,
980 | "optional": true
981 | },
982 | "are-we-there-yet": {
983 | "version": "1.1.4",
984 | "bundled": true,
985 | "dev": true,
986 | "optional": true,
987 | "requires": {
988 | "delegates": "1.0.0",
989 | "readable-stream": "2.2.9"
990 | }
991 | },
992 | "asn1": {
993 | "version": "0.2.3",
994 | "bundled": true,
995 | "dev": true,
996 | "optional": true
997 | },
998 | "assert-plus": {
999 | "version": "0.2.0",
1000 | "bundled": true,
1001 | "dev": true,
1002 | "optional": true
1003 | },
1004 | "asynckit": {
1005 | "version": "0.4.0",
1006 | "bundled": true,
1007 | "dev": true,
1008 | "optional": true
1009 | },
1010 | "aws-sign2": {
1011 | "version": "0.6.0",
1012 | "bundled": true,
1013 | "dev": true,
1014 | "optional": true
1015 | },
1016 | "aws4": {
1017 | "version": "1.6.0",
1018 | "bundled": true,
1019 | "dev": true,
1020 | "optional": true
1021 | },
1022 | "balanced-match": {
1023 | "version": "0.4.2",
1024 | "bundled": true,
1025 | "dev": true
1026 | },
1027 | "bcrypt-pbkdf": {
1028 | "version": "1.0.1",
1029 | "bundled": true,
1030 | "dev": true,
1031 | "optional": true,
1032 | "requires": {
1033 | "tweetnacl": "0.14.5"
1034 | }
1035 | },
1036 | "block-stream": {
1037 | "version": "0.0.9",
1038 | "bundled": true,
1039 | "dev": true,
1040 | "requires": {
1041 | "inherits": "2.0.3"
1042 | }
1043 | },
1044 | "boom": {
1045 | "version": "2.10.1",
1046 | "bundled": true,
1047 | "dev": true,
1048 | "requires": {
1049 | "hoek": "2.16.3"
1050 | }
1051 | },
1052 | "brace-expansion": {
1053 | "version": "1.1.7",
1054 | "bundled": true,
1055 | "dev": true,
1056 | "requires": {
1057 | "balanced-match": "0.4.2",
1058 | "concat-map": "0.0.1"
1059 | }
1060 | },
1061 | "buffer-shims": {
1062 | "version": "1.0.0",
1063 | "bundled": true,
1064 | "dev": true
1065 | },
1066 | "caseless": {
1067 | "version": "0.12.0",
1068 | "bundled": true,
1069 | "dev": true,
1070 | "optional": true
1071 | },
1072 | "co": {
1073 | "version": "4.6.0",
1074 | "bundled": true,
1075 | "dev": true,
1076 | "optional": true
1077 | },
1078 | "code-point-at": {
1079 | "version": "1.1.0",
1080 | "bundled": true,
1081 | "dev": true
1082 | },
1083 | "combined-stream": {
1084 | "version": "1.0.5",
1085 | "bundled": true,
1086 | "dev": true,
1087 | "requires": {
1088 | "delayed-stream": "1.0.0"
1089 | }
1090 | },
1091 | "concat-map": {
1092 | "version": "0.0.1",
1093 | "bundled": true,
1094 | "dev": true
1095 | },
1096 | "console-control-strings": {
1097 | "version": "1.1.0",
1098 | "bundled": true,
1099 | "dev": true
1100 | },
1101 | "core-util-is": {
1102 | "version": "1.0.2",
1103 | "bundled": true,
1104 | "dev": true
1105 | },
1106 | "cryptiles": {
1107 | "version": "2.0.5",
1108 | "bundled": true,
1109 | "dev": true,
1110 | "requires": {
1111 | "boom": "2.10.1"
1112 | }
1113 | },
1114 | "dashdash": {
1115 | "version": "1.14.1",
1116 | "bundled": true,
1117 | "dev": true,
1118 | "optional": true,
1119 | "requires": {
1120 | "assert-plus": "1.0.0"
1121 | },
1122 | "dependencies": {
1123 | "assert-plus": {
1124 | "version": "1.0.0",
1125 | "bundled": true,
1126 | "dev": true,
1127 | "optional": true
1128 | }
1129 | }
1130 | },
1131 | "debug": {
1132 | "version": "2.6.8",
1133 | "bundled": true,
1134 | "dev": true,
1135 | "optional": true,
1136 | "requires": {
1137 | "ms": "2.0.0"
1138 | }
1139 | },
1140 | "deep-extend": {
1141 | "version": "0.4.2",
1142 | "bundled": true,
1143 | "dev": true,
1144 | "optional": true
1145 | },
1146 | "delayed-stream": {
1147 | "version": "1.0.0",
1148 | "bundled": true,
1149 | "dev": true
1150 | },
1151 | "delegates": {
1152 | "version": "1.0.0",
1153 | "bundled": true,
1154 | "dev": true,
1155 | "optional": true
1156 | },
1157 | "detect-libc": {
1158 | "version": "1.0.2",
1159 | "bundled": true,
1160 | "dev": true,
1161 | "optional": true
1162 | },
1163 | "ecc-jsbn": {
1164 | "version": "0.1.1",
1165 | "bundled": true,
1166 | "dev": true,
1167 | "optional": true,
1168 | "requires": {
1169 | "jsbn": "0.1.1"
1170 | }
1171 | },
1172 | "extend": {
1173 | "version": "3.0.1",
1174 | "bundled": true,
1175 | "dev": true,
1176 | "optional": true
1177 | },
1178 | "extsprintf": {
1179 | "version": "1.0.2",
1180 | "bundled": true,
1181 | "dev": true
1182 | },
1183 | "forever-agent": {
1184 | "version": "0.6.1",
1185 | "bundled": true,
1186 | "dev": true,
1187 | "optional": true
1188 | },
1189 | "form-data": {
1190 | "version": "2.1.4",
1191 | "bundled": true,
1192 | "dev": true,
1193 | "optional": true,
1194 | "requires": {
1195 | "asynckit": "0.4.0",
1196 | "combined-stream": "1.0.5",
1197 | "mime-types": "2.1.15"
1198 | }
1199 | },
1200 | "fs.realpath": {
1201 | "version": "1.0.0",
1202 | "bundled": true,
1203 | "dev": true
1204 | },
1205 | "fstream": {
1206 | "version": "1.0.11",
1207 | "bundled": true,
1208 | "dev": true,
1209 | "requires": {
1210 | "graceful-fs": "4.1.11",
1211 | "inherits": "2.0.3",
1212 | "mkdirp": "0.5.1",
1213 | "rimraf": "2.6.1"
1214 | }
1215 | },
1216 | "fstream-ignore": {
1217 | "version": "1.0.5",
1218 | "bundled": true,
1219 | "dev": true,
1220 | "optional": true,
1221 | "requires": {
1222 | "fstream": "1.0.11",
1223 | "inherits": "2.0.3",
1224 | "minimatch": "3.0.4"
1225 | }
1226 | },
1227 | "gauge": {
1228 | "version": "2.7.4",
1229 | "bundled": true,
1230 | "dev": true,
1231 | "optional": true,
1232 | "requires": {
1233 | "aproba": "1.1.1",
1234 | "console-control-strings": "1.1.0",
1235 | "has-unicode": "2.0.1",
1236 | "object-assign": "4.1.1",
1237 | "signal-exit": "3.0.2",
1238 | "string-width": "1.0.2",
1239 | "strip-ansi": "3.0.1",
1240 | "wide-align": "1.1.2"
1241 | }
1242 | },
1243 | "getpass": {
1244 | "version": "0.1.7",
1245 | "bundled": true,
1246 | "dev": true,
1247 | "optional": true,
1248 | "requires": {
1249 | "assert-plus": "1.0.0"
1250 | },
1251 | "dependencies": {
1252 | "assert-plus": {
1253 | "version": "1.0.0",
1254 | "bundled": true,
1255 | "dev": true,
1256 | "optional": true
1257 | }
1258 | }
1259 | },
1260 | "glob": {
1261 | "version": "7.1.2",
1262 | "bundled": true,
1263 | "dev": true,
1264 | "requires": {
1265 | "fs.realpath": "1.0.0",
1266 | "inflight": "1.0.6",
1267 | "inherits": "2.0.3",
1268 | "minimatch": "3.0.4",
1269 | "once": "1.4.0",
1270 | "path-is-absolute": "1.0.1"
1271 | }
1272 | },
1273 | "graceful-fs": {
1274 | "version": "4.1.11",
1275 | "bundled": true,
1276 | "dev": true
1277 | },
1278 | "har-schema": {
1279 | "version": "1.0.5",
1280 | "bundled": true,
1281 | "dev": true,
1282 | "optional": true
1283 | },
1284 | "har-validator": {
1285 | "version": "4.2.1",
1286 | "bundled": true,
1287 | "dev": true,
1288 | "optional": true,
1289 | "requires": {
1290 | "ajv": "4.11.8",
1291 | "har-schema": "1.0.5"
1292 | }
1293 | },
1294 | "has-unicode": {
1295 | "version": "2.0.1",
1296 | "bundled": true,
1297 | "dev": true,
1298 | "optional": true
1299 | },
1300 | "hawk": {
1301 | "version": "3.1.3",
1302 | "bundled": true,
1303 | "dev": true,
1304 | "requires": {
1305 | "boom": "2.10.1",
1306 | "cryptiles": "2.0.5",
1307 | "hoek": "2.16.3",
1308 | "sntp": "1.0.9"
1309 | }
1310 | },
1311 | "hoek": {
1312 | "version": "2.16.3",
1313 | "bundled": true,
1314 | "dev": true
1315 | },
1316 | "http-signature": {
1317 | "version": "1.1.1",
1318 | "bundled": true,
1319 | "dev": true,
1320 | "optional": true,
1321 | "requires": {
1322 | "assert-plus": "0.2.0",
1323 | "jsprim": "1.4.0",
1324 | "sshpk": "1.13.0"
1325 | }
1326 | },
1327 | "inflight": {
1328 | "version": "1.0.6",
1329 | "bundled": true,
1330 | "dev": true,
1331 | "requires": {
1332 | "once": "1.4.0",
1333 | "wrappy": "1.0.2"
1334 | }
1335 | },
1336 | "inherits": {
1337 | "version": "2.0.3",
1338 | "bundled": true,
1339 | "dev": true
1340 | },
1341 | "ini": {
1342 | "version": "1.3.4",
1343 | "bundled": true,
1344 | "dev": true,
1345 | "optional": true
1346 | },
1347 | "is-fullwidth-code-point": {
1348 | "version": "1.0.0",
1349 | "bundled": true,
1350 | "dev": true,
1351 | "requires": {
1352 | "number-is-nan": "1.0.1"
1353 | }
1354 | },
1355 | "is-typedarray": {
1356 | "version": "1.0.0",
1357 | "bundled": true,
1358 | "dev": true,
1359 | "optional": true
1360 | },
1361 | "isarray": {
1362 | "version": "1.0.0",
1363 | "bundled": true,
1364 | "dev": true
1365 | },
1366 | "isstream": {
1367 | "version": "0.1.2",
1368 | "bundled": true,
1369 | "dev": true,
1370 | "optional": true
1371 | },
1372 | "jodid25519": {
1373 | "version": "1.0.2",
1374 | "bundled": true,
1375 | "dev": true,
1376 | "optional": true,
1377 | "requires": {
1378 | "jsbn": "0.1.1"
1379 | }
1380 | },
1381 | "jsbn": {
1382 | "version": "0.1.1",
1383 | "bundled": true,
1384 | "dev": true,
1385 | "optional": true
1386 | },
1387 | "json-schema": {
1388 | "version": "0.2.3",
1389 | "bundled": true,
1390 | "dev": true,
1391 | "optional": true
1392 | },
1393 | "json-stable-stringify": {
1394 | "version": "1.0.1",
1395 | "bundled": true,
1396 | "dev": true,
1397 | "optional": true,
1398 | "requires": {
1399 | "jsonify": "0.0.0"
1400 | }
1401 | },
1402 | "json-stringify-safe": {
1403 | "version": "5.0.1",
1404 | "bundled": true,
1405 | "dev": true,
1406 | "optional": true
1407 | },
1408 | "jsonify": {
1409 | "version": "0.0.0",
1410 | "bundled": true,
1411 | "dev": true,
1412 | "optional": true
1413 | },
1414 | "jsprim": {
1415 | "version": "1.4.0",
1416 | "bundled": true,
1417 | "dev": true,
1418 | "optional": true,
1419 | "requires": {
1420 | "assert-plus": "1.0.0",
1421 | "extsprintf": "1.0.2",
1422 | "json-schema": "0.2.3",
1423 | "verror": "1.3.6"
1424 | },
1425 | "dependencies": {
1426 | "assert-plus": {
1427 | "version": "1.0.0",
1428 | "bundled": true,
1429 | "dev": true,
1430 | "optional": true
1431 | }
1432 | }
1433 | },
1434 | "mime-db": {
1435 | "version": "1.27.0",
1436 | "bundled": true,
1437 | "dev": true
1438 | },
1439 | "mime-types": {
1440 | "version": "2.1.15",
1441 | "bundled": true,
1442 | "dev": true,
1443 | "requires": {
1444 | "mime-db": "1.27.0"
1445 | }
1446 | },
1447 | "minimatch": {
1448 | "version": "3.0.4",
1449 | "bundled": true,
1450 | "dev": true,
1451 | "requires": {
1452 | "brace-expansion": "1.1.7"
1453 | }
1454 | },
1455 | "minimist": {
1456 | "version": "0.0.8",
1457 | "bundled": true,
1458 | "dev": true
1459 | },
1460 | "mkdirp": {
1461 | "version": "0.5.1",
1462 | "bundled": true,
1463 | "dev": true,
1464 | "requires": {
1465 | "minimist": "0.0.8"
1466 | }
1467 | },
1468 | "ms": {
1469 | "version": "2.0.0",
1470 | "bundled": true,
1471 | "dev": true,
1472 | "optional": true
1473 | },
1474 | "node-pre-gyp": {
1475 | "version": "0.6.39",
1476 | "bundled": true,
1477 | "dev": true,
1478 | "optional": true,
1479 | "requires": {
1480 | "detect-libc": "1.0.2",
1481 | "hawk": "3.1.3",
1482 | "mkdirp": "0.5.1",
1483 | "nopt": "4.0.1",
1484 | "npmlog": "4.1.0",
1485 | "rc": "1.2.1",
1486 | "request": "2.81.0",
1487 | "rimraf": "2.6.1",
1488 | "semver": "5.3.0",
1489 | "tar": "2.2.1",
1490 | "tar-pack": "3.4.0"
1491 | }
1492 | },
1493 | "nopt": {
1494 | "version": "4.0.1",
1495 | "bundled": true,
1496 | "dev": true,
1497 | "optional": true,
1498 | "requires": {
1499 | "abbrev": "1.1.0",
1500 | "osenv": "0.1.4"
1501 | }
1502 | },
1503 | "npmlog": {
1504 | "version": "4.1.0",
1505 | "bundled": true,
1506 | "dev": true,
1507 | "optional": true,
1508 | "requires": {
1509 | "are-we-there-yet": "1.1.4",
1510 | "console-control-strings": "1.1.0",
1511 | "gauge": "2.7.4",
1512 | "set-blocking": "2.0.0"
1513 | }
1514 | },
1515 | "number-is-nan": {
1516 | "version": "1.0.1",
1517 | "bundled": true,
1518 | "dev": true
1519 | },
1520 | "oauth-sign": {
1521 | "version": "0.8.2",
1522 | "bundled": true,
1523 | "dev": true,
1524 | "optional": true
1525 | },
1526 | "object-assign": {
1527 | "version": "4.1.1",
1528 | "bundled": true,
1529 | "dev": true,
1530 | "optional": true
1531 | },
1532 | "once": {
1533 | "version": "1.4.0",
1534 | "bundled": true,
1535 | "dev": true,
1536 | "requires": {
1537 | "wrappy": "1.0.2"
1538 | }
1539 | },
1540 | "os-homedir": {
1541 | "version": "1.0.2",
1542 | "bundled": true,
1543 | "dev": true,
1544 | "optional": true
1545 | },
1546 | "os-tmpdir": {
1547 | "version": "1.0.2",
1548 | "bundled": true,
1549 | "dev": true,
1550 | "optional": true
1551 | },
1552 | "osenv": {
1553 | "version": "0.1.4",
1554 | "bundled": true,
1555 | "dev": true,
1556 | "optional": true,
1557 | "requires": {
1558 | "os-homedir": "1.0.2",
1559 | "os-tmpdir": "1.0.2"
1560 | }
1561 | },
1562 | "path-is-absolute": {
1563 | "version": "1.0.1",
1564 | "bundled": true,
1565 | "dev": true
1566 | },
1567 | "performance-now": {
1568 | "version": "0.2.0",
1569 | "bundled": true,
1570 | "dev": true,
1571 | "optional": true
1572 | },
1573 | "process-nextick-args": {
1574 | "version": "1.0.7",
1575 | "bundled": true,
1576 | "dev": true
1577 | },
1578 | "punycode": {
1579 | "version": "1.4.1",
1580 | "bundled": true,
1581 | "dev": true,
1582 | "optional": true
1583 | },
1584 | "qs": {
1585 | "version": "6.4.0",
1586 | "bundled": true,
1587 | "dev": true,
1588 | "optional": true
1589 | },
1590 | "rc": {
1591 | "version": "1.2.1",
1592 | "bundled": true,
1593 | "dev": true,
1594 | "optional": true,
1595 | "requires": {
1596 | "deep-extend": "0.4.2",
1597 | "ini": "1.3.4",
1598 | "minimist": "1.2.0",
1599 | "strip-json-comments": "2.0.1"
1600 | },
1601 | "dependencies": {
1602 | "minimist": {
1603 | "version": "1.2.0",
1604 | "bundled": true,
1605 | "dev": true,
1606 | "optional": true
1607 | }
1608 | }
1609 | },
1610 | "readable-stream": {
1611 | "version": "2.2.9",
1612 | "bundled": true,
1613 | "dev": true,
1614 | "requires": {
1615 | "buffer-shims": "1.0.0",
1616 | "core-util-is": "1.0.2",
1617 | "inherits": "2.0.3",
1618 | "isarray": "1.0.0",
1619 | "process-nextick-args": "1.0.7",
1620 | "string_decoder": "1.0.1",
1621 | "util-deprecate": "1.0.2"
1622 | }
1623 | },
1624 | "request": {
1625 | "version": "2.81.0",
1626 | "bundled": true,
1627 | "dev": true,
1628 | "optional": true,
1629 | "requires": {
1630 | "aws-sign2": "0.6.0",
1631 | "aws4": "1.6.0",
1632 | "caseless": "0.12.0",
1633 | "combined-stream": "1.0.5",
1634 | "extend": "3.0.1",
1635 | "forever-agent": "0.6.1",
1636 | "form-data": "2.1.4",
1637 | "har-validator": "4.2.1",
1638 | "hawk": "3.1.3",
1639 | "http-signature": "1.1.1",
1640 | "is-typedarray": "1.0.0",
1641 | "isstream": "0.1.2",
1642 | "json-stringify-safe": "5.0.1",
1643 | "mime-types": "2.1.15",
1644 | "oauth-sign": "0.8.2",
1645 | "performance-now": "0.2.0",
1646 | "qs": "6.4.0",
1647 | "safe-buffer": "5.0.1",
1648 | "stringstream": "0.0.5",
1649 | "tough-cookie": "2.3.2",
1650 | "tunnel-agent": "0.6.0",
1651 | "uuid": "3.0.1"
1652 | }
1653 | },
1654 | "rimraf": {
1655 | "version": "2.6.1",
1656 | "bundled": true,
1657 | "dev": true,
1658 | "requires": {
1659 | "glob": "7.1.2"
1660 | }
1661 | },
1662 | "safe-buffer": {
1663 | "version": "5.0.1",
1664 | "bundled": true,
1665 | "dev": true
1666 | },
1667 | "semver": {
1668 | "version": "5.3.0",
1669 | "bundled": true,
1670 | "dev": true,
1671 | "optional": true
1672 | },
1673 | "set-blocking": {
1674 | "version": "2.0.0",
1675 | "bundled": true,
1676 | "dev": true,
1677 | "optional": true
1678 | },
1679 | "signal-exit": {
1680 | "version": "3.0.2",
1681 | "bundled": true,
1682 | "dev": true,
1683 | "optional": true
1684 | },
1685 | "sntp": {
1686 | "version": "1.0.9",
1687 | "bundled": true,
1688 | "dev": true,
1689 | "requires": {
1690 | "hoek": "2.16.3"
1691 | }
1692 | },
1693 | "sshpk": {
1694 | "version": "1.13.0",
1695 | "bundled": true,
1696 | "dev": true,
1697 | "optional": true,
1698 | "requires": {
1699 | "asn1": "0.2.3",
1700 | "assert-plus": "1.0.0",
1701 | "bcrypt-pbkdf": "1.0.1",
1702 | "dashdash": "1.14.1",
1703 | "ecc-jsbn": "0.1.1",
1704 | "getpass": "0.1.7",
1705 | "jodid25519": "1.0.2",
1706 | "jsbn": "0.1.1",
1707 | "tweetnacl": "0.14.5"
1708 | },
1709 | "dependencies": {
1710 | "assert-plus": {
1711 | "version": "1.0.0",
1712 | "bundled": true,
1713 | "dev": true,
1714 | "optional": true
1715 | }
1716 | }
1717 | },
1718 | "string-width": {
1719 | "version": "1.0.2",
1720 | "bundled": true,
1721 | "dev": true,
1722 | "requires": {
1723 | "code-point-at": "1.1.0",
1724 | "is-fullwidth-code-point": "1.0.0",
1725 | "strip-ansi": "3.0.1"
1726 | }
1727 | },
1728 | "string_decoder": {
1729 | "version": "1.0.1",
1730 | "bundled": true,
1731 | "dev": true,
1732 | "requires": {
1733 | "safe-buffer": "5.0.1"
1734 | }
1735 | },
1736 | "stringstream": {
1737 | "version": "0.0.5",
1738 | "bundled": true,
1739 | "dev": true,
1740 | "optional": true
1741 | },
1742 | "strip-ansi": {
1743 | "version": "3.0.1",
1744 | "bundled": true,
1745 | "dev": true,
1746 | "requires": {
1747 | "ansi-regex": "2.1.1"
1748 | }
1749 | },
1750 | "strip-json-comments": {
1751 | "version": "2.0.1",
1752 | "bundled": true,
1753 | "dev": true,
1754 | "optional": true
1755 | },
1756 | "tar": {
1757 | "version": "2.2.1",
1758 | "bundled": true,
1759 | "dev": true,
1760 | "requires": {
1761 | "block-stream": "0.0.9",
1762 | "fstream": "1.0.11",
1763 | "inherits": "2.0.3"
1764 | }
1765 | },
1766 | "tar-pack": {
1767 | "version": "3.4.0",
1768 | "bundled": true,
1769 | "dev": true,
1770 | "optional": true,
1771 | "requires": {
1772 | "debug": "2.6.8",
1773 | "fstream": "1.0.11",
1774 | "fstream-ignore": "1.0.5",
1775 | "once": "1.4.0",
1776 | "readable-stream": "2.2.9",
1777 | "rimraf": "2.6.1",
1778 | "tar": "2.2.1",
1779 | "uid-number": "0.0.6"
1780 | }
1781 | },
1782 | "tough-cookie": {
1783 | "version": "2.3.2",
1784 | "bundled": true,
1785 | "dev": true,
1786 | "optional": true,
1787 | "requires": {
1788 | "punycode": "1.4.1"
1789 | }
1790 | },
1791 | "tunnel-agent": {
1792 | "version": "0.6.0",
1793 | "bundled": true,
1794 | "dev": true,
1795 | "optional": true,
1796 | "requires": {
1797 | "safe-buffer": "5.0.1"
1798 | }
1799 | },
1800 | "tweetnacl": {
1801 | "version": "0.14.5",
1802 | "bundled": true,
1803 | "dev": true,
1804 | "optional": true
1805 | },
1806 | "uid-number": {
1807 | "version": "0.0.6",
1808 | "bundled": true,
1809 | "dev": true,
1810 | "optional": true
1811 | },
1812 | "util-deprecate": {
1813 | "version": "1.0.2",
1814 | "bundled": true,
1815 | "dev": true
1816 | },
1817 | "uuid": {
1818 | "version": "3.0.1",
1819 | "bundled": true,
1820 | "dev": true,
1821 | "optional": true
1822 | },
1823 | "verror": {
1824 | "version": "1.3.6",
1825 | "bundled": true,
1826 | "dev": true,
1827 | "optional": true,
1828 | "requires": {
1829 | "extsprintf": "1.0.2"
1830 | }
1831 | },
1832 | "wide-align": {
1833 | "version": "1.1.2",
1834 | "bundled": true,
1835 | "dev": true,
1836 | "optional": true,
1837 | "requires": {
1838 | "string-width": "1.0.2"
1839 | }
1840 | },
1841 | "wrappy": {
1842 | "version": "1.0.2",
1843 | "bundled": true,
1844 | "dev": true
1845 | }
1846 | }
1847 | },
1848 | "get-caller-file": {
1849 | "version": "1.0.2",
1850 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
1851 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
1852 | "dev": true
1853 | },
1854 | "getpass": {
1855 | "version": "0.1.7",
1856 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
1857 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
1858 | "dev": true,
1859 | "requires": {
1860 | "assert-plus": "1.0.0"
1861 | },
1862 | "dependencies": {
1863 | "assert-plus": {
1864 | "version": "1.0.0",
1865 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1866 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
1867 | "dev": true
1868 | }
1869 | }
1870 | },
1871 | "glob-base": {
1872 | "version": "0.3.0",
1873 | "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
1874 | "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
1875 | "dev": true,
1876 | "requires": {
1877 | "glob-parent": "2.0.0",
1878 | "is-glob": "2.0.1"
1879 | }
1880 | },
1881 | "glob-parent": {
1882 | "version": "2.0.0",
1883 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
1884 | "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
1885 | "dev": true,
1886 | "requires": {
1887 | "is-glob": "2.0.1"
1888 | }
1889 | },
1890 | "graceful-fs": {
1891 | "version": "4.1.11",
1892 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
1893 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
1894 | "dev": true
1895 | },
1896 | "har-schema": {
1897 | "version": "1.0.5",
1898 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz",
1899 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=",
1900 | "dev": true
1901 | },
1902 | "har-validator": {
1903 | "version": "4.2.1",
1904 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz",
1905 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=",
1906 | "dev": true,
1907 | "requires": {
1908 | "ajv": "4.11.8",
1909 | "har-schema": "1.0.5"
1910 | }
1911 | },
1912 | "has-ansi": {
1913 | "version": "0.1.0",
1914 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz",
1915 | "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=",
1916 | "dev": true,
1917 | "requires": {
1918 | "ansi-regex": "0.2.1"
1919 | }
1920 | },
1921 | "has-binary2": {
1922 | "version": "1.0.2",
1923 | "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.2.tgz",
1924 | "integrity": "sha1-6D26SfC5vk0CbSc2U1DZ8D9Uvpg=",
1925 | "dev": true,
1926 | "requires": {
1927 | "isarray": "2.0.1"
1928 | }
1929 | },
1930 | "has-cors": {
1931 | "version": "1.1.0",
1932 | "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
1933 | "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
1934 | "dev": true
1935 | },
1936 | "has-flag": {
1937 | "version": "1.0.0",
1938 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
1939 | "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
1940 | "dev": true
1941 | },
1942 | "hawk": {
1943 | "version": "3.1.3",
1944 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
1945 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
1946 | "dev": true,
1947 | "requires": {
1948 | "boom": "2.10.1",
1949 | "cryptiles": "2.0.5",
1950 | "hoek": "2.16.3",
1951 | "sntp": "1.0.9"
1952 | }
1953 | },
1954 | "hoek": {
1955 | "version": "2.16.3",
1956 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
1957 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
1958 | "dev": true
1959 | },
1960 | "hosted-git-info": {
1961 | "version": "2.6.0",
1962 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz",
1963 | "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==",
1964 | "dev": true
1965 | },
1966 | "http-errors": {
1967 | "version": "1.5.1",
1968 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.5.1.tgz",
1969 | "integrity": "sha1-eIwNLB3iyBuebowBhDtrl+uSB1A=",
1970 | "dev": true,
1971 | "requires": {
1972 | "inherits": "2.0.3",
1973 | "setprototypeof": "1.0.2",
1974 | "statuses": "1.3.1"
1975 | }
1976 | },
1977 | "http-proxy": {
1978 | "version": "1.15.2",
1979 | "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.15.2.tgz",
1980 | "integrity": "sha1-ZC/cr/5S00SNK9o7AHnpQJBk2jE=",
1981 | "dev": true,
1982 | "requires": {
1983 | "eventemitter3": "1.2.0",
1984 | "requires-port": "1.0.0"
1985 | }
1986 | },
1987 | "http-signature": {
1988 | "version": "1.1.1",
1989 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz",
1990 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=",
1991 | "dev": true,
1992 | "requires": {
1993 | "assert-plus": "0.2.0",
1994 | "jsprim": "1.4.1",
1995 | "sshpk": "1.14.1"
1996 | }
1997 | },
1998 | "immutable": {
1999 | "version": "3.8.2",
2000 | "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz",
2001 | "integrity": "sha1-wkOZUUVbs5kT2vKBN28VMOEErfM=",
2002 | "dev": true
2003 | },
2004 | "indexof": {
2005 | "version": "0.0.1",
2006 | "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
2007 | "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
2008 | "dev": true
2009 | },
2010 | "inherits": {
2011 | "version": "2.0.3",
2012 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
2013 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
2014 | "dev": true
2015 | },
2016 | "invert-kv": {
2017 | "version": "1.0.0",
2018 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
2019 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
2020 | "dev": true
2021 | },
2022 | "is-arrayish": {
2023 | "version": "0.2.1",
2024 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
2025 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
2026 | "dev": true
2027 | },
2028 | "is-binary-path": {
2029 | "version": "1.0.1",
2030 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
2031 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
2032 | "dev": true,
2033 | "requires": {
2034 | "binary-extensions": "1.11.0"
2035 | }
2036 | },
2037 | "is-buffer": {
2038 | "version": "1.1.6",
2039 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
2040 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
2041 | "dev": true
2042 | },
2043 | "is-builtin-module": {
2044 | "version": "1.0.0",
2045 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
2046 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
2047 | "dev": true,
2048 | "requires": {
2049 | "builtin-modules": "1.1.1"
2050 | }
2051 | },
2052 | "is-dotfile": {
2053 | "version": "1.0.3",
2054 | "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
2055 | "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
2056 | "dev": true
2057 | },
2058 | "is-equal-shallow": {
2059 | "version": "0.1.3",
2060 | "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
2061 | "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
2062 | "dev": true,
2063 | "requires": {
2064 | "is-primitive": "2.0.0"
2065 | }
2066 | },
2067 | "is-extendable": {
2068 | "version": "0.1.1",
2069 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
2070 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
2071 | "dev": true
2072 | },
2073 | "is-extglob": {
2074 | "version": "1.0.0",
2075 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
2076 | "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
2077 | "dev": true
2078 | },
2079 | "is-fullwidth-code-point": {
2080 | "version": "1.0.0",
2081 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
2082 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
2083 | "dev": true,
2084 | "requires": {
2085 | "number-is-nan": "1.0.1"
2086 | }
2087 | },
2088 | "is-glob": {
2089 | "version": "2.0.1",
2090 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
2091 | "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
2092 | "dev": true,
2093 | "requires": {
2094 | "is-extglob": "1.0.0"
2095 | }
2096 | },
2097 | "is-number": {
2098 | "version": "2.1.0",
2099 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
2100 | "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
2101 | "dev": true,
2102 | "requires": {
2103 | "kind-of": "3.2.2"
2104 | }
2105 | },
2106 | "is-number-like": {
2107 | "version": "1.0.8",
2108 | "resolved": "https://registry.npmjs.org/is-number-like/-/is-number-like-1.0.8.tgz",
2109 | "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==",
2110 | "dev": true,
2111 | "requires": {
2112 | "lodash.isfinite": "3.3.2"
2113 | }
2114 | },
2115 | "is-posix-bracket": {
2116 | "version": "0.1.1",
2117 | "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
2118 | "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
2119 | "dev": true
2120 | },
2121 | "is-primitive": {
2122 | "version": "2.0.0",
2123 | "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
2124 | "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
2125 | "dev": true
2126 | },
2127 | "is-typedarray": {
2128 | "version": "1.0.0",
2129 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
2130 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
2131 | "dev": true
2132 | },
2133 | "is-utf8": {
2134 | "version": "0.2.1",
2135 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
2136 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
2137 | "dev": true
2138 | },
2139 | "isarray": {
2140 | "version": "2.0.1",
2141 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
2142 | "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
2143 | "dev": true
2144 | },
2145 | "isobject": {
2146 | "version": "2.1.0",
2147 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
2148 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
2149 | "dev": true,
2150 | "requires": {
2151 | "isarray": "1.0.0"
2152 | },
2153 | "dependencies": {
2154 | "isarray": {
2155 | "version": "1.0.0",
2156 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2157 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2158 | "dev": true
2159 | }
2160 | }
2161 | },
2162 | "isstream": {
2163 | "version": "0.1.2",
2164 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
2165 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
2166 | "dev": true
2167 | },
2168 | "jsbn": {
2169 | "version": "0.1.1",
2170 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
2171 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
2172 | "dev": true,
2173 | "optional": true
2174 | },
2175 | "json-schema": {
2176 | "version": "0.2.3",
2177 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
2178 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
2179 | "dev": true
2180 | },
2181 | "json-stable-stringify": {
2182 | "version": "1.0.1",
2183 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
2184 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
2185 | "dev": true,
2186 | "requires": {
2187 | "jsonify": "0.0.0"
2188 | }
2189 | },
2190 | "json-stringify-safe": {
2191 | "version": "5.0.1",
2192 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
2193 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
2194 | "dev": true
2195 | },
2196 | "jsonfile": {
2197 | "version": "3.0.1",
2198 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz",
2199 | "integrity": "sha1-pezG9l9T9mLEQVx2daAzHQmS7GY=",
2200 | "dev": true,
2201 | "requires": {
2202 | "graceful-fs": "4.1.11"
2203 | }
2204 | },
2205 | "jsonify": {
2206 | "version": "0.0.0",
2207 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
2208 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
2209 | "dev": true
2210 | },
2211 | "jsprim": {
2212 | "version": "1.4.1",
2213 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
2214 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
2215 | "dev": true,
2216 | "requires": {
2217 | "assert-plus": "1.0.0",
2218 | "extsprintf": "1.3.0",
2219 | "json-schema": "0.2.3",
2220 | "verror": "1.10.0"
2221 | },
2222 | "dependencies": {
2223 | "assert-plus": {
2224 | "version": "1.0.0",
2225 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
2226 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
2227 | "dev": true
2228 | }
2229 | }
2230 | },
2231 | "kind-of": {
2232 | "version": "3.2.2",
2233 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2234 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2235 | "dev": true,
2236 | "requires": {
2237 | "is-buffer": "1.1.6"
2238 | }
2239 | },
2240 | "lcid": {
2241 | "version": "1.0.0",
2242 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
2243 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
2244 | "dev": true,
2245 | "requires": {
2246 | "invert-kv": "1.0.0"
2247 | }
2248 | },
2249 | "limiter": {
2250 | "version": "1.1.2",
2251 | "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.2.tgz",
2252 | "integrity": "sha512-JIKZ0xb6fZZYa3deZ0BgXCgX6HgV8Nx3mFGeFHmFWW8Fb2c08e0CyE+G3nalpD0xGvGssjGb1UdFr+PprxZEbw==",
2253 | "dev": true
2254 | },
2255 | "lite-server": {
2256 | "version": "2.3.0",
2257 | "resolved": "https://registry.npmjs.org/lite-server/-/lite-server-2.3.0.tgz",
2258 | "integrity": "sha1-W0zI9dX9SDYQVICrKsSKOg3isMg=",
2259 | "dev": true,
2260 | "requires": {
2261 | "browser-sync": "2.23.6",
2262 | "connect-history-api-fallback": "1.5.0",
2263 | "connect-logger": "0.0.1",
2264 | "lodash": "4.17.5",
2265 | "minimist": "1.2.0"
2266 | }
2267 | },
2268 | "load-json-file": {
2269 | "version": "1.1.0",
2270 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
2271 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
2272 | "dev": true,
2273 | "requires": {
2274 | "graceful-fs": "4.1.11",
2275 | "parse-json": "2.2.0",
2276 | "pify": "2.3.0",
2277 | "pinkie-promise": "2.0.1",
2278 | "strip-bom": "2.0.0"
2279 | }
2280 | },
2281 | "localtunnel": {
2282 | "version": "1.8.3",
2283 | "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.3.tgz",
2284 | "integrity": "sha1-3MWSL9hWUQN9S94k/ZMkjQsk6wU=",
2285 | "dev": true,
2286 | "requires": {
2287 | "debug": "2.6.8",
2288 | "openurl": "1.1.1",
2289 | "request": "2.81.0",
2290 | "yargs": "3.29.0"
2291 | },
2292 | "dependencies": {
2293 | "debug": {
2294 | "version": "2.6.8",
2295 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
2296 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
2297 | "dev": true,
2298 | "requires": {
2299 | "ms": "2.0.0"
2300 | }
2301 | },
2302 | "yargs": {
2303 | "version": "3.29.0",
2304 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz",
2305 | "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=",
2306 | "dev": true,
2307 | "requires": {
2308 | "camelcase": "1.2.1",
2309 | "cliui": "3.2.0",
2310 | "decamelize": "1.2.0",
2311 | "os-locale": "1.4.0",
2312 | "window-size": "0.1.4",
2313 | "y18n": "3.2.1"
2314 | }
2315 | }
2316 | }
2317 | },
2318 | "lodash": {
2319 | "version": "4.17.5",
2320 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz",
2321 | "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==",
2322 | "dev": true
2323 | },
2324 | "lodash.isfinite": {
2325 | "version": "3.3.2",
2326 | "resolved": "https://registry.npmjs.org/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz",
2327 | "integrity": "sha1-+4m2WpqAKBgz8LdHizpRBPiY67M=",
2328 | "dev": true
2329 | },
2330 | "micromatch": {
2331 | "version": "2.3.11",
2332 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
2333 | "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
2334 | "dev": true,
2335 | "requires": {
2336 | "arr-diff": "2.0.0",
2337 | "array-unique": "0.2.1",
2338 | "braces": "1.8.5",
2339 | "expand-brackets": "0.1.5",
2340 | "extglob": "0.3.2",
2341 | "filename-regex": "2.0.1",
2342 | "is-extglob": "1.0.0",
2343 | "is-glob": "2.0.1",
2344 | "kind-of": "3.2.2",
2345 | "normalize-path": "2.1.1",
2346 | "object.omit": "2.0.1",
2347 | "parse-glob": "3.0.4",
2348 | "regex-cache": "0.4.4"
2349 | }
2350 | },
2351 | "mime": {
2352 | "version": "1.3.4",
2353 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz",
2354 | "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=",
2355 | "dev": true
2356 | },
2357 | "mime-db": {
2358 | "version": "1.33.0",
2359 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
2360 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
2361 | "dev": true
2362 | },
2363 | "mime-types": {
2364 | "version": "2.1.18",
2365 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
2366 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
2367 | "dev": true,
2368 | "requires": {
2369 | "mime-db": "1.33.0"
2370 | }
2371 | },
2372 | "minimatch": {
2373 | "version": "3.0.4",
2374 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
2375 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
2376 | "dev": true,
2377 | "requires": {
2378 | "brace-expansion": "1.1.11"
2379 | }
2380 | },
2381 | "minimist": {
2382 | "version": "1.2.0",
2383 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
2384 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
2385 | "dev": true
2386 | },
2387 | "moment": {
2388 | "version": "2.21.0",
2389 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.21.0.tgz",
2390 | "integrity": "sha512-TCZ36BjURTeFTM/CwRcViQlfkMvL1/vFISuNLO5GkcVm1+QHfbSiNqZuWeMFjj1/3+uAjXswgRk30j1kkLYJBQ==",
2391 | "dev": true
2392 | },
2393 | "ms": {
2394 | "version": "2.0.0",
2395 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2396 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
2397 | "dev": true
2398 | },
2399 | "nan": {
2400 | "version": "2.10.0",
2401 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
2402 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==",
2403 | "dev": true,
2404 | "optional": true
2405 | },
2406 | "negotiator": {
2407 | "version": "0.6.1",
2408 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
2409 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=",
2410 | "dev": true
2411 | },
2412 | "normalize-package-data": {
2413 | "version": "2.4.0",
2414 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz",
2415 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==",
2416 | "dev": true,
2417 | "requires": {
2418 | "hosted-git-info": "2.6.0",
2419 | "is-builtin-module": "1.0.0",
2420 | "semver": "5.5.0",
2421 | "validate-npm-package-license": "3.0.3"
2422 | }
2423 | },
2424 | "normalize-path": {
2425 | "version": "2.1.1",
2426 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
2427 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
2428 | "dev": true,
2429 | "requires": {
2430 | "remove-trailing-separator": "1.1.0"
2431 | }
2432 | },
2433 | "number-is-nan": {
2434 | "version": "1.0.1",
2435 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
2436 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
2437 | "dev": true
2438 | },
2439 | "oauth-sign": {
2440 | "version": "0.8.2",
2441 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
2442 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
2443 | "dev": true
2444 | },
2445 | "object-assign": {
2446 | "version": "4.1.1",
2447 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
2448 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
2449 | "dev": true
2450 | },
2451 | "object-component": {
2452 | "version": "0.0.3",
2453 | "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
2454 | "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
2455 | "dev": true
2456 | },
2457 | "object-path": {
2458 | "version": "0.9.2",
2459 | "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz",
2460 | "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=",
2461 | "dev": true
2462 | },
2463 | "object.omit": {
2464 | "version": "2.0.1",
2465 | "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
2466 | "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
2467 | "dev": true,
2468 | "requires": {
2469 | "for-own": "0.1.5",
2470 | "is-extendable": "0.1.1"
2471 | }
2472 | },
2473 | "on-finished": {
2474 | "version": "2.3.0",
2475 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
2476 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
2477 | "dev": true,
2478 | "requires": {
2479 | "ee-first": "1.1.1"
2480 | }
2481 | },
2482 | "openurl": {
2483 | "version": "1.1.1",
2484 | "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.1.tgz",
2485 | "integrity": "sha1-OHW0sO96UsFW8NtB1GCduw+Us4c=",
2486 | "dev": true
2487 | },
2488 | "opn": {
2489 | "version": "4.0.2",
2490 | "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz",
2491 | "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=",
2492 | "dev": true,
2493 | "requires": {
2494 | "object-assign": "4.1.1",
2495 | "pinkie-promise": "2.0.1"
2496 | }
2497 | },
2498 | "os-locale": {
2499 | "version": "1.4.0",
2500 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
2501 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
2502 | "dev": true,
2503 | "requires": {
2504 | "lcid": "1.0.0"
2505 | }
2506 | },
2507 | "parse-glob": {
2508 | "version": "3.0.4",
2509 | "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
2510 | "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
2511 | "dev": true,
2512 | "requires": {
2513 | "glob-base": "0.3.0",
2514 | "is-dotfile": "1.0.3",
2515 | "is-extglob": "1.0.0",
2516 | "is-glob": "2.0.1"
2517 | }
2518 | },
2519 | "parse-json": {
2520 | "version": "2.2.0",
2521 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
2522 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
2523 | "dev": true,
2524 | "requires": {
2525 | "error-ex": "1.3.1"
2526 | }
2527 | },
2528 | "parseqs": {
2529 | "version": "0.0.5",
2530 | "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
2531 | "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
2532 | "dev": true,
2533 | "requires": {
2534 | "better-assert": "1.0.2"
2535 | }
2536 | },
2537 | "parseuri": {
2538 | "version": "0.0.5",
2539 | "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
2540 | "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
2541 | "dev": true,
2542 | "requires": {
2543 | "better-assert": "1.0.2"
2544 | }
2545 | },
2546 | "parseurl": {
2547 | "version": "1.3.2",
2548 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
2549 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=",
2550 | "dev": true
2551 | },
2552 | "path-exists": {
2553 | "version": "2.1.0",
2554 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
2555 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
2556 | "dev": true,
2557 | "requires": {
2558 | "pinkie-promise": "2.0.1"
2559 | }
2560 | },
2561 | "path-is-absolute": {
2562 | "version": "1.0.1",
2563 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
2564 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
2565 | "dev": true
2566 | },
2567 | "path-type": {
2568 | "version": "1.1.0",
2569 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
2570 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
2571 | "dev": true,
2572 | "requires": {
2573 | "graceful-fs": "4.1.11",
2574 | "pify": "2.3.0",
2575 | "pinkie-promise": "2.0.1"
2576 | }
2577 | },
2578 | "performance-now": {
2579 | "version": "0.2.0",
2580 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz",
2581 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=",
2582 | "dev": true
2583 | },
2584 | "pify": {
2585 | "version": "2.3.0",
2586 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
2587 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
2588 | "dev": true
2589 | },
2590 | "pinkie": {
2591 | "version": "2.0.4",
2592 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
2593 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
2594 | "dev": true
2595 | },
2596 | "pinkie-promise": {
2597 | "version": "2.0.1",
2598 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
2599 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
2600 | "dev": true,
2601 | "requires": {
2602 | "pinkie": "2.0.4"
2603 | }
2604 | },
2605 | "portscanner": {
2606 | "version": "2.1.1",
2607 | "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-2.1.1.tgz",
2608 | "integrity": "sha1-6rtAnk3iSVD1oqUW01rnaTQ/u5Y=",
2609 | "dev": true,
2610 | "requires": {
2611 | "async": "1.5.2",
2612 | "is-number-like": "1.0.8"
2613 | }
2614 | },
2615 | "preserve": {
2616 | "version": "0.2.0",
2617 | "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
2618 | "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
2619 | "dev": true
2620 | },
2621 | "process-nextick-args": {
2622 | "version": "2.0.0",
2623 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
2624 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
2625 | "dev": true
2626 | },
2627 | "punycode": {
2628 | "version": "1.4.1",
2629 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
2630 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
2631 | "dev": true
2632 | },
2633 | "qs": {
2634 | "version": "6.2.1",
2635 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.2.1.tgz",
2636 | "integrity": "sha1-zgPF/wk1vB2daanxTL0Y5WjWdiU=",
2637 | "dev": true
2638 | },
2639 | "randomatic": {
2640 | "version": "1.1.7",
2641 | "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
2642 | "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
2643 | "dev": true,
2644 | "requires": {
2645 | "is-number": "3.0.0",
2646 | "kind-of": "4.0.0"
2647 | },
2648 | "dependencies": {
2649 | "is-number": {
2650 | "version": "3.0.0",
2651 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
2652 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
2653 | "dev": true,
2654 | "requires": {
2655 | "kind-of": "3.2.2"
2656 | },
2657 | "dependencies": {
2658 | "kind-of": {
2659 | "version": "3.2.2",
2660 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
2661 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
2662 | "dev": true,
2663 | "requires": {
2664 | "is-buffer": "1.1.6"
2665 | }
2666 | }
2667 | }
2668 | },
2669 | "kind-of": {
2670 | "version": "4.0.0",
2671 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
2672 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
2673 | "dev": true,
2674 | "requires": {
2675 | "is-buffer": "1.1.6"
2676 | }
2677 | }
2678 | }
2679 | },
2680 | "range-parser": {
2681 | "version": "1.2.0",
2682 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
2683 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=",
2684 | "dev": true
2685 | },
2686 | "read-pkg": {
2687 | "version": "1.1.0",
2688 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
2689 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
2690 | "dev": true,
2691 | "requires": {
2692 | "load-json-file": "1.1.0",
2693 | "normalize-package-data": "2.4.0",
2694 | "path-type": "1.1.0"
2695 | }
2696 | },
2697 | "read-pkg-up": {
2698 | "version": "1.0.1",
2699 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
2700 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
2701 | "dev": true,
2702 | "requires": {
2703 | "find-up": "1.1.2",
2704 | "read-pkg": "1.1.0"
2705 | }
2706 | },
2707 | "readable-stream": {
2708 | "version": "2.3.5",
2709 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.5.tgz",
2710 | "integrity": "sha512-tK0yDhrkygt/knjowCUiWP9YdV7c5R+8cR0r/kt9ZhBU906Fs6RpQJCEilamRJj1Nx2rWI6LkW9gKqjTkshhEw==",
2711 | "dev": true,
2712 | "requires": {
2713 | "core-util-is": "1.0.2",
2714 | "inherits": "2.0.3",
2715 | "isarray": "1.0.0",
2716 | "process-nextick-args": "2.0.0",
2717 | "safe-buffer": "5.1.1",
2718 | "string_decoder": "1.0.3",
2719 | "util-deprecate": "1.0.2"
2720 | },
2721 | "dependencies": {
2722 | "isarray": {
2723 | "version": "1.0.0",
2724 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
2725 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
2726 | "dev": true
2727 | }
2728 | }
2729 | },
2730 | "readdirp": {
2731 | "version": "2.1.0",
2732 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz",
2733 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=",
2734 | "dev": true,
2735 | "requires": {
2736 | "graceful-fs": "4.1.11",
2737 | "minimatch": "3.0.4",
2738 | "readable-stream": "2.3.5",
2739 | "set-immediate-shim": "1.0.1"
2740 | }
2741 | },
2742 | "regex-cache": {
2743 | "version": "0.4.4",
2744 | "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
2745 | "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
2746 | "dev": true,
2747 | "requires": {
2748 | "is-equal-shallow": "0.1.3"
2749 | }
2750 | },
2751 | "remove-trailing-separator": {
2752 | "version": "1.1.0",
2753 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
2754 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
2755 | "dev": true
2756 | },
2757 | "repeat-element": {
2758 | "version": "1.1.2",
2759 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
2760 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
2761 | "dev": true
2762 | },
2763 | "repeat-string": {
2764 | "version": "1.6.1",
2765 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
2766 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
2767 | "dev": true
2768 | },
2769 | "request": {
2770 | "version": "2.81.0",
2771 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz",
2772 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=",
2773 | "dev": true,
2774 | "requires": {
2775 | "aws-sign2": "0.6.0",
2776 | "aws4": "1.6.0",
2777 | "caseless": "0.12.0",
2778 | "combined-stream": "1.0.6",
2779 | "extend": "3.0.1",
2780 | "forever-agent": "0.6.1",
2781 | "form-data": "2.1.4",
2782 | "har-validator": "4.2.1",
2783 | "hawk": "3.1.3",
2784 | "http-signature": "1.1.1",
2785 | "is-typedarray": "1.0.0",
2786 | "isstream": "0.1.2",
2787 | "json-stringify-safe": "5.0.1",
2788 | "mime-types": "2.1.18",
2789 | "oauth-sign": "0.8.2",
2790 | "performance-now": "0.2.0",
2791 | "qs": "6.4.0",
2792 | "safe-buffer": "5.1.1",
2793 | "stringstream": "0.0.5",
2794 | "tough-cookie": "2.3.4",
2795 | "tunnel-agent": "0.6.0",
2796 | "uuid": "3.2.1"
2797 | },
2798 | "dependencies": {
2799 | "qs": {
2800 | "version": "6.4.0",
2801 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
2802 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
2803 | "dev": true
2804 | }
2805 | }
2806 | },
2807 | "require-directory": {
2808 | "version": "2.1.1",
2809 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2810 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
2811 | "dev": true
2812 | },
2813 | "require-main-filename": {
2814 | "version": "1.0.1",
2815 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
2816 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
2817 | "dev": true
2818 | },
2819 | "requires-port": {
2820 | "version": "1.0.0",
2821 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
2822 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
2823 | "dev": true
2824 | },
2825 | "resp-modifier": {
2826 | "version": "6.0.2",
2827 | "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-6.0.2.tgz",
2828 | "integrity": "sha1-sSTeXE+6/LpUH0j/pzlw9KpFa08=",
2829 | "dev": true,
2830 | "requires": {
2831 | "debug": "2.6.9",
2832 | "minimatch": "3.0.4"
2833 | }
2834 | },
2835 | "rx": {
2836 | "version": "2.3.24",
2837 | "resolved": "https://registry.npmjs.org/rx/-/rx-2.3.24.tgz",
2838 | "integrity": "sha1-FPlQpCF9fjXapxu8vljv9o6ksrc=",
2839 | "dev": true
2840 | },
2841 | "rxjs": {
2842 | "version": "5.5.7",
2843 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.7.tgz",
2844 | "integrity": "sha512-Hxo2ac8gRQjwjtKgukMIwBRbq5+KAeEV5hXM4obYBOAghev41bDQWgFH4svYiU9UnQ5kNww2LgfyBdevCd2HXA==",
2845 | "requires": {
2846 | "symbol-observable": "1.0.1"
2847 | }
2848 | },
2849 | "safe-buffer": {
2850 | "version": "5.1.1",
2851 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
2852 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
2853 | "dev": true
2854 | },
2855 | "semver": {
2856 | "version": "5.5.0",
2857 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
2858 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
2859 | "dev": true
2860 | },
2861 | "send": {
2862 | "version": "0.15.2",
2863 | "resolved": "https://registry.npmjs.org/send/-/send-0.15.2.tgz",
2864 | "integrity": "sha1-+R+rRAO8+H5xb3DOtdsvV4vcF9Y=",
2865 | "dev": true,
2866 | "requires": {
2867 | "debug": "2.6.4",
2868 | "depd": "1.1.2",
2869 | "destroy": "1.0.4",
2870 | "encodeurl": "1.0.2",
2871 | "escape-html": "1.0.3",
2872 | "etag": "1.8.1",
2873 | "fresh": "0.5.0",
2874 | "http-errors": "1.6.2",
2875 | "mime": "1.3.4",
2876 | "ms": "1.0.0",
2877 | "on-finished": "2.3.0",
2878 | "range-parser": "1.2.0",
2879 | "statuses": "1.3.1"
2880 | },
2881 | "dependencies": {
2882 | "debug": {
2883 | "version": "2.6.4",
2884 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.4.tgz",
2885 | "integrity": "sha1-dYaps8OXQcAoKuM0RcTorHRzT+A=",
2886 | "dev": true,
2887 | "requires": {
2888 | "ms": "0.7.3"
2889 | },
2890 | "dependencies": {
2891 | "ms": {
2892 | "version": "0.7.3",
2893 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
2894 | "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=",
2895 | "dev": true
2896 | }
2897 | }
2898 | },
2899 | "fresh": {
2900 | "version": "0.5.0",
2901 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.0.tgz",
2902 | "integrity": "sha1-9HTKXmqSRtb9jglTz6m5yAWvp44=",
2903 | "dev": true
2904 | },
2905 | "http-errors": {
2906 | "version": "1.6.2",
2907 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
2908 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
2909 | "dev": true,
2910 | "requires": {
2911 | "depd": "1.1.1",
2912 | "inherits": "2.0.3",
2913 | "setprototypeof": "1.0.3",
2914 | "statuses": "1.3.1"
2915 | },
2916 | "dependencies": {
2917 | "depd": {
2918 | "version": "1.1.1",
2919 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
2920 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
2921 | "dev": true
2922 | }
2923 | }
2924 | },
2925 | "ms": {
2926 | "version": "1.0.0",
2927 | "resolved": "https://registry.npmjs.org/ms/-/ms-1.0.0.tgz",
2928 | "integrity": "sha1-Wa3NIu3FQ/e1OBhi0xOHsfS8lHM=",
2929 | "dev": true
2930 | },
2931 | "setprototypeof": {
2932 | "version": "1.0.3",
2933 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
2934 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=",
2935 | "dev": true
2936 | }
2937 | }
2938 | },
2939 | "serve-index": {
2940 | "version": "1.8.0",
2941 | "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.8.0.tgz",
2942 | "integrity": "sha1-fF2WwT+xMRAfk8HFd0+FFqHnjTs=",
2943 | "dev": true,
2944 | "requires": {
2945 | "accepts": "1.3.5",
2946 | "batch": "0.5.3",
2947 | "debug": "2.2.0",
2948 | "escape-html": "1.0.3",
2949 | "http-errors": "1.5.1",
2950 | "mime-types": "2.1.18",
2951 | "parseurl": "1.3.2"
2952 | },
2953 | "dependencies": {
2954 | "debug": {
2955 | "version": "2.2.0",
2956 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
2957 | "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
2958 | "dev": true,
2959 | "requires": {
2960 | "ms": "0.7.1"
2961 | }
2962 | },
2963 | "ms": {
2964 | "version": "0.7.1",
2965 | "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
2966 | "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
2967 | "dev": true
2968 | }
2969 | }
2970 | },
2971 | "serve-static": {
2972 | "version": "1.12.2",
2973 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.12.2.tgz",
2974 | "integrity": "sha1-5UbicmCBuBtLzsjpCAjrzdMjr7o=",
2975 | "dev": true,
2976 | "requires": {
2977 | "encodeurl": "1.0.2",
2978 | "escape-html": "1.0.3",
2979 | "parseurl": "1.3.2",
2980 | "send": "0.15.2"
2981 | }
2982 | },
2983 | "server-destroy": {
2984 | "version": "1.0.1",
2985 | "resolved": "https://registry.npmjs.org/server-destroy/-/server-destroy-1.0.1.tgz",
2986 | "integrity": "sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=",
2987 | "dev": true
2988 | },
2989 | "set-blocking": {
2990 | "version": "2.0.0",
2991 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2992 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
2993 | "dev": true
2994 | },
2995 | "set-immediate-shim": {
2996 | "version": "1.0.1",
2997 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
2998 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=",
2999 | "dev": true
3000 | },
3001 | "setprototypeof": {
3002 | "version": "1.0.2",
3003 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.2.tgz",
3004 | "integrity": "sha1-gaVSFB7BBLiOic44MQOtXGZWTQg=",
3005 | "dev": true
3006 | },
3007 | "sntp": {
3008 | "version": "1.0.9",
3009 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
3010 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
3011 | "dev": true,
3012 | "requires": {
3013 | "hoek": "2.16.3"
3014 | }
3015 | },
3016 | "socket.io": {
3017 | "version": "2.0.4",
3018 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.0.4.tgz",
3019 | "integrity": "sha1-waRZDO/4fs8TxyZS8Eb3FrKeYBQ=",
3020 | "dev": true,
3021 | "requires": {
3022 | "debug": "2.6.9",
3023 | "engine.io": "3.1.5",
3024 | "socket.io-adapter": "1.1.1",
3025 | "socket.io-client": "2.0.4",
3026 | "socket.io-parser": "3.1.3"
3027 | }
3028 | },
3029 | "socket.io-adapter": {
3030 | "version": "1.1.1",
3031 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz",
3032 | "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=",
3033 | "dev": true
3034 | },
3035 | "socket.io-client": {
3036 | "version": "2.0.4",
3037 | "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.0.4.tgz",
3038 | "integrity": "sha1-CRilUkBtxeVAs4Dc2Xr8SmQzL44=",
3039 | "dev": true,
3040 | "requires": {
3041 | "backo2": "1.0.2",
3042 | "base64-arraybuffer": "0.1.5",
3043 | "component-bind": "1.0.0",
3044 | "component-emitter": "1.2.1",
3045 | "debug": "2.6.9",
3046 | "engine.io-client": "3.1.6",
3047 | "has-cors": "1.1.0",
3048 | "indexof": "0.0.1",
3049 | "object-component": "0.0.3",
3050 | "parseqs": "0.0.5",
3051 | "parseuri": "0.0.5",
3052 | "socket.io-parser": "3.1.3",
3053 | "to-array": "0.1.4"
3054 | }
3055 | },
3056 | "socket.io-parser": {
3057 | "version": "3.1.3",
3058 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.1.3.tgz",
3059 | "integrity": "sha512-g0a2HPqLguqAczs3dMECuA1RgoGFPyvDqcbaDEdCWY9g59kdUAz3YRmaJBNKXflrHNwB7Q12Gkf/0CZXfdHR7g==",
3060 | "dev": true,
3061 | "requires": {
3062 | "component-emitter": "1.2.1",
3063 | "debug": "3.1.0",
3064 | "has-binary2": "1.0.2",
3065 | "isarray": "2.0.1"
3066 | },
3067 | "dependencies": {
3068 | "debug": {
3069 | "version": "3.1.0",
3070 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
3071 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
3072 | "dev": true,
3073 | "requires": {
3074 | "ms": "2.0.0"
3075 | }
3076 | }
3077 | }
3078 | },
3079 | "spawn-command": {
3080 | "version": "0.0.2-1",
3081 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2-1.tgz",
3082 | "integrity": "sha1-YvXpRmmBwbeW3Fkpk34RycaSG9A=",
3083 | "dev": true
3084 | },
3085 | "spdx-correct": {
3086 | "version": "3.0.0",
3087 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz",
3088 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==",
3089 | "dev": true,
3090 | "requires": {
3091 | "spdx-expression-parse": "3.0.0",
3092 | "spdx-license-ids": "3.0.0"
3093 | }
3094 | },
3095 | "spdx-exceptions": {
3096 | "version": "2.1.0",
3097 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz",
3098 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==",
3099 | "dev": true
3100 | },
3101 | "spdx-expression-parse": {
3102 | "version": "3.0.0",
3103 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
3104 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
3105 | "dev": true,
3106 | "requires": {
3107 | "spdx-exceptions": "2.1.0",
3108 | "spdx-license-ids": "3.0.0"
3109 | }
3110 | },
3111 | "spdx-license-ids": {
3112 | "version": "3.0.0",
3113 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz",
3114 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==",
3115 | "dev": true
3116 | },
3117 | "sshpk": {
3118 | "version": "1.14.1",
3119 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
3120 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
3121 | "dev": true,
3122 | "requires": {
3123 | "asn1": "0.2.3",
3124 | "assert-plus": "1.0.0",
3125 | "bcrypt-pbkdf": "1.0.1",
3126 | "dashdash": "1.14.1",
3127 | "ecc-jsbn": "0.1.1",
3128 | "getpass": "0.1.7",
3129 | "jsbn": "0.1.1",
3130 | "tweetnacl": "0.14.5"
3131 | },
3132 | "dependencies": {
3133 | "assert-plus": {
3134 | "version": "1.0.0",
3135 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
3136 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
3137 | "dev": true
3138 | }
3139 | }
3140 | },
3141 | "statuses": {
3142 | "version": "1.3.1",
3143 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz",
3144 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=",
3145 | "dev": true
3146 | },
3147 | "stream-throttle": {
3148 | "version": "0.1.3",
3149 | "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz",
3150 | "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=",
3151 | "dev": true,
3152 | "requires": {
3153 | "commander": "2.6.0",
3154 | "limiter": "1.1.2"
3155 | }
3156 | },
3157 | "string-width": {
3158 | "version": "1.0.2",
3159 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
3160 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
3161 | "dev": true,
3162 | "requires": {
3163 | "code-point-at": "1.1.0",
3164 | "is-fullwidth-code-point": "1.0.0",
3165 | "strip-ansi": "3.0.1"
3166 | },
3167 | "dependencies": {
3168 | "ansi-regex": {
3169 | "version": "2.1.1",
3170 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
3171 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
3172 | "dev": true
3173 | },
3174 | "strip-ansi": {
3175 | "version": "3.0.1",
3176 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3177 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3178 | "dev": true,
3179 | "requires": {
3180 | "ansi-regex": "2.1.1"
3181 | }
3182 | }
3183 | }
3184 | },
3185 | "string_decoder": {
3186 | "version": "1.0.3",
3187 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
3188 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
3189 | "dev": true,
3190 | "requires": {
3191 | "safe-buffer": "5.1.1"
3192 | }
3193 | },
3194 | "stringstream": {
3195 | "version": "0.0.5",
3196 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
3197 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
3198 | "dev": true
3199 | },
3200 | "strip-ansi": {
3201 | "version": "0.3.0",
3202 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz",
3203 | "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=",
3204 | "dev": true,
3205 | "requires": {
3206 | "ansi-regex": "0.2.1"
3207 | }
3208 | },
3209 | "strip-bom": {
3210 | "version": "2.0.0",
3211 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
3212 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
3213 | "dev": true,
3214 | "requires": {
3215 | "is-utf8": "0.2.1"
3216 | }
3217 | },
3218 | "supports-color": {
3219 | "version": "3.2.3",
3220 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
3221 | "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
3222 | "dev": true,
3223 | "requires": {
3224 | "has-flag": "1.0.0"
3225 | }
3226 | },
3227 | "symbol-observable": {
3228 | "version": "1.0.1",
3229 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz",
3230 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ="
3231 | },
3232 | "systemjs": {
3233 | "version": "0.20.19",
3234 | "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-0.20.19.tgz",
3235 | "integrity": "sha512-H/rKwNEEyej/+IhkmFNmKFyJul8tbH/muiPq5TyNoVTwsGhUjRsN3NlFnFQUvFXA3+GQmsXkCNXU6QKPl779aw=="
3236 | },
3237 | "tfunk": {
3238 | "version": "3.1.0",
3239 | "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.1.0.tgz",
3240 | "integrity": "sha1-OORBT8ZJd9h6/apy+sttKfgve1s=",
3241 | "dev": true,
3242 | "requires": {
3243 | "chalk": "1.1.3",
3244 | "object-path": "0.9.2"
3245 | },
3246 | "dependencies": {
3247 | "ansi-regex": {
3248 | "version": "2.1.1",
3249 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
3250 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
3251 | "dev": true
3252 | },
3253 | "ansi-styles": {
3254 | "version": "2.2.1",
3255 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
3256 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
3257 | "dev": true
3258 | },
3259 | "chalk": {
3260 | "version": "1.1.3",
3261 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3262 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3263 | "dev": true,
3264 | "requires": {
3265 | "ansi-styles": "2.2.1",
3266 | "escape-string-regexp": "1.0.5",
3267 | "has-ansi": "2.0.0",
3268 | "strip-ansi": "3.0.1",
3269 | "supports-color": "2.0.0"
3270 | }
3271 | },
3272 | "has-ansi": {
3273 | "version": "2.0.0",
3274 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
3275 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
3276 | "dev": true,
3277 | "requires": {
3278 | "ansi-regex": "2.1.1"
3279 | }
3280 | },
3281 | "strip-ansi": {
3282 | "version": "3.0.1",
3283 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3284 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3285 | "dev": true,
3286 | "requires": {
3287 | "ansi-regex": "2.1.1"
3288 | }
3289 | },
3290 | "supports-color": {
3291 | "version": "2.0.0",
3292 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3293 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3294 | "dev": true
3295 | }
3296 | }
3297 | },
3298 | "to-array": {
3299 | "version": "0.1.4",
3300 | "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
3301 | "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
3302 | "dev": true
3303 | },
3304 | "tough-cookie": {
3305 | "version": "2.3.4",
3306 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
3307 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
3308 | "dev": true,
3309 | "requires": {
3310 | "punycode": "1.4.1"
3311 | }
3312 | },
3313 | "tree-kill": {
3314 | "version": "1.2.0",
3315 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.0.tgz",
3316 | "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==",
3317 | "dev": true
3318 | },
3319 | "tslib": {
3320 | "version": "1.9.0",
3321 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz",
3322 | "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ=="
3323 | },
3324 | "tunnel-agent": {
3325 | "version": "0.6.0",
3326 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
3327 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
3328 | "dev": true,
3329 | "requires": {
3330 | "safe-buffer": "5.1.1"
3331 | }
3332 | },
3333 | "tweetnacl": {
3334 | "version": "0.14.5",
3335 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
3336 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
3337 | "dev": true,
3338 | "optional": true
3339 | },
3340 | "typescript": {
3341 | "version": "2.7.2",
3342 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz",
3343 | "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==",
3344 | "dev": true
3345 | },
3346 | "ua-parser-js": {
3347 | "version": "0.7.12",
3348 | "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.12.tgz",
3349 | "integrity": "sha1-BMgamb3V3FImPqKdJMa/jUgYpLs=",
3350 | "dev": true
3351 | },
3352 | "ultron": {
3353 | "version": "1.1.1",
3354 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
3355 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
3356 | "dev": true
3357 | },
3358 | "universalify": {
3359 | "version": "0.1.1",
3360 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz",
3361 | "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=",
3362 | "dev": true
3363 | },
3364 | "unpipe": {
3365 | "version": "1.0.0",
3366 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
3367 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
3368 | "dev": true
3369 | },
3370 | "util-deprecate": {
3371 | "version": "1.0.2",
3372 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
3373 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
3374 | "dev": true
3375 | },
3376 | "utils-merge": {
3377 | "version": "1.0.0",
3378 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz",
3379 | "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=",
3380 | "dev": true
3381 | },
3382 | "uuid": {
3383 | "version": "3.2.1",
3384 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
3385 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==",
3386 | "dev": true
3387 | },
3388 | "uws": {
3389 | "version": "9.14.0",
3390 | "resolved": "https://registry.npmjs.org/uws/-/uws-9.14.0.tgz",
3391 | "integrity": "sha512-HNMztPP5A1sKuVFmdZ6BPVpBQd5bUjNC8EFMFiICK+oho/OQsAJy5hnIx4btMHiOk8j04f/DbIlqnEZ9d72dqg==",
3392 | "dev": true,
3393 | "optional": true
3394 | },
3395 | "validate-npm-package-license": {
3396 | "version": "3.0.3",
3397 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz",
3398 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==",
3399 | "dev": true,
3400 | "requires": {
3401 | "spdx-correct": "3.0.0",
3402 | "spdx-expression-parse": "3.0.0"
3403 | }
3404 | },
3405 | "verror": {
3406 | "version": "1.10.0",
3407 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
3408 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
3409 | "dev": true,
3410 | "requires": {
3411 | "assert-plus": "1.0.0",
3412 | "core-util-is": "1.0.2",
3413 | "extsprintf": "1.3.0"
3414 | },
3415 | "dependencies": {
3416 | "assert-plus": {
3417 | "version": "1.0.0",
3418 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
3419 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
3420 | "dev": true
3421 | }
3422 | }
3423 | },
3424 | "which-module": {
3425 | "version": "1.0.0",
3426 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
3427 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
3428 | "dev": true
3429 | },
3430 | "window-size": {
3431 | "version": "0.1.4",
3432 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz",
3433 | "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=",
3434 | "dev": true
3435 | },
3436 | "wrap-ansi": {
3437 | "version": "2.1.0",
3438 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
3439 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
3440 | "dev": true,
3441 | "requires": {
3442 | "string-width": "1.0.2",
3443 | "strip-ansi": "3.0.1"
3444 | },
3445 | "dependencies": {
3446 | "ansi-regex": {
3447 | "version": "2.1.1",
3448 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
3449 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
3450 | "dev": true
3451 | },
3452 | "strip-ansi": {
3453 | "version": "3.0.1",
3454 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3455 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3456 | "dev": true,
3457 | "requires": {
3458 | "ansi-regex": "2.1.1"
3459 | }
3460 | }
3461 | }
3462 | },
3463 | "ws": {
3464 | "version": "3.3.3",
3465 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
3466 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
3467 | "dev": true,
3468 | "requires": {
3469 | "async-limiter": "1.0.0",
3470 | "safe-buffer": "5.1.1",
3471 | "ultron": "1.1.1"
3472 | }
3473 | },
3474 | "xmlhttprequest-ssl": {
3475 | "version": "1.5.5",
3476 | "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
3477 | "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
3478 | "dev": true
3479 | },
3480 | "y18n": {
3481 | "version": "3.2.1",
3482 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
3483 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
3484 | "dev": true
3485 | },
3486 | "yargs": {
3487 | "version": "6.4.0",
3488 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.4.0.tgz",
3489 | "integrity": "sha1-gW4ahm1VmMzzTlWW3c4i2S2kkNQ=",
3490 | "dev": true,
3491 | "requires": {
3492 | "camelcase": "3.0.0",
3493 | "cliui": "3.2.0",
3494 | "decamelize": "1.2.0",
3495 | "get-caller-file": "1.0.2",
3496 | "os-locale": "1.4.0",
3497 | "read-pkg-up": "1.0.1",
3498 | "require-directory": "2.1.1",
3499 | "require-main-filename": "1.0.1",
3500 | "set-blocking": "2.0.0",
3501 | "string-width": "1.0.2",
3502 | "which-module": "1.0.0",
3503 | "window-size": "0.2.0",
3504 | "y18n": "3.2.1",
3505 | "yargs-parser": "4.2.1"
3506 | },
3507 | "dependencies": {
3508 | "camelcase": {
3509 | "version": "3.0.0",
3510 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
3511 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
3512 | "dev": true
3513 | },
3514 | "window-size": {
3515 | "version": "0.2.0",
3516 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz",
3517 | "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=",
3518 | "dev": true
3519 | }
3520 | }
3521 | },
3522 | "yargs-parser": {
3523 | "version": "4.2.1",
3524 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
3525 | "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
3526 | "dev": true,
3527 | "requires": {
3528 | "camelcase": "3.0.0"
3529 | },
3530 | "dependencies": {
3531 | "camelcase": {
3532 | "version": "3.0.0",
3533 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
3534 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
3535 | "dev": true
3536 | }
3537 | }
3538 | },
3539 | "yeast": {
3540 | "version": "0.1.2",
3541 | "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
3542 | "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
3543 | "dev": true
3544 | },
3545 | "zone.js": {
3546 | "version": "0.8.20",
3547 | "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.20.tgz",
3548 | "integrity": "sha512-FXlA37ErSXCMy5RNBcGFgCI/Zivqzr0D19GuvDxhcYIJc7xkFp6c29DKyODJu0Zo+EMyur/WPPgcBh1EHjB9jA=="
3549 | }
3550 | }
3551 | }
3552 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "angular2-registration-login-example",
3 | "version": "1.0.0",
4 | "repository": {
5 | "type": "git",
6 | "url": "https://github.com/cornflourblue/angular2-registration-login-example.git"
7 | },
8 | "scripts": {
9 | "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
10 | "lite": "lite-server",
11 | "tsc": "tsc",
12 | "tsc:w": "tsc -w"
13 | },
14 | "license": "MIT",
15 | "dependencies": {
16 | "@angular/common": "^5.0.0",
17 | "@angular/compiler": "^5.0.0",
18 | "@angular/core": "^5.0.0",
19 | "@angular/forms": "^5.0.0",
20 | "@angular/platform-browser": "^5.0.0",
21 | "@angular/platform-browser-dynamic": "^5.0.0",
22 | "@angular/router": "^5.0.0",
23 | "core-js": "^2.4.1",
24 | "rxjs": "^5.2.0",
25 | "systemjs": "^0.20.19",
26 | "zone.js": "^0.8.5"
27 | },
28 | "devDependencies": {
29 | "@types/node": "^8.0.53",
30 | "concurrently": "^3.1.0",
31 | "lite-server": "^2.3.0",
32 | "typescript": "^2.2.2"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/systemjs.config.js:
--------------------------------------------------------------------------------
1 | /**
2 | * System configuration for Angular 2 samples
3 | * Adjust as necessary for your application needs.
4 | */
5 | (function (global) {
6 | System.config({
7 | paths: {
8 | // paths serve as alias
9 | 'npm:': 'node_modules/'
10 | },
11 | // map tells the System loader where to look for things
12 | map: {
13 | // our app is within the app folder
14 | app: 'app',
15 |
16 | // angular bundles
17 | '@angular/core': 'npm:@angular/core/bundles/core.umd.js',
18 | '@angular/common': 'npm:@angular/common/bundles/common.umd.js',
19 | '@angular/common/http': 'npm:@angular/common/bundles/common-http.umd.js',
20 | '@angular/compiler': 'npm:@angular/compiler/bundles/compiler.umd.js',
21 | '@angular/platform-browser': 'npm:@angular/platform-browser/bundles/platform-browser.umd.js',
22 | '@angular/platform-browser-dynamic': 'npm:@angular/platform-browser-dynamic/bundles/platform-browser-dynamic.umd.js',
23 | '@angular/router': 'npm:@angular/router/bundles/router.umd.js',
24 | '@angular/forms': 'npm:@angular/forms/bundles/forms.umd.js',
25 |
26 | // other libraries
27 | 'rxjs': 'npm:rxjs',
28 | 'tslib': 'npm:tslib/tslib.js'
29 | },
30 | // packages tells the System loader how to load when no filename and/or no extension
31 | packages: {
32 | app: {
33 | main: './main.js',
34 | defaultExtension: 'js'
35 | },
36 | rxjs: {
37 | defaultExtension: 'js'
38 | }
39 | }
40 | });
41 | })(this);
42 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "emitDecoratorMetadata": true,
4 | "experimentalDecorators": true,
5 | "lib": [ "es2015", "dom" ],
6 | "module": "commonjs",
7 | "moduleResolution": "node",
8 | "noImplicitAny": true,
9 | "sourceMap": true,
10 | "suppressImplicitAnyIndexErrors": true,
11 | "target": "es5"
12 | },
13 | "exclude": [
14 | "node_modules/*"
15 | ]
16 | }
--------------------------------------------------------------------------------