├── .gitignore ├── LICENSE ├── README.md ├── client ├── .editorconfig ├── .gitignore ├── README.md ├── angular.json ├── package.json ├── proxy.conf.json ├── src │ ├── app │ │ ├── app.component.css │ │ ├── app.component.html │ │ ├── app.component.spec.ts │ │ ├── app.component.ts │ │ ├── app.module.ts │ │ ├── course-detail │ │ │ ├── course-detail.component.css │ │ │ ├── course-detail.component.html │ │ │ ├── course-detail.component.spec.ts │ │ │ └── course-detail.component.ts │ │ ├── index.ts │ │ └── services │ │ │ ├── courses.service.spec.ts │ │ │ └── courses.service.ts │ ├── assets │ │ ├── .gitkeep │ │ └── app.css │ ├── environments │ │ ├── environment.prod.ts │ │ └── environment.ts │ ├── favicon.ico │ ├── index.html │ ├── main.ts │ ├── polyfills.ts │ ├── styles.css │ ├── test.ts │ ├── tsconfig.app.json │ ├── tsconfig.spec.json │ └── typings.d.ts ├── tsconfig.json ├── tslint.json └── yarn.lock ├── favicon.ico ├── index.html ├── package.json ├── results.json ├── samples ├── buildPersonData.ts ├── decorators.ts ├── generics.ts ├── hello-world.ts ├── learning-types.ts ├── logMessage.ts ├── my-lodash.d.ts ├── object-oriented.ts └── other.ts ├── server ├── api │ ├── api.ts │ ├── apiCreateLesson.ts │ ├── apiDeleteLesson.ts │ ├── apiErrorHandler.ts │ ├── apiGetAllCourses.ts │ ├── apiGetCourseDetail.ts │ ├── apiPatchLesson.ts │ ├── databaseErrorHandler.ts │ ├── onError.ts │ └── onSuccess.ts ├── model │ ├── initCourseModel.ts │ ├── initLessonModel.ts │ └── model.ts ├── queries │ ├── createLesson.ts │ ├── deleteLesson.ts │ ├── findAllCourses.ts │ ├── findCourseDetail.ts │ └── updateLesson.ts └── server.ts ├── shared └── model │ ├── course-detail.ts │ ├── course-summary.ts │ ├── createCourseDetail.ts │ └── lesson.ts ├── sql ├── db-schema-create-and-populate.sql ├── db-schema-drop.sql └── valid-lesson-post.json ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /__build__ 2 | /__server_build__ 3 | /node_modules 4 | /typings 5 | /tsd_typings/ 6 | npm-debug.log 7 | dist 8 | .idea 9 | .DS_Store 10 | tmp 11 | perf-logs 12 | v8.log 13 | *.js 14 | *.js.map 15 | 16 | 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Angular University 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 | 2 | # Repository contents 3 | 4 | This repository contains the full application of the [Complete Typescript Course](https://angular-university.io/course/typescript-2-tutorial). 5 | 6 | ![Complete Typescript Course](https://angular-academy.s3.amazonaws.com/thumbnails/typescript-2-small.png) 7 | 8 | 9 | # Angular University Lessons Code 10 | Contains the code for several of the Angular University courses. 11 | 12 | [Angular for Beginners Course](https://angular-university.io/course/getting-started-with-angular2) 13 | 14 | ![Angular for Beginners course](https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small-v2.png) 15 | 16 | 17 | # Angular 2 and Firebase - Build a Web Application Course 18 | 19 | If you are looking for the Angular 2 and Firebase - Build a Web Application Course code, the repo with the full code can be found here: 20 | 21 | [Angular 2 and Firebase - Build a Web Application](https://angular-university.io/course/build-an-application-with-angular2) 22 | 23 | [Github repo for this course](https://github.com/angular-university/angular-firebase-app) 24 | 25 | ![Angular firebase course](https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg) 26 | 27 | 28 | # Angular Ngrx Reactive Extensions Architecture Course 29 | 30 | If you are looking for the Angular Ngrx Reactive Extensions Architecture Course code, the repo with the full code can be found here: 31 | 32 | [Angular Ngrx Reactive Extensions Architecture Course](https://github.com/angular-university/ngrx-course) 33 | 34 | [Github repo for this course](https://angular-university.io/course/angular2-ngrx) 35 | 36 | ![Angular Ngrx Course](https://angular-academy.s3.amazonaws.com/thumbnails/ngrx-angular.png) 37 | 38 | 39 | 40 | # Installation pre-requisites 41 | 42 | For running this project we need and npm installed on our machine. These are some tutorials to install node in different operating systems: 43 | 44 | *Its important to install the latest version of Node* 45 | 46 | - [Install Node and NPM on Windows](https://www.youtube.com/watch?v=8ODS6RM6x7g) 47 | - [Install Node and NPM on Linux](https://www.youtube.com/watch?v=yUdHk-Dk_BY) 48 | - [Install Node and NPM on Mac](https://www.youtube.com/watch?v=Imj8PgG3bZU) 49 | 50 | 51 | # Installing the Angular CLI 52 | 53 | With the following command the angular-cli will be installed globally in your machine: 54 | 55 | npm install -g @angular/cli 56 | 57 | -------------------------------------------------------------------------------- /client/.editorconfig: -------------------------------------------------------------------------------- 1 | # Editor configuration, see http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | charset = utf-8 6 | indent_style = space 7 | indent_size = 2 8 | insert_final_newline = true 9 | trim_trailing_whitespace = true 10 | 11 | [*.md] 12 | max_line_length = 0 13 | trim_trailing_whitespace = false 14 | -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # compiled output 4 | /dist 5 | /tmp 6 | 7 | # dependencies 8 | /node_modules 9 | /bower_components 10 | 11 | # IDEs and editors 12 | /.idea 13 | /.vscode 14 | .project 15 | .classpath 16 | *.launch 17 | .settings/ 18 | 19 | # misc 20 | /.sass-cache 21 | /connect.lock 22 | /coverage/* 23 | /libpeerconnection.log 24 | npm-debug.log 25 | testem.log 26 | /typings 27 | 28 | # e2e 29 | /e2e/*.js 30 | /e2e/*.map 31 | 32 | #System Files 33 | .DS_Store 34 | Thumbs.db 35 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Client 2 | 3 | This project was generated with [angular-cli](https://github.com/angular/angular-cli) version 1.0.0-beta.19-3. 4 | 5 | ## Development server 6 | Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. 7 | 8 | ## Code scaffolding 9 | 10 | Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class`. 11 | 12 | ## Build 13 | 14 | Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build. 15 | 16 | ## Running unit tests 17 | 18 | Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). 19 | 20 | ## Running end-to-end tests 21 | 22 | Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). 23 | Before running the tests make sure you are serving the app via `ng serve`. 24 | 25 | ## Deploying to Github Pages 26 | 27 | Run `ng github-pages:deploy` to deploy to Github Pages. 28 | 29 | ## Further help 30 | 31 | To get more help on the `angular-cli` use `ng --help` or go check out the [Angular-CLI README](https://github.com/angular/angular-cli/blob/master/README.md). 32 | -------------------------------------------------------------------------------- /client/angular.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "./node_modules/@angular/cli/lib/config/schema.json", 3 | "version": 1, 4 | "newProjectRoot": "projects", 5 | "projects": { 6 | "complete-typescript-course": { 7 | "root": "", 8 | "sourceRoot": "src", 9 | "projectType": "application", 10 | "architect": { 11 | "build": { 12 | "builder": "@angular-devkit/build-angular:browser", 13 | "options": { 14 | "outputPath": "dist", 15 | "index": "src/index.html", 16 | "main": "src/main.ts", 17 | "tsConfig": "src/tsconfig.app.json", 18 | "polyfills": "src/polyfills.ts", 19 | "assets": [ 20 | "src/assets", 21 | "src/favicon.ico" 22 | ], 23 | "styles": [ 24 | "src/styles.css" 25 | ], 26 | "scripts": [] 27 | }, 28 | "configurations": { 29 | "production": { 30 | "optimization": true, 31 | "outputHashing": "all", 32 | "sourceMap": false, 33 | "extractCss": true, 34 | "namedChunks": false, 35 | "aot": true, 36 | "extractLicenses": true, 37 | "vendorChunk": false, 38 | "buildOptimizer": true, 39 | "fileReplacements": [ 40 | { 41 | "replace": "src/environments/environment.ts", 42 | "with": "src/environments/environment.prod.ts" 43 | } 44 | ] 45 | } 46 | } 47 | }, 48 | "serve": { 49 | "builder": "@angular-devkit/build-angular:dev-server", 50 | "options": { 51 | "browserTarget": "complete-typescript-course:build" 52 | }, 53 | "configurations": { 54 | "production": { 55 | "browserTarget": "complete-typescript-course:build:production" 56 | } 57 | } 58 | }, 59 | "extract-i18n": { 60 | "builder": "@angular-devkit/build-angular:extract-i18n", 61 | "options": { 62 | "browserTarget": "complete-typescript-course:build" 63 | } 64 | }, 65 | "test": { 66 | "builder": "@angular-devkit/build-angular:karma", 67 | "options": { 68 | "main": "src/test.ts", 69 | "karmaConfig": "./karma.conf.js", 70 | "polyfills": "src/polyfills.ts", 71 | "tsConfig": "src/tsconfig.spec.json", 72 | "scripts": [], 73 | "styles": [ 74 | "src/styles.css" 75 | ], 76 | "assets": [ 77 | "src/assets", 78 | "src/favicon.ico" 79 | ] 80 | } 81 | }, 82 | "lint": { 83 | "builder": "@angular-devkit/build-angular:tslint", 84 | "options": { 85 | "tsConfig": [ 86 | "src/tsconfig.app.json", 87 | "src/tsconfig.spec.json" 88 | ], 89 | "exclude": [] 90 | } 91 | } 92 | } 93 | }, 94 | "complete-typescript-course-e2e": { 95 | "root": "", 96 | "sourceRoot": "", 97 | "projectType": "application", 98 | "architect": { 99 | "e2e": { 100 | "builder": "@angular-devkit/build-angular:protractor", 101 | "options": { 102 | "protractorConfig": "./protractor.conf.js", 103 | "devServerTarget": "complete-typescript-course:serve" 104 | } 105 | }, 106 | "lint": { 107 | "builder": "@angular-devkit/build-angular:tslint", 108 | "options": { 109 | "tsConfig": [ 110 | "e2e/tsconfig.e2e.json" 111 | ], 112 | "exclude": [] 113 | } 114 | } 115 | } 116 | } 117 | }, 118 | "defaultProject": "complete-typescript-course", 119 | "schematics": { 120 | "@schematics/angular:component": { 121 | "prefix": "app", 122 | "styleext": "css" 123 | }, 124 | "@schematics/angular:directive": { 125 | "prefix": "app" 126 | } 127 | } 128 | } -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "complete-typescript-course-client", 3 | "version": "0.0.0", 4 | "license": "MIT", 5 | "scripts": { 6 | "ng": "ng", 7 | "start": "./node_modules/.bin/ng serve --proxy-config ./proxy.conf.json", 8 | "build": "./node_modules/.bin/ng build", 9 | "test": "./node_modules/.bin/ng test", 10 | "lint": "./node_modules/.bin/ng lint", 11 | "e2e": "./node_modules/.bin/ng e2e" 12 | }, 13 | "private": true, 14 | "dependencies": { 15 | "@angular/animations": "7.0.0", 16 | "@angular/common": "7.0.0", 17 | "@angular/compiler": "7.0.0", 18 | "@angular/core": "7.0.0", 19 | "@angular/forms": "7.0.0", 20 | "@angular/http": "7.0.0", 21 | "@angular/platform-browser": "7.0.0", 22 | "@angular/platform-browser-dynamic": "7.0.0", 23 | "@angular/router": "7.0.0", 24 | "core-js": "^2.4.1", 25 | "rxjs": "6.3.3", 26 | "zone.js": "0.8.26", 27 | "rxjs-compat": "^6.0.0-rc.0" 28 | }, 29 | "devDependencies": { 30 | "@angular/cli": "^7.0.0", 31 | "@angular/compiler-cli": "7.0.0", 32 | "@angular/language-service": "7.0.0", 33 | "@types/jasmine": "~2.5.53", 34 | "@types/jasminewd2": "~2.0.2", 35 | "@types/node": "~6.0.60", 36 | "codelyzer": "~4.2.0", 37 | "jasmine-core": "~2.6.2", 38 | "jasmine-spec-reporter": "~4.1.0", 39 | "karma": "~1.7.0", 40 | "karma-chrome-launcher": "~2.1.1", 41 | "karma-cli": "~1.0.1", 42 | "karma-coverage-istanbul-reporter": "^1.2.1", 43 | "karma-jasmine": "~1.1.0", 44 | "karma-jasmine-html-reporter": "^0.2.2", 45 | "protractor": "~5.1.2", 46 | "ts-node": "~3.2.0", 47 | "tslint": "~5.7.0", 48 | "typescript": "~3.1.3", 49 | "@angular-devkit/build-angular": "~0.10.0" 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /client/proxy.conf.json: -------------------------------------------------------------------------------- 1 | 2 | { 3 | "/api": { 4 | "target": "http://localhost:8090", 5 | "secure": false 6 | } 7 | } -------------------------------------------------------------------------------- /client/src/app/app.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angular-university/typescript-course/00ae11a2ca27e662207b63d353e0daeabbceb50b/client/src/app/app.component.css -------------------------------------------------------------------------------- /client/src/app/app.component.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 |
5 | 6 |
7 |
8 | 9 |
10 |
11 | 12 |
13 | 14 |
-------------------------------------------------------------------------------- /client/src/app/app.component.spec.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable:no-unused-variable */ 2 | 3 | import { TestBed, async } from '@angular/core/testing'; 4 | import { AppComponent } from './app.component'; 5 | 6 | describe('App: Client', () => { 7 | beforeEach(() => { 8 | TestBed.configureTestingModule({ 9 | declarations: [ 10 | AppComponent 11 | ], 12 | }); 13 | }); 14 | 15 | it('should create the app', async(() => { 16 | let fixture = TestBed.createComponent(AppComponent); 17 | let app = fixture.debugElement.componentInstance; 18 | expect(app).toBeTruthy(); 19 | })); 20 | 21 | it(`should have as title 'app works!'`, async(() => { 22 | let fixture = TestBed.createComponent(AppComponent); 23 | let app = fixture.debugElement.componentInstance; 24 | expect(app.title).toEqual('app works!'); 25 | })); 26 | 27 | it('should render title in a h1 tag', async(() => { 28 | let fixture = TestBed.createComponent(AppComponent); 29 | fixture.detectChanges(); 30 | let compiled = fixture.debugElement.nativeElement; 31 | expect(compiled.querySelector('h1').textContent).toContain('app works!'); 32 | })); 33 | }); 34 | -------------------------------------------------------------------------------- /client/src/app/app.component.ts: -------------------------------------------------------------------------------- 1 | import {Component, OnInit} from '@angular/core'; 2 | import {CoursesService} from "./services/courses.service"; 3 | import {CourseDetail} from "../../../shared/model/course-detail"; 4 | import {Observable} from "rxjs"; 5 | 6 | @Component({ 7 | selector: 'app-root', 8 | templateUrl: './app.component.html', 9 | styleUrls: ['./app.component.css'] 10 | }) 11 | export class AppComponent implements OnInit { 12 | 13 | course$: Observable; 14 | 15 | constructor(private coursesService:CoursesService) { 16 | 17 | } 18 | 19 | ngOnInit() { 20 | this.course$ = this.coursesService.loadCourseDetail(1); 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /client/src/app/app.module.ts: -------------------------------------------------------------------------------- 1 | import { BrowserModule } from '@angular/platform-browser'; 2 | import { NgModule } from '@angular/core'; 3 | import { FormsModule } from '@angular/forms'; 4 | import { HttpModule } from '@angular/http'; 5 | 6 | import { AppComponent } from './app.component'; 7 | import { CourseDetailComponent } from './course-detail/course-detail.component'; 8 | import {CoursesService} from "./services/courses.service"; 9 | 10 | import 'rxjs/add/operator/map'; 11 | 12 | @NgModule({ 13 | declarations: [ 14 | AppComponent, 15 | CourseDetailComponent 16 | ], 17 | imports: [ 18 | BrowserModule, 19 | FormsModule, 20 | HttpModule 21 | ], 22 | providers: [CoursesService], 23 | bootstrap: [AppComponent] 24 | }) 25 | export class AppModule { } 26 | -------------------------------------------------------------------------------- /client/src/app/course-detail/course-detail.component.css: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angular-university/typescript-course/00ae11a2ca27e662207b63d353e0daeabbceb50b/client/src/app/course-detail/course-detail.component.css -------------------------------------------------------------------------------- /client/src/app/course-detail/course-detail.component.html: -------------------------------------------------------------------------------- 1 |

{{courseDetail?.description}}

2 | 3 | 4 |
5 | 6 | 7 | 8 | 9 | 10 | 14 | 15 | 16 |
{{lesson.description}} 11 | access_time 12 | {{lesson.duration}} 13 |
17 | 18 |
19 | -------------------------------------------------------------------------------- /client/src/app/course-detail/course-detail.component.spec.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable:no-unused-variable */ 2 | import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 3 | import { By } from '@angular/platform-browser'; 4 | import { DebugElement } from '@angular/core'; 5 | 6 | import { CourseDetailComponent } from './course-detail.component'; 7 | 8 | describe('CourseDetailComponent', () => { 9 | let component: CourseDetailComponent; 10 | let fixture: ComponentFixture; 11 | 12 | beforeEach(async(() => { 13 | TestBed.configureTestingModule({ 14 | declarations: [ CourseDetailComponent ] 15 | }) 16 | .compileComponents(); 17 | })); 18 | 19 | beforeEach(() => { 20 | fixture = TestBed.createComponent(CourseDetailComponent); 21 | component = fixture.componentInstance; 22 | fixture.detectChanges(); 23 | }); 24 | 25 | it('should create', () => { 26 | expect(component).toBeTruthy(); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /client/src/app/course-detail/course-detail.component.ts: -------------------------------------------------------------------------------- 1 | import { Component, OnInit ,Input} from '@angular/core'; 2 | import {CourseDetail} from "../../../../shared/model/course-detail"; 3 | 4 | @Component({ 5 | selector: 'course-detail', 6 | templateUrl: './course-detail.component.html', 7 | styleUrls: ['./course-detail.component.css'] 8 | }) 9 | export class CourseDetailComponent implements OnInit { 10 | 11 | @Input() 12 | courseDetail:CourseDetail; 13 | 14 | constructor() { 15 | 16 | 17 | } 18 | 19 | ngOnInit() { 20 | 21 | 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /client/src/app/index.ts: -------------------------------------------------------------------------------- 1 | export * from './app.component'; 2 | export * from './app.module'; 3 | -------------------------------------------------------------------------------- /client/src/app/services/courses.service.spec.ts: -------------------------------------------------------------------------------- 1 | /* tslint:disable:no-unused-variable */ 2 | 3 | import { TestBed, async, inject } from '@angular/core/testing'; 4 | import { CoursesService } from './courses.service'; 5 | 6 | describe('Service: Courses', () => { 7 | beforeEach(() => { 8 | TestBed.configureTestingModule({ 9 | providers: [CoursesService] 10 | }); 11 | }); 12 | 13 | it('should ...', inject([CoursesService], (service: CoursesService) => { 14 | expect(service).toBeTruthy(); 15 | })); 16 | }); 17 | -------------------------------------------------------------------------------- /client/src/app/services/courses.service.ts: -------------------------------------------------------------------------------- 1 | import { Injectable } from '@angular/core'; 2 | import {Http} from "@angular/http"; 3 | import {Observable} from "rxjs"; 4 | import {CourseDetail} from "../../../../shared/model/course-detail"; 5 | 6 | 7 | 8 | @Injectable() 9 | export class CoursesService { 10 | 11 | constructor(private http:Http) { 12 | 13 | 14 | } 15 | 16 | loadCourseDetail(courseId: number) :Observable { 17 | 18 | return this.http.get(`/api/courses/${courseId}`) 19 | .map(res => res.json().payload); 20 | } 21 | 22 | 23 | } 24 | -------------------------------------------------------------------------------- /client/src/assets/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angular-university/typescript-course/00ae11a2ca27e662207b63d353e0daeabbceb50b/client/src/assets/.gitkeep -------------------------------------------------------------------------------- /client/src/assets/app.css: -------------------------------------------------------------------------------- 1 | 2 | .lesson { 3 | margin: 25px auto 0 auto; 4 | max-width: 350px; 5 | } 6 | 7 | .lessons-list { 8 | padding: 10px 10px 0 10px; 9 | display: table-cell; 10 | margin-bottom: 15px; 11 | } 12 | 13 | .lessons-list tr { 14 | border-bottom: 1px solid darkgray; 15 | cursor: pointer; 16 | } 17 | 18 | .lessons-list td { 19 | padding-bottom: 5px; 20 | } 21 | 22 | .lesson-logo { 23 | height: 20px; 24 | margin-right: 10px; 25 | } 26 | 27 | .add-lesson { 28 | width: 350px; 29 | margin-bottom: 15px; 30 | } 31 | 32 | .md-icon { 33 | font-family: 'Material Icons'; 34 | text-rendering: optimizeLegibility; 35 | font-feature-settings: "liga" 1; 36 | font-style: normal; 37 | text-transform: none; 38 | line-height: 1; 39 | width: 24px; 40 | height: 24px; 41 | display: inline-block; 42 | overflow: hidden; 43 | -webkit-font-smoothing: antialiased; 44 | -moz-osx-font-smoothing: grayscale; 45 | } 46 | 47 | .collapsible-indicator { 48 | font-size: 30px; 49 | line-height:30px; 50 | } 51 | 52 | 53 | .collapsible-section { 54 | padding: 0 20px 20px 20px; 55 | } 56 | 57 | .collapsed .collapsible-section { 58 | display: none; 59 | } 60 | 61 | 62 | .disable-text-selection { 63 | -webkit-touch-callout: none; 64 | -webkit-user-select: none; 65 | -moz-user-select: none; 66 | -ms-user-select: none; 67 | user-select: none; 68 | } 69 | 70 | 71 | .course-logo { 72 | height: 75px; 73 | margin: 0 auto; 74 | background-color: #FAFAFA; 75 | background-image: url(https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png); 76 | background-repeat: no-repeat; 77 | background-position-x: center; 78 | background-size: 65px; 79 | background-position-y: center; 80 | } 81 | 82 | form label { 83 | width: 100px; 84 | display: inline-block; 85 | text-align: right; 86 | vertical-align: top; 87 | margin-right: 5px; 88 | } 89 | 90 | .field-error-message { 91 | text-align: right; 92 | padding-right: 68px; 93 | font-size: 16px; 94 | color: #a10000; 95 | } 96 | 97 | form fieldset { 98 | margin-bottom: 20px; 99 | } 100 | 101 | form textarea { 102 | width: 170px; 103 | } 104 | 105 | form input[type='radio'] { 106 | box-shadow: none; 107 | width: 20px; 108 | vertical-align: bottom; 109 | margin-left: 10px; 110 | } 111 | 112 | form button[type='submit'] { 113 | float: right; 114 | margin-right: 75px; 115 | } 116 | 117 | .debug { 118 | clear: both; 119 | font-size: 14px; 120 | } 121 | 122 | .debug h3 { 123 | margin-top: 20px; 124 | margin-bottom: 5px; 125 | } 126 | 127 | .form-field { 128 | margin-bottom: 15px; 129 | } 130 | 131 | .lesson-button { 132 | background: #1976d2; 133 | color: white; 134 | font-weight: bold; 135 | } 136 | 137 | .lesson-button[disabled] { 138 | background: grey; 139 | color: white; 140 | cursor: not-allowed; 141 | } 142 | 143 | button[disabled] { 144 | cursor: not-allowed; 145 | opacity: 0.5; 146 | } 147 | 148 | 149 | .top-menu { 150 | margin-bottom: 30px; 151 | } 152 | 153 | 154 | 155 | 156 | .ng-dirty.ng-invalid { 157 | border: 2px solid #ff2118; 158 | } 159 | 160 | .ng-touched.ng-invalid { 161 | border: 1px solid #cccccc !important; 162 | } 163 | 164 | 165 | form.ng-dirty.ng-invalid { 166 | border:none; 167 | } 168 | 169 | form.ng-touched.ng-invalid { 170 | border:none !important; 171 | } 172 | 173 | .l-header img { 174 | cursor: pointer; 175 | } 176 | 177 | .youtube-logo { 178 | max-height: 100px; 179 | border-radius: 4px; 180 | } 181 | 182 | .lessons-list { 183 | text-align: left; 184 | } 185 | 186 | .home-screen { 187 | margin-top: 50px; 188 | } 189 | 190 | .courses-list { 191 | padding: 5px 10px; 192 | text-align: left; 193 | } 194 | 195 | 196 | table.courses-list tr { 197 | border-bottom: 1px solid darkgray; 198 | } 199 | 200 | table.courses-list tr td { 201 | padding: 5px 0; 202 | } 203 | 204 | table.courses-list tr td.description { 205 | padding-right: 15px; 206 | } 207 | 208 | table.courses-list tr td:first-child { 209 | padding-left: 15px; 210 | } 211 | 212 | table.courses-list tr td:last-child { 213 | padding-right: 15px; 214 | } 215 | 216 | ul.top-menu > li > a.menu-active { 217 | color: #ee1c1b; 218 | font-weight: bold; 219 | text-decoration: underline; 220 | } 221 | 222 | .nav-button { 223 | margin-bottom: 20px; 224 | } 225 | 226 | .playlist { 227 | float: right; 228 | } 229 | 230 | .main-container .list { 231 | display: inline-block; 232 | max-width: 270px; 233 | vertical-align: top; 234 | margin-right: 50px; 235 | } 236 | 237 | 238 | .nav-fields { 239 | margin-bottom: 40px; 240 | } 241 | 242 | .course-summary { 243 | cursor: pointer; 244 | } 245 | 246 | .chat { 247 | 248 | } 249 | 250 | img.dashboard-section { 251 | display: block; 252 | max-height: 300px; 253 | margin: 0 auto 50px auto; 254 | 255 | } 256 | 257 | .toggle-buttons { 258 | margin-bottom: 15px; 259 | } 260 | 261 | .graph-toggle { 262 | width: 30px; 263 | box-shadow: none; 264 | vertical-align: bottom; 265 | } 266 | 267 | 268 | 269 | .l-header { 270 | height: 58px; 271 | } 272 | 273 | .top-menu { 274 | margin-left: 50px; 275 | } 276 | 277 | .top-menu li { 278 | box-shadow: none !important; 279 | } 280 | 281 | .l-sample-app { 282 | text-align: center; 283 | } 284 | 285 | .tools-bar { 286 | text-align: right; 287 | margin-top: 30px; 288 | } 289 | 290 | .login-form { 291 | width: 350px; 292 | } 293 | 294 | .search-bar { 295 | margin-bottom: 30px; 296 | width: 250px; 297 | } -------------------------------------------------------------------------------- /client/src/environments/environment.prod.ts: -------------------------------------------------------------------------------- 1 | export const environment = { 2 | production: true 3 | }; 4 | -------------------------------------------------------------------------------- /client/src/environments/environment.ts: -------------------------------------------------------------------------------- 1 | // The file contents for the current environment will overwrite these during build. 2 | // The build system defaults to the dev environment which uses `environment.ts`, but if you do 3 | // `ng build --env=prod` then `environment.prod.ts` will be used instead. 4 | // The list of which env maps to which file can be found in `angular-cli.json`. 5 | 6 | export const environment = { 7 | production: false 8 | }; 9 | -------------------------------------------------------------------------------- /client/src/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angular-university/typescript-course/00ae11a2ca27e662207b63d353e0daeabbceb50b/client/src/favicon.ico -------------------------------------------------------------------------------- /client/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Client 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | 15 | 16 | 17 | Loading... 18 | 19 | 20 | -------------------------------------------------------------------------------- /client/src/main.ts: -------------------------------------------------------------------------------- 1 | import './polyfills.ts'; 2 | 3 | import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; 4 | import { enableProdMode } from '@angular/core'; 5 | import { environment } from './environments/environment'; 6 | import { AppModule } from './app/'; 7 | 8 | if (environment.production) { 9 | enableProdMode(); 10 | } 11 | 12 | platformBrowserDynamic().bootstrapModule(AppModule); 13 | -------------------------------------------------------------------------------- /client/src/polyfills.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This file includes polyfills needed by Angular and is loaded before the app. 3 | * You can add your own extra polyfills to this file. 4 | * 5 | * This file is divided into 2 sections: 6 | * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. 7 | * 2. Application imports. Files imported after ZoneJS that should be loaded before your main 8 | * file. 9 | * 10 | * The current setup is for so-called "evergreen" browsers; the last versions of browsers that 11 | * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), 12 | * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. 13 | * 14 | * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html 15 | */ 16 | 17 | /*************************************************************************************************** 18 | * BROWSER POLYFILLS 19 | */ 20 | 21 | /** IE9, IE10 and IE11 requires all of the following polyfills. **/ 22 | // import 'core-js/es6/symbol'; 23 | // import 'core-js/es6/object'; 24 | // import 'core-js/es6/function'; 25 | // import 'core-js/es6/parse-int'; 26 | // import 'core-js/es6/parse-float'; 27 | // import 'core-js/es6/number'; 28 | // import 'core-js/es6/math'; 29 | // import 'core-js/es6/string'; 30 | // import 'core-js/es6/date'; 31 | // import 'core-js/es6/array'; 32 | // import 'core-js/es6/regexp'; 33 | // import 'core-js/es6/map'; 34 | // import 'core-js/es6/set'; 35 | 36 | /** IE10 and IE11 requires the following for NgClass support on SVG elements */ 37 | // import 'classlist.js'; // Run `npm install --save classlist.js`. 38 | 39 | /** IE10 and IE11 requires the following to support `@angular/animation`. */ 40 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 41 | 42 | 43 | /** Evergreen browsers require these. **/ 44 | import 'core-js/es6/reflect'; 45 | 46 | 47 | 48 | /** ALL Firefox browsers require the following to support `@angular/animation`. **/ 49 | // import 'web-animations-js'; // Run `npm install --save web-animations-js`. 50 | 51 | 52 | 53 | /*************************************************************************************************** 54 | * Zone JS is required by Angular itself. 55 | */ 56 | import 'zone.js/dist/zone'; // Included with Angular CLI. 57 | 58 | 59 | 60 | /*************************************************************************************************** 61 | * APPLICATION IMPORTS 62 | */ 63 | 64 | /** 65 | * Date, currency, decimal and percent pipes. 66 | * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10 67 | */ 68 | // import 'intl'; // Run `npm install --save intl`. 69 | -------------------------------------------------------------------------------- /client/src/styles.css: -------------------------------------------------------------------------------- 1 | /* You can add global styles to this file, and also import other style files */ 2 | -------------------------------------------------------------------------------- /client/src/test.ts: -------------------------------------------------------------------------------- 1 | // This file is required by karma.conf.js and loads recursively all the .spec and framework files 2 | 3 | import 'zone.js/dist/long-stack-trace-zone'; 4 | import 'zone.js/dist/proxy.js'; 5 | import 'zone.js/dist/sync-test'; 6 | import 'zone.js/dist/jasmine-patch'; 7 | import 'zone.js/dist/async-test'; 8 | import 'zone.js/dist/fake-async-test'; 9 | import { getTestBed } from '@angular/core/testing'; 10 | import { 11 | BrowserDynamicTestingModule, 12 | platformBrowserDynamicTesting 13 | } from '@angular/platform-browser-dynamic/testing'; 14 | 15 | // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. 16 | declare var __karma__: any; 17 | declare var require: any; 18 | 19 | // Prevent Karma from running prematurely. 20 | __karma__.loaded = function () {}; 21 | 22 | // First, initialize the Angular testing environment. 23 | getTestBed().initTestEnvironment( 24 | BrowserDynamicTestingModule, 25 | platformBrowserDynamicTesting() 26 | ); 27 | // Then we find all the tests. 28 | const context = require.context('./', true, /\.spec\.ts$/); 29 | // And load the modules. 30 | context.keys().map(context); 31 | // Finally, start Karma to run the tests. 32 | __karma__.start(); 33 | -------------------------------------------------------------------------------- /client/src/tsconfig.app.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/app", 5 | "module": "es2015", 6 | "baseUrl": "", 7 | "types": [] 8 | }, 9 | "exclude": [ 10 | "test.ts", 11 | "**/*.spec.ts" 12 | ] 13 | } 14 | -------------------------------------------------------------------------------- /client/src/tsconfig.spec.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "../out-tsc/spec", 5 | "module": "commonjs", 6 | "target": "es5", 7 | "baseUrl": "", 8 | "types": [ 9 | "jasmine", 10 | "node" 11 | ] 12 | }, 13 | "files": [ 14 | "test.ts", 15 | "polyfills.ts" 16 | ], 17 | "include": [ 18 | "**/*.spec.ts", 19 | "**/*.d.ts" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /client/src/typings.d.ts: -------------------------------------------------------------------------------- 1 | /* SystemJS module definition */ 2 | declare var module: NodeModule; 3 | interface NodeModule { 4 | id: string; 5 | } 6 | -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": false, 3 | "compilerOptions": { 4 | "outDir": "./dist/out-tsc", 5 | "baseUrl": "src", 6 | "sourceMap": true, 7 | "declaration": false, 8 | "moduleResolution": "node", 9 | "emitDecoratorMetadata": true, 10 | "experimentalDecorators": true, 11 | "target": "es5", 12 | "typeRoots": [ 13 | "node_modules/@types" 14 | ], 15 | "lib": [ 16 | "es2016", 17 | "dom" 18 | ] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /client/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rulesDirectory": [ 3 | "node_modules/codelyzer" 4 | ], 5 | "rules": { 6 | "callable-types": true, 7 | "class-name": true, 8 | "comment-format": [ 9 | true, 10 | "check-space" 11 | ], 12 | "curly": true, 13 | "eofline": true, 14 | "forin": true, 15 | "import-blacklist": [true], 16 | "import-spacing": true, 17 | "indent": [ 18 | true, 19 | "spaces" 20 | ], 21 | "interface-over-type-literal": true, 22 | "label-position": true, 23 | "max-line-length": [ 24 | true, 25 | 140 26 | ], 27 | "member-access": false, 28 | "member-ordering": [ 29 | true, 30 | "static-before-instance", 31 | "variables-before-functions" 32 | ], 33 | "no-arg": true, 34 | "no-bitwise": true, 35 | "no-console": [ 36 | true, 37 | "debug", 38 | "info", 39 | "time", 40 | "timeEnd", 41 | "trace" 42 | ], 43 | "no-construct": true, 44 | "no-debugger": true, 45 | "no-duplicate-variable": true, 46 | "no-empty": false, 47 | "no-empty-interface": true, 48 | "no-eval": true, 49 | "no-inferrable-types": [true, "ignore-params"], 50 | "no-shadowed-variable": true, 51 | "no-string-literal": false, 52 | "no-string-throw": true, 53 | "no-switch-case-fall-through": true, 54 | "no-trailing-whitespace": true, 55 | "no-unused-expression": true, 56 | "no-use-before-declare": true, 57 | "no-var-keyword": true, 58 | "object-literal-sort-keys": false, 59 | "one-line": [ 60 | true, 61 | "check-open-brace", 62 | "check-catch", 63 | "check-else", 64 | "check-whitespace" 65 | ], 66 | "prefer-const": true, 67 | "quotemark": [ 68 | true, 69 | "single" 70 | ], 71 | "radix": true, 72 | "semicolon": [ 73 | "always" 74 | ], 75 | "triple-equals": [ 76 | true, 77 | "allow-null-check" 78 | ], 79 | "typedef-whitespace": [ 80 | true, 81 | { 82 | "call-signature": "nospace", 83 | "index-signature": "nospace", 84 | "parameter": "nospace", 85 | "property-declaration": "nospace", 86 | "variable-declaration": "nospace" 87 | } 88 | ], 89 | "typeof-compare": true, 90 | "unified-signatures": true, 91 | "variable-name": false, 92 | "whitespace": [ 93 | true, 94 | "check-branch", 95 | "check-decl", 96 | "check-operator", 97 | "check-separator", 98 | "check-type" 99 | ], 100 | 101 | "directive-selector": [true, "attribute", "app", "camelCase"], 102 | "component-selector": [true, "element", "app", "kebab-case"], 103 | "use-input-property-decorator": true, 104 | "use-output-property-decorator": true, 105 | "use-host-property-decorator": true, 106 | "no-input-rename": true, 107 | "no-output-rename": true, 108 | "use-life-cycle-interface": true, 109 | "use-pipe-transform-interface": true, 110 | "component-class-suffix": true, 111 | "directive-class-suffix": true, 112 | "no-access-missing-member": true, 113 | "templates-use-public": true, 114 | "invoke-injectable": true 115 | } 116 | } 117 | -------------------------------------------------------------------------------- /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/angular-university/typescript-course/00ae11a2ca27e662207b63d353e0daeabbceb50b/favicon.ico -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | The Complete Typescript Course 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "complete-typescript-course", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "es6": "./node_modules/.bin/http-server -c-1 .", 8 | "types-examples": "node ./samples/learning-types.js", 9 | "hello": "node ./samples/hello-world.js", 10 | "start": "./node_modules/.bin/ts-node ./server/server.ts", 11 | "watch": "./node_modules/.bin/nodemon -w . --ext \".ts\" --exec \"npm run start\"", 12 | "oo": "node ./samples/object-oriented.js", 13 | "generics": "node ./samples/generics.js", 14 | "decorators": "node ./samples/decorators.js" 15 | }, 16 | "repository": { 17 | "type": "git", 18 | "url": "git+https://github.com/angular-university/complete-typescript-course.git" 19 | }, 20 | "author": "", 21 | "license": "ISC", 22 | "bugs": { 23 | "url": "https://github.com/angular-university/complete-typescript-course/issues" 24 | }, 25 | "homepage": "https://github.com/angular-university/complete-typescript-course#readme", 26 | "devDependencies": { 27 | "@types/bluebird": "^3.0.35", 28 | "@types/express": "^4.0.33", 29 | "@types/lodash": "^4.14.37", 30 | "@types/node": "^6.0.45", 31 | "@types/sequelize": "4.0.38", 32 | "http-server": "^0.9.0", 33 | "nodemon": "^1.11.0", 34 | "ts-node": "^1.6.0" 35 | }, 36 | "dependencies": { 37 | "body-parser": "^1.15.2", 38 | "express": "^4.14.0", 39 | "human-readable-ids": "^1.0.1", 40 | "lodash": "^4.16.4", 41 | "pg": "^6.1.0", 42 | "sequelize": "^3.24.6", 43 | "typescript": "2.0.10" 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /results.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 3, 4 | "description": "Angular 2 Pipes", 5 | "url": "angular2-pipes", 6 | "longDescription": "Learn how to leverage Pipes in Angular 2, both stateless and stateful.", 7 | "iconUrl": "https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg", 8 | "courseListIcon": null, 9 | "seqNo": 3, 10 | "comingSoon": true, 11 | "isNew": false, 12 | "isOngoing": true, 13 | "createdAt": "2016-05-30T15:19:09.507Z", 14 | "updatedAt": "2016-06-10T19:54:55.142Z" 15 | }, 16 | { 17 | "id": 2, 18 | "description": "Angular 2 Components and Directives", 19 | "url": "angular2-components-and-directives", 20 | "longDescription": "Learn Components and maybe the most useful feature of Angular 2: Directives.", 21 | "iconUrl": "https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg", 22 | "courseListIcon": null, 23 | "seqNo": 2, 24 | "comingSoon": true, 25 | "isNew": false, 26 | "isOngoing": true, 27 | "createdAt": "2016-05-30T15:19:09.507Z", 28 | "updatedAt": "2016-06-10T19:54:55.160Z" 29 | }, 30 | { 31 | "id": 5, 32 | "description": "Build a Web App with Angular 2 and Firebase", 33 | "url": "build-an-application-with-angular2", 34 | "longDescription": "Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.", 35 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg", 36 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg", 37 | "seqNo": 4, 38 | "comingSoon": false, 39 | "isNew": false, 40 | "isOngoing": false, 41 | "createdAt": "2016-05-30T15:19:09.507Z", 42 | "updatedAt": "2016-10-07T19:16:20.671Z" 43 | }, 44 | { 45 | "id": 10, 46 | "description": "RxJs Observable Data Services", 47 | "url": "angular2-rxjs-observable-data-services", 48 | "longDescription": "Use RxJs to build service layers using the Observable Data Service Pattern.", 49 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg", 50 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 51 | "seqNo": 8, 52 | "comingSoon": true, 53 | "isNew": false, 54 | "isOngoing": true, 55 | "createdAt": "2016-05-30T15:19:09.507Z", 56 | "updatedAt": "2016-10-07T19:16:20.697Z" 57 | }, 58 | { 59 | "id": 7, 60 | "description": "Angular 2 Router", 61 | "url": "angular2-routing", 62 | "longDescription": "Build Single Page Applications with Angular 2 and its powerful Router.", 63 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png", 64 | "courseListIcon": "/src/images/router-icon.png", 65 | "seqNo": 3, 66 | "comingSoon": false, 67 | "isNew": false, 68 | "isOngoing": false, 69 | "createdAt": "2016-05-30T15:19:09.507Z", 70 | "updatedAt": "2016-10-07T19:16:20.698Z" 71 | }, 72 | { 73 | "id": 8, 74 | "description": "Module Loaders and Webpack 2", 75 | "url": "module-loaders-and-systemjs", 76 | "longDescription": "Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.", 77 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg", 78 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 79 | "seqNo": 7, 80 | "comingSoon": true, 81 | "isNew": false, 82 | "isOngoing": true, 83 | "createdAt": "2016-05-30T15:19:09.507Z", 84 | "updatedAt": "2016-10-07T19:16:20.699Z" 85 | }, 86 | { 87 | "id": 11, 88 | "description": "NgRx Angular 2 Reactive Extensions", 89 | "url": "angular2-ngrx", 90 | "longDescription": "Learn some of the most useful libraries in the Angular 2 Ecosystem.", 91 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg", 92 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 93 | "seqNo": 9, 94 | "comingSoon": true, 95 | "isNew": false, 96 | "isOngoing": true, 97 | "createdAt": "2016-05-30T15:19:09.507Z", 98 | "updatedAt": "2016-10-07T19:16:20.715Z" 99 | }, 100 | { 101 | "id": 12, 102 | "description": "Angular 2 Universal", 103 | "url": "angular2-universal", 104 | "longDescription": "Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.", 105 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg", 106 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 107 | "seqNo": 10, 108 | "comingSoon": true, 109 | "isNew": false, 110 | "isOngoing": true, 111 | "createdAt": "2016-05-30T15:19:09.507Z", 112 | "updatedAt": "2016-10-07T19:16:20.736Z" 113 | }, 114 | { 115 | "id": 4, 116 | "description": "Angular 2 Forms", 117 | "url": "angular2-forms", 118 | "longDescription": "Learn how to build validatable and user-friendly data Forms effectively.", 119 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png", 120 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg", 121 | "seqNo": 3, 122 | "comingSoon": false, 123 | "isNew": false, 124 | "isOngoing": false, 125 | "createdAt": "2016-05-30T15:19:09.507Z", 126 | "updatedAt": "2016-10-07T19:16:20.611Z" 127 | }, 128 | { 129 | "id": 9, 130 | "description": "Angular 2 HTTP and Services", 131 | "url": "angular2-http", 132 | "longDescription": "Build Services using Observables, learn to use the HTTP module effectively.", 133 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png", 134 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 135 | "seqNo": 1, 136 | "comingSoon": false, 137 | "isNew": false, 138 | "isOngoing": false, 139 | "createdAt": "2016-05-30T15:19:09.507Z", 140 | "updatedAt": "2016-10-07T19:16:20.632Z" 141 | }, 142 | { 143 | "id": 13, 144 | "description": "Angular 2 Progressive Web Apps", 145 | "url": "angular2-progressive-web-applications", 146 | "longDescription": "Learn the Future of Mobile development: Progressive Web Applications.", 147 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg", 148 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 149 | "seqNo": 11, 150 | "comingSoon": true, 151 | "isNew": false, 152 | "isOngoing": true, 153 | "createdAt": "2016-05-30T15:19:09.507Z", 154 | "updatedAt": "2016-10-07T19:16:20.750Z" 155 | }, 156 | { 157 | "id": 6, 158 | "description": "Angular 2 Advanced Components", 159 | "url": "angular2-advanced-components", 160 | "longDescription": "A deep dive on Components, focusing on commonly needed advanced use cases.", 161 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg", 162 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 163 | "seqNo": 5, 164 | "comingSoon": true, 165 | "isNew": false, 166 | "isOngoing": true, 167 | "createdAt": "2016-05-30T15:19:09.507Z", 168 | "updatedAt": "2016-10-07T19:16:20.630Z" 169 | }, 170 | { 171 | "id": 1, 172 | "description": "Angular 2 Tutorial For Beginners", 173 | "url": "getting-started-with-angular2", 174 | "longDescription": "Establish a solid layer of fundamentals, learn what's under the hood of Angular 2", 175 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png", 176 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png", 177 | "seqNo": 0, 178 | "comingSoon": false, 179 | "isNew": false, 180 | "isOngoing": false, 181 | "createdAt": "2016-05-30T15:19:09.507Z", 182 | "updatedAt": "2016-10-07T19:16:20.606Z" 183 | }, 184 | { 185 | "id": 14, 186 | "description": "Angular 2 Architecture", 187 | "url": "angular2-architecture", 188 | "longDescription": "Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.", 189 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg", 190 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 191 | "seqNo": 12, 192 | "comingSoon": true, 193 | "isNew": false, 194 | "isOngoing": true, 195 | "createdAt": "2016-08-16T13:55:24.236Z", 196 | "updatedAt": "2016-10-07T19:16:20.750Z" 197 | }, 198 | { 199 | "id": 15, 200 | "description": "Angular 2 Security", 201 | "url": "angular2-security", 202 | "longDescription": "Learn how to build secure Angular 2 Applications Using JSON Web Tokens.", 203 | "iconUrl": "https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg", 204 | "courseListIcon": "https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png", 205 | "seqNo": 13, 206 | "comingSoon": true, 207 | "isNew": false, 208 | "isOngoing": true, 209 | "createdAt": "2016-08-16T13:59:06.727Z", 210 | "updatedAt": "2016-10-07T19:16:20.751Z" 211 | } 212 | ] 213 | -------------------------------------------------------------------------------- /samples/buildPersonData.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | export function buildPersonData ( 5 | {firstName, lastName}:any, ...address:any[]) { 6 | return `${firstName} ${lastName} ${address}`; 7 | } 8 | 9 | 10 | -------------------------------------------------------------------------------- /samples/decorators.ts: -------------------------------------------------------------------------------- 1 | 2 | enum LoggingLevel { 3 | INFO, 4 | WARN, 5 | DEBUG, 6 | TRACE 7 | } 8 | 9 | const loggingLevel = LoggingLevel.INFO; 10 | 11 | 12 | function LogMethod(level: LoggingLevel):Function { 13 | return (target: any, propertyKey: string, 14 | descriptor: PropertyDescriptor) => { 15 | 16 | const originalFunction:Function = descriptor.value; 17 | 18 | descriptor.value = function(...args:any[]) { 19 | if (level <= loggingLevel) { 20 | console.log(">> " + propertyKey + " " + JSON.stringify(args)); 21 | } 22 | originalFunction.apply(this,args); 23 | }; 24 | 25 | 26 | } 27 | 28 | } 29 | 30 | class Database { 31 | 32 | name = 'CTCDB'; 33 | 34 | @LogMethod(LoggingLevel.DEBUG) 35 | saveData(data:any) { 36 | console.log(`saving data in the database ${this.name} ${JSON.stringify(data)}`); 37 | } 38 | 39 | } 40 | 41 | const db = new Database(); 42 | 43 | //db.saveData({message: 'Hello World !!'}); 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | function registerOrmModel(model: Function) { 52 | //console.log("registering ORM models ", model); 53 | } 54 | 55 | 56 | function Entity(tableName:string) { 57 | return (target:Function) => { 58 | registerOrmModel(target); 59 | } 60 | } 61 | 62 | function Column(columnName:string) { 63 | return (target:any, propertyKey:string) => { 64 | console.log(propertyKey); 65 | } 66 | } 67 | 68 | 69 | @Entity("TODOS") 70 | class Todo { 71 | 72 | @Column("DESCR") 73 | description:string; 74 | done = false; 75 | } 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | -------------------------------------------------------------------------------- /samples/generics.ts: -------------------------------------------------------------------------------- 1 | 2 | class SuperCharacter { 3 | constructor(public name:string) { 4 | 5 | } 6 | } 7 | 8 | class Hero extends SuperCharacter { 9 | 10 | } 11 | 12 | class Villain extends SuperCharacter { 13 | 14 | } 15 | 16 | class SuperTeam { 17 | constructor(public members: T[], public leader: T) { 18 | 19 | } 20 | } 21 | 22 | const captainAmerica = new Hero("Captain America"); 23 | const thor = new Hero("Thor"); 24 | const ironMan = new Hero("IronMan"); 25 | 26 | const avengers = new SuperTeam([captainAmerica, thor, ironMan], captainAmerica); 27 | 28 | const members = avengers.members; 29 | 30 | const luthor = new Villain("Luthor"); 31 | const bizarro = new Villain("Bizarro"); 32 | const captainCold = new Villain("Captain Cold"); 33 | 34 | const legionOfDoom = new SuperTeam([luthor, bizarro, captainCold], luthor); 35 | 36 | 37 | const megaCrossoverTeam = new SuperTeam([captainAmerica, thor, ironMan, 38 | luthor, bizarro, captainCold], captainAmerica); 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /samples/hello-world.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {buildPersonData} from "./buildPersonData"; 4 | import * as _ from 'lodash'; 5 | 6 | const partialAddress = ["Street Name", 7 | "Street Number", "Po Box"]; 8 | 9 | const firstName = 'Kobe', 10 | lastName = 'Bryant'; 11 | 12 | const personData = { 13 | firstName, 14 | lastName 15 | }; 16 | 17 | const address = [...partialAddress, 'Staples Center']; 18 | 19 | console.log(buildPersonData(personData, address)); 20 | 21 | -------------------------------------------------------------------------------- /samples/learning-types.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | import * as _ from 'lodash'; 5 | 6 | const colors = ["Red", "Green", "Blue"]; 7 | 8 | const firstColor = _.first(colors); 9 | 10 | console.log(firstColor); -------------------------------------------------------------------------------- /samples/logMessage.ts: -------------------------------------------------------------------------------- 1 | 2 | namespace Logging { 3 | 4 | export function logMessage() { 5 | console.log('Other features'); 6 | } 7 | 8 | } 9 | 10 | -------------------------------------------------------------------------------- /samples/my-lodash.d.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | declare interface FirstFunction { 4 | (data:any[]) :any; 5 | } 6 | 7 | 8 | declare interface Lodash { 9 | 10 | first:FirstFunction; 11 | } 12 | 13 | -------------------------------------------------------------------------------- /samples/object-oriented.ts: -------------------------------------------------------------------------------- 1 | 2 | enum Editor { 3 | MARVEL, 4 | DC 5 | } 6 | 7 | interface Hero { 8 | name:string; 9 | creationYear:number; 10 | } 11 | 12 | const batman:Hero = { 13 | name: "Batman", 14 | creationYear: 1939 15 | }; 16 | 17 | abstract class SuperHero implements Hero { 18 | 19 | private static readonly LABEL = 'Hero:'; 20 | 21 | readonly name:string; 22 | 23 | constructor( 24 | name:string, 25 | public _editor:Editor, 26 | public creationYear: number) { 27 | this.name = name; 28 | } 29 | 30 | static createMessage(hero:SuperHero):string { 31 | return ` 32 | ${SuperHero.LABEL} 33 | ${hero.name} 34 | ${Editor[hero._editor]} 35 | ${hero.creationYear} 36 | `; 37 | } 38 | 39 | } 40 | 41 | interface CanFly { 42 | fly(message:string):void; 43 | } 44 | 45 | 46 | 47 | class FlyingHero extends SuperHero implements CanFly { 48 | 49 | fly(message:string) { 50 | console.log(message + this.creationYear); 51 | } 52 | 53 | } 54 | 55 | 56 | const superman = new FlyingHero('Superman',Editor.MARVEL, 1938); 57 | 58 | console.log(superman.fly('Up and Away !')); 59 | 60 | 61 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /samples/other.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | Logging.logMessage(); 4 | -------------------------------------------------------------------------------- /server/api/api.ts: -------------------------------------------------------------------------------- 1 | 2 | import {Application} from "express"; 3 | import {apiGetAllCourses} from "./apiGetAllCourses"; 4 | import {apiGetCourseDetail} from "./apiGetCourseDetail"; 5 | import {apiCreateLesson} from "./apiCreateLesson"; 6 | import {apiPatchLesson} from "./apiPatchLesson"; 7 | import {apiDeleteLesson} from "./apiDeleteLesson"; 8 | 9 | 10 | 11 | export function initRestApi(app:Application) { 12 | 13 | app.route('/api/courses').get(apiGetAllCourses); 14 | app.route('/api/courses/:id').get(apiGetCourseDetail); 15 | 16 | 17 | app.route('/api/lesson').post(apiCreateLesson); 18 | app.route('/api/lesson/:id').patch(apiPatchLesson); 19 | app.route('/api/lesson/:id').delete(apiDeleteLesson); 20 | 21 | } -------------------------------------------------------------------------------- /server/api/apiCreateLesson.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | import {Request, Response} from 'express'; 5 | import * as _ from 'lodash'; 6 | import {createLesson} from "../queries/createLesson"; 7 | import {onError} from "./onError"; 8 | import {onSuccess} from "./onSuccess"; 9 | import {databaseErrorHandler} from "./databaseErrorHandler"; 10 | 11 | 12 | 13 | 14 | export function apiCreateLesson(req:Request, res:Response) { 15 | 16 | createLesson(req.body) 17 | .then(_.partial(onSuccess, res)) 18 | .catch(_.partial(databaseErrorHandler, res)) 19 | .catch( _.partial(onError, res, `Could not create lesson`) ); 20 | 21 | } 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /server/api/apiDeleteLesson.ts: -------------------------------------------------------------------------------- 1 | import {Request, Response} from 'express'; 2 | import {onError} from "./onError"; 3 | import {onSuccess} from "./onSuccess"; 4 | import * as _ from 'lodash'; 5 | import {deleteLesson} from "../queries/deleteLesson"; 6 | 7 | 8 | 9 | export function apiDeleteLesson(req:Request, res:Response) { 10 | 11 | const lessonId = req.params.id; 12 | 13 | deleteLesson(lessonId) 14 | .then(_.partial(onSuccess, res)) 15 | .catch( _.partial(onError, res, `Could not delete lesson ${lessonId}`) ); 16 | 17 | } 18 | 19 | -------------------------------------------------------------------------------- /server/api/apiErrorHandler.ts: -------------------------------------------------------------------------------- 1 | 2 | import {Request, Response, RequestHandler, ErrorRequestHandler, NextFunction} from 'express'; 3 | 4 | 5 | 6 | export function apiErrorHandler( 7 | err: any, 8 | req:Request, 9 | res: Response, 10 | next: NextFunction) { 11 | 12 | 13 | console.error("API error handler triggered", err); 14 | 15 | res.status(500).json({errorCode:'ERR-001', 16 | message: 'Internal Server Error'}); 17 | 18 | } -------------------------------------------------------------------------------- /server/api/apiGetAllCourses.ts: -------------------------------------------------------------------------------- 1 | 2 | import {Request, Response} from 'express'; 3 | import * as _ from 'lodash'; 4 | import {findAllCourses} from "../queries/findAllCourses"; 5 | import {onError} from "./onError"; 6 | import {onSuccess} from "./onSuccess"; 7 | 8 | 9 | 10 | export function apiGetAllCourses(req:Request, res:Response) { 11 | 12 | findAllCourses() 13 | .then(_.partial(onSuccess,res)) 14 | .catch(_.partial(onError, res, "Find All Courses Failed")); 15 | } 16 | 17 | -------------------------------------------------------------------------------- /server/api/apiGetCourseDetail.ts: -------------------------------------------------------------------------------- 1 | 2 | import {Request, Response} from 'express'; 3 | import {onSuccess} from "./onSuccess"; 4 | import {onError} from "./onError"; 5 | import {findCourseDetail} from "../queries/findCourseDetail"; 6 | import * as _ from 'lodash'; 7 | 8 | export function apiGetCourseDetail(req:Request, res:Response) { 9 | 10 | const courseId = parseInt(req.params.id); 11 | 12 | findCourseDetail(courseId) 13 | .then(_.partial(onSuccess, res)) 14 | .catch( _.partial(onError, res, `Could not find course detail for id ${courseId}`) ); 15 | 16 | 17 | } -------------------------------------------------------------------------------- /server/api/apiPatchLesson.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {Request, Response} from 'express'; 4 | import * as _ from 'lodash'; 5 | import {updateLesson} from "../queries/updateLesson"; 6 | import {onSuccess} from "./onSuccess"; 7 | import {onError} from "./onError"; 8 | import {databaseErrorHandler} from "./databaseErrorHandler"; 9 | 10 | 11 | 12 | 13 | export function apiPatchLesson(req:Request, res:Response) { 14 | 15 | const lessonId = req.params.id; 16 | 17 | updateLesson(lessonId, req.body) 18 | .then(_.partial(onSuccess, res)) 19 | .catch(_.partial(databaseErrorHandler, res)) 20 | .catch( _.partial(onError, res, "Could not update lesson") ); 21 | 22 | } -------------------------------------------------------------------------------- /server/api/databaseErrorHandler.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {Response} from 'express'; 4 | const hri = require('human-readable-ids').hri; 5 | 6 | export function databaseErrorHandler(res:Response, err: any) { 7 | const id = hri.random(); 8 | console.error("Database error occurred ", id, err); 9 | res.status(500).json({code: 'ERR-002', 10 | message: `Error occurred error code ${id}`}); 11 | } -------------------------------------------------------------------------------- /server/api/onError.ts: -------------------------------------------------------------------------------- 1 | 2 | import {Response} from 'express'; 3 | 4 | export function onError(res:Response,message:string, err:any) { 5 | 6 | console.error("Promise chain error ",message, err); 7 | res.status(500).send(); 8 | 9 | 10 | } -------------------------------------------------------------------------------- /server/api/onSuccess.ts: -------------------------------------------------------------------------------- 1 | 2 | import {Response} from 'express'; 3 | 4 | 5 | export function onSuccess(res:Response, data:any) { 6 | 7 | res.status(200).json({payload:data}); 8 | 9 | } -------------------------------------------------------------------------------- /server/model/initCourseModel.ts: -------------------------------------------------------------------------------- 1 | 2 | import * as ORM from "Sequelize"; 3 | import {Sequelize} from 'Sequelize'; 4 | 5 | 6 | export function initCourseModel(sequelize: Sequelize) { 7 | return sequelize.define('Course', { 8 | description: ORM.STRING, 9 | url: ORM.STRING, 10 | longDescription: ORM.TEXT, 11 | iconUrl: ORM.STRING, 12 | courseListIcon: ORM.STRING, 13 | seqNo: ORM.INTEGER, 14 | comingSoon: ORM.BOOLEAN, 15 | isNew: ORM.BOOLEAN, 16 | isOngoing: ORM.BOOLEAN 17 | }) 18 | } 19 | -------------------------------------------------------------------------------- /server/model/initLessonModel.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | import ORM = require("Sequelize"); 5 | import {Sequelize} from 'Sequelize'; 6 | 7 | 8 | 9 | export function initLessonModel(sequelize:Sequelize) { 10 | return sequelize.define('Lesson', { 11 | url: ORM.STRING, 12 | description: ORM.STRING, 13 | duration: ORM.STRING, 14 | seqNo: ORM.INTEGER, 15 | courseId: ORM.INTEGER, 16 | pro: ORM.BOOLEAN, 17 | tags: ORM.STRING, 18 | gitHubUrl: ORM.STRING 19 | }); 20 | } -------------------------------------------------------------------------------- /server/model/model.ts: -------------------------------------------------------------------------------- 1 | 2 | import * as ORM from "Sequelize"; 3 | import {Sequelize, LoggingOptions} from 'Sequelize'; 4 | import {initCourseModel} from "./initCourseModel"; 5 | import {initLessonModel} from "./initLessonModel"; 6 | 7 | 8 | 9 | const dbUrl = 'postgres://postgres:postgres@localhost:5432/complete-typescript-course'; 10 | 11 | const options: LoggingOptions = {benchmark: true, logging:console.log}; 12 | 13 | const sequelize:Sequelize = new ORM(dbUrl, options); 14 | 15 | 16 | 17 | export const CourseModel = initCourseModel(sequelize); 18 | 19 | export const LessonModel = initLessonModel(sequelize); 20 | 21 | 22 | CourseModel.hasMany(LessonModel, {foreignKey: 'courseId'}); 23 | 24 | LessonModel.belongsTo(CourseModel, {foreignKey: 'courseId'}); -------------------------------------------------------------------------------- /server/queries/createLesson.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | import {LessonModel} from "../model/model"; 5 | 6 | 7 | export function createLesson(props: any) { 8 | return LessonModel.create(props); 9 | } 10 | -------------------------------------------------------------------------------- /server/queries/deleteLesson.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | import {LessonModel} from "../model/model"; 6 | 7 | 8 | export function deleteLesson(id:string) { 9 | return LessonModel.destroy({ 10 | where: {id} 11 | }); 12 | } -------------------------------------------------------------------------------- /server/queries/findAllCourses.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {CourseModel} from "../model/model"; 4 | import {CourseSummary, createCourseSummary, createCourseSummaries} from "../../shared/model/course-summary"; 5 | import * as Bluebird from "bluebird"; 6 | 7 | 8 | export function findAllCourses() : Bluebird { 9 | return CourseModel.findAll({ 10 | order: ['seqNo'] 11 | }) 12 | .then(createCourseSummaries) 13 | } -------------------------------------------------------------------------------- /server/queries/findCourseDetail.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {CourseModel, LessonModel} from "../model/model"; 4 | import * as Bluebird from "bluebird"; 5 | import {CourseDetail} from "../../shared/model/course-detail"; 6 | import {createCourseDetail} from "../../shared/model/createCourseDetail"; 7 | 8 | 9 | export function findCourseDetail(courseId:number): Bluebird { 10 | 11 | return CourseModel.findById(courseId, { 12 | include: [ 13 | { 14 | model: LessonModel 15 | } 16 | ] 17 | }) 18 | .then(createCourseDetail); 19 | } -------------------------------------------------------------------------------- /server/queries/updateLesson.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {LessonModel} from "../model/model"; 4 | const hri = require('human-readable-ids').hri; 5 | 6 | export function updateLesson(id:string, props: any) { 7 | 8 | return LessonModel.update( 9 | props, 10 | { 11 | where: {id} 12 | } 13 | ); 14 | 15 | 16 | } -------------------------------------------------------------------------------- /server/server.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import * as express from 'express'; 4 | import {Application} from "express"; 5 | import {initRestApi} from "./api/api"; 6 | import {apiErrorHandler} from "./api/apiErrorHandler"; 7 | 8 | const bodyParser = require('body-parser'); 9 | 10 | const app: Application = express(); 11 | 12 | app.use(bodyParser.json()); 13 | 14 | initRestApi(app); 15 | 16 | app.use(apiErrorHandler); 17 | 18 | 19 | 20 | app.listen(8090, () => { 21 | console.log('Server is now running on port 8090 ...'); 22 | }); 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /shared/model/course-detail.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import {Lesson} from "./lesson"; 4 | import {CourseSummary} from "./course-summary"; 5 | 6 | export interface CourseDetail extends CourseSummary { 7 | longDescription: string, 8 | comingSoon?: boolean, 9 | isNew?: boolean, 10 | isOngoing?: boolean, 11 | lessons: Lesson[] 12 | } 13 | 14 | -------------------------------------------------------------------------------- /shared/model/course-summary.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | export interface CourseSummary { 4 | readonly id:number, 5 | readonly url: string, 6 | description: string, 7 | iconUrl: string, 8 | courseListIcon: string, 9 | seqNo: number 10 | } 11 | 12 | 13 | export function createCourseSummary({ 14 | id, 15 | url, 16 | description, 17 | iconUrl, 18 | courseListIcon, 19 | seqNo}:any): CourseSummary { 20 | 21 | 22 | return { 23 | id, url, description, iconUrl, courseListIcon, seqNo 24 | }; 25 | 26 | } 27 | 28 | export function createCourseSummaries(data: any[]): CourseSummary[] { 29 | return data.map(createCourseSummary); 30 | } 31 | 32 | 33 | -------------------------------------------------------------------------------- /shared/model/createCourseDetail.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | import {CourseDetail} from "./course-detail"; 5 | 6 | 7 | export function createCourseDetail({ 8 | id, 9 | url, 10 | description, 11 | iconUrl, 12 | courseListIcon, 13 | seqNo, 14 | longDescription, 15 | comingSoon, 16 | isNew, 17 | isOngoing, 18 | Lessons}:any):CourseDetail { 19 | 20 | return { 21 | id, 22 | url, 23 | description, 24 | iconUrl, 25 | courseListIcon, 26 | seqNo, 27 | longDescription, 28 | comingSoon, 29 | isNew, 30 | isOngoing, 31 | lessons: Lessons.map(createLessonFromDbModel) 32 | }; 33 | 34 | } 35 | 36 | function createLessonFromDbModel({ 37 | id, 38 | url, 39 | description, 40 | duration, 41 | seqNo, 42 | courseId, 43 | pro, 44 | tags 45 | }:any) { 46 | return { 47 | id, 48 | url, 49 | description, 50 | duration, 51 | seqNo, 52 | courseId, 53 | pro, 54 | tags 55 | } 56 | } 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /shared/model/lesson.ts: -------------------------------------------------------------------------------- 1 | 2 | export interface Lesson { 3 | readonly id:number, 4 | readonly url: string; 5 | description: string; 6 | duration: string; 7 | seqNo: number; 8 | courseId: string; 9 | pro: boolean; 10 | tags?: string; 11 | } 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /sql/db-schema-create-and-populate.sql: -------------------------------------------------------------------------------- 1 | 2 | -- Database: "complete-typescript-course" 3 | 4 | 5 | -- DROP TABLE "Courses"; 6 | 7 | CREATE TABLE "Courses" 8 | ( 9 | id serial NOT NULL, 10 | url character varying(255), 11 | description character varying(255) NOT NULL, 12 | "longDescription" text NOT NULL, 13 | "seqNo" integer NOT NULL, 14 | "iconUrl" character varying(255) NOT NULL, 15 | "comingSoon" boolean NOT NULL DEFAULT false, 16 | "isNew" boolean NOT NULL DEFAULT false, 17 | "isOngoing" boolean NOT NULL DEFAULT false, 18 | "visibleFrom" timestamp with time zone NOT NULL DEFAULT '1970-02-01 00:00:00+01'::timestamp with time zone, 19 | "createdAt" timestamp with time zone NOT NULL, 20 | "updatedAt" timestamp with time zone NOT NULL, 21 | "courseListIcon" character varying(255), 22 | CONSTRAINT "Courses_pkey" PRIMARY KEY (id) 23 | ); 24 | 25 | 26 | -- Table: "Lessons" 27 | 28 | CREATE TABLE "Lessons" 29 | ( 30 | id serial NOT NULL, 31 | url character varying(255), 32 | description character varying(255) NOT NULL, 33 | duration character varying(255) NOT NULL, 34 | "seqNo" integer NOT NULL, 35 | "courseId" integer, 36 | pro boolean DEFAULT false, 37 | "gitHubUrl" character varying(255) NOT NULL, 38 | tags character varying(255) DEFAULT ''::character varying, 39 | "createdAt" timestamp with time zone NOT NULL, 40 | "updatedAt" timestamp with time zone NOT NULL, 41 | CONSTRAINT "Lessons_pkey" PRIMARY KEY (id), 42 | CONSTRAINT "Lessons_courseId_fkey" FOREIGN KEY ("courseId") 43 | REFERENCES "Courses" (id) MATCH SIMPLE 44 | ON UPDATE NO ACTION ON DELETE NO ACTION 45 | ); 46 | 47 | -- Index: "sortByUrl" 48 | 49 | -- DROP INDEX "sortByUrl"; 50 | 51 | CREATE UNIQUE INDEX "sortByUrl" 52 | ON "Lessons" 53 | USING btree 54 | (url COLLATE pg_catalog."default"); 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (3, 'angular2-pipes', 'Angular 2 Pipes', 'Learn how to leverage Pipes in Angular 2, both stateless and stateful.', 3, 'https://angular-academy.s3.amazonaws.com/course-logos/pipes.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.142+02', NULL); 63 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (2, 'angular2-components-and-directives', 'Angular 2 Components and Directives', 'Learn Components and maybe the most useful feature of Angular 2: Directives.', 2, 'https://angular-academy.s3.amazonaws.com/course-logos/components-and-directives.svg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-06-10 21:54:55.16+02', NULL); 64 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (5, 'build-an-application-with-angular2', 'Build a Web App with Angular 2 and Firebase', 'Put all the concepts together to build a fully running Angular 2 application using Firebase as the database.', 4, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_app-firebase-small.jpg', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.671+02', 'https://angular-academy.s3.amazonaws.com/thumbnails/firebase-logo.jpg'); 65 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (10, 'angular2-rxjs-observable-data-services', 'RxJs Observable Data Services', 'Use RxJs to build service layers using the Observable Data Service Pattern.', 8, 'https://angular-academy.s3.amazonaws.com/thumbnails/observable-data-services.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.697+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 66 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (7, 'angular2-routing', 'Angular 2 Router', 'Build Single Page Applications with Angular 2 and its powerful Router.', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-routing-small.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.698+02', '/src/images/router-icon.png'); 67 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (8, 'module-loaders-and-systemjs', 'Module Loaders and Webpack 2', 'Learn how Module Loaders Work - Learn Webpack 2 and its Plugin Ecosystem.', 7, 'https://angular-academy.s3.amazonaws.com/thumbnails/webpack-small.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.699+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 68 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (11, 'angular2-ngrx', 'NgRx Angular 2 Reactive Extensions', 'Learn some of the most useful libraries in the Angular 2 Ecosystem.', 9, 'https://angular-academy.s3.amazonaws.com/thumbnails/ngrx.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.715+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 69 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (12, 'angular2-universal', 'Angular 2 Universal', 'Learn maybe the biggest game changing technology in the Angular 2 Ecosystem.', 10, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular_universal.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.736+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 70 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (4, 'angular2-forms', 'Angular 2 Forms', 'Learn how to build validatable and user-friendly data Forms effectively.', 3, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-forms-small.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.611+02', 'https://angular-academy.s3.amazonaws.com/course-logos/lesson-icons/forms.jpg'); 71 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (9, 'angular2-http', 'Angular 2 HTTP and Services', 'Build Services using Observables, learn to use the HTTP module effectively.', 1, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular-http.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.632+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 72 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (13, 'angular2-progressive-web-applications', 'Angular 2 Progressive Web Apps', 'Learn the Future of Mobile development: Progressive Web Applications.', 11, 'https://angular-academy.s3.amazonaws.com/thumbnails/pwa.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 73 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (6, 'angular2-advanced-components', 'Angular 2 Advanced Components', 'A deep dive on Components, focusing on commonly needed advanced use cases.', 5, 'https://angular-academy.s3.amazonaws.com/thumbnails/advanced-components.jpg', true, false, true, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.63+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 74 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (1, 'getting-started-with-angular2', 'Angular 2 Tutorial For Beginners', 'Establish a solid layer of fundamentals, learn what''s under the hood of Angular 2', 0, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-for-beginners-small.png', false, false, false, '2016-05-30 17:19:09.507+02', '2016-10-07 21:16:20.606+02', 'https://angular-academy.s3.amazonaws.com/main-logo/main-page-logo-small-hat.png'); 75 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (14, 'angular2-architecture', 'Angular 2 Architecture', 'Learn how to build next-generation (Post-REST ?) user interfaces in Angular 2.', 12, 'https://angular-academy.s3.amazonaws.com/thumbnails/architecture.jpg', true, false, true, '2016-08-16 15:55:24.236181+02', '2016-10-07 21:16:20.75+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 76 | INSERT INTO "Courses" (id, url, description, "longDescription", "seqNo", "iconUrl", "comingSoon", "isNew", "isOngoing", "createdAt", "updatedAt", "courseListIcon") VALUES (15, 'angular2-security', 'Angular 2 Security', 'Learn how to build secure Angular 2 Applications Using JSON Web Tokens.', 13, 'https://angular-academy.s3.amazonaws.com/thumbnails/angular2-security.jpg', true, false, true, '2016-08-16 15:59:06.727615+02', '2016-10-07 21:16:20.751+02', 'https://angular-academy.s3.amazonaws.com/course-logos/observables_rxjs.png'); 77 | 78 | 79 | 80 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (17, 'angular2-component-events', 'Angular 2 Event Handling', '4:44', 3, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:21.458+02'); 81 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (74, 'angular2-template-driven-forms-ngmodel', 'Angular 2 Template Driven Forms - NgModel is Not Only For Two-Way Data Binding', '4:59', 0, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:17:36.888+02', '2016-10-07 21:16:24.725+02'); 82 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (182, 'angular2-firebase-logout', 'Setup the Logout Functionality', '1:42', 51, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.385+02', '2016-10-07 21:16:33.618+02'); 83 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (92, 'angular2-router-initial-setup', 'Angular 2 Router Setup - Avoid A Pitfall Right From The Start, Setup Router Debugging', '5:33', 1, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.18+02', '2016-10-07 21:16:34.147+02'); 84 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (19, 'angular2-components-styling-component-isolation', 'Styling Angular 2 Components - Learn About Component Style Isolation', '3:27', 5, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.014+02', '2016-10-07 21:16:21.463+02'); 85 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (101, 'angular2-router-avoid-memory-leaks', 'Exiting an Angular 2 Route - How To Prevent Memory Leaks', '4:48', 9, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.305+02', '2016-10-07 21:16:35.13+02'); 86 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (105, 'angular2-router-auxiliary-route-parameters', 'Angular 2 Auxiliary Routes - How To Pass Router Parameters', '2:55', 13, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.858+02', '2016-10-07 21:16:35.504+02'); 87 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (168, 'angular2-firebase-choose-ide', 'Choosing an IDE', '1:50', -1, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:29.569+02', '2016-10-06 17:06:57.988+02'); 88 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (108, 'angular2-router-exercise-build-a-dashboard', 'Exercise - Implement a Widget Dashboard With Multiple Auxiliary Routes', '2:50', 18, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.018+02'); 89 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (20, 'angular2-components-component-interaction', 'Angular 2 Component Interaction - Extended Components Example', '9:22', 6, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.015+02', '2016-10-07 21:16:21.463+02'); 90 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (116, 'angular2-firebase-cli-hello-world', 'Angular 2 Final Application Scaffolding using the Angular CLI', '2:58', 0, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.567+02', '2016-10-07 21:16:28.407+02'); 91 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (119, 'angular2-firebase-references-and-snapshots', 'Firebase Fundamentals - References, Snapshots and Keys', '3:24', 3, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.569+02', '2016-10-07 21:16:28.813+02'); 92 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (112, 'angular2-lazy-loading-shared-modules', 'Angular 2 Router Lazy Loading and Shared Modules - How to Lazy-Load a Module', '8:43', 16, 7, false, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-09-02 16:31:04.247+02', '2016-10-07 21:16:35.722+02'); 93 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (12, 'angular2-setting-up-a-project-using-typescript-systemjs', 'Angular 2 Development Environment - Start Development Using a Beginner Friendly Playground', '10:56', 23, 1, false, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.536+02'); 94 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (13, 'introduction-to-angular2-running-the-lessons', 'Running the the Lessons Code', '3:00', -2, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:20.889+02'); 95 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (172, 'angular2-firebase-create-form-component', 'Creating the Lesson Form Component - Used both for Edit and for Creation', '6:37', 41, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.333+02', '2016-10-07 21:16:32.567+02'); 96 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (177, 'angular2-firebase-edit-lesson-show-data-in-edit-form', 'Edit Lesson - Passing the Retrieved Data to the Lesson Form', '3:25', 46, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.856+02', '2016-10-07 21:16:33.09+02'); 97 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (16, 'angular2-hello-world-write-first-application', 'Angular 2 Tutorial For Beginners - Build Your First App - Hello World Step By Step', '2:49', 0, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.945+02', '2016-10-07 21:16:20.898+02'); 98 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (15, 'angular2-build-your-first-component', 'Building Your First Angular 2 Component - Component Composition', '2:07', 1, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.967+02', '2016-10-07 21:16:20.899+02'); 99 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (18, 'angular2-component-templates-internal-vs-external', 'Angular 2 Component Templates - Inline Vs External', '2:55', 4, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.988+02', '2016-10-07 21:16:21.464+02'); 100 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (11, 'angular2-debugging-with-augury-or-console', 'How To Debug An Angular 2 Application - Debugging via Augury or the Console', '2:59', 22, 1, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.112+02'); 101 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (187, 'angular2-firebase-rounding-up', 'Rounding Up the Course', '01:01', 56, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.911+02', '2016-10-06 17:27:09.056+02'); 102 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (50, 'angular2-introduction-to-typescript-the-arrow-operator', 'Introduction To Typescript - The Arrow (=>) Operator', '4:52', 34, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-10-07 21:16:24.189+02'); 103 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (167, 'angular2-firebase-starter-kit', 'Installing the Starter Kit', '2:14', 1, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:29.571+02', '2016-10-07 21:16:28.427+02'); 104 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (6, 'angular2-core-directives-ngfor', 'Angular 2 Core Directives - ngFor', '3:46', 11, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.008+02'); 105 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (76, 'angular2-ngmodel-bidirectional-binding', 'NgModel - Why Would You Want To Turn Off Two-Way Data Binding ?', '3:44', 1, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.349+02', '2016-10-07 21:16:24.724+02'); 106 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (24, 'angular2-write-first-injectable-service', 'Angular 2 Services Tutorial - Writing Your First Service - Learn @Injectable', '3:46', 25, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-01 22:25:57.621+02', '2016-10-07 21:16:23.632+02'); 107 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (46, 'angular2-introduction-to-directives-write-a-custom-directive', 'Angular 2 Directives Tutorial - Write Your First Custom Directive', '4:31', 9, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:54.065+02', '2016-10-07 21:16:22.009+02'); 108 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (48, 'angular2-directives-exercise-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise - Improve the Collapsible Directive', '1:30', 15, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:55.14+02', '2016-10-07 21:16:22.553+02'); 109 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (3, 'angular2-template-syntax-interpolation', 'Angular 2 Template Syntax - Interpolation', '2:41', 18, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02'); 110 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (42, 'angular2-http-error-handling', 'Angular 2 Services - HTTP Error Handling', '2:21', 28, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.253+02', '2016-10-07 21:16:23.653+02'); 111 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (41, 'angular2-http-how-to-do-an-http-post-call', 'Angular 2 Services - Using the HTTP service to do an HTTP POST ', '5:32', 27, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:36.712+02', '2016-10-07 21:16:23.641+02'); 112 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (75, 'angular2-form-state-classes', 'Angular 2 Form CSS State Classes with NgModel - How to Mark a Field As Mandatory ?', '4:02', 2, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.362+02', '2016-10-07 21:16:24.724+02'); 113 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (81, 'angular2-ngmodelgroup', 'Control Groups with ngModelGroup - Validation And Binding', '3:03', 6, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02'); 114 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (4, 'angular2-template-syntax-events', 'Template Syntax - Introduction To Zones - How does the Angular 2 event handling mechanism work?', '5:14', 19, 1, true, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.103+02'); 115 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (23, 'anhular-http-do-a-get-call-to-express-server', 'Angular 2 Services - Introduction to the HTTP Service - Do a GET HTTP Server Call', '3:43', 26, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-01 22:25:57.642+02', '2016-10-07 21:16:23.642+02'); 116 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (43, 'angular2-introduction-to-services-exercise', 'Angular 2 Services - Exercise - Do an HTTP DELETE', '0:54', 31, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:24.183+02'); 117 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (10, 'angular2-guided-tour-pipes', 'Angular 2 Pipes - Learn Why Standard Pipes Might Not Work, Create a Custom Pipe', '5:01', 21, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.104+02'); 118 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (87, 'angular2-formcontrol-directive', 'Angular 2 Model Driven Forms - The formControl Directive', '1:57', 12, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02'); 119 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (88, 'angular2-custom-validator-form-driven', 'Angular 2 Template Driven Form Custom Validator', '5:44', 14, 4, true, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-07-14 10:56:15.634+02', '2016-10-07 21:16:26.228+02'); 120 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (173, 'angular2-firebase-save-new-lesson', 'Lessons Service - Add Save New Lesson Functionality', '12:58', 42, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.335+02', '2016-10-07 21:16:32.572+02'); 121 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (178, 'angular2-firebase-edit-lesson-implement-lessons-service', 'Edit Lesson - Implement the Save Lesson Service', '3:02', 47, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.863+02', '2016-10-07 21:16:33.095+02'); 122 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (183, 'angular2-firebase-redirect-to-login-router-guard', 'Redirect User To Login Page Using a Router Guard', '5:33', 52, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.391+02', '2016-10-07 21:16:33.621+02'); 123 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (5, 'angular2-guided-tour-components', 'Guided Tour to Angular 2 Components', '5:57', 20, 1, true, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-07-25 20:55:31.53+02'); 124 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (100, 'angular2-router-child-routes', 'Child Routes - How To Setup a Master Detail Route - What Are Componentless Routes ?', '4:09', 5, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.271+02', '2016-10-07 21:16:34.668+02'); 125 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (103, 'angular2-router-auxiliary-routes', 'Configure Auxiliary Routes in the Angular 2 Router - What is the Difference Towards a Primary Route?', '5:16', 12, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.194+02'); 126 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (77, 'angular2-standard-validators', 'Angular 2 Standard Form Validators How do Template Driven Forms Work Under The Hood ?', '3:32', 3, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:24.729+02'); 127 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (80, 'angular2-model-driven-reactive-forms', 'Angular 2 Reactive or Model Driven Forms - formGroup and formControlName', '4:07', 7, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.068+02', '2016-10-07 21:16:25.257+02'); 128 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (169, 'angular2-firebase-router-navigate-detail-to-lesson', 'Navigating From Lesson To Lesson - Part 1', '5:17', 37, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:33.863+02', '2016-10-07 21:16:32.052+02'); 129 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (85, 'angular2-model-driven-forms-errors', 'Angular 2 Model Driven Forms - Mark Fields in Error', '2:08', 11, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.62+02', '2016-10-07 21:16:25.79+02'); 130 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (58, 'angular2-what-is-an-observable', 'What is an Observable ? Introduction to Streams and RxJs Observables', '5:41', 0, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-16 17:25:37.294+02', '2016-10-07 21:16:26.747+02'); 131 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (7, 'angular2-core-directives-ngclass-ngstyle', 'Angular 2 Core Directives - ngClass and ngStyle', '3:15', 12, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02'); 132 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (69, 'angular2-how-to-setup-an-http-request-sequence-using-the-rxjs-switchmap-operator', 'How to setup an HTTP request sequence using the RxJs switchMap Operator', '4:33', 10, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.787+02', '2016-10-07 21:16:27.783+02'); 133 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (60, 'angular2-observables-error-handling-and-completion-network-calls-as-observables', 'Observables Error Handling and Completion - How do Observables handle Errors?', '5:28', 1, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 11:22:44.281+02', '2016-10-07 21:16:26.846+02'); 134 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (70, 'angular2-retry-http-requests-in-error-using-the-retry-and-retrywhen-rxjs-operators', 'Retry HTTP requests in Error using the retry and retryWhen RxJs Operators', '3:42', 11, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.875+02', '2016-10-07 21:16:27.884+02'); 135 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (71, 'angular2-how-to-cancel-an-http-request-using-an-rxjs-subscription', 'How to Cancel an HTTP Request using an RxJs Subscription', '2:56', 12, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.893+02'); 136 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (49, 'angular2-directives-exercise-solution-improve-collapsible-directive', 'Introduction to Angular 2 Directives - Exercise Solution', '2:40', 16, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:55.146+02', '2016-10-07 21:16:22.553+02'); 137 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (174, 'angular2-firebase-custom-url-validator', 'Add New Lesson - Add a Custom Url Field Validator', '3:05', 43, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.407+02', '2016-10-07 21:16:32.575+02'); 138 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (179, 'angular2-firebase-authentication-login-page', 'Setup Firebase Authentication, Create a Login Page', '8:52', 48, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.929+02', '2016-10-07 21:16:33.094+02'); 139 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (184, 'angular2-firebase-rest', 'REST and Firebase - Using the Firebase REST API', '8:25', 53, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.452+02', '2016-10-07 21:16:33.621+02'); 140 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (68, 'angular2-how-to-do-two-http-requests-in-parallel-using-the-rxjs-combinelatest-operator', 'How to do two HTTP Requests in Parallel using the RxJs combineLatest Operator', '3:58', 9, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.362+02', '2016-10-07 21:16:27.393+02'); 141 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (99, 'angular2-router-optional-route-parameters', 'Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable', '2:38', 8, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.99+02'); 142 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (72, 'angular2-exercise-improve-a-search-service-and-build-a-typeahead', 'Exercise - Improve a Search Service and Build a Typeahead', '3:15', 13, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.878+02', '2016-10-07 21:16:27.908+02'); 143 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (106, 'angular2-router-redirects-path-matching', 'Angular 2 Router Redirects and Path Matching - Avoid Common Routing Pitfall', '2:59', 14, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.866+02', '2016-10-07 21:16:35.643+02'); 144 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (59, 'angular2-', 'When To Use Template Driven Vs Model Driven Forms ? It Might Surprise You', '6:10', 15, 9, false, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-06-17 11:02:05.708+02', '2016-07-14 10:51:02.929+02'); 145 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (45, 'angular2-introduction-to-services-exercise-solution', 'Angular 2 Services - Exercise Solution - Do an HTTP DELETE', '3:55', 32, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.259+02', '2016-10-07 21:16:24.188+02'); 146 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (51, 'angular2-introduction-to-typescript-high-level-overview', 'Introduction to Typescript - High-level Overview', '7:00', 32, 1, true, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-06-10 14:47:27.988+02', '2016-07-25 20:55:32.629+02'); 147 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (93, 'angular2-router-styling-active-routes', 'Styling Active Routes With The routerLinkActive And routerLinkActiveOptions Directives', '2:00', 4, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.205+02', '2016-10-07 21:16:34.611+02'); 148 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (90, 'angular2-signup-form', 'Angular 2 Forms Section Exercise - Build a Signup Form', '1:34', 17, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:16.158+02', '2016-10-07 21:16:26.334+02'); 149 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (175, 'angular2-firebase-edit-lesson-initial-setup', 'Edit Lesson - Initial Screen Setup', '2:35', 44, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.567+02', '2016-10-07 21:16:32.937+02'); 150 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (91, 'angular2-signup-form-example', 'Exercise - Build an Angular 2 Signup Form - Lets do a little Functional Programming', '6:10', 18, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:16.172+02', '2016-10-07 21:16:26.335+02'); 151 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (62, 'angular2-observable-map-operator-how-to-create-an-observable-from-another', 'The RxJs Map Operator - How to create an Observable from another Observable', '3:04', 5, 9, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:32:57.146+02', '2016-10-07 21:16:27.267+02'); 152 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (83, 'angular2-formbuilder', 'Building Reactive or Model Driven Forms using the FormBuilder', '2:13', 9, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.076+02', '2016-10-07 21:16:25.718+02'); 153 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (22, 'angular2-components-exercise-solution', 'Angular 2 Components Tutorial For Beginners - Components Exercise Solution Inside', '2:08', 8, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.033+02', '2016-10-07 21:16:22.002+02'); 154 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (180, 'angular2-firebase-authentication-observable-data-service', 'Building an Authentication Observable Data Service', '7:06', 49, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.094+02', '2016-10-07 21:16:33.45+02'); 155 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (118, 'angular2-firebase-typescript', 'Use Firebase SDK with Typescript - Preparing to Run a Firebase Database Population Script', '3:18', 4, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.593+02', '2016-10-07 21:16:28.922+02'); 156 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (185, 'angular2-firebase-security-rules', 'Protect Write Access Using Security Rules', '1:34', 54, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.63+02', '2016-10-07 21:16:33.964+02'); 157 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (157, 'angular2-firebase-join-3', 'Joins in Firebase - Performance Considerations', '7:39', 28, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.844+02', '2016-10-07 21:16:31.393+02'); 158 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (154, 'angular2-setup-dev-environment-1', 'Setting Up an Angular 2 Development Environment', '8:47', -3, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-30 10:32:13.193+02', '2016-10-07 21:16:20.888+02'); 159 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (144, 'angular2-firebase-home-screen', 'Starting the Application From the Beginning - Build the Home Screen', '3:33', 16, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.926+02', '2016-10-07 21:16:29.98+02'); 160 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (47, 'angular2-directives-inputs-outputs-event-emitters', 'Angular 2 Directives - Inputs, Output Event Emitters and How To Export Template References', '4:01', 10, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:05:54.592+02', '2016-10-07 21:16:22.009+02'); 161 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (137, 'angular2-angular-cli', 'Getting Started with Angular 2 - Off the Ground Running with the Angular CLI', '8:47', -1, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-25 20:47:01.476+02', '2016-10-07 21:16:20.898+02'); 162 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (162, 'angular2-firebase-pagination-3', 'Firebase Pagination Concluded - Loading the Previous Page', '2:11', 33, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.364+02', '2016-10-07 21:16:31.905+02'); 163 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (96, 'angular2-router-home-route-fallback-route', 'Configuring a Home Route and Fallback Route - Learn An Essential Routing Concept', '2:55', 3, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.199+02', '2016-10-07 21:16:34.477+02'); 164 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (86, 'angular2-custom-validator-model-driven', 'Angular 2 Model Driven Form Custom Validator', '3:05', 13, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.629+02', '2016-10-07 21:16:25.789+02'); 165 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (170, 'angular2-firebase-detail-navigation-route-params-observable', 'Navigating From Lesson To Lesson - The Route Params Observable', '4:48', 39, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.031+02', '2016-10-07 21:16:32.423+02'); 166 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (102, 'angular2-router-can-activate-guard', 'CanActivate Route Guard - An Example of An Asynchronous Route Guard', '3:31', 11, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.838+02', '2016-10-07 21:16:35.195+02'); 167 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (67, 'angular2-how-to-do-multiple-http-requests-using-the-rxjs-concat-operator', 'How to do multiple HTTP requests using the RxJs Concat Operator', '4:19', 8, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.319+02', '2016-10-07 21:16:27.391+02'); 168 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (133, 'angular2-firebase-arrays', 'Firebase Arrays - Does Firebase Support Arrays ? ', '5:34', 9, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.445+02'); 169 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (150, 'angular2-firebase-router-config', 'Setting Up the Router Configuration of our Application', '4:47', 21, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.458+02', '2016-10-07 21:16:30.498+02'); 170 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (107, 'angular2-router-hash-location-strategy', 'Angular 2 Router Hash Location Strategy vs HTML5 Location Strategy', '3:04', 15, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:08.384+02', '2016-10-07 21:16:35.719+02'); 171 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (97, 'angular2-router-manual-navigation', 'Programmatic Router Navigation via the Router API - Relative And Absolute Router Navigation', '3:59', 6, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.269+02', '2016-10-07 21:16:34.671+02'); 172 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (53, 'angular2-introduction-to-typescript-array-spread-operator-object-destructuring', 'Introduction To Typescript - The Array Spread Operator, Object Destructuring and more', '4:54', 35, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:47:27.99+02', '2016-10-07 21:16:24.196+02'); 173 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (54, 'angular2-introduction-to-typescript-imports-and-exports', 'Introduction To Typescript - Imports and Exports - One of the main missing features of ES5 ?', '4:32', 36, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-10 14:47:28.017+02', '2016-10-07 21:16:24.691+02'); 174 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (113, 'angular2-shared-modules-service-configuration', 'Shared Modules And Lazy Loading - How to Setup Shared Services', '6:39', 17, 7, true, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-09-02 16:31:04.607+02', '2016-10-07 21:16:35.721+02'); 175 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (8, 'angular2-core-directives-ngIf', 'Angular 2 Core Directives - ngIf', '3:56', 13, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.547+02'); 176 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (84, 'angular2-reactive-forms-rxjs', 'Reactive Forms with RxJs - Learn Why They Are more Powerful than Template Driven', '6:23', 10, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.417+02', '2016-10-07 21:16:25.784+02'); 177 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (61, 'angular2-observable-composition-combine-latests', 'Observable Composition - combine multiple Observables Using combineLatest', '5:59', 6, 9, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:32:57.158+02', '2016-10-07 21:16:27.363+02'); 178 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (110, 'angular2-ngmodule', 'Angular 2 Modularity - @NgModule and Feature Modules - Learn why a Component Might Not Be Visible', '4:48', 30, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-02 15:52:42.033+02', '2016-10-07 21:16:24.162+02'); 179 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (171, 'angular2-firebase-create-new-lesson', 'The Create New Lesson Form', '5:21', 40, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.035+02', '2016-10-07 21:16:32.552+02'); 180 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (186, 'angular2-firebase-node-queue', 'Build a Custom Node Backend Using Firebase Queue', '11:46', 55, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.635+02', '2016-10-07 21:16:34.09+02'); 181 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (176, 'angular2-firebase-edit-lesson-router-resolve', 'Edit Lesson - Retrieve Lesson using the Router Resolve Functionality', '7:54', 45, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:34.569+02', '2016-10-07 21:16:33.065+02'); 182 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (79, 'angular2-form-field-errors', 'How to display Form Field Validation Error Messages with NgModel', '3:28', 5, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.895+02', '2016-10-07 21:16:25.252+02'); 183 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (145, 'angular2-firebase-service-layer-example', 'Building our First Firebase Service - The Lessons Service', '7:24', 17, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.93+02', '2016-10-07 21:16:29.984+02'); 184 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (2, 'angular2-template-syntax-properties', 'Angular 2 Template Syntax - Properties', '5:12', 17, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:23.094+02'); 185 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (146, 'angular2-firebase-smart-vs-presentation-components', 'Angular 2 Smart Components vs Presentation Components: What''s the Difference and When to Use Each ?', '4:36', 18, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.969+02', '2016-10-07 21:16:30.364+02'); 186 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (52, 'angular2-introduction-to-typescript-classes-and-interfaces', 'Introduction To Typescript - Classes and Interfaces', '3:47', 33, 1, true, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-06-10 14:47:27.989+02', '2016-09-25 21:35:33.363+02'); 187 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (66, 'angular2-how-to--aAvoid-duplicate-http-requests-rxjs-cache-operator', 'Avoid the Biggest Pitfall of Angular 2 HTTP - Learn the RxJs Cache Operator', '5:10', 7, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.312+02', '2016-10-07 21:16:27.378+02'); 188 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (73, 'angular2-exercise-solution-learn-how-to-build-a-typeahead-that-cancels-obsolete-search-requests', 'Exercise Solution - Learn How to build a Typeahead that cancels obsolete search requests', '5:07', 14, 9, true, 'https://github.com/angular-university/courses', 'INTERMEDIATE', '2016-06-17 12:46:13.903+02', '2016-10-07 21:16:27.911+02'); 189 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (114, 'what-is-a-single-page-application', 'What is a Single Page Application ? Learn Why They Might Become More Frequent In The Future', '4:00', 0, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-20 13:16:05.526+02', '2016-10-07 21:16:34.144+02'); 190 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (89, 'angular2-template-driven-vs-model-driven-forms', 'When To Use Angular 2 Template Driven Vs Model Driven Forms, and Why ? ', '5:04', 16, 4, false, 'https://github.com/angular-university/courses', 'ADVANCED', '2016-07-14 10:56:15.937+02', '2016-10-07 21:16:26.331+02'); 191 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (98, 'angular2-router-navigation-parameters', 'Master Detail Navigation And Route Parameters - The Route Parameters Observable', '6:03', 7, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.27+02', '2016-10-07 21:16:34.674+02'); 192 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (104, 'angular2-router-can-deactivate-guard', 'CanDeactivate Route Guard - How To Confirm If The User Wants To Exit A Route', '4:42', 10, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:07.839+02', '2016-10-07 21:16:35.191+02'); 193 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (44, 'angular2-rest-api-http-server-development', 'How to Setup a Development REST API HTTP Server with Express and ts-node', '2:46', 29, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-03 10:25:37.254+02', '2016-10-07 21:16:23.653+02'); 194 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (109, 'angular2-router-exercise-solution-build-a-dashboard', 'Exercise Solution - Implement a Widget Dashboard With Multiple Auxiliary Routes', '4:41', 19, 7, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:08.387+02', '2016-10-07 21:16:36.157+02'); 195 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (147, 'angular2-firebase-typescript-pitfall', 'Pitfall of Using Typescript Classes when Querying Data From a Backend', '6:21', 19, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.972+02', '2016-10-07 21:16:30.477+02'); 196 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (149, 'angular2-firebase-navigation-menu', 'Building a Navigation Menu Using The Angular 2 Router', '5:53', 22, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.456+02', '2016-10-07 21:16:30.501+02'); 197 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (181, 'angular2-firebase-user-registration-page', 'Build a User Registration Page', '3:50', 50, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-10-06 17:01:35.106+02', '2016-10-07 21:16:33.579+02'); 198 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (151, 'angular2-firebase-master-detail', 'Setting Up the Master Screen of the Master Detail Pattern', '6:46', 23, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.486+02', '2016-10-07 21:16:30.879+02'); 199 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (94, 'angular2-router-navigation', 'Navigate Between Angular 2 Routes - Several Ways Of Using the routerLink Directive', '3:18', 2, 7, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-22 13:11:06.198+02', '2016-10-07 21:16:34.15+02'); 200 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (134, 'angular2-firebase-data-modelling', 'Firebase Data Modeling 101 - How To Model Data In Firebase ?', '4:11', 7, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.173+02', '2016-10-07 21:16:28.946+02'); 201 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (140, 'angular2-firebase-list-push', 'How to Write Data to the Database using AngularFire 2 ? Adding Elements to a List', '3:52', 12, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 16:44:44.433+02', '2016-10-07 21:16:29.468+02'); 202 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (142, 'angular2-firebase-list-remove', 'How To Remove an Element from a List using AngularFire 2 ?', '3:08', 13, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.847+02'); 203 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (95, 'angular2-router-introduction', 'Angular 2 Router Demo - Why Build Single Applications ?', '4:00', 0, 7, false, 'https://github.com/angular-university/courses/tree/master/01-getting-started-with-angular2/', 'BEGINNER', '2016-07-22 13:11:06.17+02', '2016-07-22 19:39:03.616+02'); 204 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (148, 'angular2-firebase-client-side-search', 'How To Implement Client-Side Search in Angular 2 ?', '4:00', 20, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.348+02', '2016-10-07 21:16:30.485+02'); 205 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (141, 'angular2-firebase-list-update', 'How To Update an Element in a Firebase List using AngularFire 2 ?', '1:11', 14, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.406+02', '2016-10-07 21:16:29.961+02'); 206 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (166, 'angular2-firebase-install-node-and-demo-app', 'Installing Node and the Angular 2 and Firebase Demo Application', '4:45', -2, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:50:35.241+02', '2016-10-07 21:16:28.403+02'); 207 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (115, 'angular2-firebase-sdk-hello-world', 'Firebase Real-Time Database Hello World - First Query - Debug Websockets !', '8:15', 2, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.568+02', '2016-10-07 21:16:28.43+02'); 208 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (123, 'angular2-populate-firebase-db-ts-node', 'Populate a Firebase Database with a Node Program - Use Typescript with Node using ts-node', '4:24', 5, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:18.338+02', '2016-10-07 21:16:28.927+02'); 209 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (136, 'angular2-firebase-db-script-explained', 'Populate a Firebase Database -Initialization Script Explained Step By Step', '3:53', 6, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.165+02', '2016-10-07 21:16:28.943+02'); 210 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (152, 'angular2-firebase-master-detail-navigation', 'Configuring the Angular 2 Router for Master To Detail Navigation', '3:23', 24, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.499+02', '2016-10-07 21:16:30.993+02'); 211 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (135, 'angular2-firebase-database-ekeys', 'Firebase Key Generation - How to use the Firebase Push Keys, Should We Use Them and Why ?', '3:09', 8, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:22:37.174+02', '2016-10-07 21:16:29.327+02'); 212 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (82, 'angular2-model-driven-forms-validation', 'Angular 2 Form Validation in Model Driven Forms - Configuring a Form Validator', '2:29', 8, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:15.077+02', '2016-10-07 21:16:25.256+02'); 213 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (111, 'angular2-set-form-value-reset-form', 'Angular 2 Model Driven Forms - How to Set a Form Value and Reset a Form', '4:48', 15, 4, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-09-02 16:24:08.915+02', '2016-10-07 21:16:26.32+02'); 214 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (14, 'angular2-passing-data-to-component-using-input', 'Component @Input - How To Pass Input Data To an Angular 2 Component', '2:33', 2, 1, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:29.966+02', '2016-10-07 21:16:21.457+02'); 215 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (63, 'how-does-angular2-use-observables-http-response-object', 'How does Angular 2 HTTP use Observables ? The HTTP Response object', '4:32', 2, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:46:12.757+02', '2016-10-07 21:16:26.858+02'); 216 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (64, 'angular2-how-to-use-observables-and-http-to-build-a-servicelayer', 'How to use Observables and HTTP to build a Service Layer', '4:32', 3, 9, false, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:46:13.26+02', '2016-10-07 21:16:26.87+02'); 217 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (21, 'angular2-components-exercise', 'Angular 2 Components Tutorial For Beginners - Components Exercise !', '1:26', 7, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:30.024+02', '2016-10-07 21:16:22.001+02'); 218 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (65, 'angular2-how-to-use-the-async-pipe-to-pass-observables-into-a-template', 'Introduction to Functional Reactive Programming - Using the Async Pipe - Pitfalls to Avoid', '4:36', 4, 9, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-06-17 12:46:13.311+02', '2016-10-07 21:16:26.872+02'); 219 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (9, 'angular2-guided-tour-directives', 'Directives Guided Tour - Learn Why Directives Might be a Better Choice Than Components', '7:58', 14, 1, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-05-30 17:19:09.547+02', '2016-10-07 21:16:22.545+02'); 220 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (117, 'angular2-firebase-demo-course-intro', 'Build an Application with Angular 2 and Firebase - Application Demo and Course Objectives', '6:51', -3, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-23 20:16:17.566+02', '2016-10-07 21:16:28.297+02'); 221 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (153, 'angular2-firebase-master-detail-detail-screen', 'Setting Up the Detail Screen of a Master Detail Setup', '5:03', 25, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:15.866+02', '2016-10-07 21:16:31.001+02'); 222 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (143, 'angular2-firebase-object-set-update', 'How to Modify an Object in Firebase using AngularFire 2, what is the Difference Between Set and Update?', '3:31', 15, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 17:53:14.83+02', '2016-10-07 21:16:29.97+02'); 223 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (78, 'angular2-form-exports', 'Understanding Angular 2 Form Exports - Disable a Form Button Until the Form is Valid', '3:15', 4, 4, true, 'https://github.com/angular-university/courses', 'BEGINNER', '2016-07-14 10:56:14.379+02', '2016-10-07 21:16:25.202+02'); 224 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (138, 'angular2-firebase-list-observable', 'AngularFire 2 Hello World - How To Write your First Query using AngularFire 2 List Observables ?', '7:43', 10, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 16:44:44.347+02', '2016-10-07 21:16:29.457+02'); 225 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (139, 'angular2-firebase-object-observable', 'AngularFire 2 Object Observables - How to Read Objects from a Firebase Database?', '2:19', 11, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-28 16:44:44.429+02', '2016-10-07 21:16:29.466+02'); 226 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (156, 'angular2-firebase-join-1', 'How To Make a Join in Firebase Using AngularFire 2 ? Reading a Course based on its url', '9:30', 26, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.502+02', '2016-10-07 21:16:31.014+02'); 227 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (155, 'angular2-firebase-join-2', 'Joins in Firebase Continued - Querying the List Of Lesson Keys Of Lessons that Belong to a Course', '2:51', 27, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.504+02', '2016-10-07 21:16:31.016+02'); 228 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (158, 'angular2-rxjs-clean-code', 'How to Write Maintainable RxJs Code ? Some Tips and Tricks on How to Write Clean Reactive Code', '4:53', 29, 5, false, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.898+02', '2016-10-07 21:16:31.512+02'); 229 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (159, 'angular2-firebase-pagination-display-course-lessons', 'Displaying the Lessons Per Course in the Course Detail Page', '3:50', 30, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:19.934+02', '2016-10-07 21:16:31.514+02'); 230 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (160, 'angular2-firebase-pagination', 'How To Do Pagination in Firebase ? Loading the First Page of a Paginated Table', '7:52', 31, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.063+02', '2016-10-07 21:16:31.53+02'); 231 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (161, 'angular2-firebase-pagination-2', 'Firebase Pagination Continued - Loading the Next Page', '4:12', 32, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.08+02', '2016-10-07 21:16:31.533+02'); 232 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (163, 'angular2-firebase-navigate-from-course-to-lesson', 'Navigate From Course Detail to Lesson', '5:17', 34, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.435+02', '2016-10-07 21:16:32.036+02'); 233 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (164, 'angular2-firebase-lesson-detail', 'Building a Lesson Detail Component', '4:17', 35, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.476+02', '2016-10-07 21:16:32.046+02'); 234 | INSERT INTO "Lessons" (id, url, description, duration, "seqNo", "courseId", pro, "gitHubUrl", tags, "createdAt", "updatedAt") VALUES (165, 'angular2-firebase-security-iframe', 'Angular 2 Security - Adding an iframe to an Angular 2 Template', '4:14', 36, 5, true, 'https://github.com/angular-university/angular-firebase-app', 'BEGINNER', '2016-09-30 10:32:20.585+02', '2016-10-07 21:16:32.053+02'); -------------------------------------------------------------------------------- /sql/db-schema-drop.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE "Lessons"; 2 | 3 | DROP TABLE "Courses"; 4 | 5 | DROP DATABASE "complete-typescript-course"; -------------------------------------------------------------------------------- /sql/valid-lesson-post.json: -------------------------------------------------------------------------------- 1 | { 2 | "url": "new-lesson-test-2", 3 | "description": "TEST LESSON", 4 | "duration": "10", 5 | "seqNo": "12", 6 | "gitHubUrl": "https://github.com/angular-university" 7 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "noImplicitAny": true, 6 | "sourceMap": true, 7 | "strictNullChecks": true, 8 | "noEmitOnError": true, 9 | "experimentalDecorators": true, 10 | "emitDecoratorMetadata": true, 11 | "lib": ["es6"], 12 | "skipLibCheck": true 13 | }, 14 | "exclude": [ 15 | "client/node_modules" 16 | ] 17 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/bluebird@*", "@types/bluebird@^3.0.35": 6 | version "3.5.18" 7 | resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.18.tgz#6a60435d4663e290f3709898a4f75014f279c4d6" 8 | 9 | "@types/body-parser@*": 10 | version "1.16.7" 11 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.16.7.tgz#455fc23fd0ddaaeda6cd6cbb653558276e5920fa" 12 | dependencies: 13 | "@types/express" "*" 14 | "@types/node" "*" 15 | 16 | "@types/express-serve-static-core@*": 17 | version "4.0.56" 18 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.0.56.tgz#4ed556dcff9012cce6b016e214fdc5ef6e99db7d" 19 | dependencies: 20 | "@types/node" "*" 21 | 22 | "@types/express@*", "@types/express@^4.0.33": 23 | version "4.0.39" 24 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.39.tgz#1441f21d52b33be8d4fa8a865c15a6a91cd0fa09" 25 | dependencies: 26 | "@types/body-parser" "*" 27 | "@types/express-serve-static-core" "*" 28 | "@types/serve-static" "*" 29 | 30 | "@types/geojson@^1.0.0": 31 | version "1.0.6" 32 | resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.6.tgz#3e02972728c69248c2af08d60a48cbb8680fffdf" 33 | 34 | "@types/lodash@*", "@types/lodash@^4.14.37": 35 | version "4.14.82" 36 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.82.tgz#18948897f415ef199a93156a66ef7ce1d0d005b9" 37 | 38 | "@types/mime@*": 39 | version "2.0.0" 40 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 41 | 42 | "@types/node@*": 43 | version "8.0.49" 44 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.49.tgz#417f86ab4829c629fe561779ee48751e0fe2a11b" 45 | 46 | "@types/node@^6.0.45": 47 | version "6.0.90" 48 | resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.90.tgz#0ed74833fa1b73dcdb9409dcb1c97ec0a8b13b02" 49 | 50 | "@types/sequelize@4.0.38": 51 | version "4.0.38" 52 | resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.0.38.tgz#98d3269f0cb406a818f2316d9f14563fe2e8d498" 53 | dependencies: 54 | "@types/bluebird" "*" 55 | "@types/lodash" "*" 56 | "@types/validator" "*" 57 | 58 | "@types/serve-static@*": 59 | version "1.13.0" 60 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.0.tgz#2ef359d8d5982bc011a7a8fa36016e629e8b7635" 61 | dependencies: 62 | "@types/express-serve-static-core" "*" 63 | "@types/mime" "*" 64 | 65 | "@types/validator@*": 66 | version "6.3.0" 67 | resolved "https://registry.yarnpkg.com/@types/validator/-/validator-6.3.0.tgz#d7454bd67c6a933a9dbe939ae16edbf0f6894e70" 68 | 69 | abbrev@1: 70 | version "1.1.1" 71 | resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 72 | 73 | accepts@~1.3.4: 74 | version "1.3.4" 75 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" 76 | dependencies: 77 | mime-types "~2.1.16" 78 | negotiator "0.6.1" 79 | 80 | ajv@^4.9.1: 81 | version "4.11.8" 82 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" 83 | dependencies: 84 | co "^4.6.0" 85 | json-stable-stringify "^1.0.1" 86 | 87 | ansi-align@^2.0.0: 88 | version "2.0.0" 89 | resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 90 | dependencies: 91 | string-width "^2.0.0" 92 | 93 | ansi-regex@^2.0.0: 94 | version "2.1.1" 95 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 96 | 97 | ansi-regex@^3.0.0: 98 | version "3.0.0" 99 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 100 | 101 | ansi-styles@^2.2.1: 102 | version "2.2.1" 103 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 104 | 105 | ansi-styles@^3.1.0: 106 | version "3.2.0" 107 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 108 | dependencies: 109 | color-convert "^1.9.0" 110 | 111 | any-promise@^1.3.0: 112 | version "1.3.0" 113 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 114 | 115 | anymatch@^1.3.0: 116 | version "1.3.2" 117 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" 118 | dependencies: 119 | micromatch "^2.1.5" 120 | normalize-path "^2.0.0" 121 | 122 | aproba@^1.0.3: 123 | version "1.2.0" 124 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" 125 | 126 | are-we-there-yet@~1.1.2: 127 | version "1.1.4" 128 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 129 | dependencies: 130 | delegates "^1.0.0" 131 | readable-stream "^2.0.6" 132 | 133 | arr-diff@^2.0.0: 134 | version "2.0.0" 135 | resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" 136 | dependencies: 137 | arr-flatten "^1.0.1" 138 | 139 | arr-flatten@^1.0.1: 140 | version "1.1.0" 141 | resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" 142 | 143 | array-flatten@1.1.1: 144 | version "1.1.1" 145 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 146 | 147 | array-unique@^0.2.1: 148 | version "0.2.1" 149 | resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" 150 | 151 | arrify@^1.0.0: 152 | version "1.0.1" 153 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 154 | 155 | asn1@~0.2.3: 156 | version "0.2.3" 157 | resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" 158 | 159 | assert-plus@1.0.0, assert-plus@^1.0.0: 160 | version "1.0.0" 161 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" 162 | 163 | assert-plus@^0.2.0: 164 | version "0.2.0" 165 | resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" 166 | 167 | async-each@^1.0.0: 168 | version "1.0.1" 169 | resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" 170 | 171 | async@0.9.0: 172 | version "0.9.0" 173 | resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" 174 | 175 | asynckit@^0.4.0: 176 | version "0.4.0" 177 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 178 | 179 | aws-sign2@~0.6.0: 180 | version "0.6.0" 181 | resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" 182 | 183 | aws4@^1.2.1: 184 | version "1.6.0" 185 | resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" 186 | 187 | balanced-match@^1.0.0: 188 | version "1.0.0" 189 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 190 | 191 | bcrypt-pbkdf@^1.0.0: 192 | version "1.0.1" 193 | resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" 194 | dependencies: 195 | tweetnacl "^0.14.3" 196 | 197 | binary-extensions@^1.0.0: 198 | version "1.10.0" 199 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.10.0.tgz#9aeb9a6c5e88638aad171e167f5900abe24835d0" 200 | 201 | block-stream@*: 202 | version "0.0.9" 203 | resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" 204 | dependencies: 205 | inherits "~2.0.0" 206 | 207 | bluebird@^3.3.4, bluebird@^3.4.6: 208 | version "3.5.1" 209 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" 210 | 211 | body-parser@1.18.2, body-parser@^1.15.2: 212 | version "1.18.2" 213 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" 214 | dependencies: 215 | bytes "3.0.0" 216 | content-type "~1.0.4" 217 | debug "2.6.9" 218 | depd "~1.1.1" 219 | http-errors "~1.6.2" 220 | iconv-lite "0.4.19" 221 | on-finished "~2.3.0" 222 | qs "6.5.1" 223 | raw-body "2.3.2" 224 | type-is "~1.6.15" 225 | 226 | boom@2.x.x: 227 | version "2.10.1" 228 | resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" 229 | dependencies: 230 | hoek "2.x.x" 231 | 232 | boxen@^1.2.1: 233 | version "1.2.2" 234 | resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.2.tgz#3f1d4032c30ffea9d4b02c322eaf2ea741dcbce5" 235 | dependencies: 236 | ansi-align "^2.0.0" 237 | camelcase "^4.0.0" 238 | chalk "^2.0.1" 239 | cli-boxes "^1.0.0" 240 | string-width "^2.0.0" 241 | term-size "^1.2.0" 242 | widest-line "^1.0.0" 243 | 244 | brace-expansion@^1.1.7: 245 | version "1.1.8" 246 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 247 | dependencies: 248 | balanced-match "^1.0.0" 249 | concat-map "0.0.1" 250 | 251 | braces@^1.8.2: 252 | version "1.8.5" 253 | resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" 254 | dependencies: 255 | expand-range "^1.8.1" 256 | preserve "^0.2.0" 257 | repeat-element "^1.1.2" 258 | 259 | buffer-writer@1.0.1: 260 | version "1.0.1" 261 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-1.0.1.tgz#22a936901e3029afcd7547eb4487ceb697a3bf08" 262 | 263 | bytes@3.0.0: 264 | version "3.0.0" 265 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 266 | 267 | camelcase@^4.0.0: 268 | version "4.1.0" 269 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 270 | 271 | capture-stack-trace@^1.0.0: 272 | version "1.0.0" 273 | resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" 274 | 275 | caseless@~0.12.0: 276 | version "0.12.0" 277 | resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 278 | 279 | chalk@^1.1.1: 280 | version "1.1.3" 281 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 282 | dependencies: 283 | ansi-styles "^2.2.1" 284 | escape-string-regexp "^1.0.2" 285 | has-ansi "^2.0.0" 286 | strip-ansi "^3.0.0" 287 | supports-color "^2.0.0" 288 | 289 | chalk@^2.0.1: 290 | version "2.3.0" 291 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 292 | dependencies: 293 | ansi-styles "^3.1.0" 294 | escape-string-regexp "^1.0.5" 295 | supports-color "^4.0.0" 296 | 297 | chokidar@^1.7.0: 298 | version "1.7.0" 299 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" 300 | dependencies: 301 | anymatch "^1.3.0" 302 | async-each "^1.0.0" 303 | glob-parent "^2.0.0" 304 | inherits "^2.0.1" 305 | is-binary-path "^1.0.0" 306 | is-glob "^2.0.0" 307 | path-is-absolute "^1.0.0" 308 | readdirp "^2.0.0" 309 | optionalDependencies: 310 | fsevents "^1.0.0" 311 | 312 | cli-boxes@^1.0.0: 313 | version "1.0.0" 314 | resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 315 | 316 | co@^4.6.0: 317 | version "4.6.0" 318 | resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" 319 | 320 | code-point-at@^1.0.0: 321 | version "1.1.0" 322 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 323 | 324 | color-convert@^1.9.0: 325 | version "1.9.0" 326 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" 327 | dependencies: 328 | color-name "^1.1.1" 329 | 330 | color-name@^1.1.1: 331 | version "1.1.3" 332 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 333 | 334 | colors@1.0.3: 335 | version "1.0.3" 336 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 337 | 338 | combined-stream@^1.0.5, combined-stream@~1.0.5: 339 | version "1.0.5" 340 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" 341 | dependencies: 342 | delayed-stream "~1.0.0" 343 | 344 | concat-map@0.0.1: 345 | version "0.0.1" 346 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 347 | 348 | configstore@^3.0.0: 349 | version "3.1.1" 350 | resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" 351 | dependencies: 352 | dot-prop "^4.1.0" 353 | graceful-fs "^4.1.2" 354 | make-dir "^1.0.0" 355 | unique-string "^1.0.0" 356 | write-file-atomic "^2.0.0" 357 | xdg-basedir "^3.0.0" 358 | 359 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 360 | version "1.1.0" 361 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 362 | 363 | content-disposition@0.5.2: 364 | version "0.5.2" 365 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 366 | 367 | content-type@~1.0.4: 368 | version "1.0.4" 369 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 370 | 371 | cookie-signature@1.0.6: 372 | version "1.0.6" 373 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 374 | 375 | cookie@0.3.1: 376 | version "0.3.1" 377 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 378 | 379 | core-util-is@1.0.2, core-util-is@~1.0.0: 380 | version "1.0.2" 381 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 382 | 383 | corser@~2.0.0: 384 | version "2.0.1" 385 | resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" 386 | 387 | create-error-class@^3.0.0: 388 | version "3.0.2" 389 | resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 390 | dependencies: 391 | capture-stack-trace "^1.0.0" 392 | 393 | cross-spawn@^5.0.1: 394 | version "5.1.0" 395 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 396 | dependencies: 397 | lru-cache "^4.0.1" 398 | shebang-command "^1.2.0" 399 | which "^1.2.9" 400 | 401 | cryptiles@2.x.x: 402 | version "2.0.5" 403 | resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" 404 | dependencies: 405 | boom "2.x.x" 406 | 407 | crypto-random-string@^1.0.0: 408 | version "1.0.0" 409 | resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 410 | 411 | dashdash@^1.12.0: 412 | version "1.14.1" 413 | resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 414 | dependencies: 415 | assert-plus "^1.0.0" 416 | 417 | debug@2.6.9, debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: 418 | version "2.6.9" 419 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 420 | dependencies: 421 | ms "2.0.0" 422 | 423 | deep-extend@~0.4.0: 424 | version "0.4.2" 425 | resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" 426 | 427 | delayed-stream@~1.0.0: 428 | version "1.0.0" 429 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 430 | 431 | delegates@^1.0.0: 432 | version "1.0.0" 433 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 434 | 435 | depd@1.1.1, depd@^1.1.0, depd@~1.1.1: 436 | version "1.1.1" 437 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" 438 | 439 | destroy@~1.0.4: 440 | version "1.0.4" 441 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 442 | 443 | detect-libc@^1.0.2: 444 | version "1.0.2" 445 | resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.2.tgz#71ad5d204bf17a6a6ca8f450c61454066ef461e1" 446 | 447 | diff@^3.1.0: 448 | version "3.4.0" 449 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" 450 | 451 | dot-prop@^4.1.0: 452 | version "4.2.0" 453 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" 454 | dependencies: 455 | is-obj "^1.0.0" 456 | 457 | dottie@^1.0.0: 458 | version "1.1.1" 459 | resolved "https://registry.yarnpkg.com/dottie/-/dottie-1.1.1.tgz#45c2a3f48bd6528eeed267a69a848eaaca6faa6a" 460 | 461 | duplexer3@^0.1.4: 462 | version "0.1.4" 463 | resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" 464 | 465 | duplexer@~0.1.1: 466 | version "0.1.1" 467 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 468 | 469 | ecc-jsbn@~0.1.1: 470 | version "0.1.1" 471 | resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" 472 | dependencies: 473 | jsbn "~0.1.0" 474 | 475 | ecstatic@^1.4.0: 476 | version "1.4.1" 477 | resolved "https://registry.yarnpkg.com/ecstatic/-/ecstatic-1.4.1.tgz#32cb7b6fa2e290d58668674d115e8f0c3d567d6a" 478 | dependencies: 479 | he "^0.5.0" 480 | mime "^1.2.11" 481 | minimist "^1.1.0" 482 | url-join "^1.0.0" 483 | 484 | ee-first@1.1.1: 485 | version "1.1.1" 486 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 487 | 488 | encodeurl@~1.0.1: 489 | version "1.0.1" 490 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.1.tgz#79e3d58655346909fe6f0f45a5de68103b294d20" 491 | 492 | error-ex@^1.2.0: 493 | version "1.3.1" 494 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 495 | dependencies: 496 | is-arrayish "^0.2.1" 497 | 498 | es6-promise@^3.3.1: 499 | version "3.3.1" 500 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" 501 | 502 | escape-html@~1.0.3: 503 | version "1.0.3" 504 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 505 | 506 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 507 | version "1.0.5" 508 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 509 | 510 | etag@~1.8.1: 511 | version "1.8.1" 512 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 513 | 514 | event-stream@~3.3.0: 515 | version "3.3.4" 516 | resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" 517 | dependencies: 518 | duplexer "~0.1.1" 519 | from "~0" 520 | map-stream "~0.1.0" 521 | pause-stream "0.0.11" 522 | split "0.3" 523 | stream-combiner "~0.0.4" 524 | through "~2.3.1" 525 | 526 | eventemitter3@1.x.x: 527 | version "1.2.0" 528 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" 529 | 530 | execa@^0.7.0: 531 | version "0.7.0" 532 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" 533 | dependencies: 534 | cross-spawn "^5.0.1" 535 | get-stream "^3.0.0" 536 | is-stream "^1.1.0" 537 | npm-run-path "^2.0.0" 538 | p-finally "^1.0.0" 539 | signal-exit "^3.0.0" 540 | strip-eof "^1.0.0" 541 | 542 | expand-brackets@^0.1.4: 543 | version "0.1.5" 544 | resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" 545 | dependencies: 546 | is-posix-bracket "^0.1.0" 547 | 548 | expand-range@^1.8.1: 549 | version "1.8.2" 550 | resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" 551 | dependencies: 552 | fill-range "^2.1.0" 553 | 554 | express@^4.14.0: 555 | version "4.16.2" 556 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" 557 | dependencies: 558 | accepts "~1.3.4" 559 | array-flatten "1.1.1" 560 | body-parser "1.18.2" 561 | content-disposition "0.5.2" 562 | content-type "~1.0.4" 563 | cookie "0.3.1" 564 | cookie-signature "1.0.6" 565 | debug "2.6.9" 566 | depd "~1.1.1" 567 | encodeurl "~1.0.1" 568 | escape-html "~1.0.3" 569 | etag "~1.8.1" 570 | finalhandler "1.1.0" 571 | fresh "0.5.2" 572 | merge-descriptors "1.0.1" 573 | methods "~1.1.2" 574 | on-finished "~2.3.0" 575 | parseurl "~1.3.2" 576 | path-to-regexp "0.1.7" 577 | proxy-addr "~2.0.2" 578 | qs "6.5.1" 579 | range-parser "~1.2.0" 580 | safe-buffer "5.1.1" 581 | send "0.16.1" 582 | serve-static "1.13.1" 583 | setprototypeof "1.1.0" 584 | statuses "~1.3.1" 585 | type-is "~1.6.15" 586 | utils-merge "1.0.1" 587 | vary "~1.1.2" 588 | 589 | extend@~3.0.0: 590 | version "3.0.1" 591 | resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" 592 | 593 | extglob@^0.3.1: 594 | version "0.3.2" 595 | resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" 596 | dependencies: 597 | is-extglob "^1.0.0" 598 | 599 | extsprintf@1.3.0, extsprintf@^1.2.0: 600 | version "1.3.0" 601 | resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" 602 | 603 | filename-regex@^2.0.0: 604 | version "2.0.1" 605 | resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" 606 | 607 | fill-range@^2.1.0: 608 | version "2.2.3" 609 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" 610 | dependencies: 611 | is-number "^2.1.0" 612 | isobject "^2.0.0" 613 | randomatic "^1.1.3" 614 | repeat-element "^1.1.2" 615 | repeat-string "^1.5.2" 616 | 617 | finalhandler@1.1.0: 618 | version "1.1.0" 619 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" 620 | dependencies: 621 | debug "2.6.9" 622 | encodeurl "~1.0.1" 623 | escape-html "~1.0.3" 624 | on-finished "~2.3.0" 625 | parseurl "~1.3.2" 626 | statuses "~1.3.1" 627 | unpipe "~1.0.0" 628 | 629 | for-in@^1.0.1: 630 | version "1.0.2" 631 | resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" 632 | 633 | for-own@^0.1.4: 634 | version "0.1.5" 635 | resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" 636 | dependencies: 637 | for-in "^1.0.1" 638 | 639 | forever-agent@~0.6.1: 640 | version "0.6.1" 641 | resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" 642 | 643 | form-data@~2.1.1: 644 | version "2.1.4" 645 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" 646 | dependencies: 647 | asynckit "^0.4.0" 648 | combined-stream "^1.0.5" 649 | mime-types "^2.1.12" 650 | 651 | forwarded@~0.1.2: 652 | version "0.1.2" 653 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 654 | 655 | fresh@0.5.2: 656 | version "0.5.2" 657 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 658 | 659 | from@~0: 660 | version "0.1.7" 661 | resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" 662 | 663 | fs.realpath@^1.0.0: 664 | version "1.0.0" 665 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 666 | 667 | fsevents@^1.0.0: 668 | version "1.1.2" 669 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.2.tgz#3282b713fb3ad80ede0e9fcf4611b5aa6fc033f4" 670 | dependencies: 671 | nan "^2.3.0" 672 | node-pre-gyp "^0.6.36" 673 | 674 | fstream-ignore@^1.0.5: 675 | version "1.0.5" 676 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" 677 | dependencies: 678 | fstream "^1.0.0" 679 | inherits "2" 680 | minimatch "^3.0.0" 681 | 682 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: 683 | version "1.0.11" 684 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" 685 | dependencies: 686 | graceful-fs "^4.1.2" 687 | inherits "~2.0.0" 688 | mkdirp ">=0.5 0" 689 | rimraf "2" 690 | 691 | gauge@~2.7.3: 692 | version "2.7.4" 693 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 694 | dependencies: 695 | aproba "^1.0.3" 696 | console-control-strings "^1.0.0" 697 | has-unicode "^2.0.0" 698 | object-assign "^4.1.0" 699 | signal-exit "^3.0.0" 700 | string-width "^1.0.1" 701 | strip-ansi "^3.0.1" 702 | wide-align "^1.1.0" 703 | 704 | generic-pool@2.4.2: 705 | version "2.4.2" 706 | resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.2.tgz#886bc5bf0beb7db96e81bcbba078818de5a62683" 707 | 708 | generic-pool@2.4.3: 709 | version "2.4.3" 710 | resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-2.4.3.tgz#780c36f69dfad05a5a045dd37be7adca11a4f6ff" 711 | 712 | get-stream@^3.0.0: 713 | version "3.0.0" 714 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 715 | 716 | getpass@^0.1.1: 717 | version "0.1.7" 718 | resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" 719 | dependencies: 720 | assert-plus "^1.0.0" 721 | 722 | glob-base@^0.3.0: 723 | version "0.3.0" 724 | resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" 725 | dependencies: 726 | glob-parent "^2.0.0" 727 | is-glob "^2.0.0" 728 | 729 | glob-parent@^2.0.0: 730 | version "2.0.0" 731 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" 732 | dependencies: 733 | is-glob "^2.0.0" 734 | 735 | glob@^7.0.5: 736 | version "7.1.2" 737 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 738 | dependencies: 739 | fs.realpath "^1.0.0" 740 | inflight "^1.0.4" 741 | inherits "2" 742 | minimatch "^3.0.4" 743 | once "^1.3.0" 744 | path-is-absolute "^1.0.0" 745 | 746 | global-dirs@^0.1.0: 747 | version "0.1.0" 748 | resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.0.tgz#10d34039e0df04272e262cf24224f7209434df4f" 749 | dependencies: 750 | ini "^1.3.4" 751 | 752 | got@^6.7.1: 753 | version "6.7.1" 754 | resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" 755 | dependencies: 756 | create-error-class "^3.0.0" 757 | duplexer3 "^0.1.4" 758 | get-stream "^3.0.0" 759 | is-redirect "^1.0.0" 760 | is-retry-allowed "^1.0.0" 761 | is-stream "^1.0.0" 762 | lowercase-keys "^1.0.0" 763 | safe-buffer "^5.0.1" 764 | timed-out "^4.0.0" 765 | unzip-response "^2.0.1" 766 | url-parse-lax "^1.0.0" 767 | 768 | graceful-fs@^4.1.11, graceful-fs@^4.1.2: 769 | version "4.1.11" 770 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 771 | 772 | har-schema@^1.0.5: 773 | version "1.0.5" 774 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" 775 | 776 | har-validator@~4.2.1: 777 | version "4.2.1" 778 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" 779 | dependencies: 780 | ajv "^4.9.1" 781 | har-schema "^1.0.5" 782 | 783 | has-ansi@^2.0.0: 784 | version "2.0.0" 785 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 786 | dependencies: 787 | ansi-regex "^2.0.0" 788 | 789 | has-flag@^2.0.0: 790 | version "2.0.0" 791 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 792 | 793 | has-unicode@^2.0.0: 794 | version "2.0.1" 795 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 796 | 797 | hawk@3.1.3, hawk@~3.1.3: 798 | version "3.1.3" 799 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" 800 | dependencies: 801 | boom "2.x.x" 802 | cryptiles "2.x.x" 803 | hoek "2.x.x" 804 | sntp "1.x.x" 805 | 806 | he@^0.5.0: 807 | version "0.5.0" 808 | resolved "https://registry.yarnpkg.com/he/-/he-0.5.0.tgz#2c05ffaef90b68e860f3fd2b54ef580989277ee2" 809 | 810 | hoek@2.x.x: 811 | version "2.16.3" 812 | resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" 813 | 814 | http-errors@1.6.2, http-errors@~1.6.2: 815 | version "1.6.2" 816 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" 817 | dependencies: 818 | depd "1.1.1" 819 | inherits "2.0.3" 820 | setprototypeof "1.0.3" 821 | statuses ">= 1.3.1 < 2" 822 | 823 | http-proxy@^1.8.1: 824 | version "1.16.2" 825 | resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" 826 | dependencies: 827 | eventemitter3 "1.x.x" 828 | requires-port "1.x.x" 829 | 830 | http-server@^0.9.0: 831 | version "0.9.0" 832 | resolved "https://registry.yarnpkg.com/http-server/-/http-server-0.9.0.tgz#8f1b06bdc733618d4dc42831c7ba1aff4e06001a" 833 | dependencies: 834 | colors "1.0.3" 835 | corser "~2.0.0" 836 | ecstatic "^1.4.0" 837 | http-proxy "^1.8.1" 838 | opener "~1.4.0" 839 | optimist "0.6.x" 840 | portfinder "0.4.x" 841 | union "~0.4.3" 842 | 843 | http-signature@~1.1.0: 844 | version "1.1.1" 845 | resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" 846 | dependencies: 847 | assert-plus "^0.2.0" 848 | jsprim "^1.2.2" 849 | sshpk "^1.7.0" 850 | 851 | human-readable-ids@^1.0.1: 852 | version "1.0.3" 853 | resolved "https://registry.yarnpkg.com/human-readable-ids/-/human-readable-ids-1.0.3.tgz#c8c6c6e95085ccb668087b7dd767834e26ca26d4" 854 | dependencies: 855 | knuth-shuffle "^1.0.0" 856 | 857 | iconv-lite@0.4.19: 858 | version "0.4.19" 859 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" 860 | 861 | ignore-by-default@^1.0.1: 862 | version "1.0.1" 863 | resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" 864 | 865 | import-lazy@^2.1.0: 866 | version "2.1.0" 867 | resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" 868 | 869 | imurmurhash@^0.1.4: 870 | version "0.1.4" 871 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 872 | 873 | inflection@^1.6.0: 874 | version "1.12.0" 875 | resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" 876 | 877 | inflight@^1.0.4: 878 | version "1.0.6" 879 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 880 | dependencies: 881 | once "^1.3.0" 882 | wrappy "1" 883 | 884 | inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: 885 | version "2.0.3" 886 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 887 | 888 | ini@^1.3.4, ini@~1.3.0: 889 | version "1.3.4" 890 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 891 | 892 | ipaddr.js@1.5.2: 893 | version "1.5.2" 894 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" 895 | 896 | is-arrayish@^0.2.1: 897 | version "0.2.1" 898 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 899 | 900 | is-binary-path@^1.0.0: 901 | version "1.0.1" 902 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" 903 | dependencies: 904 | binary-extensions "^1.0.0" 905 | 906 | is-buffer@^1.1.5: 907 | version "1.1.6" 908 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 909 | 910 | is-dotfile@^1.0.0: 911 | version "1.0.3" 912 | resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" 913 | 914 | is-equal-shallow@^0.1.3: 915 | version "0.1.3" 916 | resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" 917 | dependencies: 918 | is-primitive "^2.0.0" 919 | 920 | is-extendable@^0.1.1: 921 | version "0.1.1" 922 | resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" 923 | 924 | is-extglob@^1.0.0: 925 | version "1.0.0" 926 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" 927 | 928 | is-fullwidth-code-point@^1.0.0: 929 | version "1.0.0" 930 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 931 | dependencies: 932 | number-is-nan "^1.0.0" 933 | 934 | is-fullwidth-code-point@^2.0.0: 935 | version "2.0.0" 936 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 937 | 938 | is-glob@^2.0.0, is-glob@^2.0.1: 939 | version "2.0.1" 940 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" 941 | dependencies: 942 | is-extglob "^1.0.0" 943 | 944 | is-installed-globally@^0.1.0: 945 | version "0.1.0" 946 | resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" 947 | dependencies: 948 | global-dirs "^0.1.0" 949 | is-path-inside "^1.0.0" 950 | 951 | is-npm@^1.0.0: 952 | version "1.0.0" 953 | resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" 954 | 955 | is-number@^2.1.0: 956 | version "2.1.0" 957 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" 958 | dependencies: 959 | kind-of "^3.0.2" 960 | 961 | is-number@^3.0.0: 962 | version "3.0.0" 963 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" 964 | dependencies: 965 | kind-of "^3.0.2" 966 | 967 | is-obj@^1.0.0: 968 | version "1.0.1" 969 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 970 | 971 | is-path-inside@^1.0.0: 972 | version "1.0.0" 973 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" 974 | dependencies: 975 | path-is-inside "^1.0.1" 976 | 977 | is-posix-bracket@^0.1.0: 978 | version "0.1.1" 979 | resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" 980 | 981 | is-primitive@^2.0.0: 982 | version "2.0.0" 983 | resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" 984 | 985 | is-redirect@^1.0.0: 986 | version "1.0.0" 987 | resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 988 | 989 | is-retry-allowed@^1.0.0: 990 | version "1.1.0" 991 | resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" 992 | 993 | is-stream@^1.0.0, is-stream@^1.1.0: 994 | version "1.1.0" 995 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 996 | 997 | is-typedarray@~1.0.0: 998 | version "1.0.0" 999 | resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" 1000 | 1001 | is-utf8@^0.2.0: 1002 | version "0.2.1" 1003 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 1004 | 1005 | isarray@1.0.0, isarray@~1.0.0: 1006 | version "1.0.0" 1007 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 1008 | 1009 | isexe@^2.0.0: 1010 | version "2.0.0" 1011 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1012 | 1013 | isobject@^2.0.0: 1014 | version "2.1.0" 1015 | resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" 1016 | dependencies: 1017 | isarray "1.0.0" 1018 | 1019 | isstream@~0.1.2: 1020 | version "0.1.2" 1021 | resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 1022 | 1023 | js-string-escape@1.0.1: 1024 | version "1.0.1" 1025 | resolved "https://registry.yarnpkg.com/js-string-escape/-/js-string-escape-1.0.1.tgz#e2625badbc0d67c7533e9edc1068c587ae4137ef" 1026 | 1027 | jsbn@~0.1.0: 1028 | version "0.1.1" 1029 | resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" 1030 | 1031 | json-schema@0.2.3: 1032 | version "0.2.3" 1033 | resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" 1034 | 1035 | json-stable-stringify@^1.0.1: 1036 | version "1.0.1" 1037 | resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" 1038 | dependencies: 1039 | jsonify "~0.0.0" 1040 | 1041 | json-stringify-safe@~5.0.1: 1042 | version "5.0.1" 1043 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1044 | 1045 | jsonify@~0.0.0: 1046 | version "0.0.0" 1047 | resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" 1048 | 1049 | jsprim@^1.2.2: 1050 | version "1.4.1" 1051 | resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" 1052 | dependencies: 1053 | assert-plus "1.0.0" 1054 | extsprintf "1.3.0" 1055 | json-schema "0.2.3" 1056 | verror "1.10.0" 1057 | 1058 | kind-of@^3.0.2: 1059 | version "3.2.2" 1060 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 1061 | dependencies: 1062 | is-buffer "^1.1.5" 1063 | 1064 | kind-of@^4.0.0: 1065 | version "4.0.0" 1066 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" 1067 | dependencies: 1068 | is-buffer "^1.1.5" 1069 | 1070 | knuth-shuffle@^1.0.0: 1071 | version "1.0.8" 1072 | resolved "https://registry.yarnpkg.com/knuth-shuffle/-/knuth-shuffle-1.0.8.tgz#929a467b0efd8d297bdcf318ca988a9f1037f80d" 1073 | 1074 | latest-version@^3.0.0: 1075 | version "3.1.0" 1076 | resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" 1077 | dependencies: 1078 | package-json "^4.0.0" 1079 | 1080 | lodash._baseassign@^3.0.0: 1081 | version "3.2.0" 1082 | resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" 1083 | dependencies: 1084 | lodash._basecopy "^3.0.0" 1085 | lodash.keys "^3.0.0" 1086 | 1087 | lodash._basecopy@^3.0.0: 1088 | version "3.0.1" 1089 | resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" 1090 | 1091 | lodash._bindcallback@^3.0.0: 1092 | version "3.0.1" 1093 | resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" 1094 | 1095 | lodash._createassigner@^3.0.0: 1096 | version "3.1.1" 1097 | resolved "https://registry.yarnpkg.com/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz#838a5bae2fdaca63ac22dee8e19fa4e6d6970b11" 1098 | dependencies: 1099 | lodash._bindcallback "^3.0.0" 1100 | lodash._isiterateecall "^3.0.0" 1101 | lodash.restparam "^3.0.0" 1102 | 1103 | lodash._getnative@^3.0.0: 1104 | version "3.9.1" 1105 | resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" 1106 | 1107 | lodash._isiterateecall@^3.0.0: 1108 | version "3.0.9" 1109 | resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" 1110 | 1111 | lodash.assign@^3.0.0: 1112 | version "3.2.0" 1113 | resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-3.2.0.tgz#3ce9f0234b4b2223e296b8fa0ac1fee8ebca64fa" 1114 | dependencies: 1115 | lodash._baseassign "^3.0.0" 1116 | lodash._createassigner "^3.0.0" 1117 | lodash.keys "^3.0.0" 1118 | 1119 | lodash.defaults@^3.1.2: 1120 | version "3.1.2" 1121 | resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-3.1.2.tgz#c7308b18dbf8bc9372d701a73493c61192bd2e2c" 1122 | dependencies: 1123 | lodash.assign "^3.0.0" 1124 | lodash.restparam "^3.0.0" 1125 | 1126 | lodash.isarguments@^3.0.0: 1127 | version "3.1.0" 1128 | resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" 1129 | 1130 | lodash.isarray@^3.0.0: 1131 | version "3.0.4" 1132 | resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" 1133 | 1134 | lodash.keys@^3.0.0: 1135 | version "3.1.2" 1136 | resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" 1137 | dependencies: 1138 | lodash._getnative "^3.0.0" 1139 | lodash.isarguments "^3.0.0" 1140 | lodash.isarray "^3.0.0" 1141 | 1142 | lodash.restparam@^3.0.0: 1143 | version "3.6.1" 1144 | resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" 1145 | 1146 | lodash@4.12.0: 1147 | version "4.12.0" 1148 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.12.0.tgz#2bd6dc46a040f59e686c972ed21d93dc59053258" 1149 | 1150 | lodash@^4.16.4: 1151 | version "4.17.4" 1152 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1153 | 1154 | lowercase-keys@^1.0.0: 1155 | version "1.0.0" 1156 | resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" 1157 | 1158 | lru-cache@^4.0.1: 1159 | version "4.1.1" 1160 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 1161 | dependencies: 1162 | pseudomap "^1.0.2" 1163 | yallist "^2.1.2" 1164 | 1165 | make-dir@^1.0.0: 1166 | version "1.1.0" 1167 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" 1168 | dependencies: 1169 | pify "^3.0.0" 1170 | 1171 | make-error@^1.1.1: 1172 | version "1.3.0" 1173 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" 1174 | 1175 | map-stream@~0.1.0: 1176 | version "0.1.0" 1177 | resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" 1178 | 1179 | media-typer@0.3.0: 1180 | version "0.3.0" 1181 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1182 | 1183 | merge-descriptors@1.0.1: 1184 | version "1.0.1" 1185 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1186 | 1187 | methods@~1.1.2: 1188 | version "1.1.2" 1189 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1190 | 1191 | micromatch@^2.1.5: 1192 | version "2.3.11" 1193 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" 1194 | dependencies: 1195 | arr-diff "^2.0.0" 1196 | array-unique "^0.2.1" 1197 | braces "^1.8.2" 1198 | expand-brackets "^0.1.4" 1199 | extglob "^0.3.1" 1200 | filename-regex "^2.0.0" 1201 | is-extglob "^1.0.0" 1202 | is-glob "^2.0.1" 1203 | kind-of "^3.0.2" 1204 | normalize-path "^2.0.1" 1205 | object.omit "^2.0.0" 1206 | parse-glob "^3.0.4" 1207 | regex-cache "^0.4.2" 1208 | 1209 | mime-db@~1.30.0: 1210 | version "1.30.0" 1211 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" 1212 | 1213 | mime-types@^2.1.12, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.7: 1214 | version "2.1.17" 1215 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" 1216 | dependencies: 1217 | mime-db "~1.30.0" 1218 | 1219 | mime@1.4.1, mime@^1.2.11: 1220 | version "1.4.1" 1221 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 1222 | 1223 | minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: 1224 | version "3.0.4" 1225 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1226 | dependencies: 1227 | brace-expansion "^1.1.7" 1228 | 1229 | minimist@0.0.8: 1230 | version "0.0.8" 1231 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1232 | 1233 | minimist@^1.1.0, minimist@^1.2.0: 1234 | version "1.2.0" 1235 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1236 | 1237 | minimist@~0.0.1: 1238 | version "0.0.10" 1239 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" 1240 | 1241 | mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1: 1242 | version "0.5.1" 1243 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1244 | dependencies: 1245 | minimist "0.0.8" 1246 | 1247 | moment-timezone@^0.5.4: 1248 | version "0.5.14" 1249 | resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.14.tgz#4eb38ff9538b80108ba467a458f3ed4268ccfcb1" 1250 | dependencies: 1251 | moment ">= 2.9.0" 1252 | 1253 | "moment@>= 2.9.0", moment@^2.13.0: 1254 | version "2.19.1" 1255 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.19.1.tgz#56da1a2d1cbf01d38b7e1afc31c10bcfa1929167" 1256 | 1257 | ms@2.0.0: 1258 | version "2.0.0" 1259 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1260 | 1261 | nan@^2.3.0: 1262 | version "2.7.0" 1263 | resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" 1264 | 1265 | negotiator@0.6.1: 1266 | version "0.6.1" 1267 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 1268 | 1269 | node-pre-gyp@^0.6.36: 1270 | version "0.6.39" 1271 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" 1272 | dependencies: 1273 | detect-libc "^1.0.2" 1274 | hawk "3.1.3" 1275 | mkdirp "^0.5.1" 1276 | nopt "^4.0.1" 1277 | npmlog "^4.0.2" 1278 | rc "^1.1.7" 1279 | request "2.81.0" 1280 | rimraf "^2.6.1" 1281 | semver "^5.3.0" 1282 | tar "^2.2.1" 1283 | tar-pack "^3.4.0" 1284 | 1285 | nodemon@^1.11.0: 1286 | version "1.12.1" 1287 | resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.12.1.tgz#996a56dc49d9f16bbf1b78a4de08f13634b3878d" 1288 | dependencies: 1289 | chokidar "^1.7.0" 1290 | debug "^2.6.8" 1291 | es6-promise "^3.3.1" 1292 | ignore-by-default "^1.0.1" 1293 | lodash.defaults "^3.1.2" 1294 | minimatch "^3.0.4" 1295 | ps-tree "^1.1.0" 1296 | touch "^3.1.0" 1297 | undefsafe "0.0.3" 1298 | update-notifier "^2.2.0" 1299 | 1300 | nopt@^4.0.1: 1301 | version "4.0.1" 1302 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" 1303 | dependencies: 1304 | abbrev "1" 1305 | osenv "^0.1.4" 1306 | 1307 | nopt@~1.0.10: 1308 | version "1.0.10" 1309 | resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" 1310 | dependencies: 1311 | abbrev "1" 1312 | 1313 | normalize-path@^2.0.0, normalize-path@^2.0.1: 1314 | version "2.1.1" 1315 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" 1316 | dependencies: 1317 | remove-trailing-separator "^1.0.1" 1318 | 1319 | npm-run-path@^2.0.0: 1320 | version "2.0.2" 1321 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1322 | dependencies: 1323 | path-key "^2.0.0" 1324 | 1325 | npmlog@^4.0.2: 1326 | version "4.1.2" 1327 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" 1328 | dependencies: 1329 | are-we-there-yet "~1.1.2" 1330 | console-control-strings "~1.1.0" 1331 | gauge "~2.7.3" 1332 | set-blocking "~2.0.0" 1333 | 1334 | number-is-nan@^1.0.0: 1335 | version "1.0.1" 1336 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1337 | 1338 | oauth-sign@~0.8.1: 1339 | version "0.8.2" 1340 | resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" 1341 | 1342 | object-assign@4.1.0: 1343 | version "4.1.0" 1344 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" 1345 | 1346 | object-assign@^4.1.0, object-assign@^4.1.1: 1347 | version "4.1.1" 1348 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1349 | 1350 | object.omit@^2.0.0: 1351 | version "2.0.1" 1352 | resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" 1353 | dependencies: 1354 | for-own "^0.1.4" 1355 | is-extendable "^0.1.1" 1356 | 1357 | on-finished@~2.3.0: 1358 | version "2.3.0" 1359 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 1360 | dependencies: 1361 | ee-first "1.1.1" 1362 | 1363 | once@^1.3.0, once@^1.3.3: 1364 | version "1.4.0" 1365 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1366 | dependencies: 1367 | wrappy "1" 1368 | 1369 | opener@~1.4.0: 1370 | version "1.4.3" 1371 | resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" 1372 | 1373 | optimist@0.6.x: 1374 | version "0.6.1" 1375 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1376 | dependencies: 1377 | minimist "~0.0.1" 1378 | wordwrap "~0.0.2" 1379 | 1380 | os-homedir@^1.0.0: 1381 | version "1.0.2" 1382 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1383 | 1384 | os-tmpdir@^1.0.0: 1385 | version "1.0.2" 1386 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1387 | 1388 | osenv@^0.1.4: 1389 | version "0.1.4" 1390 | resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" 1391 | dependencies: 1392 | os-homedir "^1.0.0" 1393 | os-tmpdir "^1.0.0" 1394 | 1395 | p-finally@^1.0.0: 1396 | version "1.0.0" 1397 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1398 | 1399 | package-json@^4.0.0: 1400 | version "4.0.1" 1401 | resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" 1402 | dependencies: 1403 | got "^6.7.1" 1404 | registry-auth-token "^3.0.1" 1405 | registry-url "^3.0.3" 1406 | semver "^5.1.0" 1407 | 1408 | packet-reader@0.3.1: 1409 | version "0.3.1" 1410 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-0.3.1.tgz#cd62e60af8d7fea8a705ec4ff990871c46871f27" 1411 | 1412 | parse-glob@^3.0.4: 1413 | version "3.0.4" 1414 | resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" 1415 | dependencies: 1416 | glob-base "^0.3.0" 1417 | is-dotfile "^1.0.0" 1418 | is-extglob "^1.0.0" 1419 | is-glob "^2.0.0" 1420 | 1421 | parse-json@^2.2.0: 1422 | version "2.2.0" 1423 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1424 | dependencies: 1425 | error-ex "^1.2.0" 1426 | 1427 | parseurl@~1.3.2: 1428 | version "1.3.2" 1429 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 1430 | 1431 | path-is-absolute@^1.0.0: 1432 | version "1.0.1" 1433 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1434 | 1435 | path-is-inside@^1.0.1: 1436 | version "1.0.2" 1437 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 1438 | 1439 | path-key@^2.0.0: 1440 | version "2.0.1" 1441 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1442 | 1443 | path-to-regexp@0.1.7: 1444 | version "0.1.7" 1445 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1446 | 1447 | pause-stream@0.0.11: 1448 | version "0.0.11" 1449 | resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" 1450 | dependencies: 1451 | through "~2.3" 1452 | 1453 | performance-now@^0.2.0: 1454 | version "0.2.0" 1455 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" 1456 | 1457 | pg-connection-string@0.1.3: 1458 | version "0.1.3" 1459 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-0.1.3.tgz#da1847b20940e42ee1492beaf65d49d91b245df7" 1460 | 1461 | pg-pool@1.*: 1462 | version "1.8.0" 1463 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-1.8.0.tgz#f7ec73824c37a03f076f51bfdf70e340147c4f37" 1464 | dependencies: 1465 | generic-pool "2.4.3" 1466 | object-assign "4.1.0" 1467 | 1468 | pg-types@1.*: 1469 | version "1.12.1" 1470 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-1.12.1.tgz#d64087e3903b58ffaad279e7595c52208a14c3d2" 1471 | dependencies: 1472 | postgres-array "~1.0.0" 1473 | postgres-bytea "~1.0.0" 1474 | postgres-date "~1.0.0" 1475 | postgres-interval "^1.1.0" 1476 | 1477 | pg@^6.1.0: 1478 | version "6.4.2" 1479 | resolved "https://registry.yarnpkg.com/pg/-/pg-6.4.2.tgz#c364011060eac7a507a2ae063eb857ece910e27f" 1480 | dependencies: 1481 | buffer-writer "1.0.1" 1482 | js-string-escape "1.0.1" 1483 | packet-reader "0.3.1" 1484 | pg-connection-string "0.1.3" 1485 | pg-pool "1.*" 1486 | pg-types "1.*" 1487 | pgpass "1.*" 1488 | semver "4.3.2" 1489 | 1490 | pgpass@1.*: 1491 | version "1.0.2" 1492 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.2.tgz#2a7bb41b6065b67907e91da1b07c1847c877b306" 1493 | dependencies: 1494 | split "^1.0.0" 1495 | 1496 | pify@^3.0.0: 1497 | version "3.0.0" 1498 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 1499 | 1500 | pinkie@^2.0.4: 1501 | version "2.0.4" 1502 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1503 | 1504 | portfinder@0.4.x: 1505 | version "0.4.0" 1506 | resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-0.4.0.tgz#a3ffadffafe4fb98e0601a85eda27c27ce84ca1e" 1507 | dependencies: 1508 | async "0.9.0" 1509 | mkdirp "0.5.x" 1510 | 1511 | postgres-array@~1.0.0: 1512 | version "1.0.2" 1513 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-1.0.2.tgz#8e0b32eb03bf77a5c0a7851e0441c169a256a238" 1514 | 1515 | postgres-bytea@~1.0.0: 1516 | version "1.0.0" 1517 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 1518 | 1519 | postgres-date@~1.0.0: 1520 | version "1.0.3" 1521 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.3.tgz#e2d89702efdb258ff9d9cee0fe91bd06975257a8" 1522 | 1523 | postgres-interval@^1.1.0: 1524 | version "1.1.1" 1525 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.1.1.tgz#acdb0f897b4b1c6e496d9d4e0a853e1c428f06f0" 1526 | dependencies: 1527 | xtend "^4.0.0" 1528 | 1529 | prepend-http@^1.0.1: 1530 | version "1.0.4" 1531 | resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 1532 | 1533 | preserve@^0.2.0: 1534 | version "0.2.0" 1535 | resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" 1536 | 1537 | process-nextick-args@~1.0.6: 1538 | version "1.0.7" 1539 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1540 | 1541 | proxy-addr@~2.0.2: 1542 | version "2.0.2" 1543 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" 1544 | dependencies: 1545 | forwarded "~0.1.2" 1546 | ipaddr.js "1.5.2" 1547 | 1548 | ps-tree@^1.1.0: 1549 | version "1.1.0" 1550 | resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" 1551 | dependencies: 1552 | event-stream "~3.3.0" 1553 | 1554 | pseudomap@^1.0.2: 1555 | version "1.0.2" 1556 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1557 | 1558 | punycode@^1.4.1: 1559 | version "1.4.1" 1560 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 1561 | 1562 | qs@6.5.1: 1563 | version "6.5.1" 1564 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" 1565 | 1566 | qs@~2.3.3: 1567 | version "2.3.3" 1568 | resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" 1569 | 1570 | qs@~6.4.0: 1571 | version "6.4.0" 1572 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 1573 | 1574 | randomatic@^1.1.3: 1575 | version "1.1.7" 1576 | resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" 1577 | dependencies: 1578 | is-number "^3.0.0" 1579 | kind-of "^4.0.0" 1580 | 1581 | range-parser@~1.2.0: 1582 | version "1.2.0" 1583 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 1584 | 1585 | raw-body@2.3.2: 1586 | version "2.3.2" 1587 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.2.tgz#bcd60c77d3eb93cde0050295c3f379389bc88f89" 1588 | dependencies: 1589 | bytes "3.0.0" 1590 | http-errors "1.6.2" 1591 | iconv-lite "0.4.19" 1592 | unpipe "1.0.0" 1593 | 1594 | rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: 1595 | version "1.2.2" 1596 | resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" 1597 | dependencies: 1598 | deep-extend "~0.4.0" 1599 | ini "~1.3.0" 1600 | minimist "^1.2.0" 1601 | strip-json-comments "~2.0.1" 1602 | 1603 | readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: 1604 | version "2.3.3" 1605 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" 1606 | dependencies: 1607 | core-util-is "~1.0.0" 1608 | inherits "~2.0.3" 1609 | isarray "~1.0.0" 1610 | process-nextick-args "~1.0.6" 1611 | safe-buffer "~5.1.1" 1612 | string_decoder "~1.0.3" 1613 | util-deprecate "~1.0.1" 1614 | 1615 | readdirp@^2.0.0: 1616 | version "2.1.0" 1617 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" 1618 | dependencies: 1619 | graceful-fs "^4.1.2" 1620 | minimatch "^3.0.2" 1621 | readable-stream "^2.0.2" 1622 | set-immediate-shim "^1.0.1" 1623 | 1624 | regex-cache@^0.4.2: 1625 | version "0.4.4" 1626 | resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" 1627 | dependencies: 1628 | is-equal-shallow "^0.1.3" 1629 | 1630 | registry-auth-token@^3.0.1: 1631 | version "3.3.1" 1632 | resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" 1633 | dependencies: 1634 | rc "^1.1.6" 1635 | safe-buffer "^5.0.1" 1636 | 1637 | registry-url@^3.0.3: 1638 | version "3.1.0" 1639 | resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" 1640 | dependencies: 1641 | rc "^1.0.1" 1642 | 1643 | remove-trailing-separator@^1.0.1: 1644 | version "1.1.0" 1645 | resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" 1646 | 1647 | repeat-element@^1.1.2: 1648 | version "1.1.2" 1649 | resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" 1650 | 1651 | repeat-string@^1.5.2: 1652 | version "1.6.1" 1653 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1654 | 1655 | request@2.81.0: 1656 | version "2.81.0" 1657 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" 1658 | dependencies: 1659 | aws-sign2 "~0.6.0" 1660 | aws4 "^1.2.1" 1661 | caseless "~0.12.0" 1662 | combined-stream "~1.0.5" 1663 | extend "~3.0.0" 1664 | forever-agent "~0.6.1" 1665 | form-data "~2.1.1" 1666 | har-validator "~4.2.1" 1667 | hawk "~3.1.3" 1668 | http-signature "~1.1.0" 1669 | is-typedarray "~1.0.0" 1670 | isstream "~0.1.2" 1671 | json-stringify-safe "~5.0.1" 1672 | mime-types "~2.1.7" 1673 | oauth-sign "~0.8.1" 1674 | performance-now "^0.2.0" 1675 | qs "~6.4.0" 1676 | safe-buffer "^5.0.1" 1677 | stringstream "~0.0.4" 1678 | tough-cookie "~2.3.0" 1679 | tunnel-agent "^0.6.0" 1680 | uuid "^3.0.0" 1681 | 1682 | requires-port@1.x.x: 1683 | version "1.0.0" 1684 | resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" 1685 | 1686 | retry-as-promised@^2.0.0: 1687 | version "2.3.2" 1688 | resolved "https://registry.yarnpkg.com/retry-as-promised/-/retry-as-promised-2.3.2.tgz#cd974ee4fd9b5fe03cbf31871ee48221c07737b7" 1689 | dependencies: 1690 | bluebird "^3.4.6" 1691 | debug "^2.6.9" 1692 | 1693 | rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: 1694 | version "2.6.2" 1695 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 1696 | dependencies: 1697 | glob "^7.0.5" 1698 | 1699 | safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1700 | version "5.1.1" 1701 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" 1702 | 1703 | semver-diff@^2.0.0: 1704 | version "2.1.0" 1705 | resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" 1706 | dependencies: 1707 | semver "^5.0.3" 1708 | 1709 | semver@4.3.2: 1710 | version "4.3.2" 1711 | resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7" 1712 | 1713 | semver@^5.0.1, semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: 1714 | version "5.4.1" 1715 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 1716 | 1717 | send@0.16.1: 1718 | version "0.16.1" 1719 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" 1720 | dependencies: 1721 | debug "2.6.9" 1722 | depd "~1.1.1" 1723 | destroy "~1.0.4" 1724 | encodeurl "~1.0.1" 1725 | escape-html "~1.0.3" 1726 | etag "~1.8.1" 1727 | fresh "0.5.2" 1728 | http-errors "~1.6.2" 1729 | mime "1.4.1" 1730 | ms "2.0.0" 1731 | on-finished "~2.3.0" 1732 | range-parser "~1.2.0" 1733 | statuses "~1.3.1" 1734 | 1735 | sequelize@^3.24.6: 1736 | version "3.30.4" 1737 | resolved "https://registry.yarnpkg.com/sequelize/-/sequelize-3.30.4.tgz#bda2df1e31854b099e4149a111e9fc0a5ca1d1a4" 1738 | dependencies: 1739 | bluebird "^3.3.4" 1740 | depd "^1.1.0" 1741 | dottie "^1.0.0" 1742 | generic-pool "2.4.2" 1743 | inflection "^1.6.0" 1744 | lodash "4.12.0" 1745 | moment "^2.13.0" 1746 | moment-timezone "^0.5.4" 1747 | retry-as-promised "^2.0.0" 1748 | semver "^5.0.1" 1749 | shimmer "1.1.0" 1750 | terraformer-wkt-parser "^1.1.0" 1751 | toposort-class "^1.0.1" 1752 | uuid "^3.0.0" 1753 | validator "^5.2.0" 1754 | wkx "0.2.0" 1755 | 1756 | serve-static@1.13.1: 1757 | version "1.13.1" 1758 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" 1759 | dependencies: 1760 | encodeurl "~1.0.1" 1761 | escape-html "~1.0.3" 1762 | parseurl "~1.3.2" 1763 | send "0.16.1" 1764 | 1765 | set-blocking@~2.0.0: 1766 | version "2.0.0" 1767 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1768 | 1769 | set-immediate-shim@^1.0.1: 1770 | version "1.0.1" 1771 | resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" 1772 | 1773 | setprototypeof@1.0.3: 1774 | version "1.0.3" 1775 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 1776 | 1777 | setprototypeof@1.1.0: 1778 | version "1.1.0" 1779 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 1780 | 1781 | shebang-command@^1.2.0: 1782 | version "1.2.0" 1783 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1784 | dependencies: 1785 | shebang-regex "^1.0.0" 1786 | 1787 | shebang-regex@^1.0.0: 1788 | version "1.0.0" 1789 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1790 | 1791 | shimmer@1.1.0: 1792 | version "1.1.0" 1793 | resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.1.0.tgz#97d7377137ffbbab425522e429fe0aa89a488b35" 1794 | 1795 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1796 | version "3.0.2" 1797 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1798 | 1799 | sntp@1.x.x: 1800 | version "1.0.9" 1801 | resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" 1802 | dependencies: 1803 | hoek "2.x.x" 1804 | 1805 | source-map-support@^0.4.0: 1806 | version "0.4.18" 1807 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" 1808 | dependencies: 1809 | source-map "^0.5.6" 1810 | 1811 | source-map@^0.5.6: 1812 | version "0.5.7" 1813 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" 1814 | 1815 | split@0.3: 1816 | version "0.3.3" 1817 | resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" 1818 | dependencies: 1819 | through "2" 1820 | 1821 | split@^1.0.0: 1822 | version "1.0.1" 1823 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.1.tgz#605bd9be303aa59fb35f9229fbea0ddec9ea07d9" 1824 | dependencies: 1825 | through "2" 1826 | 1827 | sshpk@^1.7.0: 1828 | version "1.13.1" 1829 | resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" 1830 | dependencies: 1831 | asn1 "~0.2.3" 1832 | assert-plus "^1.0.0" 1833 | dashdash "^1.12.0" 1834 | getpass "^0.1.1" 1835 | optionalDependencies: 1836 | bcrypt-pbkdf "^1.0.0" 1837 | ecc-jsbn "~0.1.1" 1838 | jsbn "~0.1.0" 1839 | tweetnacl "~0.14.0" 1840 | 1841 | "statuses@>= 1.3.1 < 2": 1842 | version "1.4.0" 1843 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 1844 | 1845 | statuses@~1.3.1: 1846 | version "1.3.1" 1847 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 1848 | 1849 | stream-combiner@~0.0.4: 1850 | version "0.0.4" 1851 | resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" 1852 | dependencies: 1853 | duplexer "~0.1.1" 1854 | 1855 | string-width@^1.0.1, string-width@^1.0.2: 1856 | version "1.0.2" 1857 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1858 | dependencies: 1859 | code-point-at "^1.0.0" 1860 | is-fullwidth-code-point "^1.0.0" 1861 | strip-ansi "^3.0.0" 1862 | 1863 | string-width@^2.0.0: 1864 | version "2.1.1" 1865 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 1866 | dependencies: 1867 | is-fullwidth-code-point "^2.0.0" 1868 | strip-ansi "^4.0.0" 1869 | 1870 | string_decoder@~1.0.3: 1871 | version "1.0.3" 1872 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" 1873 | dependencies: 1874 | safe-buffer "~5.1.0" 1875 | 1876 | stringstream@~0.0.4: 1877 | version "0.0.5" 1878 | resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" 1879 | 1880 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1881 | version "3.0.1" 1882 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1883 | dependencies: 1884 | ansi-regex "^2.0.0" 1885 | 1886 | strip-ansi@^4.0.0: 1887 | version "4.0.0" 1888 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 1889 | dependencies: 1890 | ansi-regex "^3.0.0" 1891 | 1892 | strip-bom@^2.0.0: 1893 | version "2.0.0" 1894 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1895 | dependencies: 1896 | is-utf8 "^0.2.0" 1897 | 1898 | strip-eof@^1.0.0: 1899 | version "1.0.0" 1900 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1901 | 1902 | strip-json-comments@^2.0.0, strip-json-comments@~2.0.1: 1903 | version "2.0.1" 1904 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 1905 | 1906 | supports-color@^2.0.0: 1907 | version "2.0.0" 1908 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1909 | 1910 | supports-color@^4.0.0: 1911 | version "4.5.0" 1912 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 1913 | dependencies: 1914 | has-flag "^2.0.0" 1915 | 1916 | tar-pack@^3.4.0: 1917 | version "3.4.1" 1918 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" 1919 | dependencies: 1920 | debug "^2.2.0" 1921 | fstream "^1.0.10" 1922 | fstream-ignore "^1.0.5" 1923 | once "^1.3.3" 1924 | readable-stream "^2.1.4" 1925 | rimraf "^2.5.1" 1926 | tar "^2.2.1" 1927 | uid-number "^0.0.6" 1928 | 1929 | tar@^2.2.1: 1930 | version "2.2.1" 1931 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" 1932 | dependencies: 1933 | block-stream "*" 1934 | fstream "^1.0.2" 1935 | inherits "2" 1936 | 1937 | term-size@^1.2.0: 1938 | version "1.2.0" 1939 | resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" 1940 | dependencies: 1941 | execa "^0.7.0" 1942 | 1943 | terraformer-wkt-parser@^1.1.0: 1944 | version "1.1.2" 1945 | resolved "https://registry.yarnpkg.com/terraformer-wkt-parser/-/terraformer-wkt-parser-1.1.2.tgz#336a0c8fc82094a5aff83288f69aedecd369bf0c" 1946 | dependencies: 1947 | terraformer "~1.0.5" 1948 | 1949 | terraformer@~1.0.5: 1950 | version "1.0.8" 1951 | resolved "https://registry.yarnpkg.com/terraformer/-/terraformer-1.0.8.tgz#51e0ad89746fcf2161dc6f65aa70e42377c8b593" 1952 | dependencies: 1953 | "@types/geojson" "^1.0.0" 1954 | 1955 | through@2, through@~2.3, through@~2.3.1: 1956 | version "2.3.8" 1957 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1958 | 1959 | timed-out@^4.0.0: 1960 | version "4.0.1" 1961 | resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" 1962 | 1963 | toposort-class@^1.0.1: 1964 | version "1.0.1" 1965 | resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" 1966 | 1967 | touch@^3.1.0: 1968 | version "3.1.0" 1969 | resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" 1970 | dependencies: 1971 | nopt "~1.0.10" 1972 | 1973 | tough-cookie@~2.3.0: 1974 | version "2.3.3" 1975 | resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" 1976 | dependencies: 1977 | punycode "^1.4.1" 1978 | 1979 | ts-node@^1.6.0: 1980 | version "1.7.3" 1981 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-1.7.3.tgz#dee7f8a84751732d3c2e497cac5a02fb117dfee7" 1982 | dependencies: 1983 | arrify "^1.0.0" 1984 | chalk "^1.1.1" 1985 | diff "^3.1.0" 1986 | make-error "^1.1.1" 1987 | minimist "^1.2.0" 1988 | mkdirp "^0.5.1" 1989 | pinkie "^2.0.4" 1990 | source-map-support "^0.4.0" 1991 | tsconfig "^5.0.2" 1992 | v8flags "^2.0.11" 1993 | xtend "^4.0.0" 1994 | yn "^1.2.0" 1995 | 1996 | tsconfig@^5.0.2: 1997 | version "5.0.3" 1998 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-5.0.3.tgz#5f4278e701800967a8fc383fd19648878f2a6e3a" 1999 | dependencies: 2000 | any-promise "^1.3.0" 2001 | parse-json "^2.2.0" 2002 | strip-bom "^2.0.0" 2003 | strip-json-comments "^2.0.0" 2004 | 2005 | tunnel-agent@^0.6.0: 2006 | version "0.6.0" 2007 | resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" 2008 | dependencies: 2009 | safe-buffer "^5.0.1" 2010 | 2011 | tweetnacl@^0.14.3, tweetnacl@~0.14.0: 2012 | version "0.14.5" 2013 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" 2014 | 2015 | type-is@~1.6.15: 2016 | version "1.6.15" 2017 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.15.tgz#cab10fb4909e441c82842eafe1ad646c81804410" 2018 | dependencies: 2019 | media-typer "0.3.0" 2020 | mime-types "~2.1.15" 2021 | 2022 | typescript@2.0.10: 2023 | version "2.0.10" 2024 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.0.10.tgz#ccdd4ed86fd5550a407101a0814012e1b3fac3dd" 2025 | 2026 | uid-number@^0.0.6: 2027 | version "0.0.6" 2028 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" 2029 | 2030 | undefsafe@0.0.3: 2031 | version "0.0.3" 2032 | resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-0.0.3.tgz#ecca3a03e56b9af17385baac812ac83b994a962f" 2033 | 2034 | union@~0.4.3: 2035 | version "0.4.6" 2036 | resolved "https://registry.yarnpkg.com/union/-/union-0.4.6.tgz#198fbdaeba254e788b0efcb630bc11f24a2959e0" 2037 | dependencies: 2038 | qs "~2.3.3" 2039 | 2040 | unique-string@^1.0.0: 2041 | version "1.0.0" 2042 | resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" 2043 | dependencies: 2044 | crypto-random-string "^1.0.0" 2045 | 2046 | unpipe@1.0.0, unpipe@~1.0.0: 2047 | version "1.0.0" 2048 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 2049 | 2050 | unzip-response@^2.0.1: 2051 | version "2.0.1" 2052 | resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" 2053 | 2054 | update-notifier@^2.2.0: 2055 | version "2.3.0" 2056 | resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" 2057 | dependencies: 2058 | boxen "^1.2.1" 2059 | chalk "^2.0.1" 2060 | configstore "^3.0.0" 2061 | import-lazy "^2.1.0" 2062 | is-installed-globally "^0.1.0" 2063 | is-npm "^1.0.0" 2064 | latest-version "^3.0.0" 2065 | semver-diff "^2.0.0" 2066 | xdg-basedir "^3.0.0" 2067 | 2068 | url-join@^1.0.0: 2069 | version "1.1.0" 2070 | resolved "https://registry.yarnpkg.com/url-join/-/url-join-1.1.0.tgz#741c6c2f4596c4830d6718460920d0c92202dc78" 2071 | 2072 | url-parse-lax@^1.0.0: 2073 | version "1.0.0" 2074 | resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" 2075 | dependencies: 2076 | prepend-http "^1.0.1" 2077 | 2078 | user-home@^1.1.1: 2079 | version "1.1.1" 2080 | resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" 2081 | 2082 | util-deprecate@~1.0.1: 2083 | version "1.0.2" 2084 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 2085 | 2086 | utils-merge@1.0.1: 2087 | version "1.0.1" 2088 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 2089 | 2090 | uuid@^3.0.0: 2091 | version "3.1.0" 2092 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" 2093 | 2094 | v8flags@^2.0.11: 2095 | version "2.1.1" 2096 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" 2097 | dependencies: 2098 | user-home "^1.1.1" 2099 | 2100 | validator@^5.2.0: 2101 | version "5.7.0" 2102 | resolved "https://registry.yarnpkg.com/validator/-/validator-5.7.0.tgz#7a87a58146b695ac486071141c0c49d67da05e5c" 2103 | 2104 | vary@~1.1.2: 2105 | version "1.1.2" 2106 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 2107 | 2108 | verror@1.10.0: 2109 | version "1.10.0" 2110 | resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" 2111 | dependencies: 2112 | assert-plus "^1.0.0" 2113 | core-util-is "1.0.2" 2114 | extsprintf "^1.2.0" 2115 | 2116 | which@^1.2.9: 2117 | version "1.3.0" 2118 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 2119 | dependencies: 2120 | isexe "^2.0.0" 2121 | 2122 | wide-align@^1.1.0: 2123 | version "1.1.2" 2124 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 2125 | dependencies: 2126 | string-width "^1.0.2" 2127 | 2128 | widest-line@^1.0.0: 2129 | version "1.0.0" 2130 | resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" 2131 | dependencies: 2132 | string-width "^1.0.1" 2133 | 2134 | wkx@0.2.0: 2135 | version "0.2.0" 2136 | resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.2.0.tgz#76c24f16acd0cd8f93cd34aa331e0f7961256e84" 2137 | 2138 | wordwrap@~0.0.2: 2139 | version "0.0.3" 2140 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 2141 | 2142 | wrappy@1: 2143 | version "1.0.2" 2144 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 2145 | 2146 | write-file-atomic@^2.0.0: 2147 | version "2.3.0" 2148 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" 2149 | dependencies: 2150 | graceful-fs "^4.1.11" 2151 | imurmurhash "^0.1.4" 2152 | signal-exit "^3.0.2" 2153 | 2154 | xdg-basedir@^3.0.0: 2155 | version "3.0.0" 2156 | resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" 2157 | 2158 | xtend@^4.0.0: 2159 | version "4.0.1" 2160 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 2161 | 2162 | yallist@^2.1.2: 2163 | version "2.1.2" 2164 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 2165 | 2166 | yn@^1.2.0: 2167 | version "1.3.0" 2168 | resolved "https://registry.yarnpkg.com/yn/-/yn-1.3.0.tgz#1b0812abb8d805d48966f8df385dc9dacc9a19d8" 2169 | dependencies: 2170 | object-assign "^4.1.1" 2171 | --------------------------------------------------------------------------------