From 4b321a55e856e701b6b5ca6dda2881b0aad3b535 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Thu, 12 Jul 2018 12:36:12 +0300 Subject: [PATCH 01/19] phoneApp --- js-core/phoneApp/index.html | 12 +++++++ js-core/phoneApp/main.js | 64 +++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 js-core/phoneApp/index.html create mode 100644 js-core/phoneApp/main.js diff --git a/js-core/phoneApp/index.html b/js-core/phoneApp/index.html new file mode 100644 index 0000000..6c04111 --- /dev/null +++ b/js-core/phoneApp/index.html @@ -0,0 +1,12 @@ + + + + + My phonebook + + +

my phonebook

+ + + + \ No newline at end of file diff --git a/js-core/phoneApp/main.js b/js-core/phoneApp/main.js new file mode 100644 index 0000000..2b72f0a --- /dev/null +++ b/js-core/phoneApp/main.js @@ -0,0 +1,64 @@ +'use strict'; + + +/*Создайте функцию конструктор. +У данной функции должны быть методы: + +Преобразование телефонного номера из формата 0993378130 в (099) 33-78-130 +Проверка, что телефонный номер содержит только числа +Добавление пользователей в справочник +Удаление пользователя по имени, фамилии +Поиск пользователей по имени - отображает всех пользователей с одинаковым именем +Изменение имени, фамилии, телефонного номера у выбраного пользователя ( здесь должно быть реализовано через this ) +Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя +Фильтр по указанному свойству*/ + +function PhoneApp() { + this.dataBase = [ + {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Vasya', phone:'qweqwe'}, + ] +} + +PhoneApp.prototype.editUser = function(id, options) { + /* + options.name + options. + */ +} + +PhoneApp.prototype._validate= function(id, options) { + /* + options.name + options. + */ +} + +const myApp = new PhoneApp(); + +class PhoneApp (){ + constructor() { + this.dataBase = [ + {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Vasya', phone:'qweqwe'}, + ] + } + + editUser(id, options) { + /* + options.name + options. + */ + } + + _validate(id, options) { + /* + options.name + options. + */ + } +} \ No newline at end of file From 868b14d7a1c9e61085b33c65a2c7a5d8bc2bf5f6 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Fri, 13 Jul 2018 17:52:42 +0300 Subject: [PATCH 02/19] start working with phoneapp --- js-core/phoneApp/main.js | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/js-core/phoneApp/main.js b/js-core/phoneApp/main.js index 2b72f0a..ed1bcc0 100644 --- a/js-core/phoneApp/main.js +++ b/js-core/phoneApp/main.js @@ -13,7 +13,7 @@ Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя Фильтр по указанному свойству*/ -function PhoneApp() { +function oldPhoneApp() { this.dataBase = [ {id:1, name:'Vasya', phone:'qweqwe'}, {id:1, name:'Vasya', phone:'qweqwe'}, @@ -22,23 +22,23 @@ function PhoneApp() { ] } -PhoneApp.prototype.editUser = function(id, options) { +oldPhoneApp.prototype.editUser = function(id, options) { /* options.name options. */ } -PhoneApp.prototype._validate= function(id, options) { +oldPhoneApp.prototype._validate= function(id, options) { /* options.name options. */ } -const myApp = new PhoneApp(); +const oldmyApp = new oldPhoneApp(); -class PhoneApp (){ +class PhoneApp { constructor() { this.dataBase = [ {id:1, name:'Vasya', phone:'qweqwe'}, @@ -48,6 +48,28 @@ class PhoneApp (){ ] } + normalizePhoneNumber(...args){ + let arrNumber = args[0].split(''); + + arrNumber.splice(0,0,'('); + arrNumber.splice(4,0,') '); + arrNumber.splice(7,0,'-'); + arrNumber.splice(10,0,'-'); + + let result = arrNumber.join(''); + //console.log(result); + return result; + } + + validatePhoneNumber(...args) {// ырщгдв иу сфддув иуащку + console.log(args); + let arrNumber = args[0].split(''); + let etalon = ['1','2','3','4','5','6','7','8','9','0']; + + + } + + editUser(id, options) { /* options.name @@ -61,4 +83,10 @@ class PhoneApp (){ options. */ } -} \ No newline at end of file +} + +const myApp = new PhoneApp(); +console.log(myApp); +//- +console.log(myApp.normalizePhoneNumber('0993452845')); +console.log(myApp.validatePhoneNumber('0993452845')); \ No newline at end of file From 314b6a1bb6c4fe366aa0548900cdccec2b40564a Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sun, 15 Jul 2018 16:02:05 +0300 Subject: [PATCH 03/19] it seems a phonebook is done --- js-core/phoneApp/main.js | 195 ++++++++++++++++++++++++++++----------- 1 file changed, 141 insertions(+), 54 deletions(-) diff --git a/js-core/phoneApp/main.js b/js-core/phoneApp/main.js index ed1bcc0..2a9b587 100644 --- a/js-core/phoneApp/main.js +++ b/js-core/phoneApp/main.js @@ -1,53 +1,28 @@ 'use strict'; - - /*Создайте функцию конструктор. У данной функции должны быть методы: -Преобразование телефонного номера из формата 0993378130 в (099) 33-78-130 -Проверка, что телефонный номер содержит только числа -Добавление пользователей в справочник -Удаление пользователя по имени, фамилии -Поиск пользователей по имени - отображает всех пользователей с одинаковым именем -Изменение имени, фамилии, телефонного номера у выбраного пользователя ( здесь должно быть реализовано через this ) -Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя -Фильтр по указанному свойству*/ - -function oldPhoneApp() { - this.dataBase = [ - {id:1, name:'Vasya', phone:'qweqwe'}, - {id:1, name:'Vasya', phone:'qweqwe'}, - {id:1, name:'Vasya', phone:'qweqwe'}, - {id:1, name:'Vasya', phone:'qweqwe'}, - ] -} - -oldPhoneApp.prototype.editUser = function(id, options) { - /* - options.name - options. - */ -} - -oldPhoneApp.prototype._validate= function(id, options) { - /* - options.name - options. - */ -} - -const oldmyApp = new oldPhoneApp(); +1. Преобразование телефонного номера из формата 0993378130 в (099) 33-78-130 +2. Проверка, что телефонный номер содержит только числа +3. Добавление пользователей в справочник +4. Удаление пользователя по имени, фамилии +5. Поиск пользователей по имени - отображает всех пользователей с одинаковым именем +6. Изменение имени, фамилии, телефонного номера у выбраного пользователя ( здесь должно быть реализовано через this ) +7. Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя +8. Фильтр по указанному свойству*/ +//---------------------------------------------PHONE APP STARTS--------------------------------------------- class PhoneApp { constructor() { this.dataBase = [ - {id:1, name:'Vasya', phone:'qweqwe'}, - {id:1, name:'Vasya', phone:'qweqwe'}, - {id:1, name:'Vasya', phone:'qweqwe'}, - {id:1, name:'Vasya', phone:'qweqwe'}, + {id:1, name:'Nataliia', surname: 'Protsenko', phone:'0677967036', company: 'UZ'}, + {id:2, name:'Ivan', surname: 'Ivanov', phone:'0507967036', company: 'Ukrtelecom'}, + {id:3, name:'Petr', surname: 'Petrov', phone:'0637967036', company: 'Kyivsatr'}, + {id:4, name:'Ivan', surname: 'Smith', phone:'0967967036', company: 'Ukrtelecom'}, ] } + //1. Преобразование телефонного номера из формата 0993378130 в (099) 33-78-130 normalizePhoneNumber(...args){ let arrNumber = args[0].split(''); @@ -61,32 +36,144 @@ class PhoneApp { return result; } - validatePhoneNumber(...args) {// ырщгдв иу сфддув иуащку - console.log(args); - let arrNumber = args[0].split(''); - let etalon = ['1','2','3','4','5','6','7','8','9','0']; + //2. Проверка, что телефонный номер содержит только числа + validatePhoneNumber(str) { // shold be called before normalizePhoneNumber + let arrNumber = str.split(''); + let res = arrNumber.every((item) => !isNaN(+item));//почему если !isNaN(+item) заключить в фигурные скобки, то не работает? + //не проверяет на пробелы!!!!! + //console.log(res); + return res; + } + + //3. Добавление пользователей в справочник + createUser(options) { + let {name, surname, phone, company} = options; + let id = Math.round(Math.random()*100); + let newUser = {}; + newUser.id = id; + newUser.name = name; + newUser.surname = surname; + newUser.phone = phone; + newUser.company = company; + this.dataBase.push(newUser); + + console.log(this.dataBase); } + //4. Удаление пользователя по имени, фамилии - удаляет сразу всех найденных Иванов!!! + deleteUser(str){ + + this.dataBase.forEach((item) => { - editUser(id, options) { - /* - options.name - options. - */ + let values = Object.values(item); // берем все значения у объекта пользователя + let isConsist = values.some((elem) => (elem == str));// проверяем, есть ли такое значение, как нам нужно + + if (isConsist) { //если есть - ищем, индекс, где находится + let index = this.dataBase.indexOf(item); + //console.log(index); + this.dataBase.splice(index, 1); //и удаляем его + console.log(this.dataBase); + return; + } + + }) + console.log('There is no such user'); } - _validate(id, options) { - /* - options.name - options. - */ + //5. Поиск пользователей по имени - отображает всех пользователей с одинаковым именем + searchUser(str){ + let searchedUsers = []; + + this.dataBase.forEach((item) => { + + let values = Object.values(item); // берем все значения у объекта пользователя + let isConsist = values.some((elem) => (elem == str));// проверяем, есть ли такое значение, как нам нужно + + if (isConsist) { //если есть -пушим объект в новый массив + searchedUsers.push(item); + console.log(searchedUsers); + return searchedUsers; + } + + }) + + console.log('There is no such user'); + } + //6. Изменение имени, фамилии, телефонного номера у выбраного пользователя ( здесь должно быть реализовано через this ) + changeInfo(id, options){ + let {name, surname, phone, company} = options; + + this.dataBase.map((item) => { + if (item.id == id) { + if (name) { + item.name = name; + }; + if (surname) { + item.surname = surname; + }; + if (phone) { + item.phone = phone; + }; + if (company) { + item.company = company; + }; + } + }) + return this.dataBase; + } + + //7. Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя + sortUsers(str){ + + function compare(a, b){ + if (isNaN(a[str])) { + + if (a[str] > b[str]) { + return 1; + }; + if (a[str] < b[str]) { + return -1; + }; + if (a[str] == b[str]) { + return 0; + } + + } else { + return (a[str] - b[str]); + } + + } + + return this.dataBase.sort(compare); + } + + //8. Фильтр по указанному свойству + filterUsers(str){ + return this.dataBase.filter((item) => {//создает массив из объектов, у которых есть переданное свойство + if (item[str]) { + return item; + } + }); + } + } const myApp = new PhoneApp(); console.log(myApp); //- console.log(myApp.normalizePhoneNumber('0993452845')); -console.log(myApp.validatePhoneNumber('0993452845')); \ No newline at end of file +console.log(myApp.validatePhoneNumber('0993452845')); +myApp.createUser({name:'Svetlana', surname: 'Lash', phone: '0981111111', company:'EPAM'}); +myApp.createUser({name:'Sergey', surname: 'Barchan', company:'DataArt'});// without phone number +myApp.searchUser('Ivan'); +console.log(myApp.sortUsers('name')); +console.log(myApp.filterUsers('phone')); +console.log(myApp.filterUsers('company')); + +console.log(myApp.changeInfo(2, {name: 'Stepan', company:'Facebook'})); +console.log(myApp.changeInfo(3, {phone: '0778888888', company:'Google'})); +myApp.deleteUser('Ivan'); +myApp.deleteUser('DataArt'); \ No newline at end of file From bc2c99e6288208cd74879d46be5c057f0b56b963 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Fri, 20 Jul 2018 17:05:45 +0300 Subject: [PATCH 04/19] rendering of contacts page was done --- js-core/phoneApp/css/main.css | 331 ++++++++++++++++++++++++++++++++++ js-core/phoneApp/index.html | 144 ++++++++++++++- js-core/phoneApp/main.js | 263 ++++++++++++++++++++++++++- 3 files changed, 735 insertions(+), 3 deletions(-) create mode 100644 js-core/phoneApp/css/main.css diff --git a/js-core/phoneApp/css/main.css b/js-core/phoneApp/css/main.css new file mode 100644 index 0000000..7dc35c6 --- /dev/null +++ b/js-core/phoneApp/css/main.css @@ -0,0 +1,331 @@ +/** + * Description: main styles + * Version: 1.0.0 + * Last update: 09.01.2017 + * Author: alex.maslennikova19@gmail.com + */ +/*$breakpoints: ( + 'screen-xs': 480px, + 'screen-sm': 768px, + 'screen-md': 992px, + 'screen-lg': 1200px +); +// keywords +$media-expressions: ( + 'screen': 'screen', + 'print': 'print', + 'handheld': 'handheld', + 'landscape': '(orientation: landscape)', + 'portrait': '(orientation: portrait)', + 'retina2x': '(-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi)', + 'retina3x': '(-webkit-min-device-pixel-ratio: 2.5), (min-resolution: 240dpi)' +);*/ +.clearfix:after { + content: ''; + display: table; + clear: both; +} + +.ellipsis { + white-space: nowrap; + /* 1 */ + text-overflow: ellipsis; + /* 2 */ + overflow: hidden; +} + +a:hover, a:focus, a:active, a.active { + color: #777; + text-decoration: none; +} + +button { + outline-color: white; +} + +h2 { + margin: 0; +} + +h3 { + margin: 0; +} + +.container { + width: 400px; + background: #ccc; + padding: 25px; +} + +.top-radius { + border-top-left-radius: 30px; + border-top-right-radius: 30px; +} + +.bottom-radius { + border-bottom-left-radius: 30px; + border-bottom-right-radius: 30px; +} + +.header { + text-align: center; + margin-top: 20px; +} + +.main-nav { + display: flex; + justify-content: space-between; +} + +.keypad-holder { + width: 250px; + margin: 0 auto; + display: flex; + flex-wrap: wrap; + justify-content: space-around; +} + +.number { + margin: 0 auto; + width: 200px; + height: 50px; + margin-bottom: 20px; + border-bottom: 1px solid #eee; + display: flex; + justify-content: space-between; +} + +.number .numbers { + align-self: flex-end; +} + +.key { + width: 60px; + min-height: 60px; + padding: 15px 0; + border-radius: 50%; + border: 1px solid #fff; + text-align: center; + margin-bottom: 10px; + margin-left: 5px; + margin-right: 5px; + display: flex; + align-items: center; + justify-content: center; +} + +.key:last-child { + background: #4cda64; + color: #fff; +} + +.key:last-child:hover { + background: #348f3c; + border: 1px solid #fff; +} + +.key:hover { + background: rgba(0, 0, 0, 0.1); + border: 1px solid #777; +} + +.tab { + display: flex; + flex-direction: column; + align-items: center; +} + +.tab:hover, .tab:focus, .tab:active, .tab.active { + color: #777; + text-decoration: none; +} + +.tab-text { + font-size: 12px; + margin-top: 5px; +} + +.contacts tbody { + display: block; + max-height: 300px; + overflow: hidden; + overflow-y: auto; +} + +.contacts tr { + display: table; + width: 100%; + table-layout: fixed; +} + +.table > thead > tr > th { + border: none; +} + +.form-inline .form-control { + margin-bottom: 10px; + width: 100%; +} + +.form-inline .form-group { + display: block; +} + +.user-top-line { + display: flex; + justify-content: space-between; + margin-bottom: 20px; + font-size: 14px; +} + +.user-img { + width: 100px; + height: 100px; + margin-bottom: 10px; +} + +.user-name { + font-weight: bold; + text-align: center; + margin-bottom: 30px; +} + +.options-line { + display: flex; + justify-content: space-between; + text-align: center; + margin-bottom: 20px; +} + +.options-icon { + border-radius: 50%; + background: #000; + color: #fff; + width: 40px; + height: 40px; + margin: 0 auto 5px; + position: relative; +} + +.options-icon:hover { + background: #777; +} + +.options-text { + font-size: 12px; +} + +.message, .call, .video, .mail { + display: flex; + flex-direction: column; +} + +.icon { + position: absolute; + top: 50%; + left: 50%; + -webkit-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + transform: translate(-50%, -50%); +} + +.tel-number { + margin-bottom: 20px; + font-size: 16px; +} + +.options-table { + margin-bottom: 20px; + font-size: 16px; +} + +.options-item { + padding: 10px 0; + border-bottom: 1px solid #777; +} + +.options-item:first-child { + border-top: 1px solid #777; +} + +.scroll-holder { + max-height: 300px; + overflow: hidden; + overflow-y: auto; + margin-bottom: 20px; +} + +.add-foto-btn { + width: 100px; + height: 100px; + border-radius: 50%; + border: 1px solid #eee; + outline: none; +} + +.add-btn { + border: 0; + background: transparent; + width: 100%; + text-align: left; + outline-color: gray; +} + +.done-btn { + background: transparent; + border: none; + outline: none; +} + +.done-btn:hover { + color: #777; +} + +.main-info-holder { + flex-grow: 1; +} + +.edit-main-info { + display: flex; + justify-content: space-between; + margin-bottom: 20px; +} + +.edit-foto { + margin-right: 10px; +} + +.edit-field { + padding: 5px 0; + border-bottom: 1px solid #fff; + width: 100%; + display: flex; +} + +.delete-btn { + color: #e32910; + margin-top: 3px; + margin-right: 10px; + border: none; + background: transparent; +} + +.delete-btn:hover, .delete-btn:focus, .delete-btn:active { + color: #a70b0f; +} + +.add-btn { + color: #4cda64; + margin-top: 3px; + margin-right: 10px; +} + +.add-btn:hover, .add-btn:focus, .add-btn:active { + color: #348f3c; +} + +.delete-contact { + color: #e32910; + margin: 0 auto; + font-weight: bold; +} \ No newline at end of file diff --git a/js-core/phoneApp/index.html b/js-core/phoneApp/index.html index 6c04111..999dc1f 100644 --- a/js-core/phoneApp/index.html +++ b/js-core/phoneApp/index.html @@ -2,10 +2,150 @@ - My phonebook + + + Contacts + + + + -

my phonebook

+ + + diff --git a/js-core/phoneApp/main.js b/js-core/phoneApp/main.js index 2a9b587..c9218cc 100644 --- a/js-core/phoneApp/main.js +++ b/js-core/phoneApp/main.js @@ -176,4 +176,265 @@ console.log(myApp.filterUsers('company')); console.log(myApp.changeInfo(2, {name: 'Stepan', company:'Facebook'})); console.log(myApp.changeInfo(3, {phone: '0778888888', company:'Google'})); myApp.deleteUser('Ivan'); -myApp.deleteUser('DataArt'); \ No newline at end of file +myApp.deleteUser('DataArt'); + + +/////RENDER CONTACTS PAGE////////////////////////////////////////////// +const people = +[ + { + name: 'Иван', + lastName: 'Петров', + email: 'IvanPetrov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Сергеев', + email: 'SergeiSergeev@ec.ua' + }, + { + name: 'Иван', + lastName: 'Иванов', + email: 'IvanIvanov@ec.ua' + }, + { + name: 'Александр', + lastName: 'Александров', + email: 'AlexAlex@ec.ua' + }, + { + name: 'Алекс', + lastName: 'Смирнов', + email: 'AlexSmirnov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Волков', + email: 'VolkovSergey@ec.ua' + }, + { + name: 'Мария', + lastName: 'Шарапова', + email: 'MariyaSharapova@ec.ua' + }, + { + name: 'Александр', + lastName: 'Винник', + email: 'AlexVinnik@ec.ua' + }, + { + name: 'Дарий', + lastName: 'Смирнов', + email: 'DariySmirnov@ec.ua' + }, + { + name: 'Елена', + lastName: 'Лещенко', + email: 'ElenaLeshenko@ec.ua' + }, + { + name: 'Ольга', + lastName: 'Новикова', + email: 'OlgaNovikova@ec.ua' + }, + { + name: 'Наталья', + lastName: 'Шемякина', + email: 'ShemyakinaN@ec.ua' + }, + { + name: 'Анна', + lastName: 'Донцова', + email: 'AnnaDontsova@ec.ua' + }, + { + name: 'Влад', + lastName: 'Яма', + email: 'VladYama@ec.ua' + }, + { + name: 'Кира', + lastName: 'Воробьева', + email: 'Kira1990@ec.ua' + }, + { + name: 'Виктор', + lastName: 'Кривенко', + email: 'ViktorKriv@ec.ua' + } +]; + +const captions = ['Name', 'Last name', 'Email']; +const footerContent = [ + { + classImg: 'glyphicon glyphicon-search', + text: 'Contacts', + href: 'index.html', + additionalClass: 'active' + }, + { + classImg: 'glyphicon glyphicon-th', + text: 'Keypad', + href: 'keypad.html', + additionalClass: '' + }, + { + classImg: 'glyphicon glyphicon-pencil', + text: 'Edit contact', + href: 'edit-contact.html', + additionalClass: '' + }, + { + classImg: 'glyphicon glyphicon-user', + text: 'User', + href: 'user.html', + additionalClass: '' + }, + { + classImg: 'glyphicon glyphicon-plus', + text: 'Add user', + href: 'add-user.html', + additionalClass: '' + } +] + +const contactsPage = { + people, + pageTitle: 'Contacts', + render() { + const header = this.newEl('header', null, {className: 'header'}); + const main = this.newEl('main'); + const footer = this.newEl('footer'); + + /*creating header*/ + let headerDiv = this.newEl('div', null, {className: 'container top-radius'}); + let headerH2 = this.newEl('h2', 'Contacts'); + + headerDiv.appendChild(headerH2); + header.appendChild(headerDiv); + + /*creating main div*/ + let mainDiv = this.newEl('div', null, {className: 'container'}); + + /*creating form*/ + let form = this.newEl('form', null, {className: 'form-inline search-form'}); + let formDiv = this.newEl('div', null, {className: 'form-group'}); + let label = this.newEl('label', 'Search', {className: 'sr-only', forAttr: 'search'}); + let input = this.newEl('input', null, {className: 'form-control', typeAttr: 'text', idAttr:'search', placeholderAttr:'Search'}); + + main.appendChild(mainDiv); + mainDiv.appendChild(form); + form.appendChild(formDiv); + formDiv.appendChild(label); + formDiv.appendChild(input); + + /*creating table & table header*/ + let table = this.newEl('table', null, {className: 'table table-hover contacts'}); + let thead = this.newEl('thead'); + let headRow = this.newEl('tr'); + + captions.forEach((item) => { + let th = this.newEl('th', item); + headRow.appendChild(th); + }); + + mainDiv.appendChild(table); + table.appendChild(thead); + thead.appendChild(headRow); + + /*creating table content*/ + let tbody = this.newEl('tbody'); + + table.appendChild(tbody); + + people.forEach((item) => { + let tr = this.newEl('tr'); + + for (let key in item) { + if (key) { + let td = this.newEl('td', item[key]); + tr.appendChild(td); + } + }; + + tbody.appendChild(tr); + + }) + + /*creating footer content*/ + let footerDiv = this.newEl('div', null, {className: 'container bottom-radius'}); + let nav = this.newEl('div', null, {className: 'main-nav'}); + + footerContent.forEach((item) => { + let link = this.newEl('a', null, {className: `tab ${item.additionalClass}` , hrefAttr: item.href } ); + let spanImg = this.newEl('span', null, {className: item.classImg, hrefAttr: item.href, ariahiddenAttr: 'true' } ); + let spanText = this.newEl('span', item.text, {className: 'tab-text', hrefAttr: item.href } ); + + link.appendChild(spanImg); + link.appendChild(spanText); + + nav.appendChild(link); + }) + + + + footer.appendChild(footerDiv); + footerDiv.appendChild(nav); + + document.body.appendChild(header); + document.body.appendChild(main); + document.body.appendChild(footer); + }, + + + newEl(elName, elValue, attributes) { + + let element = document.createElement(elName); + + if (elValue) { + element.textContent = elValue; + }; + + if (attributes) { + this.setAttribute(element, attributes); + } + + return element; + + }, + + setAttribute(element, attributes) { + let {className, typeAttr, forAttr, idAttr, placeholderAttr, hrefAttr, ariahiddenAttr} = attributes; + +/* if (className) { + element.classList.add(className); + };*/ + if (className) { + element.setAttribute('class', className); + }; + + if (typeAttr) { + element.setAttribute('type', typeAttr); + }; + if (forAttr) { + element.setAttribute('for', forAttr); + }; + if (idAttr) { + element.setAttribute('id', idAttr); + }; + if (placeholderAttr) { + element.setAttribute('placeholder', placeholderAttr); + }; + if (hrefAttr) { + element.setAttribute('href', hrefAttr); + }; + if (ariahiddenAttr) { + element.setAttribute('aria-hidden', ariahiddenAttr); + }; + + return element; + } + +} + +contactsPage.render(); \ No newline at end of file From 6228af29b5e9ee158200eac36254481a0792e84e Mon Sep 17 00:00:00 2001 From: Nataliia Date: Fri, 20 Jul 2018 17:08:48 +0300 Subject: [PATCH 05/19] folders were deleted --- js-core/classworks/classwork-10/index.html | 12 - js-core/classworks/classwork-10/main.js | 264 ------------ js-core/classworks/classwork-11/index.html | 12 - js-core/classworks/classwork-11/main.js | 341 --------------- js-core/classworks/classwork-12/index.html | 12 - js-core/classworks/classwork-12/main.js | 0 js-core/classworks/classwork-6/index.html | 11 - js-core/classworks/classwork-6/src/main.js | 459 --------------------- js-core/classworks/classwork-6/src/s.js | 2 - js-core/classworks/classwork-8/index.html | 12 - js-core/classworks/classwork-8/main.js | 277 ------------- js-core/classworks/classwork-9/index.html | 12 - js-core/classworks/classwork-9/main.js | 123 ------ js-core/homeworks/homework-10/index.html | 12 - js-core/homeworks/homework-10/main.js | 139 ------- js-core/homeworks/homework-11/index.html | 12 - js-core/homeworks/homework-11/main.js | 71 ---- js-core/homeworks/homework-2/index.html | 11 - js-core/homeworks/homework-2/src/main.js | 75 ---- js-core/homeworks/homework-4/index.html | 11 - js-core/homeworks/homework-4/src/main.js | 188 --------- js-core/homeworks/homework-5/index.html | 11 - js-core/homeworks/homework-5/src/main.js | 159 ------- js-core/homeworks/homework-6/index.html | 11 - js-core/homeworks/homework-6/src/main.js | 338 --------------- js-core/homeworks/homework-8/index.html | 12 - js-core/homeworks/homework-8/main.js | 250 ----------- js-core/homeworks/homework-9/index.html | 12 - js-core/homeworks/homework-9/main.js | 284 ------------- 29 files changed, 3133 deletions(-) delete mode 100644 js-core/classworks/classwork-10/index.html delete mode 100644 js-core/classworks/classwork-10/main.js delete mode 100644 js-core/classworks/classwork-11/index.html delete mode 100644 js-core/classworks/classwork-11/main.js delete mode 100644 js-core/classworks/classwork-12/index.html delete mode 100644 js-core/classworks/classwork-12/main.js delete mode 100644 js-core/classworks/classwork-6/index.html delete mode 100644 js-core/classworks/classwork-6/src/main.js delete mode 100644 js-core/classworks/classwork-6/src/s.js delete mode 100644 js-core/classworks/classwork-8/index.html delete mode 100644 js-core/classworks/classwork-8/main.js delete mode 100644 js-core/classworks/classwork-9/index.html delete mode 100644 js-core/classworks/classwork-9/main.js delete mode 100644 js-core/homeworks/homework-10/index.html delete mode 100644 js-core/homeworks/homework-10/main.js delete mode 100644 js-core/homeworks/homework-11/index.html delete mode 100644 js-core/homeworks/homework-11/main.js delete mode 100644 js-core/homeworks/homework-2/index.html delete mode 100644 js-core/homeworks/homework-2/src/main.js delete mode 100644 js-core/homeworks/homework-4/index.html delete mode 100644 js-core/homeworks/homework-4/src/main.js delete mode 100644 js-core/homeworks/homework-5/index.html delete mode 100644 js-core/homeworks/homework-5/src/main.js delete mode 100644 js-core/homeworks/homework-6/index.html delete mode 100644 js-core/homeworks/homework-6/src/main.js delete mode 100644 js-core/homeworks/homework-8/index.html delete mode 100644 js-core/homeworks/homework-8/main.js delete mode 100644 js-core/homeworks/homework-9/index.html delete mode 100644 js-core/homeworks/homework-9/main.js diff --git a/js-core/classworks/classwork-10/index.html b/js-core/classworks/classwork-10/index.html deleted file mode 100644 index fce2e31..0000000 --- a/js-core/classworks/classwork-10/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Lesson_10 - - -

Hello world 10

- - - - \ No newline at end of file diff --git a/js-core/classworks/classwork-10/main.js b/js-core/classworks/classwork-10/main.js deleted file mode 100644 index 7d3e1e2..0000000 --- a/js-core/classworks/classwork-10/main.js +++ /dev/null @@ -1,264 +0,0 @@ -//THIS---------------------------------------------- -//1. Внутри ф-ции this устанавливается как глобальный объект(Window), а при 'use strict' - в undefined -//2. При вызове как метода объекта, this ссылается на данный объект(выбирает объект до точки) -//3. bind, call, apply устанавливают контекст this принудительно, но bind только устанавливает контекст, -//а call и apply сразу же и вызывают функцию -//4. при создании экземпляра через new, this станет ссылаться на вновь созданный объект -//call, apply, bind есть у всех функций, это встроенные методы - -//--пример для "выбирает объект до точки"----------------------- - -const obj = { - //----------- - a: { - showThis(){ - console.log(this);//this ссылается на a - //------------- - (function show(){ - console.log(this);//this ссылается на window или на undefined при 'use srtict' - })(); - - } - }, - //---------- - showThis(){ - console.log(this);//this ссылается на obj - } -} - -obj.a.showThis(); -obj.showThis(); - - -//---call, apply, bind--------------------------------------------- - -var bar = 'global'; - -function foo(a, b, c) { - console.log(a, b, c); - console.log(this.bar);//вернет global, потому что this ссылается на window, - // а у window есть переменная bar -} - -var obj1 = { - bar: 'это мой контекст', - foo: foo //ф-ция foo, объявленная выше, которая консолит this.bar. В данном случае - // this - это уже obj1, и значение this.bar - это 'это мой контекст' -}; - -var obj2 = { - bar: 'Привет объект 2' -}; - -foo(); // global -obj1.foo(); // obj1.bar - это мой контекст - -foo.call(obj2); //Тут говорим: функция foo, позвони в объект obj2. - // Функция сделает вызов и в качестве конекста установит то, что было передано - // первым аргументом (obj2). Вернет 'Привет объект 2' - //call может кроме контекста принимать неограниченное кол-во аргументов - -foo.apply(obj2); //Тут говорим: функция foo, применись к obj2. - // Функция сделает вызов и в качестве конекста установит то, что было передано - // первым аргументом (obj2). Вернет 'Привет объект 2' - -foo.call(obj2, 1, 2, 3); // вернет 1, 2, 3 и 'Привет объект 2' -foo.apply(obj2, [10, 20]); //вернет 1, 2, undefined и 'Привет объект 2'. Т.е. берет данные - // из массива и подставляет их туда, где они запрашиваются - -// Отличие call от apply в том, что в call кроме может передаваться много аргументов, -// а в apply - кроме контекста передается один аргумент в виде массива - -var www = foo.bind(obj2);//прибинди к foo этот объект obj2. В www попадает новая функция - // с привязанным контекстом, но не вызывается. Можем вызвать когда-нибудь потом -www(); // 'Привет объект 2' -//Можно прям передать новый объект : - var wwww = foo.bind({bar: 'qwe qwe qwe'}); - wwww(); //'qwe qwe qwe' - -//----- NEW and function-constructor----------------------------------------------------- - -function User(name){ - /*var obj = {} ---> this*/ //когда вызываем конструктор через new, тут неявно создается объект, приравнивается к this - this.name = name; - - /*return obj*/// - и в конце по умолчанию вернет объект - //но можно из конструктора вернуть что-то явно, например, так: - - //return { - // name: 'something', - //} - - //и тогда this не работает - //если тут указать примитив, то при вызове new он будет утерян: - - //return 10; - значение примитива, возвращенное из конструктора, будет утеряно при вызове через new -} - -let userOleh = new User('Oleh'); -console.log(userOleh); - - -//------------------------------------------------------------------- -const cafe = { - name: 'Мир средиземья', - fruits: ['apple', 'orange', 'dfgghs'], - partners: [ - { - name: 'Frodo', - fruits: ['хлебцы', 'капуста'] - }, - { - name: 'Боромир', - fruits: ['яблоки', 'киви'] - }, - { - name: 'Гендальф', - fruits: ['манго', 'банан'] - } - ], - - showFruits() { //метод, который показывает фрукты - console.log(this.fruits); - }, - - showPartnersFruits() { - let method = this.showFruits; //нужно в эту функцию получить метод showFruits, с которого можно позвонить - //звонить может только функция. Получаем сюда метод showFruits - console.log(this);// объект cafe - - this.partners.forEach((item) => { //и для каждого объекта-партнера вызываем метод showFruits - method.call(item); // возьми method и позвони с него в текущий объект, т.е. в item - //Это значит вызови метод method, он же this.showFruits, для каждого объекта - //this.showFruits.call(item);// можно и так написать, без получения переменной method - - //Здесь если была бы не стрелочная функция, а обычная, то контекст бы потерляся. Раньше были решения такие: - // showPartnersFruits() { - // var self = this; // в self записали контекст cafe, т.е self теперь ссылается на cafe - // this.partners.forEach(function(item){ //this тоже ссылается на cafe - // self.showFruits.call(item); //если бы здесь оставили this вместо self, то this стал бы ссылаться - //на window, а не на cafe. А так self продолжает ссылатся на cafe и все ок - // }) - // } - - //ИЛИ!!! forEach кроме функции, вторым аргументом может принимать контекст, т.е. this - // showPartnersFruits() { - // this.partners.forEach(function(item){ - // self.showFruits.call(item); - // }, this) //так тоже все сработает - // } - - - }) - } - -} -//добавьте метод, который будет в консоли отображать фрукты - -cafe.showFruits(); -cafe.showPartnersFruits();//Отобразите фрукты партнеров Мира, используя метод showFruits -// внутри showPartnersFruits - -//ARROW FUNCTIONS------------------------------------------------- - //У стрелочных функций есть ряд ограничений - //1. У них нет arguments: - const qqq = (a,b) => { - console.log(arguments)//error: arguments is not defined - } - //qqq(); - //но если закинуть туда деструкцию, то все сработает: - const qqq2 = (...args) => { - console.log(args)//[1,2,3,4,8] - } - qqq2(1,2,3,4,8); - - -//---------2 PART---__PROTO__------------------------------------------------------- - -var car = { - wheel: 4 -}; - -var mustang = { - door: '2/3/4' -} -mustang.wheel = 4;//добавили в объект мустанг 4 колеса - -mustang.__proto__ = car;//в __proto__ мустанга записали объект car - //теперь у мутсанга есть door: '2/3/4' и wheel: 4, и в __proto__ опять есть wheel: 4 - -car.color = 'red';//в объект car дописали свойство color: 'red', и теперь это свойство отобразится и в __proto__ мустанга - //т.е. можем обратиться mustang.color и получим red - -delete mustang.wheel//удалили собственное свойство мустанга wheel: 4, но в __proto__ осталось wheel: 4 от саr -mustang.wheel// все равно получим 4 - -mustang.color = 'green';//так мы добавим цвет самому объекту мустанг, в его прото останется красный цвет от кар - -var someMethod = { //создаем какой-то метод - тут только через объект, напрямую через ф-цию не прокатывает - toDo(){ //это если хотим добавить его кому-то в прото, тогда только через объект - console.log(this.color); - } -} - -car.__proto__ = someMethod;//и записываем его в прото car-у - -console.log(mustang);//у мустанга в __proto__.__proto__ запишется метод toDo -mustang.toDo();//green - -car.makeBeeeeep = function(){ //можем в car добавить функцию, и все равно она будет доступна из мустанга - console.log('beep'); -} -mustang.makeBeeeeep();//beep - -//------------------------------------------------------------------------ - -//Задача - coздаем 30 студентов и всем им добавляем одного и того же учителя -// у студентов поменялся учитель. Как быстро изменить имя учителя у всех студентов? - -const teacher = { - teacherName: 'Alla I' -} - -const halava = function(){ - console.log('Халява, приди!'); -} - -function createStudent(str, fn){//ф-ция, которая создает студента - const student = {}; - student.__proto__ = teacher;//каждому в прото добавили учителя - student.name = str; - student.someMagic = fn; //если бы прямо здесь написали метод, то каждому студенту - // создали бы по одинаковому методу, т.е. 30 одинаковых методов, это плохо - // А так мы 1 раз создали функцию и каждому студенту просто добавили ссылку на эту ф-цию - - return student; -} - -const students = []; - -for (let i = 0; i < 30; i++) { //создаем объект студент и каждому из них ставим разное имя student 1, 2,3... - const newStudent = createStudent(`student ${i + 1}`, halava); - students.push(newStudent); -} - -//students.forEach((item) => { //каждому студенту в __proto__ добавляем teacher Alla I -// item.__proto__ = teacher; -//}) // это сделали сразу в 229 строке - -console.log(students[0].teacherName);//'Alla I' -teacher.teacherName = 'Boris P'; //потом меняем имя учителя и теперь у всех студентов новый учитель Boris P в __proto__ - -console.log(students); -console.log(students[0].teacherName);//'Boris P' - -//-----ВНИМАНИЕ! Если запишем по-другому:---------- - -console.log(students);//'Vera P' и тут, и ниже у всех студентов в прото будет Vera P -teacher.teacherName = 'Vera P'; -console.log(students);//'Vera P - -//так происходит потому, что каждый student в массиве students - это ссылка, и ссылка у нас перезаписалась на Vera P. -//А в 249 и 253 строках мы запрашиваем значение, а значение передается не по ссылке, оно просто вернулось и все - - diff --git a/js-core/classworks/classwork-11/index.html b/js-core/classworks/classwork-11/index.html deleted file mode 100644 index 235bbc6..0000000 --- a/js-core/classworks/classwork-11/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Lesson_11 - - -

Classwork 11

- - - - \ No newline at end of file diff --git a/js-core/classworks/classwork-11/main.js b/js-core/classworks/classwork-11/main.js deleted file mode 100644 index f1a5cf6..0000000 --- a/js-core/classworks/classwork-11/main.js +++ /dev/null @@ -1,341 +0,0 @@ -//ООП придумано для разбиения больших задач на маленькие кусочки, которые решают отдельные задачи -// Функции-конструкторы принято называть с большой буквы - - -function Database(databaseName){ - /*var obj = {} ---> this*/ //когда вызываем конструктор через new, тут неявно создается объект, приравнивается к this - this.databaseName = databaseName; - - /*return obj*/// - и в конце по умолчанию вернет объект - //но можно из конструктора вернуть что-то явно, например, так: - - //return { - // name: 'something', - //} - - //и тогда this не работает - //если тут указать примитив, то при вызове new он будет утерян: - - //return 10; - значение примитива, возвращенное из конструктора, будет утеряно при вызове через new -} - -var mySQL = new Database('MySQL');//здесь превратили Database в объект и положили в переменную mySQL -//т.е. выглядит это примерно так: -// var mySQL = { -// databaseName: 'MySQL' -// } -console.log(mySQL); - -//-------------------------------- -/*Создать конструктор, который будет создавать новый объект - -myArray = параметр 1 : Array -cars = параметр 2 : Object -name = параметр 3 : string*/ - -function createObject(arg1, arg2, arg3){ //по умолчанию вернет объект, если мы явно ему ничего не указываем заретернить - - let x = 'privet kak dela'; - - this.myArray = arg1, // this ссылается на этот объект, который создается в момент вызова new - this.cars = arg2, - this.name = arg3 - -} - -let newObj = new createObject([], {}, ''); -console.log(newObj); //createObject {cars: {}, myArray: [], name: ""} в консоли еще пишет название конструктора - -//--------------------------------------------------------------------- -//Если присвоить переменной z функцию конструктор без new, т.е. без вызова ее: - -var z = createObject('qq', 'ww', 'ee'); - -//то this ссылается на Window, и в Window появились переменные myArray='qq', cars = 'ww', name = 'ee' - -//Но если вызвать через new: -var z = new createObject('qq', 'ww', 'ee'); - -//то внутри неявно создастся объект, объект приравняется this и в конце этот объект возвращвется - -//------------------------------------------------------- -//Если в конструкторе создать переменную let x = 'privet kak dela', и потом сделать так: - -var s = new createObject('a', 'b', 'c'); -console.log('s',s); //то x пропадет, ее заберет сборщик мусора -//Что происходит? При запуске конструктора через new инициализируется икс -//(может он будет использоваться где-то ниже в конструкторе), потом возвращается объект, -//а так как икс нигде не используется, он пропадет, его заберет сборщик мусора - -//z и s хранят ссылки на объекты, созданные конструктором. Еще называют экземпляром функции-конструктора //instance - -function Car(color, model){ //конвеер нераскрашенных машин - this.color = color, - this.model = model - //this.wheels = 4 -} - -const audi = new Car('white', 'audi'); -const minicooper = new Car('red', 'minicooper'); -console.log(audi, minicooper); -//создаются 2 экземпляра конструктора - audi и minicooper, разных цветов и моделей. -//Если теперь в конструктор добавить this.wheels = 4, то колеса появятся у обоих созданных экземпляров - -//------------------------------------------------- -//Создать ф-цию конструктор, которая в зависимости от количества параметров -//будет создавать объект с количеством свойств, равным количеству аргументов - -function createObject2(arg1, arg2, arg3){ - if (arg1 !== undefined) { //или if ( arg1 ) {} типа если нет аргумента, то вообще не нужно создавать свойство - this.arg1 = arg1; - } - if (arg2 !== undefined) { - this.arg2 = arg2; - } - if (arg3 !== undefined) { - this.arg3 = arg3; - } -} - -let newObj2 = new createObject2(1, 2, 3); -let newObj3 = new createObject2(1, 2); - -console.log(newObj2); -console.log(newObj3); - -//Если мы хотим передать в функцию много аргументов (хотя их больше трех, то это уже плохо), то делают так: - -function createObject3(options){ //сюда один параметр options, он прийдет в виде объекта - // а тут - let {arg1, arg2, arg3} = options; //здесь в фигурные скобки дописываем только те аргументы из options, которые нам нужны - console.log(options);//тут будут все переданные при вызове аргументы, однако в строке выше //{myArray: "a", name: "b", type: "c"} - //можем из options взять только те, которые мне будут нужны - - if (arg1 !== undefined) { //или if ( arg1 ) {} типа если нет аргумента, то вообще не нужно создавать свойство - this.arg1 = arg1; - } - if (arg2 !== undefined) { - this.arg2 = arg2; - } - if (arg3 !== undefined) { - this.arg3 = arg3; - } - -} - -let newObj6 = new createObject3({myArray: 'a', name: 'b', type: 'c'}); - -console.log('newObj6', newObj6); - -//------------------------------------------------- -//Создать ф-цию конструктор, которая будет иметь приватный счетчик, -//данный счетчик можно будет увеличивать только вызвав метод counter() -//НОВЫЙ СПОСОБ ДЕЛАТЬ ЗАМЫКАНИЯ, СИЛЬНО УДОБНЕЕ - -function CreateObject4(){ - let counter = 0; // - this.counter = function(){ - return counter++; - } -} - -/*return { //а раньше мы делали так - counter(){ - console.log(counter++) ; - } -}*/ - -let newObj4 = new CreateObject4(); -console.log(newObj4); //в консоли покажет новый экземпляр объекта, - //у которого в Scopes будет Closure, а в нем counter = 0!!! - //создав новый экземпляр, создадим еще один новый счетчик -console.log(newObj4.counter()); -console.log(newObj4.counter()); -console.log(newObj4.counter()); -console.log(newObj4.counter()); - -//-------------------------------------------------------------------- -//ПАРАДИГМА ООП (парадигма - ряд убеждений, ряд законов) -//-прототипное программирование. Прототип - объект-образец, по образу и подобию которого создаются другие объекты -//-объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе -//-каждый объект может стать прототипом(__proto__) - -function Database2(databaseName){ //1 - есть ф-ция конструктор - this.databaseName = databaseName; -} -//V - методы прямо в конструкторах писать плохо, их пишут в прототипах. Так происходит правильное наследование через Object.create -//Если записать метод прямо в конструкторе, а не в прототипе, то если мы потом захотим что-то изменить в методе, то оно -//не изменится для всех уже созданных экземпляров, а поменяется только в конструкторе и будет уже новое для только экземпляров, -//созданных после того, как поменяли метод в конструкторе - -//Прототип принято считать публичным, его могут все наследовать - -Database2.prototype.registerUser = function registerUser(name, password){//2 - есть прототип функции Database2 - //const newUser = new User(name, password);//это абстрактная вещь, просто показано, что - //внутри одного конструктора можно вызывать другие конструкторы - this.user = {name, password} - - //this.user = { // или так - // name: name, - // password: password - //} -} -var mySQL1 = new Database2('MySQL1');//тут в консоли будет ф-ция конструктор -console.log('mySQL--1', mySQL1);//то, что было в prototype функции конструктора, - //в момент создания нового экземпляра присвоилось(передалась ссылка) новому экземпляру в _proto_ - //т.е. здесь в _proto_ можем видеть ф-цию registerUser - -Database2.prototype = { // прототайп, а теперь равняйся объекту - // с этого момента у всех экземпляров, которые будут созданы с этого момента, - // в прото будет свойство table: "MAIN" и не будет конструктора, - // однако это не повлияет на все созданные ранее экземпляры, там все останется по-прежнему - // т.е. здесь мы говорим прототипу, чтобы он потерял свою предыдущую ссылку - // но так мы перезатрем конструктор, и так лучше не делать - table: "MAIN", - registerUser() { - console.log(this.databaseName) - } -} -console.log('mySQL--1', mySQL1);//ничего не изменилось, mySQL1 продолжает хранить ссылку на тот прототип конструктора, - //который был в момент создания mySQL1 - -var mySQL2 = new Database2('MySQL2'); -console.log('mySQL--2', mySQL2);//а тут в консоли не будет ф-ции конструктора, мы ее перезатрем -console.log(mySQL2.table) //"MAIN"; - -var mongodb = new Database2('mongodb'); //теперь создаем третий экземпляр -console.log('mongodb.table',mongodb.table) //MAIN" -console.log('mySQL2.table', mySQL2.table) //"MAIN" - -//Сейчас в mySQL2.__proto__.table лежит "MAIN". Делаем так: -mySQL2.__proto__.table = 'QWERTY-YAHOO'; - -console.log('mySQL1.table', mySQL1.table); //undefined, там вообще не было изначально table -console.log('mySQL2.table', mySQL2.table); //QWERTY-YAHOO -console.log('mongodb.table', mongodb.table);//QWERTY-YAHOO - // потому что и mySQL2, и mongodb ссылаются на один прототип, и мы его поменяли чуть выше - -//ОТЛИЧИЕ prototype и __proto__: -//prototype используем для функции-конструктора -// __proto__ используем для объекта - -//V - если создаем экземпляр класса и ему что-то добавляем, то это никак не отражается на других экземплярах -//V - если же из экземпляра поменять прототип, тогда это отразится на других экземплярах -//V - из прототипа можем добавлять свойства конструктору и переопределять методы конструктора(через this) -//V - при обращении к чему -то в экземпляре через this сначала это поищется в главном конструкторе, если там нет - -//полезет искать в прототип, и если и там нет, то будет искать в глобальном объекте, пока не нейдет искомое или null - -//-------------------------------------------------------------- -//сделайте функцию конструктор которая наз Transport и будет принимать 3 аргумента: -//color, name, doors -//и создайте себе машину той марки, которую вы желаете на зарплату миддла - -//добавьте метод beep всем машинам, при вызове метода отобразить в консоли желаемый сигнал - -function Transport(color, name, doors){ - this.color = color; - this.name = name; - this.doors = doors; - this.wheels = 4 -} - -Transport.prototype.beep = function(){ - console.log('beep'); -} - -/*Transport.prototype.wheels = {//лучше добавлять прямо в конструктор, т.к. это не логика - wheels: 4, -}*/ - -let toyota = new Transport ('red', 'toyota', '3'); //и toyota, и bmw хранят ссылку на Transport -let bmw = new Transport ('green', 'bmw', '5'); - -console.log(toyota, toyota.beep()); -console.log(bmw, bmw.beep()); - -//Создайте еще одну ф-конструктор Bus -//ф-ция конструктора будет наследоваться от Transport -//и добавлять стоимость проезда новому экземпляру - -function Bus(){ -} - -//Bus.prototype = new Transport('white', 'laz', 8);//наследуемся из Transport; -// в этот момент создался новый экземпляр, он лег в prototype, и у экземпляра в прото уже лежит метод beep - -//но правильно наследование делать так: -Bus.prototype = Object.create(Transport.prototype)// если так делать, то конструктор Transport не будет вызван, - // а prototype от Transport(т.е. метод beep) присвоятся - -Bus.prototype.getPrice = function(){ //если это написать выше, чем наследование, то не сработает, т.к - // наследование перезатрет prototype - console.log('3hrv'); -} - -var bus = new Bus(); //Если наследоваться как Bus.prototype = new Transport(...), то у bus прям в нем лежит - //метод getPrice и все свойства из конструктора - color, name, doors, wheels, т.к. - //конструктор был вызван; и метод beep лежит в прото - - //А если наследоваться правильно через Object.create(Transport.prototype) и передавать в него прототип - //от которого нужно наследоваться, то у bus будет только метод getPrice и никаких свойств, и в прото - //будет лежать метод beep и сам конструктор Transport - - //Если нужно унаследовать все, и свойства из конструктора, то пишут еще по-другому: - - //function Bus(){ - // Transport.apply(this, arguments); - //} - -console.log('bus--->', bus) - -bus.beep(); -bus.getPrice(); - - - - -//---РЕЗЮМЕ----------------------------------------------------------------------- - -function Database3(databaseName){ - this.databaseName = databaseName; -} - -Database3.prototype.registerUser = function registerUser(name, password){ - this.user = { - name: name, - password: password - } -} - -var a = new Database3('a'); -console.log('a', a); - -Database3.prototype = { //с этого момента у всех экземпляров, которые будут созданы с этого момента, - // в прото будет свойство table: "MAIN" и не будет конструктора, - // однако это не повлияет на все созданные ранее экземпляры, там все останется по-прежнему - //т.е. здесь мы говорим прототипу, чтобы он потерял свою предыдущую ссылку - - table: "MAIN", - registerUser() { - console.log(this.databaseName); - } -} - -console.log('a', a); // тут в прото все еще нет свойства table: "MAIN", т.к. а создан раньше, - // чем поменялось прото у конструктора - -var b = new Database3('b'); -console.log('b', b); // а тут в прото уже есть свойство table: "MAIN" и нет конструктора, он затерся - -var c = new Database3('c'); -console.log('c', c); // и тут то же самое, в прото уже есть свойство table: "MAIN" и нет конструктора, он затерся - //т.е. b и c сейчас одинаковые - -//теперь если сделать так: -b.__proto__.table = 'QWERTY-YAHOO';// здесь перезаписываем ссылку на table - -console.log('a', a);// то на а это никак не повлияет, потому что он создан еще до перезаписи прототипа у конструктора - // и он хранит предыдущую ссылку прототипа конструктора -console.log('b', b);// а в b в прото перезапишется table на 'QWERTY-YAHOO' -console.log('c', c);// и в с в прото перезапишется table на 'QWERTY-YAHOO' - // потому что и а, и b ссылаются на один прототип \ No newline at end of file diff --git a/js-core/classworks/classwork-12/index.html b/js-core/classworks/classwork-12/index.html deleted file mode 100644 index ed912dd..0000000 --- a/js-core/classworks/classwork-12/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Lesson_12 - - -

Classwork 12

- - - - \ No newline at end of file diff --git a/js-core/classworks/classwork-12/main.js b/js-core/classworks/classwork-12/main.js deleted file mode 100644 index e69de29..0000000 diff --git a/js-core/classworks/classwork-6/index.html b/js-core/classworks/classwork-6/index.html deleted file mode 100644 index e609bdb..0000000 --- a/js-core/classworks/classwork-6/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Class work 1 - - -

YES !

- - - \ No newline at end of file diff --git a/js-core/classworks/classwork-6/src/main.js b/js-core/classworks/classwork-6/src/main.js deleted file mode 100644 index 33340dd..0000000 --- a/js-core/classworks/classwork-6/src/main.js +++ /dev/null @@ -1,459 +0,0 @@ -let listOfCompanys = [ - { - company: 'ASIMILINE', - name: { - last: 'Watkins', - first: 'Lindsay', - }, - eyeColor: 'brown', - age: 20, - picture: 'http://placehold.it/32x32', - balance: '$1,091.09', - isActive: true, - guid: '294814e3-4c89-428f-b0c9-da5c4c37ea5e', - index: 0, - _id: '584babb6eeb4137cf14c37a3', - }, - { - company: 'ENJOLA', - name: { - last: 'Price', - first: 'Greene', - }, - eyeColor: 'brown', - age: 39, - picture: 'http://placehold.it/32x32', - balance: '$3,533.55', - isActive: true, - guid: 'e7b0824f-d6d1-4a82-b2c5-cd7a1ec8310c', - index: 1, - _id: '584babb6c7be9c2398ed263f', - }, - { - company: 'ZINCA', - name: { - last: 'Robertson', - first: 'Barbara', - }, - eyeColor: 'brown', - age: 22, - picture: 'http://placehold.it/32x32', - balance: '$1,395.22', - isActive: false, - guid: '0735d8d9-a165-4ad1-893f-e821da37bf63', - index: 2, - _id: '584babb6cca4dbefa6001820', - }, - { - company: 'TALKOLA', - name: { - last: 'Cooke', - first: 'Lea', - }, - eyeColor: 'blue', - age: 31, - picture: 'http://placehold.it/32x32', - balance: '$3,074.16', - isActive: false, - guid: '7d13cbc4-6b4d-4954-b3d3-df3cfe5f2373', - index: 3, - _id: '584babb6391a2b568f1e9416', - }, - { - company: 'GEEKKO', - name: { - last: 'Webb', - first: 'Kline', - }, - eyeColor: 'blue', - age: 34, - picture: 'http://placehold.it/32x32', - balance: '$1,520.21', - isActive: false, - guid: '2b179de0-a659-4423-b3c4-11c6490e5c74', - index: 4, - _id: '584babb66d6ea73e8ed51208', - }, -]; - -function sortArr(arr) { - let newArr = []; - arr.forEach(function(value){ - if(value.company) { - newArr.push(value.company); - } - }); - - return newArr; -} - -console.log('task 1 --->', sortArr(listOfCompanys)) - -//-------------------------------------------------------------------------------- -let megaObject = { - favoriteFruit: 'apple', - greeting: 'Hello, Lenora! You have 5 unread messages.', - friends: [ - { - name: 'Paul Carrillo', - id: 0, - }, - { - name: 'Prince Dejesus', - id: 1, - }, - { - name: 'Carey Bates', - id: 2, - }, - { - name: 'Moses Ballard', - id: 3, - }, - { - name: 'Rowe Bolton', - id: 4, - }, - { - name: 'Beck Atkinson', - id: 5, - }, - { - name: 'Rose Travis', - id: 6, - }, - { - name: 'Monica Goff', - id: 7, - }, - { - name: 'Mcfadden Nelson', - id: 8, - }, - { - name: 'Luann Carney', - id: 9, - }, - { - name: 'Cheri Buck', - id: 10, - }, - { - name: 'Hartman Potts', - id: 11, - }, - { - name: 'Farley Austin', - id: 12, - }, - { - name: 'Jerri Richardson', - id: 13, - }, - { - name: 'Burnett Sharp', - id: 14, - }, - { - name: 'Katy Madden', - id: 15, - }, - { - name: 'Kristine Payne', - id: 16, - }, - { - name: 'Ashlee Wilson', - id: 17, - }, - { - name: 'Jan Pugh', - id: 18, - }, - { - name: 'Michael King', - id: 19, - }, - { - name: 'Patty Rivas', - id: 20, - }, - { - name: 'Bridges Oneil', - id: 21, - }, - { - name: 'Walters Vazquez', - id: 22, - }, - { - name: 'English Andrews', - id: 23, - }, - { - name: 'Woodard Cardenas', - id: 24, - }, - { - name: 'Mercado Chan', - id: 25, - }, - { - name: 'Guerra Lawson', - id: 26, - }, - { - name: 'Riley Gray', - id: 27, - }, - { - name: 'Romero Sampson', - id: 28, - }, - { - name: 'Reva Carroll', - id: 29, - }, - { - name: 'Carey Mckenzie', - id: 30, - }, - { - name: 'Miles Raymond', - id: 31, - }, - { - name: 'Ray Underwood', - id: 32, - }, - { - name: 'Maude Norris', - id: 33, - }, - { - name: 'Brigitte Kirkland', - id: 34, - }, - { - name: 'Graham Russell', - id: 35, - }, - { - name: 'Sonia Holcomb', - id: 36, - }, - { - name: 'Hopper Garrison', - id: 37, - }, - { - name: 'Butler Harrison', - id: 38, - }, - { - name: 'Grant Wheeler', - id: 39, - }, - { - name: 'Stout Barker', - id: 40, - }, - { - name: 'Merritt Kelley', - id: 41, - }, - { - name: 'Kari Holman', - id: 42, - }, - { - name: 'Tamra Howell', - id: 43, - }, - { - name: 'Good Harvey', - id: 44, - }, - { - name: 'Hendrix Webb', - id: 45, - }, - { - name: 'Hammond Harris', - id: 46, - }, - { - name: 'Ester Hamilton', - id: 47, - }, - { - name: 'Lopez Hopper', - id: 48, - }, - { - name: 'Newton Cantrell', - id: 49, - }, - ], - range: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], - tags: ['nulla', 'Lorem', 'labore', 'dolore', 'enim'], - longitude: '0.298835', - latitude: '20.822214', - registered: 'Saturday, July 2, 2016 10:52 PM', - about: 'Ipsum adipisicing nulla adipisicing culpa qui et esse labore ut nostrud excepteur amet elit voluptate. Ut ex laborum enim sit. Proident eu elit tempor occaecat dolor.', - address: '597 Agate Court, Interlochen, Utah, 6828', - phone: '+1 (987) 453-2740', - email: 'lenora.barr@uberlux.me', - company: 'UBERLUX', - name: { - last: 'Barr', - first: 'Lenora', - }, - eyeColor: 'brown', - age: 37, - picture: 'http://placehold.it/32x32', - balance: '$3,110.45', - isActive: true, - guid: '74d9074f-004a-447f-8721-12d884011852', - index: 0, - _id: '584bac50967253d4322db586', -}; - -/*function sortArr2(arr) { - let companiesArr = []; - arr.forEach(function(value){ - let index = value.index; - - }); - //let sss = forArray(arr1, index); - return sss; -} - -function forArray(arr, whatISearch){ - arr.forEach(function(value,index,arr) { - if (value.whatISearch) { - console.log(1); - } - }) -} - -console.log('task 1 --->', sortArr2(listOfCompanys))*/ - -/* -* Напишите функцию которая проходится по списку компаний -* и берет свойство 'index' и находит в megaObj друга у которого -* такой же index равен id -* -* Вам нужно вернуть новый массив который содержит объекты(друзей) -* у которых есть свойство companyName имя компании -* и так же имя друга friendName -*/ -let arr = [2,3,4,5,6]; -function multiply(arr){ - return arr.map(function(item){ - return item * 2; - }) -} - -console.log(multiply(arr)); - -///////////////////////////////////////// - -const qq = [1,2,3,4]; -let filtered = qq.filter(function(elem, index, qq){ - return elem > 2 -}) -console.log(filtered); -//----------------------------------------------- -const user = [{ - english: 'B++' -} -] -const qqq = [ -{ - salary: 500, - expectedEnglishLevel: 'r' -}, -{ - salary: 800, - expectedEnglishLevel: 'B0' -}, -{ - salary: 1000, - expectedEnglishLevel: 'B1' -}, -{ - salary: 2000, - expectedEnglishLevel: 'B2++' -} -] - -let salary = qqq.filter(function(elem) { - //return elem.salary >= 1000; - if (elem.expectedEnglishLevel.length > user[0].english.length && elem.salary > 1000) { - return elem.salary >= 1000; - } -}) - -console.log(salary); - - - -//-------------------------------------------------- -const users = [ -{ - age: 20, - salary: 0 -}, -{ - age: 10, - salary: 1000 -}, -{ - age: 10, - salary: 1500 -} -] - -console.log (users.sort(function (a,b) { - return a.age > b.age && a.salary>b.salary; -}) -) - -/* -0 пропускает текущую итерацию --1 - перемещает данное число дальше для сравнения -1 - возвращает следующее число -*/////////////////////////// -const arrr = [10,20,30]; -console.log(arrr.reduce(function(newValue, value, index, arrr){ - //console.log('newValue', newValue); - //console.log('index', index); - return newValue + value -},0))//60 - -/////////////////////////////////// -/*function sum(){ - (arrr.map(item, index, arrr){ - let sum =0; - sum += item; - return sum; - //return item -} -}*/ - -const qqqq = ['JS', 'Easy', 'For', 'Life']; - -console.log(qqqq.reduce(function(newItem, item){ - return `${newItem} - ${item}`; -})) //JS - Easy - For - Life - -//-------------------------------------- -function red(arr){ - var str = ''; - arr.reduce(function(newItem, item){ - str = str + `${newItem} - ${item}`; - }) - return str; -} -console.log(red(qqqq));//JS - Easyundefined - Forundefined - Life \ No newline at end of file diff --git a/js-core/classworks/classwork-6/src/s.js b/js-core/classworks/classwork-6/src/s.js deleted file mode 100644 index b5b3f40..0000000 --- a/js-core/classworks/classwork-6/src/s.js +++ /dev/null @@ -1,2 +0,0 @@ -console.log('WWW'); -console.log('WWW'); \ No newline at end of file diff --git a/js-core/classworks/classwork-8/index.html b/js-core/classworks/classwork-8/index.html deleted file mode 100644 index f9bce3c..0000000 --- a/js-core/classworks/classwork-8/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Lesson_8 - - -

Hello world 8

- - - - \ No newline at end of file diff --git a/js-core/classworks/classwork-8/main.js b/js-core/classworks/classwork-8/main.js deleted file mode 100644 index dbb8e9a..0000000 --- a/js-core/classworks/classwork-8/main.js +++ /dev/null @@ -1,277 +0,0 @@ -/* CHECK THE HOMEWORK - * TASK 1 - THE LAST TASK FROM PREVIOUS HOMEWORK---------- - * - * Напишите функцию которая принимает 4 аргумента: - * - Объект - * - Имя свойства с которым связывается метод - * - Сколько раз можно вызвать метод * - * - Объявление привязываемого метода ( функция ) - * - * При вызове метода отобразите сумму передаваемых параметров. - * Когда заканчивается счетчик, отображается ошибка - * - * */ - -let jun = {}; - -function methodCounter(obj, name, num, fn) {//функция, которая наполняет объект jun -/*нужно добавить метод объекту - в зависимости от того, чему равняется сейчас счетчик - или вызвать функцию(аргумент 4) - или отправить сообщение об ошибке -*/ let counter = num; - obj[name] = function(...args) { //метод jun.logger считает сумму переданных параметров - if (counter === 0) { - return `ERROR ! add more methods, У Вас осталось ${counter} попыток` - } - counter--; - return `${fn(args)}, у Вас осталось ${counter} попыток`; - }; - -}; - -methodCounter(jun, 'logger', 3, function(arr){ //здесь прямо наполняем объект jun - let sum = arr.reduce((newItem, item) => { - return newItem + item; - }, 0); - return sum; -}); - - -//должна одна и та же функция вызываться не более 3 раз, т.к. 3 передано в функцию -console.log('task 3-1 ----> ',jun.logger(1, 2, 3, 4)); // 2, 10 -//console.log('task 3-1 ----> ',jun.logger(1, 2, 3, 4)); // 2, 10 -//console.log('task 3-1 ----> ',jun.logger(1, 2, 3, 4)); // 2, 10 -console.log('task 3-2 ----> ',jun.logger(5, 5, 5, 5)); // 1, 20 -console.log('task 3-3 ----> ',jun.logger(1, 2, 3, 4, 7, 10)); // 2, 27 -console.log('task 3-4 ----> ',jun.logger(5, 5, 5, 5)); // 1, 20 -console.log('task 3-5 ----> ',jun.logger(5, 5)); // ERROR ! add more methods - -//добавьте функции methodCounter возможность увеличивать счетчик на заданное число -//jun.addCounter(10, methodName); - - -//----CLASSWORK------------------------------------------------------- - -//1. SWITCH CASE --------редко пользуются--------- - -function checkActionType(action){ - switch (action.type) { - - case 'INITIALIZE': - return {initialized: true}; - - case 'INCREMENT': - return {salary: '+500$'}; - - case 'DECREMENT': - return {salary: '-500$'}; - - default: - return {}; - }; -} -console.log(checkActionType({type: 'INITIALIZE'})); - -// 2. PSEUDOARRAYS------------------------------------- -//Псевдомассивы приходят, когда берем у функции ее arguments. -//вроде как приходит массив - если посмотреть в консоли, то он заключен в квадратные скобки. -//Но его прототип - объект (видно там же в консоли) -//поэтому не можем применить к псевдомассивам методы массивов - forEach, reduce и т.д. -//только можем пройти с помощью for - -const pseudoArray = { - 0: 'one', - 1: 'two', - 2: 'three' -} -pseudoArray.length = 3; - -for (let i = 0; i < pseudoArray.length; i++){ - const elem = pseudoArray[i]; - console.log(elem); -} - -//--------------------------------------------- -function add(){ - let arr = arguments; - - let sum = 0; - for (let i = 0; i < arr.length; i++){ - let item = arr[i]; - sum += item; - } - return sum; -} -console.log(add(1,2,3)); -console.log(add(10,20,30)); -console.log(add(10,20)); -console.log(add(10,20,30, 40, 50,10)); - -//-------------ES6 solution--------------- -//чтобы привести псевдомассив в чувство, используем деструкцию -//тогда можно применять методы массивов - forEach, reduce и т.д. - -function add2(){ - let arr = [...arguments];// возьмет все аргументы, запишет их через запятую и поместит в массив - return arr.reduce((newItem, item) => { - return newItem + item; - }, 0) -} - -console.log(add2(1,2,3)); -console.log(add2(10,20,30)); -console.log(add2(10,20)); -console.log(add2(10,20,30, 40, 50,10)); - -//-------------ES7 solution--------------- -//чтобы привести псевдомассив в чувство, используем деструкцию -//тогда можно применять методы массивов - forEach, reduce и т.д. -//...args сразу возвращает массив аргументов!!! Пользоваться этим решение всегда! -function add3(...args){ - return args.reduce((newItem, item) => { - return newItem + item; - }, 0) -} - -console.log(add3(1,2,3)); -console.log(add3(10,20,30)); -console.log(add3(10,20)); -console.log(add3(10,20,30, 40, 50,10)); - - -//------------OBJECTS---------------------------------- - -let obj1 = {id: 10}; -let obj2 = {id: 10}; -console.log(obj1 == obj2); //false, т.к. на самом деле при создании объекта создается -//ссылка в оперативной памяти и ссылка присваивается в переменную -//Объект физически занимает ячейку памяти -//Когда мы присваиваем новой переменной существующий объект, то присваивается существующая ссылка!!! - -let obj = {name: 'JavaScript'}; -let z = obj; -z.qwerty = 'qwerty'; -console.log(obj); //{name: "JavaScript", qwerty: "qwerty"} -console.log(z); //{name: "JavaScript", qwerty: "qwerty"} -//и obj, и z ссылаются на одну и ту же ячейку памяти, следовательно, имеют к ней одинаковый доступ -//если z добавил какое-то свойство, то оно видно и из obj. Мы просто смотрим на одну ячейку с разных сторон - -//Когда мы передаем один и тот же объект в разный функции, то мы передаем не объект, мы передаем ССЫЛКУ -//Это очень дешево, ничего нового не инициализируется, большой перформанс -//---------------------------------------------------------------------- - -//Задача 1- скопировать объект user - -const user = { - id: 10, - country: 'Thailand', - email: 'example@example.com' -}; - -//написать ф-цию, которая принимает любой объект и возвращает его копию -//нужно скопировать объект - -function copy(obj){ - let keys = Object.keys(obj); //"id", "country", "email"] - let newObj = {}; - - keys.forEach((item) => { - if (Array.isArray(obj[item])) { //ОЧЕНЬ СТАРЫЙ СПОСОБ: если вдруг очередной элемент массива - тоже массив, то он же в глубине души объект - newObj[item] = [...obj[item]]; //и тоже хранит ссылку на одну и ту же ячейку памяти. Поэтому деструктурируем его и записываем в новый массив - return;// это типа continue, только для forEach - } - newObj[item] = obj[item];//в новый объект записываем ключи из их значения из старгого - }); - -//или можно было так: -// for (let key in obj) { -// newObj[key] = obj[key]; -// } - return newObj; -} - -const newUser = copy(user); -newUser.country = 'India';// в новом объекте меняем значение ключа country - -console.log(copy(user));//thailand -console.log(copy(newUser));//india - -//-----------БОЛЕЕ СОВРЕМЕННЫЙ СПОСОБ - Object.assign------------------------------------ -//Но JS придумал упрощение этой задачи, но это работает для копирования только на одном уровне. -//Если будут вложенные объекты - у них по-прежнему останутся ссылки на одно и то же место в памяти - -//function copy2(obj){ -// let newObject = Object.assign({}, obj); //скопируй объект obj в новый пустой объект {} и запиши это в переменную newObject -// return newObject; -//} -//-----------Object.assign deep copy------------------------------------ -//Чтобы скопировать более глубокую вложенность, пишут так, при этом мы должны знать, как называются ключи объекта: - -function copy2(obj){ - let newObject = Object.assign({}, obj, { //скопируй объект obj в новый пустой объект {} и запиши это в переменную newObject - cars: [...obj.cars] //значение ключа cars деструктурируй и положи в новый массив - }); - return newObject; -} - -//Усложнение задачи 1 ----------------------------------------- - -const user2 = { - id: 10, - country: 'Thailand', - email: 'example@example.com', - cars: ['we', 'ref','re'] -}; - -const newUser2 = copy2(user2); -newUser2.cars.push('toyota');//тойота отобразится не только в новом объекте, а в старом тоже - //хотя объекты уже разные и ссылаются на разные ячейки памяти. Почему? - // потому что cars - это еще один объект внутри разных объектов user2 и newUser2 - //и у внутреннего объекта cars в обеих объектах ссылка на одну и ту же ячейку памяти - // Что же делать? - -console.log(copy2(user2));//thailand -console.log(copy2(newUser2));//india - - -//------САМЫЙ СОВРЕМЕННЫЙ СПОСОБ------------------------------ - -// -// -// -const user3 = { - id: 10, - country: 'Thailand', - email: 'example@example.com', - cars: { - id: 50, - name: ['bmw', 'VAZ', 'mercedes', 'AUDI'], - vendors: { - addresses: ['google', 'yahoo'] - } - } -}; - -function copy3(obj){ - let newObj = Object.assign({}, obj); - return { - ...obj, //деструтурируем каждое свойство объекта (копируем все свойства объекта) - cars: { - ...obj.cars,//перезаписываю cars - создастся три новых свойства: id, name, vendors - name: [...obj.cars.name], //обновляю name - vendors: { - ...obj.cars.vendors,//если вдруг в vendors еще что-то лежит, кроме addresses - addresses: [...obj.cars.vendors.addresses] - } - } - } -} - -const newUser3 = copy3(user3); -newUser3.cars.name.push('mazda');// тойота должна добавиться только к newUser3, а к user3 - нет -newUser3.cars.vendors.addresses.push('javascript');// тойота должна добавиться только к newUser3, а к user3 - нет - - -console.log(copy3(user3));//thailand -console.log(copy3(newUser3));//india \ No newline at end of file diff --git a/js-core/classworks/classwork-9/index.html b/js-core/classworks/classwork-9/index.html deleted file mode 100644 index 2f4d833..0000000 --- a/js-core/classworks/classwork-9/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Lesson_9 - - -

Hello world 9

- - - - \ No newline at end of file diff --git a/js-core/classworks/classwork-9/main.js b/js-core/classworks/classwork-9/main.js deleted file mode 100644 index 413bde7..0000000 --- a/js-core/classworks/classwork-9/main.js +++ /dev/null @@ -1,123 +0,0 @@ -//--------JSON JavaScript Object Notation----------------- - -const myJSON = { - "name": "my library", - "version": 10, - "dependency": { - "react": "^16.4.0", - "babel": false - }, - "plugins": ['env', 'qwerty'], - //methodES6(): { - // console.log(Obgect.key(myJSON)); - //} -} - - -//console.log(JSON.stringify(myJSON));//вернет строку - -//const validJSON = JSON.parse(JSON.stringify(myJSON)); -//console.log(validJSON); - -//Обычный консоль лог покажет JSON как обычный объект. Чтобы вернуть все же JSON, -//нужно сделать JSON.stringify(myJSON) - превратит в строку -// а потом JSON.parse() - строку превратит в JSON - -let parsed = JSON.parse(JSON.stringify(myJSON)); -let keys = Object.keys(parsed); -console.log(keys); - -//------------------------------------------------- - -//Используя ES6 напишите ф-цию, которая принимает 1 агрумент имя и возвращает "Привет, меня зовут имя" -let hello = (name) => { - return `Hi, my name is ${name}`; -} - -let hello2 = (name) => `Hi, my name is ${name}`; - -console.log(hello('Nataly')); -console.log(hello2('Nataly')); - -//Используя ES6 напишите ф-цию, которая принимает 1 агрумент имя и возвращает объект {name:name} - -let createObj = name => { //если передаем один аргумент, круглые скобки вокруг можно не ставить - return { - name //сработает как name: 'Nataly'! - } -} - -// или так: -let createObj3 = (name, surname) => { //если передаем один аргумент, круглые скобки вокруг можно не ставить - return { - name, //сработает как name: 'Nataly'! - surname - } -} - -console.log(createObj('Nataly')); - -let createObj2 = (name) => ({name}) - -console.log(createObj2('Nataly')); -console.log(createObj3('Nataly', 'Vladimirovna')); - -//----------------------------------------------------- -const userArray = ['Vasya', 'Petya', 'Grigoriy']; -//[{name: 'Vasya'}, {name: 'Petya'}, {name: 'Grigoriy'},] - -let newArr = userArray.map((name) => { - return { - name - } -}); - - -let newArr2 = userArray.map((name) => ({name})); - -console.log(newArr); -console.log(newArr2); - - -//---- THIS контекст вызова функции-----------------------------------------\\ - -const anotherObject = {//разобрать - name: 'qwer', - id: 0, - salary: '500$', - methodES6 -}; - - -function methodES6() { - console.log(Obgect.key(anotherObject)); - }; - - -//напишите ф которая будет отображать количество страниц книги, -//и ф можно вызвать как для объекта book1, так и для book2 -let book1 = { - pages: 340, - getPages -}; - -let book2 = { - pages: 4, - getPages -} - -function getPages(){ - //console.log(this); - return this.pages; -} - -function showPages () { - return this.pages; -} -/*function getPages(book) => { - return this.pages -}*/ - -console.log(book1.getPages()); -console.log(book2.getPages()); -console.log(book1.showPages()); \ No newline at end of file diff --git a/js-core/homeworks/homework-10/index.html b/js-core/homeworks/homework-10/index.html deleted file mode 100644 index 9d4ff1a..0000000 --- a/js-core/homeworks/homework-10/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Homework_10 - - -

Homework 10

- - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-10/main.js b/js-core/homeworks/homework-10/main.js deleted file mode 100644 index 2ea1c00..0000000 --- a/js-core/homeworks/homework-10/main.js +++ /dev/null @@ -1,139 +0,0 @@ -'use strict'; - -/* - * - * Задача 0 - * - * Что вернет выражение z(x) ? - * Напишите ответ своими словами как вы понимаете - * В консоле не смотрите, сначала напишите, после проверьте себя - * - * */ - -let y = 5; -let x = () => y;//5 - -let z = t => { //z равно функции, которая принмает t. В t пришла функция х - let y = 12; - return t(); -}; - -//console.log('task 1-1---->', y);//5, берет значение глобальной переменной y - -//console.log('task 2-1---->', z(x)); // что вернет - undefined, потому что нет никакого ретерна из t -//если добавить return, то возвращается 5, т.к. функция х пришла со своем контекстом, т.е. с у=5. Круто) - -/* - * - * TASK 2---------------------------------------------- - * Создайте функцию которая будет превращать - * передаваемую строку в html тэг - * - * - * */ - -let $ = function(str) { - return `<${str}>` -}; - -let createBODY = $('body'); -let createDIV = $('div'); - -console.log('task 2-1---->', createBODY); // -console.log('task 2-2---->', createDIV); //
- -/* - * - * TASK 3-------------------------------------------------------------- - * - * Создайте объект к которому можно будет применить любое число вызовов - // obj.method().method().method() - --------------- - * Передаваемое значение должно возвращаться в виде html тэгов (TASK 1) - * Передаваемые аргументы должны быть только в виде строки - * */ - -var ezjQuery = { - - add(str) { - this.res += `<${str}>`; - console.log(this.res); - return this;//возвращает ezjQuery, у которой в res каждый раз добавляется новое значение - //и каждый следующий вызов происходит с тем, что в res уже что-то есть - } - -}; - -ezjQuery.res = ''; - -ezjQuery - .add('body') // - .add('div') //
- .add('h1'); //

- - /* - * - * TASK 4-------------------------------------------- - * Доработйте метод add чтобы на каждом вызове следующий - * тэг помещался внутри предыдущего ! - --- - * И добавьте объекту ezjQuery метод render, который будет возвращать - * сгенерированную строку - ----- - * Методу add - второй параметр, который будет размещать - * информацию внутри тэга - * - */ - -var ezjQuery2 = { - - res: '', - - add(str, inner) { - - if (this.res.length != 0) { - this.res = (inner != undefined) ? this.res.replace('><${str}>${inner}<${str}>`; - //console.log(this.res); - return this; - }, - - render() { - document.write(this.res); - console.log(this.res); - //return this.res; //тут что-то одно получается - или обнулить res, или ретернуть его. И обнулить, и ретернуть непонятно как - this.res = ''; - } - -}; - - -var helloList = ezjQuery2 - .add('body') // - .add('div') //
- .add('ul') //
    - .add('li', 'Hello') //
    • Hello
    - .render(); - -console.log('task 3-1---> ', helloList); //
    • Hello
    -// Обратите внимание, что после вызова render создание строки началось сначала - -var bodyDiv = ezjQuery2 - .add('body') // - .add('div') //
    - .render(); -console.log('task 3-2---> ', bodyDiv); //
    - - -// @SUPER -/* - * Переименуйте объект ezjQuery в $. - * Создание перевого метода должено быть без метода - */ - - - // $('body').add('li', 'hi').render() //
  • hi
  • diff --git a/js-core/homeworks/homework-11/index.html b/js-core/homeworks/homework-11/index.html deleted file mode 100644 index 87d85b4..0000000 --- a/js-core/homeworks/homework-11/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Homework_11 - - -

    Homework 11

    - - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-11/main.js b/js-core/homeworks/homework-11/main.js deleted file mode 100644 index d0cfdc7..0000000 --- a/js-core/homeworks/homework-11/main.js +++ /dev/null @@ -1,71 +0,0 @@ -'use strict'; - - -/* - * - * Сделайте 4 объекта - не усложняйте, просто наследование - * через __proto__ - - - Пользователь - - Верифицированный пользователь(админ) - - Гость - - База данных - - - База хранит информацию о пользователях // - - Пользователи знают мыло админа // - - админ знает пароль от базы данных - - Гости могут зарегистрироваться в базе данных // - * - * */ -function Guest(name){ - this.guestName = name; -} - -function User(name){ - this.userName = name; -} - -function Database(name){ - this.dbName = name; - this.users = []; - this.password = 'qwerty'; -} - -Database.prototype.createNewUser = function(user){ - let newUser = new User(user); - console.log(newUser); - - this.users.push(newUser); -} - -/*Database.prototype.showPassword = function(){ - console.log('------------',this.password); -}*/ - -/*Guest.prototype.canRegister = function(){ - let newUser -}*/ - -//--------------------- -let guest = new Guest('guest-1'); -console.log(guest); - -let commonUser = new User('Karl'); -console.log(commonUser); - -let admin = new User('Admin'); -console.log(admin); - -let db = new Database('mongoDB'); -console.log(db); - -User.prototype = {//у всех экземпляров, созданных через new User, в __proto__ prototype будет лежать adminMail: 'admin@admin.com' - adminMail: 'admin@admin.com' -} - -admin.dbPassword = 'qwerty'; -//db.showPassword(); - -db.createNewUser('user-1'); -db.createNewUser('user-2'); - diff --git a/js-core/homeworks/homework-2/index.html b/js-core/homeworks/homework-2/index.html deleted file mode 100644 index cd5e32e..0000000 --- a/js-core/homeworks/homework-2/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Home work 2 - - -

    Homework 2

    - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-2/src/main.js b/js-core/homeworks/homework-2/src/main.js deleted file mode 100644 index a4d2c00..0000000 --- a/js-core/homeworks/homework-2/src/main.js +++ /dev/null @@ -1,75 +0,0 @@ - /*1. Составить предложение из нижестоящих переменных: - "Сколько нужно программистов чтобы сделать проект ? 1, 25, команда" - */ - -let numbers = [25, 1]; -let project = 'проект'; -let team = `команда`; -let howMuch = 'Сколько'; -let sentence = 'нужно программистов чтобы сделать проект ?'; - -console.log(numbers); -let task1 = `${howMuch} ${sentence} ${numbers[1]}, ${numbers[0]}, ${team}`; -console.log('task1', task1); - -/* - 2. Составьте предложение из представленного массива - и выведите предложение в консоль; - "Так, когда Будда достиг Просветления, он обнаружил, что больше не ощущает себя мишенью. - Он не был больше ни телом, к которому рано или поздно ..." - // index +++ - */ - -let array = [ - 'Он', - 'был больше ни телом, к которому рано или поздно', - 'он обнаружил', - 'не', - 'Так, когда Будда достиг Просветления', - '...', - 'что больше', - 'ощущает себя мишенью', - 'не' -]; - -let homeSentence = `${array[4]}, ${array[2]}, ${array[6]} ${array[3]} ${array[7]}. ${array[0]} ${array[8]} ${array[1]} ${array[5]}`; -console.log('task2', homeSentence); - - -/* 3. Добавьте свойста 4 новых свойства в объект используя - квадратные скобки и точку. */ - -let myObj = {}; -let eyeColor = 'green'; -myObj.sex = 'male'; -myObj.age = 30; -myObj['hasDog'] = true; -myObj['eyesColor'] = 'green'; - -console.log('task3', myObj); - - -/* 5. Преобразуйте строку x, - в максимально удобно читаемый для программиста вид */ - -let frameworks = [4.7, 'Angular', '6Angular', 'React/Redux']; -let x = - 'google \ -released ' + - 'new version\ - ' + - frameworks[1] + - Math.floor(frameworks[0]) + - '\ -But real speed is ' + - `${frameworks[frameworks.length - 1]}`; - -//console.log(x); - -let helper1 = Math.floor(frameworks[0]); -let helper2 = frameworks[frameworks.length - 1]; - -//console.log(helper1, helper2); - -let y = `google released new version ${frameworks[1]} ${helper1} But real speed is ${helper2}`; -console.log('task5', y); \ No newline at end of file diff --git a/js-core/homeworks/homework-4/index.html b/js-core/homeworks/homework-4/index.html deleted file mode 100644 index ab8c164..0000000 --- a/js-core/homeworks/homework-4/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Home work 4 - - -

    Homework 4

    - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-4/src/main.js b/js-core/homeworks/homework-4/src/main.js deleted file mode 100644 index 525d18b..0000000 --- a/js-core/homeworks/homework-4/src/main.js +++ /dev/null @@ -1,188 +0,0 @@ -/* TASK 1 -* Напишите функцию которая будет принимать 1 аргумент и в зависимости от типа аргумента -* -* Если тип аргумента число или объект -> возвращать true -* Если тип аргумента функция -> возвращать false -* Если тип аргумента Строка и длина этой строки не равна 10 -> возвращать "длина вашей строки: <длина строки> -* Если длина 10 -> 'you win' -* */ -function showMeType(arg) { - let res; - //res = typeof arg === 'number' || typeof arg === 'object' ? true : false; - //return res; - if (typeof arg === 'number' || typeof arg === 'object') { - res = true; - }; - - if (typeof arg === 'function') { - res = false; - }; - - if (typeof arg === 'string' && arg.length != 10) { - res = `Длина Вашей строки: ${arg.length}`; - } else if (arg.length == 10) { - res = `you win`; - } - - return res; -} - -function helper(){ - console.log('I am a helper'); -}; - -console.log('task 1-1 ---->', showMeType(6));//true -console.log('task 1-2 ---->', showMeType([]));//true -console.log('task 1-3 ---->', showMeType({}));//true -console.log('task 1-4 ---->', showMeType(helper));//false -console.log('task 1-5 ---->', showMeType('012345'));//6 -console.log('task 1-6 ---->', showMeType('0123456789'));//you win - -//-------------------------------------------------------------------------------------------- - -/* TASK 2 - 1. Напишите функцию которая принимает 2 числа - и возвращает массив содержащий числа между первым числом и вторым числом; - */ - -function numbersBetween(a, b) { - let arr = []; - for (let i = a; i <= b; i++) { - arr[arr.length] = i; - } - return arr; -} - -console.log('task 2-1 ---->', numbersBetween(3, 5));// 3, 4, 5 -console.log('task 2-2 ---->', numbersBetween(10, 12));// 10, 11, 12 -console.log('task 2-3 ---->', numbersBetween(4, 15));// 4,5,6,7,8,9,10,11,12,13,14,15 - -//------------------------------------------------------------------------------------------------ - -/* TASK 3 - 2. Перепишите задачу FizzBuzz, но с использованием цикла. - Расчет чисел должен идти до 100 - */ - -// 1. FizzBuzz 3, 5, 3 && % 5 - -function FizzBuzz(num) { - let res = ''; - if (num % 3 == 0) { - res += 'Fizz'; - }; - if (num % 5 == 0) { - res += 'Buzz'; - }; - - return res.length == 0 ? num : res; -} - -function FizzBuzz100() { - for (let i = 0; i <= 100; i++) { - console.log('task 3 ----->', FizzBuzz(i)) ; - } -} - -FizzBuzz100(); - -//----------------------------------------------------------------------------- -/* TASK 4 -3. Напишите функцию которая принимает 1 аргумент - массив - И возвращает новый массив содержащий типы значений переменных - - -// let arr = [1, null, undefined, 'str', {}, [], function() {}]; -*/ - -function showTypes(arr){ - let res = []; - for (let i = 0; i < arr.length; i++) { - res[res.length] = typeof arr[i]; - } - return res; -} - -let array = [1, null, undefined, 'str', {}, [], function() {}]; - -console.log('task 4 ---->', showTypes(array)) - -//--------------------------------------------------------------------- - -/* - 1. @@SUPER@@. Вам дан массив array, содержащий внутри объекты. - Напишите функцию которая внутри цикла проходится по каждому элементу массива - И проверяет какой тип данных содержит свойство age, если тип данных NaN, - тогда добавляет данному объекту свойство unknownAge: true - 2. На основании нового массива, создайте новую функцию, которая вернет новый массив - содержащий все объекты содержащие свойство unknownAge: true - */ - -let arr = Array.from({length: 35}, - (value, index) => (index % 2 ? {age: index + 2} : {age: NaN}), -); - -function lookInObject(obj){ - let objKey = obj.age; - if (isNaN(objKey)) { - obj.unknownAge = true; - } - return obj; -/* for (let key in obj) { - if (key == 'age' && isNaN(obj[key])) { - obj.unknownAge = true; - } - - return obj; - }*/ -} - -function makeResultArray(arr) { - let resultArray = []; - for (let i = 0; i < arr.length; i++) { - let obj = arr[i]; - for (let key in obj) { - if (key == 'unknownAge') { - resultArray[resultArray.length] = obj; - } - } - } - - return resultArray; -} - -function solution(arr) { - let newArr = []; - - for (let i = 0; i < arr.length; i++) { - //f (typeof arr[i] != 'object') continue; - - let newElem = lookInObject(arr[i]); - newArr[newArr.length] = newElem; - } - - return makeResultArray(newArr); -} - - -/*let arr = [ - { - age: '25', - job: 'student' - }, - { - age: NaN, - job: 'pilot' - }, - { - age: 40 - }, - 12, - 'some string here', - { - age: NaN, - job: 'student' - }, -];*/ - -console.log(solution(arr)); diff --git a/js-core/homeworks/homework-5/index.html b/js-core/homeworks/homework-5/index.html deleted file mode 100644 index 679fdab..0000000 --- a/js-core/homeworks/homework-5/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Home work 5 - - -

    Homework 5

    - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-5/src/main.js b/js-core/homeworks/homework-5/src/main.js deleted file mode 100644 index 5d48811..0000000 --- a/js-core/homeworks/homework-5/src/main.js +++ /dev/null @@ -1,159 +0,0 @@ -/*NASK 1 - 1. Переместите 0 в конец массива, остальные числа должны остаться - неизменными - // concat - example: - [1,false,2,0,3,null,0,4,0,25] => [1, false, 2, 3, null, 4, 25, 0, 0, 0] - [ 'a', 0, 0, 'b', null, 'c', 'd', 0, 1, false, 0, 1, 0, 3, [], 0, 1, 9, 0, 0, {}, 0, 0, 9 ] => ["a","b",null,"c","d",1,false,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0] - [ 0, 1, null, 2, false, 1, 0 ] => [1,null,2,false,1,0,0] - */ - -let arr1 = [1, false, 2, 0, 3, null, 0, 4, 0, 25]; -let arr2 = [ - 'a', - 0, - 0, - 'b', - null, - 'c', - 'd', - 0, - 1, - false, - 0, - 1, - 0, - 3, - [], - 0, - 1, - 9, - 0, - 0, - {}, - 0, - 0, - 9 -]; - -function moveZeroToEnd(arr) { - let zeroArray = []; - - while (arr.indexOf(0) != -1) { - let index = arr.indexOf(0);//will return an index - let element = arr[index]; - arr.splice(index, 1); - zeroArray.push(element); - } - arr = arr.concat(zeroArray); - return arr; - } - -console.log('task 1-1 --->', moveZeroToEnd(arr1)); -console.log('task 1-2 --->', moveZeroToEnd(arr2)); - -/*TASK 2 - 2. Верните сумму двух найменьших чисел в массиве - [10,20,30,1,31,11,10] => 11 - [-1,0,25] => -1 - [-4,-10,25,10] => -14 - [0,200,10,25,15] => 10 - */ -let a = [10,20,30,1,31,11,10]; -let b = [-1,0,25]; -let c = [-4,-10,25,10]; -let d = [0,200,10,25,15]; - -function minimalNumber(arr) { - let sum; - - let newArr = arr.sort(); - sum = newArr[0] + newArr[1]; - - return sum; -} - -console.log('task 2-1 --->', minimalNumber(a)); -console.log('task 2-2 --->', minimalNumber(b)); -console.log('task 2-3 --->', minimalNumber(c)); -console.log('task 2-4 --->', minimalNumber(d)); - -/*TASK 3 - 3. Напишите функцию которая меняет местами имя и фамилию */ - let e = 'john McClane'; //=> "McClane john" - let f ='Arnold Schwarzenegger'; //=> "Schwarzenegger Arnold" - let g = 'James Bond'; //=> "Bond James" - - -/*function nameShuffler(str) { - let arr = str.split(' '); - let res = ''; - res = arr[1] + ' ' + arr[0]; - return res; -}*/ - -function nameShuffler(str) { - - let arr = str.split(' '); - arr = arr.reverse(); - let res = ''; - res = arr.join(' '); - return res; - -} - -console.log('task 3-1 --->', nameShuffler(e)); -console.log('task 3-2 --->', nameShuffler(f)); -console.log('task 3-3 --->', nameShuffler(g)); - -/* - // TASK 4 - 4. Напишите функцию которая принимает массив с именами и возвращает массив - в котором каждая буква становится заглавной - capMe(['jo', 'nelson', 'jurie']) // returns ['Jo', 'Nelson', 'Jurie'] - capMe(['KARLY', 'DANIEL', 'KELSEY']) // returns ['Karly', 'Daniel', 'Kelsey'] - */ - -function capMe(arr) { - - for (let i = 0; i < arr.length; i++) { - let element = arr[i]; - element = element.toLowerCase(); - //element = element[0].toUpperCase(); - //console.log(element); - elementArr = element.split(''); - - let newElement = toUpper(elementArr); - arr.splice(i, 1, newElement); - } - - return arr; -} - -function toUpper(arr){ - let firstLetter = arr[0].toUpperCase(); - arr.splice(0, 1, firstLetter); - let res = arr.join(''); - return res; -} - -console.log('task 4-1 --->', capMe(['jo', 'nelson', 'jurie'])) // returns ['Jo', 'Nelson', 'Jurie'] -console.log('task 4-2 --->', capMe(['KARLY', 'DANIEL', 'KELSEY'])) // returns ['Karly', 'Daniel', 'Kelsey'] - -// @SUPER -/* - 1. Найдите число отсутствующее в заданной последовательности - example: - [1,3,5,9] => 7 (9-1) / 4 == 2 - [0,8,16,32] => 24 - [4, 6, 8, 10] => 2 // число сначала - [0,16,24,32] => 8 - */ - -function random(arr) { -} - -random([1, 3, 5, 9]); -random([0, 8, 16, 32]); -random([0, 16, 24, 32]); -random([4, 6, 8, 10]); \ No newline at end of file diff --git a/js-core/homeworks/homework-6/index.html b/js-core/homeworks/homework-6/index.html deleted file mode 100644 index 877afe9..0000000 --- a/js-core/homeworks/homework-6/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - Home work 6 - - -

    Homework 6

    - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-6/src/main.js b/js-core/homeworks/homework-6/src/main.js deleted file mode 100644 index 619a7f8..0000000 --- a/js-core/homeworks/homework-6/src/main.js +++ /dev/null @@ -1,338 +0,0 @@ - /** TASK 1 - * Посчитайте количество букв а, в передаваемом параметре - * - * */ - -let randomString = 'aaa b a w c '; - -let user = { - name: 'Albina', -}; - -let javaScript = { - html: 'JavaScript', -}; - -/*function countLetterA(str) { - let counter = 0; - let arr = str.toLowerCase().split(''); - console.log(arr); - arr.forEach((item) => { - if (item == 'a') { - counter++; - }; - }) - - return counter; -}*/ - -function countLetterA(str) { - let arr = str.toLowerCase().split(''); - let counter = arr.reduce((newItem, item) => { - if (item == 'a') { - newItem++; - }; - return newItem; - }, 0); - -return counter; -} - -console.log('task 1-1 ---->', countLetterA(randomString)); // 4 -console.log('task 1-2 ---->', countLetterA(user.name + javaScript.html)); // 3 //4 -//------------------------------------------------------------------ - -/* - * - * TASK 2 - * Вам дано предложение, вам необходимо перевернуть каждое - * слово в предложении в обратном порядке - * - * */ -//1. Разбить предложение на массив по пробелу -//2. взять каждый элемент массива и тоже разбить на массив по '' -//3. Применить метод реверс на каждом слове -//4. Собрать получившийся массив опять в строку -function reverseEachWord(str) { - let strArr = str.split(' '); - let word = strArr.map((item) => { - return item.split('').reverse().join(''); - }) - return word.join(' '); -} - -console.log('task 2-1 ---->', reverseEachWord('You don\'t have to do anything special to begin using the DOM. Different browsers have different implementations of the DOM')); -// uoY t'nod evah ot od gnihtyna laiceps ot nigeb gnisu eht .MOD tnereffiD sresworb evah tnereffid snoitatnemelpmi fo eht MOD - -console.log('task 2-2 ---->', reverseEachWord('The Document Object Model (DOM) is a programming interface for HTML and XML documents')); -// ehT tnemucoD tcejbO ledoM )MOD( si a gnimmargorp ecafretni rof LMTH dna LMX stnemucod - - -/* - * TASK 3 - * Добавьте в функцию reverseEachWord второй параметр, - * данный параметр булево, если true - тогда предложение так же - * переворачиваются в обратном порядке - * */ -function reverseEachWord2(str, shouldSentenceBeReversed) { - let strArr = str.split(' '); - let word = strArr.map((item) => { - return item.split('').reverse().join(''); - }) - if (shouldSentenceBeReversed) { - return word.reverse().join(' '); - } - return word.join(' '); -} - -console.log('task 3-1 ---->', reverseEachWord2('You don\'t have to do anything special to begin using the DOM. Different browsers have different implementations of the DOM', true)); -//MOD eht fo snoitatnemelpmi tnereffid evah sresworb tnereffiD .MOD eht gnisu nigeb ot laiceps gnihtyna od ot evah t'nod uoY -console.log('task 3-2 ---->', reverseEachWord2('The Document Object Model (DOM) is a programming interface for HTML and XML documents', true)); -// stnemucod LMX dna LMTH rof ecafretni gnimmargorp a si )MOD( ledoM tcejbO tnemucoD ehT -console.log('task 3-3 ---->', reverseEachWord2('Hi my Name is', false)); -// iH ym emaN si - - -/* TASK 4 - * Посчитайте сколько одинаковых слов в предложении. - * Функция должна возвращать объект у которого свойства - * это повторяющиеся слово, - * а значение это количество повторений - * */ - -// Both - Java - and - Java - Script - is - programming - and - programming - OOPBased -function wordCounter(sentence) { - let arr = sentence.split(' '); - let obj = arr.reduce((newItem, item) => { - let sentenceItem = item; - let counter = 0; - - arr.forEach((item) => { - if (sentenceItem === item) { - counter++; - } - }); - - newItem[sentenceItem] = counter; - return newItem; - - }, {}); - - return obj; -} - -console.log('task 4-1 ---->', - wordCounter('Both Java and Java Script is programming and programming OOPBased Language'), -); - -/* - { - Both:1, - Java:2, - and:2, - Script: 1, - is: 1 - programming: 2 - OOPBased:1, - Language:1 - } - */ - -console.log('task 4-2 ---->', wordCounter('asd qwe asd')); -/* - { - asd:2 - qwe:1 - } - * */ - -console.log('task 4-3 ---->', wordCounter('url http url www url http')); -/* - { - http:2, - url:3, - www:1 - } - * */ - - - /* - TASK 4 - // Функция принимает массив у которого есть свойста _id и Company. - // верните объект, у которого ключ это _id, а значение Company - */ -let listOfCompanys = [ - { - company: 'ASIMILINE', - name: { - last: 'Watkins', - first: 'Lindsay', - }, - eyeColor: 'brown', - age: 20, - picture: 'http://placehold.it/32x32', - balance: '$1,091.09', - isActive: true, - guid: '294814e3-4c89-428f-b0c9-da5c4c37ea5e', - index: 0, - _id: '584babb6eeb4137cf14c37a3', - }, - { - company: 'ENJOLA', - name: { - last: 'Price', - first: 'Greene', - }, - eyeColor: 'brown', - age: 39, - picture: 'http://placehold.it/32x32', - balance: '$3,533.55', - isActive: true, - guid: 'e7b0824f-d6d1-4a82-b2c5-cd7a1ec8310c', - index: 1, - _id: '584babb6c7be9c2398ed263f', - }, - { - company: 'ZINCA', - name: { - last: 'Robertson', - first: 'Barbara', - }, - eyeColor: 'brown', - age: 22, - picture: 'http://placehold.it/32x32', - balance: '$1,395.22', - isActive: false, - guid: '0735d8d9-a165-4ad1-893f-e821da37bf63', - index: 2, - _id: '584babb6cca4dbefa6001820', - }, - { - company: 'TALKOLA', - name: { - last: 'Cooke', - first: 'Lea', - }, - eyeColor: 'blue', - age: 31, - picture: 'http://placehold.it/32x32', - balance: '$3,074.16', - isActive: false, - guid: '7d13cbc4-6b4d-4954-b3d3-df3cfe5f2373', - index: 3, - _id: '584babb6391a2b568f1e9416', - }, - { - company: 'GEEKKO', - name: { - last: 'Webb', - first: 'Kline', - }, - eyeColor: 'blue', - age: 34, - picture: 'http://placehold.it/32x32', - balance: '$1,520.21', - isActive: false, - guid: '2b179de0-a659-4423-b3c4-11c6490e5c74', - index: 4, - _id: '584babb66d6ea73e8ed51208', - }, -]; - - // Функция принимает массив у которого есть свойста _id и Company. - // верните объект, у которого ключ это _id, а значение Company - -function createHashTags(arr) { - let obj = arr.reduce((newItem, item) => { - let id = item._id; - let value = item.company - newItem[id] = value; - return newItem; - }, {}) - - return obj; -} - -console.log('task 5-1 ---->', createHashTags(listOfCompanys)); -//{"584babb6eeb4137cf14c37a3":"ASIMILINE", '584babb6eeb4137cf14c37a3':'Company2', } - -// @ SUPER -/* - * - * TASK 1 - * Выведите уникальные значения - * - * */ - -function uniqueElements(arr) { - let obj = arr.reduce((newItem, item) => { - let str = item; - newItem[str] = true; - return newItem; - }, {}); - - return Object.keys(obj); -} - -/*function uniqueElements2(arr) { - let fillteredArr = arr.filter((item, i) => { - - let item = true; - - }) - return fillteredArr; -}*/ - -// -let notUniqArray = [1, 1, 2, 2, 2, 5, 10, 25, 30, 5, 1, 0, 22, 3, 10, 3]; -// -console.log('task super 1-1 ---->',uniqueElements(notUniqArray)); //1,2,5,10,25,30,0,22,3, -console.log('task super 1-2 ---->',uniqueElements([1, 1, 2, 3, 3])); // 1,2,3 -//console.log('task super 1-3 ---->',uniqueElements2(notUniqArray)); //1,2,5,10,25,30,0,22,3, -//console.log('task super 1-4 ---->',uniqueElements2([1, 1, 2, 3, 3])); // 1,2,3 -/* -* -* super2 -* -* implement array method filter function -So you have to create reusable filter function, which can be applied to an array, -and callback function makes a decision to leave that variable inside an array or not -*/ - -function filter(array, callback) { - let result = []; - for (let i = 0; i < array.length; i++){ - let item = array[i]; - let decision = callback(item); - if (decision) { - result.push(decision); - }; - } - return result; -}; - -function makeDecision(item) { - if (item) { - return item; - } - return false; -}; - - -let array = [1, 10, 0, 'qwerty', null, undefined, [], {}, '', false, true, NaN, -20, ' ']; - -/*function filterArr(arr){ - let result = []; - - for (let i = 0; i < arr.length; i++) { - let item = arr[i]; - if (item === NaN || item === 0 || item === undefined || item === false || item === null || item === '' ) { - continue; - } - result.push(item); - } - return result; -};*/ - -//console.log(filterArr(array));//[1, 10, "qwerty", Array(0), {…}, true, NaN, -20, " "] -console.log(filter(array, makeDecision));//[1, 10, "qwerty", Array(0), {…}, true, -20, " "] \ No newline at end of file diff --git a/js-core/homeworks/homework-8/index.html b/js-core/homeworks/homework-8/index.html deleted file mode 100644 index f9bce3c..0000000 --- a/js-core/homeworks/homework-8/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Lesson_8 - - -

    Hello world 8

    - - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-8/main.js b/js-core/homeworks/homework-8/main.js deleted file mode 100644 index b84ba5d..0000000 --- a/js-core/homeworks/homework-8/main.js +++ /dev/null @@ -1,250 +0,0 @@ -'use strict'; - -/* - * TASK 1---------------------------------------------- - * Создайте функцию которая будет запоминать переданные - * ей аргументы, и прибавлять их в строку - * и отображать в консоле всю строку - * */ - -function solution1() { - let str = ''; - return function(value){ - return str += `${value} `; - } -} - -let stringBuffer = solution1(); - -console.log('task 1-1--->', stringBuffer('Замыкания')); // Замыкания -console.log('task 1-2--->', stringBuffer('Использовать нужно')); // Замыкания Использовать нужно -console.log('task 1-3--->', stringBuffer('Привет')); // Замыкания Использовать нужно Привет вызываем много раз - -/* - * TASK 2-------------------------------------------------- - * Напишите функцию которая принимает в качестве аргумента строку - * из скобочек и посчитайте, что все скобочки закрываются корректно - * */ -// -//если в строке нечетное количество символов, вернуть false -// -// -// -function validBraces(str) { /// тут не смогла вовремя выйти из рекурсии)) - let etalon = ['()','{}','[]']; - let iterations = str.length /2; - //console.log(iterations); - if (str.length % 2 != 0) { - return false; - - } else { - - etalon.some((item) => { - - if (str.includes(item)) { - str = str.replace(item, ''); - if (str.length == 0){ - return str; - }; - if (iterations > 1) { - validBraces(str); - }; - - } else { - return; - } - //return str; - }); - - console.log(str); - if (str.length > 0) { - return false - } else { - return true - } - - } - -} - -//console.log('task 2-1--->', validBraces('(){}[]')); // => returns true -//console.log('task 2-2--->', validBraces('(}')); // => returns false -//console.log('task 2-3--->', validBraces('[(])')); // => returns false -console.log('task 2-4--->', validBraces('([{}])')); // => returns true -//console.log('task 2-5--->', validBraces('({[]})')); // => returns true -//console.log('task 2-6--->', validBraces('({[]}')); // => returns true - -// @SUPER TASK 3 --------------------------------------------------- - -/* - * - * Напишите функцию которая будет принимать одно число и выводить сумму - * всех натуральных чисел - * sum(5) // 5+4+3+2+1 - * - * Вычисления должны кешироваться, если в функцию попадает закешированное - * значение, в консоле должно отобразиться - * Значение взято из кэша - * - * Нельзя использовать внешние значения/переменные/функции - * - * */ - -function sum(num) { - -} - -sum(5); // 15 Значение кешировано -sum(5); // 15 Значение взято из кэш - -sum(6); // 21 Кешировано -sum(6); // 21 Значение взято из кэша - - -// TASK 4------------------------------------------------------------------- -//У нас есть массив объектов: - -var users = [{ - name: "Вася", - surname: 'Иванов', - age: 20 -}, { - name: "Петя", - surname: 'Чапаев', - age: 25 -}, { - name: "Маша", - surname: 'Медведева', - age: 18 -}]; -//Обычно сортировка по нужному полю происходит так: - -// по полю name (Вася, Маша, Петя) -users.sort(function(a, b) { - return a.name > b.name ? 1 : -1; -}); - -// по полю age (Маша, Вася, Петя) -users.sort(function(a, b) { - return a.age > b.age ? 1 : -1; -}); -//Мы хотели бы упростить синтаксис до одной строки, вот так: - -users.sort(byField('name')); -users.forEach(function(user) { - //alert( user.name ); -}); // Вася, Маша, Петя - -users.sort(byField('age')); -users.forEach(function(user) { - //alert( user.name ); -}); // Маша, Вася, Петя - - -//То есть, вместо того, чтобы каждый раз писать в sort function... – будем использовать byField(...) - -//Напишите функцию byField(field), которую можно использовать в sort для сравнения объектов по полю field, чтобы пример выше заработал. -function byField(field){ //возвращает функцию, которая принимает a и b - return function(a, b) { - return a[field] > b[field] ? 1 : -1; - } - -} - -//TASK 5 -------------------------------------- -//Как в функции отличить отсутствующий аргумент от undefined? -// выведите 1, если первый аргумент есть, и 0 - если нет -function f(x) { - let arr = [...arguments]; - if (arr.length) { - return 1; - } else { - return 0; - } -} - -console.log('task 5-1--->',f(undefined)); // 1 -console.log('task 5-2--->',f()); // 0 - -//TASK6 --------------------------------------- -//Создайте функцию filter(arr, func), которая получает массив arr и возвращает новый, -//в который входят только те элементы arr, для которых func возвращает true. - -//Создайте набор «готовых фильтров»: inBetween(a,b) – «между a,b», -//inArray([...]) – "в массиве [...]". Использование должно быть таким: -//filter(arr, inBetween(3,6)) – выберет только числа от 3 до 6, -//filter(arr, inArray([1,2,3])) – выберет только элементы, совпадающие с одним из значений массива. - -function filter(arr, callback){ - let filteredArr = []; - for (let i = 0; i < arr.length; i++){ - let item = arr[i]; - let decision = callback(item);//сюда приходит function(item){ - //if (item >= start && item <= end) { - // return item; - //} - //return; - if (decision) { - filteredArr.push(item); - } - } - return filteredArr; -} - -function inBetween (start, end){ - - return function(item){ - if (item >= start && item <= end) { - return item; - } - return; - } - -} - -function inArray(arr){//[1, 2, 10] - return function(item){//0 - return arr.indexOf(item) != -1; - } -} - -var arr = [1, 2, 3, 4, 5, 6, 7]; - -console.log('task 6-1--->', filter(arr, function(a) { - return a % 2 == 0 -})); // 2,4,6 - -console.log('task 6-2--->', filter(arr, inBetween(3, 6)) ); // 3,4,5,6 - -console.log('task 6-3--->', filter(arr, inArray([1, 2, 10])) ); // 1,2 - -//TASK 7 SHOOTERS---------------------------------- -//Следующий код создает массив функций-стрелков shooters. По замыслу, каждый стрелок должен выводить свой номер: - - function makeArmy() { - - let shooters = []; - - for (let i = 0; i < 10; i++) { - - let shooter = function one() { // функция-стрелок //подсмотрела, разобралась - console.log(one.num); // выводит свой номер - }; - shooter.num = i; - - shooters.push(shooter); - } - - return shooters; -} - -var army = makeArmy();// сюда приходит массив функций shooters - console.log(army); - -army[0](); // стрелок выводит 10, а должен 0 -army[1](); // стрелок выводит 10... -army[5](); // стрелок выводит 10, а должен 0 -army[7](); // стрелок выводит 10... -// .. все стрелки выводят 10 вместо 0,1,2...9 -//Почему все стрелки́ выводят одно и то же? Поправьте код, чтобы стрелки работали как задумано. -//Предложите несколько вариантов исправления. \ No newline at end of file diff --git a/js-core/homeworks/homework-9/index.html b/js-core/homeworks/homework-9/index.html deleted file mode 100644 index 71e08e8..0000000 --- a/js-core/homeworks/homework-9/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Homework 9 - - -

    Homework 9

    - - - - \ No newline at end of file diff --git a/js-core/homeworks/homework-9/main.js b/js-core/homeworks/homework-9/main.js deleted file mode 100644 index 88a50ed..0000000 --- a/js-core/homeworks/homework-9/main.js +++ /dev/null @@ -1,284 +0,0 @@ -// TASK 1----------------------------------------------------- -//Отобразите достаточно ли у developers навыков ? -// Отобразите всех разработчиков и вызовете у каждого -// разработчика метод goodDev -- -/* - * Количество требований к разработчику совпадает с его навыками. - * Используйте в задаче this - * */ - -let developer1 = { - skills: ['JavaScript', 'linux', 'html', 'OOP', 'Node.js'], - requirements: ['Node.js', 'JavaScript', 'OOP', 'mongo'], - goodDev: goodDev -}; -let developer2 = { - experience: [ - { technology: 'java' }, - { technology: 'c++' }, - { technology: 'aws' }, - { technology: 'docker' } - ], - requirements: ['java', 'json', 'c++', 'JavaScript'], - goodDev: goodDev -}; - -//иду по массиву требований, беру каждый элемент массива -//и смотрю в массив скилов - есть ли там такой скилл? -//Если есть - возвращаю саксесс -//если нет - фейл - -function goodDev(dev) { - //console.log(this); - let skills = this.skills || this.experience; - - this.requirements.forEach((requireItem) => { - let isConsist = skills.some((skillItem) => { - if (typeof skillItem === 'object') { - skillItem = skillItem.technology; - } - return requireItem == skillItem;//false or true - }) - // res = isConsist ? `required: ${requireItem} ...success` : `required: ${requireItem} ...fail` - - if (isConsist) { - console.log(`required: ${requireItem} ...success`);// как сделать без консоль лога, а с ретерном? - } else { - console.log(`required: ${requireItem} ...fail`); - } - - }) - -} - -// developer 1 -// required: Node.js ... success -// required: JavaScript ... success -// required: OOP ... success -// --- - -// developer 2 -// required: json ... fail -// required: JavaScript ... success -// required: Java ... success -// required: OOP ... success - -//goodDev(developer1); -//goodDev(developer2); - -developer1.goodDev(); -developer2.goodDev(); - -/* - * TASK 2---------------------------------------- - * - * Напишите функцию принимает 1 аргумент сортирует объект по - * переданному значению (например age или name) - * - * При вызове функции используйте this - * */ - -let myObject = { - database: [ - { - age: 100, - name: 'b' - }, - { - age: 15, - name: 'c' - }, - { - age: 25, - name: 'a' - } - ] - -}; -//тут не понятно, в консоли выводит 2 раза одинаково отсортированные массивы по name, -//хотя если смотреть в дебаггере, то все происходит верно -//и в консоль выводятся 2 разных правильно отсортированных массива -myObject.myFilter = function(param) { - - let sortedArr = this.database.sort(compare); - - function compare(a, b){ - if (isNaN(a[param])) { - - if (a[param] > b[param]) { - return 1; - }; - if (a[param] < b[param]) { - return -1; - }; - if (a[param] == b[param]) { - return 0; - } - - } else { - return (a[param] - b[param]); - } - - } - - return sortedArr; -}; - - -// {age:15, name:'c'}, {age:25, name:'a'} {age:100, name:'b'} -console.log('sort by age', myObject.myFilter('age')); - -// {age:25, name:a}, {age:100, name: b} ... -console.log('sort by name', myObject.myFilter('name')); - -/* - * TASK 3---------------------------------------------------------- - * - * Перепишите homework 5 с использованием методов массивов и - * => arrow functions - * -*/ - -/*TASK 1 - 1. Переместите 0 в конец массива, остальные числа должны остаться - неизменными - // concat - example: - [1,false,2,0,3,null,0,4,0,25] => [1, false, 2, 3, null, 4, 25, 0, 0, 0] - [ 'a', 0, 0, 'b', null, 'c', 'd', 0, 1, false, 0, 1, 0, 3, [], 0, 1, 9, 0, 0, {}, 0, 0, 9 ] => ["a","b",null,"c","d",1,false,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0] - [ 0, 1, null, 2, false, 1, 0 ] => [1,null,2,false,1,0,0] - */ - -let arr1 = [1, false, 2, 0, 3, null, 0, 4, 0, 25]; -let arr2 = [ - 'a', - 0, - 0, - 'b', - null, - 'c', - 'd', - 0, - 1, - false, - 0, - 1, - 0, - 3, - [], - 0, - 1, - 9, - 0, - 0, - {}, - 0, - 0, - 9 -]; - -function moveZeroToEnd(arr) { - let zeroArray = []; - let numberArray = []; - - arr.forEach((item) => { - if (item === 0) { - zeroArray.push(item); - return;//переход на следующую итерацию - } - numberArray.push(item); - - }) - return numberArray.concat(zeroArray); -} -console.log('task 1-1 --->', moveZeroToEnd(arr1)); -console.log('task 1-2 --->', moveZeroToEnd(arr2)); - -/*TASK 2 - 2. Верните сумму двух найменьших чисел в массиве - [10,20,30,1,31,11,10] => 11 - [-1,0,25] => -1 - [-4,-10,25,10] => -14 - [0,200,10,25,15] => 10 - */ -let a = [10,20,30,1,31,11,10]; -let b = [-1,0,25]; -let c = [-4,-10,25,10]; -let d = [0,200,10,25,15]; - -function minimalNumber(arr) { - let sum; - - let newArr = arr.sort((a, b) => { - return (a - b); - }); - - sum = newArr[0] + newArr[1]; - return sum; -} - -console.log('task 2-1 --->', minimalNumber(a)); -console.log('task 2-2 --->', minimalNumber(b)); -console.log('task 2-3 --->', minimalNumber(c)); -console.log('task 2-4 --->', minimalNumber(d)); - - -/*TASK 3 - ТУТ ВРОДЕ БЫ НЕЧЕГО ПЕРЕПИСЫВАТЬ С МЕТОДАМИ МАССИВА И СТРЕЛОЧНЫМИ ФУНКЦИЯМИ - 3. Напишите функцию которая меняет местами имя и фамилию */ - let e = 'john McClane'; //=> "McClane john" - let f ='Arnold Schwarzenegger'; //=> "Schwarzenegger Arnold" - let g = 'James Bond'; //=> "Bond James" - -function nameShuffler(str) { - - let arr = str.split(' '); - arr = arr.reverse(); - let res = ''; - res = arr.join(' '); - return res; -} - -console.log('task 3-1 --->', nameShuffler(e)); -console.log('task 3-2 --->', nameShuffler(f)); -console.log('task 3-3 --->', nameShuffler(g)); - -/* - // TASK 4 - 4. Напишите функцию которая принимает массив с именами и возвращает массив - в котором каждая буква становится заглавной - capMe(['jo', 'nelson', 'jurie']) // returns ['Jo', 'Nelson', 'Jurie'] - capMe(['KARLY', 'DANIEL', 'KELSEY']) // returns ['Karly', 'Daniel', 'Kelsey'] - */ - -/*function capMe(arr) { - - for (let i = 0; i < arr.length; i++) { - let element = arr[i]; - element = element.toLowerCase(); - elementArr = element.split(''); - - let newElement = toUpper(elementArr); - arr.splice(i, 1, newElement); - } - - return arr; -} - -function toUpper(arr){ - let firstLetter = arr[0].toUpperCase(); - arr.splice(0, 1, firstLetter); - let res = arr.join(''); - return res; -}*/ - -function capMe(arr) { - let capitalized = arr.map((item) => { - let loweredItem = item.toLowerCase(); - let firstLetter = loweredItem[0].toUpperCase(); - return firstLetter + loweredItem.slice(1); - }) - return capitalized; -} - -console.log('task 4-1 --->', capMe(['jo', 'nelson', 'jurie'])) // returns ['Jo', 'Nelson', 'Jurie'] -console.log('task 4-2 --->', capMe(['KARLY', 'DANIEL', 'KELSEY'])) // returns ['Karly', 'Daniel', 'Kelsey'] From 7ea8c7a94a5b2b2e43b9c2baa0a96f596642426d Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sat, 21 Jul 2018 16:58:22 +0300 Subject: [PATCH 06/19] homeworks & classworks folders were returned --- js-core/classworks/classwork-10/index.html | 12 + js-core/classworks/classwork-10/main.js | 264 ++++++++++++ js-core/classworks/classwork-11/index.html | 12 + js-core/classworks/classwork-11/main.js | 341 +++++++++++++++ js-core/classworks/classwork-12/index.html | 12 + js-core/classworks/classwork-12/main.js | 265 ++++++++++++ js-core/classworks/classwork-13/index.html | 12 + js-core/classworks/classwork-13/main.js | 283 +++++++++++++ js-core/classworks/classwork-6/index.html | 11 + js-core/classworks/classwork-6/src/main.js | 459 +++++++++++++++++++++ js-core/classworks/classwork-6/src/s.js | 2 + js-core/classworks/classwork-8/index.html | 12 + js-core/classworks/classwork-8/main.js | 277 +++++++++++++ js-core/classworks/classwork-9/index.html | 12 + js-core/classworks/classwork-9/main.js | 123 ++++++ js-core/homeworks/homework-10/index.html | 12 + js-core/homeworks/homework-10/main.js | 139 +++++++ js-core/homeworks/homework-11/index.html | 12 + js-core/homeworks/homework-11/main.js | 71 ++++ js-core/homeworks/homework-12/index.html | 12 + js-core/homeworks/homework-12/main.js | 169 ++++++++ js-core/homeworks/homework-13/index.html | 12 + js-core/homeworks/homework-13/main.js | 191 +++++++++ js-core/homeworks/homework-2/index.html | 11 + js-core/homeworks/homework-2/src/main.js | 75 ++++ js-core/homeworks/homework-4/index.html | 11 + js-core/homeworks/homework-4/src/main.js | 188 +++++++++ js-core/homeworks/homework-5/index.html | 11 + js-core/homeworks/homework-5/src/main.js | 159 +++++++ js-core/homeworks/homework-6/index.html | 11 + js-core/homeworks/homework-6/src/main.js | 338 +++++++++++++++ js-core/homeworks/homework-8/index.html | 12 + js-core/homeworks/homework-8/main.js | 250 +++++++++++ js-core/homeworks/homework-9/index.html | 12 + js-core/homeworks/homework-9/main.js | 284 +++++++++++++ 35 files changed, 4077 insertions(+) create mode 100644 js-core/classworks/classwork-10/index.html create mode 100644 js-core/classworks/classwork-10/main.js create mode 100644 js-core/classworks/classwork-11/index.html create mode 100644 js-core/classworks/classwork-11/main.js create mode 100644 js-core/classworks/classwork-12/index.html create mode 100644 js-core/classworks/classwork-12/main.js create mode 100644 js-core/classworks/classwork-13/index.html create mode 100644 js-core/classworks/classwork-13/main.js create mode 100644 js-core/classworks/classwork-6/index.html create mode 100644 js-core/classworks/classwork-6/src/main.js create mode 100644 js-core/classworks/classwork-6/src/s.js create mode 100644 js-core/classworks/classwork-8/index.html create mode 100644 js-core/classworks/classwork-8/main.js create mode 100644 js-core/classworks/classwork-9/index.html create mode 100644 js-core/classworks/classwork-9/main.js create mode 100644 js-core/homeworks/homework-10/index.html create mode 100644 js-core/homeworks/homework-10/main.js create mode 100644 js-core/homeworks/homework-11/index.html create mode 100644 js-core/homeworks/homework-11/main.js create mode 100644 js-core/homeworks/homework-12/index.html create mode 100644 js-core/homeworks/homework-12/main.js create mode 100644 js-core/homeworks/homework-13/index.html create mode 100644 js-core/homeworks/homework-13/main.js create mode 100644 js-core/homeworks/homework-2/index.html create mode 100644 js-core/homeworks/homework-2/src/main.js create mode 100644 js-core/homeworks/homework-4/index.html create mode 100644 js-core/homeworks/homework-4/src/main.js create mode 100644 js-core/homeworks/homework-5/index.html create mode 100644 js-core/homeworks/homework-5/src/main.js create mode 100644 js-core/homeworks/homework-6/index.html create mode 100644 js-core/homeworks/homework-6/src/main.js create mode 100644 js-core/homeworks/homework-8/index.html create mode 100644 js-core/homeworks/homework-8/main.js create mode 100644 js-core/homeworks/homework-9/index.html create mode 100644 js-core/homeworks/homework-9/main.js diff --git a/js-core/classworks/classwork-10/index.html b/js-core/classworks/classwork-10/index.html new file mode 100644 index 0000000..fce2e31 --- /dev/null +++ b/js-core/classworks/classwork-10/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_10 + + +

    Hello world 10

    + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-10/main.js b/js-core/classworks/classwork-10/main.js new file mode 100644 index 0000000..7d3e1e2 --- /dev/null +++ b/js-core/classworks/classwork-10/main.js @@ -0,0 +1,264 @@ +//THIS---------------------------------------------- +//1. Внутри ф-ции this устанавливается как глобальный объект(Window), а при 'use strict' - в undefined +//2. При вызове как метода объекта, this ссылается на данный объект(выбирает объект до точки) +//3. bind, call, apply устанавливают контекст this принудительно, но bind только устанавливает контекст, +//а call и apply сразу же и вызывают функцию +//4. при создании экземпляра через new, this станет ссылаться на вновь созданный объект +//call, apply, bind есть у всех функций, это встроенные методы + +//--пример для "выбирает объект до точки"----------------------- + +const obj = { + //----------- + a: { + showThis(){ + console.log(this);//this ссылается на a + //------------- + (function show(){ + console.log(this);//this ссылается на window или на undefined при 'use srtict' + })(); + + } + }, + //---------- + showThis(){ + console.log(this);//this ссылается на obj + } +} + +obj.a.showThis(); +obj.showThis(); + + +//---call, apply, bind--------------------------------------------- + +var bar = 'global'; + +function foo(a, b, c) { + console.log(a, b, c); + console.log(this.bar);//вернет global, потому что this ссылается на window, + // а у window есть переменная bar +} + +var obj1 = { + bar: 'это мой контекст', + foo: foo //ф-ция foo, объявленная выше, которая консолит this.bar. В данном случае + // this - это уже obj1, и значение this.bar - это 'это мой контекст' +}; + +var obj2 = { + bar: 'Привет объект 2' +}; + +foo(); // global +obj1.foo(); // obj1.bar - это мой контекст + +foo.call(obj2); //Тут говорим: функция foo, позвони в объект obj2. + // Функция сделает вызов и в качестве конекста установит то, что было передано + // первым аргументом (obj2). Вернет 'Привет объект 2' + //call может кроме контекста принимать неограниченное кол-во аргументов + +foo.apply(obj2); //Тут говорим: функция foo, применись к obj2. + // Функция сделает вызов и в качестве конекста установит то, что было передано + // первым аргументом (obj2). Вернет 'Привет объект 2' + +foo.call(obj2, 1, 2, 3); // вернет 1, 2, 3 и 'Привет объект 2' +foo.apply(obj2, [10, 20]); //вернет 1, 2, undefined и 'Привет объект 2'. Т.е. берет данные + // из массива и подставляет их туда, где они запрашиваются + +// Отличие call от apply в том, что в call кроме может передаваться много аргументов, +// а в apply - кроме контекста передается один аргумент в виде массива + +var www = foo.bind(obj2);//прибинди к foo этот объект obj2. В www попадает новая функция + // с привязанным контекстом, но не вызывается. Можем вызвать когда-нибудь потом +www(); // 'Привет объект 2' +//Можно прям передать новый объект : + var wwww = foo.bind({bar: 'qwe qwe qwe'}); + wwww(); //'qwe qwe qwe' + +//----- NEW and function-constructor----------------------------------------------------- + +function User(name){ + /*var obj = {} ---> this*/ //когда вызываем конструктор через new, тут неявно создается объект, приравнивается к this + this.name = name; + + /*return obj*/// - и в конце по умолчанию вернет объект + //но можно из конструктора вернуть что-то явно, например, так: + + //return { + // name: 'something', + //} + + //и тогда this не работает + //если тут указать примитив, то при вызове new он будет утерян: + + //return 10; - значение примитива, возвращенное из конструктора, будет утеряно при вызове через new +} + +let userOleh = new User('Oleh'); +console.log(userOleh); + + +//------------------------------------------------------------------- +const cafe = { + name: 'Мир средиземья', + fruits: ['apple', 'orange', 'dfgghs'], + partners: [ + { + name: 'Frodo', + fruits: ['хлебцы', 'капуста'] + }, + { + name: 'Боромир', + fruits: ['яблоки', 'киви'] + }, + { + name: 'Гендальф', + fruits: ['манго', 'банан'] + } + ], + + showFruits() { //метод, который показывает фрукты + console.log(this.fruits); + }, + + showPartnersFruits() { + let method = this.showFruits; //нужно в эту функцию получить метод showFruits, с которого можно позвонить + //звонить может только функция. Получаем сюда метод showFruits + console.log(this);// объект cafe + + this.partners.forEach((item) => { //и для каждого объекта-партнера вызываем метод showFruits + method.call(item); // возьми method и позвони с него в текущий объект, т.е. в item + //Это значит вызови метод method, он же this.showFruits, для каждого объекта + //this.showFruits.call(item);// можно и так написать, без получения переменной method + + //Здесь если была бы не стрелочная функция, а обычная, то контекст бы потерляся. Раньше были решения такие: + // showPartnersFruits() { + // var self = this; // в self записали контекст cafe, т.е self теперь ссылается на cafe + // this.partners.forEach(function(item){ //this тоже ссылается на cafe + // self.showFruits.call(item); //если бы здесь оставили this вместо self, то this стал бы ссылаться + //на window, а не на cafe. А так self продолжает ссылатся на cafe и все ок + // }) + // } + + //ИЛИ!!! forEach кроме функции, вторым аргументом может принимать контекст, т.е. this + // showPartnersFruits() { + // this.partners.forEach(function(item){ + // self.showFruits.call(item); + // }, this) //так тоже все сработает + // } + + + }) + } + +} +//добавьте метод, который будет в консоли отображать фрукты + +cafe.showFruits(); +cafe.showPartnersFruits();//Отобразите фрукты партнеров Мира, используя метод showFruits +// внутри showPartnersFruits + +//ARROW FUNCTIONS------------------------------------------------- + //У стрелочных функций есть ряд ограничений + //1. У них нет arguments: + const qqq = (a,b) => { + console.log(arguments)//error: arguments is not defined + } + //qqq(); + //но если закинуть туда деструкцию, то все сработает: + const qqq2 = (...args) => { + console.log(args)//[1,2,3,4,8] + } + qqq2(1,2,3,4,8); + + +//---------2 PART---__PROTO__------------------------------------------------------- + +var car = { + wheel: 4 +}; + +var mustang = { + door: '2/3/4' +} +mustang.wheel = 4;//добавили в объект мустанг 4 колеса + +mustang.__proto__ = car;//в __proto__ мустанга записали объект car + //теперь у мутсанга есть door: '2/3/4' и wheel: 4, и в __proto__ опять есть wheel: 4 + +car.color = 'red';//в объект car дописали свойство color: 'red', и теперь это свойство отобразится и в __proto__ мустанга + //т.е. можем обратиться mustang.color и получим red + +delete mustang.wheel//удалили собственное свойство мустанга wheel: 4, но в __proto__ осталось wheel: 4 от саr +mustang.wheel// все равно получим 4 + +mustang.color = 'green';//так мы добавим цвет самому объекту мустанг, в его прото останется красный цвет от кар + +var someMethod = { //создаем какой-то метод - тут только через объект, напрямую через ф-цию не прокатывает + toDo(){ //это если хотим добавить его кому-то в прото, тогда только через объект + console.log(this.color); + } +} + +car.__proto__ = someMethod;//и записываем его в прото car-у + +console.log(mustang);//у мустанга в __proto__.__proto__ запишется метод toDo +mustang.toDo();//green + +car.makeBeeeeep = function(){ //можем в car добавить функцию, и все равно она будет доступна из мустанга + console.log('beep'); +} +mustang.makeBeeeeep();//beep + +//------------------------------------------------------------------------ + +//Задача - coздаем 30 студентов и всем им добавляем одного и того же учителя +// у студентов поменялся учитель. Как быстро изменить имя учителя у всех студентов? + +const teacher = { + teacherName: 'Alla I' +} + +const halava = function(){ + console.log('Халява, приди!'); +} + +function createStudent(str, fn){//ф-ция, которая создает студента + const student = {}; + student.__proto__ = teacher;//каждому в прото добавили учителя + student.name = str; + student.someMagic = fn; //если бы прямо здесь написали метод, то каждому студенту + // создали бы по одинаковому методу, т.е. 30 одинаковых методов, это плохо + // А так мы 1 раз создали функцию и каждому студенту просто добавили ссылку на эту ф-цию + + return student; +} + +const students = []; + +for (let i = 0; i < 30; i++) { //создаем объект студент и каждому из них ставим разное имя student 1, 2,3... + const newStudent = createStudent(`student ${i + 1}`, halava); + students.push(newStudent); +} + +//students.forEach((item) => { //каждому студенту в __proto__ добавляем teacher Alla I +// item.__proto__ = teacher; +//}) // это сделали сразу в 229 строке + +console.log(students[0].teacherName);//'Alla I' +teacher.teacherName = 'Boris P'; //потом меняем имя учителя и теперь у всех студентов новый учитель Boris P в __proto__ + +console.log(students); +console.log(students[0].teacherName);//'Boris P' + +//-----ВНИМАНИЕ! Если запишем по-другому:---------- + +console.log(students);//'Vera P' и тут, и ниже у всех студентов в прото будет Vera P +teacher.teacherName = 'Vera P'; +console.log(students);//'Vera P + +//так происходит потому, что каждый student в массиве students - это ссылка, и ссылка у нас перезаписалась на Vera P. +//А в 249 и 253 строках мы запрашиваем значение, а значение передается не по ссылке, оно просто вернулось и все + + diff --git a/js-core/classworks/classwork-11/index.html b/js-core/classworks/classwork-11/index.html new file mode 100644 index 0000000..235bbc6 --- /dev/null +++ b/js-core/classworks/classwork-11/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_11 + + +

    Classwork 11

    + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-11/main.js b/js-core/classworks/classwork-11/main.js new file mode 100644 index 0000000..f1a5cf6 --- /dev/null +++ b/js-core/classworks/classwork-11/main.js @@ -0,0 +1,341 @@ +//ООП придумано для разбиения больших задач на маленькие кусочки, которые решают отдельные задачи +// Функции-конструкторы принято называть с большой буквы + + +function Database(databaseName){ + /*var obj = {} ---> this*/ //когда вызываем конструктор через new, тут неявно создается объект, приравнивается к this + this.databaseName = databaseName; + + /*return obj*/// - и в конце по умолчанию вернет объект + //но можно из конструктора вернуть что-то явно, например, так: + + //return { + // name: 'something', + //} + + //и тогда this не работает + //если тут указать примитив, то при вызове new он будет утерян: + + //return 10; - значение примитива, возвращенное из конструктора, будет утеряно при вызове через new +} + +var mySQL = new Database('MySQL');//здесь превратили Database в объект и положили в переменную mySQL +//т.е. выглядит это примерно так: +// var mySQL = { +// databaseName: 'MySQL' +// } +console.log(mySQL); + +//-------------------------------- +/*Создать конструктор, который будет создавать новый объект + +myArray = параметр 1 : Array +cars = параметр 2 : Object +name = параметр 3 : string*/ + +function createObject(arg1, arg2, arg3){ //по умолчанию вернет объект, если мы явно ему ничего не указываем заретернить + + let x = 'privet kak dela'; + + this.myArray = arg1, // this ссылается на этот объект, который создается в момент вызова new + this.cars = arg2, + this.name = arg3 + +} + +let newObj = new createObject([], {}, ''); +console.log(newObj); //createObject {cars: {}, myArray: [], name: ""} в консоли еще пишет название конструктора + +//--------------------------------------------------------------------- +//Если присвоить переменной z функцию конструктор без new, т.е. без вызова ее: + +var z = createObject('qq', 'ww', 'ee'); + +//то this ссылается на Window, и в Window появились переменные myArray='qq', cars = 'ww', name = 'ee' + +//Но если вызвать через new: +var z = new createObject('qq', 'ww', 'ee'); + +//то внутри неявно создастся объект, объект приравняется this и в конце этот объект возвращвется + +//------------------------------------------------------- +//Если в конструкторе создать переменную let x = 'privet kak dela', и потом сделать так: + +var s = new createObject('a', 'b', 'c'); +console.log('s',s); //то x пропадет, ее заберет сборщик мусора +//Что происходит? При запуске конструктора через new инициализируется икс +//(может он будет использоваться где-то ниже в конструкторе), потом возвращается объект, +//а так как икс нигде не используется, он пропадет, его заберет сборщик мусора + +//z и s хранят ссылки на объекты, созданные конструктором. Еще называют экземпляром функции-конструктора //instance + +function Car(color, model){ //конвеер нераскрашенных машин + this.color = color, + this.model = model + //this.wheels = 4 +} + +const audi = new Car('white', 'audi'); +const minicooper = new Car('red', 'minicooper'); +console.log(audi, minicooper); +//создаются 2 экземпляра конструктора - audi и minicooper, разных цветов и моделей. +//Если теперь в конструктор добавить this.wheels = 4, то колеса появятся у обоих созданных экземпляров + +//------------------------------------------------- +//Создать ф-цию конструктор, которая в зависимости от количества параметров +//будет создавать объект с количеством свойств, равным количеству аргументов + +function createObject2(arg1, arg2, arg3){ + if (arg1 !== undefined) { //или if ( arg1 ) {} типа если нет аргумента, то вообще не нужно создавать свойство + this.arg1 = arg1; + } + if (arg2 !== undefined) { + this.arg2 = arg2; + } + if (arg3 !== undefined) { + this.arg3 = arg3; + } +} + +let newObj2 = new createObject2(1, 2, 3); +let newObj3 = new createObject2(1, 2); + +console.log(newObj2); +console.log(newObj3); + +//Если мы хотим передать в функцию много аргументов (хотя их больше трех, то это уже плохо), то делают так: + +function createObject3(options){ //сюда один параметр options, он прийдет в виде объекта + // а тут + let {arg1, arg2, arg3} = options; //здесь в фигурные скобки дописываем только те аргументы из options, которые нам нужны + console.log(options);//тут будут все переданные при вызове аргументы, однако в строке выше //{myArray: "a", name: "b", type: "c"} + //можем из options взять только те, которые мне будут нужны + + if (arg1 !== undefined) { //или if ( arg1 ) {} типа если нет аргумента, то вообще не нужно создавать свойство + this.arg1 = arg1; + } + if (arg2 !== undefined) { + this.arg2 = arg2; + } + if (arg3 !== undefined) { + this.arg3 = arg3; + } + +} + +let newObj6 = new createObject3({myArray: 'a', name: 'b', type: 'c'}); + +console.log('newObj6', newObj6); + +//------------------------------------------------- +//Создать ф-цию конструктор, которая будет иметь приватный счетчик, +//данный счетчик можно будет увеличивать только вызвав метод counter() +//НОВЫЙ СПОСОБ ДЕЛАТЬ ЗАМЫКАНИЯ, СИЛЬНО УДОБНЕЕ + +function CreateObject4(){ + let counter = 0; // + this.counter = function(){ + return counter++; + } +} + +/*return { //а раньше мы делали так + counter(){ + console.log(counter++) ; + } +}*/ + +let newObj4 = new CreateObject4(); +console.log(newObj4); //в консоли покажет новый экземпляр объекта, + //у которого в Scopes будет Closure, а в нем counter = 0!!! + //создав новый экземпляр, создадим еще один новый счетчик +console.log(newObj4.counter()); +console.log(newObj4.counter()); +console.log(newObj4.counter()); +console.log(newObj4.counter()); + +//-------------------------------------------------------------------- +//ПАРАДИГМА ООП (парадигма - ряд убеждений, ряд законов) +//-прототипное программирование. Прототип - объект-образец, по образу и подобию которого создаются другие объекты +//-объекты-копии могут сохранять связь с родительским объектом, автоматически наследуя изменения в прототипе +//-каждый объект может стать прототипом(__proto__) + +function Database2(databaseName){ //1 - есть ф-ция конструктор + this.databaseName = databaseName; +} +//V - методы прямо в конструкторах писать плохо, их пишут в прототипах. Так происходит правильное наследование через Object.create +//Если записать метод прямо в конструкторе, а не в прототипе, то если мы потом захотим что-то изменить в методе, то оно +//не изменится для всех уже созданных экземпляров, а поменяется только в конструкторе и будет уже новое для только экземпляров, +//созданных после того, как поменяли метод в конструкторе + +//Прототип принято считать публичным, его могут все наследовать + +Database2.prototype.registerUser = function registerUser(name, password){//2 - есть прототип функции Database2 + //const newUser = new User(name, password);//это абстрактная вещь, просто показано, что + //внутри одного конструктора можно вызывать другие конструкторы + this.user = {name, password} + + //this.user = { // или так + // name: name, + // password: password + //} +} +var mySQL1 = new Database2('MySQL1');//тут в консоли будет ф-ция конструктор +console.log('mySQL--1', mySQL1);//то, что было в prototype функции конструктора, + //в момент создания нового экземпляра присвоилось(передалась ссылка) новому экземпляру в _proto_ + //т.е. здесь в _proto_ можем видеть ф-цию registerUser + +Database2.prototype = { // прототайп, а теперь равняйся объекту + // с этого момента у всех экземпляров, которые будут созданы с этого момента, + // в прото будет свойство table: "MAIN" и не будет конструктора, + // однако это не повлияет на все созданные ранее экземпляры, там все останется по-прежнему + // т.е. здесь мы говорим прототипу, чтобы он потерял свою предыдущую ссылку + // но так мы перезатрем конструктор, и так лучше не делать + table: "MAIN", + registerUser() { + console.log(this.databaseName) + } +} +console.log('mySQL--1', mySQL1);//ничего не изменилось, mySQL1 продолжает хранить ссылку на тот прототип конструктора, + //который был в момент создания mySQL1 + +var mySQL2 = new Database2('MySQL2'); +console.log('mySQL--2', mySQL2);//а тут в консоли не будет ф-ции конструктора, мы ее перезатрем +console.log(mySQL2.table) //"MAIN"; + +var mongodb = new Database2('mongodb'); //теперь создаем третий экземпляр +console.log('mongodb.table',mongodb.table) //MAIN" +console.log('mySQL2.table', mySQL2.table) //"MAIN" + +//Сейчас в mySQL2.__proto__.table лежит "MAIN". Делаем так: +mySQL2.__proto__.table = 'QWERTY-YAHOO'; + +console.log('mySQL1.table', mySQL1.table); //undefined, там вообще не было изначально table +console.log('mySQL2.table', mySQL2.table); //QWERTY-YAHOO +console.log('mongodb.table', mongodb.table);//QWERTY-YAHOO + // потому что и mySQL2, и mongodb ссылаются на один прототип, и мы его поменяли чуть выше + +//ОТЛИЧИЕ prototype и __proto__: +//prototype используем для функции-конструктора +// __proto__ используем для объекта + +//V - если создаем экземпляр класса и ему что-то добавляем, то это никак не отражается на других экземплярах +//V - если же из экземпляра поменять прототип, тогда это отразится на других экземплярах +//V - из прототипа можем добавлять свойства конструктору и переопределять методы конструктора(через this) +//V - при обращении к чему -то в экземпляре через this сначала это поищется в главном конструкторе, если там нет - +//полезет искать в прототип, и если и там нет, то будет искать в глобальном объекте, пока не нейдет искомое или null + +//-------------------------------------------------------------- +//сделайте функцию конструктор которая наз Transport и будет принимать 3 аргумента: +//color, name, doors +//и создайте себе машину той марки, которую вы желаете на зарплату миддла + +//добавьте метод beep всем машинам, при вызове метода отобразить в консоли желаемый сигнал + +function Transport(color, name, doors){ + this.color = color; + this.name = name; + this.doors = doors; + this.wheels = 4 +} + +Transport.prototype.beep = function(){ + console.log('beep'); +} + +/*Transport.prototype.wheels = {//лучше добавлять прямо в конструктор, т.к. это не логика + wheels: 4, +}*/ + +let toyota = new Transport ('red', 'toyota', '3'); //и toyota, и bmw хранят ссылку на Transport +let bmw = new Transport ('green', 'bmw', '5'); + +console.log(toyota, toyota.beep()); +console.log(bmw, bmw.beep()); + +//Создайте еще одну ф-конструктор Bus +//ф-ция конструктора будет наследоваться от Transport +//и добавлять стоимость проезда новому экземпляру + +function Bus(){ +} + +//Bus.prototype = new Transport('white', 'laz', 8);//наследуемся из Transport; +// в этот момент создался новый экземпляр, он лег в prototype, и у экземпляра в прото уже лежит метод beep + +//но правильно наследование делать так: +Bus.prototype = Object.create(Transport.prototype)// если так делать, то конструктор Transport не будет вызван, + // а prototype от Transport(т.е. метод beep) присвоятся + +Bus.prototype.getPrice = function(){ //если это написать выше, чем наследование, то не сработает, т.к + // наследование перезатрет prototype + console.log('3hrv'); +} + +var bus = new Bus(); //Если наследоваться как Bus.prototype = new Transport(...), то у bus прям в нем лежит + //метод getPrice и все свойства из конструктора - color, name, doors, wheels, т.к. + //конструктор был вызван; и метод beep лежит в прото + + //А если наследоваться правильно через Object.create(Transport.prototype) и передавать в него прототип + //от которого нужно наследоваться, то у bus будет только метод getPrice и никаких свойств, и в прото + //будет лежать метод beep и сам конструктор Transport + + //Если нужно унаследовать все, и свойства из конструктора, то пишут еще по-другому: + + //function Bus(){ + // Transport.apply(this, arguments); + //} + +console.log('bus--->', bus) + +bus.beep(); +bus.getPrice(); + + + + +//---РЕЗЮМЕ----------------------------------------------------------------------- + +function Database3(databaseName){ + this.databaseName = databaseName; +} + +Database3.prototype.registerUser = function registerUser(name, password){ + this.user = { + name: name, + password: password + } +} + +var a = new Database3('a'); +console.log('a', a); + +Database3.prototype = { //с этого момента у всех экземпляров, которые будут созданы с этого момента, + // в прото будет свойство table: "MAIN" и не будет конструктора, + // однако это не повлияет на все созданные ранее экземпляры, там все останется по-прежнему + //т.е. здесь мы говорим прототипу, чтобы он потерял свою предыдущую ссылку + + table: "MAIN", + registerUser() { + console.log(this.databaseName); + } +} + +console.log('a', a); // тут в прото все еще нет свойства table: "MAIN", т.к. а создан раньше, + // чем поменялось прото у конструктора + +var b = new Database3('b'); +console.log('b', b); // а тут в прото уже есть свойство table: "MAIN" и нет конструктора, он затерся + +var c = new Database3('c'); +console.log('c', c); // и тут то же самое, в прото уже есть свойство table: "MAIN" и нет конструктора, он затерся + //т.е. b и c сейчас одинаковые + +//теперь если сделать так: +b.__proto__.table = 'QWERTY-YAHOO';// здесь перезаписываем ссылку на table + +console.log('a', a);// то на а это никак не повлияет, потому что он создан еще до перезаписи прототипа у конструктора + // и он хранит предыдущую ссылку прототипа конструктора +console.log('b', b);// а в b в прото перезапишется table на 'QWERTY-YAHOO' +console.log('c', c);// и в с в прото перезапишется table на 'QWERTY-YAHOO' + // потому что и а, и b ссылаются на один прототип \ No newline at end of file diff --git a/js-core/classworks/classwork-12/index.html b/js-core/classworks/classwork-12/index.html new file mode 100644 index 0000000..ed912dd --- /dev/null +++ b/js-core/classworks/classwork-12/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_12 + + +

    Classwork 12

    + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-12/main.js b/js-core/classworks/classwork-12/main.js new file mode 100644 index 0000000..010d639 --- /dev/null +++ b/js-core/classworks/classwork-12/main.js @@ -0,0 +1,265 @@ +//REVIEW HOMEWORK 11--------------------------- +/* + * + * Сделайте 4 объекта - не усложняйте, просто наследование + * через __proto__ + + - Пользователь + - Верифицированный пользователь(админ) + - Гость + - База данных + + - База хранит информацию о пользователях // + - Пользователи знают мыло админа // + - админ знает пароль от базы данных + - Гости могут зарегистрироваться в базе данных // + * + * */ + +const user = {}; + +const admin = { + email: 'admin@admin.com', +}; + +const guest = {}; + +const database = { + users: [], + password: 'secret_password', + register() { + console.log('YOU ARE IN') + } +}; + + guest.__proto__ = user; + user.__proto__ = admin; + admin.__proto__ = database; + +console.log('guest', guest); +console.log('user', user); +console.log('database', database); +guest.register(); + +//---ЕЩЕ РАЗ ПРО НАСЛЕДОВАНИЕ---------------------------------- +var car = { + wheel: 4 +}; + +var mustang = { + door: '2/3/4' +} +mustang.wheel = 4;//добавили в объект мустанг 4 колеса + +mustang.__proto__ = car;//в __proto__ мустанга записали объект car + //теперь у мутсанга есть door: '2/3/4' и wheel: 4, и в __proto__ опять есть wheel: 4 + +car.color = 'red';//в объект car дописали свойство color: 'red', и теперь это свойство отобразится и в __proto__ мустанга + //т.е. можем обратиться mustang.color и получим red + +delete mustang.wheel//удалили собственное свойство мустанга wheel: 4, но в __proto__ осталось wheel: 4 от саr +mustang.wheel// все равно получим 4 + +mustang.color = 'green';//так мы добавим цвет самому объекту мустанг, в его прото останется красный цвет от кар + +var someMethod = { //создаем какой-то метод - тут только через объект, напрямую через ф-цию не прокатывает + toDo(){ //это если хотим добавить его кому-то в прото, тогда только через объект + console.log(this.color); + } +} + +car.__proto__ = someMethod;//и записываем его в прото car-у + +console.log(mustang);//у мустанга в __proto__.__proto__ запишется метод toDo +mustang.toDo();//green + +car.makeBeeeeep = function(){ //можем в car добавить функцию, и все равно она будет доступна из мустанга + console.log('beep'); +} +mustang.makeBeeeeep();//beep + + +//--НАСЛЕДОВАНИЕ-------------------------------------------------- + +//Наследование -это когда дочерний класс(экземпляр) наследует методы или свойства родительского класса + +//Сделайте человека, который может -> drink coffe + +//Сделайте программиста -> умеет делать createHelloWorld + +//Сделайте Васю сначала человеком +//А потом научите васю вызывать метод createHelloWorld + +function Human(name){ + this.name = name; +} + +function Programmer(name){ +} + +Programmer.prototype.createHelloWorld = function(){ + console.log(this.name + ' can make Hello world!'); +} + +Human.prototype = Object.create(Programmer.prototype);//наследуемся от программиста, чтобы + // человек мог потом делать createHelloWorld + //если бы это было ниже, чем Human.prototype.drinkCoffe, то это бы + //перезаписало прототип и вытерло бы оттуда Human.prototype.drinkCoffe +Human.prototype.drinkCoffe = function(){ + //console.log(this.name + ' can drink coffe'); + return this.name + ' can drink coffe'; +} + +let vasya = new Human('Vasiliy'); +console.log(vasya); +console.log(vasya.drinkCoffe()); + +vasya.createHelloWorld(); + + + +//-----------ТО ЖЕ ЧЕРЕЗ CALL------------------------------------ +function Human2(name, age){ + /*this -> Developer*/ // когда произойдет колл из Developer, this станет ссылаться на Developer + this.name = name; + this.age = age; +} + +Human2.prototype.drinkCoffe = function(){ + console.log(this.name + ' drink drink'); +} + +//function Developer(name, age){ + /*тут неявно создается объект и this устанавливается в Developer*/ + + //Human2.call(this, name, age)//Human2 - это ф-ция конструктор, следовательно, у нее можно вызвать call или apply + + /*тут неявно вернется этот this, он же вновь созданный объект*/ +//} + +//Но еще лучше писать так:::------------------------- + +function Developer(...args){ + /*args -> [] это массив*/ + Human2.apply(this, args)// Human2 - ф-ция конструктор, следовательно, у нее можно вызвать call или apply. This здесь это Developer + // при вызове строки const Genry = new Developer('Genry', 32) в args приходит массив ['Genry', 32] + // когда происходит apply, мы попадаем в Human2, там name становится Genry, age становится 32, + // и this начинает ссылаться на Developer + this.skills = ['JS', 'HTML'];//если дописать еще и скилы, то после того, как выполнится call, this будет равняться Developer, + // у которого уже есть name: Genry и age: 32, и теперь еще добавляется свойство skills + // и в итоге будет Developer {name: "Genry", age: 32, skills: ['JS', 'HTML'])} +} + +//но пока что Генри не может пить кофе, т.к. при таком наследовании прототип не наследуется. Поэтому пишем: + +Developer.prototype = Object.create(Human2.prototype);//создаем объект, который лежит в прототипе хьюмана, + // т.е. возьмет только метод drinkCoffe, внутренние свойства + //name и age не возьмет +//Developer.prototype = new Human2('oleg', 25)//если наследоваться так, то возьмет только свойства ф-ции конструктора name и age, + // метод drinkCoffe не возьмет. Кроме своих name и age еще и в прото их еще раз установит + +const Genry = new Developer('Genry', 32); +console.log('Genry-->', Genry);// Genry--> Developer {name: "Genry", age: 32} + + +// ИНКАПСУЛЯЦИЯ-------------------------------- +// ИНКАПСУЛЯЦИЯ - ЭТО ОТДЕЛЕНИЕ СВОЙСТВ ОДНОГО ОБЪЕКТА ОТ ДРУГОГО +// ИНКАПСУЛЯЦИЯ - это создание скрытых методов и свойств. Бывают ПУБЛИЧНЫЕ, ПРИВАТНЫЕ И ЗАЩИЩИЕННЫЕ +// Все, что какасется инкапсуляции, касается функций-конструкторов и всего, что с ними связано + +// ПУБЛИЧНЫЕ МЕТОДЫ +//Например, публичный метод это + Human2.prototype.eatFood = function(){ + console.log(this.name + ' I am eating'); + } + +// ЗАЩИЩЕННЫЕ МЕТОДЫ + Human2.prototype._receiveCash = function(){ //существует контракт, по которому если перед методом стоит подчеркивание, + console.log(this.name + 'got money'); // то этот метод защищенный. Это секретный язык девелоперов + } + +//Например: + + Human2.prototype.drinkCola = function(){ //подразумевается, что этим методом может пользоваться разработчик, это публичный метод + this._createLogMessage('DRINK COLA'); + } + + Human2.prototype.eatBurger = function(){ //подразумевается, что этим методом может пользоваться разработчик, это публичный метод + this._createLogMessage('EAT BURGER'); + } + + Human2.prototype._createLogMessage = function(message){// подразумевается, что этим методом пользуется Human2 где-то внутри себя. + console.error(message); //Типа эй, если ты сделал себе нового Human2, не вызывай у него метод _createLogMessage + } + +// ПРИВАТНЫЕ МЕТОДЫ +// Приватные методы пишутся прямо в конструкторе. Это такие, которые мы никак не можем вызвать извне. Например, мы не можем вызвать +// у вновь созданного Васи secretMessage: + +function Human3(name, age) { + this.name = name; + this.age = age; + + let secreteMessage = '1233 4566 7788 9900'; //номер карты например + this.getSecreteMessage = function(){ // вернуть номер карты + return secreteMessage; // только таким образом можно получить доступ к secreteMessage + } + + this.setSecreteMessage = function(newMessage){ //установить номер карты + + } + +} + +//--------------------------------------------- +/* Задача + Создать AutorizedUser, у которого: + имя пользователя является публичным + пароль секретный(приватный) + + у вас есть метод showUserCashe + при вызове у пользователя showUserCashe + если передали правильный пароль - узнаете, сколько есть наличных + если неправильный - ошибка + + addCash(cashToAdd) увеличивает кеш на переданный аргумент*/ + +function AutorizedUser(name, password, cash){ + this.name = name;//me + let myPassword = password;//secret + let myCash = cash; + //--------------------------------------------------------- + this.showUserCashe = function (userPwd) {// чтобы получить доступ к паролю и кешу, пишем приватный метод + if (this._isPasswordValid (userPwd, myPassword)) { // if true + console.log(myCash); + return; + } + console.error('ERROR 505'); //if false + } + //--------------------------------------------------------- + this.addCash = function(sum, pwd){ + if (this._isPasswordValid(pwd)) { + myCash = myCash + sum; + console.log("You successfully added cash"); + return; + } + console.error('You entered not valid password!') + } + //---------------------------------------------------------- +} + +AutorizedUser.prototype._isPasswordValid = function(pwd, pwdToCompare){ //публичный метод, но защищенный + return pwd === pwdToCompare; // true or false +} + +var me = new AutorizedUser('me', 'secret', 3500); +console.log(me); + +me.showUserCashe('ohoho') //-> ERROR 505; +me.showUserCashe('secret') //-> 3500; +me.addCash(7000, 'fdhth') // +me.addCash(7000, 'secret') //-> SUCCESS; +me.showUserCashe('secret') //-> 10500; +me.addCash(7000, 'secret') //-> SUCCESS; +me.showUserCashe('hdjytdue') //-> 10500; +me.showUserCashe('secret') //-> 10500; \ No newline at end of file diff --git a/js-core/classworks/classwork-13/index.html b/js-core/classworks/classwork-13/index.html new file mode 100644 index 0000000..a97a2c8 --- /dev/null +++ b/js-core/classworks/classwork-13/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_13 + + +

    Classwork 13

    + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-13/main.js b/js-core/classworks/classwork-13/main.js new file mode 100644 index 0000000..7d1d639 --- /dev/null +++ b/js-core/classworks/classwork-13/main.js @@ -0,0 +1,283 @@ +//---- РАЗБОР ДЗ ----------------------------------- + +// @SUPER +/* + * TASK 0 + * Создайте функцию обертку над другой функцией + * Каждый раз при вызове внутренней функции в консоле будут отображаться аргументы функции +*/ + +const adding = (a, b) => a + b; + +const wrapperFunc = (fn) => { + return (...args) => { //из пришедших ыргументов сделает массив + console.log(args); + return fn(...args); + //fn.apply(null, args); + } +} + +const result = wrapperFunc(adding); +console.log(result(10, 20)); //30 + + +/*можно вот так упростить:*/ +const wrapperFunc2 = fn => (...args) => { //из пришедших ыргументов сделает массив + console.log(args); + return fn(...args); + } + +const result2 = wrapperFunc(adding); +console.log(result2(30, 40)); //30 + + + +//ПОЛИМОРФИЗМ----------------------------------------------- +//Полиморфизм - переопределение в дочернем классе метода родительского класса. +//Этот переопределенный метод работает только для дочернего класса, в классе-конструкторе остается старый +//добавьте всем массивам метод sum, который суммирует все аргументы в массиве + +const arr = [1,2,3]; +const arr2 = [10,20,30,40]; + +Array.prototype.sum = function(){ + let res = this.reduce((newItem, item) => { + return newItem += item; + }, 0) + return res; +} + +console.log(Array.prototype); + +console.log(arr.sum())//6 +console.log(arr2.sum())//100 + +//------ КЛАССЫ ----------------------------------------------- +//----- так мы писали раньше на прототипах: ------------------- + +function Country (countryName){ //это ф-ция конструктор + this.countryName = countryName; +} + +Country.prototype.showCity = function(){ // это ее метод, записанный в прототип + console.log(this.countryName); + console.log('это вызвался оригинальный метод конструктора, метод называется showCity'); +} + + function City(city){ // еще один конструктор, который будет наследоваться от Country + Country.apply(this, city); //наследуемся от Country + this.cityName = city; + } + + City.prototype = Object.create(Country.prototype); //наследуемся от Country + City.prototype.showCity = function(){ // это ПОЛИМОРФИЗМ - переопределили поведение метода showCity, + console.log('это вызвался переопределенный метод showCity из дочернего класса'); // взятого из конструктора + //теперь все, кто будет наследоваться от City, получат метод showCity такой, как в City, а не как в Country + } + //---- + const ukraine = new Country('ukraine'); //строим новый экземпляр ф-ции конструктора + console.log('ukraine with constructor-->', ukraine); + + //ukraine.prototype = Object.create(Country.prototype); + + //ukraine.prototype.showCity = function(){ + // console.log('переопределили'); + //} + +//------ теперь так это выглядит на классах --------------------- + +class CountryClass { //ф-ция конструктор + constructor(countryName){ //в constructor приходят аргументы, как раньше они приходили в ф-цию конструктор + this.countryName = countryName; + let secretPlaсe = 'Island'; //приватное свойство, пишем прямо в конструктор + this.showSecretPlaсe = () => secretPlaсe; //приватный метод, пишем прямо в конструктор + } + + showCity() { //метод, пишется прям в классе + console.log(this.countryName); + } + + showSomethingElse() { //метод, пишется прям в классе + console.log('showSomethingElse'); + } + +} +//CountryClass.prototype.someMethod = function(){}// в принципе и так можно добавлять методы в класс, но так никто не делает + +const ukraine2 = new CountryClass('ukraine2'); //строим новый экземпляр класса - все так же точно +//он унаследует метод showCity через прототипы, т.е. будет лежать в prototype этого экземпляра класса, +//все так же, как и с ф-цией конструктором +console.log('ukraine2 with class-->', ukraine2); + +//---------- наследование на классах ----------------------------- + +class CityClass extends CountryClass { //это все равно, как раньше мы писали City.prototype = Object.create(Country.prototype) + constructor(options){ // сюда придет kharkiv + super('yo-ho-ho'); //то, что передаем в супер, попадает в родительский класс и там приходит в constructor + // и родительский класс вызывается с переданными отсюда параметрами + //this.cityName = city; // сюда придет kharkiv + } + + showCityName(){ + console.log(this.cityName); + //super.showCity(); прям отсюда можно вызвать метод родительского класса + } + + //showCity() { // полиморфизм - так перезапишем метод родительского класса + // console.log('перезаписываем стандартный метод класса showCity'); + //} + +} + +const kharkiv = new CityClass('kharkiv'); + +//let city = new CityClass ({name: 'kharkiv', age: 18}); +//console.log(city); + + +//------ ДЕСТРУКТУРИЗАЦИЯ ------------------------------------- + + +let showObj = obj => { + console.log(obj.name); + console.log(obj.surname); +} + +showObj({name: 'Ivan', surname: 'Ivanov'})//Ivan Ivanov + +/*можем упростить:----------------------------*/ +let showObj2 = obj => { + let {name, surname} = obj; + + console.log(name); + console.log(surname); +} + +showObj2({name: 'Ivan', surname: 'Ivanov'})//Ivan Ivanov + +/*и еще лучше----------------------------------*/ + +let showObj3 = ({name, surname}) => { + console.log(name); + console.log(surname); +} + +showObj3({name: 'Ivan', surname: 'Ivanov'})//Ivan Ivanov + +/* и наконец ...rest ---------------------------*/ + +let showObj4 = ({name, ...rest}) => { //возьми из пришедшего объекта только name, а остальные свойства собери в объект + console.log(name); //тут только name из пришедшего объекта - Ivan + console.log(rest); //а тут {name: 'Ivan', surname: 'Ivanov'} +} + +showObj4({name: 'Ivan', surname: 'Ivanov', age: 25}) + +//--------ЗАДАЧКИ-------------------------------------------------------- +/* +Сделайте класс анимал с 4 лапами +Добавтьте метод roar +добавтье класс-животное, которе есть у соседа + +пускай животное наследуется с анимал +узнайте, сколько у него ног и как его зовут +добавьте метод кен ду самсинг +*/ +class Animal { + constructor(animal){ + this.animal = animal; + this.legs = 4; + } + + roar(){ + return this.animal + ` can rrrrrrrrr`; + } +} + +let myAnimal = new Animal('tiger'); +console.log(myAnimal.roar()); + +/*пускай животное наследуется с анимал +узнайте, сколько у него ног и как его зовут*/ + +class Cat extends Animal { + constructor(options){ + super(options.type); + this.name = options.name; + this.legs = options.legs; + } + + canDo(){ + console.log(this.name + ` can jump`); + } +} + +let myCat = new Cat({type: 'cat', name:'Kuzma', legs:5}); +console.log(myCat); +myCat.canDo(); +console.log(myCat.roar()); + + +//--------SETTIMEOUT---------------------------------------- +/*Сначала строки без сеттаймаута попадают в основную очередь +строки с сеттаймаутом попадают в отдельную очередь +когда очищается основная очередь, из отдельной в основную попадают сеттаймауты +и из сеттаймаутов выполнятся сначала те, у которых меньше задержка, +даже если они были написаны позже по коду*/ + + +const add = (a, b) => console.log(a + b); + +add(1, 2); //это покажется в консоли первым + +setTimeout(() => { //это покажется в консоли четвертым + add(100, 200); +}, 1000); + +setTimeout(() => { //это покажется в консоли пятым + add(10000, 20000); +}, 1000); + +setTimeout(() => { //это покажется в консоли третьим + add(5, 6); +}, 500); + +add(1000, 2000); //это покажется в консоли вторым + +//---------------------------------------------------------- +let func = function(name){ + console.log(name); +} + +setTimeout(() => { //ЭТОТ ПОКАЖЕТСЯ В КОНСОЛИ ТРЕТЬИМ + func('Nataly 1'); + //console.log('Nataly 1'); +}, 3000); + +setTimeout(() => { //ЭТОТ ПОКАЖЕТСЯ В КОНСОЛИ ВТОРЫМ + func('Nataly 2'); + //console.log('Nataly 2'); +}, 2000); + +setTimeout(() => { //ЭТОТ ПОКАЖЕТСЯ В КОНСОЛИ ПЕРВЫЙ + func('Nataly 3'); + //console.log('Nataly 3'); +}, 1000); + +//---------SETINTERVAL & CLEARINTERVAL----------------------- + +let int = setInterval(()=>{ + func('interval'); +}, 500); + +setTimeout(()=>{ + clearInterval(int); +}, 2000) + +//давайте счетчик +1 в консоли + +/*let i = 0; +setInterval(()=>{ + console.log(1); +}, 1000)*/ + diff --git a/js-core/classworks/classwork-6/index.html b/js-core/classworks/classwork-6/index.html new file mode 100644 index 0000000..e609bdb --- /dev/null +++ b/js-core/classworks/classwork-6/index.html @@ -0,0 +1,11 @@ + + + + + Class work 1 + + +

    YES !

    + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-6/src/main.js b/js-core/classworks/classwork-6/src/main.js new file mode 100644 index 0000000..33340dd --- /dev/null +++ b/js-core/classworks/classwork-6/src/main.js @@ -0,0 +1,459 @@ +let listOfCompanys = [ + { + company: 'ASIMILINE', + name: { + last: 'Watkins', + first: 'Lindsay', + }, + eyeColor: 'brown', + age: 20, + picture: 'http://placehold.it/32x32', + balance: '$1,091.09', + isActive: true, + guid: '294814e3-4c89-428f-b0c9-da5c4c37ea5e', + index: 0, + _id: '584babb6eeb4137cf14c37a3', + }, + { + company: 'ENJOLA', + name: { + last: 'Price', + first: 'Greene', + }, + eyeColor: 'brown', + age: 39, + picture: 'http://placehold.it/32x32', + balance: '$3,533.55', + isActive: true, + guid: 'e7b0824f-d6d1-4a82-b2c5-cd7a1ec8310c', + index: 1, + _id: '584babb6c7be9c2398ed263f', + }, + { + company: 'ZINCA', + name: { + last: 'Robertson', + first: 'Barbara', + }, + eyeColor: 'brown', + age: 22, + picture: 'http://placehold.it/32x32', + balance: '$1,395.22', + isActive: false, + guid: '0735d8d9-a165-4ad1-893f-e821da37bf63', + index: 2, + _id: '584babb6cca4dbefa6001820', + }, + { + company: 'TALKOLA', + name: { + last: 'Cooke', + first: 'Lea', + }, + eyeColor: 'blue', + age: 31, + picture: 'http://placehold.it/32x32', + balance: '$3,074.16', + isActive: false, + guid: '7d13cbc4-6b4d-4954-b3d3-df3cfe5f2373', + index: 3, + _id: '584babb6391a2b568f1e9416', + }, + { + company: 'GEEKKO', + name: { + last: 'Webb', + first: 'Kline', + }, + eyeColor: 'blue', + age: 34, + picture: 'http://placehold.it/32x32', + balance: '$1,520.21', + isActive: false, + guid: '2b179de0-a659-4423-b3c4-11c6490e5c74', + index: 4, + _id: '584babb66d6ea73e8ed51208', + }, +]; + +function sortArr(arr) { + let newArr = []; + arr.forEach(function(value){ + if(value.company) { + newArr.push(value.company); + } + }); + + return newArr; +} + +console.log('task 1 --->', sortArr(listOfCompanys)) + +//-------------------------------------------------------------------------------- +let megaObject = { + favoriteFruit: 'apple', + greeting: 'Hello, Lenora! You have 5 unread messages.', + friends: [ + { + name: 'Paul Carrillo', + id: 0, + }, + { + name: 'Prince Dejesus', + id: 1, + }, + { + name: 'Carey Bates', + id: 2, + }, + { + name: 'Moses Ballard', + id: 3, + }, + { + name: 'Rowe Bolton', + id: 4, + }, + { + name: 'Beck Atkinson', + id: 5, + }, + { + name: 'Rose Travis', + id: 6, + }, + { + name: 'Monica Goff', + id: 7, + }, + { + name: 'Mcfadden Nelson', + id: 8, + }, + { + name: 'Luann Carney', + id: 9, + }, + { + name: 'Cheri Buck', + id: 10, + }, + { + name: 'Hartman Potts', + id: 11, + }, + { + name: 'Farley Austin', + id: 12, + }, + { + name: 'Jerri Richardson', + id: 13, + }, + { + name: 'Burnett Sharp', + id: 14, + }, + { + name: 'Katy Madden', + id: 15, + }, + { + name: 'Kristine Payne', + id: 16, + }, + { + name: 'Ashlee Wilson', + id: 17, + }, + { + name: 'Jan Pugh', + id: 18, + }, + { + name: 'Michael King', + id: 19, + }, + { + name: 'Patty Rivas', + id: 20, + }, + { + name: 'Bridges Oneil', + id: 21, + }, + { + name: 'Walters Vazquez', + id: 22, + }, + { + name: 'English Andrews', + id: 23, + }, + { + name: 'Woodard Cardenas', + id: 24, + }, + { + name: 'Mercado Chan', + id: 25, + }, + { + name: 'Guerra Lawson', + id: 26, + }, + { + name: 'Riley Gray', + id: 27, + }, + { + name: 'Romero Sampson', + id: 28, + }, + { + name: 'Reva Carroll', + id: 29, + }, + { + name: 'Carey Mckenzie', + id: 30, + }, + { + name: 'Miles Raymond', + id: 31, + }, + { + name: 'Ray Underwood', + id: 32, + }, + { + name: 'Maude Norris', + id: 33, + }, + { + name: 'Brigitte Kirkland', + id: 34, + }, + { + name: 'Graham Russell', + id: 35, + }, + { + name: 'Sonia Holcomb', + id: 36, + }, + { + name: 'Hopper Garrison', + id: 37, + }, + { + name: 'Butler Harrison', + id: 38, + }, + { + name: 'Grant Wheeler', + id: 39, + }, + { + name: 'Stout Barker', + id: 40, + }, + { + name: 'Merritt Kelley', + id: 41, + }, + { + name: 'Kari Holman', + id: 42, + }, + { + name: 'Tamra Howell', + id: 43, + }, + { + name: 'Good Harvey', + id: 44, + }, + { + name: 'Hendrix Webb', + id: 45, + }, + { + name: 'Hammond Harris', + id: 46, + }, + { + name: 'Ester Hamilton', + id: 47, + }, + { + name: 'Lopez Hopper', + id: 48, + }, + { + name: 'Newton Cantrell', + id: 49, + }, + ], + range: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], + tags: ['nulla', 'Lorem', 'labore', 'dolore', 'enim'], + longitude: '0.298835', + latitude: '20.822214', + registered: 'Saturday, July 2, 2016 10:52 PM', + about: 'Ipsum adipisicing nulla adipisicing culpa qui et esse labore ut nostrud excepteur amet elit voluptate. Ut ex laborum enim sit. Proident eu elit tempor occaecat dolor.', + address: '597 Agate Court, Interlochen, Utah, 6828', + phone: '+1 (987) 453-2740', + email: 'lenora.barr@uberlux.me', + company: 'UBERLUX', + name: { + last: 'Barr', + first: 'Lenora', + }, + eyeColor: 'brown', + age: 37, + picture: 'http://placehold.it/32x32', + balance: '$3,110.45', + isActive: true, + guid: '74d9074f-004a-447f-8721-12d884011852', + index: 0, + _id: '584bac50967253d4322db586', +}; + +/*function sortArr2(arr) { + let companiesArr = []; + arr.forEach(function(value){ + let index = value.index; + + }); + //let sss = forArray(arr1, index); + return sss; +} + +function forArray(arr, whatISearch){ + arr.forEach(function(value,index,arr) { + if (value.whatISearch) { + console.log(1); + } + }) +} + +console.log('task 1 --->', sortArr2(listOfCompanys))*/ + +/* +* Напишите функцию которая проходится по списку компаний +* и берет свойство 'index' и находит в megaObj друга у которого +* такой же index равен id +* +* Вам нужно вернуть новый массив который содержит объекты(друзей) +* у которых есть свойство companyName имя компании +* и так же имя друга friendName +*/ +let arr = [2,3,4,5,6]; +function multiply(arr){ + return arr.map(function(item){ + return item * 2; + }) +} + +console.log(multiply(arr)); + +///////////////////////////////////////// + +const qq = [1,2,3,4]; +let filtered = qq.filter(function(elem, index, qq){ + return elem > 2 +}) +console.log(filtered); +//----------------------------------------------- +const user = [{ + english: 'B++' +} +] +const qqq = [ +{ + salary: 500, + expectedEnglishLevel: 'r' +}, +{ + salary: 800, + expectedEnglishLevel: 'B0' +}, +{ + salary: 1000, + expectedEnglishLevel: 'B1' +}, +{ + salary: 2000, + expectedEnglishLevel: 'B2++' +} +] + +let salary = qqq.filter(function(elem) { + //return elem.salary >= 1000; + if (elem.expectedEnglishLevel.length > user[0].english.length && elem.salary > 1000) { + return elem.salary >= 1000; + } +}) + +console.log(salary); + + + +//-------------------------------------------------- +const users = [ +{ + age: 20, + salary: 0 +}, +{ + age: 10, + salary: 1000 +}, +{ + age: 10, + salary: 1500 +} +] + +console.log (users.sort(function (a,b) { + return a.age > b.age && a.salary>b.salary; +}) +) + +/* +0 пропускает текущую итерацию +-1 - перемещает данное число дальше для сравнения +1 - возвращает следующее число +*/////////////////////////// +const arrr = [10,20,30]; +console.log(arrr.reduce(function(newValue, value, index, arrr){ + //console.log('newValue', newValue); + //console.log('index', index); + return newValue + value +},0))//60 + +/////////////////////////////////// +/*function sum(){ + (arrr.map(item, index, arrr){ + let sum =0; + sum += item; + return sum; + //return item +} +}*/ + +const qqqq = ['JS', 'Easy', 'For', 'Life']; + +console.log(qqqq.reduce(function(newItem, item){ + return `${newItem} - ${item}`; +})) //JS - Easy - For - Life + +//-------------------------------------- +function red(arr){ + var str = ''; + arr.reduce(function(newItem, item){ + str = str + `${newItem} - ${item}`; + }) + return str; +} +console.log(red(qqqq));//JS - Easyundefined - Forundefined - Life \ No newline at end of file diff --git a/js-core/classworks/classwork-6/src/s.js b/js-core/classworks/classwork-6/src/s.js new file mode 100644 index 0000000..b5b3f40 --- /dev/null +++ b/js-core/classworks/classwork-6/src/s.js @@ -0,0 +1,2 @@ +console.log('WWW'); +console.log('WWW'); \ No newline at end of file diff --git a/js-core/classworks/classwork-8/index.html b/js-core/classworks/classwork-8/index.html new file mode 100644 index 0000000..f9bce3c --- /dev/null +++ b/js-core/classworks/classwork-8/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_8 + + +

    Hello world 8

    + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-8/main.js b/js-core/classworks/classwork-8/main.js new file mode 100644 index 0000000..dbb8e9a --- /dev/null +++ b/js-core/classworks/classwork-8/main.js @@ -0,0 +1,277 @@ +/* CHECK THE HOMEWORK + * TASK 1 - THE LAST TASK FROM PREVIOUS HOMEWORK---------- + * + * Напишите функцию которая принимает 4 аргумента: + * - Объект + * - Имя свойства с которым связывается метод + * - Сколько раз можно вызвать метод * + * - Объявление привязываемого метода ( функция ) + * + * При вызове метода отобразите сумму передаваемых параметров. + * Когда заканчивается счетчик, отображается ошибка + * + * */ + +let jun = {}; + +function methodCounter(obj, name, num, fn) {//функция, которая наполняет объект jun +/*нужно добавить метод объекту + в зависимости от того, чему равняется сейчас счетчик + или вызвать функцию(аргумент 4) + или отправить сообщение об ошибке +*/ let counter = num; + obj[name] = function(...args) { //метод jun.logger считает сумму переданных параметров + if (counter === 0) { + return `ERROR ! add more methods, У Вас осталось ${counter} попыток` + } + counter--; + return `${fn(args)}, у Вас осталось ${counter} попыток`; + }; + +}; + +methodCounter(jun, 'logger', 3, function(arr){ //здесь прямо наполняем объект jun + let sum = arr.reduce((newItem, item) => { + return newItem + item; + }, 0); + return sum; +}); + + +//должна одна и та же функция вызываться не более 3 раз, т.к. 3 передано в функцию +console.log('task 3-1 ----> ',jun.logger(1, 2, 3, 4)); // 2, 10 +//console.log('task 3-1 ----> ',jun.logger(1, 2, 3, 4)); // 2, 10 +//console.log('task 3-1 ----> ',jun.logger(1, 2, 3, 4)); // 2, 10 +console.log('task 3-2 ----> ',jun.logger(5, 5, 5, 5)); // 1, 20 +console.log('task 3-3 ----> ',jun.logger(1, 2, 3, 4, 7, 10)); // 2, 27 +console.log('task 3-4 ----> ',jun.logger(5, 5, 5, 5)); // 1, 20 +console.log('task 3-5 ----> ',jun.logger(5, 5)); // ERROR ! add more methods + +//добавьте функции methodCounter возможность увеличивать счетчик на заданное число +//jun.addCounter(10, methodName); + + +//----CLASSWORK------------------------------------------------------- + +//1. SWITCH CASE --------редко пользуются--------- + +function checkActionType(action){ + switch (action.type) { + + case 'INITIALIZE': + return {initialized: true}; + + case 'INCREMENT': + return {salary: '+500$'}; + + case 'DECREMENT': + return {salary: '-500$'}; + + default: + return {}; + }; +} +console.log(checkActionType({type: 'INITIALIZE'})); + +// 2. PSEUDOARRAYS------------------------------------- +//Псевдомассивы приходят, когда берем у функции ее arguments. +//вроде как приходит массив - если посмотреть в консоли, то он заключен в квадратные скобки. +//Но его прототип - объект (видно там же в консоли) +//поэтому не можем применить к псевдомассивам методы массивов - forEach, reduce и т.д. +//только можем пройти с помощью for + +const pseudoArray = { + 0: 'one', + 1: 'two', + 2: 'three' +} +pseudoArray.length = 3; + +for (let i = 0; i < pseudoArray.length; i++){ + const elem = pseudoArray[i]; + console.log(elem); +} + +//--------------------------------------------- +function add(){ + let arr = arguments; + + let sum = 0; + for (let i = 0; i < arr.length; i++){ + let item = arr[i]; + sum += item; + } + return sum; +} +console.log(add(1,2,3)); +console.log(add(10,20,30)); +console.log(add(10,20)); +console.log(add(10,20,30, 40, 50,10)); + +//-------------ES6 solution--------------- +//чтобы привести псевдомассив в чувство, используем деструкцию +//тогда можно применять методы массивов - forEach, reduce и т.д. + +function add2(){ + let arr = [...arguments];// возьмет все аргументы, запишет их через запятую и поместит в массив + return arr.reduce((newItem, item) => { + return newItem + item; + }, 0) +} + +console.log(add2(1,2,3)); +console.log(add2(10,20,30)); +console.log(add2(10,20)); +console.log(add2(10,20,30, 40, 50,10)); + +//-------------ES7 solution--------------- +//чтобы привести псевдомассив в чувство, используем деструкцию +//тогда можно применять методы массивов - forEach, reduce и т.д. +//...args сразу возвращает массив аргументов!!! Пользоваться этим решение всегда! +function add3(...args){ + return args.reduce((newItem, item) => { + return newItem + item; + }, 0) +} + +console.log(add3(1,2,3)); +console.log(add3(10,20,30)); +console.log(add3(10,20)); +console.log(add3(10,20,30, 40, 50,10)); + + +//------------OBJECTS---------------------------------- + +let obj1 = {id: 10}; +let obj2 = {id: 10}; +console.log(obj1 == obj2); //false, т.к. на самом деле при создании объекта создается +//ссылка в оперативной памяти и ссылка присваивается в переменную +//Объект физически занимает ячейку памяти +//Когда мы присваиваем новой переменной существующий объект, то присваивается существующая ссылка!!! + +let obj = {name: 'JavaScript'}; +let z = obj; +z.qwerty = 'qwerty'; +console.log(obj); //{name: "JavaScript", qwerty: "qwerty"} +console.log(z); //{name: "JavaScript", qwerty: "qwerty"} +//и obj, и z ссылаются на одну и ту же ячейку памяти, следовательно, имеют к ней одинаковый доступ +//если z добавил какое-то свойство, то оно видно и из obj. Мы просто смотрим на одну ячейку с разных сторон + +//Когда мы передаем один и тот же объект в разный функции, то мы передаем не объект, мы передаем ССЫЛКУ +//Это очень дешево, ничего нового не инициализируется, большой перформанс +//---------------------------------------------------------------------- + +//Задача 1- скопировать объект user + +const user = { + id: 10, + country: 'Thailand', + email: 'example@example.com' +}; + +//написать ф-цию, которая принимает любой объект и возвращает его копию +//нужно скопировать объект + +function copy(obj){ + let keys = Object.keys(obj); //"id", "country", "email"] + let newObj = {}; + + keys.forEach((item) => { + if (Array.isArray(obj[item])) { //ОЧЕНЬ СТАРЫЙ СПОСОБ: если вдруг очередной элемент массива - тоже массив, то он же в глубине души объект + newObj[item] = [...obj[item]]; //и тоже хранит ссылку на одну и ту же ячейку памяти. Поэтому деструктурируем его и записываем в новый массив + return;// это типа continue, только для forEach + } + newObj[item] = obj[item];//в новый объект записываем ключи из их значения из старгого + }); + +//или можно было так: +// for (let key in obj) { +// newObj[key] = obj[key]; +// } + return newObj; +} + +const newUser = copy(user); +newUser.country = 'India';// в новом объекте меняем значение ключа country + +console.log(copy(user));//thailand +console.log(copy(newUser));//india + +//-----------БОЛЕЕ СОВРЕМЕННЫЙ СПОСОБ - Object.assign------------------------------------ +//Но JS придумал упрощение этой задачи, но это работает для копирования только на одном уровне. +//Если будут вложенные объекты - у них по-прежнему останутся ссылки на одно и то же место в памяти + +//function copy2(obj){ +// let newObject = Object.assign({}, obj); //скопируй объект obj в новый пустой объект {} и запиши это в переменную newObject +// return newObject; +//} +//-----------Object.assign deep copy------------------------------------ +//Чтобы скопировать более глубокую вложенность, пишут так, при этом мы должны знать, как называются ключи объекта: + +function copy2(obj){ + let newObject = Object.assign({}, obj, { //скопируй объект obj в новый пустой объект {} и запиши это в переменную newObject + cars: [...obj.cars] //значение ключа cars деструктурируй и положи в новый массив + }); + return newObject; +} + +//Усложнение задачи 1 ----------------------------------------- + +const user2 = { + id: 10, + country: 'Thailand', + email: 'example@example.com', + cars: ['we', 'ref','re'] +}; + +const newUser2 = copy2(user2); +newUser2.cars.push('toyota');//тойота отобразится не только в новом объекте, а в старом тоже + //хотя объекты уже разные и ссылаются на разные ячейки памяти. Почему? + // потому что cars - это еще один объект внутри разных объектов user2 и newUser2 + //и у внутреннего объекта cars в обеих объектах ссылка на одну и ту же ячейку памяти + // Что же делать? + +console.log(copy2(user2));//thailand +console.log(copy2(newUser2));//india + + +//------САМЫЙ СОВРЕМЕННЫЙ СПОСОБ------------------------------ + +// +// +// +const user3 = { + id: 10, + country: 'Thailand', + email: 'example@example.com', + cars: { + id: 50, + name: ['bmw', 'VAZ', 'mercedes', 'AUDI'], + vendors: { + addresses: ['google', 'yahoo'] + } + } +}; + +function copy3(obj){ + let newObj = Object.assign({}, obj); + return { + ...obj, //деструтурируем каждое свойство объекта (копируем все свойства объекта) + cars: { + ...obj.cars,//перезаписываю cars - создастся три новых свойства: id, name, vendors + name: [...obj.cars.name], //обновляю name + vendors: { + ...obj.cars.vendors,//если вдруг в vendors еще что-то лежит, кроме addresses + addresses: [...obj.cars.vendors.addresses] + } + } + } +} + +const newUser3 = copy3(user3); +newUser3.cars.name.push('mazda');// тойота должна добавиться только к newUser3, а к user3 - нет +newUser3.cars.vendors.addresses.push('javascript');// тойота должна добавиться только к newUser3, а к user3 - нет + + +console.log(copy3(user3));//thailand +console.log(copy3(newUser3));//india \ No newline at end of file diff --git a/js-core/classworks/classwork-9/index.html b/js-core/classworks/classwork-9/index.html new file mode 100644 index 0000000..2f4d833 --- /dev/null +++ b/js-core/classworks/classwork-9/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_9 + + +

    Hello world 9

    + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-9/main.js b/js-core/classworks/classwork-9/main.js new file mode 100644 index 0000000..413bde7 --- /dev/null +++ b/js-core/classworks/classwork-9/main.js @@ -0,0 +1,123 @@ +//--------JSON JavaScript Object Notation----------------- + +const myJSON = { + "name": "my library", + "version": 10, + "dependency": { + "react": "^16.4.0", + "babel": false + }, + "plugins": ['env', 'qwerty'], + //methodES6(): { + // console.log(Obgect.key(myJSON)); + //} +} + + +//console.log(JSON.stringify(myJSON));//вернет строку + +//const validJSON = JSON.parse(JSON.stringify(myJSON)); +//console.log(validJSON); + +//Обычный консоль лог покажет JSON как обычный объект. Чтобы вернуть все же JSON, +//нужно сделать JSON.stringify(myJSON) - превратит в строку +// а потом JSON.parse() - строку превратит в JSON + +let parsed = JSON.parse(JSON.stringify(myJSON)); +let keys = Object.keys(parsed); +console.log(keys); + +//------------------------------------------------- + +//Используя ES6 напишите ф-цию, которая принимает 1 агрумент имя и возвращает "Привет, меня зовут имя" +let hello = (name) => { + return `Hi, my name is ${name}`; +} + +let hello2 = (name) => `Hi, my name is ${name}`; + +console.log(hello('Nataly')); +console.log(hello2('Nataly')); + +//Используя ES6 напишите ф-цию, которая принимает 1 агрумент имя и возвращает объект {name:name} + +let createObj = name => { //если передаем один аргумент, круглые скобки вокруг можно не ставить + return { + name //сработает как name: 'Nataly'! + } +} + +// или так: +let createObj3 = (name, surname) => { //если передаем один аргумент, круглые скобки вокруг можно не ставить + return { + name, //сработает как name: 'Nataly'! + surname + } +} + +console.log(createObj('Nataly')); + +let createObj2 = (name) => ({name}) + +console.log(createObj2('Nataly')); +console.log(createObj3('Nataly', 'Vladimirovna')); + +//----------------------------------------------------- +const userArray = ['Vasya', 'Petya', 'Grigoriy']; +//[{name: 'Vasya'}, {name: 'Petya'}, {name: 'Grigoriy'},] + +let newArr = userArray.map((name) => { + return { + name + } +}); + + +let newArr2 = userArray.map((name) => ({name})); + +console.log(newArr); +console.log(newArr2); + + +//---- THIS контекст вызова функции-----------------------------------------\\ + +const anotherObject = {//разобрать + name: 'qwer', + id: 0, + salary: '500$', + methodES6 +}; + + +function methodES6() { + console.log(Obgect.key(anotherObject)); + }; + + +//напишите ф которая будет отображать количество страниц книги, +//и ф можно вызвать как для объекта book1, так и для book2 +let book1 = { + pages: 340, + getPages +}; + +let book2 = { + pages: 4, + getPages +} + +function getPages(){ + //console.log(this); + return this.pages; +} + +function showPages () { + return this.pages; +} +/*function getPages(book) => { + return this.pages +}*/ + +console.log(book1.getPages()); +console.log(book2.getPages()); +console.log(book1.showPages()); \ No newline at end of file diff --git a/js-core/homeworks/homework-10/index.html b/js-core/homeworks/homework-10/index.html new file mode 100644 index 0000000..9d4ff1a --- /dev/null +++ b/js-core/homeworks/homework-10/index.html @@ -0,0 +1,12 @@ + + + + + Homework_10 + + +

    Homework 10

    + + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-10/main.js b/js-core/homeworks/homework-10/main.js new file mode 100644 index 0000000..2ea1c00 --- /dev/null +++ b/js-core/homeworks/homework-10/main.js @@ -0,0 +1,139 @@ +'use strict'; + +/* + * + * Задача 0 + * + * Что вернет выражение z(x) ? + * Напишите ответ своими словами как вы понимаете + * В консоле не смотрите, сначала напишите, после проверьте себя + * + * */ + +let y = 5; +let x = () => y;//5 + +let z = t => { //z равно функции, которая принмает t. В t пришла функция х + let y = 12; + return t(); +}; + +//console.log('task 1-1---->', y);//5, берет значение глобальной переменной y + +//console.log('task 2-1---->', z(x)); // что вернет - undefined, потому что нет никакого ретерна из t +//если добавить return, то возвращается 5, т.к. функция х пришла со своем контекстом, т.е. с у=5. Круто) + +/* + * + * TASK 2---------------------------------------------- + * Создайте функцию которая будет превращать + * передаваемую строку в html тэг + * + * + * */ + +let $ = function(str) { + return `<${str}>` +}; + +let createBODY = $('body'); +let createDIV = $('div'); + +console.log('task 2-1---->', createBODY); // +console.log('task 2-2---->', createDIV); //
    + +/* + * + * TASK 3-------------------------------------------------------------- + * + * Создайте объект к которому можно будет применить любое число вызовов + // obj.method().method().method() + --------------- + * Передаваемое значение должно возвращаться в виде html тэгов (TASK 1) + * Передаваемые аргументы должны быть только в виде строки + * */ + +var ezjQuery = { + + add(str) { + this.res += `<${str}>`; + console.log(this.res); + return this;//возвращает ezjQuery, у которой в res каждый раз добавляется новое значение + //и каждый следующий вызов происходит с тем, что в res уже что-то есть + } + +}; + +ezjQuery.res = ''; + +ezjQuery + .add('body') // + .add('div') //
    + .add('h1'); //

    + + /* + * + * TASK 4-------------------------------------------- + * Доработйте метод add чтобы на каждом вызове следующий + * тэг помещался внутри предыдущего ! + --- + * И добавьте объекту ezjQuery метод render, который будет возвращать + * сгенерированную строку + ----- + * Методу add - второй параметр, который будет размещать + * информацию внутри тэга + * + */ + +var ezjQuery2 = { + + res: '', + + add(str, inner) { + + if (this.res.length != 0) { + this.res = (inner != undefined) ? this.res.replace('><${str}>${inner}<${str}>`; + //console.log(this.res); + return this; + }, + + render() { + document.write(this.res); + console.log(this.res); + //return this.res; //тут что-то одно получается - или обнулить res, или ретернуть его. И обнулить, и ретернуть непонятно как + this.res = ''; + } + +}; + + +var helloList = ezjQuery2 + .add('body') // + .add('div') //
    + .add('ul') //
      + .add('li', 'Hello') //
      • Hello
      + .render(); + +console.log('task 3-1---> ', helloList); //
      • Hello
      +// Обратите внимание, что после вызова render создание строки началось сначала + +var bodyDiv = ezjQuery2 + .add('body') // + .add('div') //
      + .render(); +console.log('task 3-2---> ', bodyDiv); //
      + + +// @SUPER +/* + * Переименуйте объект ezjQuery в $. + * Создание перевого метода должено быть без метода + */ + + + // $('body').add('li', 'hi').render() //
    • hi
    • diff --git a/js-core/homeworks/homework-11/index.html b/js-core/homeworks/homework-11/index.html new file mode 100644 index 0000000..87d85b4 --- /dev/null +++ b/js-core/homeworks/homework-11/index.html @@ -0,0 +1,12 @@ + + + + + Homework_11 + + +

      Homework 11

      + + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-11/main.js b/js-core/homeworks/homework-11/main.js new file mode 100644 index 0000000..d0cfdc7 --- /dev/null +++ b/js-core/homeworks/homework-11/main.js @@ -0,0 +1,71 @@ +'use strict'; + + +/* + * + * Сделайте 4 объекта - не усложняйте, просто наследование + * через __proto__ + + - Пользователь + - Верифицированный пользователь(админ) + - Гость + - База данных + + - База хранит информацию о пользователях // + - Пользователи знают мыло админа // + - админ знает пароль от базы данных + - Гости могут зарегистрироваться в базе данных // + * + * */ +function Guest(name){ + this.guestName = name; +} + +function User(name){ + this.userName = name; +} + +function Database(name){ + this.dbName = name; + this.users = []; + this.password = 'qwerty'; +} + +Database.prototype.createNewUser = function(user){ + let newUser = new User(user); + console.log(newUser); + + this.users.push(newUser); +} + +/*Database.prototype.showPassword = function(){ + console.log('------------',this.password); +}*/ + +/*Guest.prototype.canRegister = function(){ + let newUser +}*/ + +//--------------------- +let guest = new Guest('guest-1'); +console.log(guest); + +let commonUser = new User('Karl'); +console.log(commonUser); + +let admin = new User('Admin'); +console.log(admin); + +let db = new Database('mongoDB'); +console.log(db); + +User.prototype = {//у всех экземпляров, созданных через new User, в __proto__ prototype будет лежать adminMail: 'admin@admin.com' + adminMail: 'admin@admin.com' +} + +admin.dbPassword = 'qwerty'; +//db.showPassword(); + +db.createNewUser('user-1'); +db.createNewUser('user-2'); + diff --git a/js-core/homeworks/homework-12/index.html b/js-core/homeworks/homework-12/index.html new file mode 100644 index 0000000..3371c34 --- /dev/null +++ b/js-core/homeworks/homework-12/index.html @@ -0,0 +1,12 @@ + + + + + Homework 12 + + +

      Homework 12

      + + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-12/main.js b/js-core/homeworks/homework-12/main.js new file mode 100644 index 0000000..678bd5b --- /dev/null +++ b/js-core/homeworks/homework-12/main.js @@ -0,0 +1,169 @@ +//'use strict'; + +/* + * TASK ! ! ! + * Сделайте пожалуйста с теми навыками которые у вас есть ТЕЛЕФОННЫЙ СПРАВОЧНИК + * + * Task 0 + * + * Создайте функцию конструктор Http, которая будет иметь 2 метода + * + * createServer() - принимает один аргумент функцию с двумя параметрами ctx и next + * ctx: Object { + * req: Object + * PORT: number + * url: string + + * res: Object + * status: number, + * message: string, + * header: Object { + * content-type:application/json + * } + * } + * next: Function + * + * + * при вызове listen(PORT, host) - в консоле должна отобразится надпись + * "Server running on https://host:port" + * и вызваться переданная в createServer функция + * + * + * методы нужно вызывать через chain + * после вызова метода listen() - должна вызываться переданная в createServer + * первая функция и возвращать объект и функцию + * + * */ +/*let ctx = ctx: Object { + req: Object + PORT: number + url: string + + res: Object + status: number, + message: string, + header: Object { + content-type:application/json + } + }*/ + + +/*конструктор*/ + +function Http() { + this.ctx = { + req: { + port: 8880, + url: 'localhost', + }, + res: { + status: 200, + message: 'OK', + header: { + content_type: 'application/json', + } + } + } + + this.next = function(){ + console.log('function was called'); + } +} + +/*прототипы*/ +Http.prototype.createServer = function(fn) { + + this.function = function(){ + return fn(this.ctx, this.next()); + } + //console.log(this); + return this; +} + +Http.prototype.listen = function(port, host) { + console.log(`Server running on https:${host}:${port}`); + this.function(); + //console.log(this); + return this; +} + +/*новый экземпляр*/ +const server = new Http().createServer(function(ctx, next) { + console.log(ctx); +}).listen(3000, 'localhost'); //переданная ф-ция вызывается, когда вызываешь листен + +//----------------------------------------------------------------- +// TASK 1 +// Создать класс Human, у которого будут свойства обычного человека: +// имя, возраст, пол, рост, вес. +// Используя прототипное наследование создать дочерние классы Worker +// (дописать в них поля места работы, зарплата, метод "работать") +// и Student (дописать поля места учебы, стипендией, метод "смотреть сериалы") +// +// Создать несколько экземпляров классов Worker и Student, вывести их в консоль. +// Убедиться что они имеют поля родительского класса Human + + // ---- родительский класс ---- +function Human(options){ + let {name, age, sex, height, weight} = options; + + this.name = name; + this. age = age; + this.sex = sex; + this.height = height; + this.weight = weight; +} + +//--------------worker----------------------- + +function Worker(options){ //сюда пришел объект переданных свойств + let {job, salary, ...humanProps} = options; + + Human.call(this, humanProps);//call, а не apply потому что humanProps - это объект, а не массив + + this.job = job; + this.salary = salary; +} + +Worker.prototype = Object.create(Human.prototype); + +Worker.prototype.working = function(){ + console.log(this.name + ' can work'); +} + +//--------------student----------------------- + +function Student(options){ + let {univer, scolarship, ...rest} = options; + + Human.call(this, rest); + + this.univer = univer; + this.scolarship = scolarship; +} + +Student.prototype = Object.create(Human.prototype); + +Student.prototype.toSeeMovies = function(){ + console.log(this.name + ' can see movies'); +} + +let workerAndrew = new Worker({name:'Andrew', age:23, sex:'male', height:186, weight:80, job: 'pilot', salary: 10000}); +console.log(workerAndrew); +workerAndrew.working(); + + +let studentAlla = new Student({sex:'female', height:160, name:'Alla', age:19, weight:55, univer: 'KIMO', scolarship: false}); +console.log(studentAlla); +studentAlla.toSeeMovies(); + +// @SUPER + +/* + * + * TASK 0 + * Создайте функцию обертку над другой функцией + * Каждый раз при вызове внутренней функции в консоле будут отображаться аргументы функции + * которую мы обернули + * +*/ \ No newline at end of file diff --git a/js-core/homeworks/homework-13/index.html b/js-core/homeworks/homework-13/index.html new file mode 100644 index 0000000..7adfa38 --- /dev/null +++ b/js-core/homeworks/homework-13/index.html @@ -0,0 +1,12 @@ + + + + + Homework 13 + + +

      Homework 13

      + + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-13/main.js b/js-core/homeworks/homework-13/main.js new file mode 100644 index 0000000..a098eab --- /dev/null +++ b/js-core/homeworks/homework-13/main.js @@ -0,0 +1,191 @@ +//'use strict'; + +/* + * TASK - 2 + * + * Перепишите Homework 12 - TASK 1 используя class + * + * */ + +//----------------------------------------------------------------- +// TASK 1 +// Создать класс Human, у которого будут свойства обычного человека: +// имя, возраст, пол, рост, вес. +// Используя прототипное наследование создать дочерние классы Worker +// (дописать в них поля места работы, зарплата, метод "работать") +// и Student (дописать поля места учебы, стипендией, метод "смотреть сериалы") +// +// Создать несколько экземпляров классов Worker и Student, вывести их в консоль. +// Убедиться что они имеют поля родительского класса Human + + // ---- родительский класс ---- +/*function Human(options){ + let {name, age, sex, height, weight} = options; + + this.name = name; + this. age = age; + this.sex = sex; + this.height = height; + this.weight = weight; +} */ +class Human { + constructor(options){ + let {name, age, sex, height, weight} = options; + + this.name = name; + this. age = age; + this.sex = sex; + this.height = height; + this.weight = weight; + } +} + +//--------------класс-наследник worker----------------------- +/*function Worker(options){ //сюда пришел объект переданных свойств + let {job, salary, ...humanProps} = options; + + Human.call(this, humanProps);//call, а не apply потому что humanProps - это объект, а не массив + + this.job = job; + this.salary = salary; +}*/ + +/*Worker.prototype = Object.create(Human.prototype); + +Worker.prototype.working = function(){ + console.log(this.name + ' can work'); +}*/ + +class Worker extends Human { + constructor({job, salary, ...rest}){ //так писать нормально или лучше сюда принять options, а ниже деструктурировать? + super(rest); + + this.job = job; + this.salary = salary; + } + + working(){ + console.log(this.name + ' can work'); + } + +} + +//--------------student----------------------- + +/*function Student(options){ + let {univer, scolarship, ...rest} = options; + + Human.call(this, rest); + + this.univer = univer; + this.scolarship = scolarship; +} + +Student.prototype = Object.create(Human.prototype); + +Student.prototype.toSeeMovies = function(){ + console.log(this.name + ' can see movies'); +}*/ + +class Student extends Human { + constructor({univer, scolarship, ...rest}){ + super(rest); + } + + toSeeMovies() { + console.log(this.name + ' can see movies'); + } +} + +let workerAndrew = new Worker({name:'Andrew', age:23, sex:'male', height:186, weight:80, job: 'pilot', salary: 10000}); +console.log(workerAndrew); +workerAndrew.working(); + + +let studentAlla = new Student({sex:'female', height:160, name:'Alla', age:19, weight:55, univer: 'KIMO', scolarship: false}); +console.log(studentAlla); +studentAlla.toSeeMovies(); + +/* + * Вы должны создать имитацию медленной базы данных. + * TASK - 1 Сделайте Класс Database с методами + * + * query + * + * При запуске метода query запустите внутренний таймаут, который будет длиться 5 секунд. + * При поступлении еще 1 запроса(если вызвать метод еще раз), + * таймаут должен стартануть сначала + * и ответ должен прийти снова через 5 секунд + * + * */ + +class DataBase { + constructor(){ + } + + counterFunc() { + this.counter = 5; + this.timer = setInterval(this.timeoutFunc.bind(this), 1000); + } + + timeoutFunc() { + + if (this.counter < 1) { + console.log('The web server is down'); + clearInterval(this.timer); + return; + } + console.log(this.counter--); + } + + + query() { + if (this.timer) { + clearInterval(this.timer); + } + this.counterFunc(); + } + +} + +const dataBase = new DataBase(); +console.log(dataBase); +dataBase.query(); +//dataBase.query(); + + +/*function QQQ(){ //closure + let counter = 0; + this.some = function(){ + return counter++; + } +} + +let www = new QQQ(); +console.log(www.some()); +console.log(www.some()); +console.log(www.some());*/ + + +// // 5 +// // 4 +// // 3 +// // 2 +// // 1 +// // console.log('The web server is down') https://www.youtube.com/watch?v=W8_Kfjo3VjU + +// dataBase.query(); +// // 5 +// // 4 +// dataBase.query(); +// // 5 +// // 4 +// // 3 +// // 2 +// dataBase.query(); +// 5 +// 4 +// 3 +// 2 +// 1 +// console.log('The web server is down') \ No newline at end of file diff --git a/js-core/homeworks/homework-2/index.html b/js-core/homeworks/homework-2/index.html new file mode 100644 index 0000000..cd5e32e --- /dev/null +++ b/js-core/homeworks/homework-2/index.html @@ -0,0 +1,11 @@ + + + + + Home work 2 + + +

      Homework 2

      + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-2/src/main.js b/js-core/homeworks/homework-2/src/main.js new file mode 100644 index 0000000..a4d2c00 --- /dev/null +++ b/js-core/homeworks/homework-2/src/main.js @@ -0,0 +1,75 @@ + /*1. Составить предложение из нижестоящих переменных: + "Сколько нужно программистов чтобы сделать проект ? 1, 25, команда" + */ + +let numbers = [25, 1]; +let project = 'проект'; +let team = `команда`; +let howMuch = 'Сколько'; +let sentence = 'нужно программистов чтобы сделать проект ?'; + +console.log(numbers); +let task1 = `${howMuch} ${sentence} ${numbers[1]}, ${numbers[0]}, ${team}`; +console.log('task1', task1); + +/* + 2. Составьте предложение из представленного массива + и выведите предложение в консоль; + "Так, когда Будда достиг Просветления, он обнаружил, что больше не ощущает себя мишенью. + Он не был больше ни телом, к которому рано или поздно ..." + // index +++ + */ + +let array = [ + 'Он', + 'был больше ни телом, к которому рано или поздно', + 'он обнаружил', + 'не', + 'Так, когда Будда достиг Просветления', + '...', + 'что больше', + 'ощущает себя мишенью', + 'не' +]; + +let homeSentence = `${array[4]}, ${array[2]}, ${array[6]} ${array[3]} ${array[7]}. ${array[0]} ${array[8]} ${array[1]} ${array[5]}`; +console.log('task2', homeSentence); + + +/* 3. Добавьте свойста 4 новых свойства в объект используя + квадратные скобки и точку. */ + +let myObj = {}; +let eyeColor = 'green'; +myObj.sex = 'male'; +myObj.age = 30; +myObj['hasDog'] = true; +myObj['eyesColor'] = 'green'; + +console.log('task3', myObj); + + +/* 5. Преобразуйте строку x, + в максимально удобно читаемый для программиста вид */ + +let frameworks = [4.7, 'Angular', '6Angular', 'React/Redux']; +let x = + 'google \ +released ' + + 'new version\ + ' + + frameworks[1] + + Math.floor(frameworks[0]) + + '\ +But real speed is ' + + `${frameworks[frameworks.length - 1]}`; + +//console.log(x); + +let helper1 = Math.floor(frameworks[0]); +let helper2 = frameworks[frameworks.length - 1]; + +//console.log(helper1, helper2); + +let y = `google released new version ${frameworks[1]} ${helper1} But real speed is ${helper2}`; +console.log('task5', y); \ No newline at end of file diff --git a/js-core/homeworks/homework-4/index.html b/js-core/homeworks/homework-4/index.html new file mode 100644 index 0000000..ab8c164 --- /dev/null +++ b/js-core/homeworks/homework-4/index.html @@ -0,0 +1,11 @@ + + + + + Home work 4 + + +

      Homework 4

      + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-4/src/main.js b/js-core/homeworks/homework-4/src/main.js new file mode 100644 index 0000000..525d18b --- /dev/null +++ b/js-core/homeworks/homework-4/src/main.js @@ -0,0 +1,188 @@ +/* TASK 1 +* Напишите функцию которая будет принимать 1 аргумент и в зависимости от типа аргумента +* +* Если тип аргумента число или объект -> возвращать true +* Если тип аргумента функция -> возвращать false +* Если тип аргумента Строка и длина этой строки не равна 10 -> возвращать "длина вашей строки: <длина строки> +* Если длина 10 -> 'you win' +* */ +function showMeType(arg) { + let res; + //res = typeof arg === 'number' || typeof arg === 'object' ? true : false; + //return res; + if (typeof arg === 'number' || typeof arg === 'object') { + res = true; + }; + + if (typeof arg === 'function') { + res = false; + }; + + if (typeof arg === 'string' && arg.length != 10) { + res = `Длина Вашей строки: ${arg.length}`; + } else if (arg.length == 10) { + res = `you win`; + } + + return res; +} + +function helper(){ + console.log('I am a helper'); +}; + +console.log('task 1-1 ---->', showMeType(6));//true +console.log('task 1-2 ---->', showMeType([]));//true +console.log('task 1-3 ---->', showMeType({}));//true +console.log('task 1-4 ---->', showMeType(helper));//false +console.log('task 1-5 ---->', showMeType('012345'));//6 +console.log('task 1-6 ---->', showMeType('0123456789'));//you win + +//-------------------------------------------------------------------------------------------- + +/* TASK 2 + 1. Напишите функцию которая принимает 2 числа + и возвращает массив содержащий числа между первым числом и вторым числом; + */ + +function numbersBetween(a, b) { + let arr = []; + for (let i = a; i <= b; i++) { + arr[arr.length] = i; + } + return arr; +} + +console.log('task 2-1 ---->', numbersBetween(3, 5));// 3, 4, 5 +console.log('task 2-2 ---->', numbersBetween(10, 12));// 10, 11, 12 +console.log('task 2-3 ---->', numbersBetween(4, 15));// 4,5,6,7,8,9,10,11,12,13,14,15 + +//------------------------------------------------------------------------------------------------ + +/* TASK 3 + 2. Перепишите задачу FizzBuzz, но с использованием цикла. + Расчет чисел должен идти до 100 + */ + +// 1. FizzBuzz 3, 5, 3 && % 5 + +function FizzBuzz(num) { + let res = ''; + if (num % 3 == 0) { + res += 'Fizz'; + }; + if (num % 5 == 0) { + res += 'Buzz'; + }; + + return res.length == 0 ? num : res; +} + +function FizzBuzz100() { + for (let i = 0; i <= 100; i++) { + console.log('task 3 ----->', FizzBuzz(i)) ; + } +} + +FizzBuzz100(); + +//----------------------------------------------------------------------------- +/* TASK 4 +3. Напишите функцию которая принимает 1 аргумент - массив + И возвращает новый массив содержащий типы значений переменных + + +// let arr = [1, null, undefined, 'str', {}, [], function() {}]; +*/ + +function showTypes(arr){ + let res = []; + for (let i = 0; i < arr.length; i++) { + res[res.length] = typeof arr[i]; + } + return res; +} + +let array = [1, null, undefined, 'str', {}, [], function() {}]; + +console.log('task 4 ---->', showTypes(array)) + +//--------------------------------------------------------------------- + +/* + 1. @@SUPER@@. Вам дан массив array, содержащий внутри объекты. + Напишите функцию которая внутри цикла проходится по каждому элементу массива + И проверяет какой тип данных содержит свойство age, если тип данных NaN, + тогда добавляет данному объекту свойство unknownAge: true + 2. На основании нового массива, создайте новую функцию, которая вернет новый массив + содержащий все объекты содержащие свойство unknownAge: true + */ + +let arr = Array.from({length: 35}, + (value, index) => (index % 2 ? {age: index + 2} : {age: NaN}), +); + +function lookInObject(obj){ + let objKey = obj.age; + if (isNaN(objKey)) { + obj.unknownAge = true; + } + return obj; +/* for (let key in obj) { + if (key == 'age' && isNaN(obj[key])) { + obj.unknownAge = true; + } + + return obj; + }*/ +} + +function makeResultArray(arr) { + let resultArray = []; + for (let i = 0; i < arr.length; i++) { + let obj = arr[i]; + for (let key in obj) { + if (key == 'unknownAge') { + resultArray[resultArray.length] = obj; + } + } + } + + return resultArray; +} + +function solution(arr) { + let newArr = []; + + for (let i = 0; i < arr.length; i++) { + //f (typeof arr[i] != 'object') continue; + + let newElem = lookInObject(arr[i]); + newArr[newArr.length] = newElem; + } + + return makeResultArray(newArr); +} + + +/*let arr = [ + { + age: '25', + job: 'student' + }, + { + age: NaN, + job: 'pilot' + }, + { + age: 40 + }, + 12, + 'some string here', + { + age: NaN, + job: 'student' + }, +];*/ + +console.log(solution(arr)); diff --git a/js-core/homeworks/homework-5/index.html b/js-core/homeworks/homework-5/index.html new file mode 100644 index 0000000..679fdab --- /dev/null +++ b/js-core/homeworks/homework-5/index.html @@ -0,0 +1,11 @@ + + + + + Home work 5 + + +

      Homework 5

      + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-5/src/main.js b/js-core/homeworks/homework-5/src/main.js new file mode 100644 index 0000000..5d48811 --- /dev/null +++ b/js-core/homeworks/homework-5/src/main.js @@ -0,0 +1,159 @@ +/*NASK 1 + 1. Переместите 0 в конец массива, остальные числа должны остаться + неизменными + // concat + example: + [1,false,2,0,3,null,0,4,0,25] => [1, false, 2, 3, null, 4, 25, 0, 0, 0] + [ 'a', 0, 0, 'b', null, 'c', 'd', 0, 1, false, 0, 1, 0, 3, [], 0, 1, 9, 0, 0, {}, 0, 0, 9 ] => ["a","b",null,"c","d",1,false,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0] + [ 0, 1, null, 2, false, 1, 0 ] => [1,null,2,false,1,0,0] + */ + +let arr1 = [1, false, 2, 0, 3, null, 0, 4, 0, 25]; +let arr2 = [ + 'a', + 0, + 0, + 'b', + null, + 'c', + 'd', + 0, + 1, + false, + 0, + 1, + 0, + 3, + [], + 0, + 1, + 9, + 0, + 0, + {}, + 0, + 0, + 9 +]; + +function moveZeroToEnd(arr) { + let zeroArray = []; + + while (arr.indexOf(0) != -1) { + let index = arr.indexOf(0);//will return an index + let element = arr[index]; + arr.splice(index, 1); + zeroArray.push(element); + } + arr = arr.concat(zeroArray); + return arr; + } + +console.log('task 1-1 --->', moveZeroToEnd(arr1)); +console.log('task 1-2 --->', moveZeroToEnd(arr2)); + +/*TASK 2 + 2. Верните сумму двух найменьших чисел в массиве + [10,20,30,1,31,11,10] => 11 + [-1,0,25] => -1 + [-4,-10,25,10] => -14 + [0,200,10,25,15] => 10 + */ +let a = [10,20,30,1,31,11,10]; +let b = [-1,0,25]; +let c = [-4,-10,25,10]; +let d = [0,200,10,25,15]; + +function minimalNumber(arr) { + let sum; + + let newArr = arr.sort(); + sum = newArr[0] + newArr[1]; + + return sum; +} + +console.log('task 2-1 --->', minimalNumber(a)); +console.log('task 2-2 --->', minimalNumber(b)); +console.log('task 2-3 --->', minimalNumber(c)); +console.log('task 2-4 --->', minimalNumber(d)); + +/*TASK 3 + 3. Напишите функцию которая меняет местами имя и фамилию */ + let e = 'john McClane'; //=> "McClane john" + let f ='Arnold Schwarzenegger'; //=> "Schwarzenegger Arnold" + let g = 'James Bond'; //=> "Bond James" + + +/*function nameShuffler(str) { + let arr = str.split(' '); + let res = ''; + res = arr[1] + ' ' + arr[0]; + return res; +}*/ + +function nameShuffler(str) { + + let arr = str.split(' '); + arr = arr.reverse(); + let res = ''; + res = arr.join(' '); + return res; + +} + +console.log('task 3-1 --->', nameShuffler(e)); +console.log('task 3-2 --->', nameShuffler(f)); +console.log('task 3-3 --->', nameShuffler(g)); + +/* + // TASK 4 + 4. Напишите функцию которая принимает массив с именами и возвращает массив + в котором каждая буква становится заглавной + capMe(['jo', 'nelson', 'jurie']) // returns ['Jo', 'Nelson', 'Jurie'] + capMe(['KARLY', 'DANIEL', 'KELSEY']) // returns ['Karly', 'Daniel', 'Kelsey'] + */ + +function capMe(arr) { + + for (let i = 0; i < arr.length; i++) { + let element = arr[i]; + element = element.toLowerCase(); + //element = element[0].toUpperCase(); + //console.log(element); + elementArr = element.split(''); + + let newElement = toUpper(elementArr); + arr.splice(i, 1, newElement); + } + + return arr; +} + +function toUpper(arr){ + let firstLetter = arr[0].toUpperCase(); + arr.splice(0, 1, firstLetter); + let res = arr.join(''); + return res; +} + +console.log('task 4-1 --->', capMe(['jo', 'nelson', 'jurie'])) // returns ['Jo', 'Nelson', 'Jurie'] +console.log('task 4-2 --->', capMe(['KARLY', 'DANIEL', 'KELSEY'])) // returns ['Karly', 'Daniel', 'Kelsey'] + +// @SUPER +/* + 1. Найдите число отсутствующее в заданной последовательности + example: + [1,3,5,9] => 7 (9-1) / 4 == 2 + [0,8,16,32] => 24 + [4, 6, 8, 10] => 2 // число сначала + [0,16,24,32] => 8 + */ + +function random(arr) { +} + +random([1, 3, 5, 9]); +random([0, 8, 16, 32]); +random([0, 16, 24, 32]); +random([4, 6, 8, 10]); \ No newline at end of file diff --git a/js-core/homeworks/homework-6/index.html b/js-core/homeworks/homework-6/index.html new file mode 100644 index 0000000..877afe9 --- /dev/null +++ b/js-core/homeworks/homework-6/index.html @@ -0,0 +1,11 @@ + + + + + Home work 6 + + +

      Homework 6

      + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-6/src/main.js b/js-core/homeworks/homework-6/src/main.js new file mode 100644 index 0000000..619a7f8 --- /dev/null +++ b/js-core/homeworks/homework-6/src/main.js @@ -0,0 +1,338 @@ + /** TASK 1 + * Посчитайте количество букв а, в передаваемом параметре + * + * */ + +let randomString = 'aaa b a w c '; + +let user = { + name: 'Albina', +}; + +let javaScript = { + html: 'JavaScript', +}; + +/*function countLetterA(str) { + let counter = 0; + let arr = str.toLowerCase().split(''); + console.log(arr); + arr.forEach((item) => { + if (item == 'a') { + counter++; + }; + }) + + return counter; +}*/ + +function countLetterA(str) { + let arr = str.toLowerCase().split(''); + let counter = arr.reduce((newItem, item) => { + if (item == 'a') { + newItem++; + }; + return newItem; + }, 0); + +return counter; +} + +console.log('task 1-1 ---->', countLetterA(randomString)); // 4 +console.log('task 1-2 ---->', countLetterA(user.name + javaScript.html)); // 3 //4 +//------------------------------------------------------------------ + +/* + * + * TASK 2 + * Вам дано предложение, вам необходимо перевернуть каждое + * слово в предложении в обратном порядке + * + * */ +//1. Разбить предложение на массив по пробелу +//2. взять каждый элемент массива и тоже разбить на массив по '' +//3. Применить метод реверс на каждом слове +//4. Собрать получившийся массив опять в строку +function reverseEachWord(str) { + let strArr = str.split(' '); + let word = strArr.map((item) => { + return item.split('').reverse().join(''); + }) + return word.join(' '); +} + +console.log('task 2-1 ---->', reverseEachWord('You don\'t have to do anything special to begin using the DOM. Different browsers have different implementations of the DOM')); +// uoY t'nod evah ot od gnihtyna laiceps ot nigeb gnisu eht .MOD tnereffiD sresworb evah tnereffid snoitatnemelpmi fo eht MOD + +console.log('task 2-2 ---->', reverseEachWord('The Document Object Model (DOM) is a programming interface for HTML and XML documents')); +// ehT tnemucoD tcejbO ledoM )MOD( si a gnimmargorp ecafretni rof LMTH dna LMX stnemucod + + +/* + * TASK 3 + * Добавьте в функцию reverseEachWord второй параметр, + * данный параметр булево, если true - тогда предложение так же + * переворачиваются в обратном порядке + * */ +function reverseEachWord2(str, shouldSentenceBeReversed) { + let strArr = str.split(' '); + let word = strArr.map((item) => { + return item.split('').reverse().join(''); + }) + if (shouldSentenceBeReversed) { + return word.reverse().join(' '); + } + return word.join(' '); +} + +console.log('task 3-1 ---->', reverseEachWord2('You don\'t have to do anything special to begin using the DOM. Different browsers have different implementations of the DOM', true)); +//MOD eht fo snoitatnemelpmi tnereffid evah sresworb tnereffiD .MOD eht gnisu nigeb ot laiceps gnihtyna od ot evah t'nod uoY +console.log('task 3-2 ---->', reverseEachWord2('The Document Object Model (DOM) is a programming interface for HTML and XML documents', true)); +// stnemucod LMX dna LMTH rof ecafretni gnimmargorp a si )MOD( ledoM tcejbO tnemucoD ehT +console.log('task 3-3 ---->', reverseEachWord2('Hi my Name is', false)); +// iH ym emaN si + + +/* TASK 4 + * Посчитайте сколько одинаковых слов в предложении. + * Функция должна возвращать объект у которого свойства + * это повторяющиеся слово, + * а значение это количество повторений + * */ + +// Both - Java - and - Java - Script - is - programming - and - programming - OOPBased +function wordCounter(sentence) { + let arr = sentence.split(' '); + let obj = arr.reduce((newItem, item) => { + let sentenceItem = item; + let counter = 0; + + arr.forEach((item) => { + if (sentenceItem === item) { + counter++; + } + }); + + newItem[sentenceItem] = counter; + return newItem; + + }, {}); + + return obj; +} + +console.log('task 4-1 ---->', + wordCounter('Both Java and Java Script is programming and programming OOPBased Language'), +); + +/* + { + Both:1, + Java:2, + and:2, + Script: 1, + is: 1 + programming: 2 + OOPBased:1, + Language:1 + } + */ + +console.log('task 4-2 ---->', wordCounter('asd qwe asd')); +/* + { + asd:2 + qwe:1 + } + * */ + +console.log('task 4-3 ---->', wordCounter('url http url www url http')); +/* + { + http:2, + url:3, + www:1 + } + * */ + + + /* + TASK 4 + // Функция принимает массив у которого есть свойста _id и Company. + // верните объект, у которого ключ это _id, а значение Company + */ +let listOfCompanys = [ + { + company: 'ASIMILINE', + name: { + last: 'Watkins', + first: 'Lindsay', + }, + eyeColor: 'brown', + age: 20, + picture: 'http://placehold.it/32x32', + balance: '$1,091.09', + isActive: true, + guid: '294814e3-4c89-428f-b0c9-da5c4c37ea5e', + index: 0, + _id: '584babb6eeb4137cf14c37a3', + }, + { + company: 'ENJOLA', + name: { + last: 'Price', + first: 'Greene', + }, + eyeColor: 'brown', + age: 39, + picture: 'http://placehold.it/32x32', + balance: '$3,533.55', + isActive: true, + guid: 'e7b0824f-d6d1-4a82-b2c5-cd7a1ec8310c', + index: 1, + _id: '584babb6c7be9c2398ed263f', + }, + { + company: 'ZINCA', + name: { + last: 'Robertson', + first: 'Barbara', + }, + eyeColor: 'brown', + age: 22, + picture: 'http://placehold.it/32x32', + balance: '$1,395.22', + isActive: false, + guid: '0735d8d9-a165-4ad1-893f-e821da37bf63', + index: 2, + _id: '584babb6cca4dbefa6001820', + }, + { + company: 'TALKOLA', + name: { + last: 'Cooke', + first: 'Lea', + }, + eyeColor: 'blue', + age: 31, + picture: 'http://placehold.it/32x32', + balance: '$3,074.16', + isActive: false, + guid: '7d13cbc4-6b4d-4954-b3d3-df3cfe5f2373', + index: 3, + _id: '584babb6391a2b568f1e9416', + }, + { + company: 'GEEKKO', + name: { + last: 'Webb', + first: 'Kline', + }, + eyeColor: 'blue', + age: 34, + picture: 'http://placehold.it/32x32', + balance: '$1,520.21', + isActive: false, + guid: '2b179de0-a659-4423-b3c4-11c6490e5c74', + index: 4, + _id: '584babb66d6ea73e8ed51208', + }, +]; + + // Функция принимает массив у которого есть свойста _id и Company. + // верните объект, у которого ключ это _id, а значение Company + +function createHashTags(arr) { + let obj = arr.reduce((newItem, item) => { + let id = item._id; + let value = item.company + newItem[id] = value; + return newItem; + }, {}) + + return obj; +} + +console.log('task 5-1 ---->', createHashTags(listOfCompanys)); +//{"584babb6eeb4137cf14c37a3":"ASIMILINE", '584babb6eeb4137cf14c37a3':'Company2', } + +// @ SUPER +/* + * + * TASK 1 + * Выведите уникальные значения + * + * */ + +function uniqueElements(arr) { + let obj = arr.reduce((newItem, item) => { + let str = item; + newItem[str] = true; + return newItem; + }, {}); + + return Object.keys(obj); +} + +/*function uniqueElements2(arr) { + let fillteredArr = arr.filter((item, i) => { + + let item = true; + + }) + return fillteredArr; +}*/ + +// +let notUniqArray = [1, 1, 2, 2, 2, 5, 10, 25, 30, 5, 1, 0, 22, 3, 10, 3]; +// +console.log('task super 1-1 ---->',uniqueElements(notUniqArray)); //1,2,5,10,25,30,0,22,3, +console.log('task super 1-2 ---->',uniqueElements([1, 1, 2, 3, 3])); // 1,2,3 +//console.log('task super 1-3 ---->',uniqueElements2(notUniqArray)); //1,2,5,10,25,30,0,22,3, +//console.log('task super 1-4 ---->',uniqueElements2([1, 1, 2, 3, 3])); // 1,2,3 +/* +* +* super2 +* +* implement array method filter function +So you have to create reusable filter function, which can be applied to an array, +and callback function makes a decision to leave that variable inside an array or not +*/ + +function filter(array, callback) { + let result = []; + for (let i = 0; i < array.length; i++){ + let item = array[i]; + let decision = callback(item); + if (decision) { + result.push(decision); + }; + } + return result; +}; + +function makeDecision(item) { + if (item) { + return item; + } + return false; +}; + + +let array = [1, 10, 0, 'qwerty', null, undefined, [], {}, '', false, true, NaN, -20, ' ']; + +/*function filterArr(arr){ + let result = []; + + for (let i = 0; i < arr.length; i++) { + let item = arr[i]; + if (item === NaN || item === 0 || item === undefined || item === false || item === null || item === '' ) { + continue; + } + result.push(item); + } + return result; +};*/ + +//console.log(filterArr(array));//[1, 10, "qwerty", Array(0), {…}, true, NaN, -20, " "] +console.log(filter(array, makeDecision));//[1, 10, "qwerty", Array(0), {…}, true, -20, " "] \ No newline at end of file diff --git a/js-core/homeworks/homework-8/index.html b/js-core/homeworks/homework-8/index.html new file mode 100644 index 0000000..f9bce3c --- /dev/null +++ b/js-core/homeworks/homework-8/index.html @@ -0,0 +1,12 @@ + + + + + Lesson_8 + + +

      Hello world 8

      + + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-8/main.js b/js-core/homeworks/homework-8/main.js new file mode 100644 index 0000000..b84ba5d --- /dev/null +++ b/js-core/homeworks/homework-8/main.js @@ -0,0 +1,250 @@ +'use strict'; + +/* + * TASK 1---------------------------------------------- + * Создайте функцию которая будет запоминать переданные + * ей аргументы, и прибавлять их в строку + * и отображать в консоле всю строку + * */ + +function solution1() { + let str = ''; + return function(value){ + return str += `${value} `; + } +} + +let stringBuffer = solution1(); + +console.log('task 1-1--->', stringBuffer('Замыкания')); // Замыкания +console.log('task 1-2--->', stringBuffer('Использовать нужно')); // Замыкания Использовать нужно +console.log('task 1-3--->', stringBuffer('Привет')); // Замыкания Использовать нужно Привет вызываем много раз + +/* + * TASK 2-------------------------------------------------- + * Напишите функцию которая принимает в качестве аргумента строку + * из скобочек и посчитайте, что все скобочки закрываются корректно + * */ +// +//если в строке нечетное количество символов, вернуть false +// +// +// +function validBraces(str) { /// тут не смогла вовремя выйти из рекурсии)) + let etalon = ['()','{}','[]']; + let iterations = str.length /2; + //console.log(iterations); + if (str.length % 2 != 0) { + return false; + + } else { + + etalon.some((item) => { + + if (str.includes(item)) { + str = str.replace(item, ''); + if (str.length == 0){ + return str; + }; + if (iterations > 1) { + validBraces(str); + }; + + } else { + return; + } + //return str; + }); + + console.log(str); + if (str.length > 0) { + return false + } else { + return true + } + + } + +} + +//console.log('task 2-1--->', validBraces('(){}[]')); // => returns true +//console.log('task 2-2--->', validBraces('(}')); // => returns false +//console.log('task 2-3--->', validBraces('[(])')); // => returns false +console.log('task 2-4--->', validBraces('([{}])')); // => returns true +//console.log('task 2-5--->', validBraces('({[]})')); // => returns true +//console.log('task 2-6--->', validBraces('({[]}')); // => returns true + +// @SUPER TASK 3 --------------------------------------------------- + +/* + * + * Напишите функцию которая будет принимать одно число и выводить сумму + * всех натуральных чисел + * sum(5) // 5+4+3+2+1 + * + * Вычисления должны кешироваться, если в функцию попадает закешированное + * значение, в консоле должно отобразиться + * Значение взято из кэша + * + * Нельзя использовать внешние значения/переменные/функции + * + * */ + +function sum(num) { + +} + +sum(5); // 15 Значение кешировано +sum(5); // 15 Значение взято из кэш + +sum(6); // 21 Кешировано +sum(6); // 21 Значение взято из кэша + + +// TASK 4------------------------------------------------------------------- +//У нас есть массив объектов: + +var users = [{ + name: "Вася", + surname: 'Иванов', + age: 20 +}, { + name: "Петя", + surname: 'Чапаев', + age: 25 +}, { + name: "Маша", + surname: 'Медведева', + age: 18 +}]; +//Обычно сортировка по нужному полю происходит так: + +// по полю name (Вася, Маша, Петя) +users.sort(function(a, b) { + return a.name > b.name ? 1 : -1; +}); + +// по полю age (Маша, Вася, Петя) +users.sort(function(a, b) { + return a.age > b.age ? 1 : -1; +}); +//Мы хотели бы упростить синтаксис до одной строки, вот так: + +users.sort(byField('name')); +users.forEach(function(user) { + //alert( user.name ); +}); // Вася, Маша, Петя + +users.sort(byField('age')); +users.forEach(function(user) { + //alert( user.name ); +}); // Маша, Вася, Петя + + +//То есть, вместо того, чтобы каждый раз писать в sort function... – будем использовать byField(...) + +//Напишите функцию byField(field), которую можно использовать в sort для сравнения объектов по полю field, чтобы пример выше заработал. +function byField(field){ //возвращает функцию, которая принимает a и b + return function(a, b) { + return a[field] > b[field] ? 1 : -1; + } + +} + +//TASK 5 -------------------------------------- +//Как в функции отличить отсутствующий аргумент от undefined? +// выведите 1, если первый аргумент есть, и 0 - если нет +function f(x) { + let arr = [...arguments]; + if (arr.length) { + return 1; + } else { + return 0; + } +} + +console.log('task 5-1--->',f(undefined)); // 1 +console.log('task 5-2--->',f()); // 0 + +//TASK6 --------------------------------------- +//Создайте функцию filter(arr, func), которая получает массив arr и возвращает новый, +//в который входят только те элементы arr, для которых func возвращает true. + +//Создайте набор «готовых фильтров»: inBetween(a,b) – «между a,b», +//inArray([...]) – "в массиве [...]". Использование должно быть таким: +//filter(arr, inBetween(3,6)) – выберет только числа от 3 до 6, +//filter(arr, inArray([1,2,3])) – выберет только элементы, совпадающие с одним из значений массива. + +function filter(arr, callback){ + let filteredArr = []; + for (let i = 0; i < arr.length; i++){ + let item = arr[i]; + let decision = callback(item);//сюда приходит function(item){ + //if (item >= start && item <= end) { + // return item; + //} + //return; + if (decision) { + filteredArr.push(item); + } + } + return filteredArr; +} + +function inBetween (start, end){ + + return function(item){ + if (item >= start && item <= end) { + return item; + } + return; + } + +} + +function inArray(arr){//[1, 2, 10] + return function(item){//0 + return arr.indexOf(item) != -1; + } +} + +var arr = [1, 2, 3, 4, 5, 6, 7]; + +console.log('task 6-1--->', filter(arr, function(a) { + return a % 2 == 0 +})); // 2,4,6 + +console.log('task 6-2--->', filter(arr, inBetween(3, 6)) ); // 3,4,5,6 + +console.log('task 6-3--->', filter(arr, inArray([1, 2, 10])) ); // 1,2 + +//TASK 7 SHOOTERS---------------------------------- +//Следующий код создает массив функций-стрелков shooters. По замыслу, каждый стрелок должен выводить свой номер: + + function makeArmy() { + + let shooters = []; + + for (let i = 0; i < 10; i++) { + + let shooter = function one() { // функция-стрелок //подсмотрела, разобралась + console.log(one.num); // выводит свой номер + }; + shooter.num = i; + + shooters.push(shooter); + } + + return shooters; +} + +var army = makeArmy();// сюда приходит массив функций shooters + console.log(army); + +army[0](); // стрелок выводит 10, а должен 0 +army[1](); // стрелок выводит 10... +army[5](); // стрелок выводит 10, а должен 0 +army[7](); // стрелок выводит 10... +// .. все стрелки выводят 10 вместо 0,1,2...9 +//Почему все стрелки́ выводят одно и то же? Поправьте код, чтобы стрелки работали как задумано. +//Предложите несколько вариантов исправления. \ No newline at end of file diff --git a/js-core/homeworks/homework-9/index.html b/js-core/homeworks/homework-9/index.html new file mode 100644 index 0000000..71e08e8 --- /dev/null +++ b/js-core/homeworks/homework-9/index.html @@ -0,0 +1,12 @@ + + + + + Homework 9 + + +

      Homework 9

      + + + + \ No newline at end of file diff --git a/js-core/homeworks/homework-9/main.js b/js-core/homeworks/homework-9/main.js new file mode 100644 index 0000000..88a50ed --- /dev/null +++ b/js-core/homeworks/homework-9/main.js @@ -0,0 +1,284 @@ +// TASK 1----------------------------------------------------- +//Отобразите достаточно ли у developers навыков ? +// Отобразите всех разработчиков и вызовете у каждого +// разработчика метод goodDev -- +/* + * Количество требований к разработчику совпадает с его навыками. + * Используйте в задаче this + * */ + +let developer1 = { + skills: ['JavaScript', 'linux', 'html', 'OOP', 'Node.js'], + requirements: ['Node.js', 'JavaScript', 'OOP', 'mongo'], + goodDev: goodDev +}; +let developer2 = { + experience: [ + { technology: 'java' }, + { technology: 'c++' }, + { technology: 'aws' }, + { technology: 'docker' } + ], + requirements: ['java', 'json', 'c++', 'JavaScript'], + goodDev: goodDev +}; + +//иду по массиву требований, беру каждый элемент массива +//и смотрю в массив скилов - есть ли там такой скилл? +//Если есть - возвращаю саксесс +//если нет - фейл + +function goodDev(dev) { + //console.log(this); + let skills = this.skills || this.experience; + + this.requirements.forEach((requireItem) => { + let isConsist = skills.some((skillItem) => { + if (typeof skillItem === 'object') { + skillItem = skillItem.technology; + } + return requireItem == skillItem;//false or true + }) + // res = isConsist ? `required: ${requireItem} ...success` : `required: ${requireItem} ...fail` + + if (isConsist) { + console.log(`required: ${requireItem} ...success`);// как сделать без консоль лога, а с ретерном? + } else { + console.log(`required: ${requireItem} ...fail`); + } + + }) + +} + +// developer 1 +// required: Node.js ... success +// required: JavaScript ... success +// required: OOP ... success +// --- + +// developer 2 +// required: json ... fail +// required: JavaScript ... success +// required: Java ... success +// required: OOP ... success + +//goodDev(developer1); +//goodDev(developer2); + +developer1.goodDev(); +developer2.goodDev(); + +/* + * TASK 2---------------------------------------- + * + * Напишите функцию принимает 1 аргумент сортирует объект по + * переданному значению (например age или name) + * + * При вызове функции используйте this + * */ + +let myObject = { + database: [ + { + age: 100, + name: 'b' + }, + { + age: 15, + name: 'c' + }, + { + age: 25, + name: 'a' + } + ] + +}; +//тут не понятно, в консоли выводит 2 раза одинаково отсортированные массивы по name, +//хотя если смотреть в дебаггере, то все происходит верно +//и в консоль выводятся 2 разных правильно отсортированных массива +myObject.myFilter = function(param) { + + let sortedArr = this.database.sort(compare); + + function compare(a, b){ + if (isNaN(a[param])) { + + if (a[param] > b[param]) { + return 1; + }; + if (a[param] < b[param]) { + return -1; + }; + if (a[param] == b[param]) { + return 0; + } + + } else { + return (a[param] - b[param]); + } + + } + + return sortedArr; +}; + + +// {age:15, name:'c'}, {age:25, name:'a'} {age:100, name:'b'} +console.log('sort by age', myObject.myFilter('age')); + +// {age:25, name:a}, {age:100, name: b} ... +console.log('sort by name', myObject.myFilter('name')); + +/* + * TASK 3---------------------------------------------------------- + * + * Перепишите homework 5 с использованием методов массивов и + * => arrow functions + * +*/ + +/*TASK 1 + 1. Переместите 0 в конец массива, остальные числа должны остаться + неизменными + // concat + example: + [1,false,2,0,3,null,0,4,0,25] => [1, false, 2, 3, null, 4, 25, 0, 0, 0] + [ 'a', 0, 0, 'b', null, 'c', 'd', 0, 1, false, 0, 1, 0, 3, [], 0, 1, 9, 0, 0, {}, 0, 0, 9 ] => ["a","b",null,"c","d",1,false,1,3,[],1,9,{},9,0,0,0,0,0,0,0,0,0,0] + [ 0, 1, null, 2, false, 1, 0 ] => [1,null,2,false,1,0,0] + */ + +let arr1 = [1, false, 2, 0, 3, null, 0, 4, 0, 25]; +let arr2 = [ + 'a', + 0, + 0, + 'b', + null, + 'c', + 'd', + 0, + 1, + false, + 0, + 1, + 0, + 3, + [], + 0, + 1, + 9, + 0, + 0, + {}, + 0, + 0, + 9 +]; + +function moveZeroToEnd(arr) { + let zeroArray = []; + let numberArray = []; + + arr.forEach((item) => { + if (item === 0) { + zeroArray.push(item); + return;//переход на следующую итерацию + } + numberArray.push(item); + + }) + return numberArray.concat(zeroArray); +} +console.log('task 1-1 --->', moveZeroToEnd(arr1)); +console.log('task 1-2 --->', moveZeroToEnd(arr2)); + +/*TASK 2 + 2. Верните сумму двух найменьших чисел в массиве + [10,20,30,1,31,11,10] => 11 + [-1,0,25] => -1 + [-4,-10,25,10] => -14 + [0,200,10,25,15] => 10 + */ +let a = [10,20,30,1,31,11,10]; +let b = [-1,0,25]; +let c = [-4,-10,25,10]; +let d = [0,200,10,25,15]; + +function minimalNumber(arr) { + let sum; + + let newArr = arr.sort((a, b) => { + return (a - b); + }); + + sum = newArr[0] + newArr[1]; + return sum; +} + +console.log('task 2-1 --->', minimalNumber(a)); +console.log('task 2-2 --->', minimalNumber(b)); +console.log('task 2-3 --->', minimalNumber(c)); +console.log('task 2-4 --->', minimalNumber(d)); + + +/*TASK 3 - ТУТ ВРОДЕ БЫ НЕЧЕГО ПЕРЕПИСЫВАТЬ С МЕТОДАМИ МАССИВА И СТРЕЛОЧНЫМИ ФУНКЦИЯМИ + 3. Напишите функцию которая меняет местами имя и фамилию */ + let e = 'john McClane'; //=> "McClane john" + let f ='Arnold Schwarzenegger'; //=> "Schwarzenegger Arnold" + let g = 'James Bond'; //=> "Bond James" + +function nameShuffler(str) { + + let arr = str.split(' '); + arr = arr.reverse(); + let res = ''; + res = arr.join(' '); + return res; +} + +console.log('task 3-1 --->', nameShuffler(e)); +console.log('task 3-2 --->', nameShuffler(f)); +console.log('task 3-3 --->', nameShuffler(g)); + +/* + // TASK 4 + 4. Напишите функцию которая принимает массив с именами и возвращает массив + в котором каждая буква становится заглавной + capMe(['jo', 'nelson', 'jurie']) // returns ['Jo', 'Nelson', 'Jurie'] + capMe(['KARLY', 'DANIEL', 'KELSEY']) // returns ['Karly', 'Daniel', 'Kelsey'] + */ + +/*function capMe(arr) { + + for (let i = 0; i < arr.length; i++) { + let element = arr[i]; + element = element.toLowerCase(); + elementArr = element.split(''); + + let newElement = toUpper(elementArr); + arr.splice(i, 1, newElement); + } + + return arr; +} + +function toUpper(arr){ + let firstLetter = arr[0].toUpperCase(); + arr.splice(0, 1, firstLetter); + let res = arr.join(''); + return res; +}*/ + +function capMe(arr) { + let capitalized = arr.map((item) => { + let loweredItem = item.toLowerCase(); + let firstLetter = loweredItem[0].toUpperCase(); + return firstLetter + loweredItem.slice(1); + }) + return capitalized; +} + +console.log('task 4-1 --->', capMe(['jo', 'nelson', 'jurie'])) // returns ['Jo', 'Nelson', 'Jurie'] +console.log('task 4-2 --->', capMe(['KARLY', 'DANIEL', 'KELSEY'])) // returns ['Karly', 'Daniel', 'Kelsey'] From 5d8cc4285b2e0677e19c84adc9e176a6aab16999 Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sat, 21 Jul 2018 16:59:47 +0300 Subject: [PATCH 07/19] phoneApp was moved --- {js-core/phoneApp => phoneApp}/css/main.css | 0 {js-core/phoneApp => phoneApp}/index.html | 0 {js-core/phoneApp => phoneApp}/main.js | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {js-core/phoneApp => phoneApp}/css/main.css (100%) rename {js-core/phoneApp => phoneApp}/index.html (100%) rename {js-core/phoneApp => phoneApp}/main.js (100%) diff --git a/js-core/phoneApp/css/main.css b/phoneApp/css/main.css similarity index 100% rename from js-core/phoneApp/css/main.css rename to phoneApp/css/main.css diff --git a/js-core/phoneApp/index.html b/phoneApp/index.html similarity index 100% rename from js-core/phoneApp/index.html rename to phoneApp/index.html diff --git a/js-core/phoneApp/main.js b/phoneApp/main.js similarity index 100% rename from js-core/phoneApp/main.js rename to phoneApp/main.js From f874edd94e5cfca172e03ac58d916d0dde2e1e8d Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sat, 21 Jul 2018 22:35:21 +0300 Subject: [PATCH 08/19] contacts page was virtualized --- phoneApp/contacts.html | 18 ++ phoneApp/contacts.js | 453 +++++++++++++++++++++++++++++++++++++++++ phoneApp/main.js | 180 ---------------- 3 files changed, 471 insertions(+), 180 deletions(-) create mode 100644 phoneApp/contacts.html create mode 100644 phoneApp/contacts.js diff --git a/phoneApp/contacts.html b/phoneApp/contacts.html new file mode 100644 index 0000000..218bde8 --- /dev/null +++ b/phoneApp/contacts.html @@ -0,0 +1,18 @@ + + + + + + + Contacts + + + + + + + + + + + \ No newline at end of file diff --git a/phoneApp/contacts.js b/phoneApp/contacts.js new file mode 100644 index 0000000..97488f4 --- /dev/null +++ b/phoneApp/contacts.js @@ -0,0 +1,453 @@ +'use strict'; +/////RENDER CONTACTS PAGE////////////////////////////////////////////// +/*class ContactsPage { + constructor(){ + this.tableCaptions = ['Name', 'Last name', 'Email']; + this.people = [ + { + name: 'Иван', + lastName: 'Петров', + email: 'IvanPetrov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Сергеев', + email: 'SergeiSergeev@ec.ua' + }, + { + name: 'Иван', + lastName: 'Иванов', + email: 'IvanIvanov@ec.ua' + }, + { + name: 'Александр', + lastName: 'Александров', + email: 'AlexAlex@ec.ua' + }, + { + name: 'Алекс', + lastName: 'Смирнов', + email: 'AlexSmirnov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Волков', + email: 'VolkovSergey@ec.ua' + }, + { + name: 'Мария', + lastName: 'Шарапова', + email: 'MariyaSharapova@ec.ua' + }, + { + name: 'Александр', + lastName: 'Винник', + email: 'AlexVinnik@ec.ua' + }, + { + name: 'Дарий', + lastName: 'Смирнов', + email: 'DariySmirnov@ec.ua' + }, + { + name: 'Елена', + lastName: 'Лещенко', + email: 'ElenaLeshenko@ec.ua' + }, + { + name: 'Ольга', + lastName: 'Новикова', + email: 'OlgaNovikova@ec.ua' + }, + { + name: 'Наталья', + lastName: 'Шемякина', + email: 'ShemyakinaN@ec.ua' + }, + { + name: 'Анна', + lastName: 'Донцова', + email: 'AnnaDontsova@ec.ua' + }, + { + name: 'Влад', + lastName: 'Яма', + email: 'VladYama@ec.ua' + }, + { + name: 'Кира', + lastName: 'Воробьева', + email: 'Kira1990@ec.ua' + }, + { + name: 'Виктор', + lastName: 'Кривенко', + email: 'ViktorKriv@ec.ua' + } + ]; + this.footerContent = [ + { + classImg: 'search', + text: 'Contacts', + href: 'index.html', + additionalClass: 'active' + }, + { + classImg: 'th', + text: 'Keypad', + href: 'keypad.html', + additionalClass: '' + }, + { + classImg: 'pencil', + text: 'Edit contact', + href: 'edit-contact.html', + additionalClass: '' + }, + { + classImg: 'user', + text: 'User', + href: 'user.html', + additionalClass: '' + }, + { + classImg: 'plus', + text: 'Add user', + href: 'add-user.html', + additionalClass: '' + } + ]; + this.body = document.body; + + this.render(); + } + + createEl(tagName, tagContent){ + //return `<${tagName}>`; + let newEl = document.createElement(tagName); + if (tagContent) { + newEl.textContent = tagContent; + }; + return newEl; + } + + renderHeader(){ + let header = this.createEl('header'); + header.setAttribute('class', 'header'); + this.body.appendChild(header); + + let headerDiv = this.createEl('div'); + headerDiv.setAttribute('class', 'container top-radius'); + header.appendChild(headerDiv); + + let headerH2 = this.createEl('h2', 'Contacts'); + headerDiv.appendChild(headerH2); + } + + renderMain(){ + let main = this.createEl('main'); + this.body.appendChild(main); + + let mainDiv = this.createEl('div'); + mainDiv.setAttribute('class', 'container mainDiv'); + main.appendChild(mainDiv); + + this.mainDivInserted = document.querySelector('.mainDiv'); + this.mainDivInserted.innerHTML = this.renderForm(); + + this.renderTable(); + } + + renderForm(){ // может надо было тоже через createElement? Как понять, что нужно через createElement, а что просто кусками верстки? + return `
      +
      + + +
      +
      `; + } + + renderTable(){ + let table = this.createEl('table'); + table.setAttribute('class', 'table table-hover contacts'); + this.mainDivInserted.appendChild(table); + + let tableHead = this.createEl('thead'); + table.appendChild(tableHead); + + let tableBody = this.createEl('tbody'); + table.appendChild(tableBody); + + document.querySelector('thead').innerHTML = this.createTableHeadRow(this.tableCaptions); + document.querySelector('tbody').innerHTML += this.createTableBodyRow(this.people); + + } + + createTableHeadRow(arr){ + let items = arr.map(item => { + return `${item}` + + }).join(''); + + return ` + ${items} + ` + } + + createTableBodyRow(arr){ + return arr.map(item => { + return ` + ${item.name} + ${item.lastName} + ${item.email} + `; + }).join(''); + } + + renderFooter(){ + let footer = this.createEl('footer'); + footer.setAttribute('class', 'footer'); + this.body.appendChild(footer); + + let footerDiv = this.createEl('div'); + footerDiv.setAttribute('class', 'container bottom-radius'); + footer.appendChild(footerDiv); + + let footerNav = this.createEl('nav'); + footerNav.setAttribute('class', 'main-nav'); + footerDiv.appendChild(footerNav); + + document.querySelector('.main-nav').innerHTML += this.createLinks(this.footerContent); + } + + createLinks(arr){ + return arr.map(item => { + return ` + + ${item.text} + `; + }).join(''); + + } + + render(){ + this.renderHeader(); + this.renderMain(); + this.renderFooter(); + } + +} + +const contactsPage = new ContactsPage();*/ + + +//------------------------ THE SECOND VARIANT - I LIKE IT MORE ------------------------------// + +class ContactsPage2 { + constructor(){ + this.tableCaptions = ['Name', 'Last name', 'Email']; + this.people = [ + { + name: 'Иван', + lastName: 'Петров', + email: 'IvanPetrov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Сергеев', + email: 'SergeiSergeev@ec.ua' + }, + { + name: 'Иван', + lastName: 'Иванов', + email: 'IvanIvanov@ec.ua' + }, + { + name: 'Александр', + lastName: 'Александров', + email: 'AlexAlex@ec.ua' + }, + { + name: 'Алекс', + lastName: 'Смирнов', + email: 'AlexSmirnov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Волков', + email: 'VolkovSergey@ec.ua' + }, + { + name: 'Мария', + lastName: 'Шарапова', + email: 'MariyaSharapova@ec.ua' + }, + { + name: 'Александр', + lastName: 'Винник', + email: 'AlexVinnik@ec.ua' + }, + { + name: 'Дарий', + lastName: 'Смирнов', + email: 'DariySmirnov@ec.ua' + }, + { + name: 'Елена', + lastName: 'Лещенко', + email: 'ElenaLeshenko@ec.ua' + }, + { + name: 'Ольга', + lastName: 'Новикова', + email: 'OlgaNovikova@ec.ua' + }, + { + name: 'Наталья', + lastName: 'Шемякина', + email: 'ShemyakinaN@ec.ua' + }, + { + name: 'Анна', + lastName: 'Донцова', + email: 'AnnaDontsova@ec.ua' + }, + { + name: 'Влад', + lastName: 'Яма', + email: 'VladYama@ec.ua' + }, + { + name: 'Кира', + lastName: 'Воробьева', + email: 'Kira1990@ec.ua' + }, + { + name: 'Виктор', + lastName: 'Кривенко', + email: 'ViktorKriv@ec.ua' + } + ]; + this.footerContent = [ + { + classImg: 'search', + text: 'Contacts', + href: 'index.html', + additionalClass: 'active' + }, + { + classImg: 'th', + text: 'Keypad', + href: 'keypad.html', + additionalClass: '' + }, + { + classImg: 'pencil', + text: 'Edit contact', + href: 'edit-contact.html', + additionalClass: '' + }, + { + classImg: 'user', + text: 'User', + href: 'user.html', + additionalClass: '' + }, + { + classImg: 'plus', + text: 'Add user', + href: 'add-user.html', + additionalClass: '' + } + ]; + + this.render(); + } + + renderHeader(){ + return `
      +
      +

      Contacts

      +
      +
      `; + } + + renderMain(){ + let form = this.renderForm(); + let table = this.renderTable(); + + return `
      +
      + ${form} + ${table} +
      +
      `; + } + + renderForm(){ + return `
      +
      + + +
      +
      `; + } + + renderTable(){ + let tableHead = this.createTableHeadRow(this.tableCaptions); + let tableBody = this.createTableBodyRow(this.people); + + return ` + ${tableHead} + ${tableBody} +
      `; + } + + createTableHeadRow(arr){ + let items = arr.map(item => { + return `${item}` + + }).join(''); + + return ` + ${items} + ` + } + + createTableBodyRow(arr){ + return arr.map(item => { + return ` + ${item.name} + ${item.lastName} + ${item.email} + `; + }).join(''); + } + + renderFooter(){ + let links = this.createLinks(this.footerContent) + return `
      +
      + +
      +
      ` + } + + createLinks(arr){ + return arr.map(item => { + return ` + + ${item.text} + `; + }).join(''); + } + + render(){ + document.body.innerHTML = this.renderHeader() + this.renderMain() + this.renderFooter(); + } + +} + +const contactsPage2 = new ContactsPage2(); \ No newline at end of file diff --git a/phoneApp/main.js b/phoneApp/main.js index c9218cc..b51a16e 100644 --- a/phoneApp/main.js +++ b/phoneApp/main.js @@ -1,184 +1,4 @@ 'use strict'; -/*Создайте функцию конструктор. -У данной функции должны быть методы: - -1. Преобразование телефонного номера из формата 0993378130 в (099) 33-78-130 -2. Проверка, что телефонный номер содержит только числа -3. Добавление пользователей в справочник -4. Удаление пользователя по имени, фамилии -5. Поиск пользователей по имени - отображает всех пользователей с одинаковым именем -6. Изменение имени, фамилии, телефонного номера у выбраного пользователя ( здесь должно быть реализовано через this ) -7. Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя -8. Фильтр по указанному свойству*/ - -//---------------------------------------------PHONE APP STARTS--------------------------------------------- -class PhoneApp { - constructor() { - this.dataBase = [ - {id:1, name:'Nataliia', surname: 'Protsenko', phone:'0677967036', company: 'UZ'}, - {id:2, name:'Ivan', surname: 'Ivanov', phone:'0507967036', company: 'Ukrtelecom'}, - {id:3, name:'Petr', surname: 'Petrov', phone:'0637967036', company: 'Kyivsatr'}, - {id:4, name:'Ivan', surname: 'Smith', phone:'0967967036', company: 'Ukrtelecom'}, - ] - } - - //1. Преобразование телефонного номера из формата 0993378130 в (099) 33-78-130 - normalizePhoneNumber(...args){ - let arrNumber = args[0].split(''); - - arrNumber.splice(0,0,'('); - arrNumber.splice(4,0,') '); - arrNumber.splice(7,0,'-'); - arrNumber.splice(10,0,'-'); - - let result = arrNumber.join(''); - //console.log(result); - return result; - } - - //2. Проверка, что телефонный номер содержит только числа - validatePhoneNumber(str) { // shold be called before normalizePhoneNumber - let arrNumber = str.split(''); - let res = arrNumber.every((item) => !isNaN(+item));//почему если !isNaN(+item) заключить в фигурные скобки, то не работает? - //не проверяет на пробелы!!!!! - //console.log(res); - return res; - } - - //3. Добавление пользователей в справочник - createUser(options) { - let {name, surname, phone, company} = options; - let id = Math.round(Math.random()*100); - - let newUser = {}; - newUser.id = id; - newUser.name = name; - newUser.surname = surname; - newUser.phone = phone; - newUser.company = company; - - this.dataBase.push(newUser); - - console.log(this.dataBase); - } - - //4. Удаление пользователя по имени, фамилии - удаляет сразу всех найденных Иванов!!! - deleteUser(str){ - - this.dataBase.forEach((item) => { - - let values = Object.values(item); // берем все значения у объекта пользователя - let isConsist = values.some((elem) => (elem == str));// проверяем, есть ли такое значение, как нам нужно - - if (isConsist) { //если есть - ищем, индекс, где находится - let index = this.dataBase.indexOf(item); - //console.log(index); - this.dataBase.splice(index, 1); //и удаляем его - console.log(this.dataBase); - return; - } - - }) - console.log('There is no such user'); - } - - //5. Поиск пользователей по имени - отображает всех пользователей с одинаковым именем - searchUser(str){ - let searchedUsers = []; - - this.dataBase.forEach((item) => { - - let values = Object.values(item); // берем все значения у объекта пользователя - let isConsist = values.some((elem) => (elem == str));// проверяем, есть ли такое значение, как нам нужно - - if (isConsist) { //если есть -пушим объект в новый массив - searchedUsers.push(item); - console.log(searchedUsers); - return searchedUsers; - } - - }) - - console.log('There is no such user'); - - } - //6. Изменение имени, фамилии, телефонного номера у выбраного пользователя ( здесь должно быть реализовано через this ) - changeInfo(id, options){ - let {name, surname, phone, company} = options; - - this.dataBase.map((item) => { - if (item.id == id) { - if (name) { - item.name = name; - }; - if (surname) { - item.surname = surname; - }; - if (phone) { - item.phone = phone; - }; - if (company) { - item.company = company; - }; - } - }) - return this.dataBase; - } - - //7. Сортировка пользователей по номеру телефона, фамилии, имени и тд, по любому из свойств пользователя - sortUsers(str){ - - function compare(a, b){ - if (isNaN(a[str])) { - - if (a[str] > b[str]) { - return 1; - }; - if (a[str] < b[str]) { - return -1; - }; - if (a[str] == b[str]) { - return 0; - } - - } else { - return (a[str] - b[str]); - } - - } - - return this.dataBase.sort(compare); - } - - //8. Фильтр по указанному свойству - filterUsers(str){ - return this.dataBase.filter((item) => {//создает массив из объектов, у которых есть переданное свойство - if (item[str]) { - return item; - } - }); - } - -} - -const myApp = new PhoneApp(); -console.log(myApp); -//- -console.log(myApp.normalizePhoneNumber('0993452845')); -console.log(myApp.validatePhoneNumber('0993452845')); -myApp.createUser({name:'Svetlana', surname: 'Lash', phone: '0981111111', company:'EPAM'}); -myApp.createUser({name:'Sergey', surname: 'Barchan', company:'DataArt'});// without phone number -myApp.searchUser('Ivan'); -console.log(myApp.sortUsers('name')); -console.log(myApp.filterUsers('phone')); -console.log(myApp.filterUsers('company')); - -console.log(myApp.changeInfo(2, {name: 'Stepan', company:'Facebook'})); -console.log(myApp.changeInfo(3, {phone: '0778888888', company:'Google'})); -myApp.deleteUser('Ivan'); -myApp.deleteUser('DataArt'); - - /////RENDER CONTACTS PAGE////////////////////////////////////////////// const people = [ From 84f468d26a340da5e4aa4cc7976e08f57ef14a08 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Mon, 23 Jul 2018 12:48:26 +0300 Subject: [PATCH 09/19] footer was make like a static content --- phoneApp/contacts.js | 63 ++++++++++++++------------------------------ 1 file changed, 20 insertions(+), 43 deletions(-) diff --git a/phoneApp/contacts.js b/phoneApp/contacts.js index 97488f4..e3b1735 100644 --- a/phoneApp/contacts.js +++ b/phoneApp/contacts.js @@ -328,38 +328,6 @@ class ContactsPage2 { email: 'ViktorKriv@ec.ua' } ]; - this.footerContent = [ - { - classImg: 'search', - text: 'Contacts', - href: 'index.html', - additionalClass: 'active' - }, - { - classImg: 'th', - text: 'Keypad', - href: 'keypad.html', - additionalClass: '' - }, - { - classImg: 'pencil', - text: 'Edit contact', - href: 'edit-contact.html', - additionalClass: '' - }, - { - classImg: 'user', - text: 'User', - href: 'user.html', - additionalClass: '' - }, - { - classImg: 'plus', - text: 'Add user', - href: 'add-user.html', - additionalClass: '' - } - ]; this.render(); } @@ -425,25 +393,34 @@ class ContactsPage2 { } renderFooter(){ - let links = this.createLinks(this.footerContent) return `` } - createLinks(arr){ - return arr.map(item => { - return ` - - ${item.text} - `; - }).join(''); - } - render(){ document.body.innerHTML = this.renderHeader() + this.renderMain() + this.renderFooter(); } From ce0a090e63c50495d839c132166ec4478b8eeecb Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sun, 29 Jul 2018 17:23:49 +0300 Subject: [PATCH 10/19] keypad.js was done --- phoneApp/common/footer.js | 42 +++++++++++++ phoneApp/contacts.html | 1 + phoneApp/contacts.js | 80 +++++++++++++++++++++++-- phoneApp/keypad.html | 19 ++++++ phoneApp/keypad.js | 123 ++++++++++++++++++++++++++++++++++++++ 5 files changed, 260 insertions(+), 5 deletions(-) create mode 100644 phoneApp/common/footer.js create mode 100644 phoneApp/keypad.html create mode 100644 phoneApp/keypad.js diff --git a/phoneApp/common/footer.js b/phoneApp/common/footer.js new file mode 100644 index 0000000..e8db940 --- /dev/null +++ b/phoneApp/common/footer.js @@ -0,0 +1,42 @@ +class Footer { + constructor(){ + this.renderFooter(); + } + + renderFooter() { + document.body.innerHTML += this.createFooter(); + } + + createFooter(){ + return `` + } + +} + +const footer = new Footer(); + diff --git a/phoneApp/contacts.html b/phoneApp/contacts.html index 218bde8..194132d 100644 --- a/phoneApp/contacts.html +++ b/phoneApp/contacts.html @@ -14,5 +14,6 @@ + \ No newline at end of file diff --git a/phoneApp/contacts.js b/phoneApp/contacts.js index e3b1735..d1293d2 100644 --- a/phoneApp/contacts.js +++ b/phoneApp/contacts.js @@ -245,6 +245,7 @@ const contactsPage = new ContactsPage();*/ class ContactsPage2 { constructor(){ + this.title = 'Contacts'; this.tableCaptions = ['Name', 'Last name', 'Email']; this.people = [ { @@ -335,7 +336,7 @@ class ContactsPage2 { renderHeader(){ return `
      -

      Contacts

      +

      ${this.title}

      `; } @@ -366,9 +367,11 @@ class ContactsPage2 { let tableBody = this.createTableBodyRow(this.people); return ` + ${tableHead} - ${tableBody} -
      `; + + ${tableBody} + `; } createTableHeadRow(arr){ @@ -396,7 +399,7 @@ class ContactsPage2 { return `` } + sortColumnsHandler() { + let parent = document.querySelector('thead'); + parent.addEventListener('click', this.sortColumns.bind(this)); + } + + sortColumns() { + let target = event.target; + + this.tableCaptions.forEach((item) => { + if (target.textContent == item) { + item = this.makeCamelCase(item); + this.sortUsers(item); + this.render(); + } + }) + } + + makeCamelCase(str){ + str = str.toLowerCase(); + + if (str.includes(' ')) { //'last name' + let arr = str.split(' '); //['last', 'name'] + + let capitalizedArr = arr.map((item, i) => { + if ( i > 0) { + let itemToArray = item.split(''); //['n', 'a', 'm', 'e'] + let firstLetter = itemToArray[0].toUpperCase(); + itemToArray.splice(0, 1, firstLetter); + return itemToArray.join(''); + } + return item; + }); // end of map + + str = capitalizedArr.join(''); + }; + + return str; + } + + sortUsers(str) { + function compare(a, b){ + if (isNaN(a[str])) { + + if (a[str] > b[str]) { + return 1; + }; + if (a[str] < b[str]) { + return -1; + }; + if (a[str] == b[str]) { + return 0; + } + + } else { + return (a[str] - b[str]); + } + + } + //console.log(this.people.sort(compare)) + return this.people.sort(compare); + } + + setEvents() { + this.sortColumnsHandler(); + } + render(){ document.body.innerHTML = this.renderHeader() + this.renderMain() + this.renderFooter(); + this.setEvents(); } } -const contactsPage2 = new ContactsPage2(); \ No newline at end of file +const contactsPage2 = new ContactsPage2(); diff --git a/phoneApp/keypad.html b/phoneApp/keypad.html new file mode 100644 index 0000000..ebf6d39 --- /dev/null +++ b/phoneApp/keypad.html @@ -0,0 +1,19 @@ + + + + + + + Keypad + + + + + + + + + + + + \ No newline at end of file diff --git a/phoneApp/keypad.js b/phoneApp/keypad.js new file mode 100644 index 0000000..ff1b790 --- /dev/null +++ b/phoneApp/keypad.js @@ -0,0 +1,123 @@ +//Нужно визуализировать keypad.html - keypad.js + +//Структура виртуализации: +// ------ Это 2 разных класса KeypadPage, ContactsPage ----- + +//innerHTML по максимуму +//https://aleksandra-maslennikova.github.io/telephone-book/keypad.html + +//Сделайте чтобы при нажатии на кнопку цифра отобразилась +//в + +//https://aleksandra-maslennikova.github.io/telephone-book/index.html +//По клику по заголовку таблицы, +//таблица сортировалась по соответствующему свойству + +class KeypadPage { + constructor(){ + this.title = 'Keypad'; + this.buttonsValues = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#', '']; + this.render(); + //this.buttonsHandler(); + } + + renderHeader(){ + return `
      +
      +

      ${this.title}

      +
      +
      `; + } + + renderMain(){ + let buttons = this.renderButtons(); + + return `
      +
      +
      + + + +
      +
      + ${buttons} +
      +
      +
      `; + } + + renderButtons(){ + let buttonsArray = this.buttonsValues.map((item, i, arr) => { + + if ( i == arr.length - 1) { + return ``; + }; + + return ``; + }); + + return buttonsArray.join(''); + } + + + buttonsHandler(){ + let buttonsParent = document.querySelector('.keypad-holder'); + + buttonsParent.addEventListener('click', this.clickHandler) + + } + + + clickHandler(e){ + let target = e.target; + let placeToInsertNumbers = document.querySelector('.numbers'); + + if (target.classList.contains('key')) { + placeToInsertNumbers.innerHTML += target.textContent; + } + } + + + renderFooter(){ + return `` + } + setEvents(){ + this.buttonsHandler(); + } + + render(){ + document.body.innerHTML = this.renderHeader() + this.renderMain() + this.renderFooter(); + this.setEvents(); + } +} + +const keypad = new KeypadPage(); + From 8a17850fae841749f02aa633b046996ebab65e5e Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sun, 5 Aug 2018 14:40:29 +0300 Subject: [PATCH 11/19] edit-contact, user, add-user pages were virtualized --- phoneApp/addUser.html | 16 ++ phoneApp/addUser.js | 116 ++++++++ phoneApp/common/footer.js | 42 --- phoneApp/contacts.html | 1 - phoneApp/contacts.js | 421 +++++++---------------------- phoneApp/css/main.css | 4 + phoneApp/editContact.html | 16 ++ phoneApp/editContact.js | 117 ++++++++ phoneApp/images/user-face-mini.png | Bin 0 -> 22600 bytes phoneApp/images/user-face.png | Bin 0 -> 64550 bytes phoneApp/index.html | 152 ----------- phoneApp/keypad.html | 2 - phoneApp/keypad.js | 164 +++++------ phoneApp/main.js | 260 ------------------ phoneApp/user.html | 17 ++ phoneApp/user.js | 86 ++++++ 16 files changed, 560 insertions(+), 854 deletions(-) create mode 100644 phoneApp/addUser.html create mode 100644 phoneApp/addUser.js delete mode 100644 phoneApp/common/footer.js create mode 100644 phoneApp/editContact.html create mode 100644 phoneApp/editContact.js create mode 100644 phoneApp/images/user-face-mini.png create mode 100644 phoneApp/images/user-face.png delete mode 100644 phoneApp/index.html delete mode 100644 phoneApp/main.js create mode 100644 phoneApp/user.html create mode 100644 phoneApp/user.js diff --git a/phoneApp/addUser.html b/phoneApp/addUser.html new file mode 100644 index 0000000..e4c0a76 --- /dev/null +++ b/phoneApp/addUser.html @@ -0,0 +1,16 @@ + + + + + + + Add user + + + + + + + + + \ No newline at end of file diff --git a/phoneApp/addUser.js b/phoneApp/addUser.js new file mode 100644 index 0000000..fc7c44e --- /dev/null +++ b/phoneApp/addUser.js @@ -0,0 +1,116 @@ +//add-user при клике: +//index.html/contacts.html - в поле search при вводе буквы, +//добавить поиск по имени если имя включает хотя бы одну эту букву. +//после ввода каждого символа, фильтровать отображаемых пользователей. +//При удалении всех символов отобразить снова весь список + +class AddUser { + constructor(){ + this.render(); + } + + buttonsHandler(){ + let buttonsParent = document.querySelector('main'); + buttonsParent.addEventListener('click', this.clickHandler.bind(this)); + } + + clickHandler(e) { + + let target = e && e.target; + if (!target) return; + + let active = e && e.target && (e.target.closest('button') || e.target.classList.contains('add-btn')); + if (active == false) return; + + let input = active.querySelector('input'); + input.style.backgroundColor = 'lightgreen'; + + input.addEventListener('blur', () => { + input.removeAttribute('style'); + }) + + } + + renderInfo(value) { + return `
      + +
      `; + } + + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; + + return ` + + ${text} + ` + } + + setEvents(){ + this.buttonsHandler(); + } + + render() { + let shouldBeRendered = ` +
      +
      + +
      +
      + +
      +
      +
      +
      + +
      +
      + ${this.renderInfo('First Name')} + ${this.renderInfo('Last Name')} + ${this.renderInfo('Company')} +
      +
      +
      +
      + ${this.renderInfo('add mobile phone')} + ${this.renderInfo('add home phone')} + ${this.renderInfo('add email')} + ${this.renderInfo('add address')} + ${this.renderInfo('add birthday')} + ${this.renderInfo('add social profile')} + ${this.renderInfo('add field')} +
      + +
      +
      +
      +
      +
      + +
      +
      + +
      +
      `; + + document.body.innerHTML = shouldBeRendered; + this.setEvents(); + } +} + +const addUser = new AddUser; \ No newline at end of file diff --git a/phoneApp/common/footer.js b/phoneApp/common/footer.js deleted file mode 100644 index e8db940..0000000 --- a/phoneApp/common/footer.js +++ /dev/null @@ -1,42 +0,0 @@ -class Footer { - constructor(){ - this.renderFooter(); - } - - renderFooter() { - document.body.innerHTML += this.createFooter(); - } - - createFooter(){ - return `` - } - -} - -const footer = new Footer(); - diff --git a/phoneApp/contacts.html b/phoneApp/contacts.html index 194132d..196e388 100644 --- a/phoneApp/contacts.html +++ b/phoneApp/contacts.html @@ -7,7 +7,6 @@ Contacts - diff --git a/phoneApp/contacts.js b/phoneApp/contacts.js index d1293d2..7d1e4a8 100644 --- a/phoneApp/contacts.js +++ b/phoneApp/contacts.js @@ -1,249 +1,11 @@ -'use strict'; -/////RENDER CONTACTS PAGE////////////////////////////////////////////// -/*class ContactsPage { - constructor(){ - this.tableCaptions = ['Name', 'Last name', 'Email']; - this.people = [ - { - name: 'Иван', - lastName: 'Петров', - email: 'IvanPetrov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Сергеев', - email: 'SergeiSergeev@ec.ua' - }, - { - name: 'Иван', - lastName: 'Иванов', - email: 'IvanIvanov@ec.ua' - }, - { - name: 'Александр', - lastName: 'Александров', - email: 'AlexAlex@ec.ua' - }, - { - name: 'Алекс', - lastName: 'Смирнов', - email: 'AlexSmirnov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Волков', - email: 'VolkovSergey@ec.ua' - }, - { - name: 'Мария', - lastName: 'Шарапова', - email: 'MariyaSharapova@ec.ua' - }, - { - name: 'Александр', - lastName: 'Винник', - email: 'AlexVinnik@ec.ua' - }, - { - name: 'Дарий', - lastName: 'Смирнов', - email: 'DariySmirnov@ec.ua' - }, - { - name: 'Елена', - lastName: 'Лещенко', - email: 'ElenaLeshenko@ec.ua' - }, - { - name: 'Ольга', - lastName: 'Новикова', - email: 'OlgaNovikova@ec.ua' - }, - { - name: 'Наталья', - lastName: 'Шемякина', - email: 'ShemyakinaN@ec.ua' - }, - { - name: 'Анна', - lastName: 'Донцова', - email: 'AnnaDontsova@ec.ua' - }, - { - name: 'Влад', - lastName: 'Яма', - email: 'VladYama@ec.ua' - }, - { - name: 'Кира', - lastName: 'Воробьева', - email: 'Kira1990@ec.ua' - }, - { - name: 'Виктор', - lastName: 'Кривенко', - email: 'ViktorKriv@ec.ua' - } - ]; - this.footerContent = [ - { - classImg: 'search', - text: 'Contacts', - href: 'index.html', - additionalClass: 'active' - }, - { - classImg: 'th', - text: 'Keypad', - href: 'keypad.html', - additionalClass: '' - }, - { - classImg: 'pencil', - text: 'Edit contact', - href: 'edit-contact.html', - additionalClass: '' - }, - { - classImg: 'user', - text: 'User', - href: 'user.html', - additionalClass: '' - }, - { - classImg: 'plus', - text: 'Add user', - href: 'add-user.html', - additionalClass: '' - } - ]; - this.body = document.body; - - this.render(); - } - - createEl(tagName, tagContent){ - //return `<${tagName}>`; - let newEl = document.createElement(tagName); - if (tagContent) { - newEl.textContent = tagContent; - }; - return newEl; - } - - renderHeader(){ - let header = this.createEl('header'); - header.setAttribute('class', 'header'); - this.body.appendChild(header); - - let headerDiv = this.createEl('div'); - headerDiv.setAttribute('class', 'container top-radius'); - header.appendChild(headerDiv); - - let headerH2 = this.createEl('h2', 'Contacts'); - headerDiv.appendChild(headerH2); - } - - renderMain(){ - let main = this.createEl('main'); - this.body.appendChild(main); - - let mainDiv = this.createEl('div'); - mainDiv.setAttribute('class', 'container mainDiv'); - main.appendChild(mainDiv); - - this.mainDivInserted = document.querySelector('.mainDiv'); - this.mainDivInserted.innerHTML = this.renderForm(); - - this.renderTable(); - } - - renderForm(){ // может надо было тоже через createElement? Как понять, что нужно через createElement, а что просто кусками верстки? - return `
      -
      - - -
      -
      `; - } - - renderTable(){ - let table = this.createEl('table'); - table.setAttribute('class', 'table table-hover contacts'); - this.mainDivInserted.appendChild(table); - - let tableHead = this.createEl('thead'); - table.appendChild(tableHead); - - let tableBody = this.createEl('tbody'); - table.appendChild(tableBody); - - document.querySelector('thead').innerHTML = this.createTableHeadRow(this.tableCaptions); - document.querySelector('tbody').innerHTML += this.createTableBodyRow(this.people); - - } - - createTableHeadRow(arr){ - let items = arr.map(item => { - return `${item}` - - }).join(''); - - return ` - ${items} - ` - } - - createTableBodyRow(arr){ - return arr.map(item => { - return ` - ${item.name} - ${item.lastName} - ${item.email} - `; - }).join(''); - } +//index.html/contacts.html - в поле search при вводе буквы, +//добавить поиск по имени если имя включает хотя бы одну эту букву. +//после ввода каждого символа, фильтровать отображаемых пользователей. +//При удалении всех символов отобразить снова весь список - renderFooter(){ - let footer = this.createEl('footer'); - footer.setAttribute('class', 'footer'); - this.body.appendChild(footer); - - let footerDiv = this.createEl('div'); - footerDiv.setAttribute('class', 'container bottom-radius'); - footer.appendChild(footerDiv); - - let footerNav = this.createEl('nav'); - footerNav.setAttribute('class', 'main-nav'); - footerDiv.appendChild(footerNav); - - document.querySelector('.main-nav').innerHTML += this.createLinks(this.footerContent); - } - - createLinks(arr){ - return arr.map(item => { - return ` - - ${item.text} - `; - }).join(''); - - } - - render(){ - this.renderHeader(); - this.renderMain(); - this.renderFooter(); - } - -} - -const contactsPage = new ContactsPage();*/ - - -//------------------------ THE SECOND VARIANT - I LIKE IT MORE ------------------------------// +'use strict'; -class ContactsPage2 { +class ContactsPage { constructor(){ this.title = 'Contacts'; this.tableCaptions = ['Name', 'Last name', 'Email']; @@ -333,45 +95,19 @@ class ContactsPage2 { this.render(); } - renderHeader(){ - return `
      -
      -

      ${this.title}

      -
      -
      `; - } + reRenderTable(arr){ - renderMain(){ - let form = this.renderForm(); - let table = this.renderTable(); + let tableBody = this.createTableBodyRow(arr); - return `
      -
      - ${form} - ${table} -
      -
      `; - } + let pattern = ` + ${tableBody} + `; - renderForm(){ - return `
      -
      - - -
      -
      `; - } + let parent = document.querySelector('table'); + let shouldBeReplaced = document.querySelector('tbody'); + parent.removeChild(shouldBeReplaced); - renderTable(){ - let tableHead = this.createTableHeadRow(this.tableCaptions); - let tableBody = this.createTableBodyRow(this.people); - - return ` - - ${tableHead} - - ${tableBody} -
      `; + parent.insertAdjacentHTML('beforeEnd', pattern); } createTableHeadRow(arr){ @@ -386,42 +122,17 @@ class ContactsPage2 { } createTableBodyRow(arr){ - return arr.map(item => { - return ` - ${item.name} - ${item.lastName} - ${item.email} - `; - }).join(''); - } + if (!arr) { + arr = this.people; + }; - renderFooter(){ - return `` + return arr.map(item => { + return ` + ${item.name} + ${item.lastName} + ${item.email} + `; + }).join(''); } sortColumnsHandler() { @@ -486,15 +197,89 @@ class ContactsPage2 { return this.people.sort(compare); } + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; + + return ` + + ${text} + ` + } + + searchUserHandler() { + this.searchField = document.querySelector('#search'); + this.searchField.addEventListener('input', this.filterUser.bind(this)); + } + + filterUser() { + let value = this.searchField.value.toLowerCase(); + + let filteredUsers = this.people.filter((item) => { //{name:'ghjk', phone:'37686'} + + if (item.name.toLowerCase().includes(value)) { + return item; + } + + return; + }) + //console.log(filteredUsers); + + this.reRenderTable(filteredUsers); + + } + + setEvents() { this.sortColumnsHandler(); + this.searchUserHandler(); } - render(){ - document.body.innerHTML = this.renderHeader() + this.renderMain() + this.renderFooter(); + render(users){ + let shouldBeRendered = ` +
      +
      +

      ${this.title}

      +
      +
      + +
      +
      +
      +
      + + +
      +
      + + + + ${this.createTableHeadRow(this.tableCaptions)} + + + ${this.createTableBodyRow(users)} + +
      + +
      +
      + +
      +
      + +
      +
      `; + + document.body.innerHTML = shouldBeRendered; this.setEvents(); } - } -const contactsPage2 = new ContactsPage2(); + +const contactsPage = new ContactsPage(); diff --git a/phoneApp/css/main.css b/phoneApp/css/main.css index 7dc35c6..4c29a4d 100644 --- a/phoneApp/css/main.css +++ b/phoneApp/css/main.css @@ -51,6 +51,10 @@ h3 { margin: 0; } +input { + height: 20px; +} + .container { width: 400px; background: #ccc; diff --git a/phoneApp/editContact.html b/phoneApp/editContact.html new file mode 100644 index 0000000..0434315 --- /dev/null +++ b/phoneApp/editContact.html @@ -0,0 +1,16 @@ + + + + + + + Edit contacts + + + + + + + + + \ No newline at end of file diff --git a/phoneApp/editContact.js b/phoneApp/editContact.js new file mode 100644 index 0000000..7946128 --- /dev/null +++ b/phoneApp/editContact.js @@ -0,0 +1,117 @@ +//edit-contact, +//- сделать данные редактируемыми (атрибут contentEditable) // input +//- изменять backgroundColor + +class EditContact { + constructor(){ + this.phoneNumber = '+38 (063) 733 44 55'; + this.render(); + } + + renderInfo(value) { + + return `
      + +
      `; + } + + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; + + return ` + + ${text} + ` + } + + buttonsHandler(){ + let buttonsParent = document.querySelector('main'); + buttonsParent.addEventListener('click', this.clickHandler.bind(this)); + } + + clickHandler(e) { + + let target = e && e.target; + if (!target) return; + + let active = e && e.target && (e.target.closest('button') || e.target.classList.contains('add-btn')); + if (active == false) return; + + let input = active.querySelector('input'); + input.style.backgroundColor = 'lightgreen'; + + input.addEventListener('blur', () => { + input.removeAttribute('style'); + }) + + } + + + setEvents(){ + this.buttonsHandler(); + } + + render() { + let shouldBeRendered = ` +
      +
      + +
      +
      + +
      +
      +
      +
      #
      +
      + ${this.renderInfo('First Name')} + ${this.renderInfo('Last Name')} + ${this.renderInfo('Company')} +
      +
      +
      +
      +
      + +
      + ${this.renderInfo('add home phone')} + ${this.renderInfo('add email')} + ${this.renderInfo('add address')} + ${this.renderInfo('add birthday')} + ${this.renderInfo('add social profile')} + ${this.renderInfo('add field')} +
      + +
      +
      +
      +
      +
      + +
      +
      + +
      +
      `; + + document.body.innerHTML = shouldBeRendered; + this.setEvents(); + } +} + +const editContact = new EditContact; \ No newline at end of file diff --git a/phoneApp/images/user-face-mini.png b/phoneApp/images/user-face-mini.png new file mode 100644 index 0000000000000000000000000000000000000000..1996df7c375c6999fde71d03ab68a049bc840837 GIT binary patch literal 22600 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 literal 0 HcmV?d00001 diff --git a/phoneApp/images/user-face.png b/phoneApp/images/user-face.png new file mode 100644 index 0000000000000000000000000000000000000000..92f94dd5dce449d01ae67ba74e329448bf8d7b1e GIT binary patch literal 64550 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 literal 0 HcmV?d00001 diff --git a/phoneApp/index.html b/phoneApp/index.html deleted file mode 100644 index 999dc1f..0000000 --- a/phoneApp/index.html +++ /dev/null @@ -1,152 +0,0 @@ - - - - - - - Contacts - - - - - - - - - - - - - \ No newline at end of file diff --git a/phoneApp/keypad.html b/phoneApp/keypad.html index ebf6d39..7db1a5e 100644 --- a/phoneApp/keypad.html +++ b/phoneApp/keypad.html @@ -7,13 +7,11 @@ Keypad - - \ No newline at end of file diff --git a/phoneApp/keypad.js b/phoneApp/keypad.js index ff1b790..80cf0ae 100644 --- a/phoneApp/keypad.js +++ b/phoneApp/keypad.js @@ -13,108 +13,114 @@ //По клику по заголовку таблицы, //таблица сортировалась по соответствующему свойству +//добавить функционал для удаления номера +//1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) +//2. Формат номера должен быть таким (099)-17-38-170 + class KeypadPage { constructor(){ this.title = 'Keypad'; - this.buttonsValues = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '*', '0', '#', '']; this.render(); - //this.buttonsHandler(); } - renderHeader(){ - return `

      -
      -

      ${this.title}

      -
      -
      `; - } + buttonsHandler(){ + let buttonsParent = document.querySelector('main'); + let placeToInsertNumbers = document.querySelector('.numbers'); - renderMain(){ - let buttons = this.renderButtons(); - - return `
      -
      -
      - - - -
      -
      - ${buttons} -
      -
      -
      `; + buttonsParent.addEventListener('click', this.clickHandler.bind(this, placeToInsertNumbers)); + window.addEventListener('keypress', this.keyHandler.bind(this, placeToInsertNumbers)); } - renderButtons(){ - let buttonsArray = this.buttonsValues.map((item, i, arr) => { + keyHandler(display, e) { + let pattern = /[0-9]/; //дописать регвыражение для #*-() + if (e.ctrlKey || e.altKey || e.metaKey) return; + var code = e.key; - if ( i == arr.length - 1) { - return ``; - }; + if (code == null) return; - return ``; - }); - - return buttonsArray.join(''); + if (pattern.test(code)) { + display.innerHTML += code; + } + return; } - - buttonsHandler(){ - let buttonsParent = document.querySelector('.keypad-holder'); - - buttonsParent.addEventListener('click', this.clickHandler) - + clickHandler(display, e){ + let target = e.target; + if (!target) return; + + if (target.classList.contains('key')) { + display.innerHTML += target.textContent; + } + + if (target.classList.contains('glyphicon-circle-arrow-left')) { + let insertedNumbersArr = display.innerHTML.split(''); + if (insertedNumbersArr.length > 0) { + let numberWithoutLast = insertedNumbersArr.slice(0,-1).join(''); + display.innerHTML = numberWithoutLast; + } + } } + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; - clickHandler(e){ - let target = e.target; - let placeToInsertNumbers = document.querySelector('.numbers'); - - if (target.classList.contains('key')) { - placeToInsertNumbers.innerHTML += target.textContent; - } + return ` + + ${text} + ` } - - renderFooter(){ - return `` - } setEvents(){ this.buttonsHandler(); } render(){ - document.body.innerHTML = this.renderHeader() + this.renderMain() + this.renderFooter(); + let shouldBeRendered = ` +
      +
      +

      ${this.title}

      +
      +
      + +
      +
      +
      + + + +
      +
      + + + + + + + + + + + + + +
      +
      +
      + +
      +
      + +
      +
      `; + + document.body.innerHTML = shouldBeRendered; this.setEvents(); } } diff --git a/phoneApp/main.js b/phoneApp/main.js deleted file mode 100644 index b51a16e..0000000 --- a/phoneApp/main.js +++ /dev/null @@ -1,260 +0,0 @@ -'use strict'; -/////RENDER CONTACTS PAGE////////////////////////////////////////////// -const people = -[ - { - name: 'Иван', - lastName: 'Петров', - email: 'IvanPetrov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Сергеев', - email: 'SergeiSergeev@ec.ua' - }, - { - name: 'Иван', - lastName: 'Иванов', - email: 'IvanIvanov@ec.ua' - }, - { - name: 'Александр', - lastName: 'Александров', - email: 'AlexAlex@ec.ua' - }, - { - name: 'Алекс', - lastName: 'Смирнов', - email: 'AlexSmirnov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Волков', - email: 'VolkovSergey@ec.ua' - }, - { - name: 'Мария', - lastName: 'Шарапова', - email: 'MariyaSharapova@ec.ua' - }, - { - name: 'Александр', - lastName: 'Винник', - email: 'AlexVinnik@ec.ua' - }, - { - name: 'Дарий', - lastName: 'Смирнов', - email: 'DariySmirnov@ec.ua' - }, - { - name: 'Елена', - lastName: 'Лещенко', - email: 'ElenaLeshenko@ec.ua' - }, - { - name: 'Ольга', - lastName: 'Новикова', - email: 'OlgaNovikova@ec.ua' - }, - { - name: 'Наталья', - lastName: 'Шемякина', - email: 'ShemyakinaN@ec.ua' - }, - { - name: 'Анна', - lastName: 'Донцова', - email: 'AnnaDontsova@ec.ua' - }, - { - name: 'Влад', - lastName: 'Яма', - email: 'VladYama@ec.ua' - }, - { - name: 'Кира', - lastName: 'Воробьева', - email: 'Kira1990@ec.ua' - }, - { - name: 'Виктор', - lastName: 'Кривенко', - email: 'ViktorKriv@ec.ua' - } -]; - -const captions = ['Name', 'Last name', 'Email']; -const footerContent = [ - { - classImg: 'glyphicon glyphicon-search', - text: 'Contacts', - href: 'index.html', - additionalClass: 'active' - }, - { - classImg: 'glyphicon glyphicon-th', - text: 'Keypad', - href: 'keypad.html', - additionalClass: '' - }, - { - classImg: 'glyphicon glyphicon-pencil', - text: 'Edit contact', - href: 'edit-contact.html', - additionalClass: '' - }, - { - classImg: 'glyphicon glyphicon-user', - text: 'User', - href: 'user.html', - additionalClass: '' - }, - { - classImg: 'glyphicon glyphicon-plus', - text: 'Add user', - href: 'add-user.html', - additionalClass: '' - } -] - -const contactsPage = { - people, - pageTitle: 'Contacts', - render() { - const header = this.newEl('header', null, {className: 'header'}); - const main = this.newEl('main'); - const footer = this.newEl('footer'); - - /*creating header*/ - let headerDiv = this.newEl('div', null, {className: 'container top-radius'}); - let headerH2 = this.newEl('h2', 'Contacts'); - - headerDiv.appendChild(headerH2); - header.appendChild(headerDiv); - - /*creating main div*/ - let mainDiv = this.newEl('div', null, {className: 'container'}); - - /*creating form*/ - let form = this.newEl('form', null, {className: 'form-inline search-form'}); - let formDiv = this.newEl('div', null, {className: 'form-group'}); - let label = this.newEl('label', 'Search', {className: 'sr-only', forAttr: 'search'}); - let input = this.newEl('input', null, {className: 'form-control', typeAttr: 'text', idAttr:'search', placeholderAttr:'Search'}); - - main.appendChild(mainDiv); - mainDiv.appendChild(form); - form.appendChild(formDiv); - formDiv.appendChild(label); - formDiv.appendChild(input); - - /*creating table & table header*/ - let table = this.newEl('table', null, {className: 'table table-hover contacts'}); - let thead = this.newEl('thead'); - let headRow = this.newEl('tr'); - - captions.forEach((item) => { - let th = this.newEl('th', item); - headRow.appendChild(th); - }); - - mainDiv.appendChild(table); - table.appendChild(thead); - thead.appendChild(headRow); - - /*creating table content*/ - let tbody = this.newEl('tbody'); - - table.appendChild(tbody); - - people.forEach((item) => { - let tr = this.newEl('tr'); - - for (let key in item) { - if (key) { - let td = this.newEl('td', item[key]); - tr.appendChild(td); - } - }; - - tbody.appendChild(tr); - - }) - - /*creating footer content*/ - let footerDiv = this.newEl('div', null, {className: 'container bottom-radius'}); - let nav = this.newEl('div', null, {className: 'main-nav'}); - - footerContent.forEach((item) => { - let link = this.newEl('a', null, {className: `tab ${item.additionalClass}` , hrefAttr: item.href } ); - let spanImg = this.newEl('span', null, {className: item.classImg, hrefAttr: item.href, ariahiddenAttr: 'true' } ); - let spanText = this.newEl('span', item.text, {className: 'tab-text', hrefAttr: item.href } ); - - link.appendChild(spanImg); - link.appendChild(spanText); - - nav.appendChild(link); - }) - - - - footer.appendChild(footerDiv); - footerDiv.appendChild(nav); - - document.body.appendChild(header); - document.body.appendChild(main); - document.body.appendChild(footer); - }, - - - newEl(elName, elValue, attributes) { - - let element = document.createElement(elName); - - if (elValue) { - element.textContent = elValue; - }; - - if (attributes) { - this.setAttribute(element, attributes); - } - - return element; - - }, - - setAttribute(element, attributes) { - let {className, typeAttr, forAttr, idAttr, placeholderAttr, hrefAttr, ariahiddenAttr} = attributes; - -/* if (className) { - element.classList.add(className); - };*/ - if (className) { - element.setAttribute('class', className); - }; - - if (typeAttr) { - element.setAttribute('type', typeAttr); - }; - if (forAttr) { - element.setAttribute('for', forAttr); - }; - if (idAttr) { - element.setAttribute('id', idAttr); - }; - if (placeholderAttr) { - element.setAttribute('placeholder', placeholderAttr); - }; - if (hrefAttr) { - element.setAttribute('href', hrefAttr); - }; - if (ariahiddenAttr) { - element.setAttribute('aria-hidden', ariahiddenAttr); - }; - - return element; - } - -} - -contactsPage.render(); \ No newline at end of file diff --git a/phoneApp/user.html b/phoneApp/user.html new file mode 100644 index 0000000..05b6c3a --- /dev/null +++ b/phoneApp/user.html @@ -0,0 +1,17 @@ + + + + + + + User + + + + + + + + + + \ No newline at end of file diff --git a/phoneApp/user.js b/phoneApp/user.js new file mode 100644 index 0000000..79d1c84 --- /dev/null +++ b/phoneApp/user.js @@ -0,0 +1,86 @@ +class User { + constructor(){ + this.mobileNumber = '+38 (093) 989 89 89'; + this.homeNumber = '+38 (067) 989 89 89'; + this.render(); + } + + renderOptions(options) { + let {glyphicon, text} = options; + + return `
      +
      + ${text} +
      `; + } + + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; + + return ` + + ${text} + `; + } + + render() { + let shouldBeRendered = ` +
      +
      + +
      +
      + +
      +
      + # +
      User Name
      +
      + ${this.renderOptions({glyphicon:'comment', text:'message'})} + ${this.renderOptions({glyphicon:'earphone', text:'call'})} + ${this.renderOptions({glyphicon:'facetime-video', text:'video'})} + ${this.renderOptions({glyphicon:'envelope', text:'mail'})} +
      +
      +

      mobile

      +
      ${this.mobileNumber}
      +
      +
      +

      home

      +
      ${this.homeNumber}
      +
      + +
      +
      + +
      +
      + +
      +
      `; + + document.body.innerHTML = shouldBeRendered; + //this.setEvents(); + } +} + +const user = new User; \ No newline at end of file From 70419089e4959d24d13381aa8ff6340f64f3531e Mon Sep 17 00:00:00 2001 From: Nataliia Date: Thu, 9 Aug 2018 20:06:24 +0300 Subject: [PATCH 12/19] refactoring --- phoneApp/addUser.html | 16 --- phoneApp/contacts.html | 18 --- phoneApp/editContact.html | 16 --- phoneApp/{user.html => index.html} | 9 +- phoneApp/{ => js}/addUser.js | 26 +--- phoneApp/js/app.js | 183 +++++++++++++++++++++++++++++ phoneApp/{ => js}/contacts.js | 127 ++------------------ phoneApp/{ => js}/editContact.js | 28 +---- phoneApp/{ => js}/keypad.js | 27 +---- phoneApp/js/user.js | 70 +++++++++++ phoneApp/keypad.html | 17 --- phoneApp/user.js | 86 -------------- 12 files changed, 287 insertions(+), 336 deletions(-) delete mode 100644 phoneApp/addUser.html delete mode 100644 phoneApp/contacts.html delete mode 100644 phoneApp/editContact.html rename phoneApp/{user.html => index.html} (58%) rename phoneApp/{ => js}/addUser.js (75%) create mode 100644 phoneApp/js/app.js rename phoneApp/{ => js}/contacts.js (54%) rename phoneApp/{ => js}/editContact.js (74%) rename phoneApp/{ => js}/keypad.js (78%) create mode 100644 phoneApp/js/user.js delete mode 100644 phoneApp/keypad.html delete mode 100644 phoneApp/user.js diff --git a/phoneApp/addUser.html b/phoneApp/addUser.html deleted file mode 100644 index e4c0a76..0000000 --- a/phoneApp/addUser.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - Add user - - - - - - - - - \ No newline at end of file diff --git a/phoneApp/contacts.html b/phoneApp/contacts.html deleted file mode 100644 index 196e388..0000000 --- a/phoneApp/contacts.html +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - Contacts - - - - - - - - - - - \ No newline at end of file diff --git a/phoneApp/editContact.html b/phoneApp/editContact.html deleted file mode 100644 index 0434315..0000000 --- a/phoneApp/editContact.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - Edit contacts - - - - - - - - - \ No newline at end of file diff --git a/phoneApp/user.html b/phoneApp/index.html similarity index 58% rename from phoneApp/user.html rename to phoneApp/index.html index 05b6c3a..32fce21 100644 --- a/phoneApp/user.html +++ b/phoneApp/index.html @@ -10,8 +10,15 @@ +
      - + + + + + + + \ No newline at end of file diff --git a/phoneApp/addUser.js b/phoneApp/js/addUser.js similarity index 75% rename from phoneApp/addUser.js rename to phoneApp/js/addUser.js index fc7c44e..9ba1974 100644 --- a/phoneApp/addUser.js +++ b/phoneApp/js/addUser.js @@ -5,8 +5,8 @@ //При удалении всех символов отобразить снова весь список class AddUser { - constructor(){ - this.render(); + constructor(globalState){ + this.state = globalState; //стал равен this.state-у со страницы App.js } buttonsHandler(){ @@ -54,8 +54,7 @@ class AddUser { } render() { - let shouldBeRendered = ` -
      + return `
      - + ` -
      -
      - -
      -
      `; - - document.body.innerHTML = shouldBeRendered; - this.setEvents(); + /*this.setEvents();*/ } } - -const addUser = new AddUser; \ No newline at end of file diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js new file mode 100644 index 0000000..53c8eb9 --- /dev/null +++ b/phoneApp/js/app.js @@ -0,0 +1,183 @@ +class App { + constructor(){ + this.state = { //равен ссылке, которая ведет на объект + people: [ + { + name: 'Иван', + lastName: 'Петров', + email: 'IvanPetrov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Сергеев', + email: 'SergeiSergeev@ec.ua' + }, + { + name: 'Иван', + lastName: 'Иванов', + email: 'IvanIvanov@ec.ua' + }, + { + name: 'Александр', + lastName: 'Александров', + email: 'AlexAlex@ec.ua' + }, + { + name: 'Алекс', + lastName: 'Смирнов', + email: 'AlexSmirnov@ec.ua' + }, + { + name: 'Сергей', + lastName: 'Волков', + email: 'VolkovSergey@ec.ua' + }, + { + name: 'Мария', + lastName: 'Шарапова', + email: 'MariyaSharapova@ec.ua' + }, + { + name: 'Александр', + lastName: 'Винник', + email: 'AlexVinnik@ec.ua' + }, + { + name: 'Дарий', + lastName: 'Смирнов', + email: 'DariySmirnov@ec.ua' + }, + { + name: 'Елена', + lastName: 'Лещенко', + email: 'ElenaLeshenko@ec.ua' + }, + { + name: 'Ольга', + lastName: 'Новикова', + email: 'OlgaNovikova@ec.ua' + }, + { + name: 'Наталья', + lastName: 'Шемякина', + email: 'ShemyakinaN@ec.ua' + }, + { + name: 'Анна', + lastName: 'Донцова', + email: 'AnnaDontsova@ec.ua' + }, + { + name: 'Влад', + lastName: 'Яма', + email: 'VladYama@ec.ua' + }, + { + name: 'Кира', + lastName: 'Воробьева', + email: 'Kira1990@ec.ua' + }, + { + name: 'Виктор', + lastName: 'Кривенко', + email: 'ViktorKriv@ec.ua' + } + ], + activePage: 'contacts' + }; + + this.pages = { + contacts: new ContactsPage(this.state), // тут передали ссылку на this.state + adduser: new AddUser(this.state), + keypad: new KeypadPage(this.state), + editcontact: new EditContact(this.state), + user: new User(this.state) + }; + + this.initializeRouter(); + this.switchRouter(); + + } + + initializeRouter () { + const mountNode = document.getElementById('mountNode'); + //console.log(mountNode); + mountNode.innerHTML = ` +
      +
      +
      + +
      +
      `; + + //this.initializeRouterHandlers(); + this.appDOMNode = mountNode.querySelector('#app'); // сюда будем делать рендер всех страниц + // и это не будет затрагивать футер и его события + } + + renderNewPage() { + + this.appDOMNode.innerHTML = this.pages[this.state.activePage].render(); + } + + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; + + return ` + + ${text} + ` + } + + + switchRouter() { + const parent = document.querySelector('.main-nav'); + parent.addEventListener('click', (e) => { + e.preventDefault(); + //let target = e && e.target; + let target = e && e.target && (e.target.closest('a') || e.target.classList.contains('tab')); + if (target == false) return; + + //console.log(target); + + if (target.classList.contains('active')) return; + if (target.classList.contains('tab')) { + let active = document.querySelector('.active'); + + active.classList.remove('active'); + target.classList.add('active'); + + let href = target.getAttribute('href'); + //console.log(href); + this.state.activePage = href.replace(/-/g, '').toLowerCase(); + //console.log(this.state.activePage); + this.renderNewPage(); + } + return; + }) + } + // updateView() { + // const activePage = this.state.activePage; + // this.pages[activePage].updateState(this.state); //updateState делаем на каждой странице + // + // } + render() { + const {activePage} = this.state; + //const activePage = this.state.activePage; // то же самое + + // this.updateView(); + this.appDOMNode.innerHTML = this.pages[activePage].render(); // и отрендерь ту страничку, + // которая сейчас указана как activePage в this.state + + } +} + +const app = new App(); +app.render(); \ No newline at end of file diff --git a/phoneApp/contacts.js b/phoneApp/js/contacts.js similarity index 54% rename from phoneApp/contacts.js rename to phoneApp/js/contacts.js index 7d1e4a8..6cc8c85 100644 --- a/phoneApp/contacts.js +++ b/phoneApp/js/contacts.js @@ -6,93 +6,11 @@ 'use strict'; class ContactsPage { - constructor(){ + constructor(globalState){ + this.state = globalState; //стал равен this.state-у со страницы App.js + this.title = 'Contacts'; this.tableCaptions = ['Name', 'Last name', 'Email']; - this.people = [ - { - name: 'Иван', - lastName: 'Петров', - email: 'IvanPetrov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Сергеев', - email: 'SergeiSergeev@ec.ua' - }, - { - name: 'Иван', - lastName: 'Иванов', - email: 'IvanIvanov@ec.ua' - }, - { - name: 'Александр', - lastName: 'Александров', - email: 'AlexAlex@ec.ua' - }, - { - name: 'Алекс', - lastName: 'Смирнов', - email: 'AlexSmirnov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Волков', - email: 'VolkovSergey@ec.ua' - }, - { - name: 'Мария', - lastName: 'Шарапова', - email: 'MariyaSharapova@ec.ua' - }, - { - name: 'Александр', - lastName: 'Винник', - email: 'AlexVinnik@ec.ua' - }, - { - name: 'Дарий', - lastName: 'Смирнов', - email: 'DariySmirnov@ec.ua' - }, - { - name: 'Елена', - lastName: 'Лещенко', - email: 'ElenaLeshenko@ec.ua' - }, - { - name: 'Ольга', - lastName: 'Новикова', - email: 'OlgaNovikova@ec.ua' - }, - { - name: 'Наталья', - lastName: 'Шемякина', - email: 'ShemyakinaN@ec.ua' - }, - { - name: 'Анна', - lastName: 'Донцова', - email: 'AnnaDontsova@ec.ua' - }, - { - name: 'Влад', - lastName: 'Яма', - email: 'VladYama@ec.ua' - }, - { - name: 'Кира', - lastName: 'Воробьева', - email: 'Kira1990@ec.ua' - }, - { - name: 'Виктор', - lastName: 'Кривенко', - email: 'ViktorKriv@ec.ua' - } - ]; - - this.render(); } reRenderTable(arr){ @@ -123,7 +41,7 @@ class ContactsPage { createTableBodyRow(arr){ if (!arr) { - arr = this.people; + arr = this.state.people; }; return arr.map(item => { @@ -193,19 +111,10 @@ class ContactsPage { } } - //console.log(this.people.sort(compare)) - return this.people.sort(compare); + //console.log(this.state.people.sort(compare)) + return this.state.people.sort(compare); } - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; - - return ` - - ${text} - ` - } searchUserHandler() { this.searchField = document.querySelector('#search'); @@ -215,7 +124,7 @@ class ContactsPage { filterUser() { let value = this.searchField.value.toLowerCase(); - let filteredUsers = this.people.filter((item) => { //{name:'ghjk', phone:'37686'} + let filteredUsers = this.state.people.filter((item) => { //{name:'ghjk', phone:'37686'} if (item.name.toLowerCase().includes(value)) { return item; @@ -229,14 +138,13 @@ class ContactsPage { } - setEvents() { this.sortColumnsHandler(); this.searchUserHandler(); } render(users){ - let shouldBeRendered = ` + return `

      ${this.title}

      @@ -262,24 +170,9 @@ class ContactsPage {
      - - -
      -
      - -
      -
      `; + `; - document.body.innerHTML = shouldBeRendered; - this.setEvents(); + // this.setEvents(); } } - -const contactsPage = new ContactsPage(); diff --git a/phoneApp/editContact.js b/phoneApp/js/editContact.js similarity index 74% rename from phoneApp/editContact.js rename to phoneApp/js/editContact.js index 7946128..15257b6 100644 --- a/phoneApp/editContact.js +++ b/phoneApp/js/editContact.js @@ -3,9 +3,9 @@ //- изменять backgroundColor class EditContact { - constructor(){ + constructor(globalState){ + this.state = globalState; //стал равен this.state-у со страницы App.js this.phoneNumber = '+38 (063) 733 44 55'; - this.render(); } renderInfo(value) { @@ -55,8 +55,7 @@ class EditContact { } render() { - let shouldBeRendered = ` -
      + return `
      - - -
      -
      - -
      -
      `; - - document.body.innerHTML = shouldBeRendered; - this.setEvents(); + ` + + /*this.setEvents();*/ } } - -const editContact = new EditContact; \ No newline at end of file diff --git a/phoneApp/keypad.js b/phoneApp/js/keypad.js similarity index 78% rename from phoneApp/keypad.js rename to phoneApp/js/keypad.js index 80cf0ae..f2e7c31 100644 --- a/phoneApp/keypad.js +++ b/phoneApp/js/keypad.js @@ -18,9 +18,8 @@ //2. Формат номера должен быть таким (099)-17-38-170 class KeypadPage { - constructor(){ - this.title = 'Keypad'; - this.render(); + constructor(globalState){ + this.state = globalState; //стал равен this.state-у со страницы App.js } buttonsHandler(){ @@ -76,8 +75,7 @@ class KeypadPage { } render(){ - let shouldBeRendered = ` -
      + return `

      ${this.title}

      @@ -106,24 +104,9 @@ class KeypadPage { - - -
      -
      - -
      -
      `; - - document.body.innerHTML = shouldBeRendered; - this.setEvents(); + ` } } -const keypad = new KeypadPage(); +//const keypad = new KeypadPage(); diff --git a/phoneApp/js/user.js b/phoneApp/js/user.js new file mode 100644 index 0000000..2acafb5 --- /dev/null +++ b/phoneApp/js/user.js @@ -0,0 +1,70 @@ +class User { + constructor(globalState){ + this.state = globalState; //стал равен this.state-у со страницы App.js + this.mobileNumber = '+38 (093) 989 89 89'; + this.homeNumber = '+38 (067) 989 89 89'; + } + + renderOptions(options) { + let {glyphicon, text} = options; + + return `
      +
      + ${text} +
      `; + } + + renderLink(options) { + let {href, glyphicon, text, active} = options; + let activeClass = active ? 'active' : ''; + + return ` + + ${text} + `; + } + + render() { + return `
      +
      + +
      +
      + +
      +
      + # +
      User Name
      +
      + ${this.renderOptions({glyphicon:'comment', text:'message'})} + ${this.renderOptions({glyphicon:'earphone', text:'call'})} + ${this.renderOptions({glyphicon:'facetime-video', text:'video'})} + ${this.renderOptions({glyphicon:'envelope', text:'mail'})} +
      +
      +

      mobile

      +
      ${this.mobileNumber}
      +
      +
      +

      home

      +
      ${this.homeNumber}
      +
      + +
      +
      `; + + //this.setEvents(); + } +} diff --git a/phoneApp/keypad.html b/phoneApp/keypad.html deleted file mode 100644 index 7db1a5e..0000000 --- a/phoneApp/keypad.html +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - Keypad - - - - - - - - - - \ No newline at end of file diff --git a/phoneApp/user.js b/phoneApp/user.js deleted file mode 100644 index 79d1c84..0000000 --- a/phoneApp/user.js +++ /dev/null @@ -1,86 +0,0 @@ -class User { - constructor(){ - this.mobileNumber = '+38 (093) 989 89 89'; - this.homeNumber = '+38 (067) 989 89 89'; - this.render(); - } - - renderOptions(options) { - let {glyphicon, text} = options; - - return `
      -
      - ${text} -
      `; - } - - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; - - return ` - - ${text} - `; - } - - render() { - let shouldBeRendered = ` -
      -
      - -
      -
      - -
      -
      - # -
      User Name
      -
      - ${this.renderOptions({glyphicon:'comment', text:'message'})} - ${this.renderOptions({glyphicon:'earphone', text:'call'})} - ${this.renderOptions({glyphicon:'facetime-video', text:'video'})} - ${this.renderOptions({glyphicon:'envelope', text:'mail'})} -
      -
      -

      mobile

      -
      ${this.mobileNumber}
      -
      -
      -

      home

      -
      ${this.homeNumber}
      -
      - -
      -
      - -
      -
      - -
      -
      `; - - document.body.innerHTML = shouldBeRendered; - //this.setEvents(); - } -} - -const user = new User; \ No newline at end of file From 37e75e991587cf9a16ab2cc07ad4abe9557a3126 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Fri, 10 Aug 2018 17:08:31 +0300 Subject: [PATCH 13/19] refactoring v.2 --- phoneApp/index.html | 4 +- phoneApp/js/addUser.js | 94 ++++++------ phoneApp/js/api.js | 22 +++ phoneApp/js/app.js | 284 ++++++++++++++++--------------------- phoneApp/js/contacts.js | 147 ++++++++++--------- phoneApp/js/editContact.js | 110 +++++++------- phoneApp/js/keypad.js | 59 ++++---- phoneApp/js/router.js | 97 +++++++++++++ phoneApp/js/user.js | 44 +++--- 9 files changed, 448 insertions(+), 413 deletions(-) create mode 100644 phoneApp/js/api.js create mode 100644 phoneApp/js/router.js diff --git a/phoneApp/index.html b/phoneApp/index.html index 32fce21..1cc7503 100644 --- a/phoneApp/index.html +++ b/phoneApp/index.html @@ -17,8 +17,10 @@ - + + + \ No newline at end of file diff --git a/phoneApp/js/addUser.js b/phoneApp/js/addUser.js index 9ba1974..84654f2 100644 --- a/phoneApp/js/addUser.js +++ b/phoneApp/js/addUser.js @@ -5,56 +5,48 @@ //При удалении всех символов отобразить снова весь список class AddUser { - constructor(globalState){ - this.state = globalState; //стал равен this.state-у со страницы App.js - } + constructor(globalState) { + this.state = globalState; //стал равен this.state-у со страницы App.js + } - buttonsHandler(){ - let buttonsParent = document.querySelector('main'); - buttonsParent.addEventListener('click', this.clickHandler.bind(this)); - } + buttonsHandler() { + let buttonsParent = document.querySelector("main"); + buttonsParent.addEventListener("click", this.clickHandler.bind(this)); + } - clickHandler(e) { + clickHandler(e) { + let target = e && e.target; + if (!target) return; - let target = e && e.target; - if (!target) return; + let active = + e && + e.target && + (e.target.closest("button") || + e.target.classList.contains("add-btn")); + if (active == false) return; - let active = e && e.target && (e.target.closest('button') || e.target.classList.contains('add-btn')); - if (active == false) return; + let input = active.querySelector("input"); + input.style.backgroundColor = "lightgreen"; - let input = active.querySelector('input'); - input.style.backgroundColor = 'lightgreen'; + input.addEventListener("blur", () => { + input.removeAttribute("style"); + }); + } - input.addEventListener('blur', () => { - input.removeAttribute('style'); - }) - - } - - renderInfo(value) { - return `
      + renderInfo(value) { + return `
      `; - } + } - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; + setHandlers() { + this.buttonsHandler(); + } - return ` - - ${text} - ` - } - - setEvents(){ - this.buttonsHandler(); - } - - render() { - return `
      + render() { + return `
      - ${this.renderInfo('First Name')} - ${this.renderInfo('Last Name')} - ${this.renderInfo('Company')} + ${this.renderInfo("First Name")} + ${this.renderInfo("Last Name")} + ${this.renderInfo("Company")}
      - ${this.renderInfo('add mobile phone')} - ${this.renderInfo('add home phone')} - ${this.renderInfo('add email')} - ${this.renderInfo('add address')} - ${this.renderInfo('add birthday')} - ${this.renderInfo('add social profile')} - ${this.renderInfo('add field')} + ${this.renderInfo("add mobile phone")} + ${this.renderInfo("add home phone")} + ${this.renderInfo("add email")} + ${this.renderInfo("add address")} + ${this.renderInfo("add birthday")} + ${this.renderInfo("add social profile")} + ${this.renderInfo("add field")}
      - ` - - /*this.setEvents();*/ - } + `; + } } diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js new file mode 100644 index 0000000..1d93bb2 --- /dev/null +++ b/phoneApp/js/api.js @@ -0,0 +1,22 @@ +/* +TASK 2 +phone-app. Первая страница. +Загружайте пользователей с сервера при загрузке странице. +*/ + +/* +// contentEditable +Сделайте, чтобы на странице add-user.html пользователь +добавлялся на сервер. +/* +Добавить возможность из формы, ДОБАВЛЯТЬ Пользователя на сервер +add-user +*/ + +// Для PhoneBook сделайте отдельный репозиторий + gh-pages + +// Рекомендую - вам необходимо сделать 1 метод(или отдельный класс) +// который будет отправлять запросы +// доступ к этому сервису должен быть в каждом вашем классе +// url - должен быть константа, т.к url у вас изменяться не будет. + diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index 53c8eb9..b9d7af3 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -1,183 +1,137 @@ class App { - constructor(){ - this.state = { //равен ссылке, которая ведет на объект + constructor() { + this.state = { + //равен ссылке, которая ведет на объект people: [ - { - name: 'Иван', - lastName: 'Петров', - email: 'IvanPetrov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Сергеев', - email: 'SergeiSergeev@ec.ua' - }, - { - name: 'Иван', - lastName: 'Иванов', - email: 'IvanIvanov@ec.ua' - }, - { - name: 'Александр', - lastName: 'Александров', - email: 'AlexAlex@ec.ua' - }, - { - name: 'Алекс', - lastName: 'Смирнов', - email: 'AlexSmirnov@ec.ua' - }, - { - name: 'Сергей', - lastName: 'Волков', - email: 'VolkovSergey@ec.ua' - }, - { - name: 'Мария', - lastName: 'Шарапова', - email: 'MariyaSharapova@ec.ua' - }, - { - name: 'Александр', - lastName: 'Винник', - email: 'AlexVinnik@ec.ua' - }, - { - name: 'Дарий', - lastName: 'Смирнов', - email: 'DariySmirnov@ec.ua' - }, - { - name: 'Елена', - lastName: 'Лещенко', - email: 'ElenaLeshenko@ec.ua' - }, - { - name: 'Ольга', - lastName: 'Новикова', - email: 'OlgaNovikova@ec.ua' - }, - { - name: 'Наталья', - lastName: 'Шемякина', - email: 'ShemyakinaN@ec.ua' - }, - { - name: 'Анна', - lastName: 'Донцова', - email: 'AnnaDontsova@ec.ua' - }, - { - name: 'Влад', - lastName: 'Яма', - email: 'VladYama@ec.ua' - }, - { - name: 'Кира', - lastName: 'Воробьева', - email: 'Kira1990@ec.ua' - }, - { - name: 'Виктор', - lastName: 'Кривенко', - email: 'ViktorKriv@ec.ua' - } - ], - activePage: 'contacts' + { + name: "Иван", + lastName: "Петров", + email: "IvanPetrov@ec.ua" + }, + { + name: "Сергей", + lastName: "Сергеев", + email: "SergeiSergeev@ec.ua" + }, + { + name: "Иван", + lastName: "Иванов", + email: "IvanIvanov@ec.ua" + }, + { + name: "Александр", + lastName: "Александров", + email: "AlexAlex@ec.ua" + }, + { + name: "Алекс", + lastName: "Смирнов", + email: "AlexSmirnov@ec.ua" + }, + { + name: "Сергей", + lastName: "Волков", + email: "VolkovSergey@ec.ua" + }, + { + name: "Мария", + lastName: "Шарапова", + email: "MariyaSharapova@ec.ua" + }, + { + name: "Александр", + lastName: "Винник", + email: "AlexVinnik@ec.ua" + }, + { + name: "Дарий", + lastName: "Смирнов", + email: "DariySmirnov@ec.ua" + }, + { + name: "Елена", + lastName: "Лещенко", + email: "ElenaLeshenko@ec.ua" + }, + { + name: "Ольга", + lastName: "Новикова", + email: "OlgaNovikova@ec.ua" + }, + { + name: "Наталья", + lastName: "Шемякина", + email: "ShemyakinaN@ec.ua" + }, + { + name: "Анна", + lastName: "Донцова", + email: "AnnaDontsova@ec.ua" + }, + { + name: "Влад", + lastName: "Яма", + email: "VladYama@ec.ua" + }, + { + name: "Кира", + lastName: "Воробьева", + email: "Kira1990@ec.ua" + }, + { + name: "Виктор", + lastName: "Кривенко", + email: "ViktorKriv@ec.ua" + } + ], + activePage: "contacts", + }; - - this.pages = { - contacts: new ContactsPage(this.state), // тут передали ссылку на this.state + //this.setState = this.changeState(); + this.pages = { + contacts: new ContactsPage(this.state), // тут передали ссылку на this.state adduser: new AddUser(this.state), - keypad: new KeypadPage(this.state), - editcontact: new EditContact(this.state), - user: new User(this.state) - }; + keypad: new KeypadPage(this.state), + editcontact: new EditContact(this.state), + user: new User(this.state), + router: new Router(this.state) + }; - this.initializeRouter(); - this.switchRouter(); + this.pages.router.initializeRouter(); + this.pages.router.switchRouter(); + this.appDOMNode = document.getElementById("app"); // сюда будем делать рендер всех страниц + // и это не будет затрагивать футер и его события + } - } - initializeRouter () { - const mountNode = document.getElementById('mountNode'); - //console.log(mountNode); - mountNode.innerHTML = ` -
      -
      -
      - -
      -
      `; + /* changeState(value) { + console.log(this.state); - //this.initializeRouterHandlers(); - this.appDOMNode = mountNode.querySelector('#app'); // сюда будем делать рендер всех страниц - // и это не будет затрагивать футер и его события - } + let currentState = this.state.activePage; - renderNewPage() { + if (currentState != value) { + this.state.activePage = value; + this.renderNewPage(); + } + return this.state.activePage; + }*/ + + renderNewPage() { this.appDOMNode.innerHTML = this.pages[this.state.activePage].render(); + this.pages[this.state.activePage].setHandlers(); } - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; + render() { + const { activePage } = this.state; + //const activePage = this.state.activePage; // то же самое - return ` - - ${text} - ` + // this.updateView(); + this.appDOMNode.innerHTML = this.pages[activePage].render(); // и отрендерь ту страничку, + this.pages[this.state.activePage].setHandlers(); + // которая сейчас указана как activePage в this.state } - - - switchRouter() { - const parent = document.querySelector('.main-nav'); - parent.addEventListener('click', (e) => { - e.preventDefault(); - //let target = e && e.target; - let target = e && e.target && (e.target.closest('a') || e.target.classList.contains('tab')); - if (target == false) return; - - //console.log(target); - - if (target.classList.contains('active')) return; - if (target.classList.contains('tab')) { - let active = document.querySelector('.active'); - - active.classList.remove('active'); - target.classList.add('active'); - - let href = target.getAttribute('href'); - //console.log(href); - this.state.activePage = href.replace(/-/g, '').toLowerCase(); - //console.log(this.state.activePage); - this.renderNewPage(); - } - return; - }) - } - // updateView() { - // const activePage = this.state.activePage; - // this.pages[activePage].updateState(this.state); //updateState делаем на каждой странице - // - // } - render() { - const {activePage} = this.state; - //const activePage = this.state.activePage; // то же самое - - // this.updateView(); - this.appDOMNode.innerHTML = this.pages[activePage].render(); // и отрендерь ту страничку, - // которая сейчас указана как activePage в this.state - - } } const app = new App(); -app.render(); \ No newline at end of file +app.render(); diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index 6cc8c85..59a084f 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -3,147 +3,145 @@ //после ввода каждого символа, фильтровать отображаемых пользователей. //При удалении всех символов отобразить снова весь список -'use strict'; +"use strict"; class ContactsPage { - constructor(globalState){ + constructor(globalState) { this.state = globalState; //стал равен this.state-у со страницы App.js - this.title = 'Contacts'; - this.tableCaptions = ['Name', 'Last name', 'Email']; + this.title = "Contacts"; + this.tableCaptions = ["Name", "Last name", "Email"]; } - reRenderTable(arr){ - + reRenderTable(arr) { let tableBody = this.createTableBodyRow(arr); - let pattern = ` + let pattern = ` ${tableBody} `; - let parent = document.querySelector('table'); - let shouldBeReplaced = document.querySelector('tbody'); + let parent = document.querySelector("table"); + let shouldBeReplaced = document.querySelector("tbody"); parent.removeChild(shouldBeReplaced); - parent.insertAdjacentHTML('beforeEnd', pattern); + parent.insertAdjacentHTML("beforeEnd", pattern); } - createTableHeadRow(arr){ - let items = arr.map(item => { - return `${item}` - - }).join(''); + createTableHeadRow(arr) { + let items = arr + .map(item => { + return `${item}`; + }) + .join(""); - return ` + return ` ${items} - ` + `; } - createTableBodyRow(arr){ + createTableBodyRow(arr) { if (!arr) { arr = this.state.people; - }; + } - return arr.map(item => { - return ` + return arr + .map(item => { + return ` ${item.name} ${item.lastName} ${item.email} `; - }).join(''); + }) + .join(""); } sortColumnsHandler() { - let parent = document.querySelector('thead'); - parent.addEventListener('click', this.sortColumns.bind(this)); + let parent = document.querySelector("thead"); + parent.addEventListener("click", this.sortColumns.bind(this)); } sortColumns() { let target = event.target; - this.tableCaptions.forEach((item) => { + this.tableCaptions.forEach(item => { if (target.textContent == item) { - item = this.makeCamelCase(item); - this.sortUsers(item); - this.render(); + item = this.makeCamelCase(item); + let sorted = this.sortUsers(item); + this.reRenderTable(sorted); } - }) + }); } - makeCamelCase(str){ + makeCamelCase(str) { str = str.toLowerCase(); - if (str.includes(' ')) { //'last name' - let arr = str.split(' '); //['last', 'name'] + if (str.includes(" ")) { + //'last name' + let arr = str.split(" "); //['last', 'name'] - let capitalizedArr = arr.map((item, i) => { - if ( i > 0) { - let itemToArray = item.split(''); //['n', 'a', 'm', 'e'] - let firstLetter = itemToArray[0].toUpperCase(); - itemToArray.splice(0, 1, firstLetter); - return itemToArray.join(''); - } - return item; - }); // end of map + let capitalizedArr = arr.map((item, i) => { + if (i > 0) { + let itemToArray = item.split(""); //['n', 'a', 'm', 'e'] + let firstLetter = itemToArray[0].toUpperCase(); + itemToArray.splice(0, 1, firstLetter); + return itemToArray.join(""); + } + return item; + }); // end of map - str = capitalizedArr.join(''); - }; + str = capitalizedArr.join(""); + } return str; } sortUsers(str) { - function compare(a, b){ - if (isNaN(a[str])) { - - if (a[str] > b[str]) { - return 1; - }; - if (a[str] < b[str]) { - return -1; - }; - if (a[str] == b[str]) { - return 0; - } - - } else { - return (a[str] - b[str]); + function compare(a, b) { + if (isNaN(a[str])) { + if (a[str] > b[str]) { + return 1; } - - } - //console.log(this.state.people.sort(compare)) - return this.state.people.sort(compare); + if (a[str] < b[str]) { + return -1; + } + if (a[str] == b[str]) { + return 0; + } + } else { + return a[str] - b[str]; + } + } + //console.log(this.state.people.sort(compare)) + return this.state.people.sort(compare); } - searchUserHandler() { - this.searchField = document.querySelector('#search'); - this.searchField.addEventListener('input', this.filterUser.bind(this)); + this.searchField = document.querySelector("#search"); + this.searchField.addEventListener("input", this.filterUser.bind(this)); } filterUser() { let value = this.searchField.value.toLowerCase(); - let filteredUsers = this.state.people.filter((item) => { //{name:'ghjk', phone:'37686'} + let filteredUsers = this.state.people.filter(item => { - if (item.name.toLowerCase().includes(value)) { - return item; - } + if (item.name.toLowerCase().includes(value)) { + return item; + } return; - }) + }); //console.log(filteredUsers); this.reRenderTable(filteredUsers); - } - setEvents() { + setHandlers() { this.sortColumnsHandler(); this.searchUserHandler(); } - render(users){ + render(users) { return `
      @@ -171,8 +169,5 @@ class ContactsPage {
      `; - - // this.setEvents(); } } - diff --git a/phoneApp/js/editContact.js b/phoneApp/js/editContact.js index 15257b6..a233212 100644 --- a/phoneApp/js/editContact.js +++ b/phoneApp/js/editContact.js @@ -3,59 +3,49 @@ //- изменять backgroundColor class EditContact { - constructor(globalState){ - this.state = globalState; //стал равен this.state-у со страницы App.js - this.phoneNumber = '+38 (063) 733 44 55'; - } + constructor(globalState) { + this.state = globalState; //стал равен this.state-у со страницы App.js + this.phoneNumber = "+38 (063) 733 44 55"; + } - renderInfo(value) { - - return `
      + renderInfo(value) { + return `
      `; - } - - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; - - return ` - - ${text} - ` - } - - buttonsHandler(){ - let buttonsParent = document.querySelector('main'); - buttonsParent.addEventListener('click', this.clickHandler.bind(this)); - } - - clickHandler(e) { - - let target = e && e.target; - if (!target) return; - - let active = e && e.target && (e.target.closest('button') || e.target.classList.contains('add-btn')); - if (active == false) return; - - let input = active.querySelector('input'); - input.style.backgroundColor = 'lightgreen'; - - input.addEventListener('blur', () => { - input.removeAttribute('style'); - }) - - } - - - setEvents(){ - this.buttonsHandler(); - } - - render() { - return `
      + } + + buttonsHandler() { + let buttonsParent = document.querySelector("main"); + buttonsParent.addEventListener("click", this.clickHandler.bind(this)); + } + + clickHandler(e) { + let target = e && e.target; + if (!target) return; + + let active = + e && + e.target && + (e.target.closest("button") || + e.target.classList.contains("add-btn")); + if (active == false) return; + + let input = active.querySelector("input"); + input.style.backgroundColor = "lightgreen"; + + input.addEventListener("blur", () => { + input.removeAttribute("style"); + }); + } + + setHandlers() { + this.buttonsHandler(); + } + + render() { + return `
      - ` - - /*this.setEvents();*/ - } + `; + } } diff --git a/phoneApp/js/keypad.js b/phoneApp/js/keypad.js index f2e7c31..37610d5 100644 --- a/phoneApp/js/keypad.js +++ b/phoneApp/js/keypad.js @@ -18,20 +18,27 @@ //2. Формат номера должен быть таким (099)-17-38-170 class KeypadPage { - constructor(globalState){ + constructor(globalState) { this.state = globalState; //стал равен this.state-у со страницы App.js + this.title = 'Keypad'; } - buttonsHandler(){ - let buttonsParent = document.querySelector('main'); - let placeToInsertNumbers = document.querySelector('.numbers'); - - buttonsParent.addEventListener('click', this.clickHandler.bind(this, placeToInsertNumbers)); - window.addEventListener('keypress', this.keyHandler.bind(this, placeToInsertNumbers)); + buttonsHandler() { + let buttonsParent = document.querySelector("main"); + let placeToInsertNumbers = document.querySelector(".numbers"); + + buttonsParent.addEventListener( + "click", + this.clickHandler.bind(this, placeToInsertNumbers) + ); + window.addEventListener( + "keypress", + this.keyHandler.bind(this, placeToInsertNumbers) + ); } keyHandler(display, e) { - let pattern = /[0-9]/; //дописать регвыражение для #*-() + let pattern = /[0-9]/; //дописать регвыражение для #*-() if (e.ctrlKey || e.altKey || e.metaKey) return; var code = e.key; @@ -43,38 +50,28 @@ class KeypadPage { return; } - clickHandler(display, e){ - let target = e.target; + clickHandler(display, e) { + let target = e.target; if (!target) return; - if (target.classList.contains('key')) { - display.innerHTML += target.textContent; - } + if (target.classList.contains("key")) { + display.innerHTML += target.textContent; + } - if (target.classList.contains('glyphicon-circle-arrow-left')) { - let insertedNumbersArr = display.innerHTML.split(''); + if (target.classList.contains("glyphicon-circle-arrow-left")) { + let insertedNumbersArr = display.innerHTML.split(""); if (insertedNumbersArr.length > 0) { - let numberWithoutLast = insertedNumbersArr.slice(0,-1).join(''); + let numberWithoutLast = insertedNumbersArr.slice(0, -1).join(""); display.innerHTML = numberWithoutLast; } } } - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; - - return ` - - ${text} - ` - } - - setEvents(){ - this.buttonsHandler(); + setHandlers() { + this.buttonsHandler(); } - render(){ + render() { return `

      ${this.title}

      @@ -104,9 +101,7 @@ class KeypadPage {
      - ` + `; } } -//const keypad = new KeypadPage(); - diff --git a/phoneApp/js/router.js b/phoneApp/js/router.js new file mode 100644 index 0000000..a126260 --- /dev/null +++ b/phoneApp/js/router.js @@ -0,0 +1,97 @@ +class Router { +// constructor(activePage) { +// this.activePage = activePage; + constructor(globalState) { + this.state = globalState; + } + + initializeRouter() { + const mountNode = document.getElementById("mountNode"); + //console.log(mountNode); + mountNode.innerHTML = ` +
      +
      +
      + +
      +
      `; + + this.linksParent = document.querySelector(".main-nav"); + //this.state.appDOMNode = document.getElementById("app"); // сюда будем делать рендер всех страниц + // и это не будет затрагивать футер и его события + } + + switchRouter() { + this.linksParent.addEventListener("click", e => { + e.preventDefault(); + //let target = e && e.target; + let target = + e && + e.target && + (e.target.closest("a") || e.target.classList.contains("tab")); //You can add additional attributes + //to every link and indicate "user clicked on link" that way. on real word usage probably we should be always 100% be sure about our target + if (target == false) return; + + //console.log(target); + + if (target.classList.contains("active")) return; + if (target.classList.contains("tab")) { + let active = document.querySelector(".active"); //So, for example, you could the same solution as we did with a slider in class. + + active.classList.remove("active"); + target.classList.add("active"); + + let href = target.getAttribute("href"); + //console.log(href); + this.state.activePage = href; + //console.log(this.activePage); + //this.state.setState(href); + //this.renderNewPage(); + console.log(this.state.activePage) + } + return; + }); + } + + renderLink(options) { + let { href, glyphicon, text, active } = options; + let activeClass = active ? "active" : ""; + + return ` + + ${text} + `; + } + +} \ No newline at end of file diff --git a/phoneApp/js/user.js b/phoneApp/js/user.js index 2acafb5..8f6cd32 100644 --- a/phoneApp/js/user.js +++ b/phoneApp/js/user.js @@ -1,31 +1,25 @@ class User { - constructor(globalState){ - this.state = globalState; //стал равен this.state-у со страницы App.js - this.mobileNumber = '+38 (093) 989 89 89'; - this.homeNumber = '+38 (067) 989 89 89'; - } + constructor(globalState) { + this.state = globalState; //стал равен this.state-у со страницы App.js + this.mobileNumber = "+38 (093) 989 89 89"; + this.homeNumber = "+38 (067) 989 89 89"; + } - renderOptions(options) { - let {glyphicon, text} = options; + renderOptions(options) { + let { glyphicon, text } = options; - return `
      + return `
      ${text}
      `; - } + } - renderLink(options) { - let {href, glyphicon, text, active} = options; - let activeClass = active ? 'active' : ''; + setHandlers() { - return ` - - ${text} - `; - } + } - render() { - return `
      + render() { + return `
      `; - - //this.setEvents(); - } + } } From 390e16a4327d06f96ba02141775997d1cd7a723b Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sun, 12 Aug 2018 23:12:36 +0300 Subject: [PATCH 14/19] try to make request --- phoneApp/index.html | 5 +++-- phoneApp/js/api.js | 36 +++++++++++++++++++++++++++++++++++- phoneApp/js/app.js | 24 ++++++++++++++---------- phoneApp/js/contacts.js | 16 +++++++++++++++- 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/phoneApp/index.html b/phoneApp/index.html index 1cc7503..d8a75ae 100644 --- a/phoneApp/index.html +++ b/phoneApp/index.html @@ -11,14 +11,15 @@
      - + - + + diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js index 1d93bb2..ec7fea0 100644 --- a/phoneApp/js/api.js +++ b/phoneApp/js/api.js @@ -18,5 +18,39 @@ add-user // Рекомендую - вам необходимо сделать 1 метод(или отдельный класс) // который будет отправлять запросы // доступ к этому сервису должен быть в каждом вашем классе -// url - должен быть константа, т.к url у вас изменяться не будет. +// url - должен быть константа, т.к url у вас изменяться не будет.cons +/*class Api { + constructor(globalState){ + this.state = globalState; + } + + getAllUsers() { + const url = `http://easycode-js.herokuapp.com/pnv/users` + const xhr = new XMLHttpRequest(); + xhr.onreadystatechange = () => { + if (xhr.readyState === XMLHttpRequest.DONE){ + console.log(xhr.responseText); + this.state.people = JSON.parse(xhr.responseText); + } + } + xhr.open('GET', url, true); + xhr.send(); + } +}*/ + + +const getPhoneUsersAPI = { + getAllUsers(callback) { + const url = `http://easycode-js.herokuapp.com/pnv/users` + const xhr = new XMLHttpRequest(); + xhr.onreadystatechange = () => { + if (xhr.readyState === XMLHttpRequest.DONE){ + let users = (JSON.parse(xhr.responseText)); + callback(users); + } + } + xhr.open('GET', url, true); + xhr.send(); + } +} \ No newline at end of file diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index b9d7af3..2b7e19d 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -2,7 +2,7 @@ class App { constructor() { this.state = { //равен ссылке, которая ведет на объект - people: [ + /*people: [ { name: "Иван", lastName: "Петров", @@ -83,7 +83,7 @@ class App { lastName: "Кривенко", email: "ViktorKriv@ec.ua" } - ], + ],*/ activePage: "contacts", }; @@ -94,7 +94,8 @@ class App { keypad: new KeypadPage(this.state), editcontact: new EditContact(this.state), user: new User(this.state), - router: new Router(this.state) + router: new Router(this.state), + //api: new Api(this.state) }; this.pages.router.initializeRouter(); @@ -117,21 +118,24 @@ class App { }*/ - renderNewPage() { +/* renderNewPage() { this.appDOMNode.innerHTML = this.pages[this.state.activePage].render(); this.pages[this.state.activePage].setHandlers(); - } + }*/ render() { const { activePage } = this.state; //const activePage = this.state.activePage; // то же самое - // this.updateView(); this.appDOMNode.innerHTML = this.pages[activePage].render(); // и отрендерь ту страничку, - this.pages[this.state.activePage].setHandlers(); - // которая сейчас указана как activePage в this.state + this.pages[this.state.activePage].setHandlers();// которая сейчас указана как activePage в this.state + } + + static initialize() { + return new App().render(); } } -const app = new App(); -app.render(); +/*const app = new App(); +app.render();*/ +App.initialize(); \ No newline at end of file diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index 59a084f..bf6bf58 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -18,7 +18,7 @@ class ContactsPage { let pattern = ` ${tableBody} - `; + `; let parent = document.querySelector("table"); let shouldBeReplaced = document.querySelector("tbody"); @@ -139,9 +139,23 @@ class ContactsPage { setHandlers() { this.sortColumnsHandler(); this.searchUserHandler(); +/* window.addEventListener('load', () => { + getPhoneUsersAPI.getAllUsers((users) => { + console.log('USERS from contacts', users); + this.people = users; + });// из api + })*/ } render(users) { + window.addEventListener('load', () => { + getPhoneUsersAPI.getAllUsers((users) => { + console.log('USERS from contacts', users); + this.people = users; + + });// из api + }) + return `
      From b3debdac4aebe475020b5cc4df9807072d4b7883 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Wed, 15 Aug 2018 17:35:53 +0300 Subject: [PATCH 15/19] some changes --- phoneApp/js/api.js | 42 ++++--------- phoneApp/js/app.js | 124 +++++++++---------------------------- phoneApp/js/contacts.js | 22 ++++--- phoneApp/js/editContact.js | 9 ++- phoneApp/js/keypad.js | 5 +- phoneApp/js/router.js | 35 ++++++----- 6 files changed, 82 insertions(+), 155 deletions(-) diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js index ec7fea0..955bfa0 100644 --- a/phoneApp/js/api.js +++ b/phoneApp/js/api.js @@ -20,37 +20,17 @@ add-user // доступ к этому сервису должен быть в каждом вашем классе // url - должен быть константа, т.к url у вас изменяться не будет.cons -/*class Api { - constructor(globalState){ - this.state = globalState; - } - getAllUsers() { - const url = `http://easycode-js.herokuapp.com/pnv/users` - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE){ - console.log(xhr.responseText); - this.state.people = JSON.parse(xhr.responseText); - } - } - xhr.open('GET', url, true); - xhr.send(); - } -}*/ +// все запросы к серверу вот здесь +class Api { + constructor(url) { + this.url = url; + } -const getPhoneUsersAPI = { - getAllUsers(callback) { - const url = `http://easycode-js.herokuapp.com/pnv/users` - const xhr = new XMLHttpRequest(); - xhr.onreadystatechange = () => { - if (xhr.readyState === XMLHttpRequest.DONE){ - let users = (JSON.parse(xhr.responseText)); - callback(users); - } - } - xhr.open('GET', url, true); - xhr.send(); - } -} \ No newline at end of file + requestUsers() { + return fetch(this.url).then(data => data.json()); + } +} +//const url = 'https://google.com'; +//const api = new Api(url + 'user'); \ No newline at end of file diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index 2b7e19d..ad5bdc9 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -2,77 +2,7 @@ class App { constructor() { this.state = { //равен ссылке, которая ведет на объект - /*people: [ - { - name: "Иван", - lastName: "Петров", - email: "IvanPetrov@ec.ua" - }, - { - name: "Сергей", - lastName: "Сергеев", - email: "SergeiSergeev@ec.ua" - }, - { - name: "Иван", - lastName: "Иванов", - email: "IvanIvanov@ec.ua" - }, - { - name: "Александр", - lastName: "Александров", - email: "AlexAlex@ec.ua" - }, - { - name: "Алекс", - lastName: "Смирнов", - email: "AlexSmirnov@ec.ua" - }, - { - name: "Сергей", - lastName: "Волков", - email: "VolkovSergey@ec.ua" - }, - { - name: "Мария", - lastName: "Шарапова", - email: "MariyaSharapova@ec.ua" - }, - { - name: "Александр", - lastName: "Винник", - email: "AlexVinnik@ec.ua" - }, - { - name: "Дарий", - lastName: "Смирнов", - email: "DariySmirnov@ec.ua" - }, - { - name: "Елена", - lastName: "Лещенко", - email: "ElenaLeshenko@ec.ua" - }, - { - name: "Ольга", - lastName: "Новикова", - email: "OlgaNovikova@ec.ua" - }, - { - name: "Наталья", - lastName: "Шемякина", - email: "ShemyakinaN@ec.ua" - }, - { - name: "Анна", - lastName: "Донцова", - email: "AnnaDontsova@ec.ua" - }, - { - name: "Влад", - lastName: "Яма", - email: "VladYama@ec.ua" - }, +/* people: [ { name: "Кира", lastName: "Воробьева", @@ -85,9 +15,8 @@ class App { } ],*/ activePage: "contacts", - }; - //this.setState = this.changeState(); + this.url = `https://easycode-js.herokuapp.com/pnv2/users`; this.pages = { contacts: new ContactsPage(this.state), // тут передали ссылку на this.state adduser: new AddUser(this.state), @@ -95,40 +24,45 @@ class App { editcontact: new EditContact(this.state), user: new User(this.state), router: new Router(this.state), - //api: new Api(this.state) + api: new Api(this.url) }; this.pages.router.initializeRouter(); - this.pages.router.switchRouter(); + this.pages.router.definePage(this.render.bind(this)); this.appDOMNode = document.getElementById("app"); // сюда будем делать рендер всех страниц // и это не будет затрагивать футер и его события + +/* window.addEventListener('popstate'. event => { // не работает + render(event.state); + })*/ } + render(href) { + const { activePage } = this.state; - /* changeState(value) { - console.log(this.state); + if (activePage == 'contacts') { + let response = this.pages.api.requestUsers();//сюда вернулся промис + response + .then(data => { + this.state.people = data; + this.completeRender(activePage); + }) + .catch(error => console.log('error', error)); - let currentState = this.state.activePage; + } else { - if (currentState != value) { - this.state.activePage = value; - this.renderNewPage(); - } - return this.state.activePage; - }*/ + this.completeRender(activePage); + } + } + completeRender(activePage) { + const forHistory = this.pages[activePage].render(); + this.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку, + // которая сейчас указана как activePage в this.state + this.pages[activePage].setHandlers(); //и навесь обработчики событий -/* renderNewPage() { - this.appDOMNode.innerHTML = this.pages[this.state.activePage].render(); - this.pages[this.state.activePage].setHandlers(); - }*/ + //window.history.pushState(forHistory, href, href) // ДОПИСАТЬ!!! - render() { - const { activePage } = this.state; - //const activePage = this.state.activePage; // то же самое - // this.updateView(); - this.appDOMNode.innerHTML = this.pages[activePage].render(); // и отрендерь ту страничку, - this.pages[this.state.activePage].setHandlers();// которая сейчас указана как activePage в this.state } static initialize() { @@ -136,6 +70,4 @@ class App { } } -/*const app = new App(); -app.render();*/ App.initialize(); \ No newline at end of file diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index bf6bf58..44290d0 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -13,7 +13,7 @@ class ContactsPage { this.tableCaptions = ["Name", "Last name", "Email"]; } - reRenderTable(arr) { + reRenderTable(arr) { // сделать, чтобы это был один метод рендера и лежал он в app.js let tableBody = this.createTableBodyRow(arr); let pattern = ` @@ -46,9 +46,10 @@ class ContactsPage { return arr .map(item => { + const [name, surname] = item.fullName.split(' ') return ` - ${item.name} - ${item.lastName} + ${name} + ${surname} ${item.email} `; }) @@ -62,11 +63,14 @@ class ContactsPage { sortColumns() { let target = event.target; - + console.log(target) this.tableCaptions.forEach(item => { if (target.textContent == item) { + console.log(true) item = this.makeCamelCase(item); + console.log(item) let sorted = this.sortUsers(item); + console.log(sorted) this.reRenderTable(sorted); } }); @@ -96,6 +100,7 @@ class ContactsPage { } sortUsers(str) { + console.log(str)//тут опять нужно делить фуллнейм - вынести дележ этот в отдельную ф-цию? function compare(a, b) { if (isNaN(a[str])) { if (a[str] > b[str]) { @@ -122,10 +127,11 @@ class ContactsPage { filterUser() { let value = this.searchField.value.toLowerCase(); - + let filteredUsers = this.state.people.filter(item => { + let name = item.fullName.split(' ')[0]; - if (item.name.toLowerCase().includes(value)) { + if (name.toLowerCase().includes(value)) { return item; } @@ -148,13 +154,13 @@ class ContactsPage { } render(users) { - window.addEventListener('load', () => { +/* window.addEventListener('load', () => { getPhoneUsersAPI.getAllUsers((users) => { console.log('USERS from contacts', users); this.people = users; });// из api - }) + })*/ return `
      diff --git a/phoneApp/js/editContact.js b/phoneApp/js/editContact.js index a233212..545f973 100644 --- a/phoneApp/js/editContact.js +++ b/phoneApp/js/editContact.js @@ -29,11 +29,14 @@ class EditContact { e && e.target && (e.target.closest("button") || - e.target.classList.contains("add-btn")); - if (active == false) return; + e.target.classList.contains("add-btn"));// what if another dev would change that className at button - javascript would break ? + //We shouldn't rely on classsNames + if (active == false) { + return; + } let input = active.querySelector("input"); - input.style.backgroundColor = "lightgreen"; + input.style.backgroundColor = "lightgreen";//probably you can make it something like with CSS :focus { ...} JavaScript not really required there input.addEventListener("blur", () => { input.removeAttribute("style"); diff --git a/phoneApp/js/keypad.js b/phoneApp/js/keypad.js index 37610d5..bce260c 100644 --- a/phoneApp/js/keypad.js +++ b/phoneApp/js/keypad.js @@ -24,14 +24,15 @@ class KeypadPage { } buttonsHandler() { - let buttonsParent = document.querySelector("main"); + let buttonsParent = document.querySelector("main"); // please you const keyword instead of let let placeToInsertNumbers = document.querySelector(".numbers"); buttonsParent.addEventListener( "click", this.clickHandler.bind(this, placeToInsertNumbers) ); - window.addEventListener( + window.addEventListener( //are ever remove such listener? + // for example when-even you changing a page "keypress", this.keyHandler.bind(this, placeToInsertNumbers) ); diff --git a/phoneApp/js/router.js b/phoneApp/js/router.js index a126260..35a5437 100644 --- a/phoneApp/js/router.js +++ b/phoneApp/js/router.js @@ -1,13 +1,12 @@ class Router { -// constructor(activePage) { -// this.activePage = activePage; + //constructor(activePage) { + // this.activePage = activePage; constructor(globalState) { this.state = globalState; } initializeRouter() { const mountNode = document.getElementById("mountNode"); - //console.log(mountNode); mountNode.innerHTML = `
      @@ -48,11 +47,9 @@ class Router {
      `; this.linksParent = document.querySelector(".main-nav"); - //this.state.appDOMNode = document.getElementById("app"); // сюда будем делать рендер всех страниц - // и это не будет затрагивать футер и его события } - switchRouter() { + definePage(callback) { //function switchRounter, should only change the router and don't make any checks and probably has a minimal of conditionals this.linksParent.addEventListener("click", e => { e.preventDefault(); //let target = e && e.target; @@ -61,11 +58,15 @@ class Router { e.target && (e.target.closest("a") || e.target.classList.contains("tab")); //You can add additional attributes //to every link and indicate "user clicked on link" that way. on real word usage probably we should be always 100% be sure about our target - if (target == false) return; + //I'm pretty sure you don't need such event delegation because of your event working on a small area of responsibilities. + if (target == false) { + return; + } - //console.log(target); + if (target.classList.contains("active")) { + return; + } - if (target.classList.contains("active")) return; if (target.classList.contains("tab")) { let active = document.querySelector(".active"); //So, for example, you could the same solution as we did with a slider in class. @@ -73,17 +74,21 @@ class Router { target.classList.add("active"); let href = target.getAttribute("href"); - //console.log(href); - this.state.activePage = href; - //console.log(this.activePage); - //this.state.setState(href); - //this.renderNewPage(); - console.log(this.state.activePage) + + this.switchRouter(href, callback); + //console.log('active page:', this.activePage) } return; }); } + switchRouter(href, callback) { + this.state.activePage = href; + callback(href); + + //window.history.pushState() + } + renderLink(options) { let { href, glyphicon, text, active } = options; let activeClass = active ? "active" : ""; From 9f21e51db462070ac808492dc2fcced34369ddb2 Mon Sep 17 00:00:00 2001 From: Nataliia Date: Thu, 16 Aug 2018 20:02:00 +0300 Subject: [PATCH 16/19] adding user was done --- phoneApp/css/main.css | 4 ++ phoneApp/js/addUser.js | 122 +++++++++++++++++++++++++------------ phoneApp/js/api.js | 23 +++++-- phoneApp/js/app.js | 28 ++++++++- phoneApp/js/contacts.js | 99 +++++++++++++++++++++++------- phoneApp/js/editContact.js | 17 ++---- 6 files changed, 211 insertions(+), 82 deletions(-) diff --git a/phoneApp/css/main.css b/phoneApp/css/main.css index 4c29a4d..62f2df9 100644 --- a/phoneApp/css/main.css +++ b/phoneApp/css/main.css @@ -332,4 +332,8 @@ input { color: #e32910; margin: 0 auto; font-weight: bold; +} + +.active-input { + background: lightgreen; } \ No newline at end of file diff --git a/phoneApp/js/addUser.js b/phoneApp/js/addUser.js index 84654f2..061b0be 100644 --- a/phoneApp/js/addUser.js +++ b/phoneApp/js/addUser.js @@ -18,38 +18,80 @@ class AddUser { let target = e && e.target; if (!target) return; - let active = - e && - e.target && - (e.target.closest("button") || - e.target.classList.contains("add-btn")); - if (active == false) return; - - let input = active.querySelector("input"); - input.style.backgroundColor = "lightgreen"; - - input.addEventListener("blur", () => { - input.removeAttribute("style"); + if (target.tagName === 'INPUT') { + target.classList.add('active-input'); + } + + target.addEventListener("blur", () => { + target.classList.remove('active-input'); }); } - renderInfo(value) { + addUser() { + + const {name, lastName, email, phone} = this.form.elements; // name, lastName, email, phone - атрибуты name у элементов формы + + if (!name.value) { + alert('заполните name'); + return; + }; + if (!lastName.value) { + alert('заполните Last Name'); + return; + }; + if (!email.value) { + alert('заполните email'); + return; + }; + if (!phone.value) { + alert('заполните phone'); + return; + }; + + let fullName = `${name.value} ${lastName.value}`; + + this.state.api.postUser([fullName, email.value, phone.value]); + + this.clearFields(); + + } + + clearFields() { + let myFormElements = this.form.elements; + + [...myFormElements].forEach((item) => { + if (item.tagName === 'INPUT') { + item.value = ''; + } + }) + } + + renderInfo(options) { + let { placeholder, name } = options; return `
      `; } setHandlers() { this.buttonsHandler(); + this.addButton = document.querySelector(".done-btn"); + this.deleteButton = document.querySelector(".delete-contact"); + this.form = document.forms[0]; + this.form.addEventListener('submit', event => { + event.preventDefault(); + }) + this.addButton.addEventListener('click', this.addUser.bind(this)); + this.deleteButton.addEventListener('click', this.clearFields.bind(this)); } render() { return `
      @@ -57,33 +99,35 @@ class AddUser {
      -
      -
      - -
      -
      - ${this.renderInfo("First Name")} - ${this.renderInfo("Last Name")} - ${this.renderInfo("Company")} +
      +
      +
      + +
      +
      + ${this.renderInfo({ placeholder:"First Name", name:"name"})} + ${this.renderInfo({ placeholder:"Last Name", name:"lastName"})} + ${this.renderInfo({ placeholder:"Company", name:"company"})} +
      -
      -
      -
      - ${this.renderInfo("add mobile phone")} - ${this.renderInfo("add home phone")} - ${this.renderInfo("add email")} - ${this.renderInfo("add address")} - ${this.renderInfo("add birthday")} - ${this.renderInfo("add social profile")} - ${this.renderInfo("add field")} -
      - +
      +
      + ${this.renderInfo({ placeholder:"add mobile phone", name:"phone"})} + ${this.renderInfo({ placeholder:"add home phone", name:"homePhone"})} + ${this.renderInfo({ placeholder:"add email", name:"email"})} + ${this.renderInfo({ placeholder:"add address", name:"address"})} + ${this.renderInfo({ placeholder:"add birthday", name:"birthday"})} + ${this.renderInfo({ placeholder:"add social profile", name:"profile"})} + ${this.renderInfo({ placeholder:"add field", name:"field"})} +
      + +
      -
      +
      `; } diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js index 955bfa0..f3c7b2b 100644 --- a/phoneApp/js/api.js +++ b/phoneApp/js/api.js @@ -1,10 +1,10 @@ /* -TASK 2 +TASK 2 -------DONE------------------- phone-app. Первая страница. Загружайте пользователей с сервера при загрузке странице. */ -/* +/*-----------DONE------------------------ // contentEditable Сделайте, чтобы на странице add-user.html пользователь добавлялся на сервер. @@ -31,6 +31,21 @@ class Api { requestUsers() { return fetch(this.url).then(data => data.json()); } + + postUser(arr) { + const [fullName, email, phone] = arr; + console.log(arr) + return fetch(this.url, { + method: 'POST', + headers: { + 'Content-type': 'application/json' + }, + body: JSON.stringify({ + fullName: fullName, + email: email, + phone: phone + }) + }) + } + } -//const url = 'https://google.com'; -//const api = new Api(url + 'user'); \ No newline at end of file diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index ad5bdc9..27474f3 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -1,5 +1,25 @@ +/*ДЗ +Cделать phone-book +у которого будет: +1) Вы заполните пользователей на сервер по адресу с вашими инициалами. +2) При загрузке приложения, вы получите пользователей с сервера +3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет) +4) При нажатии на пользователя будет открываться данный пользователь +5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact) +---------------- ~90 балов +Для тех кто хочет +500$ к зарплате на старте +6) Добавить удаление пользователей (2) +7) Должна быть модульная структура и Проект должен собираться при помощи webpack(2) (!) +8) Проект должен транспайлится через babel последние 2 версии браузеров (2) (!) +9) и после публикации на gh-pages, должен быть минифицирован(2) +10) добавьте еще одну первую страницу на которой будет "auth" +в этот инпут можно ввести инициалы easycode студента (2) +в зависимости от этого будут загружаться разные пользователи +*/ + class App { constructor() { + this.url = `https://easycode-js.herokuapp.com/pnv2/users`; this.state = { //равен ссылке, которая ведет на объект /* people: [ @@ -15,8 +35,10 @@ class App { } ],*/ activePage: "contacts", + api: new Api(this.url) }; - this.url = `https://easycode-js.herokuapp.com/pnv2/users`; + + this.pages = { contacts: new ContactsPage(this.state), // тут передали ссылку на this.state adduser: new AddUser(this.state), @@ -24,7 +46,7 @@ class App { editcontact: new EditContact(this.state), user: new User(this.state), router: new Router(this.state), - api: new Api(this.url) + }; this.pages.router.initializeRouter(); @@ -41,7 +63,7 @@ class App { const { activePage } = this.state; if (activePage == 'contacts') { - let response = this.pages.api.requestUsers();//сюда вернулся промис + let response = this.state.api.requestUsers();//сюда вернулся промис response .then(data => { this.state.people = data; diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index 44290d0..35caf35 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -13,7 +13,12 @@ class ContactsPage { this.tableCaptions = ["Name", "Last name", "Email"]; } - reRenderTable(arr) { // сделать, чтобы это был один метод рендера и лежал он в app.js + /*separateFullName(fullName) { + return [name, surname] = fullName.split(' '); + }*/ + + reRenderTable(arr) { + // сделать, чтобы это был один метод рендера и лежал он в app.js let tableBody = this.createTableBodyRow(arr); let pattern = ` @@ -46,7 +51,8 @@ class ContactsPage { return arr .map(item => { - const [name, surname] = item.fullName.split(' ') + const [name, surname] = item.fullName.split(" "); ////////////////////////////// + return ` ${name} ${surname} @@ -63,14 +69,13 @@ class ContactsPage { sortColumns() { let target = event.target; - console.log(target) + this.tableCaptions.forEach(item => { if (target.textContent == item) { - console.log(true) item = this.makeCamelCase(item); - console.log(item) + let sorted = this.sortUsers(item); - console.log(sorted) + console.log(sorted); this.reRenderTable(sorted); } }); @@ -100,7 +105,7 @@ class ContactsPage { } sortUsers(str) { - console.log(str)//тут опять нужно делить фуллнейм - вынести дележ этот в отдельную ф-цию? + console.log(str); //тут опять нужно делить фуллнейм - вынести дележ этот в отдельную ф-цию? function compare(a, b) { if (isNaN(a[str])) { if (a[str] > b[str]) { @@ -127,9 +132,9 @@ class ContactsPage { filterUser() { let value = this.searchField.value.toLowerCase(); - + let filteredUsers = this.state.people.filter(item => { - let name = item.fullName.split(' ')[0]; + let name = item.fullName.split(" ")[0]; if (name.toLowerCase().includes(value)) { return item; @@ -142,26 +147,74 @@ class ContactsPage { this.reRenderTable(filteredUsers); } + showUserCardHandler() { + let parent = document.querySelector("tbody"); + parent.addEventListener("click", this.showUserCard.bind(this)); + } + + showUserCard(e) { + let target = e && e.target; + + if (target.tagName === "TD") { + let targetValue = target.textContent; //Ivan + console.log(targetValue) + let foundUsers = []; + + this.state.people.forEach(item => { + +/* if (targetValue.includes('@')) { + console.log(123) + foundUsers.push(item); + return; + } + //------------------- + let currentTarget = target; + let tr = currentTarget.closest('tr'); + console.log(currentTarget, tr); + [...tr.children].forEach((td) => { + if (td.textContent.includes('@')) { + console.log(78) + foundUsers.push(item); + return; + } + })*/ +//-----------------------------------------------------нихрена неправильно работает!!!!!!!!!!!!!!!!!!!!!! + for (let key in item) { + if (item[key] == targetValue && targetValue.includes('@')) { + foundUsers.push(item); + }; //end of if + + if (key === "fullName" && item[key].includes(targetValue)) { + let currentTarget = target; + + let tr = currentTarget.closest('tr'); + + //[...tr.children].forEach((td) => { + for (let i = 0; i < tr.children; i++) { + if (tr.children[i].includes('@')) { + foundUsers.push(item); + return; + } + } + + + //}); + + }; //end of if + } //end of for + }); //end of forEach + + console.log(foundUsers); + } + } + setHandlers() { this.sortColumnsHandler(); this.searchUserHandler(); -/* window.addEventListener('load', () => { - getPhoneUsersAPI.getAllUsers((users) => { - console.log('USERS from contacts', users); - this.people = users; - });// из api - })*/ + this.showUserCardHandler(); } render(users) { -/* window.addEventListener('load', () => { - getPhoneUsersAPI.getAllUsers((users) => { - console.log('USERS from contacts', users); - this.people = users; - - });// из api - })*/ - return `
      diff --git a/phoneApp/js/editContact.js b/phoneApp/js/editContact.js index 545f973..f271c2a 100644 --- a/phoneApp/js/editContact.js +++ b/phoneApp/js/editContact.js @@ -25,21 +25,12 @@ class EditContact { let target = e && e.target; if (!target) return; - let active = - e && - e.target && - (e.target.closest("button") || - e.target.classList.contains("add-btn"));// what if another dev would change that className at button - javascript would break ? - //We shouldn't rely on classsNames - if (active == false) { - return; + if (target.tagName === 'INPUT') { + target.classList.add('active-input'); } - let input = active.querySelector("input"); - input.style.backgroundColor = "lightgreen";//probably you can make it something like with CSS :focus { ...} JavaScript not really required there - - input.addEventListener("blur", () => { - input.removeAttribute("style"); + target.addEventListener("blur", () => { + target.classList.remove('active-input'); }); } From 1b3876b84a24b67a2adc35fce82747cab069d6a7 Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Fri, 17 Aug 2018 16:19:01 +0300 Subject: [PATCH 17/19] opportuniry to edit & delete user added --- phoneApp/js/addUser.js | 81 +++++++-------- phoneApp/js/api.js | 48 ++++++--- phoneApp/js/app.js | 41 ++++---- phoneApp/js/contacts.js | 143 +++++++++++-------------- phoneApp/js/editContact.js | 207 +++++++++++++++++++++++++++++-------- phoneApp/js/keypad.js | 18 ++-- phoneApp/js/router.js | 23 ++--- phoneApp/js/user.js | 23 +++-- 8 files changed, 343 insertions(+), 241 deletions(-) diff --git a/phoneApp/js/addUser.js b/phoneApp/js/addUser.js index 061b0be..4f0cd42 100644 --- a/phoneApp/js/addUser.js +++ b/phoneApp/js/addUser.js @@ -1,12 +1,6 @@ -//add-user при клике: -//index.html/contacts.html - в поле search при вводе буквы, -//добавить поиск по имени если имя включает хотя бы одну эту букву. -//после ввода каждого символа, фильтровать отображаемых пользователей. -//При удалении всех символов отобразить снова весь список - class AddUser { constructor(globalState) { - this.state = globalState; //стал равен this.state-у со страницы App.js + this.state = globalState; } buttonsHandler() { @@ -18,52 +12,50 @@ class AddUser { let target = e && e.target; if (!target) return; - if (target.tagName === 'INPUT') { - target.classList.add('active-input'); + if (target.tagName === "INPUT") { + target.classList.add("active-input"); } target.addEventListener("blur", () => { - target.classList.remove('active-input'); + target.classList.remove("active-input"); }); } addUser() { + const { name, lastName, email, phone } = this.form.elements; // name, lastName, email, phone - атрибуты name у элементов формы - const {name, lastName, email, phone} = this.form.elements; // name, lastName, email, phone - атрибуты name у элементов формы - - if (!name.value) { - alert('заполните name'); + if (!name.value) { + alert("заполните name"); return; - }; - if (!lastName.value) { - alert('заполните Last Name'); + } + if (!lastName.value) { + alert("заполните Last Name"); return; - }; - if (!email.value) { - alert('заполните email'); + } + if (!email.value) { + alert("заполните email"); return; - }; - if (!phone.value) { - alert('заполните phone'); + } + if (!phone.value) { + alert("заполните phone"); return; - }; + } let fullName = `${name.value} ${lastName.value}`; this.state.api.postUser([fullName, email.value, phone.value]); this.clearFields(); - } clearFields() { let myFormElements = this.form.elements; - [...myFormElements].forEach((item) => { - if (item.tagName === 'INPUT') { - item.value = ''; + [...myFormElements].forEach(item => { + if (item.tagName === "INPUT") { + item.value = ""; } - }) + }); } renderInfo(options) { @@ -80,11 +72,14 @@ class AddUser { this.addButton = document.querySelector(".done-btn"); this.deleteButton = document.querySelector(".delete-contact"); this.form = document.forms[0]; - this.form.addEventListener('submit', event => { + this.form.addEventListener("submit", event => { event.preventDefault(); - }) - this.addButton.addEventListener('click', this.addUser.bind(this)); - this.deleteButton.addEventListener('click', this.clearFields.bind(this)); + }); + this.addButton.addEventListener("click", this.addUser.bind(this)); + this.deleteButton.addEventListener( + "click", + this.clearFields.bind(this) + ); } render() { @@ -108,20 +103,20 @@ class AddUser {
      - ${this.renderInfo({ placeholder:"First Name", name:"name"})} - ${this.renderInfo({ placeholder:"Last Name", name:"lastName"})} - ${this.renderInfo({ placeholder:"Company", name:"company"})} + ${this.renderInfo({ placeholder: "First Name", name: "name" })} + ${this.renderInfo({ placeholder: "Last Name", name: "lastName" })} + ${this.renderInfo({ placeholder: "Company", name: "company" })}
      - ${this.renderInfo({ placeholder:"add mobile phone", name:"phone"})} - ${this.renderInfo({ placeholder:"add home phone", name:"homePhone"})} - ${this.renderInfo({ placeholder:"add email", name:"email"})} - ${this.renderInfo({ placeholder:"add address", name:"address"})} - ${this.renderInfo({ placeholder:"add birthday", name:"birthday"})} - ${this.renderInfo({ placeholder:"add social profile", name:"profile"})} - ${this.renderInfo({ placeholder:"add field", name:"field"})} + ${this.renderInfo({ placeholder: "add mobile phone", name: "phone" })} + ${this.renderInfo({ placeholder: "add home phone", name: "homePhone" })} + ${this.renderInfo({ placeholder: "add email", name: "email" })} + ${this.renderInfo({ placeholder: "add address", name: "address" })} + ${this.renderInfo({ placeholder: "add birthday", name: "birthday" })} + ${this.renderInfo({ placeholder: "add social profile", name: "profile" })} + ${this.renderInfo({ placeholder: "add field", name: "field" })}
      diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js index f3c7b2b..563862a 100644 --- a/phoneApp/js/api.js +++ b/phoneApp/js/api.js @@ -6,7 +6,7 @@ phone-app. Первая страница. /*-----------DONE------------------------ // contentEditable -Сделайте, чтобы на странице add-user.html пользователь +Сделайте, чтобы на странице add-user.html пользователь добавлялся на сервер. /* Добавить возможность из формы, ДОБАВЛЯТЬ Пользователя на сервер @@ -20,7 +20,6 @@ add-user // доступ к этому сервису должен быть в каждом вашем классе // url - должен быть константа, т.к url у вас изменяться не будет.cons - // все запросы к серверу вот здесь class Api { @@ -33,19 +32,38 @@ class Api { } postUser(arr) { - const [fullName, email, phone] = arr; - console.log(arr) - return fetch(this.url, { - method: 'POST', - headers: { - 'Content-type': 'application/json' - }, - body: JSON.stringify({ - fullName: fullName, - email: email, - phone: phone - }) - }) + const [fullName, email, phone] = arr; + //console.log(arr); + return fetch(this.url, { + method: "POST", + headers: { + "Content-type": "application/json" + }, + body: JSON.stringify({ + fullName: fullName, + email: email, + phone: phone + }) + }); + } + + patchUser(arr, id) { + const [fullName, email, phone] = arr; + //console.log(arr, id); + return fetch(this.url + `/${id}`, { + method: "PATCH", + headers: { + "Content-type": "application/json" + }, + body: JSON.stringify({ + fullName: fullName, + email: email, + phone: phone + }) + }); } + deleteUser(id) { + return fetch(this.url + `/${id}`, { method: "DELETE" }); + } } diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index 27474f3..d9a483d 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -1,14 +1,14 @@ /*ДЗ Cделать phone-book у которого будет: -1) Вы заполните пользователей на сервер по адресу с вашими инициалами. -2) При загрузке приложения, вы получите пользователей с сервера -3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет) -4) При нажатии на пользователя будет открываться данный пользователь -5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact) +1) Вы заполните пользователей на сервер по адресу с вашими инициалами. + +2) При загрузке приложения, вы получите пользователей с сервера + +3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет) +- +4) При нажатии на пользователя будет открываться данный пользователь + +5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact) + ---------------- ~90 балов Для тех кто хочет +500$ к зарплате на старте -6) Добавить удаление пользователей (2) +6) Добавить удаление пользователей (2) + 7) Должна быть модульная структура и Проект должен собираться при помощи webpack(2) (!) 8) Проект должен транспайлится через babel последние 2 версии браузеров (2) (!) 9) и после публикации на gh-pages, должен быть минифицирован(2) @@ -19,10 +19,10 @@ Cделать phone-book class App { constructor() { - this.url = `https://easycode-js.herokuapp.com/pnv2/users`; + this.url = `https://easycode-js.herokuapp.com/pnv2/users`; this.state = { //равен ссылке, которая ведет на объект -/* people: [ + /* people: [ { name: "Кира", lastName: "Воробьева", @@ -38,15 +38,13 @@ class App { api: new Api(this.url) }; - this.pages = { contacts: new ContactsPage(this.state), // тут передали ссылку на this.state adduser: new AddUser(this.state), keypad: new KeypadPage(this.state), editcontact: new EditContact(this.state), user: new User(this.state), - router: new Router(this.state), - + router: new Router(this.state) }; this.pages.router.initializeRouter(); @@ -54,7 +52,7 @@ class App { this.appDOMNode = document.getElementById("app"); // сюда будем делать рендер всех страниц // и это не будет затрагивать футер и его события -/* window.addEventListener('popstate'. event => { // не работает + /* window.addEventListener('popstate'. event => { // не работает render(event.state); })*/ } @@ -62,29 +60,26 @@ class App { render(href) { const { activePage } = this.state; - if (activePage == 'contacts') { - let response = this.state.api.requestUsers();//сюда вернулся промис + if (activePage == "contacts") { + let response = this.state.api.requestUsers(); //сюда вернулся промис response .then(data => { this.state.people = data; this.completeRender(activePage); }) - .catch(error => console.log('error', error)); - + .catch(error => console.log("error", error)); } else { - this.completeRender(activePage); } } completeRender(activePage) { - const forHistory = this.pages[activePage].render(); - this.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку, - // которая сейчас указана как activePage в this.state - this.pages[activePage].setHandlers(); //и навесь обработчики событий + const forHistory = this.pages[activePage].render(); + this.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку, + // которая сейчас указана как activePage в this.state + this.pages[activePage].setHandlers(); //и навесь обработчики событий //window.history.pushState(forHistory, href, href) // ДОПИСАТЬ!!! - } static initialize() { @@ -92,4 +87,4 @@ class App { } } -App.initialize(); \ No newline at end of file +App.initialize(); diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index 35caf35..b407c98 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -1,22 +1,18 @@ -//index.html/contacts.html - в поле search при вводе буквы, -//добавить поиск по имени если имя включает хотя бы одну эту букву. -//после ввода каждого символа, фильтровать отображаемых пользователей. -//При удалении всех символов отобразить снова весь список +//index.html/contacts.html - в поле search при вводе буквы, + +//добавить поиск по имени если имя включает хотя бы одну эту букву. + +//после ввода каждого символа, фильтровать отображаемых пользователей. + +//При удалении всех символов отобразить снова весь список + "use strict"; class ContactsPage { constructor(globalState) { - this.state = globalState; //стал равен this.state-у со страницы App.js + this.state = globalState; this.title = "Contacts"; this.tableCaptions = ["Name", "Last name", "Email"]; } - /*separateFullName(fullName) { - return [name, surname] = fullName.split(' '); - }*/ - reRenderTable(arr) { // сделать, чтобы это был один метод рендера и лежал он в app.js let tableBody = this.createTableBodyRow(arr); @@ -51,9 +47,9 @@ class ContactsPage { return arr .map(item => { - const [name, surname] = item.fullName.split(" "); ////////////////////////////// + const [name, surname] = item.fullName.split(" "); - return ` + return ` ${name} ${surname} ${item.email} @@ -74,13 +70,54 @@ class ContactsPage { if (target.textContent == item) { item = this.makeCamelCase(item); - let sorted = this.sortUsers(item); + let index; + + if (item == "name") { + item = "fullName"; + index = 0; + } + if (item == "lastName") { + item = "fullName"; + index = 1; + } + + let sorted = this.sortUsers(item, index); console.log(sorted); this.reRenderTable(sorted); } }); } + sortUsers(str, index) { + function compare(a, b) { + if (isNaN(a[str]) && index) { + if (a[str].split(" ")[index] > b[str].split(" ")[index]) { + return 1; + } + if (a[str].split(" ")[index] < b[str].split(" ")[index]) { + return -1; + } + if (a[str].split(" ")[index] == b[str].split(" ")[index]) { + return 0; + } + } else if (isNaN(a[str]) && !index) { + if (a[str] > b[str]) { + return 1; + } + if (a[str] < b[str]) { + return -1; + } + if (a[str] == b[str]) { + return 0; + } + } else { + return a[str] - b[str]; + } + } + //console.log(this.state.people.sort(compare)) + return this.state.people.sort(compare); + } + makeCamelCase(str) { str = str.toLowerCase(); @@ -104,27 +141,6 @@ class ContactsPage { return str; } - sortUsers(str) { - console.log(str); //тут опять нужно делить фуллнейм - вынести дележ этот в отдельную ф-цию? - function compare(a, b) { - if (isNaN(a[str])) { - if (a[str] > b[str]) { - return 1; - } - if (a[str] < b[str]) { - return -1; - } - if (a[str] == b[str]) { - return 0; - } - } else { - return a[str] - b[str]; - } - } - //console.log(this.state.people.sort(compare)) - return this.state.people.sort(compare); - } - searchUserHandler() { this.searchField = document.querySelector("#search"); this.searchField.addEventListener("input", this.filterUser.bind(this)); @@ -147,71 +163,30 @@ class ContactsPage { this.reRenderTable(filteredUsers); } - showUserCardHandler() { + selectUserHandler() { let parent = document.querySelector("tbody"); - parent.addEventListener("click", this.showUserCard.bind(this)); + parent.addEventListener("click", this.selectUser.bind(this)); } - showUserCard(e) { + selectUser(e) { let target = e && e.target; if (target.tagName === "TD") { - let targetValue = target.textContent; //Ivan - console.log(targetValue) - let foundUsers = []; - + let row = target.closest("tr"); + let id = row.dataset.id; this.state.people.forEach(item => { - -/* if (targetValue.includes('@')) { - console.log(123) - foundUsers.push(item); - return; + if (item._id == id) { + this.state.selectedUser = item; } - //------------------- - let currentTarget = target; - let tr = currentTarget.closest('tr'); - console.log(currentTarget, tr); - [...tr.children].forEach((td) => { - if (td.textContent.includes('@')) { - console.log(78) - foundUsers.push(item); - return; - } - })*/ -//-----------------------------------------------------нихрена неправильно работает!!!!!!!!!!!!!!!!!!!!!! - for (let key in item) { - if (item[key] == targetValue && targetValue.includes('@')) { - foundUsers.push(item); - }; //end of if - - if (key === "fullName" && item[key].includes(targetValue)) { - let currentTarget = target; - - let tr = currentTarget.closest('tr'); - - //[...tr.children].forEach((td) => { - for (let i = 0; i < tr.children; i++) { - if (tr.children[i].includes('@')) { - foundUsers.push(item); - return; - } - } - - - //}); - - }; //end of if - } //end of for - }); //end of forEach - - console.log(foundUsers); + }); + console.log(this.state.selectedUser); } } setHandlers() { this.sortColumnsHandler(); this.searchUserHandler(); - this.showUserCardHandler(); + this.selectUserHandler(); } render(users) { diff --git a/phoneApp/js/editContact.js b/phoneApp/js/editContact.js index f271c2a..ed4f536 100644 --- a/phoneApp/js/editContact.js +++ b/phoneApp/js/editContact.js @@ -1,19 +1,10 @@ //edit-contact, -//- сделать данные редактируемыми (атрибут contentEditable) // input -//- изменять backgroundColor +//- сделать данные редактируемыми (атрибут contentEditable) // input + +//- изменять backgroundColor + class EditContact { constructor(globalState) { - this.state = globalState; //стал равен this.state-у со страницы App.js - this.phoneNumber = "+38 (063) 733 44 55"; - } - - renderInfo(value) { - return `
      - -
      `; + this.state = globalState; } buttonsHandler() { @@ -25,59 +16,193 @@ class EditContact { let target = e && e.target; if (!target) return; - if (target.tagName === 'INPUT') { - target.classList.add('active-input'); + if (target.tagName === "INPUT") { + target.classList.add("active-input"); } target.addEventListener("blur", () => { - target.classList.remove('active-input'); + target.classList.remove("active-input"); + }); + } + + renderInfo(options) { + let { placeholder, value, name } = options; + + return `
      + +
      `; + } + + editUser() { + if (!this.state.selectedUser) { + return; + } + const { name, lastName, email, phone } = this.form.elements; + + let fullName = `${name.value} ${lastName.value}`; + + this.state.api.patchUser( + [fullName, email.value, phone.value], + this.state.selectedUser._id + ); + this.state.selectedUser = null; + } + + deleteUser() { + if (!this.state.selectedUser) { + return; + } + + this.state.api.deleteUser(this.state.selectedUser._id); + this.state.selectedUser = null; + this.clearFields(); + } + + clearFields() { + let myFormElements = this.form.elements; + + [...myFormElements].forEach(item => { + if (item.tagName === "INPUT") { + item.value = ""; + } }); } setHandlers() { this.buttonsHandler(); + + this.doneButton = document.querySelector(".done-btn"); + this.deleteButton = document.querySelector(".delete-contact"); + this.form = document.forms[0]; + this.form.addEventListener("submit", event => { + event.preventDefault(); + }); + this.doneButton.addEventListener("click", this.editUser.bind(this)); + this.deleteButton.addEventListener("click", this.deleteUser.bind(this)); } render() { + let firstName = this.state.selectedUser + ? this.state.selectedUser.fullName.split(" ")[0] + : ""; + let lastName = this.state.selectedUser + ? this.state.selectedUser.fullName.split(" ")[1] + : ""; + let email = this.state.selectedUser + ? this.state.selectedUser.email + : ""; + let mobilePhone = this.state.selectedUser + ? this.state.selectedUser.phone + : ""; + return `
      -
      -
      -
      #
      -
      - ${this.renderInfo("First Name")} - ${this.renderInfo("Last Name")} - ${this.renderInfo("Company")} -
      -
      -
      -
      -
      - +
      +
      +
      +
      #
      +
      + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.fullName + ? "" + : "First Name", + value: `${firstName}`, + name: "name" + })} + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.fullName + ? "" + : "Last Name", + value: `${lastName}`, + name: "lastName" + })} + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.company + ? "" + : "Company", + value: ``, + name: "company" + })}
      - ${this.renderInfo("add home phone")} - ${this.renderInfo("add email")} - ${this.renderInfo("add address")} - ${this.renderInfo("add birthday")} - ${this.renderInfo("add social profile")} - ${this.renderInfo("add field")} -
      - +
      +
      +
      +
      + +
      + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.homePhone + ? "" + : "add home phone", + value: ``, + name: "homePhone" + })} + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.email + ? "" + : "add email", + value: `${email}`, + name: "email" + })} + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.address + ? "" + : "add address", + value: ``, + name: "address" + })} + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.birthday + ? "" + : "add birthday", + value: ``, + name: "birthday" + })} + ${this.renderInfo({ + placeholder: + this.state.selectedUser && + this.state.selectedUser.profile + ? "" + : "add social profile", + value: ``, + name: "profile" + })} + ${this.renderInfo({ placeholder: "add field", value: ``, name: "add" })} +
      + +
      -
      +
      `; } } diff --git a/phoneApp/js/keypad.js b/phoneApp/js/keypad.js index bce260c..8acd675 100644 --- a/phoneApp/js/keypad.js +++ b/phoneApp/js/keypad.js @@ -6,21 +6,21 @@ //innerHTML по максимуму //https://aleksandra-maslennikova.github.io/telephone-book/keypad.html -//Сделайте чтобы при нажатии на кнопку цифра отобразилась +//Сделайте чтобы при нажатии на кнопку цифра отобразилась + //в //https://aleksandra-maslennikova.github.io/telephone-book/index.html //По клику по заголовку таблицы, -//таблица сортировалась по соответствующему свойству +//таблица сортировалась по соответствующему свойству + -//добавить функционал для удаления номера -//1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) -//2. Формат номера должен быть таким (099)-17-38-170 +//добавить функционал для удаления номера + +//1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) + +//2. Формат номера должен быть таким (099)-17-38-170 - class KeypadPage { constructor(globalState) { this.state = globalState; //стал равен this.state-у со страницы App.js - this.title = 'Keypad'; + this.title = "Keypad"; } buttonsHandler() { @@ -31,8 +31,9 @@ class KeypadPage { "click", this.clickHandler.bind(this, placeToInsertNumbers) ); - window.addEventListener( //are ever remove such listener? - // for example when-even you changing a page + window.addEventListener( + //are ever remove such listener? + // for example when-even you changing a page "keypress", this.keyHandler.bind(this, placeToInsertNumbers) ); @@ -105,4 +106,3 @@ class KeypadPage { `; } } - diff --git a/phoneApp/js/router.js b/phoneApp/js/router.js index 35a5437..0a5f228 100644 --- a/phoneApp/js/router.js +++ b/phoneApp/js/router.js @@ -1,6 +1,4 @@ class Router { - //constructor(activePage) { - // this.activePage = activePage; constructor(globalState) { this.state = globalState; } @@ -49,19 +47,11 @@ class Router { this.linksParent = document.querySelector(".main-nav"); } - definePage(callback) { //function switchRounter, should only change the router and don't make any checks and probably has a minimal of conditionals + definePage(callback) { this.linksParent.addEventListener("click", e => { e.preventDefault(); - //let target = e && e.target; - let target = - e && - e.target && - (e.target.closest("a") || e.target.classList.contains("tab")); //You can add additional attributes - //to every link and indicate "user clicked on link" that way. on real word usage probably we should be always 100% be sure about our target - //I'm pretty sure you don't need such event delegation because of your event working on a small area of responsibilities. - if (target == false) { - return; - } + + let target = e && e.target && e.target.closest("a[data-attr]"); if (target.classList.contains("active")) { return; @@ -93,10 +83,9 @@ class Router { let { href, glyphicon, text, active } = options; let activeClass = active ? "active" : ""; - return ` + return ` - ${text} + ${text} `; } - -} \ No newline at end of file +} diff --git a/phoneApp/js/user.js b/phoneApp/js/user.js index 8f6cd32..48974f2 100644 --- a/phoneApp/js/user.js +++ b/phoneApp/js/user.js @@ -1,8 +1,6 @@ class User { constructor(globalState) { - this.state = globalState; //стал равен this.state-у со страницы App.js - this.mobileNumber = "+38 (093) 989 89 89"; - this.homeNumber = "+38 (067) 989 89 89"; + this.state = globalState; } renderOptions(options) { @@ -15,10 +13,17 @@ class User { } setHandlers() { - + console.log(this); } render() { + let userName = this.state.selectedUser + ? this.state.selectedUser.fullName + : "User Name"; + let mobileNumber = this.state.selectedUser + ? this.state.selectedUser.phone + : ""; + return `
      @@ -33,7 +38,7 @@ class User {
      # -
      User Name
      +
      ${userName}
      ${this.renderOptions({ glyphicon: "comment", text: "message" })} ${this.renderOptions({ glyphicon: "earphone", text: "call" })} @@ -41,12 +46,12 @@ class User { ${this.renderOptions({ glyphicon: "envelope", text: "mail" })}
      -

      mobile

      -
      ${this.mobileNumber}
      +

      mobile number

      +
      ${mobileNumber}
      -

      home

      -
      ${this.homeNumber}
      +

      home number

      +
      From 7309c6380b94bfccf5e639de8e686b3306630248 Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sun, 19 Aug 2018 21:58:37 +0300 Subject: [PATCH 18/19] webpack was added --- phoneApp/build/bundle.js | 185 ++ phoneApp/index.html | 20 +- phoneApp/js/addUser.js | 2 + phoneApp/js/api.js | 2 + phoneApp/js/app.js | 35 +- phoneApp/js/contacts.js | 2 + phoneApp/js/editContact.js | 2 + phoneApp/js/keypad.js | 2 + phoneApp/js/router.js | 17 +- phoneApp/js/server.js | 30 + phoneApp/js/user.js | 2 + phoneApp/package-lock.json | 4157 ++++++++++++++++++++++++++++++++++++ phoneApp/package.json | 16 + phoneApp/webpack.config.js | 12 + 14 files changed, 4450 insertions(+), 34 deletions(-) create mode 100644 phoneApp/build/bundle.js create mode 100644 phoneApp/js/server.js create mode 100644 phoneApp/package-lock.json create mode 100644 phoneApp/package.json create mode 100644 phoneApp/webpack.config.js diff --git a/phoneApp/build/bundle.js b/phoneApp/build/bundle.js new file mode 100644 index 0000000..206b164 --- /dev/null +++ b/phoneApp/build/bundle.js @@ -0,0 +1,185 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); +/******/ } +/******/ }; +/******/ +/******/ // define __esModule on exports +/******/ __webpack_require__.r = function(exports) { +/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { +/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); +/******/ } +/******/ Object.defineProperty(exports, '__esModule', { value: true }); +/******/ }; +/******/ +/******/ // create a fake namespace object +/******/ // mode & 1: value is a module id, require it +/******/ // mode & 2: merge all properties of value into the ns +/******/ // mode & 4: return value when already ns object +/******/ // mode & 8|1: behave like require +/******/ __webpack_require__.t = function(value, mode) { +/******/ if(mode & 1) value = __webpack_require__(value); +/******/ if(mode & 8) return value; +/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; +/******/ var ns = Object.create(null); +/******/ __webpack_require__.r(ns); +/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); +/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); +/******/ return ns; +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = "/"; +/******/ +/******/ +/******/ // Load entry module and return exports +/******/ return __webpack_require__(__webpack_require__.s = "./js/app.js"); +/******/ }) +/************************************************************************/ +/******/ ({ + +/***/ "./js/addUser.js": +/*!***********************!*\ + !*** ./js/addUser.js ***! + \***********************/ +/*! exports provided: AddUser */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AddUser\", function() { return AddUser; });\nclass AddUser {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\tbuttonsHandler() {\r\n\t\tlet buttonsParent = document.querySelector(\"main\");\r\n\t\tbuttonsParent.addEventListener(\"click\", this.clickHandler.bind(this));\r\n\t}\r\n\r\n\tclickHandler(e) {\r\n\t\tlet target = e && e.target;\r\n\t\tif (!target) return;\r\n\r\n\t\tif (target.tagName === \"INPUT\") {\r\n\t\t\ttarget.classList.add(\"active-input\");\r\n\t\t}\r\n\r\n\t\ttarget.addEventListener(\"blur\", () => {\r\n\t\t\ttarget.classList.remove(\"active-input\");\r\n\t\t});\r\n\t}\r\n\r\n\taddUser() {\r\n\t\tconst { name, lastName, email, phone } = this.form.elements; // name, lastName, email, phone - атрибуты name у элементов формы\r\n\r\n\t\tif (!name.value) {\r\n\t\t\talert(\"заполните name\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!lastName.value) {\r\n\t\t\talert(\"заполните Last Name\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!email.value) {\r\n\t\t\talert(\"заполните email\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!phone.value) {\r\n\t\t\talert(\"заполните phone\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet fullName = `${name.value} ${lastName.value}`;\r\n\r\n\t\tthis.state.api.postUser([fullName, email.value, phone.value]);\r\n\r\n\t\tthis.clearFields();\r\n\t}\r\n\r\n\tclearFields() {\r\n\t\tlet myFormElements = this.form.elements;\r\n\r\n\t\t[...myFormElements].forEach(item => {\r\n\t\t\tif (item.tagName === \"INPUT\") {\r\n\t\t\t\titem.value = \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\trenderInfo(options) {\r\n\t\tlet { placeholder, name } = options;\r\n\t\treturn `
      \r\n\t\t\t\t\r\n\t\t\t
      `;\r\n\t}\r\n\r\n\tsetHandlers() {\r\n\t\tthis.buttonsHandler();\r\n\t\tthis.addButton = document.querySelector(\".done-btn\");\r\n\t\tthis.deleteButton = document.querySelector(\".delete-contact\");\r\n\t\tthis.form = document.forms[0];\r\n\t\tthis.form.addEventListener(\"submit\", event => {\r\n\t\t\tevent.preventDefault();\r\n\t\t});\r\n\t\tthis.addButton.addEventListener(\"click\", this.addUser.bind(this));\r\n\t\tthis.deleteButton.addEventListener(\r\n\t\t\t\"click\",\r\n\t\t\tthis.clearFields.bind(this)\r\n\t\t);\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn `
      \r\n\t\t\t
      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"First Name\", name: \"name\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"Last Name\", name: \"lastName\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"Company\", name: \"company\" })}\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add mobile phone\", name: \"phone\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add home phone\", name: \"homePhone\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add email\", name: \"email\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add address\", name: \"address\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add birthday\", name: \"birthday\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add social profile\", name: \"profile\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add field\", name: \"field\" })}\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t
      `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/addUser.js?"); + +/***/ }), + +/***/ "./js/api.js": +/*!*******************!*\ + !*** ./js/api.js ***! + \*******************/ +/*! exports provided: Api */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Api\", function() { return Api; });\n/*\r\nTASK 2 -------DONE-------------------\r\nphone-app. Первая страница.\r\nЗагружайте пользователей с сервера при загрузке странице.\r\n*/\r\n\r\n/*-----------DONE------------------------\r\n// contentEditable\r\nСделайте, чтобы на странице add-user.html пользователь \r\nдобавлялся на сервер.\r\n/*\r\nДобавить возможность из формы, ДОБАВЛЯТЬ Пользователя на сервер\r\nadd-user\r\n*/\r\n\r\n// Для PhoneBook сделайте отдельный репозиторий + gh-pages\r\n\r\n// Рекомендую - вам необходимо сделать 1 метод(или отдельный класс)\r\n// который будет отправлять запросы\r\n// доступ к этому сервису должен быть в каждом вашем классе\r\n// url - должен быть константа, т.к url у вас изменяться не будет.cons\r\n\r\n// все запросы к серверу вот здесь\r\n\r\nclass Api {\r\n constructor(url) {\r\n this.url = url;\r\n }\r\n\r\n requestUsers() {\r\n return fetch(this.url).then(data => data.json());\r\n }\r\n\r\n postUser(arr) {\r\n const [fullName, email, phone] = arr;\r\n //console.log(arr);\r\n return fetch(this.url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n fullName: fullName,\r\n email: email,\r\n phone: phone\r\n })\r\n });\r\n }\r\n\r\n patchUser(arr, id) {\r\n const [fullName, email, phone] = arr;\r\n //console.log(arr, id);\r\n return fetch(this.url + `/${id}`, {\r\n method: \"PATCH\",\r\n headers: {\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n fullName: fullName,\r\n email: email,\r\n phone: phone\r\n })\r\n });\r\n }\r\n\r\n deleteUser(id) {\r\n return fetch(this.url + `/${id}`, { method: \"DELETE\" });\r\n }\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/api.js?"); + +/***/ }), + +/***/ "./js/app.js": +/*!*******************!*\ + !*** ./js/app.js ***! + \*******************/ +/*! no exports provided */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _contacts_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./contacts.js */ \"./js/contacts.js\");\n/* harmony import */ var _addUser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addUser.js */ \"./js/addUser.js\");\n/* harmony import */ var _keypad_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keypad.js */ \"./js/keypad.js\");\n/* harmony import */ var _editContact_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./editContact.js */ \"./js/editContact.js\");\n/* harmony import */ var _user_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./user.js */ \"./js/user.js\");\n/* harmony import */ var _router_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./router.js */ \"./js/router.js\");\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./api.js */ \"./js/api.js\");\n/*ДЗ\r\nCделать phone-book\r\nу которого будет:\r\n1) Вы заполните пользователей на сервер по адресу с вашими инициалами. +\r\n2) При загрузке приложения, вы получите пользователей с сервера\t\t\t+\r\n3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет)\t+\r\n4) При нажатии на пользователя будет открываться данный пользователь\t+\r\n5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact)\t+\r\n---------------- ~90 балов\r\nДля тех кто хочет +500$ к зарплате на старте\r\n6) Добавить удаление пользователей (2) +\r\n7) Должна быть модульная структура и Проект должен собираться при помощи webpack(2) (!)\r\n8) Проект должен транспайлится через babel последние 2 версии браузеров (2) (!)\r\n9) и после публикации на gh-pages, должен быть минифицирован(2)\r\n10) добавьте еще одну первую страницу на которой будет \"auth\"\r\nв этот инпут можно ввести инициалы easycode студента (2)\r\nв зависимости от этого будут загружаться разные пользователи\r\n*/\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass App {\r\n\tconstructor() {\r\n\t\tthis.url = `https://easycode-js.herokuapp.com/pnv2/users`;\r\n\t\tthis.state = {\r\n\t\t\tactivePage: \"contacts\",\r\n\t\t\tapi: new _api_js__WEBPACK_IMPORTED_MODULE_6__[\"Api\"](this.url)\r\n\t\t};\r\n\r\n\t\tthis.pages = {\r\n\t\t\tcontacts: new _contacts_js__WEBPACK_IMPORTED_MODULE_0__[\"ContactsPage\"](this.state), // тут передали ссылку на this.state\r\n\t\t\tadduser: new _addUser_js__WEBPACK_IMPORTED_MODULE_1__[\"AddUser\"](this.state),\r\n\t\t\tkeypad: new _keypad_js__WEBPACK_IMPORTED_MODULE_2__[\"KeypadPage\"](this.state),\r\n\t\t\teditcontact: new _editContact_js__WEBPACK_IMPORTED_MODULE_3__[\"EditContact\"](this.state),\r\n\t\t\tuser: new _user_js__WEBPACK_IMPORTED_MODULE_4__[\"User\"](this.state),\r\n\t\t\trouter: new _router_js__WEBPACK_IMPORTED_MODULE_5__[\"Router\"](this.state)\r\n\t\t};\r\n\r\n\t\tthis.pages.router.initializeRouter();\r\n\t\tthis.pages.router.definePage(this.render.bind(this));\r\n\t\tthis.appDOMNode = document.getElementById(\"app\"); // сюда будем делать рендер всех страниц\r\n\t\t// и это не будет затрагивать футер и его события\r\n\r\n\t\twindow.addEventListener(\"popstate\", event => {\r\n\t\t\tthis.updateView(event.state);\r\n\t\t});\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { activePage } = this.state;\r\n\r\n\t\tif (activePage == \"contacts\") {\r\n\t\t\tlet response = this.state.api.requestUsers(); //сюда вернулся промис\r\n\t\t\tresponse\r\n\t\t\t\t.then(data => {\r\n\t\t\t\t\tthis.state.people = data;\r\n\t\t\t\t\tthis.completeRender(activePage);\r\n\t\t\t\t})\r\n\t\t\t\t.catch(error => console.log(\"error\", error));\r\n\t\t} else {\r\n\t\t\tthis.completeRender(activePage);\r\n\t\t}\r\n\t}\r\n\r\n\tcompleteRender(activePage) {\r\n\t\tconst forHistory = this.pages[activePage].render();\r\n\t\tthis.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку,\r\n\t\t// которая сейчас указана как activePage в this.state\r\n\t\tthis.pages[activePage].setHandlers(); //и навесь обработчики событий\r\n\t\twindow.history.pushState(forHistory, activePage, activePage); // добавляем в историю ссылку, которая будет наверху\r\n\t}\r\n\r\n\tupdateView(content) {\r\n\t\tthis.appDOMNode.innerHTML = content;\r\n\t}\r\n\r\n\tstatic initialize() {\r\n\t\treturn new App().render();\r\n\t}\r\n}\r\n\r\nApp.initialize();\r\n\n\n//# sourceURL=webpack:///./js/app.js?"); + +/***/ }), + +/***/ "./js/contacts.js": +/*!************************!*\ + !*** ./js/contacts.js ***! + \************************/ +/*! exports provided: ContactsPage */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ContactsPage\", function() { return ContactsPage; });\n//index.html/contacts.html - в поле search при вводе буквы, +\r\n//добавить поиск по имени если имя включает хотя бы одну эту букву. +\r\n//после ввода каждого символа, фильтровать отображаемых пользователей. +\r\n//При удалении всех символов отобразить снова весь список +\r\n\r\n\r\n\r\nclass ContactsPage {\r\n constructor(globalState) {\r\n this.state = globalState;\r\n\r\n this.title = \"Contacts\";\r\n this.tableCaptions = [\"Name\", \"Last name\", \"Email\"];\r\n }\r\n\r\n reRenderTable(arr) {\r\n // сделать, чтобы это был один метод рендера и лежал он в app.js\r\n let tableBody = this.createTableBodyRow(arr);\r\n\r\n let pattern = `\r\n ${tableBody}\r\n `;\r\n\r\n let parent = document.querySelector(\"table\");\r\n let shouldBeReplaced = document.querySelector(\"tbody\");\r\n parent.removeChild(shouldBeReplaced);\r\n\r\n parent.insertAdjacentHTML(\"beforeEnd\", pattern);\r\n }\r\n\r\n createTableHeadRow(arr) {\r\n let items = arr\r\n .map(item => {\r\n return `${item}`;\r\n })\r\n .join(\"\");\r\n\r\n return `\r\n ${items}\r\n `;\r\n }\r\n\r\n createTableBodyRow(arr) {\r\n if (!arr) {\r\n arr = this.state.people;\r\n }\r\n\r\n return arr\r\n .map(item => {\r\n const [name, surname] = item.fullName.split(\" \");\r\n\r\n return `\r\n ${name}\r\n ${surname}\r\n ${item.email}\r\n `;\r\n })\r\n .join(\"\");\r\n }\r\n\r\n sortColumnsHandler() {\r\n let parent = document.querySelector(\"thead\");\r\n parent.addEventListener(\"click\", this.sortColumns.bind(this));\r\n }\r\n\r\n sortColumns() {\r\n let target = event.target;\r\n\r\n this.tableCaptions.forEach(item => {\r\n if (target.textContent == item) {\r\n item = this.makeCamelCase(item);\r\n\r\n let index;\r\n\r\n if (item == \"name\") {\r\n item = \"fullName\";\r\n index = 0;\r\n }\r\n if (item == \"lastName\") {\r\n item = \"fullName\";\r\n index = 1;\r\n }\r\n\r\n let sorted = this.sortUsers(item, index);\r\n console.log(sorted);\r\n this.reRenderTable(sorted);\r\n }\r\n });\r\n }\r\n\r\n sortUsers(str, index) {\r\n function compare(a, b) {\r\n if (isNaN(a[str]) && index) {\r\n if (a[str].split(\" \")[index] > b[str].split(\" \")[index]) {\r\n return 1;\r\n }\r\n if (a[str].split(\" \")[index] < b[str].split(\" \")[index]) {\r\n return -1;\r\n }\r\n if (a[str].split(\" \")[index] == b[str].split(\" \")[index]) {\r\n return 0;\r\n }\r\n } else if (isNaN(a[str]) && !index) {\r\n if (a[str] > b[str]) {\r\n return 1;\r\n }\r\n if (a[str] < b[str]) {\r\n return -1;\r\n }\r\n if (a[str] == b[str]) {\r\n return 0;\r\n }\r\n } else {\r\n return a[str] - b[str];\r\n }\r\n }\r\n //console.log(this.state.people.sort(compare))\r\n return this.state.people.sort(compare);\r\n }\r\n\r\n makeCamelCase(str) {\r\n str = str.toLowerCase();\r\n\r\n if (str.includes(\" \")) {\r\n //'last name'\r\n let arr = str.split(\" \"); //['last', 'name']\r\n\r\n let capitalizedArr = arr.map((item, i) => {\r\n if (i > 0) {\r\n let itemToArray = item.split(\"\"); //['n', 'a', 'm', 'e']\r\n let firstLetter = itemToArray[0].toUpperCase();\r\n itemToArray.splice(0, 1, firstLetter);\r\n return itemToArray.join(\"\");\r\n }\r\n return item;\r\n }); // end of map\r\n\r\n str = capitalizedArr.join(\"\");\r\n }\r\n\r\n return str;\r\n }\r\n\r\n searchUserHandler() {\r\n this.searchField = document.querySelector(\"#search\");\r\n this.searchField.addEventListener(\"input\", this.filterUser.bind(this));\r\n }\r\n\r\n filterUser() {\r\n let value = this.searchField.value.toLowerCase();\r\n\r\n let filteredUsers = this.state.people.filter(item => {\r\n let name = item.fullName.split(\" \")[0];\r\n\r\n if (name.toLowerCase().includes(value)) {\r\n return item;\r\n }\r\n\r\n return;\r\n });\r\n //console.log(filteredUsers);\r\n\r\n this.reRenderTable(filteredUsers);\r\n }\r\n\r\n selectUserHandler() {\r\n let parent = document.querySelector(\"tbody\");\r\n parent.addEventListener(\"click\", this.selectUser.bind(this));\r\n }\r\n\r\n selectUser(e) {\r\n let target = e && e.target;\r\n\r\n if (target.tagName === \"TD\") {\r\n let row = target.closest(\"tr\");\r\n let id = row.dataset.id;\r\n this.state.people.forEach(item => {\r\n if (item._id == id) {\r\n this.state.selectedUser = item;\r\n }\r\n });\r\n console.log(this.state.selectedUser);\r\n }\r\n }\r\n\r\n setHandlers() {\r\n this.sortColumnsHandler();\r\n this.searchUserHandler();\r\n this.selectUserHandler();\r\n }\r\n\r\n render(users) {\r\n return `\r\n
      \r\n
      \r\n

      ${this.title}

      \r\n
      \r\n
      \r\n\r\n
      \r\n
      \r\n
      \r\n
      \r\n \r\n \r\n
      \r\n
      \r\n\r\n \r\n \r\n ${this.createTableHeadRow(this.tableCaptions)}\r\n \r\n \r\n ${this.createTableBodyRow(users)}\r\n \r\n
      \r\n\r\n
      \r\n
      `;\r\n }\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/contacts.js?"); + +/***/ }), + +/***/ "./js/editContact.js": +/*!***************************!*\ + !*** ./js/editContact.js ***! + \***************************/ +/*! exports provided: EditContact */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EditContact\", function() { return EditContact; });\n//edit-contact,\r\n//- сделать данные редактируемыми (атрибут contentEditable) // input +\r\n//- изменять backgroundColor\t\t\t\t\t\t\t\t\t\t+\r\n\r\nclass EditContact {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\tbuttonsHandler() {\r\n\t\tlet buttonsParent = document.querySelector(\"main\");\r\n\t\tbuttonsParent.addEventListener(\"click\", this.clickHandler.bind(this));\r\n\t}\r\n\r\n\tclickHandler(e) {\r\n\t\tlet target = e && e.target;\r\n\t\tif (!target) return;\r\n\r\n\t\tif (target.tagName === \"INPUT\") {\r\n\t\t\ttarget.classList.add(\"active-input\");\r\n\t\t}\r\n\r\n\t\ttarget.addEventListener(\"blur\", () => {\r\n\t\t\ttarget.classList.remove(\"active-input\");\r\n\t\t});\r\n\t}\r\n\r\n\trenderInfo(options) {\r\n\t\tlet { placeholder, value, name } = options;\r\n\r\n\t\treturn `
      \r\n\t\t\t\t\r\n\t\t\t
      `;\r\n\t}\r\n\r\n\teditUser() {\r\n\t\tif (!this.state.selectedUser) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst { name, lastName, email, phone } = this.form.elements;\r\n\r\n\t\tlet fullName = `${name.value} ${lastName.value}`;\r\n\r\n\t\tthis.state.api.patchUser(\r\n\t\t\t[fullName, email.value, phone.value],\r\n\t\t\tthis.state.selectedUser._id\r\n\t\t);\r\n\t\tthis.state.selectedUser = null;\r\n\t}\r\n\r\n\tdeleteUser() {\r\n\t\tif (!this.state.selectedUser) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.state.api.deleteUser(this.state.selectedUser._id);\r\n\t\tthis.state.selectedUser = null;\r\n\t\tthis.clearFields();\r\n\t}\r\n\r\n\tclearFields() {\r\n\t\tlet myFormElements = this.form.elements;\r\n\r\n\t\t[...myFormElements].forEach(item => {\r\n\t\t\tif (item.tagName === \"INPUT\") {\r\n\t\t\t\titem.value = \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tsetHandlers() {\r\n\t\tthis.buttonsHandler();\r\n\r\n\t\tthis.doneButton = document.querySelector(\".done-btn\");\r\n\t\tthis.deleteButton = document.querySelector(\".delete-contact\");\r\n\t\tthis.form = document.forms[0];\r\n\t\tthis.form.addEventListener(\"submit\", event => {\r\n\t\t\tevent.preventDefault();\r\n\t\t});\r\n\t\tthis.doneButton.addEventListener(\"click\", this.editUser.bind(this));\r\n\t\tthis.deleteButton.addEventListener(\"click\", this.deleteUser.bind(this));\r\n\t}\r\n\r\n\trender() {\r\n\t\tlet firstName = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.fullName.split(\" \")[0]\r\n\t\t\t: \"\";\r\n\t\tlet lastName = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.fullName.split(\" \")[1]\r\n\t\t\t: \"\";\r\n\t\tlet email = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.email\r\n\t\t\t: \"\";\r\n\t\tlet mobilePhone = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.phone\r\n\t\t\t: \"\";\r\n\r\n\t\treturn `
      \r\n\t\t\t
      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \"#\"
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.fullName\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"First Name\",\r\n\t\t\t\t\t\t\t\tvalue: `${firstName}`,\r\n\t\t\t\t\t\t\t\tname: \"name\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.fullName\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"Last Name\",\r\n\t\t\t\t\t\t\t\tvalue: `${lastName}`,\r\n\t\t\t\t\t\t\t\tname: \"lastName\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.company\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"Company\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"company\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.homePhone\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add home phone\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"homePhone\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.email\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add email\",\r\n\t\t\t\t\t\t\t\tvalue: `${email}`,\r\n\t\t\t\t\t\t\t\tname: \"email\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.address\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add address\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"address\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.birthday\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add birthday\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"birthday\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.profile\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add social profile\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"profile\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add field\", value: ``, name: \"add\" })}\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \t\r\n\t\t
      `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/editContact.js?"); + +/***/ }), + +/***/ "./js/keypad.js": +/*!**********************!*\ + !*** ./js/keypad.js ***! + \**********************/ +/*! exports provided: KeypadPage */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"KeypadPage\", function() { return KeypadPage; });\n//Нужно визуализировать keypad.html - keypad.js\r\n\r\n//Структура виртуализации:\r\n// ------ Это 2 разных класса KeypadPage, ContactsPage -----\r\n\r\n//innerHTML по максимуму\r\n//https://aleksandra-maslennikova.github.io/telephone-book/keypad.html\r\n\r\n//Сделайте чтобы при нажатии на кнопку цифра отобразилась +\r\n//в \r\n\r\n//https://aleksandra-maslennikova.github.io/telephone-book/index.html\r\n//По клику по заголовку таблицы,\r\n//таблица сортировалась по соответствующему свойству +\r\n\r\n//добавить функционал для удаления номера +\r\n//1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) +\r\n//2. Формат номера должен быть таким (099)-17-38-170 -\r\n\r\nclass KeypadPage {\r\n constructor(globalState) {\r\n this.state = globalState; //стал равен this.state-у со страницы App.js\r\n this.title = \"Keypad\";\r\n }\r\n\r\n buttonsHandler() {\r\n let buttonsParent = document.querySelector(\"main\"); // please you const keyword instead of let\r\n let placeToInsertNumbers = document.querySelector(\".numbers\");\r\n\r\n buttonsParent.addEventListener(\r\n \"click\",\r\n this.clickHandler.bind(this, placeToInsertNumbers)\r\n );\r\n window.addEventListener(\r\n //are ever remove such listener?\r\n // for example when-even you changing a page\r\n \"keypress\",\r\n this.keyHandler.bind(this, placeToInsertNumbers)\r\n );\r\n }\r\n\r\n keyHandler(display, e) {\r\n let pattern = /[0-9]/; //дописать регвыражение для #*-()\r\n if (e.ctrlKey || e.altKey || e.metaKey) return;\r\n var code = e.key;\r\n\r\n if (code == null) return;\r\n\r\n if (pattern.test(code)) {\r\n display.innerHTML += code;\r\n }\r\n return;\r\n }\r\n\r\n clickHandler(display, e) {\r\n let target = e.target;\r\n if (!target) return;\r\n\r\n if (target.classList.contains(\"key\")) {\r\n display.innerHTML += target.textContent;\r\n }\r\n\r\n if (target.classList.contains(\"glyphicon-circle-arrow-left\")) {\r\n let insertedNumbersArr = display.innerHTML.split(\"\");\r\n if (insertedNumbersArr.length > 0) {\r\n let numberWithoutLast = insertedNumbersArr.slice(0, -1).join(\"\");\r\n display.innerHTML = numberWithoutLast;\r\n }\r\n }\r\n }\r\n\r\n setHandlers() {\r\n this.buttonsHandler();\r\n }\r\n\r\n render() {\r\n return `
      \r\n
      \r\n

      ${this.title}

      \r\n
      \r\n
      \r\n\r\n
      \r\n
      \r\n
      \r\n \r\n \r\n \r\n
      \r\n
      \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
      \r\n
      \r\n
      `;\r\n }\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/keypad.js?"); + +/***/ }), + +/***/ "./js/router.js": +/*!**********************!*\ + !*** ./js/router.js ***! + \**********************/ +/*! exports provided: Router */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return Router; });\nclass Router {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\tinitializeRouter() {\r\n\t\tconst mountNode = document.getElementById(\"mountNode\");\r\n\t\tmountNode.innerHTML = `\r\n
      \r\n
      \r\n
      \r\n \r\n
      \r\n
      `;\r\n\r\n\t\tthis.linksParent = document.querySelector(\".main-nav\");\r\n\t}\r\n\r\n\tdefinePage(callback) {\r\n\t\tthis.linksParent.addEventListener(\"click\", e => {\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tthis.tabState = {\r\n\t\t\t\tactiveTab: document.querySelector(\".active\"),\r\n\t\t\t};\r\n\r\n\t\t\tlet active = document.querySelector(\".active\");\r\n\r\n\t\t\tlet target = e && e.target && e.target.closest(\"a[data-attr]\");\r\n\r\n\t\t\tif (target.classList.contains(\"active\")) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (target.classList.contains(\"tab\")) {\r\n\t\t\t\t//let active = document.querySelector(\".active\"); //So, for example, you could the same solution as we did with a slider in class.\r\n\r\n\t\t\t\tthis.tabState.activeTab.classList.remove(\"active\");\r\n\t\t\t\ttarget.classList.add(\"active\");\r\n\t\t\t\tthis.tabState.activeTab = target;\r\n\r\n\t\t\t\tlet href = target.getAttribute(\"href\");\r\n\r\n\t\t\t\tthis.switchRouter(href, callback);\r\n\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t});\r\n\t}\r\n\r\n\tswitchRouter(href, callback) {\r\n\t\tthis.state.activePage = href;\r\n\t\tcallback(href);\r\n\t}\r\n\r\n\trenderLink(options) {\r\n\t\tlet { href, glyphicon, text, active } = options;\r\n\t\tlet activeClass = active ? \"active\" : \"\";\r\n\r\n\t\treturn `\r\n\t\t \r\n\t\t ${text} \r\n\t\t `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/router.js?"); + +/***/ }), + +/***/ "./js/user.js": +/*!********************!*\ + !*** ./js/user.js ***! + \********************/ +/*! exports provided: User */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"User\", function() { return User; });\nclass User {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\trenderOptions(options) {\r\n\t\tlet { glyphicon, text } = options;\r\n\r\n\t\treturn `
      \r\n\t\t\t\t
      \r\n\t\t\t\t${text}\r\n\t\t\t
      `;\r\n\t}\r\n\r\n\tsetHandlers() {\r\n\t\tconsole.log(this);\r\n\t}\r\n\r\n\trender() {\r\n\t\tlet userName = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.fullName\r\n\t\t\t: \"User Name\";\r\n\t\tlet mobileNumber = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.phone\r\n\t\t\t: \"\";\r\n\r\n\t\treturn `
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tContacts\r\n\t\t\t\t\t\tEdit\r\n\t \t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t\"#\"\r\n\t\t\t\t\t
      ${userName}
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"comment\", text: \"message\" })}\r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"earphone\", text: \"call\" })}\t\t\t\t\r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"facetime-video\", text: \"video\" })}\t\r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"envelope\", text: \"mail\" })}\r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      mobile number

      \r\n\t\t\t\t\t\t
      ${mobileNumber}
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      home number

      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/user.js?"); + +/***/ }) + +/******/ }); \ No newline at end of file diff --git a/phoneApp/index.html b/phoneApp/index.html index d8a75ae..da7dbab 100644 --- a/phoneApp/index.html +++ b/phoneApp/index.html @@ -4,24 +4,24 @@ - User + PhoneApp
      - - - - + + \ No newline at end of file diff --git a/phoneApp/js/addUser.js b/phoneApp/js/addUser.js index 4f0cd42..13cb1bd 100644 --- a/phoneApp/js/addUser.js +++ b/phoneApp/js/addUser.js @@ -127,3 +127,5 @@ class AddUser {
      `; } } + +export {AddUser}; \ No newline at end of file diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js index 563862a..81ba6b2 100644 --- a/phoneApp/js/api.js +++ b/phoneApp/js/api.js @@ -67,3 +67,5 @@ class Api { return fetch(this.url + `/${id}`, { method: "DELETE" }); } } + +export {Api}; \ No newline at end of file diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index d9a483d..43443e8 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -3,7 +3,7 @@ Cделать phone-book у которого будет: 1) Вы заполните пользователей на сервер по адресу с вашими инициалами. + 2) При загрузке приложения, вы получите пользователей с сервера + -3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет) +- +3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет) + 4) При нажатии на пользователя будет открываться данный пользователь + 5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact) + ---------------- ~90 балов @@ -16,24 +16,18 @@ Cделать phone-book в этот инпут можно ввести инициалы easycode студента (2) в зависимости от этого будут загружаться разные пользователи */ +import {ContactsPage} from './contacts.js'; +import {AddUser} from './addUser.js'; +import {KeypadPage} from './keypad.js'; +import {EditContact} from './editContact.js'; +import {User} from './user.js'; +import {Router} from './router.js'; +import {Api} from './api.js'; class App { constructor() { this.url = `https://easycode-js.herokuapp.com/pnv2/users`; this.state = { - //равен ссылке, которая ведет на объект - /* people: [ - { - name: "Кира", - lastName: "Воробьева", - email: "Kira1990@ec.ua" - }, - { - name: "Виктор", - lastName: "Кривенко", - email: "ViktorKriv@ec.ua" - } - ],*/ activePage: "contacts", api: new Api(this.url) }; @@ -52,12 +46,12 @@ class App { this.appDOMNode = document.getElementById("app"); // сюда будем делать рендер всех страниц // и это не будет затрагивать футер и его события - /* window.addEventListener('popstate'. event => { // не работает - render(event.state); - })*/ + window.addEventListener("popstate", event => { + this.updateView(event.state); + }); } - render(href) { + render() { const { activePage } = this.state; if (activePage == "contacts") { @@ -78,8 +72,11 @@ class App { this.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку, // которая сейчас указана как activePage в this.state this.pages[activePage].setHandlers(); //и навесь обработчики событий + window.history.pushState(forHistory, activePage, activePage); // добавляем в историю ссылку, которая будет наверху + } - //window.history.pushState(forHistory, href, href) // ДОПИСАТЬ!!! + updateView(content) { + this.appDOMNode.innerHTML = content; } static initialize() { diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index b407c98..91e0bb1 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -219,3 +219,5 @@ class ContactsPage { `; } } + +export {ContactsPage}; \ No newline at end of file diff --git a/phoneApp/js/editContact.js b/phoneApp/js/editContact.js index ed4f536..603e087 100644 --- a/phoneApp/js/editContact.js +++ b/phoneApp/js/editContact.js @@ -206,3 +206,5 @@ class EditContact { `; } } + +export {EditContact}; \ No newline at end of file diff --git a/phoneApp/js/keypad.js b/phoneApp/js/keypad.js index 8acd675..dc7b067 100644 --- a/phoneApp/js/keypad.js +++ b/phoneApp/js/keypad.js @@ -106,3 +106,5 @@ class KeypadPage { `; } } + +export {KeypadPage}; \ No newline at end of file diff --git a/phoneApp/js/router.js b/phoneApp/js/router.js index 0a5f228..1b48971 100644 --- a/phoneApp/js/router.js +++ b/phoneApp/js/router.js @@ -51,6 +51,12 @@ class Router { this.linksParent.addEventListener("click", e => { e.preventDefault(); + this.tabState = { + activeTab: document.querySelector(".active"), + }; + + let active = document.querySelector(".active"); + let target = e && e.target && e.target.closest("a[data-attr]"); if (target.classList.contains("active")) { @@ -58,15 +64,16 @@ class Router { } if (target.classList.contains("tab")) { - let active = document.querySelector(".active"); //So, for example, you could the same solution as we did with a slider in class. + //let active = document.querySelector(".active"); //So, for example, you could the same solution as we did with a slider in class. - active.classList.remove("active"); + this.tabState.activeTab.classList.remove("active"); target.classList.add("active"); + this.tabState.activeTab = target; let href = target.getAttribute("href"); this.switchRouter(href, callback); - //console.log('active page:', this.activePage) + } return; }); @@ -75,8 +82,6 @@ class Router { switchRouter(href, callback) { this.state.activePage = href; callback(href); - - //window.history.pushState() } renderLink(options) { @@ -89,3 +94,5 @@ class Router { `; } } + +export {Router}; \ No newline at end of file diff --git a/phoneApp/js/server.js b/phoneApp/js/server.js new file mode 100644 index 0000000..cc945fd --- /dev/null +++ b/phoneApp/js/server.js @@ -0,0 +1,30 @@ +const http = require('http'); +const fs = require('fs'); + +http + .createServer((request, response) => { + //const index = fs.readFileSync('./index.html');//сначала читаем файл index.html + let url = request.url; + if (url == '/') { + url = './index.html'; + } + //console.log(url); + + try { + + let file = fs.readFileSync(`.${url}`); + response.end(file); + + } catch (err) { + if (err.code == 'ENOENT') { + console.log(`${url} does not exist`) + } else { + console.log('some other error'); + } + } + + response.end('NOT FOUND', 404);//закрой все соединение и отправь в него файл index + }) + .listen(3000, err => { + console.log('server started on 3000'); + }) \ No newline at end of file diff --git a/phoneApp/js/user.js b/phoneApp/js/user.js index 48974f2..008cff7 100644 --- a/phoneApp/js/user.js +++ b/phoneApp/js/user.js @@ -65,3 +65,5 @@ class User { `; } } + +export {User}; \ No newline at end of file diff --git a/phoneApp/package-lock.json b/phoneApp/package-lock.json new file mode 100644 index 0000000..c9ef604 --- /dev/null +++ b/phoneApp/package-lock.json @@ -0,0 +1,4157 @@ +{ + "name": "phoneapp", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "3.1.0", + "mamacro": "0.0.3" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "3.1.0" + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "mamacro": "0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "3.1.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "1.1.12" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "3.1.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "3.1.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "3.2.0", + "mamacro": "0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "3.2.0" + } + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "5.7.1" + } + }, + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.1", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.12", + "isarray": "1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.4.0" + } + }, + "chardet": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.5.0.tgz", + "integrity": "sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g==", + "dev": true + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "1.0.4", + "path-key": "2.0.1", + "semver": "5.5.1", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "dev": true, + "requires": { + "xregexp": "4.0.0" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.5", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.1.tgz", + "integrity": "sha512-e1neqvSt5pSwQcFnYc6yfGuJD2Q4336cdbHs5VeUO0zTkqPbrHMyw2q1r47fpfLWbvIG8H8A6YO3sck7upTV6Q==", + "dev": true, + "requires": { + "chardet": "0.5.0", + "iconv-lite": "0.4.23", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "global-modules-path": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz", + "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.5", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.1.0.tgz", + "integrity": "sha512-f9K2MMx/G/AVmJSaZg2a+GVLRRmTdlGLbwxsibNd6yNTxXujqxPypjCnxnC0y4+Wb/rNY5KyKuq06AO5jrE+7w==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "3.0.1", + "figures": "2.0.0", + "lodash": "4.17.10", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rxjs": "6.2.2", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.3" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "neo-async": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", + "integrity": "sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw==", + "dev": true + }, + "nice-try": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz", + "integrity": "sha512-2NpiFHqC87y/zFke0fC0spBXL3bBsoh/p5H1EFhshxjCR5+0g2d6BiXbUFz9v1sAcxsk2htp2eQnNIci2dIYcA==", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.4", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "rxjs": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", + "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "6.5.3", + "ajv-keywords": "3.2.0" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.7", + "serialize-javascript": "1.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.0.4", + "graceful-fs": "4.1.11", + "neo-async": "2.5.2" + } + }, + "webpack": { + "version": "4.16.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.16.5.tgz", + "integrity": "sha512-i5cHYHonzSc1zBuwB5MSzW4v9cScZFbprkHK8ZgzPDCRkQXGGpYzPmJhbus5bOrZ0tXTcQp+xyImRSvKb0b+Kw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "5.7.1", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.5.3", + "ajv-keywords": "3.2.0", + "chrome-trace-event": "1.0.0", + "enhanced-resolve": "4.1.0", + "eslint-scope": "4.0.0", + "json-parse-better-errors": "1.0.2", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.5.2", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.7", + "tapable": "1.0.0", + "uglifyjs-webpack-plugin": "1.3.0", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0" + } + }, + "webpack-cli": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.0.tgz", + "integrity": "sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "cross-spawn": "6.0.5", + "enhanced-resolve": "4.1.0", + "global-modules-path": "2.3.0", + "import-local": "1.0.0", + "inquirer": "6.1.0", + "interpret": "1.1.0", + "loader-utils": "1.1.0", + "supports-color": "5.4.0", + "v8-compile-cache": "2.0.2", + "yargs": "12.0.1" + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", + "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "2.0.0", + "find-up": "3.0.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "4.0.0", + "yargs-parser": "10.1.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "3.0.0", + "path-exists": "3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "dev": true, + "requires": { + "p-try": "2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "dev": true + } + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } +} diff --git a/phoneApp/package.json b/phoneApp/package.json new file mode 100644 index 0000000..a4af40d --- /dev/null +++ b/phoneApp/package.json @@ -0,0 +1,16 @@ +{ + "name": "phoneapp", + "version": "1.0.0", + "description": "my phoneApp", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "webpack": "./node_modules/.bin/webpack-cli" + }, + "author": "", + "license": "ISC", + "devDependencies": { + "webpack": "^4.16.5", + "webpack-cli": "^3.1.0" + } +} diff --git a/phoneApp/webpack.config.js b/phoneApp/webpack.config.js new file mode 100644 index 0000000..f92ee2b --- /dev/null +++ b/phoneApp/webpack.config.js @@ -0,0 +1,12 @@ +const path = require('path'); //пакет nodeJs, получает абсолютный путь + +module.exports = { + entry: './js/app.js', // точка входа + output: { + path: path.resolve(__dirname, 'build'), // целевая директория + filename: 'bundle.js', // итоговый файл + publicPath: '/' + }, + mode: 'development', + watch: true, // когда запустим npm run webpack, он не будет завершаться +} \ No newline at end of file From f56799429a1671f960f964dd8ffdf230879ee7c8 Mon Sep 17 00:00:00 2001 From: Nataliia Protsenko Date: Sun, 26 Aug 2018 23:15:12 +0300 Subject: [PATCH 19/19] phone number was formatted, trying to configure webpack --- js-core/classworks/classwork-24/index.html | 16 + js-core/classworks/classwork-24/main.js | 3 + .../classworks/classwork-24/package-lock.json | 6635 +++++++++++++++++ js-core/classworks/classwork-24/package.json | 21 + phoneApp/.babelrc | 4 + phoneApp/build/bundle.js | 48 +- phoneApp/js/addUser.js | 10 +- phoneApp/js/api.js | 6 +- phoneApp/js/app.js | 59 +- phoneApp/js/contacts.js | 44 +- phoneApp/js/editContact.js | 10 +- phoneApp/js/keypad.js | 49 +- phoneApp/js/server.js | 3 +- phoneApp/js/user.js | 2 +- phoneApp/package-lock.json | 1285 +++- phoneApp/package.json | 9 + phoneApp/webpack.config.js | 31 +- 17 files changed, 8132 insertions(+), 103 deletions(-) create mode 100644 js-core/classworks/classwork-24/index.html create mode 100644 js-core/classworks/classwork-24/main.js create mode 100644 js-core/classworks/classwork-24/package-lock.json create mode 100644 js-core/classworks/classwork-24/package.json create mode 100644 phoneApp/.babelrc diff --git a/js-core/classworks/classwork-24/index.html b/js-core/classworks/classwork-24/index.html new file mode 100644 index 0000000..ce0f129 --- /dev/null +++ b/js-core/classworks/classwork-24/index.html @@ -0,0 +1,16 @@ + + + + + Lesson_24 + + + + +

      Classwork 24

      + + + + \ No newline at end of file diff --git a/js-core/classworks/classwork-24/main.js b/js-core/classworks/classwork-24/main.js new file mode 100644 index 0000000..b28b04f --- /dev/null +++ b/js-core/classworks/classwork-24/main.js @@ -0,0 +1,3 @@ + + + diff --git a/js-core/classworks/classwork-24/package-lock.json b/js-core/classworks/classwork-24/package-lock.json new file mode 100644 index 0000000..bdb3839 --- /dev/null +++ b/js-core/classworks/classwork-24/package-lock.json @@ -0,0 +1,6635 @@ +{ + "name": "classwork-24", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@webassemblyjs/ast": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.5.13.tgz", + "integrity": "sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "debug": "3.1.0", + "mamacro": "0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz", + "integrity": "sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz", + "integrity": "sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz", + "integrity": "sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA==", + "dev": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz", + "integrity": "sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.5.13" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz", + "integrity": "sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz", + "integrity": "sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ==", + "dev": true, + "requires": { + "debug": "3.1.0", + "mamacro": "0.0.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz", + "integrity": "sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz", + "integrity": "sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/ieee754": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz", + "integrity": "sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg==", + "dev": true, + "requires": { + "ieee754": "1.1.12" + } + }, + "@webassemblyjs/leb128": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.5.13.tgz", + "integrity": "sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg==", + "dev": true, + "requires": { + "long": "4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==", + "dev": true + } + } + }, + "@webassemblyjs/utf8": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.5.13.tgz", + "integrity": "sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz", + "integrity": "sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/helper-wasm-section": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "@webassemblyjs/wast-printer": "1.5.13", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz", + "integrity": "sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz", + "integrity": "sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-buffer": "1.5.13", + "@webassemblyjs/wasm-gen": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz", + "integrity": "sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-wasm-bytecode": "1.5.13", + "@webassemblyjs/ieee754": "1.5.13", + "@webassemblyjs/leb128": "1.5.13", + "@webassemblyjs/utf8": "1.5.13" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz", + "integrity": "sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/floating-point-hex-parser": "1.5.13", + "@webassemblyjs/helper-api-error": "1.5.13", + "@webassemblyjs/helper-code-frame": "1.5.13", + "@webassemblyjs/helper-fsm": "1.5.13", + "long": "3.2.0", + "mamacro": "0.0.3" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz", + "integrity": "sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/wast-parser": "1.5.13", + "long": "3.2.0" + } + }, + "accepts": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", + "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "dev": true, + "requires": { + "mime-types": "2.1.19", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", + "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", + "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", + "dev": true, + "requires": { + "acorn": "5.7.1" + } + }, + "ajv": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.3.tgz", + "integrity": "sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg==", + "dev": true, + "requires": { + "fast-deep-equal": "2.0.1", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.4.1", + "uri-js": "4.2.2" + } + }, + "ajv-keywords": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", + "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", + "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "dev": true + }, + "array-includes": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", + "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "es-abstract": "1.12.0" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "3.2.8", + "invariant": "2.2.4", + "semver": "5.5.1" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "base64-js": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", + "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.3", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "2.1.1", + "deep-equal": "1.0.1", + "dns-equal": "1.0.0", + "dns-txt": "2.0.2", + "multicast-dns": "6.2.3", + "multicast-dns-service-types": "1.1.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "1.2.0", + "browserify-des": "1.0.2", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.6" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "elliptic": "6.4.1", + "inherits": "2.0.3", + "parse-asn1": "5.1.1" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "1.0.6" + } + }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000878", + "electron-to-chromium": "1.3.59" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.3.0", + "ieee754": "1.1.12", + "isarray": "1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "10.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz", + "integrity": "sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "chownr": "1.0.1", + "glob": "7.1.2", + "graceful-fs": "4.1.11", + "lru-cache": "4.1.3", + "mississippi": "2.0.0", + "mkdirp": "0.5.1", + "move-concurrently": "1.0.1", + "promise-inflight": "1.0.1", + "rimraf": "2.6.2", + "ssri": "5.3.0", + "unique-filename": "1.1.0", + "y18n": "4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caniuse-lite": { + "version": "1.0.30000878", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz", + "integrity": "sha512-/dCGTdLCnjVJno1mFRn7Y6eit3AYaeFzSrMQHCoK0LEQaWl5snuLex1Ky4b8/Qu2ig5NgTX4cJx65hH9546puA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", + "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "async-each": "1.0.1", + "braces": "2.3.2", + "fsevents": "1.2.4", + "glob-parent": "3.1.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "4.0.0", + "lodash.debounce": "4.0.8", + "normalize-path": "2.1.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0", + "upath": "1.1.0" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "1.9.3" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", + "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", + "dev": true, + "requires": { + "color-name": "1.1.1" + } + }, + "color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", + "dev": true + }, + "commander": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compressible": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.14.tgz", + "integrity": "sha1-MmxfUH+7BV9UEWeCuWmoG2einac=", + "dev": true, + "requires": { + "mime-db": "1.35.0" + } + }, + "compression": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.3.tgz", + "integrity": "sha512-HSjyBG5N1Nnz7tF2+O7A9XUhyjru71/fwgNb7oIsEVHR0WShfs2tIS/EySLgiTe98aOK18YDlMXpzjCXY/n9mg==", + "dev": true, + "requires": { + "accepts": "1.3.5", + "bytes": "3.0.0", + "compressible": "2.0.14", + "debug": "2.6.9", + "on-headers": "1.0.1", + "safe-buffer": "5.1.2", + "vary": "1.1.2" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "typedarray": "0.0.6" + } + }, + "connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "1.2.0", + "fs-write-stream-atomic": "1.0.10", + "iferr": "0.1.5", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.1" + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "md5.js": "1.3.4", + "ripemd160": "2.0.2", + "sha.js": "2.4.11" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.2.0", + "inherits": "2.0.3", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.3", + "shebang-command": "1.2.0", + "which": "1.3.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.1", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.3", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", + "inherits": "2.0.3", + "pbkdf2": "3.0.16", + "public-encrypt": "4.0.2", + "randombytes": "2.0.6", + "randomfill": "1.0.4" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.46" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "dev": true, + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.1", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-node": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", + "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.6" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "1.1.5", + "safe-buffer": "5.1.2" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "1.1.1" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "stream-shift": "1.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.59", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.59.tgz", + "integrity": "sha512-PbJGGpDSNn3fyUN1eQESAmnMT+a1QAO4NEZgikDuGOn7tbAuMHF87jNna+NoVsMBfEEYzfpn/ay88HgDCJUbQA==", + "dev": true + }, + "elliptic": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.5", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.23" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "tapable": "1.0.0" + } + }, + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "dev": true, + "requires": { + "prr": "1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.46", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.46.tgz", + "integrity": "sha512-24XxRvJXNFwEMpJb3nOkiRJKRoupmjYmOPVlI65Qy2SrtxwOTB+g6ODjBKOtwEHbYrhWRty9xxOWLNdClT2djw==", + "dev": true, + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "next-tick": "1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.46", + "es6-symbol": "3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.46" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "eslint-scope": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz", + "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==", + "dev": true, + "requires": { + "esrecurse": "4.2.1", + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.2" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.2" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "express": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.1", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.4", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.2", + "serve-static": "1.13.2", + "setprototypeof": "1.1.0", + "statuses": "1.4.0", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "fbjs": { + "version": "0.8.17", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.17.tgz", + "integrity": "sha1-xNWY6taUkRJlPWWIsBpc3Nn5D90=", + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.18" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "finalhandler": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.4.0", + "unpipe": "1.0.0" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "dev": true, + "requires": { + "commondir": "1.0.1", + "make-dir": "1.3.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "follow-redirects": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.6.tgz", + "integrity": "sha512-xay/eYZGgdpb3rpugZj1HunNaPcqc6fud/RW7LNEQntvKzuRO4DDLL+MnJIbTHh6t3Kda3v2RvhY2doxUddnig==", + "dev": true, + "requires": { + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "iferr": "0.1.5", + "imurmurhash": "0.1.4", + "readable-stream": "2.3.6" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.10.0", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + } + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handle-thing": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", + "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "hash.js": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", + "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.5", + "minimalistic-assert": "1.0.1", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", + "dev": true + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "wbuf": "1.7.3" + } + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": "1.4.0" + } + }, + "http-parser-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.13.tgz", + "integrity": "sha1-O9bW/ebjFyyTNMOzO2wZPYD+ETc=", + "dev": true + }, + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", + "dev": true, + "requires": { + "eventemitter3": "3.1.0", + "follow-redirects": "1.5.6", + "requires-port": "1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz", + "integrity": "sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q==", + "dev": true, + "requires": { + "http-proxy": "1.17.0", + "is-glob": "4.0.0", + "lodash": "4.17.10", + "micromatch": "3.1.10" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ieee754": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", + "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "internal-ip": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", + "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "dev": true, + "requires": { + "meow": "3.7.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.4.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz", + "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.4" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "killable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.0.tgz", + "integrity": "sha1-2ouEvUfeU5WHj5XWTQLyRJ/gXms=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "2.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "loglevel": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.1.tgz", + "integrity": "sha1-4PyVEztu8nbNyIh82vJKpvFW+Po=", + "dev": true + }, + "loglevelnext": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/loglevelnext/-/loglevelnext-1.0.5.tgz", + "integrity": "sha512-V/73qkPuJmx4BcBF19xPBr+0ZRVBhc4POxvZTZdMeXpJ4NItXSJ/MSwuFT0kQJlCbXvdlZoQQ/418bS1y9Jh6A==", + "dev": true, + "requires": { + "es6-symbol": "3.1.1", + "object.assign": "4.1.0" + } + }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dev": true, + "requires": { + "pify": "3.0.0" + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.7", + "readable-stream": "2.3.6" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.35.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", + "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.19", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", + "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", + "dev": true, + "requires": { + "mime-db": "1.35.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mississippi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", + "integrity": "sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==", + "dev": true, + "requires": { + "concat-stream": "1.6.2", + "duplexify": "3.6.0", + "end-of-stream": "1.4.1", + "flush-write-stream": "1.0.3", + "from2": "2.3.0", + "parallel-transform": "1.1.0", + "pump": "2.0.1", + "pumpify": "1.5.1", + "stream-each": "1.2.3", + "through2": "2.0.3" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "copy-concurrently": "1.0.5", + "fs-write-stream-atomic": "1.0.10", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "run-queue": "1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "1.3.1", + "thunky": "1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "nan": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "neo-async": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.2.tgz", + "integrity": "sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-forge": { + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.5.tgz", + "integrity": "sha512-MmbQJ2MTESTjt3Gi/3yG1wGpIMhUfcIypUCGtTizFR9IiccFwxSpfp0vtIZlkFclEqERemxfnSdZEMR9VqqEFQ==", + "dev": true + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.2.0", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.6", + "stream-browserify": "2.0.1", + "stream-http": "2.8.3", + "string_decoder": "1.1.1", + "timers-browserify": "2.0.10", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.4", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.7.1", + "is-builtin-module": "1.0.0", + "semver": "5.5.1", + "validate-npm-package-license": "3.0.4" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "object-keys": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", + "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "1.1.3", + "function-bind": "1.1.1", + "has-symbols": "1.0.0", + "object-keys": "1.0.12" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dev": true, + "requires": { + "is-wsl": "1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.3.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "dev": true + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "dev": true, + "requires": { + "cyclist": "0.2.2", + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "parse-asn1": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "dev": true, + "requires": { + "asn1.js": "4.10.1", + "browserify-aes": "1.2.0", + "create-hash": "1.2.0", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.16" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pbkdf2": { + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", + "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "dev": true, + "requires": { + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "ripemd160": "2.0.2", + "safe-buffer": "5.1.2", + "sha.js": "2.4.11" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + } + }, + "portfinder": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.17.tgz", + "integrity": "sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==", + "dev": true, + "requires": { + "async": "1.5.2", + "debug": "2.6.9", + "mkdirp": "0.5.1" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "2.0.6" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prop-types": { + "version": "15.6.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz", + "integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==", + "requires": { + "loose-envify": "1.4.0", + "object-assign": "4.1.1" + } + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.8.0" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", + "randombytes": "2.0.6" + } + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "once": "1.4.0" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "3.6.0", + "inherits": "2.0.3", + "pump": "2.0.1" + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true + }, + "randombytes": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", + "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "2.0.6", + "safe-buffer": "5.1.2" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.4.0" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "react-dom": { + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.4.2.tgz", + "integrity": "sha512-Usl73nQqzvmJN+89r97zmeUpQDKDlh58eX6Hbs/ERdDHzeBzWy+ENk7fsGQ+5KxArV1iOFPT46/VneklK9zoWw==", + "requires": { + "fbjs": "0.8.17", + "loose-envify": "1.4.0", + "object-assign": "4.1.1", + "prop-types": "15.6.2" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.2", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.6", + "set-immediate-shim": "1.0.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "1.2.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "6.5.3", + "ajv-keywords": "3.2.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.3.tgz", + "integrity": "sha512-vmZenZ+8Al3NLHkWnhBQ0x6BkML1eCP2xEi3JE+f3D9wW9fipD9NNJHYtE9XJM4TsPaHGZJIamrSI6MTg1dU2Q==", + "dev": true, + "requires": { + "node-forge": "0.7.5" + } + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.3", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.4.0" + } + }, + "serialize-javascript": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz", + "integrity": "sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==", + "dev": true + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "1.3.5", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "1.0.3", + "http-errors": "1.6.3", + "mime-types": "2.1.19", + "parseurl": "1.3.2" + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.2" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "sockjs": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", + "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "dev": true, + "requires": { + "faye-websocket": "0.10.0", + "uuid": "3.3.2" + } + }, + "sockjs-client": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.5.tgz", + "integrity": "sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM=", + "dev": true, + "requires": { + "debug": "2.6.9", + "eventsource": "0.1.6", + "faye-websocket": "0.11.1", + "inherits": "2.0.3", + "json3": "3.3.2", + "url-parse": "1.4.3" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", + "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + } + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "dev": true, + "requires": { + "spdx-expression-parse": "3.0.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + }, + "spdy": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", + "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "dev": true, + "requires": { + "debug": "2.6.9", + "handle-thing": "1.2.5", + "http-deceiver": "1.2.7", + "safe-buffer": "5.1.2", + "select-hose": "2.0.0", + "spdy-transport": "2.1.0" + } + }, + "spdy-transport": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.1.0.tgz", + "integrity": "sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g==", + "dev": true, + "requires": { + "debug": "2.6.9", + "detect-node": "2.0.3", + "hpack.js": "2.1.6", + "obuf": "1.1.2", + "readable-stream": "2.3.6", + "safe-buffer": "5.1.2", + "wbuf": "1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "ssri": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", + "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.6" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "stream-shift": "1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.6", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tapable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz", + "integrity": "sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg==", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.6", + "xtend": "4.0.1" + } + }, + "thunky": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.0.2.tgz", + "integrity": "sha1-qGLgGOP7HqLsP85dVWBc9X8kc3E=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.19" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.18", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.18.tgz", + "integrity": "sha512-LtzwHlVHwFGTptfNSgezHp7WUlwiqb0gA9AALRbKaERfxwJoiX0A73QbTToxteIAuIaFshhgIZfqK8s7clqgnA==" + }, + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", + "dev": true, + "requires": { + "commander": "2.13.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "uglifyjs-webpack-plugin": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz", + "integrity": "sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==", + "dev": true, + "requires": { + "cacache": "10.0.4", + "find-cache-dir": "1.0.0", + "schema-utils": "0.4.7", + "serialize-javascript": "1.5.0", + "source-map": "0.6.1", + "uglify-es": "3.3.9", + "webpack-sources": "1.1.0", + "worker-farm": "1.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "dev": true, + "requires": { + "unique-slug": "2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "dev": true, + "requires": { + "imurmurhash": "0.1.4" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", + "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "dev": true + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "2.1.1" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-join": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.0.tgz", + "integrity": "sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo=", + "dev": true + }, + "url-parse": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", + "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "dev": true, + "requires": { + "querystringify": "2.0.0", + "requires-port": "1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "3.0.0", + "spdx-expression-parse": "3.0.0" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "2.0.4", + "graceful-fs": "4.1.11", + "neo-async": "2.5.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "1.0.1" + } + }, + "webpack": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.17.0.tgz", + "integrity": "sha512-5oVYOsryM1h7AC83l64iZx7IrK8DlMkbFOsT2R5frwz/hbdoyjHb8/ybBEFsMEavKa2IaqVlx5b4uYiFcT+2Nw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.5.13", + "@webassemblyjs/helper-module-context": "1.5.13", + "@webassemblyjs/wasm-edit": "1.5.13", + "@webassemblyjs/wasm-opt": "1.5.13", + "@webassemblyjs/wasm-parser": "1.5.13", + "acorn": "5.7.1", + "acorn-dynamic-import": "3.0.0", + "ajv": "6.5.3", + "ajv-keywords": "3.2.0", + "chrome-trace-event": "1.0.0", + "enhanced-resolve": "4.1.0", + "eslint-scope": "4.0.0", + "json-parse-better-errors": "1.0.2", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "micromatch": "3.1.10", + "mkdirp": "0.5.1", + "neo-async": "2.5.2", + "node-libs-browser": "2.1.0", + "schema-utils": "0.4.7", + "tapable": "1.0.0", + "uglifyjs-webpack-plugin": "1.3.0", + "watchpack": "1.6.0", + "webpack-sources": "1.1.0" + } + }, + "webpack-dev-middleware": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.1.3.tgz", + "integrity": "sha512-I6Mmy/QjWU/kXwCSFGaiOoL5YEQIVmbb0o45xMoCyQAg/mClqZVTcsX327sPfekDyJWpCxb+04whNyLOIxpJdQ==", + "dev": true, + "requires": { + "loud-rejection": "1.6.0", + "memory-fs": "0.4.1", + "mime": "2.3.1", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "url-join": "4.0.0", + "webpack-log": "1.2.0" + }, + "dependencies": { + "mime": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.1.5.tgz", + "integrity": "sha512-LVHg+EPwZLHIlfvokSTgtJqO/vI5CQi89fASb5JEDtVMDjY0yuIEqPPdMiKaBJIB/Ab7v/UN/sYZ7WsZvntQKw==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "array-includes": "3.0.3", + "bonjour": "3.5.0", + "chokidar": "2.0.4", + "compression": "1.7.3", + "connect-history-api-fallback": "1.5.0", + "debug": "3.1.0", + "del": "3.0.0", + "express": "4.16.3", + "html-entities": "1.2.1", + "http-proxy-middleware": "0.18.0", + "import-local": "1.0.0", + "internal-ip": "1.2.0", + "ip": "1.1.5", + "killable": "1.0.0", + "loglevel": "1.6.1", + "opn": "5.3.0", + "portfinder": "1.0.17", + "selfsigned": "1.10.3", + "serve-index": "1.9.1", + "sockjs": "0.3.19", + "sockjs-client": "1.1.5", + "spdy": "3.4.7", + "strip-ansi": "3.0.1", + "supports-color": "5.5.0", + "webpack-dev-middleware": "3.1.3", + "webpack-log": "1.2.0", + "yargs": "11.0.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "webpack-log": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", + "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "log-symbols": "2.2.0", + "loglevelnext": "1.0.5", + "uuid": "3.3.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.2" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "webpack-sources": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", + "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.13", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "whatwg-fetch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", + "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", + "dev": true, + "requires": { + "errno": "0.1.7" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/js-core/classworks/classwork-24/package.json b/js-core/classworks/classwork-24/package.json new file mode 100644 index 0000000..3417744 --- /dev/null +++ b/js-core/classworks/classwork-24/package.json @@ -0,0 +1,21 @@ +{ + "name": "classwork-24", + "version": "1.0.0", + "description": "", + "main": "main.js", + "dependencies": { + "react-dom": "^16.4.2" + }, + "devDependencies": { + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "babel-preset-react": "^6.24.1", + "webpack": "^4.17.0", + "webpack-dev-server": "^3.1.5" + }, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/phoneApp/.babelrc b/phoneApp/.babelrc new file mode 100644 index 0000000..1698e9f --- /dev/null +++ b/phoneApp/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["es2015", "react", "stage-0"], + "plugins": [] +} \ No newline at end of file diff --git a/phoneApp/build/bundle.js b/phoneApp/build/bundle.js index 206b164..58ecc37 100644 --- a/phoneApp/build/bundle.js +++ b/phoneApp/build/bundle.js @@ -90,11 +90,11 @@ /*!***********************!*\ !*** ./js/addUser.js ***! \***********************/ -/*! exports provided: AddUser */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"AddUser\", function() { return AddUser; });\nclass AddUser {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\tbuttonsHandler() {\r\n\t\tlet buttonsParent = document.querySelector(\"main\");\r\n\t\tbuttonsParent.addEventListener(\"click\", this.clickHandler.bind(this));\r\n\t}\r\n\r\n\tclickHandler(e) {\r\n\t\tlet target = e && e.target;\r\n\t\tif (!target) return;\r\n\r\n\t\tif (target.tagName === \"INPUT\") {\r\n\t\t\ttarget.classList.add(\"active-input\");\r\n\t\t}\r\n\r\n\t\ttarget.addEventListener(\"blur\", () => {\r\n\t\t\ttarget.classList.remove(\"active-input\");\r\n\t\t});\r\n\t}\r\n\r\n\taddUser() {\r\n\t\tconst { name, lastName, email, phone } = this.form.elements; // name, lastName, email, phone - атрибуты name у элементов формы\r\n\r\n\t\tif (!name.value) {\r\n\t\t\talert(\"заполните name\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!lastName.value) {\r\n\t\t\talert(\"заполните Last Name\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!email.value) {\r\n\t\t\talert(\"заполните email\");\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (!phone.value) {\r\n\t\t\talert(\"заполните phone\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlet fullName = `${name.value} ${lastName.value}`;\r\n\r\n\t\tthis.state.api.postUser([fullName, email.value, phone.value]);\r\n\r\n\t\tthis.clearFields();\r\n\t}\r\n\r\n\tclearFields() {\r\n\t\tlet myFormElements = this.form.elements;\r\n\r\n\t\t[...myFormElements].forEach(item => {\r\n\t\t\tif (item.tagName === \"INPUT\") {\r\n\t\t\t\titem.value = \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\trenderInfo(options) {\r\n\t\tlet { placeholder, name } = options;\r\n\t\treturn `
      \r\n\t\t\t\t\r\n\t\t\t
      `;\r\n\t}\r\n\r\n\tsetHandlers() {\r\n\t\tthis.buttonsHandler();\r\n\t\tthis.addButton = document.querySelector(\".done-btn\");\r\n\t\tthis.deleteButton = document.querySelector(\".delete-contact\");\r\n\t\tthis.form = document.forms[0];\r\n\t\tthis.form.addEventListener(\"submit\", event => {\r\n\t\t\tevent.preventDefault();\r\n\t\t});\r\n\t\tthis.addButton.addEventListener(\"click\", this.addUser.bind(this));\r\n\t\tthis.deleteButton.addEventListener(\r\n\t\t\t\"click\",\r\n\t\t\tthis.clearFields.bind(this)\r\n\t\t);\r\n\t}\r\n\r\n\trender() {\r\n\t\treturn `
      \r\n\t\t\t
      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"First Name\", name: \"name\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"Last Name\", name: \"lastName\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"Company\", name: \"company\" })}\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add mobile phone\", name: \"phone\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add home phone\", name: \"homePhone\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add email\", name: \"email\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add address\", name: \"address\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add birthday\", name: \"birthday\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add social profile\", name: \"profile\" })}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add field\", name: \"field\" })}\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\t\t
      `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/addUser.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n//import {Api} from './api.js';\n\nvar AddUser = function () {\n\tfunction AddUser(globalState) {\n\t\t_classCallCheck(this, AddUser);\n\n\t\tthis.state = globalState;\n\t\t//this.api = new Api();\n\t}\n\n\t_createClass(AddUser, [{\n\t\tkey: \"buttonsHandler\",\n\t\tvalue: function buttonsHandler() {\n\t\t\tvar buttonsParent = document.querySelector(\"main\");\n\t\t\tbuttonsParent.addEventListener(\"click\", this.clickHandler.bind(this));\n\t\t}\n\t}, {\n\t\tkey: \"clickHandler\",\n\t\tvalue: function clickHandler(e) {\n\t\t\tvar target = e && e.target;\n\t\t\tif (!target) return;\n\n\t\t\tif (target.tagName === \"INPUT\") {\n\t\t\t\ttarget.classList.add(\"active-input\");\n\t\t\t}\n\n\t\t\ttarget.addEventListener(\"blur\", function () {\n\t\t\t\ttarget.classList.remove(\"active-input\");\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: \"addUser\",\n\t\tvalue: function addUser() {\n\t\t\tvar _form$elements = this.form.elements,\n\t\t\t name = _form$elements.name,\n\t\t\t lastName = _form$elements.lastName,\n\t\t\t email = _form$elements.email,\n\t\t\t phone = _form$elements.phone; // name, lastName, email, phone - атрибуты name у элементов формы\n\n\t\t\tif (!name.value) {\n\t\t\t\talert(\"заполните name\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!lastName.value) {\n\t\t\t\talert(\"заполните Last Name\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!email.value) {\n\t\t\t\talert(\"заполните email\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!phone.value) {\n\t\t\t\talert(\"заполните phone\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar fullName = name.value + \" \" + lastName.value;\n\n\t\t\tthis.state.api.postUser([fullName, email.value, phone.value]);\n\n\t\t\tthis.clearFields();\n\t\t}\n\t}, {\n\t\tkey: \"clearFields\",\n\t\tvalue: function clearFields() {\n\t\t\tvar myFormElements = this.form.elements;\n\n\t\t\t[].concat(_toConsumableArray(myFormElements)).forEach(function (item) {\n\t\t\t\tif (item.tagName === \"INPUT\") {\n\t\t\t\t\titem.value = \"\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: \"renderInfo\",\n\t\tvalue: function renderInfo(options) {\n\t\t\tvar placeholder = options.placeholder,\n\t\t\t name = options.name;\n\n\t\t\treturn \"
      \\n\\t\\t\\t\\t\\n\\t\\t\\t
      \";\n\t\t}\n\t}, {\n\t\tkey: \"setHandlers\",\n\t\tvalue: function setHandlers() {\n\t\t\tthis.buttonsHandler();\n\t\t\tthis.addButton = document.querySelector(\".done-btn\");\n\t\t\tthis.deleteButton = document.querySelector(\".delete-contact\");\n\t\t\t//this.cancelButton = document.getElementById(\"cancel\");\n\t\t\tthis.form = document.forms[0];\n\t\t\tthis.form.addEventListener(\"submit\", function (event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t\t\tthis.addButton.addEventListener(\"click\", this.addUser.bind(this));\n\t\t\tthis.deleteButton.addEventListener(\"click\", this.clearFields.bind(this));\n\t\t\t//this.cancelButton.addEventListener(\"click\", (e) => {\n\t\t\t//\te.preventDefault();\n\t\t\t//\twindow.history.back();\n\t\t\t//});\n\t\t}\n\t}, {\n\t\tkey: \"render\",\n\t\tvalue: function render() {\n\t\t\treturn \"
      \\n\\t\\t\\t
      \\n\\t\\t\\t\\t\\n\\t\\t\\t
      \\n\\t\\t
      \\n\\n\\t\\t
      \\n\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"First Name\", name: \"name\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"Last Name\", name: \"lastName\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"Company\", name: \"company\" }) + \"\\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add mobile phone\", name: \"phone\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add home phone\", name: \"homePhone\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add email\", name: \"email\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add address\", name: \"address\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add birthday\", name: \"birthday\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add social profile\", name: \"profile\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add field\", name: \"field\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t
      \\n\\t\\t
      \";\n\t\t}\n\t}]);\n\n\treturn AddUser;\n}();\n\nexports.AddUser = AddUser;\n\n//# sourceURL=webpack:///./js/addUser.js?"); /***/ }), @@ -102,11 +102,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!*******************!*\ !*** ./js/api.js ***! \*******************/ -/*! exports provided: Api */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Api\", function() { return Api; });\n/*\r\nTASK 2 -------DONE-------------------\r\nphone-app. Первая страница.\r\nЗагружайте пользователей с сервера при загрузке странице.\r\n*/\r\n\r\n/*-----------DONE------------------------\r\n// contentEditable\r\nСделайте, чтобы на странице add-user.html пользователь \r\nдобавлялся на сервер.\r\n/*\r\nДобавить возможность из формы, ДОБАВЛЯТЬ Пользователя на сервер\r\nadd-user\r\n*/\r\n\r\n// Для PhoneBook сделайте отдельный репозиторий + gh-pages\r\n\r\n// Рекомендую - вам необходимо сделать 1 метод(или отдельный класс)\r\n// который будет отправлять запросы\r\n// доступ к этому сервису должен быть в каждом вашем классе\r\n// url - должен быть константа, т.к url у вас изменяться не будет.cons\r\n\r\n// все запросы к серверу вот здесь\r\n\r\nclass Api {\r\n constructor(url) {\r\n this.url = url;\r\n }\r\n\r\n requestUsers() {\r\n return fetch(this.url).then(data => data.json());\r\n }\r\n\r\n postUser(arr) {\r\n const [fullName, email, phone] = arr;\r\n //console.log(arr);\r\n return fetch(this.url, {\r\n method: \"POST\",\r\n headers: {\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n fullName: fullName,\r\n email: email,\r\n phone: phone\r\n })\r\n });\r\n }\r\n\r\n patchUser(arr, id) {\r\n const [fullName, email, phone] = arr;\r\n //console.log(arr, id);\r\n return fetch(this.url + `/${id}`, {\r\n method: \"PATCH\",\r\n headers: {\r\n \"Content-type\": \"application/json\"\r\n },\r\n body: JSON.stringify({\r\n fullName: fullName,\r\n email: email,\r\n phone: phone\r\n })\r\n });\r\n }\r\n\r\n deleteUser(id) {\r\n return fetch(this.url + `/${id}`, { method: \"DELETE\" });\r\n }\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/api.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/*\r\nTASK 2 -------DONE-------------------\r\nphone-app. Первая страница.\r\nЗагружайте пользователей с сервера при загрузке странице.\r\n*/\n\n/*-----------DONE------------------------\r\n// contentEditable\r\nСделайте, чтобы на странице add-user.html пользователь \r\nдобавлялся на сервер.\r\n/*\r\nДобавить возможность из формы, ДОБАВЛЯТЬ Пользователя на сервер\r\nadd-user\r\n*/\n\n// Для PhoneBook сделайте отдельный репозиторий + gh-pages\n\n// Рекомендую - вам необходимо сделать 1 метод(или отдельный класс)\n// который будет отправлять запросы\n// доступ к этому сервису должен быть в каждом вашем классе\n// url - должен быть константа, т.к url у вас изменяться не будет.cons\n\n// все запросы к серверу вот здесь\n\nvar Api = function () {\n function Api(url) {\n _classCallCheck(this, Api);\n\n this.url = url;\n }\n\n _createClass(Api, [{\n key: \"requestUsers\",\n value: function requestUsers() {\n return fetch(this.url).then(function (data) {\n return data.json();\n });\n }\n }, {\n key: \"postUser\",\n value: function postUser(arr) {\n var _arr = _slicedToArray(arr, 3),\n fullName = _arr[0],\n email = _arr[1],\n phone = _arr[2];\n //console.log(arr);\n\n\n return fetch(this.url, {\n method: \"POST\",\n headers: {\n \"Content-type\": \"application/json\"\n },\n body: JSON.stringify({\n fullName: fullName,\n email: email,\n phone: phone\n })\n });\n }\n }, {\n key: \"patchUser\",\n value: function patchUser(arr, id) {\n var _arr2 = _slicedToArray(arr, 3),\n fullName = _arr2[0],\n email = _arr2[1],\n phone = _arr2[2];\n //console.log(arr, id);\n\n\n return fetch(this.url + (\"/\" + id), {\n method: \"PATCH\",\n headers: {\n \"Content-type\": \"application/json\"\n },\n body: JSON.stringify({\n fullName: fullName,\n email: email,\n phone: phone\n })\n });\n }\n }, {\n key: \"deleteUser\",\n value: function deleteUser(id) {\n return fetch(this.url + (\"/\" + id), {\n method: \"DELETE\"\n });\n }\n }]);\n\n return Api;\n}();\n\nexports.Api = Api;\n\n//# sourceURL=webpack:///./js/api.js?"); /***/ }), @@ -114,11 +114,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!*******************!*\ !*** ./js/app.js ***! \*******************/ -/*! no exports provided */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _contacts_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./contacts.js */ \"./js/contacts.js\");\n/* harmony import */ var _addUser_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./addUser.js */ \"./js/addUser.js\");\n/* harmony import */ var _keypad_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./keypad.js */ \"./js/keypad.js\");\n/* harmony import */ var _editContact_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./editContact.js */ \"./js/editContact.js\");\n/* harmony import */ var _user_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./user.js */ \"./js/user.js\");\n/* harmony import */ var _router_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./router.js */ \"./js/router.js\");\n/* harmony import */ var _api_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./api.js */ \"./js/api.js\");\n/*ДЗ\r\nCделать phone-book\r\nу которого будет:\r\n1) Вы заполните пользователей на сервер по адресу с вашими инициалами. +\r\n2) При загрузке приложения, вы получите пользователей с сервера\t\t\t+\r\n3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет)\t+\r\n4) При нажатии на пользователя будет открываться данный пользователь\t+\r\n5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact)\t+\r\n---------------- ~90 балов\r\nДля тех кто хочет +500$ к зарплате на старте\r\n6) Добавить удаление пользователей (2) +\r\n7) Должна быть модульная структура и Проект должен собираться при помощи webpack(2) (!)\r\n8) Проект должен транспайлится через babel последние 2 версии браузеров (2) (!)\r\n9) и после публикации на gh-pages, должен быть минифицирован(2)\r\n10) добавьте еще одну первую страницу на которой будет \"auth\"\r\nв этот инпут можно ввести инициалы easycode студента (2)\r\nв зависимости от этого будут загружаться разные пользователи\r\n*/\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nclass App {\r\n\tconstructor() {\r\n\t\tthis.url = `https://easycode-js.herokuapp.com/pnv2/users`;\r\n\t\tthis.state = {\r\n\t\t\tactivePage: \"contacts\",\r\n\t\t\tapi: new _api_js__WEBPACK_IMPORTED_MODULE_6__[\"Api\"](this.url)\r\n\t\t};\r\n\r\n\t\tthis.pages = {\r\n\t\t\tcontacts: new _contacts_js__WEBPACK_IMPORTED_MODULE_0__[\"ContactsPage\"](this.state), // тут передали ссылку на this.state\r\n\t\t\tadduser: new _addUser_js__WEBPACK_IMPORTED_MODULE_1__[\"AddUser\"](this.state),\r\n\t\t\tkeypad: new _keypad_js__WEBPACK_IMPORTED_MODULE_2__[\"KeypadPage\"](this.state),\r\n\t\t\teditcontact: new _editContact_js__WEBPACK_IMPORTED_MODULE_3__[\"EditContact\"](this.state),\r\n\t\t\tuser: new _user_js__WEBPACK_IMPORTED_MODULE_4__[\"User\"](this.state),\r\n\t\t\trouter: new _router_js__WEBPACK_IMPORTED_MODULE_5__[\"Router\"](this.state)\r\n\t\t};\r\n\r\n\t\tthis.pages.router.initializeRouter();\r\n\t\tthis.pages.router.definePage(this.render.bind(this));\r\n\t\tthis.appDOMNode = document.getElementById(\"app\"); // сюда будем делать рендер всех страниц\r\n\t\t// и это не будет затрагивать футер и его события\r\n\r\n\t\twindow.addEventListener(\"popstate\", event => {\r\n\t\t\tthis.updateView(event.state);\r\n\t\t});\r\n\t}\r\n\r\n\trender() {\r\n\t\tconst { activePage } = this.state;\r\n\r\n\t\tif (activePage == \"contacts\") {\r\n\t\t\tlet response = this.state.api.requestUsers(); //сюда вернулся промис\r\n\t\t\tresponse\r\n\t\t\t\t.then(data => {\r\n\t\t\t\t\tthis.state.people = data;\r\n\t\t\t\t\tthis.completeRender(activePage);\r\n\t\t\t\t})\r\n\t\t\t\t.catch(error => console.log(\"error\", error));\r\n\t\t} else {\r\n\t\t\tthis.completeRender(activePage);\r\n\t\t}\r\n\t}\r\n\r\n\tcompleteRender(activePage) {\r\n\t\tconst forHistory = this.pages[activePage].render();\r\n\t\tthis.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку,\r\n\t\t// которая сейчас указана как activePage в this.state\r\n\t\tthis.pages[activePage].setHandlers(); //и навесь обработчики событий\r\n\t\twindow.history.pushState(forHistory, activePage, activePage); // добавляем в историю ссылку, которая будет наверху\r\n\t}\r\n\r\n\tupdateView(content) {\r\n\t\tthis.appDOMNode.innerHTML = content;\r\n\t}\r\n\r\n\tstatic initialize() {\r\n\t\treturn new App().render();\r\n\t}\r\n}\r\n\r\nApp.initialize();\r\n\n\n//# sourceURL=webpack:///./js/app.js?"); +eval("\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*ДЗ\r\n Cделать phone-book\r\n у которого будет:\r\n 1) Вы заполните пользователей на сервер по адресу с вашими инициалами. +\r\n 2) При загрузке приложения, вы получите пользователей с сервера\t\t\t+\r\n 3) В приложении будет js - роутер, (при смене страницы перезагрузки не будет)\t+\r\n 4) При нажатии на пользователя будет открываться данный пользователь\t+\r\n 5) Будет возможность добавить пользователя на сервере заполнив данные в форме (add-contact)\t+\r\n ---------------- ~90 балов\r\n Для тех кто хочет +500$ к зарплате на старте\r\n 6) Добавить удаление пользователей (2) +\r\n 7) Должна быть модульная структура и Проект должен собираться при помощи webpack(2) (!)\r\n 8) Проект должен транспайлится через babel последние 2 версии браузеров (2) (!)\r\n 9) и после публикации на gh-pages, должен быть минифицирован(2)\r\n 10) добавьте еще одну первую страницу на которой будет \"auth\" +\r\n в этот инпут можно ввести инициалы easycode студента (2)\r\n в зависимости от этого будут загружаться разные пользователи\r\n */\n\n\nvar _contacts = __webpack_require__(/*! ./contacts.js */ \"./js/contacts.js\");\n\nvar _addUser = __webpack_require__(/*! ./addUser.js */ \"./js/addUser.js\");\n\nvar _keypad = __webpack_require__(/*! ./keypad.js */ \"./js/keypad.js\");\n\nvar _editContact = __webpack_require__(/*! ./editContact.js */ \"./js/editContact.js\");\n\nvar _user = __webpack_require__(/*! ./user.js */ \"./js/user.js\");\n\nvar _router = __webpack_require__(/*! ./router.js */ \"./js/router.js\");\n\nvar _api = __webpack_require__(/*! ./api.js */ \"./js/api.js\");\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar App = function () {\n\tfunction App() {\n\t\tvar _this = this;\n\n\t\t_classCallCheck(this, App);\n\n\t\t//this.url = `https://easycode-js.herokuapp.com/pnv2/users`;\n\t\tthis.state = {\n\t\t\tactivePage: \"contacts\"\n\t\t\t//api: new Api(this.url)\n\t\t};\n\n\t\tthis.pages = {\n\t\t\tcontacts: new _contacts.ContactsPage(this.state), // тут передали ссылку на this.state\n\t\t\tadduser: new _addUser.AddUser(this.state),\n\t\t\tkeypad: new _keypad.KeypadPage(this.state),\n\t\t\teditcontact: new _editContact.EditContact(this.state),\n\t\t\tuser: new _user.User(this.state),\n\t\t\trouter: new _router.Router(this.state)\n\t\t};\n\n\t\tthis.pages.router.initializeRouter();\n\t\tthis.pages.router.definePage(this.render.bind(this));\n\t\tthis.appDOMNode = document.getElementById(\"app\"); // сюда будем делать рендер всех страниц\n\t\t// и это не будет затрагивать футер и его события\n\n\t\twindow.addEventListener(\"popstate\", function (event) {\n\t\t\t_this.updateView(event.state);\n\t\t});\n\t}\n\n\t_createClass(App, [{\n\t\tkey: \"preRender\",\n\t\tvalue: function preRender() {\n\t\t\tvar db = prompt(\"Enter your database, please\", \"\");\n\n\t\t\tif (db == null) {\n\t\t\t\tdb = \"pnv2\";\n\t\t\t}\n\n\t\t\tthis.url = \"https://easycode-js.herokuapp.com/\" + db + \"/users\";\n\t\t\tthis.state.api = new _api.Api(this.url);\n\n\t\t\tthis.render();\n\t\t}\n\t}, {\n\t\tkey: \"render\",\n\t\tvalue: function render() {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar activePage = this.state.activePage;\n\n\n\t\t\tif (activePage == \"contacts\") {\n\t\t\t\tvar response = this.state.api.requestUsers(); //сюда вернулся промис\n\t\t\t\tresponse.then(function (data) {\n\t\t\t\t\t_this2.state.people = data;\n\t\t\t\t\t_this2.completeRender(activePage);\n\t\t\t\t\t_this2.state.formattedPeople = _this2.formatArrayWithPeople(_this2.state.people);\n\t\t\t\t\tconsole.log(_this2.state.formattedPeople);\n\t\t\t\t}).catch(function (error) {\n\t\t\t\t\treturn console.log(\"error\", error);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.completeRender(activePage);\n\t\t\t}\n\t\t}\n\t}, {\n\t\tkey: \"completeRender\",\n\t\tvalue: function completeRender(activePage) {\n\t\t\tvar forHistory = this.pages[activePage].render();\n\t\t\tthis.appDOMNode.innerHTML = forHistory; // и отрендерь ту страничку,\n\t\t\t// которая сейчас указана как activePage в this.state\n\t\t\tthis.pages[activePage].setHandlers(); //и навесь обработчики событий\n\t\t\twindow.history.pushState(forHistory, activePage, activePage); // добавляем в историю ссылку, которая будет наверху\n\t\t}\n\t}, {\n\t\tkey: \"updateView\",\n\t\tvalue: function updateView(content) {\n\t\t\tthis.appDOMNode.innerHTML = content;\n\t\t}\n\t}, {\n\t\tkey: \"formatArrayWithPeople\",\n\t\tvalue: function formatArrayWithPeople(arr) {\n\t\t\tvar formattedPeople = arr.map(function (item) {\n\t\t\t\tvar name = item.fullName.split(\" \")[0];\n\t\t\t\tvar lastName = item.fullName.split(\" \")[1];\n\n\t\t\t\tvar copy = function copy(obj) {\n\t\t\t\t\tvar newObj = Object.assign({}, obj, _extends({}, obj, {\n\t\t\t\t\t\tname: name,\n\t\t\t\t\t\tlastName: lastName\n\t\t\t\t\t}));\n\t\t\t\t\treturn newObj;\n\t\t\t\t};\n\t\t\t\treturn copy(item);\n\t\t\t});\n\t\t\treturn formattedPeople;\n\t\t}\n\t}], [{\n\t\tkey: \"initialize\",\n\t\tvalue: function initialize() {\n\t\t\treturn new App().preRender();\n\t\t}\n\t}]);\n\n\treturn App;\n}();\n\nApp.initialize();\n\n//# sourceURL=webpack:///./js/app.js?"); /***/ }), @@ -126,11 +126,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _con /*!************************!*\ !*** ./js/contacts.js ***! \************************/ -/*! exports provided: ContactsPage */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"ContactsPage\", function() { return ContactsPage; });\n//index.html/contacts.html - в поле search при вводе буквы, +\r\n//добавить поиск по имени если имя включает хотя бы одну эту букву. +\r\n//после ввода каждого символа, фильтровать отображаемых пользователей. +\r\n//При удалении всех символов отобразить снова весь список +\r\n\r\n\r\n\r\nclass ContactsPage {\r\n constructor(globalState) {\r\n this.state = globalState;\r\n\r\n this.title = \"Contacts\";\r\n this.tableCaptions = [\"Name\", \"Last name\", \"Email\"];\r\n }\r\n\r\n reRenderTable(arr) {\r\n // сделать, чтобы это был один метод рендера и лежал он в app.js\r\n let tableBody = this.createTableBodyRow(arr);\r\n\r\n let pattern = `\r\n ${tableBody}\r\n `;\r\n\r\n let parent = document.querySelector(\"table\");\r\n let shouldBeReplaced = document.querySelector(\"tbody\");\r\n parent.removeChild(shouldBeReplaced);\r\n\r\n parent.insertAdjacentHTML(\"beforeEnd\", pattern);\r\n }\r\n\r\n createTableHeadRow(arr) {\r\n let items = arr\r\n .map(item => {\r\n return `${item}`;\r\n })\r\n .join(\"\");\r\n\r\n return `\r\n ${items}\r\n `;\r\n }\r\n\r\n createTableBodyRow(arr) {\r\n if (!arr) {\r\n arr = this.state.people;\r\n }\r\n\r\n return arr\r\n .map(item => {\r\n const [name, surname] = item.fullName.split(\" \");\r\n\r\n return `\r\n ${name}\r\n ${surname}\r\n ${item.email}\r\n `;\r\n })\r\n .join(\"\");\r\n }\r\n\r\n sortColumnsHandler() {\r\n let parent = document.querySelector(\"thead\");\r\n parent.addEventListener(\"click\", this.sortColumns.bind(this));\r\n }\r\n\r\n sortColumns() {\r\n let target = event.target;\r\n\r\n this.tableCaptions.forEach(item => {\r\n if (target.textContent == item) {\r\n item = this.makeCamelCase(item);\r\n\r\n let index;\r\n\r\n if (item == \"name\") {\r\n item = \"fullName\";\r\n index = 0;\r\n }\r\n if (item == \"lastName\") {\r\n item = \"fullName\";\r\n index = 1;\r\n }\r\n\r\n let sorted = this.sortUsers(item, index);\r\n console.log(sorted);\r\n this.reRenderTable(sorted);\r\n }\r\n });\r\n }\r\n\r\n sortUsers(str, index) {\r\n function compare(a, b) {\r\n if (isNaN(a[str]) && index) {\r\n if (a[str].split(\" \")[index] > b[str].split(\" \")[index]) {\r\n return 1;\r\n }\r\n if (a[str].split(\" \")[index] < b[str].split(\" \")[index]) {\r\n return -1;\r\n }\r\n if (a[str].split(\" \")[index] == b[str].split(\" \")[index]) {\r\n return 0;\r\n }\r\n } else if (isNaN(a[str]) && !index) {\r\n if (a[str] > b[str]) {\r\n return 1;\r\n }\r\n if (a[str] < b[str]) {\r\n return -1;\r\n }\r\n if (a[str] == b[str]) {\r\n return 0;\r\n }\r\n } else {\r\n return a[str] - b[str];\r\n }\r\n }\r\n //console.log(this.state.people.sort(compare))\r\n return this.state.people.sort(compare);\r\n }\r\n\r\n makeCamelCase(str) {\r\n str = str.toLowerCase();\r\n\r\n if (str.includes(\" \")) {\r\n //'last name'\r\n let arr = str.split(\" \"); //['last', 'name']\r\n\r\n let capitalizedArr = arr.map((item, i) => {\r\n if (i > 0) {\r\n let itemToArray = item.split(\"\"); //['n', 'a', 'm', 'e']\r\n let firstLetter = itemToArray[0].toUpperCase();\r\n itemToArray.splice(0, 1, firstLetter);\r\n return itemToArray.join(\"\");\r\n }\r\n return item;\r\n }); // end of map\r\n\r\n str = capitalizedArr.join(\"\");\r\n }\r\n\r\n return str;\r\n }\r\n\r\n searchUserHandler() {\r\n this.searchField = document.querySelector(\"#search\");\r\n this.searchField.addEventListener(\"input\", this.filterUser.bind(this));\r\n }\r\n\r\n filterUser() {\r\n let value = this.searchField.value.toLowerCase();\r\n\r\n let filteredUsers = this.state.people.filter(item => {\r\n let name = item.fullName.split(\" \")[0];\r\n\r\n if (name.toLowerCase().includes(value)) {\r\n return item;\r\n }\r\n\r\n return;\r\n });\r\n //console.log(filteredUsers);\r\n\r\n this.reRenderTable(filteredUsers);\r\n }\r\n\r\n selectUserHandler() {\r\n let parent = document.querySelector(\"tbody\");\r\n parent.addEventListener(\"click\", this.selectUser.bind(this));\r\n }\r\n\r\n selectUser(e) {\r\n let target = e && e.target;\r\n\r\n if (target.tagName === \"TD\") {\r\n let row = target.closest(\"tr\");\r\n let id = row.dataset.id;\r\n this.state.people.forEach(item => {\r\n if (item._id == id) {\r\n this.state.selectedUser = item;\r\n }\r\n });\r\n console.log(this.state.selectedUser);\r\n }\r\n }\r\n\r\n setHandlers() {\r\n this.sortColumnsHandler();\r\n this.searchUserHandler();\r\n this.selectUserHandler();\r\n }\r\n\r\n render(users) {\r\n return `\r\n
      \r\n
      \r\n

      ${this.title}

      \r\n
      \r\n
      \r\n\r\n
      \r\n
      \r\n
      \r\n
      \r\n \r\n \r\n
      \r\n
      \r\n\r\n \r\n \r\n ${this.createTableHeadRow(this.tableCaptions)}\r\n \r\n \r\n ${this.createTableBodyRow(users)}\r\n \r\n
      \r\n\r\n
      \r\n
      `;\r\n }\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/contacts.js?"); +eval("//index.html/contacts.html - в поле search при вводе буквы, +\n//добавить поиск по имени если имя включает хотя бы одну эту букву. +\n//после ввода каждого символа, фильтровать отображаемых пользователей. +\n//При удалении всех символов отобразить снова весь список +\n\n//this.state.formattedPeople == array with splitted fullName property\n\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar ContactsPage = function () {\n function ContactsPage(globalState) {\n _classCallCheck(this, ContactsPage);\n\n this.state = globalState;\n\n this.title = \"Contacts\";\n this.tableCaptions = [\"Name\", \"Last name\", \"Email\"];\n }\n\n _createClass(ContactsPage, [{\n key: \"reRenderTable\",\n value: function reRenderTable(arr) {\n // сделать, чтобы это был один метод рендера и лежал он в app.js\n var tableBody = this.createTableBodyRow(arr);\n\n var pattern = \"\\n \" + tableBody + \"\\n \";\n\n var parent = document.querySelector(\"table\");\n var shouldBeReplaced = document.querySelector(\"tbody\");\n parent.removeChild(shouldBeReplaced);\n\n parent.insertAdjacentHTML(\"beforeEnd\", pattern);\n }\n }, {\n key: \"createTableHeadRow\",\n value: function createTableHeadRow(arr) {\n var items = arr.map(function (item) {\n return \"\" + item + \"\";\n }).join(\"\");\n\n return \"\\n \" + items + \"\\n \";\n }\n }, {\n key: \"createTableBodyRow\",\n value: function createTableBodyRow(arr) {\n if (!arr) {\n arr = this.state.people;\n }\n\n return arr.map(function (item) {\n var _item$fullName$split = item.fullName.split(\" \"),\n _item$fullName$split2 = _slicedToArray(_item$fullName$split, 2),\n name = _item$fullName$split2[0],\n surname = _item$fullName$split2[1];\n\n return \"\\n \" + name + \"\\n \" + surname + \"\\n \" + item.email + \"\\n \";\n }).join(\"\");\n }\n }, {\n key: \"sortColumnsHandler\",\n value: function sortColumnsHandler() {\n var parent = document.querySelector(\"thead\");\n parent.addEventListener(\"click\", this.sortColumns.bind(this));\n }\n }, {\n key: \"sortColumns\",\n value: function sortColumns() {\n var _this = this;\n\n var target = event.target;\n\n this.tableCaptions.forEach(function (item) {\n if (target.textContent == item) {\n item = _this.makeCamelCase(item);\n\n var sorted = _this.sortUsers(item);\n //console.log(sorted);\n _this.reRenderTable(sorted);\n }\n });\n }\n }, {\n key: \"sortUsers\",\n value: function sortUsers(str) {\n function compare(a, b) {\n if (isNaN(a[str])) {\n if (a[str] > b[str]) {\n return 1;\n }\n if (a[str] < b[str]) {\n return -1;\n }\n if (a[str] == b[str]) {\n return 0;\n }\n } else {\n return a[str] - b[str];\n }\n }\n\n return this.state.formattedPeople.sort(compare);\n }\n }, {\n key: \"makeCamelCase\",\n value: function makeCamelCase(str) {\n str = str.toLowerCase();\n\n if (str.includes(\" \")) {\n //'last name'\n var arr = str.split(\" \"); //['last', 'name']\n\n var capitalizedArr = arr.map(function (item, i) {\n if (i > 0) {\n var itemToArray = item.split(\"\"); //['n', 'a', 'm', 'e']\n var firstLetter = itemToArray[0].toUpperCase();\n itemToArray.splice(0, 1, firstLetter);\n return itemToArray.join(\"\");\n }\n return item;\n }); // end of map\n\n str = capitalizedArr.join(\"\");\n }\n\n return str;\n }\n }, {\n key: \"searchUserHandler\",\n value: function searchUserHandler() {\n this.searchField = document.querySelector(\"#search\");\n this.searchField.addEventListener(\"input\", this.filterUser.bind(this));\n }\n }, {\n key: \"filterUser\",\n value: function filterUser() {\n var value = this.searchField.value.toLowerCase();\n\n var filteredUsers = this.state.formattedPeople.filter(function (item) {\n //let name = item.fullName.split(\" \")[0];\n if (item.name.toLowerCase().includes(value)) {\n return item;\n }\n\n return;\n });\n //console.log(filteredUsers);\n\n this.reRenderTable(filteredUsers);\n }\n }, {\n key: \"selectUserHandler\",\n value: function selectUserHandler() {\n var parent = document.querySelector(\"tbody\");\n parent.addEventListener(\"click\", this.selectUser.bind(this));\n }\n }, {\n key: \"selectUser\",\n value: function selectUser(e) {\n var _this2 = this;\n\n var target = e && e.target;\n\n if (target.tagName === \"TD\") {\n var row = target.closest(\"tr\");\n var id = row.dataset.id;\n this.state.people.forEach(function (item) {\n if (item._id == id) {\n _this2.state.selectedUser = item;\n }\n });\n console.log(this.state.selectedUser);\n }\n }\n }, {\n key: \"setHandlers\",\n value: function setHandlers() {\n this.sortColumnsHandler();\n this.searchUserHandler();\n this.selectUserHandler();\n }\n }, {\n key: \"render\",\n value: function render(users) {\n return \"\\n
      \\n
      \\n

      \" + this.title + \"

      \\n
      \\n
      \\n\\n
      \\n
      \\n
      \\n
      \\n \\n \\n
      \\n
      \\n\\n \\n \\n \" + this.createTableHeadRow(this.tableCaptions) + \"\\n \\n \\n \" + this.createTableBodyRow(users) + \"\\n \\n
      \\n\\n
      \\n
      \";\n }\n }]);\n\n return ContactsPage;\n}();\n\nexports.ContactsPage = ContactsPage;\n\n//# sourceURL=webpack:///./js/contacts.js?"); /***/ }), @@ -138,11 +138,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!***************************!*\ !*** ./js/editContact.js ***! \***************************/ -/*! exports provided: EditContact */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"EditContact\", function() { return EditContact; });\n//edit-contact,\r\n//- сделать данные редактируемыми (атрибут contentEditable) // input +\r\n//- изменять backgroundColor\t\t\t\t\t\t\t\t\t\t+\r\n\r\nclass EditContact {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\tbuttonsHandler() {\r\n\t\tlet buttonsParent = document.querySelector(\"main\");\r\n\t\tbuttonsParent.addEventListener(\"click\", this.clickHandler.bind(this));\r\n\t}\r\n\r\n\tclickHandler(e) {\r\n\t\tlet target = e && e.target;\r\n\t\tif (!target) return;\r\n\r\n\t\tif (target.tagName === \"INPUT\") {\r\n\t\t\ttarget.classList.add(\"active-input\");\r\n\t\t}\r\n\r\n\t\ttarget.addEventListener(\"blur\", () => {\r\n\t\t\ttarget.classList.remove(\"active-input\");\r\n\t\t});\r\n\t}\r\n\r\n\trenderInfo(options) {\r\n\t\tlet { placeholder, value, name } = options;\r\n\r\n\t\treturn `
      \r\n\t\t\t\t\r\n\t\t\t
      `;\r\n\t}\r\n\r\n\teditUser() {\r\n\t\tif (!this.state.selectedUser) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst { name, lastName, email, phone } = this.form.elements;\r\n\r\n\t\tlet fullName = `${name.value} ${lastName.value}`;\r\n\r\n\t\tthis.state.api.patchUser(\r\n\t\t\t[fullName, email.value, phone.value],\r\n\t\t\tthis.state.selectedUser._id\r\n\t\t);\r\n\t\tthis.state.selectedUser = null;\r\n\t}\r\n\r\n\tdeleteUser() {\r\n\t\tif (!this.state.selectedUser) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tthis.state.api.deleteUser(this.state.selectedUser._id);\r\n\t\tthis.state.selectedUser = null;\r\n\t\tthis.clearFields();\r\n\t}\r\n\r\n\tclearFields() {\r\n\t\tlet myFormElements = this.form.elements;\r\n\r\n\t\t[...myFormElements].forEach(item => {\r\n\t\t\tif (item.tagName === \"INPUT\") {\r\n\t\t\t\titem.value = \"\";\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tsetHandlers() {\r\n\t\tthis.buttonsHandler();\r\n\r\n\t\tthis.doneButton = document.querySelector(\".done-btn\");\r\n\t\tthis.deleteButton = document.querySelector(\".delete-contact\");\r\n\t\tthis.form = document.forms[0];\r\n\t\tthis.form.addEventListener(\"submit\", event => {\r\n\t\t\tevent.preventDefault();\r\n\t\t});\r\n\t\tthis.doneButton.addEventListener(\"click\", this.editUser.bind(this));\r\n\t\tthis.deleteButton.addEventListener(\"click\", this.deleteUser.bind(this));\r\n\t}\r\n\r\n\trender() {\r\n\t\tlet firstName = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.fullName.split(\" \")[0]\r\n\t\t\t: \"\";\r\n\t\tlet lastName = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.fullName.split(\" \")[1]\r\n\t\t\t: \"\";\r\n\t\tlet email = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.email\r\n\t\t\t: \"\";\r\n\t\tlet mobilePhone = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.phone\r\n\t\t\t: \"\";\r\n\r\n\t\treturn `
      \r\n\t\t\t
      \r\n\t\t\t\t\r\n\t\t\t
      \r\n\t\t
      \r\n\r\n\t\t
      \r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \"#\"
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.fullName\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"First Name\",\r\n\t\t\t\t\t\t\t\tvalue: `${firstName}`,\r\n\t\t\t\t\t\t\t\tname: \"name\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.fullName\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"Last Name\",\r\n\t\t\t\t\t\t\t\tvalue: `${lastName}`,\r\n\t\t\t\t\t\t\t\tname: \"lastName\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.company\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"Company\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"company\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.homePhone\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add home phone\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"homePhone\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.email\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add email\",\r\n\t\t\t\t\t\t\t\tvalue: `${email}`,\r\n\t\t\t\t\t\t\t\tname: \"email\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.address\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add address\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"address\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.birthday\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add birthday\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"birthday\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({\r\n\t\t\t\t\t\t\t\tplaceholder:\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser &&\r\n\t\t\t\t\t\t\t\t\tthis.state.selectedUser.profile\r\n\t\t\t\t\t\t\t\t\t\t? \"\"\r\n\t\t\t\t\t\t\t\t\t\t: \"add social profile\",\r\n\t\t\t\t\t\t\t\tvalue: ``,\r\n\t\t\t\t\t\t\t\tname: \"profile\"\r\n\t\t\t\t\t\t\t})}\r\n\t\t\t\t\t\t\t${this.renderInfo({ placeholder: \"add field\", value: ``, name: \"add\" })}\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t
      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \t\r\n\t\t
      `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/editContact.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n//edit-contact,\n//- сделать данные редактируемыми (атрибут contentEditable) // input +\n//- изменять backgroundColor\t\t\t\t\t\t\t\t\t\t+\n//import {Api} from './api.js';\n\nvar EditContact = function () {\n\tfunction EditContact(globalState) {\n\t\t_classCallCheck(this, EditContact);\n\n\t\tthis.state = globalState;\n\t\t//this.api = new Api(this.state.url);\n\t}\n\n\t_createClass(EditContact, [{\n\t\tkey: \"buttonsHandler\",\n\t\tvalue: function buttonsHandler() {\n\t\t\tvar buttonsParent = document.querySelector(\"main\");\n\t\t\tbuttonsParent.addEventListener(\"click\", this.clickHandler.bind(this));\n\t\t}\n\t}, {\n\t\tkey: \"clickHandler\",\n\t\tvalue: function clickHandler(e) {\n\t\t\tvar target = e && e.target;\n\t\t\tif (!target) return;\n\n\t\t\tif (target.tagName === \"INPUT\") {\n\t\t\t\ttarget.classList.add(\"active-input\");\n\t\t\t}\n\n\t\t\ttarget.addEventListener(\"blur\", function () {\n\t\t\t\ttarget.classList.remove(\"active-input\");\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: \"renderInfo\",\n\t\tvalue: function renderInfo(options) {\n\t\t\tvar placeholder = options.placeholder,\n\t\t\t value = options.value,\n\t\t\t name = options.name;\n\n\n\t\t\treturn \"
      \\n\\t\\t\\t\\t\\n\\t\\t\\t
      \";\n\t\t}\n\t}, {\n\t\tkey: \"editUser\",\n\t\tvalue: function editUser() {\n\t\t\tif (!this.state.selectedUser) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar _form$elements = this.form.elements,\n\t\t\t name = _form$elements.name,\n\t\t\t lastName = _form$elements.lastName,\n\t\t\t email = _form$elements.email,\n\t\t\t phone = _form$elements.phone;\n\n\n\t\t\tvar fullName = name.value + \" \" + lastName.value;\n\n\t\t\tthis.state.api.patchUser([fullName, email.value, phone.value], this.state.selectedUser._id);\n\t\t\tthis.state.selectedUser = null;\n\t\t}\n\t}, {\n\t\tkey: \"deleteUser\",\n\t\tvalue: function deleteUser() {\n\t\t\tif (!this.state.selectedUser) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.state.api.deleteUser(this.state.selectedUser._id);\n\t\t\tthis.state.selectedUser = null;\n\t\t\tthis.clearFields();\n\t\t}\n\t}, {\n\t\tkey: \"clearFields\",\n\t\tvalue: function clearFields() {\n\t\t\tvar myFormElements = this.form.elements;\n\n\t\t\t[].concat(_toConsumableArray(myFormElements)).forEach(function (item) {\n\t\t\t\tif (item.tagName === \"INPUT\") {\n\t\t\t\t\titem.value = \"\";\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: \"setHandlers\",\n\t\tvalue: function setHandlers() {\n\t\t\tthis.buttonsHandler();\n\n\t\t\tthis.doneButton = document.querySelector(\".done-btn\");\n\t\t\tthis.deleteButton = document.querySelector(\".delete-contact\");\n\t\t\t//this.cancelButton = document.getElementById(\"cancel\");\n\t\t\tthis.form = document.forms[0];\n\t\t\tthis.form.addEventListener(\"submit\", function (event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t});\n\t\t\tthis.doneButton.addEventListener(\"click\", this.editUser.bind(this));\n\t\t\tthis.deleteButton.addEventListener(\"click\", this.deleteUser.bind(this));\n\t\t\t//this.cancelButton.addEventListener(\"click\", (e) => { //не срабатывают табы\n\t\t\t//\te.preventDefault();\n\t\t\t//\twindow.history.back();\n\t\t\t//});\n\t\t}\n\t}, {\n\t\tkey: \"render\",\n\t\tvalue: function render() {\n\t\t\tvar firstName = this.state.selectedUser ? this.state.selectedUser.fullName.split(\" \")[0] : \"\";\n\t\t\tvar lastName = this.state.selectedUser ? this.state.selectedUser.fullName.split(\" \")[1] : \"\";\n\t\t\tvar email = this.state.selectedUser ? this.state.selectedUser.email : \"\";\n\t\t\tvar mobilePhone = this.state.selectedUser ? this.state.selectedUser.phone : \"\";\n\n\t\t\treturn \"
      \\n\\t\\t\\t
      \\n\\t\\t\\t\\t\\n\\t\\t\\t
      \\n\\t\\t
      \\n\\n\\t\\t
      \\n\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\\"#\\\"
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.fullName ? \"\" : \"First Name\",\n\t\t\t\tvalue: \"\" + firstName,\n\t\t\t\tname: \"name\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.fullName ? \"\" : \"Last Name\",\n\t\t\t\tvalue: \"\" + lastName,\n\t\t\t\tname: \"lastName\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.company ? \"\" : \"Company\",\n\t\t\t\tvalue: \"\",\n\t\t\t\tname: \"company\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.homePhone ? \"\" : \"add home phone\",\n\t\t\t\tvalue: \"\",\n\t\t\t\tname: \"homePhone\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.email ? \"\" : \"add email\",\n\t\t\t\tvalue: \"\" + email,\n\t\t\t\tname: \"email\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.address ? \"\" : \"add address\",\n\t\t\t\tvalue: \"\",\n\t\t\t\tname: \"address\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.birthday ? \"\" : \"add birthday\",\n\t\t\t\tvalue: \"\",\n\t\t\t\tname: \"birthday\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({\n\t\t\t\tplaceholder: this.state.selectedUser && this.state.selectedUser.profile ? \"\" : \"add social profile\",\n\t\t\t\tvalue: \"\",\n\t\t\t\tname: \"profile\"\n\t\t\t}) + \"\\n\\t\\t\\t\\t\\t\\t\\t\" + this.renderInfo({ placeholder: \"add field\", value: \"\", name: \"add\" }) + \"\\n\\t\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t
      \\t\\n\\t\\t
      \";\n\t\t}\n\t}]);\n\n\treturn EditContact;\n}();\n\nexports.EditContact = EditContact;\n\n//# sourceURL=webpack:///./js/editContact.js?"); /***/ }), @@ -150,11 +150,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!**********************!*\ !*** ./js/keypad.js ***! \**********************/ -/*! exports provided: KeypadPage */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"KeypadPage\", function() { return KeypadPage; });\n//Нужно визуализировать keypad.html - keypad.js\r\n\r\n//Структура виртуализации:\r\n// ------ Это 2 разных класса KeypadPage, ContactsPage -----\r\n\r\n//innerHTML по максимуму\r\n//https://aleksandra-maslennikova.github.io/telephone-book/keypad.html\r\n\r\n//Сделайте чтобы при нажатии на кнопку цифра отобразилась +\r\n//в \r\n\r\n//https://aleksandra-maslennikova.github.io/telephone-book/index.html\r\n//По клику по заголовку таблицы,\r\n//таблица сортировалась по соответствующему свойству +\r\n\r\n//добавить функционал для удаления номера +\r\n//1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) +\r\n//2. Формат номера должен быть таким (099)-17-38-170 -\r\n\r\nclass KeypadPage {\r\n constructor(globalState) {\r\n this.state = globalState; //стал равен this.state-у со страницы App.js\r\n this.title = \"Keypad\";\r\n }\r\n\r\n buttonsHandler() {\r\n let buttonsParent = document.querySelector(\"main\"); // please you const keyword instead of let\r\n let placeToInsertNumbers = document.querySelector(\".numbers\");\r\n\r\n buttonsParent.addEventListener(\r\n \"click\",\r\n this.clickHandler.bind(this, placeToInsertNumbers)\r\n );\r\n window.addEventListener(\r\n //are ever remove such listener?\r\n // for example when-even you changing a page\r\n \"keypress\",\r\n this.keyHandler.bind(this, placeToInsertNumbers)\r\n );\r\n }\r\n\r\n keyHandler(display, e) {\r\n let pattern = /[0-9]/; //дописать регвыражение для #*-()\r\n if (e.ctrlKey || e.altKey || e.metaKey) return;\r\n var code = e.key;\r\n\r\n if (code == null) return;\r\n\r\n if (pattern.test(code)) {\r\n display.innerHTML += code;\r\n }\r\n return;\r\n }\r\n\r\n clickHandler(display, e) {\r\n let target = e.target;\r\n if (!target) return;\r\n\r\n if (target.classList.contains(\"key\")) {\r\n display.innerHTML += target.textContent;\r\n }\r\n\r\n if (target.classList.contains(\"glyphicon-circle-arrow-left\")) {\r\n let insertedNumbersArr = display.innerHTML.split(\"\");\r\n if (insertedNumbersArr.length > 0) {\r\n let numberWithoutLast = insertedNumbersArr.slice(0, -1).join(\"\");\r\n display.innerHTML = numberWithoutLast;\r\n }\r\n }\r\n }\r\n\r\n setHandlers() {\r\n this.buttonsHandler();\r\n }\r\n\r\n render() {\r\n return `
      \r\n
      \r\n

      ${this.title}

      \r\n
      \r\n
      \r\n\r\n
      \r\n
      \r\n
      \r\n \r\n \r\n \r\n
      \r\n
      \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
      \r\n
      \r\n
      `;\r\n }\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/keypad.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n//Нужно визуализировать keypad.html - keypad.js\n\n//Структура виртуализации:\n// ------ Это 2 разных класса KeypadPage, ContactsPage -----\n\n//innerHTML по максимуму\n//https://aleksandra-maslennikova.github.io/telephone-book/keypad.html\n\n//Сделайте чтобы при нажатии на кнопку цифра отобразилась +\n//в \n\n//https://aleksandra-maslennikova.github.io/telephone-book/index.html\n//По клику по заголовку таблицы,\n//таблица сортировалась по соответствующему свойству +\n\n//добавить функционал для удаления номера +\n//1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) +\n//2. Формат номера должен быть таким (099)-17-38-170 +\n\nvar KeypadPage = function () {\n function KeypadPage(globalState) {\n _classCallCheck(this, KeypadPage);\n\n this.state = globalState; //стал равен this.state-у со страницы App.js\n this.title = \"Keypad\";\n }\n\n _createClass(KeypadPage, [{\n key: \"buttonsHandler\",\n value: function buttonsHandler() {\n var buttonsParent = document.querySelector(\"main\");\n var placeToInsertNumbers = document.querySelector(\".numbers\");\n\n buttonsParent.addEventListener(\"click\", this.clickHandler.bind(this, placeToInsertNumbers));\n window.addEventListener(\n //are ever remove such listener?\n // for example when-even you changing a page\n \"keypress\", this.keyHandler.bind(this, placeToInsertNumbers));\n }\n }, {\n key: \"keyHandler\",\n value: function keyHandler(display, e) {\n var pattern = /[0-9]/; //дописать регвыражение для #*-()\n if (e.ctrlKey || e.altKey || e.metaKey) return;\n var code = e.key;\n\n if (code == null) return;\n\n if (pattern.test(code)) {\n display.innerHTML += code;\n this.formatNumber(display.innerHTML, display);\n }\n return;\n }\n }, {\n key: \"clickHandler\",\n value: function clickHandler(display, e) {\n var target = e.target;\n if (!target) return;\n\n if (target.classList.contains(\"key\")) {\n display.innerHTML += target.textContent;\n this.formatNumber(display.innerHTML, display);\n }\n\n if (target.classList.contains(\"glyphicon-circle-arrow-left\")) {\n var insertedNumbersArr = display.innerHTML.split(\"\");\n if (insertedNumbersArr.length > 0) {\n var numberWithoutLast = insertedNumbersArr.slice(0, -1).join(\"\");\n display.innerHTML = numberWithoutLast;\n }\n }\n }\n }, {\n key: \"formatNumber\",\n value: function formatNumber(str, display) {\n var willBeShown = '';\n if (str.length === 1 && str != '0') {\n alert('A number should be started with zero');\n };\n if (str.length === 1 && str == '0') {\n willBeShown = str.replace(str, '(' + str);\n };\n if (str.length === 2 || str.length === 3) {\n willBeShown = str;\n };\n if (str.length === 4) {\n willBeShown = str.replace(str, str + ')-');\n };\n if (str.length === 5 || str.length === 6 || str.length === 7) {\n willBeShown = str;\n };\n if (str.length === 8) {\n willBeShown = str.replace(str, str + '-');\n };\n if (str.length === 9 || str.length === 10) {\n willBeShown = str;\n };\n if (str.length === 11) {\n willBeShown = str.replace(str, str + '-');\n };\n if (str.length === 12 || str.length === 13) {\n willBeShown = str;\n };\n if (str.length === 14) {\n willBeShown = str;\n this.finishState = str;\n };\n if (str.length > 14) {\n alert('It is enough');\n willBeShown = this.finishState;\n };\n\n display.innerHTML = willBeShown;\n }\n }, {\n key: \"setHandlers\",\n value: function setHandlers() {\n this.buttonsHandler();\n }\n }, {\n key: \"render\",\n value: function render() {\n return \"
      \\n
      \\n

      \" + this.title + \"

      \\n
      \\n
      \\n\\n
      \\n
      \\n
      \\n \\n \\n \\n
      \\n
      \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n
      \\n
      \\n
      \";\n }\n }]);\n\n return KeypadPage;\n}();\n\nexports.KeypadPage = KeypadPage;\n\n//# sourceURL=webpack:///./js/keypad.js?"); /***/ }), @@ -162,11 +162,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!**********************!*\ !*** ./js/router.js ***! \**********************/ -/*! exports provided: Router */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"Router\", function() { return Router; });\nclass Router {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\tinitializeRouter() {\r\n\t\tconst mountNode = document.getElementById(\"mountNode\");\r\n\t\tmountNode.innerHTML = `\r\n
      \r\n
      \r\n
      \r\n \r\n
      \r\n
      `;\r\n\r\n\t\tthis.linksParent = document.querySelector(\".main-nav\");\r\n\t}\r\n\r\n\tdefinePage(callback) {\r\n\t\tthis.linksParent.addEventListener(\"click\", e => {\r\n\t\t\te.preventDefault();\r\n\r\n\t\t\tthis.tabState = {\r\n\t\t\t\tactiveTab: document.querySelector(\".active\"),\r\n\t\t\t};\r\n\r\n\t\t\tlet active = document.querySelector(\".active\");\r\n\r\n\t\t\tlet target = e && e.target && e.target.closest(\"a[data-attr]\");\r\n\r\n\t\t\tif (target.classList.contains(\"active\")) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (target.classList.contains(\"tab\")) {\r\n\t\t\t\t//let active = document.querySelector(\".active\"); //So, for example, you could the same solution as we did with a slider in class.\r\n\r\n\t\t\t\tthis.tabState.activeTab.classList.remove(\"active\");\r\n\t\t\t\ttarget.classList.add(\"active\");\r\n\t\t\t\tthis.tabState.activeTab = target;\r\n\r\n\t\t\t\tlet href = target.getAttribute(\"href\");\r\n\r\n\t\t\t\tthis.switchRouter(href, callback);\r\n\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t});\r\n\t}\r\n\r\n\tswitchRouter(href, callback) {\r\n\t\tthis.state.activePage = href;\r\n\t\tcallback(href);\r\n\t}\r\n\r\n\trenderLink(options) {\r\n\t\tlet { href, glyphicon, text, active } = options;\r\n\t\tlet activeClass = active ? \"active\" : \"\";\r\n\r\n\t\treturn `\r\n\t\t \r\n\t\t ${text} \r\n\t\t `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/router.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar Router = function () {\n\tfunction Router(globalState) {\n\t\t_classCallCheck(this, Router);\n\n\t\tthis.state = globalState;\n\t}\n\n\t_createClass(Router, [{\n\t\tkey: \"initializeRouter\",\n\t\tvalue: function initializeRouter() {\n\t\t\tvar mountNode = document.getElementById(\"mountNode\");\n\t\t\tmountNode.innerHTML = \"\\n
      \\n
      \\n
      \\n \\n
      \\n
      \";\n\n\t\t\tthis.linksParent = document.querySelector(\".main-nav\");\n\t\t}\n\t}, {\n\t\tkey: \"definePage\",\n\t\tvalue: function definePage(callback) {\n\t\t\tvar _this = this;\n\n\t\t\tthis.linksParent.addEventListener(\"click\", function (e) {\n\t\t\t\te.preventDefault();\n\n\t\t\t\t_this.tabState = {\n\t\t\t\t\tactiveTab: document.querySelector(\".active\")\n\t\t\t\t};\n\n\t\t\t\tvar active = document.querySelector(\".active\");\n\n\t\t\t\tvar target = e && e.target && e.target.closest(\"a[data-attr]\");\n\n\t\t\t\tif (target.classList.contains(\"active\")) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (target.classList.contains(\"tab\")) {\n\t\t\t\t\t//let active = document.querySelector(\".active\"); //So, for example, you could the same solution as we did with a slider in class.\n\n\t\t\t\t\t_this.tabState.activeTab.classList.remove(\"active\");\n\t\t\t\t\ttarget.classList.add(\"active\");\n\t\t\t\t\t_this.tabState.activeTab = target;\n\n\t\t\t\t\tvar href = target.getAttribute(\"href\");\n\n\t\t\t\t\t_this.switchRouter(href, callback);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t});\n\t\t}\n\t}, {\n\t\tkey: \"switchRouter\",\n\t\tvalue: function switchRouter(href, callback) {\n\t\t\tthis.state.activePage = href;\n\t\t\tcallback(href);\n\t\t}\n\t}, {\n\t\tkey: \"renderLink\",\n\t\tvalue: function renderLink(options) {\n\t\t\tvar href = options.href,\n\t\t\t glyphicon = options.glyphicon,\n\t\t\t text = options.text,\n\t\t\t active = options.active;\n\n\t\t\tvar activeClass = active ? \"active\" : \"\";\n\n\t\t\treturn \"\\n\\t\\t \\n\\t\\t \" + text + \" \\n\\t\\t \";\n\t\t}\n\t}]);\n\n\treturn Router;\n}();\n\nexports.Router = Router;\n\n//# sourceURL=webpack:///./js/router.js?"); /***/ }), @@ -174,11 +174,11 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /*!********************!*\ !*** ./js/user.js ***! \********************/ -/*! exports provided: User */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/*! no static exports found */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"User\", function() { return User; });\nclass User {\r\n\tconstructor(globalState) {\r\n\t\tthis.state = globalState;\r\n\t}\r\n\r\n\trenderOptions(options) {\r\n\t\tlet { glyphicon, text } = options;\r\n\r\n\t\treturn `
      \r\n\t\t\t\t
      \r\n\t\t\t\t${text}\r\n\t\t\t
      `;\r\n\t}\r\n\r\n\tsetHandlers() {\r\n\t\tconsole.log(this);\r\n\t}\r\n\r\n\trender() {\r\n\t\tlet userName = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.fullName\r\n\t\t\t: \"User Name\";\r\n\t\tlet mobileNumber = this.state.selectedUser\r\n\t\t\t? this.state.selectedUser.phone\r\n\t\t\t: \"\";\r\n\r\n\t\treturn `
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\tContacts\r\n\t\t\t\t\t\tEdit\r\n\t \t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      \r\n\r\n\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t\t\t\"#\"\r\n\t\t\t\t\t
      ${userName}
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"comment\", text: \"message\" })}\r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"earphone\", text: \"call\" })}\t\t\t\t\r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"facetime-video\", text: \"video\" })}\t\r\n\t\t\t\t\t\t${this.renderOptions({ glyphicon: \"envelope\", text: \"mail\" })}\r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      mobile number

      \r\n\t\t\t\t\t\t
      ${mobileNumber}
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t

      home number

      \r\n\t\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t
      \r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
      \r\n\t\t\t\t
      \r\n\t\t\t
      `;\r\n\t}\r\n}\r\n\r\n\n\n//# sourceURL=webpack:///./js/user.js?"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n\tvalue: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nvar User = function () {\n\tfunction User(globalState) {\n\t\t_classCallCheck(this, User);\n\n\t\tthis.state = globalState;\n\t}\n\n\t_createClass(User, [{\n\t\tkey: \"renderOptions\",\n\t\tvalue: function renderOptions(options) {\n\t\t\tvar glyphicon = options.glyphicon,\n\t\t\t text = options.text;\n\n\n\t\t\treturn \"
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\" + text + \"\\n\\t\\t\\t
      \";\n\t\t}\n\t}, {\n\t\tkey: \"setHandlers\",\n\t\tvalue: function setHandlers() {}\n\t}, {\n\t\tkey: \"render\",\n\t\tvalue: function render() {\n\t\t\tvar userName = this.state.selectedUser ? this.state.selectedUser.fullName : \"User Name\";\n\t\t\tvar mobileNumber = this.state.selectedUser ? this.state.selectedUser.phone : \"\";\n\n\t\t\treturn \"
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\tContacts\\n\\t\\t\\t\\t\\t\\tEdit\\n\\t \\t\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t
      \\n\\n\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\\"#\\\"\\n\\t\\t\\t\\t\\t
      \" + userName + \"
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\" + this.renderOptions({ glyphicon: \"comment\", text: \"message\" }) + \"\\n\\t\\t\\t\\t\\t\\t\" + this.renderOptions({ glyphicon: \"earphone\", text: \"call\" }) + \"\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\" + this.renderOptions({ glyphicon: \"facetime-video\", text: \"video\" }) + \"\\t\\n\\t\\t\\t\\t\\t\\t\" + this.renderOptions({ glyphicon: \"envelope\", text: \"mail\" }) + \"\\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t

      mobile number

      \\n\\t\\t\\t\\t\\t\\t
      \" + mobileNumber + \"
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t

      home number

      \\n\\t\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t\\t\\n\\t\\t\\t\\t\\t
      \\n\\t\\t\\t\\t
      \\n\\t\\t\\t
      \";\n\t\t}\n\t}]);\n\n\treturn User;\n}();\n\nexports.User = User;\n\n//# sourceURL=webpack:///./js/user.js?"); /***/ }) diff --git a/phoneApp/js/addUser.js b/phoneApp/js/addUser.js index 13cb1bd..88364c8 100644 --- a/phoneApp/js/addUser.js +++ b/phoneApp/js/addUser.js @@ -1,6 +1,9 @@ +//import {Api} from './api.js'; + class AddUser { constructor(globalState) { this.state = globalState; + //this.api = new Api(); } buttonsHandler() { @@ -71,6 +74,7 @@ class AddUser { this.buttonsHandler(); this.addButton = document.querySelector(".done-btn"); this.deleteButton = document.querySelector(".delete-contact"); + //this.cancelButton = document.getElementById("cancel"); this.form = document.forms[0]; this.form.addEventListener("submit", event => { event.preventDefault(); @@ -80,13 +84,17 @@ class AddUser { "click", this.clearFields.bind(this) ); + //this.cancelButton.addEventListener("click", (e) => { + // e.preventDefault(); + // window.history.back(); + //}); } render() { return `
      diff --git a/phoneApp/js/api.js b/phoneApp/js/api.js index 81ba6b2..4261945 100644 --- a/phoneApp/js/api.js +++ b/phoneApp/js/api.js @@ -64,8 +64,10 @@ class Api { } deleteUser(id) { - return fetch(this.url + `/${id}`, { method: "DELETE" }); + return fetch(this.url + `/${id}`, { + method: "DELETE" + }); } } -export {Api}; \ No newline at end of file +export { Api }; diff --git a/phoneApp/js/app.js b/phoneApp/js/app.js index 43443e8..24d6358 100644 --- a/phoneApp/js/app.js +++ b/phoneApp/js/app.js @@ -12,24 +12,24 @@ Cделать phone-book 7) Должна быть модульная структура и Проект должен собираться при помощи webpack(2) (!) 8) Проект должен транспайлится через babel последние 2 версии браузеров (2) (!) 9) и после публикации на gh-pages, должен быть минифицирован(2) -10) добавьте еще одну первую страницу на которой будет "auth" +10) добавьте еще одну первую страницу на которой будет "auth" + в этот инпут можно ввести инициалы easycode студента (2) в зависимости от этого будут загружаться разные пользователи */ -import {ContactsPage} from './contacts.js'; -import {AddUser} from './addUser.js'; -import {KeypadPage} from './keypad.js'; -import {EditContact} from './editContact.js'; -import {User} from './user.js'; -import {Router} from './router.js'; -import {Api} from './api.js'; +import { ContactsPage } from "./contacts.js"; +import { AddUser } from "./addUser.js"; +import { KeypadPage } from "./keypad.js"; +import { EditContact } from "./editContact.js"; +import { User } from "./user.js"; +import { Router } from "./router.js"; +import { Api } from "./api.js"; class App { constructor() { - this.url = `https://easycode-js.herokuapp.com/pnv2/users`; + //this.url = `https://easycode-js.herokuapp.com/pnv2/users`; this.state = { - activePage: "contacts", - api: new Api(this.url) + activePage: "contacts" + //api: new Api(this.url) }; this.pages = { @@ -51,6 +51,19 @@ class App { }); } + preRender() { + let db = prompt("Enter your database, please", ""); + + if (db == null) { + db = "pnv2"; + } + + this.url = `https://easycode-js.herokuapp.com/${db}/users`; + this.state.api = new Api(this.url); + + this.render(); + } + render() { const { activePage } = this.state; @@ -60,6 +73,10 @@ class App { .then(data => { this.state.people = data; this.completeRender(activePage); + this.state.formattedPeople = this.formatArrayWithPeople( + this.state.people + ); + console.log(this.state.formattedPeople); }) .catch(error => console.log("error", error)); } else { @@ -79,8 +96,26 @@ class App { this.appDOMNode.innerHTML = content; } + formatArrayWithPeople(arr) { + let formattedPeople = arr.map(item => { + let name = item.fullName.split(" ")[0]; + let lastName = item.fullName.split(" ")[1]; + + let copy = obj => { + let newObj = Object.assign({}, obj, { + ...obj, + name: name, + lastName: lastName + }); + return newObj; + }; + return copy(item); + }); + return formattedPeople; + } + static initialize() { - return new App().render(); + return new App().preRender(); } } diff --git a/phoneApp/js/contacts.js b/phoneApp/js/contacts.js index 91e0bb1..1b52745 100644 --- a/phoneApp/js/contacts.js +++ b/phoneApp/js/contacts.js @@ -3,6 +3,8 @@ //после ввода каждого символа, фильтровать отображаемых пользователей. + //При удалении всех символов отобразить снова весь список + +//this.state.formattedPeople == array with splitted fullName property + "use strict"; class ContactsPage { @@ -70,37 +72,16 @@ class ContactsPage { if (target.textContent == item) { item = this.makeCamelCase(item); - let index; - - if (item == "name") { - item = "fullName"; - index = 0; - } - if (item == "lastName") { - item = "fullName"; - index = 1; - } - - let sorted = this.sortUsers(item, index); - console.log(sorted); + let sorted = this.sortUsers(item); + //console.log(sorted); this.reRenderTable(sorted); } }); } - sortUsers(str, index) { + sortUsers(str) { function compare(a, b) { - if (isNaN(a[str]) && index) { - if (a[str].split(" ")[index] > b[str].split(" ")[index]) { - return 1; - } - if (a[str].split(" ")[index] < b[str].split(" ")[index]) { - return -1; - } - if (a[str].split(" ")[index] == b[str].split(" ")[index]) { - return 0; - } - } else if (isNaN(a[str]) && !index) { + if (isNaN(a[str])) { if (a[str] > b[str]) { return 1; } @@ -114,8 +95,8 @@ class ContactsPage { return a[str] - b[str]; } } - //console.log(this.state.people.sort(compare)) - return this.state.people.sort(compare); + + return this.state.formattedPeople.sort(compare); } makeCamelCase(str) { @@ -149,10 +130,9 @@ class ContactsPage { filterUser() { let value = this.searchField.value.toLowerCase(); - let filteredUsers = this.state.people.filter(item => { - let name = item.fullName.split(" ")[0]; - - if (name.toLowerCase().includes(value)) { + let filteredUsers = this.state.formattedPeople.filter(item => { + //let name = item.fullName.split(" ")[0]; + if (item.name.toLowerCase().includes(value)) { return item; } @@ -220,4 +200,4 @@ class ContactsPage { } } -export {ContactsPage}; \ No newline at end of file +export { ContactsPage }; diff --git a/phoneApp/js/editContact.js b/phoneApp/js/editContact.js index 603e087..dc7aa76 100644 --- a/phoneApp/js/editContact.js +++ b/phoneApp/js/editContact.js @@ -1,10 +1,13 @@ //edit-contact, //- сделать данные редактируемыми (атрибут contentEditable) // input + //- изменять backgroundColor + +//import {Api} from './api.js'; class EditContact { constructor(globalState) { this.state = globalState; + //this.api = new Api(this.state.url); + } buttonsHandler() { @@ -76,12 +79,17 @@ class EditContact { this.doneButton = document.querySelector(".done-btn"); this.deleteButton = document.querySelector(".delete-contact"); + //this.cancelButton = document.getElementById("cancel"); this.form = document.forms[0]; this.form.addEventListener("submit", event => { event.preventDefault(); }); this.doneButton.addEventListener("click", this.editUser.bind(this)); this.deleteButton.addEventListener("click", this.deleteUser.bind(this)); + //this.cancelButton.addEventListener("click", (e) => { //не срабатывают табы + // e.preventDefault(); + // window.history.back(); + //}); } render() { @@ -101,7 +109,7 @@ class EditContact { return `
      diff --git a/phoneApp/js/keypad.js b/phoneApp/js/keypad.js index dc7b067..04a3c2f 100644 --- a/phoneApp/js/keypad.js +++ b/phoneApp/js/keypad.js @@ -15,7 +15,7 @@ //добавить функционал для удаления номера + //1. keypad - сделать чтобы номер можно было набрать с клавиатуры (!) + -//2. Формат номера должен быть таким (099)-17-38-170 - +//2. Формат номера должен быть таким (099)-17-38-170 + class KeypadPage { constructor(globalState) { @@ -24,8 +24,8 @@ class KeypadPage { } buttonsHandler() { - let buttonsParent = document.querySelector("main"); // please you const keyword instead of let - let placeToInsertNumbers = document.querySelector(".numbers"); + const buttonsParent = document.querySelector("main"); + const placeToInsertNumbers = document.querySelector(".numbers"); buttonsParent.addEventListener( "click", @@ -48,6 +48,7 @@ class KeypadPage { if (pattern.test(code)) { display.innerHTML += code; + this.formatNumber(display.innerHTML, display); } return; } @@ -58,6 +59,7 @@ class KeypadPage { if (target.classList.contains("key")) { display.innerHTML += target.textContent; + this.formatNumber(display.innerHTML, display); } if (target.classList.contains("glyphicon-circle-arrow-left")) { @@ -69,6 +71,47 @@ class KeypadPage { } } + formatNumber(str, display) { + let willBeShown = ''; + if (str.length === 1 && str != '0') { + alert ('A number should be started with zero'); + }; + if (str.length === 1 && str == '0') { + willBeShown = str.replace(str, '(' + str); + }; + if (str.length === 2 || str.length === 3) { + willBeShown = str; + }; + if (str.length === 4) { + willBeShown = str.replace(str, str + ')-'); + }; + if (str.length === 5 || str.length === 6 || str.length === 7) { + willBeShown = str; + }; + if (str.length === 8) { + willBeShown = str.replace(str, str + '-'); + }; + if (str.length === 9 || str.length === 10) { + willBeShown = str; + }; + if (str.length === 11) { + willBeShown = str.replace(str, str + '-'); + }; + if (str.length === 12 || str.length === 13) { + willBeShown = str; + }; + if (str.length === 14) { + willBeShown = str; + this.finishState = str; + }; + if (str.length > 14) { + alert('It is enough'); + willBeShown = this.finishState; + }; + + display.innerHTML = willBeShown; + } + setHandlers() { this.buttonsHandler(); } diff --git a/phoneApp/js/server.js b/phoneApp/js/server.js index cc945fd..350fbcf 100644 --- a/phoneApp/js/server.js +++ b/phoneApp/js/server.js @@ -12,7 +12,8 @@ http try { - let file = fs.readFileSync(`.${url}`); + let file = fs.readFileSync(`../${url}`);//до вебпака было `.${url}`, т.е файлы для рендера брать прям из этой же директории + //после сборки вебпаком основной файл теперь build/bundle.js, он лежит выше, т.е. надо ../ response.end(file); } catch (err) { diff --git a/phoneApp/js/user.js b/phoneApp/js/user.js index 008cff7..63c1d15 100644 --- a/phoneApp/js/user.js +++ b/phoneApp/js/user.js @@ -13,7 +13,7 @@ class User { } setHandlers() { - console.log(this); + } render() { diff --git a/phoneApp/package-lock.json b/phoneApp/package-lock.json index c9ef604..692114f 100644 --- a/phoneApp/package-lock.json +++ b/phoneApp/package-lock.json @@ -346,6 +346,1032 @@ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", "dev": true }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-helper-explode-assignable-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-loader": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz", + "integrity": "sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==", + "requires": { + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-do-expressions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-do-expressions/-/babel-plugin-syntax-do-expressions-6.13.0.tgz", + "integrity": "sha1-V0d1YTmqJtOQ0JQQsDdEugfkeW0=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=", + "dev": true + }, + "babel-plugin-syntax-function-bind": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-function-bind/-/babel-plugin-syntax-function-bind-6.13.0.tgz", + "integrity": "sha1-SMSV8Xe98xqYHnMvVa3AvdJgH0Y=", + "dev": true + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-do-expressions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-do-expressions/-/babel-plugin-transform-do-expressions-6.22.0.tgz", + "integrity": "sha1-KMyvkoEtlJws0SgfaQyP3EaK6bs=", + "dev": true, + "requires": { + "babel-plugin-syntax-do-expressions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.10" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", + "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "dev": true, + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-function-bind": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-function-bind/-/babel-plugin-transform-function-bind-6.22.0.tgz", + "integrity": "sha1-xvuOlqwpajELjPjqQBRiQH3fapc=", + "dev": true, + "requires": { + "babel-plugin-syntax-function-bind": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "dev": true, + "requires": { + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-env": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz", + "integrity": "sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "3.2.8", + "invariant": "2.2.4", + "semver": "5.5.1" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.2", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "dev": true, + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "dev": true, + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + } + }, + "babel-preset-stage-0": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-0/-/babel-preset-stage-0-6.24.1.tgz", + "integrity": "sha1-VkLRUEL5E4TX5a+LyIsduVsDnmo=", + "dev": true, + "requires": { + "babel-plugin-transform-do-expressions": "6.22.0", + "babel-plugin-transform-function-bind": "6.22.0", + "babel-preset-stage-1": "6.24.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -416,8 +1442,7 @@ "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" }, "binary-extensions": { "version": "1.11.0", @@ -553,6 +1578,16 @@ "pako": "1.0.6" } }, + "browserslist": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz", + "integrity": "sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000878", + "electron-to-chromium": "1.3.61" + } + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -626,6 +1661,12 @@ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, + "caniuse-lite": { + "version": "1.0.30000878", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000878.tgz", + "integrity": "sha512-/dCGTdLCnjVJno1mFRn7Y6eit3AYaeFzSrMQHCoK0LEQaWl5snuLex1Ky4b8/Qu2ig5NgTX4cJx65hH9546puA==", + "dev": true + }, "chalk": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", @@ -778,8 +1819,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "component-emitter": { "version": "1.2.1", @@ -820,6 +1860,12 @@ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "dev": true }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", @@ -840,6 +1886,12 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "dev": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -1002,6 +2054,15 @@ "minimalistic-assert": "1.0.1" } }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, "diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", @@ -1031,6 +2092,12 @@ "stream-shift": "1.0.0" } }, + "electron-to-chromium": { + "version": "1.3.61", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.61.tgz", + "integrity": "sha512-XjTdsm6x71Y48lF9EEvGciwXD70b20g0t+3YbrE+0fPFutqV08DSNrZXkoXAp3QuzX7TpL/OW+/VsNoR9GkuNg==", + "dev": true + }, "elliptic": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", @@ -1049,8 +2116,7 @@ "emojis-list": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" }, "end-of-stream": { "version": "1.4.1", @@ -1112,6 +2178,12 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, "events": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", @@ -1345,7 +2417,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", - "dev": true, "requires": { "commondir": "1.0.1", "make-dir": "1.3.0", @@ -1356,7 +2427,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, "requires": { "locate-path": "2.0.0" } @@ -2002,12 +3072,35 @@ "integrity": "sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==", "dev": true }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -2077,6 +3170,16 @@ "minimalistic-crypto-utils": "1.0.1" } }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -2169,6 +3272,15 @@ "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", "dev": true }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.4.0" + } + }, "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", @@ -2261,6 +3373,15 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -2341,6 +3462,18 @@ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", "dev": true }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -2356,8 +3489,7 @@ "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" }, "kind-of": { "version": "6.0.2", @@ -2384,7 +3516,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, "requires": { "big.js": "3.2.0", "emojis-list": "2.1.0", @@ -2395,7 +3526,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, "requires": { "p-locate": "2.0.0", "path-exists": "3.0.0" @@ -2419,6 +3549,15 @@ "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=", "dev": true }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, "lru-cache": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", @@ -2433,7 +3572,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", - "dev": true, "requires": { "pify": "3.0.0" } @@ -2549,8 +3687,7 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, "mississippi": { "version": "2.0.0", @@ -2595,7 +3732,6 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, "requires": { "minimist": "0.0.8" } @@ -2800,6 +3936,12 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, "os-locale": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", @@ -2827,7 +3969,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, "requires": { "p-try": "1.0.0" } @@ -2836,7 +3977,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, "requires": { "p-limit": "1.3.0" } @@ -2844,8 +3984,7 @@ "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, "pako": { "version": "1.0.6", @@ -2898,8 +4037,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", @@ -2929,14 +4067,12 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, "requires": { "find-up": "2.1.0" } @@ -2947,6 +4083,12 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -3075,6 +4217,29 @@ "set-immediate-shim": "1.0.1" } }, + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -3085,6 +4250,40 @@ "safe-regex": "1.1.0" } }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.4.0", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -3103,6 +4302,15 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -3313,6 +4521,12 @@ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -3454,6 +4668,15 @@ "urix": "0.1.0" } }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", @@ -3627,6 +4850,12 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -3669,6 +4898,12 @@ "repeat-string": "1.6.1" } }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", diff --git a/phoneApp/package.json b/phoneApp/package.json index a4af40d..ac9eed1 100644 --- a/phoneApp/package.json +++ b/phoneApp/package.json @@ -10,7 +10,16 @@ "author": "", "license": "ISC", "devDependencies": { + "babel-core": "^6.26.3", + "babel-preset-env": "^1.7.0", + "babel-preset-es2015": "^6.24.1", + "babel-preset-react": "^6.24.1", + "babel-preset-stage-0": "^6.24.1", + "uglifyjs-webpack-plugin": "^1.3.0", "webpack": "^4.16.5", "webpack-cli": "^3.1.0" + }, + "dependencies": { + "babel-loader": "^7.1.5" } } diff --git a/phoneApp/webpack.config.js b/phoneApp/webpack.config.js index f92ee2b..793041b 100644 --- a/phoneApp/webpack.config.js +++ b/phoneApp/webpack.config.js @@ -1,4 +1,7 @@ const path = require('path'); //пакет nodeJs, получает абсолютный путь +const NODE_ENV = process.env.NODE_ENV || 'development'; +const webpack = require('webpack'); // чтобы можно было подключать плагины из вебпака. Вебпак д.б установлен в проекте, а не глобально +const UglifyJsPlugin = require('uglifyjs-webpack-plugin'); module.exports = { entry: './js/app.js', // точка входа @@ -7,6 +10,32 @@ module.exports = { filename: 'bundle.js', // итоговый файл publicPath: '/' }, + //devtool: 'source-map', mode: 'development', - watch: true, // когда запустим npm run webpack, он не будет завершаться + //watch: true, // когда запустим npm run webpack, он не будет завершаться + watch: NODE_ENV == 'development', //т.е. включаем только при разработке + + //plugins: [ + + //], + + module: { + rules: [ + { //лоадеры + test: /\.js$/, //к файлам, кот оканчиваются на .js, нужно применять лоадер бабель + use: { + loader: 'babel-loader', + } + + }, + ] + }, + + //optimization: { + // minimizer: [ + // new UglifyJsPlugin({ + // test: /\.js($|\?)/i, + // }) + // ] + //} } \ No newline at end of file