diff --git a/DevActivator.Common.BL/Config/CityTimeZone.cs b/DevActivator.Common.BL/Config/CityTimeZone.cs new file mode 100644 index 0000000..bdb9bcc --- /dev/null +++ b/DevActivator.Common.BL/Config/CityTimeZone.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using DevActivator.Common.BL.Enums; + +namespace DevActivator.Common.BL.Config +{ + public static class CityTimeZone + { + public static TimeSpan GetTimeZone(this City city) => TimeZoneDic[city]; + + private static readonly Dictionary TimeZoneDic = new Dictionary + { + {City.Spb, TimeSpan.FromHours(3)}, + {City.Msk, TimeSpan.FromHours(3)}, + {City.Sar, TimeSpan.FromHours(4)}, + {City.Kry, TimeSpan.FromHours(7)}, + {City.Kzn, TimeSpan.FromHours(3)}, + {City.Nsk, TimeSpan.FromHours(7)}, + {City.Nnv, TimeSpan.FromHours(3)}, + {City.Ufa, TimeSpan.FromHours(5)}, + }; + } +} \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Enums/City.cs b/DevActivator.Common.BL/Enums/City.cs similarity index 69% rename from DevActivator.Meetups.BL/Enums/City.cs rename to DevActivator.Common.BL/Enums/City.cs index 3c97e62..bbc7e1f 100644 --- a/DevActivator.Meetups.BL/Enums/City.cs +++ b/DevActivator.Common.BL/Enums/City.cs @@ -1,4 +1,4 @@ -namespace DevActivator.Meetups.BL.Enums +namespace DevActivator.Common.BL.Enums { public enum City { @@ -18,6 +18,12 @@ public enum City Kzn = 5, /// Новосибирск - Nsk = 6 + Nsk = 6, + + /// Нижний Новгород + Nnv = 7, + + /// Уфа + Ufa = 8 } } \ No newline at end of file diff --git a/DevActivator.Common.BL/Extensions/StringExtension.cs b/DevActivator.Common.BL/Extensions/StringExtension.cs new file mode 100644 index 0000000..405e7c2 --- /dev/null +++ b/DevActivator.Common.BL/Extensions/StringExtension.cs @@ -0,0 +1,11 @@ +using System; +using DevActivator.Common.BL.Enums; + +namespace DevActivator.Common.BL.Extensions +{ + public static class StringExtension + { + public static City GetCity(this string id) + => (City) Enum.Parse(typeof(City), id.Substring(0, 3), true); + } +} \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Entities/Meetup.cs b/DevActivator.Meetups.BL/Entities/Meetup.cs index c12ab4d..c48e2a2 100644 --- a/DevActivator.Meetups.BL/Entities/Meetup.cs +++ b/DevActivator.Meetups.BL/Entities/Meetup.cs @@ -12,17 +12,11 @@ public class Meetup : IFlatEntity public string CommunityId { get; set; } - /// Obsolete - public string Date { get; set; } - [XmlArrayItem("FriendId")] public List FriendIds { get; set; } public string VenueId { get; set; } public List Sessions { get; set; } - - [XmlArrayItem("TalkId")] - public List TalkIds { get; set; } } } \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Enums/Community.cs b/DevActivator.Meetups.BL/Enums/Community.cs index b78f2fc..f70d102 100644 --- a/DevActivator.Meetups.BL/Enums/Community.cs +++ b/DevActivator.Meetups.BL/Enums/Community.cs @@ -7,6 +7,8 @@ public enum Community SarDotNet = 3, KryDotNet = 4, KznDotNet = 5, - NskDotNet = 6 + NskDotNet = 6, + NnvDotNet = 7, + UfaDotNet = 8 } } \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Extensions/MeetupExtensions.cs b/DevActivator.Meetups.BL/Extensions/MeetupExtensions.cs index 20be34d..f930c91 100644 --- a/DevActivator.Meetups.BL/Extensions/MeetupExtensions.cs +++ b/DevActivator.Meetups.BL/Extensions/MeetupExtensions.cs @@ -1,5 +1,8 @@ using System; +using System.Globalization; using System.Linq; +using DevActivator.Common.BL.Config; +using DevActivator.Common.BL.Extensions; using DevActivator.Meetups.BL.Entities; using DevActivator.Meetups.BL.Enums; using DevActivator.Meetups.BL.Models; @@ -44,11 +47,12 @@ public static MeetupVm ToVm(this Meetup meetup) CommunityId = meetup.CommunityId.GetCommunity(), FriendIds = meetup.FriendIds.Select(x => new FriendReference {FriendId = x}).ToList(), VenueId = meetup.VenueId, - Sessions = meetup.Sessions.Select(x => new Session + Sessions = meetup.Sessions.Select(x => new SessionVm { TalkId = x.TalkId, - StartTime = x.StartTime, - EndTime = x.EndTime + // todo: extract as helper method + StartTime = x.StartTime.Add(meetup.VenueId.GetCity().GetTimeZone()).ToString("yyyy-MM-ddTHH:mm:ss"), + EndTime = x.EndTime.Add(meetup.VenueId.GetCity().GetTimeZone()).ToString("yyyy-MM-ddTHH:mm:ss") }).ToList(), }; @@ -63,13 +67,23 @@ public static Meetup Extend(this Meetup original, MeetupVm meetup) Sessions = meetup.Sessions.Select(x => new Session { TalkId = x.TalkId, - StartTime = x.StartTime, - EndTime = x.EndTime + // todo: extract as helper method + StartTime = DateTime.ParseExact( + $"{x.StartTime}Z", + "yyyy-MM-ddTHH:mm:ssZ", + CultureInfo.InvariantCulture, + DateTimeStyles.AdjustToUniversal) + .Subtract(meetup.VenueId.GetCity().GetTimeZone()), + EndTime = DateTime.ParseExact( + $"{x.EndTime}Z", + "yyyy-MM-ddTHH:mm:ssZ", + CultureInfo.InvariantCulture, + DateTimeStyles.AdjustToUniversal) + .Subtract(meetup.VenueId.GetCity().GetTimeZone()) }).ToList(), - TalkIds = meetup.Sessions.Select(x => x.TalkId).ToList(), }; - private static Community GetCommunity(this string id) + public static Community GetCommunity(this string id) => (Community) Enum.Parse(typeof(Community), id, true); } } \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Extensions/VenueExtensions.cs b/DevActivator.Meetups.BL/Extensions/VenueExtensions.cs index 86aa2c5..8a68c1b 100644 --- a/DevActivator.Meetups.BL/Extensions/VenueExtensions.cs +++ b/DevActivator.Meetups.BL/Extensions/VenueExtensions.cs @@ -1,6 +1,6 @@ using System; +using DevActivator.Common.BL.Extensions; using DevActivator.Meetups.BL.Entities; -using DevActivator.Meetups.BL.Enums; using DevActivator.Meetups.BL.Models; namespace DevActivator.Meetups.BL.Extensions @@ -47,8 +47,5 @@ public static Venue Extend(this Venue original, VenueVm venue) Address = venue.Address, MapUrl = venue.MapUrl }; - - private static City GetCity(this string id) - => (City) Enum.Parse(typeof(City), id.Substring(0, 3), true); } } \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Helpers/ShellHelper.cs b/DevActivator.Meetups.BL/Helpers/ShellHelper.cs index 6c033be..2e5e796 100644 --- a/DevActivator.Meetups.BL/Helpers/ShellHelper.cs +++ b/DevActivator.Meetups.BL/Helpers/ShellHelper.cs @@ -29,7 +29,7 @@ public static string Bash(this string command) result = process.StandardOutput.ReadToEnd(); process.WaitForExit(); } - catch (Exception _) + catch (Exception) { result = "bash error"; } diff --git a/DevActivator.Meetups.BL/Models/MeetupVm.cs b/DevActivator.Meetups.BL/Models/MeetupVm.cs index 0869da9..80db5e4 100644 --- a/DevActivator.Meetups.BL/Models/MeetupVm.cs +++ b/DevActivator.Meetups.BL/Models/MeetupVm.cs @@ -16,6 +16,6 @@ public class MeetupVm public string VenueId { get; set; } - public List Sessions { get; set; } + public List Sessions { get; set; } } } \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Models/SessionVm.cs b/DevActivator.Meetups.BL/Models/SessionVm.cs new file mode 100644 index 0000000..46a3200 --- /dev/null +++ b/DevActivator.Meetups.BL/Models/SessionVm.cs @@ -0,0 +1,11 @@ +namespace DevActivator.Meetups.BL.Models +{ + public class SessionVm + { + public string TalkId { get; set; } + + public string StartTime { get; set; } + + public string EndTime { get; set; } + } +} \ No newline at end of file diff --git a/DevActivator.Meetups.BL/Models/VenueVm.cs b/DevActivator.Meetups.BL/Models/VenueVm.cs index 1ce89f4..11abb3b 100644 --- a/DevActivator.Meetups.BL/Models/VenueVm.cs +++ b/DevActivator.Meetups.BL/Models/VenueVm.cs @@ -1,4 +1,4 @@ -using DevActivator.Meetups.BL.Enums; +using DevActivator.Common.BL.Enums; namespace DevActivator.Meetups.BL.Models { diff --git a/DevActivator.Meetups.BL/Services/MeetupService.cs b/DevActivator.Meetups.BL/Services/MeetupService.cs index a82248f..4b3c781 100644 --- a/DevActivator.Meetups.BL/Services/MeetupService.cs +++ b/DevActivator.Meetups.BL/Services/MeetupService.cs @@ -32,7 +32,7 @@ public async Task> GetAllMeetupsAsync() public async Task GetMeetupAsync(string meetupId) { var meetup = await _meetupProvider.GetMeetupOrDefaultAsync(meetupId).ConfigureAwait(false); - return meetup.ToVm(); + return meetup?.ToVm(); } public async Task AddMeetupAsync(MeetupVm meetup) diff --git a/DevActivator.Meetups.Tests/ProviderTests/MeetupProviderTests.cs b/DevActivator.Meetups.Tests/ProviderTests/MeetupProviderTests.cs index f2b514d..ee18466 100644 --- a/DevActivator.Meetups.Tests/ProviderTests/MeetupProviderTests.cs +++ b/DevActivator.Meetups.Tests/ProviderTests/MeetupProviderTests.cs @@ -9,16 +9,6 @@ namespace DevActivator.Meetups.Tests.ProviderTests { public class MeetupProviderTests { - [Fact] - public async Task MeetupDateDeserializationSucceed() - { - // prepare - var meetup = await GetTestMeetupAsync(); - - // test - Assert.NotEmpty(meetup.Date); - } - [Fact] public async Task MeetupFriendIdsDeserializationSucceed() { @@ -39,16 +29,6 @@ public async Task MeetupSessionsDeserializationSucceed() Assert.Equal(2, talk.Sessions.Count); } - [Fact] - public async Task MeetupTalkIdsDeserializationSucceed() - { - // prepare - var talk = await GetTestMeetupAsync(); - - // test - Assert.Equal(2, talk.TalkIds.Count); - } - private Task GetTestMeetupAsync(string testMeetupId = "SpbDotNet-30") { var settings = new Settings {AuditRepoDirectory = "/Users/alex-mbp/repos/Audit"}; diff --git a/DevActivator/ClientApp/app/app.component.css b/DevActivator/ClientApp/app/app.component.css index 4825c8b..787220b 100644 --- a/DevActivator/ClientApp/app/app.component.css +++ b/DevActivator/ClientApp/app/app.component.css @@ -2,4 +2,9 @@ .mat-drawer-container { height: 100%; display: block; +} + +.router-container { + /* 64px - toolbar */ + height: calc(100% - 64px); } \ No newline at end of file diff --git a/DevActivator/ClientApp/app/app.component.html b/DevActivator/ClientApp/app/app.component.html index 7dd5197..175d7e1 100644 --- a/DevActivator/ClientApp/app/app.component.html +++ b/DevActivator/ClientApp/app/app.component.html @@ -6,6 +6,8 @@ - +
+ +
\ No newline at end of file diff --git a/DevActivator/ClientApp/app/app.shared.module.ts b/DevActivator/ClientApp/app/app.shared.module.ts index 4e1a79b..c9db603 100644 --- a/DevActivator/ClientApp/app/app.shared.module.ts +++ b/DevActivator/ClientApp/app/app.shared.module.ts @@ -9,6 +9,7 @@ import { MeetupEditorModule } from "@dotnetru/pages/meetup-editor"; import { SearchPageModule } from "@dotnetru/pages/search"; import { SpeakerEditorModule } from "@dotnetru/pages/speaker-editor"; import { TalkEditorModule } from "@dotnetru/pages/talk-editor"; +import { TimepadModule } from "@dotnetru/pages/timepad"; import { VenueEditorModule } from "@dotnetru/pages/venue-editor"; import { AutocompleteModule } from "@dotnetru/shared/autocomplete"; import { SpeakerListModule } from "@dotnetru/speaker-list"; @@ -42,6 +43,8 @@ import { SearchPageComponent } from "./pages/search/search.component"; TalkEditorModule, VenueEditorModule, + TimepadModule, + SearchPageModule, RouterModule.forRoot([ diff --git a/DevActivator/ClientApp/app/components/friend-list/friend-list.component.html b/DevActivator/ClientApp/app/components/friend-list/friend-list.component.html index d496d1e..d31a554 100644 --- a/DevActivator/ClientApp/app/components/friend-list/friend-list.component.html +++ b/DevActivator/ClientApp/app/components/friend-list/friend-list.component.html @@ -3,5 +3,6 @@ [data]="friends" [iconName]="iconName" [iconText]="iconText" + [clearOnSelect]="clearOnSelect" (selected)="onSelected($event)" (iconClicked)="onIconClicked()"> \ No newline at end of file diff --git a/DevActivator/ClientApp/app/components/friend-list/friend-list.component.ts b/DevActivator/ClientApp/app/components/friend-list/friend-list.component.ts index dfab7dc..a2d5cdb 100644 --- a/DevActivator/ClientApp/app/components/friend-list/friend-list.component.ts +++ b/DevActivator/ClientApp/app/components/friend-list/friend-list.component.ts @@ -24,6 +24,7 @@ export class FriendListComponent implements OnInit, OnDestroy { @Input() public title: string = "Поиск друга"; @Input() public iconName: string = "add"; @Input() public iconText: string = "Добавить"; + @Input() public clearOnSelect: boolean = false; @Input() public set friendLink(value: { friendId?: string }) { if (value && value.friendId) { @@ -33,7 +34,7 @@ export class FriendListComponent implements OnInit, OnDestroy { @ViewChild("autocomplete") public autocomplete!: AutocompleteComponent; - @Output() public readonly selected: EventEmitter = new EventEmitter(); + @Output() public readonly selected: EventEmitter = new EventEmitter(); @Output() public readonly iconClicked: EventEmitter = new EventEmitter(); public friends: IAutocompleteRow[] = []; @@ -75,7 +76,7 @@ export class FriendListComponent implements OnInit, OnDestroy { } public onSelected(row: IAutocompleteRow): void { - this.selected.emit(row); + this.selected.emit(row.id); } public onIconClicked(): void { diff --git a/DevActivator/ClientApp/app/components/navmenu/index.ts b/DevActivator/ClientApp/app/components/navmenu/index.ts new file mode 100644 index 0000000..fcbad19 --- /dev/null +++ b/DevActivator/ClientApp/app/components/navmenu/index.ts @@ -0,0 +1 @@ +export { NavMenuModule } from "./navmenu.module"; diff --git a/DevActivator/ClientApp/app/components/navmenu/navmenu.component.css b/DevActivator/ClientApp/app/components/navmenu/navmenu.component.css index e69de29..1637f87 100644 --- a/DevActivator/ClientApp/app/components/navmenu/navmenu.component.css +++ b/DevActivator/ClientApp/app/components/navmenu/navmenu.component.css @@ -0,0 +1,4 @@ +:host { + display: flex; + flex-direction: column; +} \ No newline at end of file diff --git a/DevActivator/ClientApp/app/components/navmenu/navmenu.component.html b/DevActivator/ClientApp/app/components/navmenu/navmenu.component.html index 758e3c6..d633e6d 100644 --- a/DevActivator/ClientApp/app/components/navmenu/navmenu.component.html +++ b/DevActivator/ClientApp/app/components/navmenu/navmenu.component.html @@ -1,12 +1,46 @@ - \ No newline at end of file + + + + search + Поиск + + + + developer_mode + В разработке + + + + + + Встречу + + + person + Докладчика + + + speaker_notes + Доклад + + + account_balance + Площадку + + + loyalty + Друга + + \ No newline at end of file diff --git a/DevActivator/ClientApp/app/components/navmenu/navmenu.module.ts b/DevActivator/ClientApp/app/components/navmenu/navmenu.module.ts index 4760038..a9bd826 100644 --- a/DevActivator/ClientApp/app/components/navmenu/navmenu.module.ts +++ b/DevActivator/ClientApp/app/components/navmenu/navmenu.module.ts @@ -1,5 +1,5 @@ import { NgModule } from "@angular/core"; -import { MatMenuModule } from "@angular/material"; +import { MatButtonModule, MatIconModule, MatMenuModule } from "@angular/material"; import { RouterModule } from "@angular/router"; import { NavMenuComponent } from "./navmenu.component"; @@ -13,8 +13,10 @@ import { NavMenuComponent } from "./navmenu.component"; ], imports: [ RouterModule, + + MatButtonModule, + MatIconModule, MatMenuModule, ], }) -export class NavMenuModule { -} +export class NavMenuModule { } diff --git a/DevActivator/ClientApp/app/components/speaker-list/speaker-list.component.ts b/DevActivator/ClientApp/app/components/speaker-list/speaker-list.component.ts index cbdc908..2b1208e 100644 --- a/DevActivator/ClientApp/app/components/speaker-list/speaker-list.component.ts +++ b/DevActivator/ClientApp/app/components/speaker-list/speaker-list.component.ts @@ -21,7 +21,7 @@ import { SpeakerListService } from "./speaker-list.service"; templateUrl: "./speaker-list.component.html", }) export class SpeakerListComponent implements OnInit, OnDestroy { - @Input() public title: string = "Поиск спикера"; + @Input() public title: string = "Поиск докладчика"; @Input() public iconName: string = "add"; @Input() public iconText: string = "Добавить"; diff --git a/DevActivator/ClientApp/app/components/toolbar/toolbar.component.css b/DevActivator/ClientApp/app/components/toolbar/toolbar.component.css index e69de29..54fb167 100644 --- a/DevActivator/ClientApp/app/components/toolbar/toolbar.component.css +++ b/DevActivator/ClientApp/app/components/toolbar/toolbar.component.css @@ -0,0 +1,7 @@ +:host { + display: block; +} + +mtp-menu { + flex-direction: row; +} \ No newline at end of file diff --git a/DevActivator/ClientApp/app/components/toolbar/toolbar.component.html b/DevActivator/ClientApp/app/components/toolbar/toolbar.component.html index 09f7cfa..31b70c8 100644 --- a/DevActivator/ClientApp/app/components/toolbar/toolbar.component.html +++ b/DevActivator/ClientApp/app/components/toolbar/toolbar.component.html @@ -12,5 +12,8 @@ menu Меню - DevActivator v0.0.1-alpha + + + DevActivator v0.0.1-alpha + \ No newline at end of file diff --git a/DevActivator/ClientApp/app/components/toolbar/toolbar.module.ts b/DevActivator/ClientApp/app/components/toolbar/toolbar.module.ts index 14038fd..52bcc24 100644 --- a/DevActivator/ClientApp/app/components/toolbar/toolbar.module.ts +++ b/DevActivator/ClientApp/app/components/toolbar/toolbar.module.ts @@ -7,6 +7,7 @@ import { MatToolbarModule, } from "@angular/material"; import { CoreModule } from "@dotnetru/core"; +import { NavMenuModule } from "@dotnetru/navmenu"; import { ToolbarComponent } from "./toolbar.component"; @@ -19,6 +20,7 @@ import { ToolbarComponent } from "./toolbar.component"; ], imports: [ CoreModule, + NavMenuModule, MatButtonModule, MatIconModule, diff --git a/DevActivator/ClientApp/app/components/venue-list/venue-list.component.ts b/DevActivator/ClientApp/app/components/venue-list/venue-list.component.ts index 8158d1e..9b3e5f5 100644 --- a/DevActivator/ClientApp/app/components/venue-list/venue-list.component.ts +++ b/DevActivator/ClientApp/app/components/venue-list/venue-list.component.ts @@ -22,8 +22,8 @@ import { VenueListService } from "./venue-list.service"; }) export class VenueListComponent implements OnInit, OnDestroy { @Input() public title: string = "Поиск площадки"; - @Input() public iconName: string = ""; - @Input() public iconText: string = ""; + @Input() public iconName: string = "add"; + @Input() public iconText: string = "Добавить"; @Input() public set venueLink(value: { venueId?: string }) { if (value && value.venueId) { @@ -31,9 +31,15 @@ export class VenueListComponent implements OnInit, OnDestroy { } } + @Input() public set venueId(venueId: string | undefined) { + if (venueId) { + this._venueId$.next(venueId); + } + } + @ViewChild("autocomplete") public autocomplete!: AutocompleteComponent; - @Output() public readonly selected: EventEmitter = new EventEmitter(); + @Output() public readonly selected: EventEmitter = new EventEmitter(); @Output() public readonly iconClicked: EventEmitter = new EventEmitter(); public venues: IAutocompleteRow[] = []; @@ -75,7 +81,7 @@ export class VenueListComponent implements OnInit, OnDestroy { } public onSelected(row: IAutocompleteRow): void { - this.selected.emit(row); + this.selected.emit(row.id); } public onIconClicked(): void { diff --git a/DevActivator/ClientApp/app/core/constants.ts b/DevActivator/ClientApp/app/core/constants.ts index e376e34..29b7b4c 100644 --- a/DevActivator/ClientApp/app/core/constants.ts +++ b/DevActivator/ClientApp/app/core/constants.ts @@ -4,6 +4,8 @@ export const API_ENDPOINTS = { addSpeakerUrl: "api/Speaker/AddSpeaker", addTalkUrl: "api/Talk/AddTalk", addVenueUrl: "api/Venue/AddVenue", + getCompositeMeetupUrl: "api/Composite/GetMeetup/{{meetupId}}", + saveCompositeMeetupUrl: "api/Composite/SaveMeetup/{{meetupId}}", getFriendUrl: "api/Friend/GetFriend/{{friendId}}", getFriendsUrl: "api/Friend/GetFriends", getMeetupUrl: "api/Meetup/GetMeetup/{{meetupId}}", diff --git a/DevActivator/ClientApp/app/core/core.module.ts b/DevActivator/ClientApp/app/core/core.module.ts index bf80640..7d600e6 100644 --- a/DevActivator/ClientApp/app/core/core.module.ts +++ b/DevActivator/ClientApp/app/core/core.module.ts @@ -1,5 +1,7 @@ import { NgModule } from "@angular/core"; +import { DateConverterService } from "./date-converter.service"; +import { DatetimePipe } from "./datetime.pipe"; import { HttpService } from "./http.service"; import { LayoutService } from "./layout.service"; import { PatternErrorMessagePipe } from "./pattern-error-message.pipe"; @@ -7,16 +9,19 @@ import { RequiredErrorMessagePipe } from "./required-error-message.pipe"; @NgModule({ declarations: [ + DatetimePipe, PatternErrorMessagePipe, RequiredErrorMessagePipe, ], exports: [ + DatetimePipe, PatternErrorMessagePipe, RequiredErrorMessagePipe, ], providers: [ - LayoutService, + DateConverterService, HttpService, + LayoutService, ], }) export class CoreModule { } diff --git a/DevActivator/ClientApp/app/core/date-converter.service.ts b/DevActivator/ClientApp/app/core/date-converter.service.ts new file mode 100644 index 0000000..79cb303 --- /dev/null +++ b/DevActivator/ClientApp/app/core/date-converter.service.ts @@ -0,0 +1,22 @@ +import * as moment from "moment"; +import { Moment } from "moment"; + +moment.locale("ru"); + +export class DateConverterService { + public static toMoment(date: string): Moment { + return moment(date).clone(); + } + + public static toString(date?: Moment | null, format?: string): string { + if (!date) { + return ""; + } + + return date.format(format || "YYYY-MM-DDTHH:mm:ss"); + } + + public static toApiString(date: Moment): string { + return DateConverterService.toString(date); + } +} diff --git a/DevActivator/ClientApp/app/core/datetime.pipe.ts b/DevActivator/ClientApp/app/core/datetime.pipe.ts new file mode 100644 index 0000000..6ab7710 --- /dev/null +++ b/DevActivator/ClientApp/app/core/datetime.pipe.ts @@ -0,0 +1,10 @@ +import { Pipe, PipeTransform } from "@angular/core"; +import { Moment } from "moment"; +import { DateConverterService } from "./date-converter.service"; + +@Pipe({ name: "datetime" }) +export class DatetimePipe implements PipeTransform { + public transform(date: Moment | undefined | null, format?: string): string { + return DateConverterService.toString(date, format); + } +} diff --git a/DevActivator/ClientApp/app/core/http.service.ts b/DevActivator/ClientApp/app/core/http.service.ts index 13c5abd..12017c1 100644 --- a/DevActivator/ClientApp/app/core/http.service.ts +++ b/DevActivator/ClientApp/app/core/http.service.ts @@ -49,27 +49,45 @@ export class HttpService { this._layoutService.showProgress(); } + private requestEnded(): void { + if (this._requestsCount > 0) { + --this._requestsCount; + if (this._requestsCount === 0) { + this._layoutService.hideProgress(); + } + } else { + console.warn("try decrease requestsCount below zero"); + } + } + private onSuccess(res: T, cb: (x: T) => void): void { + this.requestEnded(); cb(res); } private onError = (err: any, errCb?: (x: any) => void): void => { + this.requestEnded(); console.error(err); if (errCb) { errCb(err); } else { - this._layoutService.showError(err.message); + let message: string = "Неопознанная ошибка!"; + + if (err.status === 400 || err.status === 404 || err.status === 405) { + message = err.error; + } else if (err.status === 500) { + message = "Возникла непредвиденная ошибка на сервере"; + } else if (err.status <= 0) { + message = "Api не запущен"; + } else { + throw err; + } + + this._layoutService.showError(message); } } private onComplete(): void { - if (this._requestsCount > 0) { - --this._requestsCount; - if (this._requestsCount === 0) { - this._layoutService.hideProgress(); - } - } else { - console.warn("try decrease requestsCount below zero"); - } + // ignore } } diff --git a/DevActivator/ClientApp/app/core/index.ts b/DevActivator/ClientApp/app/core/index.ts index d4cd3a0..83f111c 100644 --- a/DevActivator/ClientApp/app/core/index.ts +++ b/DevActivator/ClientApp/app/core/index.ts @@ -9,3 +9,4 @@ export { CoreModule } from "./core.module"; export { LayoutService } from "./layout.service"; export { HttpService } from "./http.service"; export { IMessage } from "./interfaces"; +export { DateConverterService } from "./date-converter.service"; diff --git a/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.component.html b/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.component.html index a883348..0ede6b5 100644 --- a/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.component.html +++ b/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.component.html @@ -1,29 +1,26 @@
-
- - - +
+ {{ editMode ? 'Редактирование' : 'Добавление' }} друга +
+ + +
0) { + this._friendEditorService.fetchFriend(value); + this.editMode = true; + } else { + this.editMode = false; + } + } + + @Output() public readonly saved: EventEmitter = new EventEmitter(); + + public editMode: boolean = false; private _subs: Subscription[] = []; @@ -38,13 +61,8 @@ export class FriendEditorComponent implements OnInit, OnDestroy { public ngOnInit(): void { this._subs = [ this._activatedRoute.params - .subscribe((params) => { - if (typeof params.friendId === "string" && params.friendId.length > 0) { - this._friendEditorService.fetchFriend(params.friendId); - } else { - this.editMode = false; - } - }), + .pipe(filter((x) => x.friendId)) + .subscribe((params) => this.friendId = params.friendId), this._friendEditorService.friend$ .subscribe((friend: IFriend) => { this.friend = friend; @@ -57,19 +75,23 @@ export class FriendEditorComponent implements OnInit, OnDestroy { this._subs.forEach((x) => x.unsubscribe); } - public goBack(): void { - if (!this._friendEditorService.hasChanges(this.friend)) { - this._router.navigateByUrl("/friend-list"); - } else { - this._layoutService.showWarning("Потеря введенных данных предотвращена"); - } - } - - public save(): void { + public save(cb?: (friend: IFriend) => void): void { if (this.editMode) { - this._friendEditorService.updateFriend(this.friend); + this._friendEditorService.updateFriend(this.friend, () => { + this.saved.emit(this.friend); + }); } else { - this._friendEditorService.addFriend(this.friend); + + if (!cb) { + cb = ((friend: IFriend) => { + this.saved.emit(friend); + if (!this.suppressNavigation) { + this._router.navigateByUrl(`friend-editor${friend ? `/${friend.id}` : ""}`); + } + }); + } + + this._friendEditorService.addFriend(this.friend, cb); } } diff --git a/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.module.ts b/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.module.ts index 5d7b49f..6ea3e76 100644 --- a/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.module.ts +++ b/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.module.ts @@ -19,6 +19,7 @@ import { FriendImageUrlPipe } from "./pipes"; ], exports: [ FriendEditorComponent, + FriendImageUrlPipe, ], imports: [ RouterModule.forChild([ diff --git a/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.service.ts b/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.service.ts index c35b268..4264178 100644 --- a/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.service.ts +++ b/DevActivator/ClientApp/app/pages/friend-editor/friend-editor.service.ts @@ -8,6 +8,10 @@ import { IFriend } from "./interfaces"; @Injectable() export class FriendEditorService { + public static getDefaultFriend(): IFriend { + return { id: "", name: "", url: "", description: "" }; + } + private _friend$: BehaviorSubject = new BehaviorSubject(null); private _dataStore = { friend: {} as IFriend, @@ -39,25 +43,26 @@ export class FriendEditorService { }); } - public addFriend(friend: IFriend): void { + public addFriend(friend: IFriend, cb: (friend: IFriend) => void): void { this._httpService.post( API_ENDPOINTS.addFriendUrl, friend, - (x: IFriend) => { - this._layoutService.showInfo("Спикер добавлен успешно"); - this._router.navigateByUrl(`friend-editor${friend ? `/${friend.id}` : ""}`); + (res: IFriend) => { + this._layoutService.showInfo("Друг добавлен успешно"); + cb(res); }, ); } - public updateFriend(friend: IFriend): void { + public updateFriend(friend: IFriend, cb: () => void): void { this._httpService.post( API_ENDPOINTS.updateFriendUrl, friend, (x: IFriend) => { - this._layoutService.showInfo("Спикер изменён успешно"); + this._layoutService.showInfo("Друг изменён успешно"); this._dataStore.friend = x; this._friend$.next(Object.assign({}, this._dataStore.friend)); + cb(); }, ); } diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/constants.ts b/DevActivator/ClientApp/app/pages/meetup-editor/constants.ts new file mode 100644 index 0000000..b0906ef --- /dev/null +++ b/DevActivator/ClientApp/app/pages/meetup-editor/constants.ts @@ -0,0 +1,12 @@ +import { Community } from "./enums"; + +export const COMMUNITIES: Community[] = [ + Community.SpbDotNet, + Community.MskDotNet, + Community.SarDotNet, + Community.KryDotNet, + Community.KznDotNet, + Community.NskDotNet, + Community.NnvDotNet, + Community.UfaDotNet, +]; diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/enums.ts b/DevActivator/ClientApp/app/pages/meetup-editor/enums.ts new file mode 100644 index 0000000..09ac9f9 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/meetup-editor/enums.ts @@ -0,0 +1,10 @@ +export enum Community { + SpbDotNet = 1, + MskDotNet = 2, + SarDotNet = 3, + KryDotNet = 4, + KznDotNet = 5, + NskDotNet = 6, + NnvDotNet = 7, + UfaDotNet = 8, +} diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/interfaces.ts b/DevActivator/ClientApp/app/pages/meetup-editor/interfaces.ts index 3521873..c3bf032 100644 --- a/DevActivator/ClientApp/app/pages/meetup-editor/interfaces.ts +++ b/DevActivator/ClientApp/app/pages/meetup-editor/interfaces.ts @@ -1,28 +1,31 @@ +import { Moment } from "moment"; + +import { Community } from "./enums"; + export interface IFriendReference { friendId: string; } -export interface IApiSession { +export interface ISession { talkId: string; - startTime: string; - endTime: string; + startTime?: Moment; + endTime?: Moment; } -export type ISession = IApiSession & { - // todo: date to moment - startTime: Date; - endTime: Date; -}; - -export interface IApiMeetup { +export interface IMeetup { id: string; name: string; - communityId: string; + communityId: Community; friendIds: IFriendReference[]; venueId: string; - sessions: IApiSession[]; + sessions: ISession[]; } -export type IMeetup = IApiMeetup & { - sessions: ISession[]; +export type IApiSession = ISession & { + startTime: string; + endTime: string; +}; + +export type IApiMeetup = IMeetup & { + sessions: IApiSession[]; }; diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.css b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.css index 06870b8..d9aa4cc 100644 --- a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.css +++ b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.css @@ -1,3 +1,8 @@ +:host { + display: block; + height: 100%; +} + .mat-form-field { width: 100%; margin: 0 auto; diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.html b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.html index 5143677..f0c0c17 100644 --- a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.html +++ b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.html @@ -2,16 +2,10 @@ class="base-component-container">
- diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.ts b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.ts index ced7191..2d6b57d 100644 --- a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.ts +++ b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.component.ts @@ -1,10 +1,12 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; import { ActivatedRoute, Params, Router } from "@angular/router"; -import { FILE_SIZES, LABELS, LayoutService, MIME_TYPES, PATTERNS } from "@dotnetru/core"; -import { IAutocompleteRow } from "@dotnetru/shared/autocomplete"; +import { LABELS, LayoutService, PATTERNS } from "@dotnetru/core"; +import { Moment } from "moment"; import { Subscription } from "rxjs"; -import { IMeetup } from "./interfaces"; +import { COMMUNITIES } from "./constants"; +import { Community } from "./enums"; +import { IMeetup, ISession } from "./interfaces"; import { MeetupEditorService } from "./meetup-editor.service"; @Component({ @@ -17,10 +19,12 @@ import { MeetupEditorService } from "./meetup-editor.service"; export class MeetupEditorComponent implements OnInit, OnDestroy { public readonly LABELS = LABELS; public readonly PATTERNS = PATTERNS; + public readonly Community = Community; + public readonly COMMUNITIES = COMMUNITIES; // todo: create service method getDefaultMeetup public meetup: IMeetup = { - communityId: "", + communityId: Community.SpbDotNet, friendIds: [], id: "", name: "", @@ -62,14 +66,6 @@ export class MeetupEditorComponent implements OnInit, OnDestroy { this._subs.forEach((x) => x.unsubscribe); } - public goBack(): void { - if (!this._meetupEditorService.hasChanges(this.meetup)) { - this._router.navigateByUrl("/meetup-list"); - } else { - this._layoutService.showWarning("Потеря введенных данных предотвращена"); - } - } - public save(): void { if (this.editMode) { this._meetupEditorService.updateMeetup(this.meetup); @@ -82,8 +78,8 @@ export class MeetupEditorComponent implements OnInit, OnDestroy { this._meetupEditorService.reset(); } - public onFriendSelected(row: IAutocompleteRow, index: number): void { - this.meetup.friendIds[index] = { friendId: row.id }; + public onFriendSelected(friendId: string, index: number): void { + this.meetup.friendIds[index] = { friendId }; } public removeFriend(index: number): void { @@ -94,19 +90,44 @@ export class MeetupEditorComponent implements OnInit, OnDestroy { this.meetup.friendIds.push({ friendId: "" }); } - public onVenueSelected(row: IAutocompleteRow): void { - this.meetup.venueId = row.id; + public onVenueSelected(venueId: string): void { + this.meetup.venueId = venueId; + } + + public onTalkSelected(talkId: string, index: number): void { + this.meetup.sessions[index] = Object.assign( + {}, + this.meetup.sessions[index], + { + talkId, + }, + ); + } + + public onRemoveSession(index: number): void { + this.meetup.sessions.splice(index, 1); } - // public onTalkSelected(row: IAutocompleteRow, index: number): void { - // this.meetup.talkIds[index] = { talkId: row.id }; - // } + public tryFillEndTime(session: ISession): void { + if (session.startTime && !session.endTime) { + session.endTime = session.startTime.clone().add(1, "hour"); + } + } - // public removeTalk(index: number): void { - // this.meetup.talkIds.splice(index, 1); - // } + public addSession(): void { + let startTime: Moment | undefined; + if (this.meetup.sessions.length > 0) { + const lastSession = this.meetup.sessions[this.meetup.sessions.length - 1]; + if (lastSession.endTime) { + startTime = lastSession.endTime.clone().add(30, "minutes"); + } + } - // public addTalk(): void { - // this.meetup.talkIds.push({ talkId: "" }); - // } + let endTime: Moment | undefined; + if (startTime) { + endTime = startTime.clone().add(1, "hour"); + } + + this.meetup.sessions.push({ talkId: "", startTime, endTime }); + } } diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.module.ts b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.module.ts index 136917c..ccfbba1 100644 --- a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.module.ts +++ b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.module.ts @@ -1,24 +1,38 @@ import { CommonModule } from "@angular/common"; import { NgModule } from "@angular/core"; import { FormsModule, ReactiveFormsModule } from "@angular/forms"; -import { MatButtonModule, MatCardModule, MatFormFieldModule, MatIconModule, MatInputModule } from "@angular/material"; +import { + MAT_DATE_LOCALE, + MatButtonModule, + MatCardModule, + MatDatepickerModule, + MatFormFieldModule, + MatIconModule, + MatInputModule, + MatSelectModule, +} from "@angular/material"; import { RouterModule } from "@angular/router"; import { CoreModule } from "@dotnetru/core"; import { FriendListModule } from "@dotnetru/friend-list"; import { TalkListModule } from "@dotnetru/talk-list"; import { VenueListModule } from "@dotnetru/venue-list"; +import { MatDatetimepickerModule } from "@mat-datetimepicker/core"; +import { MatMomentDatetimeModule } from "@mat-datetimepicker/moment"; import { MeetupEditorComponent } from "./meetup-editor.component"; +import { SessionEditorComponent } from "./session-editor.component"; @NgModule({ declarations: [ MeetupEditorComponent, + SessionEditorComponent, ], entryComponents: [ MeetupEditorComponent, ], exports: [ MeetupEditorComponent, + SessionEditorComponent, ], imports: [ RouterModule.forChild([ @@ -30,16 +44,24 @@ import { MeetupEditorComponent } from "./meetup-editor.component"; FormsModule, ReactiveFormsModule, + MatDatepickerModule, + MatMomentDatetimeModule, + MatDatetimepickerModule, + MatButtonModule, MatCardModule, MatFormFieldModule, MatIconModule, MatInputModule, + MatSelectModule, CoreModule, FriendListModule, VenueListModule, TalkListModule, ], + providers: [ + { provide: MAT_DATE_LOCALE, useValue: "ru-RU" }, + ], }) export class MeetupEditorModule { } diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.service.ts b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.service.ts index 9dc3d86..2314149 100644 --- a/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.service.ts +++ b/DevActivator/ClientApp/app/pages/meetup-editor/meetup-editor.service.ts @@ -1,13 +1,20 @@ import { Injectable } from "@angular/core"; import { Router } from "@angular/router"; -import { API_ENDPOINTS, HttpService, LayoutService } from "@dotnetru/core"; +import { API_ENDPOINTS, DateConverterService, HttpService, LayoutService } from "@dotnetru/core"; import { BehaviorSubject, Observable } from "rxjs"; import { filter, map } from "rxjs/operators"; -import { IMeetup } from "./interfaces"; +import { IApiMeetup, IApiSession, IMeetup, ISession } from "./interfaces"; @Injectable() export class MeetupEditorService { + public static toMeetup = (meetup: IApiMeetup): IMeetup => Object.assign({}, meetup, { + sessions: meetup.sessions.map((x: IApiSession) => Object.assign({}, x, { + endTime: DateConverterService.toMoment(x.endTime), + startTime: DateConverterService.toMoment(x.startTime), + })), + }) + private _meetup$: BehaviorSubject = new BehaviorSubject(null); private _dataStore = { meetup: {} as IMeetup, @@ -31,19 +38,20 @@ export class MeetupEditorService { } public fetchMeetup(meetupId: string): void { - this._httpService.get( + this._httpService.get( API_ENDPOINTS.getMeetupUrl.replace("{{meetupId}}", meetupId), - (meetup: IMeetup) => { - this._dataStore.meetup = meetup; + (meetup: IApiMeetup) => { + this._dataStore.meetup = MeetupEditorService.toMeetup(meetup); this._meetup$.next(Object.assign({}, this._dataStore.meetup)); }); } public addMeetup(meetup: IMeetup): void { - this._httpService.post( + const data: IApiMeetup = this.toApiMeetup(meetup); + this._httpService.post( API_ENDPOINTS.addMeetupUrl, - meetup, - (x: IMeetup) => { + data, + (x: IApiMeetup) => { this._layoutService.showInfo("Доклад добавлен успешно"); this._router.navigateByUrl(`meetup-editor${meetup ? `/${meetup.id}` : ""}`); }, @@ -51,12 +59,13 @@ export class MeetupEditorService { } public updateMeetup(meetup: IMeetup): void { - this._httpService.post( + const data: IApiMeetup = this.toApiMeetup(meetup); + this._httpService.post( API_ENDPOINTS.updateMeetupUrl, - meetup, - (x: IMeetup) => { + data, + (x: IApiMeetup) => { this._layoutService.showInfo("Доклад изменён успешно"); - this._dataStore.meetup = x; + this._dataStore.meetup = MeetupEditorService.toMeetup(x); this._meetup$.next(Object.assign({}, this._dataStore.meetup)); }, ); @@ -65,4 +74,15 @@ export class MeetupEditorService { public reset(): void { this._meetup$.next(Object.assign({}, this._dataStore.meetup)); } + + private toApiMeetup(meetup: IMeetup): IApiMeetup { + const res = Object.assign({}, meetup, { + sessions: meetup.sessions.map((x: ISession) => Object.assign({}, x, { + endTime: x.endTime ? DateConverterService.toApiString(x.endTime) : "", + startTime: x.startTime ? DateConverterService.toApiString(x.startTime) : "", + })), + }); + + return res; + } } diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.css b/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.css new file mode 100644 index 0000000..f95bd19 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.css @@ -0,0 +1,3 @@ +.mat-form-field { + width: 100%; +} \ No newline at end of file diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.html b/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.html new file mode 100644 index 0000000..f4eb5cd --- /dev/null +++ b/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.html @@ -0,0 +1,51 @@ + + + + Время начала + + + + + + + Время окончания + + + + + +
+ +
\ No newline at end of file diff --git a/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.ts b/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.ts new file mode 100644 index 0000000..6741523 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/meetup-editor/session-editor.component.ts @@ -0,0 +1,61 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Output } from "@angular/core"; +import { MatDialog } from "@angular/material"; +import { ITalk, TalkEditorDialogComponent } from "@dotnetru/pages/talk-editor"; +import { IAutocompleteRow } from "@dotnetru/shared/autocomplete"; + +import { ISession } from "./interfaces"; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + selector: "mtp-session-editor", + styleUrls: ["./session-editor.component.css"], + templateUrl: "./session-editor.component.html", +}) +export class SessionEditorComponent { + @Input() public title: string = ""; + + @Input() + public get session(): ISession { + return this._session; + } + public set session(value: ISession) { + this._session = value; + } + + @Output() public readonly talkSelected = new EventEmitter(); + @Output() public readonly removeSession = new EventEmitter(); + + private _session: ISession = { talkId: "" }; + + constructor( + private _dialog: MatDialog, + private _changeDetectorRef: ChangeDetectorRef, + ) { } + + public onTalkSelected(row: IAutocompleteRow): void { + this.talkSelected.emit(row.id); + } + + public onRemoveSession(): void { + this.removeSession.emit(); + } + + public tryFillEndTime(): void { + if (this.session.startTime && !this.session.endTime) { + this.session.endTime = this.session.startTime.clone().add(1, "hour"); + } + } + + public createTalk(): void { + const dialogRef = this._dialog.open(TalkEditorDialogComponent, { + panelClass: "full-height", + width: "640px", + }); + + dialogRef.afterClosed().subscribe((talk?: ITalk) => { + if (talk && talk.id) { + this.talkSelected.emit(talk.id); + } + }); + } +} diff --git a/DevActivator/ClientApp/app/pages/search/search.component.html b/DevActivator/ClientApp/app/pages/search/search.component.html index 878eb26..968c149 100644 --- a/DevActivator/ClientApp/app/pages/search/search.component.html +++ b/DevActivator/ClientApp/app/pages/search/search.component.html @@ -15,4 +15,8 @@ + +
\ No newline at end of file diff --git a/DevActivator/ClientApp/app/pages/search/search.component.ts b/DevActivator/ClientApp/app/pages/search/search.component.ts index 54a3220..9052812 100644 --- a/DevActivator/ClientApp/app/pages/search/search.component.ts +++ b/DevActivator/ClientApp/app/pages/search/search.component.ts @@ -28,16 +28,16 @@ export class SearchPageComponent { this._router.navigateByUrl(`talk-creator`); } - public onVenueSelected(venue: IAutocompleteRow): void { - this._router.navigateByUrl(`venue-editor/${venue.id}`); + public onVenueSelected(venueId: string): void { + this._router.navigateByUrl(`venue-editor/${venueId}`); } public addVenue(): void { this._router.navigateByUrl(`venue-creator`); } - public onFriendSelected(friend: IAutocompleteRow): void { - this._router.navigateByUrl(`friend-editor/${friend.id}`); + public onFriendSelected(friendId: string): void { + this._router.navigateByUrl(`friend-editor/${friendId}`); } public addFriend(): void { @@ -51,4 +51,13 @@ export class SearchPageComponent { public addMeetup(): void { this._router.navigateByUrl(`meetup-creator`); } + + public addTimepad(): void { + this._router.navigateByUrl(`timepad`); + } + + public onTimepadSelected(meetup: IAutocompleteRow): void { + this._router.navigateByUrl(`timepad/${meetup.id}`); + } + } diff --git a/DevActivator/ClientApp/app/pages/speaker-editor/index.ts b/DevActivator/ClientApp/app/pages/speaker-editor/index.ts index 50b8119..8f9e139 100644 --- a/DevActivator/ClientApp/app/pages/speaker-editor/index.ts +++ b/DevActivator/ClientApp/app/pages/speaker-editor/index.ts @@ -1 +1,3 @@ +export { ISpeaker } from "./interfaces"; export { SpeakerEditorModule } from "./speaker-editor.module"; +export { SpeakerEditorDialogComponent } from "./speaker-editor-dialog.component"; diff --git a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor-dialog.component.ts b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor-dialog.component.ts new file mode 100644 index 0000000..8d6a937 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor-dialog.component.ts @@ -0,0 +1,38 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from "@angular/core"; +import { MatDialogRef } from "@angular/material"; +import { ActivatedRoute, Router } from "@angular/router"; +import { LayoutService } from "@dotnetru/core"; +import { ISpeaker } from "./interfaces"; +import { SpeakerEditorComponent } from "./speaker-editor.component"; +import { SpeakerEditorService } from "./speaker-editor.service"; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [SpeakerEditorService], + selector: "mtp-speaker-editor-dialog", + styleUrls: ["./speaker-editor.component.css"], + templateUrl: "./speaker-editor.component.html", +}) +export class SpeakerEditorDialogComponent extends SpeakerEditorComponent { + constructor( + private _dialogRef: MatDialogRef, + speakerEditorService: SpeakerEditorService, + layoutService: LayoutService, + activatedRoute: ActivatedRoute, + router: Router, + changeDetectorRef: ChangeDetectorRef, + ) { + super(speakerEditorService, layoutService, activatedRoute, router, changeDetectorRef); + this.isDialog = true; + } + + public save(cb?: (speaker: ISpeaker) => void): void { + super.save((speaker: ISpeaker) => { + this._dialogRef.close(speaker); + }); + } + + public close(): void { + this._dialogRef.close(); + } +} diff --git a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.css b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.css index 03d967c..05e9421 100644 --- a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.css +++ b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.css @@ -1,3 +1,8 @@ +:host { + display: block; + height: 100%; +} + .mat-form-field { width: 100%; margin: 0 auto; diff --git a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.html b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.html index a160c18..028168a 100644 --- a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.html +++ b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.component.html @@ -3,29 +3,33 @@
{{ speaker.lastUpdateDate | json }}
-
- - - +
+ {{ editMode ? 'Редактирование' : 'Добавление' }} докладчика +
+ + + +
0; + this._speakerEditorService.fetchSpeaker(this._speakerId); + } + + @Output() public readonly saved: EventEmitter = new EventEmitter(); + // todo: create service method getDefaultSpeaker public speaker: ISpeaker = { - companyName: "test company name", - description: "test description", - id: "Test-Id", - name: "Test Name", + companyName: "", + description: "", + id: "", + name: "", }; - public editMode: boolean = true; + public editMode: boolean = false; + + protected isDialog: boolean = false; + private _speakerId?: string; private _subs: Subscription[] = []; constructor( @@ -43,11 +53,9 @@ export class SpeakerEditorComponent implements OnInit, OnDestroy { public ngOnInit(): void { this._subs = [ this._activatedRoute.params - .subscribe((params) => { - if (typeof params.speakerId === "string" && params.speakerId.length > 0) { - this._speakerEditorService.fetchSpeaker(params.speakerId); - } else { - this.editMode = false; + .subscribe((params: Params) => { + if (typeof params.speakerId === "string") { + this.speakerId = params.speakerId; } }), this._speakerEditorService.speaker$ @@ -62,19 +70,16 @@ export class SpeakerEditorComponent implements OnInit, OnDestroy { this._subs.forEach((x) => x.unsubscribe); } - public goBack(): void { - if (!this._speakerEditorService.hasChanges(this.speaker)) { - this._router.navigateByUrl("/speaker-list"); - } else { - this._layoutService.showWarning("Потеря введенных данных предотвращена"); - } - } - - public save(): void { + public save(cb?: (speaker: ISpeaker) => void): void { if (this.editMode) { - this._speakerEditorService.updateSpeaker(this.speaker); + this._speakerEditorService.updateSpeaker(this.speaker, () => { + this.saved.emit(this.speaker); + }); } else { - this._speakerEditorService.addSpeaker(this.speaker); + cb = cb || ((speaker: ISpeaker) => { + this._router.navigateByUrl(`speaker-editor${speaker ? `/${speaker.id}` : ""}`); + }); + this._speakerEditorService.addSpeaker(this.speaker, cb); } } @@ -82,6 +87,10 @@ export class SpeakerEditorComponent implements OnInit, OnDestroy { this._speakerEditorService.reset(); } + public close(): void { + console.warn(`${this.constructor.name} => close`); + } + public onFilesAccepted(files: IAcceptedFile[]): void { for (const acceptedFile of files) { this._speakerEditorService.storeSpeakerAvatar(this.speaker.id, acceptedFile.file); diff --git a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.module.ts b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.module.ts index 2e75663..9c5f376 100644 --- a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.module.ts +++ b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.module.ts @@ -7,18 +7,22 @@ import { CoreModule } from "@dotnetru/core"; import { FileDialogModule } from "@dotnetru/shared/file-dialog"; import { SpeakerImageUrlPipe } from "./pipes"; +import { SpeakerEditorDialogComponent } from "./speaker-editor-dialog.component"; import { SpeakerEditorComponent } from "./speaker-editor.component"; @NgModule({ declarations: [ SpeakerEditorComponent, + SpeakerEditorDialogComponent, SpeakerImageUrlPipe, ], entryComponents: [ SpeakerEditorComponent, + SpeakerEditorDialogComponent, ], exports: [ SpeakerEditorComponent, + SpeakerImageUrlPipe, ], imports: [ RouterModule.forChild([ @@ -39,5 +43,4 @@ import { SpeakerEditorComponent } from "./speaker-editor.component"; FileDialogModule, ], }) -export class SpeakerEditorModule { -} +export class SpeakerEditorModule { } diff --git a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.service.ts b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.service.ts index 9b74af4..2081ae6 100644 --- a/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.service.ts +++ b/DevActivator/ClientApp/app/pages/speaker-editor/speaker-editor.service.ts @@ -1,5 +1,4 @@ import { Injectable } from "@angular/core"; -import { Router } from "@angular/router"; import { API_ENDPOINTS, HttpService, LayoutService } from "@dotnetru/core"; import { BehaviorSubject, Observable } from "rxjs"; import { filter, map } from "rxjs/operators"; @@ -23,7 +22,6 @@ export class SpeakerEditorService { constructor( private _layoutService: LayoutService, private _httpService: HttpService, - private _router: Router, ) { } public hasChanges(speaker: ISpeaker): boolean { @@ -39,25 +37,26 @@ export class SpeakerEditorService { }); } - public addSpeaker(speaker: ISpeaker): void { + public addSpeaker(speaker: ISpeaker, cb: (speaker: ISpeaker) => void): void { this._httpService.post( API_ENDPOINTS.addSpeakerUrl, speaker, - (x: ISpeaker) => { - this._layoutService.showInfo("Спикер добавлен успешно"); - this._router.navigateByUrl(`speaker-editor${speaker ? `/${speaker.id}` : ""}`); + (res: ISpeaker) => { + this._layoutService.showInfo("Докладчик добавлен успешно"); + cb(res); }, ); } - public updateSpeaker(speaker: ISpeaker): void { + public updateSpeaker(speaker: ISpeaker, cb: () => void): void { this._httpService.post( API_ENDPOINTS.updateSpeakerUrl, speaker, (x: ISpeaker) => { - this._layoutService.showInfo("Спикер изменён успешно"); + this._layoutService.showInfo("Докладчик изменён успешно"); this._dataStore.speaker = x; this._speaker$.next(Object.assign({}, this._dataStore.speaker)); + cb(); }, ); } diff --git a/DevActivator/ClientApp/app/pages/talk-editor/index.ts b/DevActivator/ClientApp/app/pages/talk-editor/index.ts index 9d3b607..b659367 100644 --- a/DevActivator/ClientApp/app/pages/talk-editor/index.ts +++ b/DevActivator/ClientApp/app/pages/talk-editor/index.ts @@ -1 +1,3 @@ +export { ITalk } from "./interfaces"; +export { TalkEditorDialogComponent } from "./talk-editor-dialog.component"; export { TalkEditorModule } from "./talk-editor.module"; diff --git a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor-dialog.component.ts b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor-dialog.component.ts new file mode 100644 index 0000000..721685b --- /dev/null +++ b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor-dialog.component.ts @@ -0,0 +1,39 @@ +import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from "@angular/core"; +import { MatDialog, MatDialogRef } from "@angular/material"; +import { ActivatedRoute, Router } from "@angular/router"; +import { LayoutService } from "@dotnetru/core"; +import { ITalk } from "./interfaces"; +import { TalkEditorComponent } from "./talk-editor.component"; +import { TalkEditorService } from "./talk-editor.service"; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [TalkEditorService], + selector: "mtp-talk-editor-dialog", + styleUrls: ["./talk-editor.component.css"], + templateUrl: "./talk-editor.component.html", +}) +export class TalkEditorDialogComponent extends TalkEditorComponent { + constructor( + private _dialogRef: MatDialogRef, + talkEditorService: TalkEditorService, + layoutService: LayoutService, + dialog: MatDialog, + activatedRoute: ActivatedRoute, + router: Router, + changeDetectorRef: ChangeDetectorRef, + ) { + super(talkEditorService, layoutService, dialog, activatedRoute, router, changeDetectorRef); + this.isDialog = true; + } + + public save(cb?: (talk: ITalk) => void): void { + super.save((talk: ITalk) => { + this._dialogRef.close(talk); + }); + } + + public close(): void { + this._dialogRef.close(); + } +} diff --git a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.html b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.html index ca913fd..af61062 100644 --- a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.html +++ b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.html @@ -1,29 +1,33 @@ -
- - - +
+ {{ editMode ? 'Редактирование' : 'Добавление' }} доклада +
+ + + +
@@ -63,22 +67,31 @@ - +
+ + +
diff --git a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.ts b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.ts index cc4b193..a66d8a0 100644 --- a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.ts +++ b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.component.ts @@ -1,9 +1,10 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnDestroy, OnInit, Output } from "@angular/core"; +import { MatDialog } from "@angular/material"; import { ActivatedRoute, Params, Router } from "@angular/router"; -import { FILE_SIZES, LABELS, LayoutService, MIME_TYPES, PATTERNS } from "@dotnetru/core"; +import { LABELS, LayoutService, PATTERNS } from "@dotnetru/core"; +import { ISpeaker, SpeakerEditorDialogComponent } from "@dotnetru/pages/speaker-editor"; import { IAutocompleteRow } from "@dotnetru/shared/autocomplete"; import { Subscription } from "rxjs"; - import { ITalk } from "./interfaces"; import { TalkEditorService } from "./talk-editor.service"; @@ -18,16 +19,33 @@ export class TalkEditorComponent implements OnInit, OnDestroy { public readonly LABELS = LABELS; public readonly PATTERNS = PATTERNS; + @Input() public set talkId(value: string) { + this._talkId = value; + this.editMode = typeof this._talkId === "string" && this._talkId.length > 0; + this._talkEditorService.fetchTalk(this._talkId); + } + + @Output() public readonly saved: EventEmitter = new EventEmitter(); + // todo: create service method getDefaultTalk - public talk: ITalk = { id: "", speakerIds: [], title: "", description: "" }; + public talk: ITalk = { + description: "", + id: "", + speakerIds: [], + title: "", + }; - public editMode: boolean = true; + public editMode: boolean = false; + protected isDialog: boolean = false; + + private _talkId?: string; private _subs: Subscription[] = []; constructor( private _talkEditorService: TalkEditorService, private _layoutService: LayoutService, + private _dialog: MatDialog, private _activatedRoute: ActivatedRoute, private _router: Router, private _changeDetectorRef: ChangeDetectorRef, @@ -37,10 +55,8 @@ export class TalkEditorComponent implements OnInit, OnDestroy { this._subs = [ this._activatedRoute.params .subscribe((params: Params) => { - if (typeof params.talkId === "string" && params.talkId.length > 0) { - this._talkEditorService.fetchTalk(params.talkId); - } else { - this.editMode = false; + if (typeof params.talkId === "string") { + this.talkId = params.talkId; } }), this._talkEditorService.talk$ @@ -55,19 +71,16 @@ export class TalkEditorComponent implements OnInit, OnDestroy { this._subs.forEach((x) => x.unsubscribe); } - public goBack(): void { - if (!this._talkEditorService.hasChanges(this.talk)) { - this._router.navigateByUrl("/talk-list"); - } else { - this._layoutService.showWarning("Потеря введенных данных предотвращена"); - } - } - - public save(): void { + public save(cb?: (talk: ITalk) => void): void { if (this.editMode) { - this._talkEditorService.updateTalk(this.talk); + this._talkEditorService.updateTalk(this.talk, () => { + this.saved.emit(this.talk); + }); } else { - this._talkEditorService.addTalk(this.talk); + cb = cb || ((talk: ITalk) => { + this._router.navigateByUrl(`talk-editor${talk ? `/${talk.id}` : ""}`); + }); + this._talkEditorService.addTalk(this.talk, cb); } } @@ -75,6 +88,10 @@ export class TalkEditorComponent implements OnInit, OnDestroy { this._talkEditorService.reset(); } + public close(): void { + console.warn(`${this.constructor.name} => close`); + } + public onSpeakerSelected(row: IAutocompleteRow, index: number): void { this.talk.speakerIds[index] = { speakerId: row.id }; } @@ -86,4 +103,18 @@ export class TalkEditorComponent implements OnInit, OnDestroy { public addSpeaker(): void { this.talk.speakerIds.push({ speakerId: "" }); } + + public createSpeaker(): void { + const dialogRef = this._dialog.open(SpeakerEditorDialogComponent, { + panelClass: "full-height", + width: "640px", + }); + + dialogRef.afterClosed().subscribe((speaker?: ISpeaker) => { + if (speaker && speaker.id) { + this.talk.speakerIds.push({ speakerId: speaker.id }); + this._changeDetectorRef.detectChanges(); + } + }); + } } diff --git a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.module.ts b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.module.ts index 0ef641c..afebdc0 100644 --- a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.module.ts +++ b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.module.ts @@ -4,19 +4,24 @@ import { FormsModule, ReactiveFormsModule } from "@angular/forms"; import { MatButtonModule, MatCardModule, MatFormFieldModule, MatIconModule, MatInputModule } from "@angular/material"; import { RouterModule } from "@angular/router"; import { CoreModule } from "@dotnetru/core"; +import { SpeakerEditorModule } from "@dotnetru/pages/speaker-editor"; import { SpeakerListModule } from "@dotnetru/speaker-list"; +import { TalkEditorDialogComponent } from "./talk-editor-dialog.component"; import { TalkEditorComponent } from "./talk-editor.component"; @NgModule({ declarations: [ TalkEditorComponent, + TalkEditorDialogComponent, ], entryComponents: [ TalkEditorComponent, + TalkEditorDialogComponent, ], exports: [ TalkEditorComponent, + TalkEditorDialogComponent, ], imports: [ RouterModule.forChild([ @@ -36,6 +41,7 @@ import { TalkEditorComponent } from "./talk-editor.component"; CoreModule, SpeakerListModule, + SpeakerEditorModule, ], }) export class TalkEditorModule { } diff --git a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.service.ts b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.service.ts index 7fdd94b..80ae7d0 100644 --- a/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.service.ts +++ b/DevActivator/ClientApp/app/pages/talk-editor/talk-editor.service.ts @@ -1,5 +1,4 @@ import { Injectable } from "@angular/core"; -import { Router } from "@angular/router"; import { API_ENDPOINTS, HttpService, LayoutService } from "@dotnetru/core"; import { BehaviorSubject, Observable } from "rxjs"; import { filter, map } from "rxjs/operators"; @@ -23,7 +22,6 @@ export class TalkEditorService { constructor( private _layoutService: LayoutService, private _httpService: HttpService, - private _router: Router, ) { } public hasChanges(talk: ITalk): boolean { @@ -39,18 +37,18 @@ export class TalkEditorService { }); } - public addTalk(talk: ITalk): void { + public addTalk(talk: ITalk, cb: (res: ITalk) => void): void { this._httpService.post( API_ENDPOINTS.addTalkUrl, talk, - (x: ITalk) => { + (res: ITalk) => { this._layoutService.showInfo("Доклад добавлен успешно"); - this._router.navigateByUrl(`talk-editor${talk ? `/${talk.id}` : ""}`); + cb(res); }, ); } - public updateTalk(talk: ITalk): void { + public updateTalk(talk: ITalk, cb: () => void): void { this._httpService.post( API_ENDPOINTS.updateTalkUrl, talk, @@ -58,6 +56,7 @@ export class TalkEditorService { this._layoutService.showInfo("Доклад изменён успешно"); this._dataStore.talk = x; this._talk$.next(Object.assign({}, this._dataStore.talk)); + cb(); }, ); } diff --git a/DevActivator/ClientApp/app/pages/timepad/index.ts b/DevActivator/ClientApp/app/pages/timepad/index.ts new file mode 100644 index 0000000..cfaf432 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/index.ts @@ -0,0 +1 @@ +export { TimepadModule } from "./timepad.module"; diff --git a/DevActivator/ClientApp/app/pages/timepad/interfaces.ts b/DevActivator/ClientApp/app/pages/timepad/interfaces.ts new file mode 100644 index 0000000..dc65fc4 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/interfaces.ts @@ -0,0 +1,35 @@ +import { IFriend } from "../friend-editor/interfaces"; +import { Community } from "../meetup-editor/enums"; +import { IApiSession, ISession } from "../meetup-editor/interfaces"; +import { ISpeaker } from "../speaker-editor/interfaces"; +import { ITalk } from "../talk-editor/interfaces"; +import { IVenue } from "../venue-editor/interfaces"; + +export interface IMap { + [key: string]: T; +} + +export interface ICompositeMeetup { + id: string | undefined; + name: string | undefined; + communityId: Community | undefined; + venue: IVenue | undefined; + sessions: ISession[]; + talks: IMap; + speakers: IMap; + friends: IFriend[]; +} + +export type IApiCompositeMeetup = ICompositeMeetup & { + sessions: IApiSession[]; +}; + +export interface IRandomConcatModel { + name: string | undefined; + communityId: string | undefined; + venueId: string | undefined; + friendIds: string[]; + sessions: ISession[]; + talkIds: string[]; + speakerIds: string[]; +} diff --git a/DevActivator/ClientApp/app/pages/timepad/timepad.component.css b/DevActivator/ClientApp/app/pages/timepad/timepad.component.css new file mode 100644 index 0000000..ba989cf --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/timepad.component.css @@ -0,0 +1,70 @@ +:host { + display: block; + height: 100%; +} + +.save-action { + height: 36px; + padding-bottom: 4px; + display: flex; + justify-content: flex-end; + max-width: 640px; + width: 100%; + margin: 0 auto; +} + +.container { + max-width: 640px; + margin: 0 auto; + height: calc(100% - 40px); + overflow: auto; +} + +.mat-list-item { + height: auto !important; + padding: 12px 0 !important; +} + +.session-content, +.friend-content { + display: flex; + align-items: center; + padding: 8px 0; + justify-content: space-between; +} + +.nowrap { + white-space: nowrap; +} + +.session-description { + padding-left: 8px; +} + +h3, +p { + white-space: pre-wrap; + font-family: Roboto, "Helvetica Neue", sans-serif; +} + +.about { + display: flex; +} + +.avatar { + max-width: 200px; +} + +.mat-expansion-panel-header-title { + flex-direction: column; +} + +.handle { + padding-right: 4px; +} + +.header { + height: 40px; + display: flex; + align-items: center; +} \ No newline at end of file diff --git a/DevActivator/ClientApp/app/pages/timepad/timepad.component.html b/DevActivator/ClientApp/app/pages/timepad/timepad.component.html new file mode 100644 index 0000000..dab6ab7 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/timepad.component.html @@ -0,0 +1,284 @@ +
+ +
+ {{ editMode ? 'Редактирование' : 'Добавление' }} встречи +
+ + + + + {{ LABELS.IDENTITY | requiredErrorMessage }} + + + {{ PATTERNS.IDENTITY | patternErrorMessage }} + + + + + + + {{ LABELS.TITLE | requiredErrorMessage }} + + + {{ PATTERNS.REQUIRED_STRING | patternErrorMessage }} + + + + +

Сообщество

+ + + + {{ Community[community] }} + + + + + +

+ Площадка + +

+ + + + + + +

Друзья

+ + + + + + + +
+ + + + + + + + + + «{{ friend.name }}» + + + public + На сайт + + + + + + +
+
+ +
+ + +
+ +
+ +
+ +
+
+
+ + + +

Программа встречи

+ + + + + + + +
+ + + + + + + + + + {{ session.startTime | datetime : timeFormat }} + - + {{ session.endTime | datetime : timeFormat }} + + + + + {{ speakers[ref.speakerId].name }} + ({{ speakers[ref.speakerId].companyName }}) + + «{{ talks[session.talkId].title }}» + + + + +
+
+
+ + + + + +
+ +
+ +
+ + + +

Доклады

+ + + + + + + + + +

{{ sessionIx + 1 }}. «{{ talk.title }}»

+

{{ talk.description }}

+
+
+ + + + + +
+ + + + + + + +

{{ speaker.name }}

+
+
+ +
+

{{ speaker.description }}

+
+
+
+ + + + + +
+ +
+
+
+
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/DevActivator/ClientApp/app/pages/timepad/timepad.component.ts b/DevActivator/ClientApp/app/pages/timepad/timepad.component.ts new file mode 100644 index 0000000..3ad9de0 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/timepad.component.ts @@ -0,0 +1,231 @@ +import { CdkDragDrop, moveItemInArray } from "@angular/cdk/drag-drop"; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnDestroy, OnInit } from "@angular/core"; +import { MatDialog, MatDialogConfig } from "@angular/material"; +import { ActivatedRoute, Params } from "@angular/router"; +import { DateConverterService, LABELS, PATTERNS } from "@dotnetru/core"; +import { Moment } from "moment"; +import { Subscription } from "rxjs"; + +import { FriendEditorService } from "../friend-editor/friend-editor.service"; +import { IFriend } from "../friend-editor/interfaces"; +import { COMMUNITIES } from "../meetup-editor/constants"; +import { Community } from "../meetup-editor/enums"; +import { ISession } from "../meetup-editor/interfaces"; +import { ISpeaker } from "../speaker-editor/interfaces"; +import { ITalk } from "../talk-editor/interfaces"; +import { VenueEditorDialogComponent } from "../venue-editor"; +import { IVenue } from "../venue-editor/interfaces"; +import { ICompositeMeetup, IMap, IRandomConcatModel } from "./interfaces"; +import { CompositeService } from "./timepad.service"; + +// todo: regular service method +const DEFAULT_VENUE: IVenue = {} as IVenue; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [CompositeService], + selector: "mtp-timepad", + styleUrls: ["timepad.component.css"], + templateUrl: "timepad.component.html", +}) +export class TimepadComponent implements OnInit, OnDestroy { + public readonly Community = Community; + public readonly COMMUNITIES = COMMUNITIES; + public readonly LABELS = LABELS; + public readonly PATTERNS = PATTERNS; + public readonly timeFormat: string = "HH:mm"; + + public editMode: boolean = true; + + public name: string | undefined = undefined; + public communityId: Community | undefined; + public venue: IVenue = Object.assign({}, DEFAULT_VENUE); + public sessions: ISession[] = []; + public talks: IMap = {}; + public speakers: IMap = {}; + public friends: IFriend[] = []; + + @Input() + get meetupId() { + return this._meetupId || ""; + } + set meetupId(value: string) { + this._meetupId = value; + if (this.editMode) { + this._compositeService.fetchMeetup(this._meetupId, this.descriptor); + } + } + + private _meetupId?: string; + private _subs: Subscription[] = []; + + private get descriptor(): IRandomConcatModel { + return { + name: this.name, + communityId: String(this.communityId || ""), + venueId: this.venue ? this.venue.id : undefined, + friendIds: this.friends.map((x) => x.id), + sessions: this.sessions.map((x) => Object.assign({}, x, { + endTime: x.endTime ? DateConverterService.toApiString(x.endTime) : "", + startTime: x.startTime ? DateConverterService.toApiString(x.startTime) : "", + })), + speakerIds: Object.keys(this.speakers), + talkIds: Object.keys(this.talks), + }; + } + + constructor( + private _dialog: MatDialog, + private _compositeService: CompositeService, + private _activatedRoute: ActivatedRoute, + private _changeDetectorRef: ChangeDetectorRef, + ) { } + + public ngOnInit(): void { + this._subs = [ + this._activatedRoute.params + .subscribe((params: Params) => { + this.editMode = typeof params.meetupId === "string" && params.meetupId.length > 0; + if (this.editMode) { + this.meetupId = params.meetupId; + } + }), + this._compositeService.meetup$ + .subscribe((data: ICompositeMeetup) => { + this._meetupId = data.id; + this.name = data.name; + this.communityId = data.communityId; + this.venue = data.venue || Object.assign({}, DEFAULT_VENUE); + this.sessions = data.sessions; + this.talks = data.talks; + this.speakers = data.speakers; + this.friends = data.friends; + this._changeDetectorRef.detectChanges(); + }), + ]; + } + + public ngOnDestroy(): void { + this._subs.forEach((x) => x.unsubscribe); + } + + public save(): void { + this._compositeService.saveMeetup(this._meetupId, this.descriptor); + } + + public addSession(talkId: string = ""): void { + // todo: remove code duplication, see meetup-editor.component.ts + let startTime: Moment | undefined; + if (this.sessions.length > 0) { + const lastSession = this.sessions[this.sessions.length - 1]; + if (lastSession.endTime) { + startTime = lastSession.endTime.clone().add(30, "minutes"); + } + } + + let endTime: Moment | undefined; + if (startTime) { + endTime = startTime.clone().add(1, "hour"); + } + + this.sessions.push({ talkId, startTime, endTime }); + } + + public deleteSession(index: number): void { + this.sessions.splice(index, 1); + } + + public onTalkSelected(talkId: string, index: number): void { + const descriptor = this.descriptor; + if (descriptor.talkIds.some((x) => x === talkId)) { + this.sessions[index].talkId = talkId; + } else { + descriptor.talkIds.push(talkId); + this._compositeService.fetchMeetup(this._meetupId, descriptor, () => { + const session: ISession | undefined = this.sessions[index]; + if (session) { + this.sessions[index] = Object.assign({}, session, { talkId }); + } else { + this.addSession(talkId); + } + }); + } + } + + public onTalkSaved(talk: ITalk): void { + if (talk.speakerIds.some((x) => { + return !this.speakers[x.speakerId]; + })) { + this._compositeService.fetchMeetup(this._meetupId, this.descriptor); + } else { + this.talks[talk.id] = talk; + } + } + + public onSpeakerSaved(speaker: ISpeaker, talk: ITalk): void { + this.speakers[speaker.id] = speaker; + const hasRef = talk.speakerIds.find((x) => x.speakerId === speaker.id); + if (!hasRef) { + talk.speakerIds.push({ speakerId: speaker.id }); + } + } + + public onSessionDrop(event: CdkDragDrop): void { + const tempTalkId: string = this.sessions[event.previousIndex].talkId; + this.sessions[event.previousIndex].talkId = this.sessions[event.currentIndex].talkId; + this.sessions[event.currentIndex].talkId = tempTalkId; + } + + public deleteFriend(ev: Event, index: number): void { + this.friends.splice(index, 1); + } + + public onFriendDrop(event: CdkDragDrop): void { + moveItemInArray(this.friends, event.previousIndex, event.currentIndex); + } + + public onFriendSaved(friend: IFriend, index: number): void { + this.friends[index] = friend; + } + + public onFriendSelected(friendId: string): void { + const descriptor = this.descriptor; + descriptor.friendIds.push(friendId); + this._compositeService.fetchMeetup(this._meetupId, descriptor); + } + + public createFriend(): void { + this.friends.push(FriendEditorService.getDefaultFriend()); + } + + public onVenueSelected(venueId: string): void { + const descriptor = this.descriptor; + descriptor.venueId = venueId; + this._compositeService.fetchMeetup(this._meetupId, descriptor); + } + + public createVenue(): void { + this.openVenueDialog(undefined); + } + + public editVenue(): void { + this.openVenueDialog(this.venue); + } + + private openVenueDialog(data?: IVenue): void { + const config: MatDialogConfig = { + panelClass: "full-height", + width: "640px", + }; + if (data) { + config.data = data; + } + const dialogRef = this._dialog.open(VenueEditorDialogComponent, config); + + dialogRef.afterClosed().subscribe((venue?: IVenue) => { + if (venue && venue.id) { + this.onVenueSelected(venue.id); + } + }); + } +} diff --git a/DevActivator/ClientApp/app/pages/timepad/timepad.module.ts b/DevActivator/ClientApp/app/pages/timepad/timepad.module.ts new file mode 100644 index 0000000..cd9d349 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/timepad.module.ts @@ -0,0 +1,60 @@ +import { DragDropModule } from "@angular/cdk/drag-drop"; +import { CommonModule } from "@angular/common"; +import { NgModule } from "@angular/core"; +import { FormsModule } from "@angular/forms"; +import { + MatButtonModule, + MatExpansionModule, + MatIconModule, + MatInputModule, + MatListModule, + MatSelectModule, +} from "@angular/material"; +import { RouterModule } from "@angular/router"; +import { CoreModule } from "@dotnetru/core"; +import { FriendListModule } from "@dotnetru/friend-list"; +import { FriendEditorModule } from "@dotnetru/pages/friend-editor"; +import { MeetupEditorModule } from "@dotnetru/pages/meetup-editor"; +import { SpeakerEditorModule } from "@dotnetru/pages/speaker-editor"; +import { TalkEditorModule } from "@dotnetru/pages/talk-editor"; +import { VenueEditorModule } from "@dotnetru/pages/venue-editor"; +import { VenueListModule } from "@dotnetru/venue-list"; + +import { TimepadComponent } from "./timepad.component"; + +@NgModule({ + declarations: [ + TimepadComponent, + ], + exports: [ + TimepadComponent, + ], + imports: [ + CommonModule, + FormsModule, + + RouterModule.forChild([ + { path: "timepad", component: TimepadComponent }, + { path: "timepad/:meetupId", component: TimepadComponent }, + ]), + + CoreModule, + + DragDropModule, + MatButtonModule, + MatExpansionModule, + MatIconModule, + MatInputModule, + MatListModule, + MatSelectModule, + + FriendListModule, + FriendEditorModule, + MeetupEditorModule, + SpeakerEditorModule, + TalkEditorModule, + VenueEditorModule, + VenueListModule, + ], +}) +export class TimepadModule { } diff --git a/DevActivator/ClientApp/app/pages/timepad/timepad.service.ts b/DevActivator/ClientApp/app/pages/timepad/timepad.service.ts new file mode 100644 index 0000000..16c3a00 --- /dev/null +++ b/DevActivator/ClientApp/app/pages/timepad/timepad.service.ts @@ -0,0 +1,66 @@ +import { Injectable } from "@angular/core"; +import { API_ENDPOINTS, DateConverterService, HttpService, LayoutService } from "@dotnetru/core"; +import { BehaviorSubject, Observable } from "rxjs"; +import { filter, map } from "rxjs/operators"; +import { IApiSession } from "../meetup-editor/interfaces"; +import { IApiCompositeMeetup, ICompositeMeetup, IRandomConcatModel } from "./interfaces"; + +@Injectable() +export class CompositeService { + public get meetup$(): Observable { + return this._meetup$.pipe( + filter((x) => x !== null), + map((x) => x as ICompositeMeetup), + ); + } + + private _meetup$: BehaviorSubject = new BehaviorSubject(null); + + constructor( + private _layoutService: LayoutService, + private _httpService: HttpService, + ) { } + + public fetchMeetup(meetupId: string | undefined, descriptor: IRandomConcatModel, cb?: () => void): void { + this._httpService.post( + API_ENDPOINTS.getCompositeMeetupUrl.replace("{{meetupId}}", meetupId || ""), + descriptor, + (res: IApiCompositeMeetup) => { + const model: ICompositeMeetup = this.toCompositeMeetup(meetupId, res); + this._meetup$.next(model); + if (cb) { + cb(); + } + }); + } + + public saveMeetup(meetupId: string | undefined, descriptor: IRandomConcatModel, cb?: () => void): void { + this._httpService.post( + API_ENDPOINTS.saveCompositeMeetupUrl.replace("{{meetupId}}", meetupId || ""), + descriptor, + (res: IApiCompositeMeetup) => { + const model: ICompositeMeetup = this.toCompositeMeetup(meetupId, res); + this._layoutService.showInfo("Встреча изменена успешно"); + this._meetup$.next(model); + if (cb) { + cb(); + } + }); + } + + private toCompositeMeetup(meetupId: string | undefined, data: IApiCompositeMeetup): ICompositeMeetup { + return Object.assign({}, { + id: meetupId, + name: data.name, + communityId: data.communityId, + venue: data.venue, + friends: data.friends, + sessions: data.sessions.map((x: IApiSession) => Object.assign({}, x, { + endTime: DateConverterService.toMoment(x.endTime), + startTime: DateConverterService.toMoment(x.startTime), + })), + speakers: data.speakers, + talks: data.talks, + }); + } +} diff --git a/DevActivator/ClientApp/app/pages/venue-editor/index.ts b/DevActivator/ClientApp/app/pages/venue-editor/index.ts index 18c6ae5..c3b0432 100644 --- a/DevActivator/ClientApp/app/pages/venue-editor/index.ts +++ b/DevActivator/ClientApp/app/pages/venue-editor/index.ts @@ -1 +1,2 @@ +export { VenueEditorDialogComponent } from "./venue-editor-dialog.component"; export { VenueEditorModule } from "./venue-editor.module"; diff --git a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor-dialog.component.ts b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor-dialog.component.ts new file mode 100644 index 0000000..44f13fb --- /dev/null +++ b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor-dialog.component.ts @@ -0,0 +1,49 @@ +import { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject } from "@angular/core"; +import { MatDialogRef, MAT_DIALOG_DATA } from "@angular/material"; +import { ActivatedRoute, Router } from "@angular/router"; +import { LayoutService } from "@dotnetru/core"; +import { IVenue } from "./interfaces"; +import { VenueEditorComponent } from "./venue-editor.component"; +import { VenueEditorService } from "./venue-editor.service"; + +@Component({ + changeDetection: ChangeDetectionStrategy.OnPush, + providers: [VenueEditorService], + selector: "mtp-venue-editor-dialog", + styleUrls: ["./venue-editor.component.css"], + templateUrl: "./venue-editor.component.html", +}) +export class VenueEditorDialogComponent extends VenueEditorComponent implements AfterViewInit { + constructor( + private _dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) private _data: IVenue | undefined, + venueEditorService: VenueEditorService, + layoutService: LayoutService, + activatedRoute: ActivatedRoute, + router: Router, + changeDetectorRef: ChangeDetectorRef, + ) { + super(venueEditorService, layoutService, activatedRoute, router, changeDetectorRef); + this.isDialog = true; + } + + public ngAfterViewInit(): void { + // todo: remove code duplication in VenueEditorComponent + // find: this._venueEditorService.venue$ .subscribe( + if (this._data) { + this.venue = this._data; + this.editMode = true; + this._changeDetectorRef.detectChanges(); + } + } + + public save(cb?: (venue: IVenue) => void): void { + super.save((venue: IVenue) => { + this._dialogRef.close(venue); + }); + } + + public close(): void { + this._dialogRef.close(); + } +} diff --git a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.html b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.html index d662050..aeda16d 100644 --- a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.html +++ b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.html @@ -1,29 +1,33 @@ -
- - - +
+ {{ editMode ? 'Редактирование' : 'Добавление' }} площадки +
+ + + +
-
{{ venue | json }}
\ No newline at end of file diff --git a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.ts b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.ts index 1e70231..271a908 100644 --- a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.ts +++ b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.component.ts @@ -1,9 +1,8 @@ -import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from "@angular/core"; +import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, OnDestroy, OnInit, Output } from "@angular/core"; import { ActivatedRoute, Params, Router } from "@angular/router"; -import { FILE_SIZES, LABELS, LayoutService, MIME_TYPES, PATTERNS } from "@dotnetru/core"; +import { LABELS, LayoutService, PATTERNS } from "@dotnetru/core"; import { City } from "@dotnetru/shared/city-select"; import { Subscription } from "rxjs"; - import { IVenue } from "./interfaces"; import { VenueEditorService } from "./venue-editor.service"; @@ -18,11 +17,15 @@ export class VenueEditorComponent implements OnInit, OnDestroy { public readonly LABELS = LABELS; public readonly PATTERNS = PATTERNS; + @Output() public readonly saved: EventEmitter = new EventEmitter(); + // todo: create service method getDefaultVenue public venue: IVenue = { id: "", city: City.Spb, name: "", address: "", mapUrl: "" }; public editMode: boolean = true; + protected isDialog: boolean = false; + private _subs: Subscription[] = []; constructor( @@ -30,7 +33,7 @@ export class VenueEditorComponent implements OnInit, OnDestroy { private _layoutService: LayoutService, private _activatedRoute: ActivatedRoute, private _router: Router, - private _changeDetectorRef: ChangeDetectorRef, + protected _changeDetectorRef: ChangeDetectorRef, ) { } public ngOnInit(): void { @@ -55,19 +58,19 @@ export class VenueEditorComponent implements OnInit, OnDestroy { this._subs.forEach((x) => x.unsubscribe); } - public goBack(): void { - if (!this._venueEditorService.hasChanges(this.venue)) { - this._router.navigateByUrl("/venue-list"); - } else { - this._layoutService.showWarning("Потеря введенных данных предотвращена"); - } - } - - public save(): void { + public save(cb?: (venue: IVenue) => void): void { if (this.editMode) { - this._venueEditorService.updateVenue(this.venue); + this._venueEditorService.updateVenue(this.venue, () => { + this.saved.emit(this.venue); + if (cb) { + cb(this.venue); + } + }); } else { - this._venueEditorService.addVenue(this.venue); + cb = cb || ((venue: IVenue) => { + this._router.navigateByUrl(`venue-editor${venue ? `/${venue.id}` : ""}`); + }); + this._venueEditorService.addVenue(this.venue, cb); } } @@ -75,15 +78,7 @@ export class VenueEditorComponent implements OnInit, OnDestroy { this._venueEditorService.reset(); } - // public onSpeakerSelected(row: IAutocompleteRow, index: number): void { - // this.venue.speakerIds[index] = { speakerId: row.id }; - // } - - // public removeSpeaker(index: number): void { - // this.venue.speakerIds.splice(index, 1); - // } - - // public addSpeaker(): void { - // this.venue.speakerIds.push({ speakerId: "" }); - // } + public close(): void { + console.warn(`${this.constructor.name} => close`); + } } diff --git a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.module.ts b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.module.ts index 4138001..d9de359 100644 --- a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.module.ts +++ b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.module.ts @@ -7,17 +7,21 @@ import { CoreModule } from "@dotnetru/core"; import { CitySelectModule } from "@dotnetru/shared/city-select"; import { SpeakerListModule } from "@dotnetru/speaker-list"; +import { VenueEditorDialogComponent } from "./venue-editor-dialog.component"; import { VenueEditorComponent } from "./venue-editor.component"; @NgModule({ declarations: [ VenueEditorComponent, + VenueEditorDialogComponent, ], entryComponents: [ VenueEditorComponent, + VenueEditorDialogComponent, ], exports: [ VenueEditorComponent, + VenueEditorDialogComponent, ], imports: [ RouterModule.forChild([ diff --git a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.service.ts b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.service.ts index 18ccc4d..22bdaff 100644 --- a/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.service.ts +++ b/DevActivator/ClientApp/app/pages/venue-editor/venue-editor.service.ts @@ -1,5 +1,4 @@ import { Injectable } from "@angular/core"; -import { Router } from "@angular/router"; import { API_ENDPOINTS, HttpService, LayoutService } from "@dotnetru/core"; import { BehaviorSubject, Observable } from "rxjs"; import { filter, map } from "rxjs/operators"; @@ -23,7 +22,6 @@ export class VenueEditorService { constructor( private _layoutService: LayoutService, private _httpService: HttpService, - private _router: Router, ) { } public hasChanges(venue: IVenue): boolean { @@ -39,18 +37,18 @@ export class VenueEditorService { }); } - public addVenue(venue: IVenue): void { + public addVenue(venue: IVenue, cb: (res: IVenue) => void): void { this._httpService.post( API_ENDPOINTS.addVenueUrl, venue, - (x: IVenue) => { + (res: IVenue) => { this._layoutService.showInfo("Площадка добавлена успешно"); - this._router.navigateByUrl(`venue-editor${venue ? `/${venue.id}` : ""}`); + cb(res); }, ); } - public updateVenue(venue: IVenue): void { + public updateVenue(venue: IVenue, cb: () => void): void { this._httpService.post( API_ENDPOINTS.updateVenueUrl, venue, @@ -58,6 +56,7 @@ export class VenueEditorService { this._layoutService.showInfo("Площадка изменена успешно"); this._dataStore.venue = x; this._venue$.next(Object.assign({}, this._dataStore.venue)); + cb(); }, ); } diff --git a/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.html b/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.html index efdf339..46ee22e 100644 --- a/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.html +++ b/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.html @@ -3,6 +3,7 @@ diff --git a/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.ts b/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.ts index 77b5881..81d84d8 100644 --- a/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.ts +++ b/DevActivator/ClientApp/app/shared/autocomplete/autocomplete.component.ts @@ -1,5 +1,6 @@ -import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, ViewChild } from "@angular/core"; +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewChild } from "@angular/core"; import { FormControl } from "@angular/forms"; +import { MatInput } from "@angular/material"; import { Observable } from "rxjs"; import { debounceTime, filter, map } from "rxjs/operators"; @@ -15,10 +16,13 @@ export class AutocompleteComponent { @Input() public iconName: string = ""; @Input() public iconText: string = ""; @Input() public data: IAutocompleteRow[] = []; + @Input() public clearOnSelect: boolean = false; @Output() public readonly selected: EventEmitter = new EventEmitter(); @Output() public readonly iconClicked: EventEmitter = new EventEmitter(); + @ViewChild("queryInput") public queryInput!: MatInput; + public data$: Observable; public queryControl: FormControl; @@ -54,6 +58,17 @@ export class AutocompleteComponent { public onSelected(row: IAutocompleteRow): void { this.queryControl.patchValue(row.name); this.selected.emit(row); + + if (this.clearOnSelect === true) { + this.queryControl.markAsPristine(); + this.queryControl.markAsUntouched(); + + if (this.queryInput) { + this.queryInput.value = ""; + } + + this.queryControl.setValue(null); + } } public onIconClick(): void { diff --git a/DevActivator/ClientApp/app/shared/city-select/city-name.pipe.ts b/DevActivator/ClientApp/app/shared/city-select/city-name.pipe.ts index fc35449..ad5040e 100644 --- a/DevActivator/ClientApp/app/shared/city-select/city-name.pipe.ts +++ b/DevActivator/ClientApp/app/shared/city-select/city-name.pipe.ts @@ -17,6 +17,10 @@ export class CityNamePipe implements PipeTransform { return "Казань"; case City.Nsk: return "Новосибирск"; + case City.Nnv: + return "Нижний Новгород"; + case City.Ufa: + return "Уфа"; } const exhaustingCheck: never = city; diff --git a/DevActivator/ClientApp/app/shared/city-select/constants.ts b/DevActivator/ClientApp/app/shared/city-select/constants.ts index e99537a..78fdfc3 100644 --- a/DevActivator/ClientApp/app/shared/city-select/constants.ts +++ b/DevActivator/ClientApp/app/shared/city-select/constants.ts @@ -1,3 +1,3 @@ import { City } from "./enums"; -export const CITIES: City[] = [City.Spb, City.Msk, City.Sar, City.Kry, City.Kzn, City.Nsk]; +export const CITIES: City[] = [City.Spb, City.Msk, City.Sar, City.Kry, City.Kzn, City.Nsk, City.Nnv, City.Ufa]; diff --git a/DevActivator/ClientApp/app/shared/city-select/enums.ts b/DevActivator/ClientApp/app/shared/city-select/enums.ts index f41c78d..4982c95 100644 --- a/DevActivator/ClientApp/app/shared/city-select/enums.ts +++ b/DevActivator/ClientApp/app/shared/city-select/enums.ts @@ -5,4 +5,6 @@ export enum City { Kry = 4, Kzn = 5, Nsk = 6, + Nnv = 7, + Ufa = 8, } diff --git a/DevActivator/ClientApp/app/styles.scss b/DevActivator/ClientApp/app/styles.scss new file mode 100644 index 0000000..e057304 --- /dev/null +++ b/DevActivator/ClientApp/app/styles.scss @@ -0,0 +1,16 @@ +@import '~@angular/material/theming'; +@include mat-core(); +$app-primary: mat-palette($mat-indigo); +$app-accent: mat-palette($mat-pink); +$app-warn: mat-palette($mat-red); +// Custom Sass colors vars (will be available in all the project) +$primary: mat-color($app-primary); +$accent: mat-color($app-accent); +$warn: mat-color($app-warn); +$theme: mat-light-theme($app-primary, $app-accent, $app-warn); +@include angular-material-theme($theme); +@import '~@mat-datetimepicker/core/datetimepicker/datetimepicker-theme.scss'; +// Using the $theme variable from the pre-built theme you can call the theming function +@include mat-datetimepicker-theme($theme); +@import "./themes/snack-bar.theme.scss"; +@import "./themes/common.scss"; \ No newline at end of file diff --git a/DevActivator/ClientApp/app/themes/common.scss b/DevActivator/ClientApp/app/themes/common.scss new file mode 100644 index 0000000..cf997e4 --- /dev/null +++ b/DevActivator/ClientApp/app/themes/common.scss @@ -0,0 +1,47 @@ +html, +body { + height: 100%; + margin: 0; + padding: 0; +} + +.base-component-container { + display: block; + height: 100%; + overflow: auto; + max-width: 640px; + margin: 0 auto; +} + +.full-width { + width: 100%; +} + +.full-height { + height: 100%; +} + +.actions__space-between { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; +} + +.actions__right { + width: 100%; + display: flex; + justify-content: flex-end; +} + +.text { + font-family: Roboto, "Helvetica Neue", sans-serif; +} + +.no-wrap { + white-space: nowrap; +} + +.bold { + font-weight: 700; +} \ No newline at end of file diff --git a/DevActivator/ClientApp/app/themes/snack-bar.theme.scss b/DevActivator/ClientApp/app/themes/snack-bar.theme.scss new file mode 100644 index 0000000..bb070d4 --- /dev/null +++ b/DevActivator/ClientApp/app/themes/snack-bar.theme.scss @@ -0,0 +1,7 @@ +.snack-bar-info .mat-simple-snackbar-action { + color: #40ffbe; +} + +.snack-bar-warn .mat-simple-snackbar-action { + color: #ffe440; +} \ No newline at end of file diff --git a/DevActivator/Controllers/CompositeController.cs b/DevActivator/Controllers/CompositeController.cs new file mode 100644 index 0000000..ef81a5a --- /dev/null +++ b/DevActivator/Controllers/CompositeController.cs @@ -0,0 +1,172 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using DevActivator.Meetups.BL.Entities; +using DevActivator.Meetups.BL.Enums; +using DevActivator.Meetups.BL.Extensions; +using DevActivator.Meetups.BL.Interfaces; +using DevActivator.Meetups.BL.Models; +using DevActivator.Models; +using Microsoft.AspNetCore.Mvc; + +namespace DevActivator.Controllers +{ + [Route("api/[controller]")] + public class CompositeController : Controller + { + private readonly IMeetupService _meetupService; + private readonly ITalkService _talkService; + private readonly ISpeakerService _speakerService; + private readonly IFriendService _friendService; + private readonly IVenueService _venueService; + + public CompositeController(IMeetupService ms, ITalkService ts, ISpeakerService ss, IFriendService fs, IVenueService vs) + { + _meetupService = ms; + _talkService = ts; + _speakerService = ss; + _friendService = fs; + _venueService = vs; + } + + [HttpPost("[action]/{meetupId?}")] + public async Task GetMeetup([FromRoute] string meetupId, [FromBody] RandomConcatModel descriptor = null) + { + var meetup = await _meetupService.GetMeetupAsync(meetupId).ConfigureAwait(true); + + descriptor = descriptor ?? new RandomConcatModel(); + descriptor.VenueId = descriptor.VenueId; + descriptor.Sessions = descriptor.Sessions ?? new List(); + descriptor.TalkIds = descriptor.TalkIds ?? new List(); + descriptor.SpeakerIds = descriptor.SpeakerIds ?? new List(); + descriptor.FriendIds = descriptor.FriendIds ?? new List(); + + if (meetup != null && descriptor.Sessions.Count == 0) + { + descriptor.Sessions = meetup.Sessions; + } + + descriptor.TalkIds.AddRange(descriptor.Sessions.Select(x => x.TalkId).Where(x => !string.IsNullOrWhiteSpace(x))); + + // talks + var talks = new Dictionary(); + foreach (var talkId in descriptor.TalkIds.Distinct()) + { + var talk = await _talkService.GetTalkAsync(talkId).ConfigureAwait(true); + talks.Add(talkId, talk); + } + + // speakers + descriptor.SpeakerIds.AddRange( + talks.Select(x => x.Value).SelectMany(x => x.SpeakerIds.Select(s => s.SpeakerId)) + ); + var speakers = new Dictionary(); + foreach (var speakerId in descriptor.SpeakerIds.Distinct()) + { + var speaker = await _speakerService.GetSpeakerAsync(speakerId).ConfigureAwait(true); + speakers.Add(speakerId, speaker); + } + + // friends + if (meetup != null && descriptor.FriendIds.Count == 0) + { + descriptor.FriendIds.AddRange(meetup.FriendIds.Select(x => x.FriendId)); + } + + var friends = new List(); + foreach (var friendId in descriptor.FriendIds.Distinct()) + { + var friend = await _friendService.GetFriendAsync(friendId).ConfigureAwait(true); + friends.Add(friend); + } + + // name + if (string.IsNullOrWhiteSpace(descriptor.Name)) + { + descriptor.Name = meetup?.Name; + } + + // venue + descriptor.VenueId = descriptor.VenueId ?? meetup?.VenueId; + VenueVm venue = null; + if (!string.IsNullOrWhiteSpace(descriptor.VenueId)) + { + venue = await _venueService.GetVenueAsync(descriptor.VenueId).ConfigureAwait(true); + } + + // community + if (string.IsNullOrWhiteSpace(descriptor.CommunityId)) + { + descriptor.CommunityId = meetup?.CommunityId.ToString(); + } + + return new CompositeModel + { + Id = meetup?.Id, + Name = descriptor.Name, + CommunityId = string.IsNullOrWhiteSpace(descriptor.CommunityId) + ? (Community?) null + : descriptor.CommunityId.GetCommunity(), + Venue = venue, + Sessions = descriptor.Sessions, + Talks = talks, + Speakers = speakers, + Friends = friends + }; + } + + [HttpPost("[action]/{meetupId?}")] + public async Task SaveMeetup([FromRoute] string meetupId, [FromBody] RandomConcatModel descriptor = null) + { + var oldMeetup = await _meetupService.GetMeetupAsync(meetupId).ConfigureAwait(true); + + if (oldMeetup != null) + { + Extend(oldMeetup, descriptor); + var savedMeetup = await _meetupService.UpdateMeetupAsync(oldMeetup).ConfigureAwait(true); + meetupId = savedMeetup.Id; + } + else + { + var newMeetup = new MeetupVm {Id = meetupId}; + Extend(newMeetup, descriptor); + + var savedMeetup = await _meetupService.AddMeetupAsync(newMeetup).ConfigureAwait(true); + meetupId = savedMeetup.Id; + } + + return await GetMeetup(meetupId).ConfigureAwait(true); + } + + private static void Extend(MeetupVm meetup, RandomConcatModel descriptor) + { + if (descriptor != null) + { + if (!string.IsNullOrWhiteSpace(descriptor.Name)) + { + meetup.Name = descriptor.Name; + } + + if (!string.IsNullOrWhiteSpace(descriptor.CommunityId)) + { + meetup.CommunityId = descriptor.CommunityId.GetCommunity(); + } + + if (descriptor.FriendIds != null && descriptor.FriendIds.Count != 0) + { + meetup.FriendIds = descriptor.FriendIds.Select(x => new FriendReference {FriendId = x}).ToList(); + } + + if (!string.IsNullOrWhiteSpace(descriptor.VenueId)) + { + meetup.VenueId = descriptor.VenueId; + } + + if (descriptor.Sessions != null && descriptor.Sessions.Count != 0) + { + meetup.Sessions = descriptor.Sessions; + } + } + } + } +} \ No newline at end of file diff --git a/DevActivator/DevActivator.csproj b/DevActivator/DevActivator.csproj index 27067df..7cf3131 100644 --- a/DevActivator/DevActivator.csproj +++ b/DevActivator/DevActivator.csproj @@ -34,8 +34,6 @@ - - diff --git a/DevActivator/Extensions/MiddlewareExtension.cs b/DevActivator/Extensions/MiddlewareExtension.cs new file mode 100644 index 0000000..09d06f9 --- /dev/null +++ b/DevActivator/Extensions/MiddlewareExtension.cs @@ -0,0 +1,15 @@ +using System; +using DevActivator.Middlewares; +using Microsoft.AspNetCore.Builder; + +namespace DevActivator.Extensions +{ + public static class MiddlewareExtension + { + public static string FormatMessageLine(this string str) + => $"{Environment.NewLine}{str ?? string.Empty}{Environment.NewLine}{Environment.NewLine}"; + + public static IApplicationBuilder UseExceptionMiddleware(this IApplicationBuilder builder) + => builder.UseMiddleware(); + } +} \ No newline at end of file diff --git a/DevActivator/Middlewares/ExceptionMiddleware.cs b/DevActivator/Middlewares/ExceptionMiddleware.cs new file mode 100644 index 0000000..088ede2 --- /dev/null +++ b/DevActivator/Middlewares/ExceptionMiddleware.cs @@ -0,0 +1,90 @@ +using System; +using System.Data; +using System.Net; +using System.Security; +using System.Text; +using System.Threading.Tasks; +using DevActivator.Extensions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.Logging; +using Microsoft.Net.Http.Headers; + +namespace DevActivator.Middlewares +{ + public class ExceptionMiddleware + { + private readonly RequestDelegate _next; + private readonly ILogger _log; + + public ExceptionMiddleware(RequestDelegate next, ILogger log) + { + _next = next; + _log = log; + } + + public async Task Invoke(HttpContext context) + { + try + { + await _next(context); + } + catch (Exception ex) + { + HttpStatusCode statusCode; + string message; + var request = context.Request; + var logMsg = $"Ошибка в приложении: {ex.ToString().FormatMessageLine()}" + + $"URL запрашиваемого ресурса: {request.GetDisplayUrl().FormatMessageLine()}" + + $"URL Refferer: {request.Headers[HeaderNames.Referer].ToString().FormatMessageLine()}" + + $"IP клиента: {context.Connection.RemoteIpAddress?.ToString().FormatMessageLine()}" + + $"DNS имя клиента: {request.Host.Value?.FormatMessageLine()}" + + $"Браузер клиента: {request.Headers[HeaderNames.UserAgent].ToString().FormatMessageLine()}"; + + switch (ex) + { + case ArgumentException _: + case NoNullAllowedException _: + case FormatException _: + _log.LogWarning(ex, logMsg); + statusCode = HttpStatusCode.BadRequest; + message = ex.Message; + break; + case NotSupportedException _: + case NotImplementedException _: + _log.LogWarning(ex, logMsg); + statusCode = HttpStatusCode.MethodNotAllowed; + message = "Операция не поддерживается сервером"; + break; + case MissingMemberException _: + _log.LogInformation(ex, logMsg); + statusCode = HttpStatusCode.NotFound; + message = "Объект не найден"; + break; + case SecurityException _: + _log.LogWarning(ex, logMsg); + statusCode = HttpStatusCode.Forbidden; + message = "Вам не хватает прав на данное действие"; + break; + default: + _log.LogError(ex, logMsg); + statusCode = HttpStatusCode.InternalServerError; + message = $"500 {nameof(HttpStatusCode.InternalServerError)}"; + break; + } + + context.Features.Get().ReasonPhrase = null; + if (context.Response.Body.CanSeek) + { + context.Response.Body.SetLength(0L); + } + + context.Response.ContentType = "text/plain; charset=utf-8"; + context.Response.StatusCode = (int) statusCode; + await context.Response.WriteAsync(message, Encoding.UTF8); + } + } + } + +} \ No newline at end of file diff --git a/DevActivator/Models/CompositeModel.cs b/DevActivator/Models/CompositeModel.cs new file mode 100644 index 0000000..1e66ca5 --- /dev/null +++ b/DevActivator/Models/CompositeModel.cs @@ -0,0 +1,26 @@ +using System.Collections.Generic; +using DevActivator.Meetups.BL.Entities; +using DevActivator.Meetups.BL.Enums; +using DevActivator.Meetups.BL.Models; + +namespace DevActivator.Models +{ + public class CompositeModel + { + public string Id { get; set; } + + public string Name { get; set; } + + public Community? CommunityId { get; set; } + + public VenueVm Venue { get; set; } + + public List Sessions { get; set; } + + public Dictionary Talks { get; set; } + + public Dictionary Speakers { get; set; } + + public List Friends { get; set; } + } +} \ No newline at end of file diff --git a/DevActivator/Models/RandomConcatModel.cs b/DevActivator/Models/RandomConcatModel.cs new file mode 100644 index 0000000..39df167 --- /dev/null +++ b/DevActivator/Models/RandomConcatModel.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using DevActivator.Meetups.BL.Models; + +namespace DevActivator.Models +{ + public class RandomConcatModel + { + public string Name { get; set; } + + public string CommunityId { get; set; } + + public string VenueId { get; set; } + + public List Sessions { get; set; } + + public List TalkIds { get; set; } + + public List SpeakerIds { get; set; } + + public List FriendIds { get; set; } + } +} \ No newline at end of file diff --git a/DevActivator/Startup.cs b/DevActivator/Startup.cs index 555c807..ead6990 100644 --- a/DevActivator/Startup.cs +++ b/DevActivator/Startup.cs @@ -6,6 +6,7 @@ using Autofac.Extensions.DependencyInjection; using DevActivator.Common.BL.Caching; using DevActivator.Common.BL.Config; +using DevActivator.Extensions; using DevActivator.Meetups.BL; using DevActivator.Meetups.DAL.Providers; using ElectronNET.API; @@ -72,9 +73,9 @@ public IServiceProvider ConfigureServices(IServiceCollection services) // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { + app.UseExceptionMiddleware(); if (env.IsDevelopment()) { - app.UseDeveloperExceptionPage(); if (HybridSupport.IsElectronActive) { //the below is a hacky way to get hot module loading working for the ElectronNet app. @@ -89,10 +90,6 @@ public void Configure(IApplicationBuilder app, IHostingEnvironment env) }); } } - else - { - app.UseExceptionHandler("/Home/Error"); - } app.UseFileServer(new FileServerOptions { diff --git a/DevActivator/Views/Shared/_Layout.cshtml b/DevActivator/Views/Shared/_Layout.cshtml index c278b64..3037ffd 100644 --- a/DevActivator/Views/Shared/_Layout.cshtml +++ b/DevActivator/Views/Shared/_Layout.cshtml @@ -6,33 +6,8 @@ @ViewData["Title"] - DevActivator - + - @RenderBody() diff --git a/DevActivator/electron.ps1 b/DevActivator/electron.ps1 index 43ed866..0521aa0 100644 --- a/DevActivator/electron.ps1 +++ b/DevActivator/electron.ps1 @@ -2,6 +2,5 @@ invoke-expression '$Env:ASPNETCORE_ENVIRONMENT = "Development"' $webpack = Start-Process -FilePath "powershell" -ArgumentList "node node_modules/webpack/bin/webpack.js --watch" -PassThru -NoNewWindow $dotnet = Start-Process -FilePath "powershell" -ArgumentList "dotnet electronize start" -PassThru -NoNewWindow -# export ASPNETCORE_ENVIRONMENT="Development" -# node node_modules/webpack/bin/webpack.js --watch +# export ASPNETCORE_ENVIRONMENT="Development" && npm run build:vendor && dotnet run # dotnet electronize start \ No newline at end of file diff --git a/DevActivator/npm-shrinkwrap.json b/DevActivator/npm-shrinkwrap.json index 7b58de8..6be1dd5 100644 --- a/DevActivator/npm-shrinkwrap.json +++ b/DevActivator/npm-shrinkwrap.json @@ -5,37 +5,38 @@ "requires": true, "dependencies": { "@angular-devkit/architect": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.8.5.tgz", - "integrity": "sha512-UMPQVdJkvT0f8ZFuhA2teDD697Tk1rUrW0X6yigPHmRhVTS9xbuJS/DeBN36NVJRUOOGYNDn5JHTLvywQf9q7A==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.13.0.tgz", + "integrity": "sha512-oDBrWlfKh/0t2ag4T8gz9xzPMItxfctinlsHxhw7dPQ+etq1mIcWgQkiKiDrz4l46YiGipBRlC55j+6f37omAA==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.5", - "rxjs": "~6.2.0" + "@angular-devkit/core": "7.3.0", + "rxjs": "6.3.3" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.5.tgz", - "integrity": "sha512-QGYuGJDzCOjZaRR7pSly9QNM8RO7Q5NawqRYQzsOVhdI4n5GJ2gAYSw+wi5tyavlrNcbvLw9//MAPhBkPrZMJw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz", + "integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==", "dev": true, "requires": { - "ajv": "~6.4.0", - "chokidar": "^2.0.3", - "rxjs": "~6.2.0", - "source-map": "^0.5.6" + "ajv": "6.7.0", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, "ajv": { - "version": "6.4.0", - "resolved": "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "anymatch": { @@ -48,35 +49,6 @@ "normalize-path": "^2.1.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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.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.0" - } - } - } - }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", @@ -98,77 +70,10 @@ "upath": "^1.0.5" } }, - "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" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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.0" - } - } - } - }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 }, "glob-parent": { @@ -192,35 +97,6 @@ } } }, - "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.0" - } - }, - "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.0" - } - }, - "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" - } - }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -230,136 +106,52 @@ "is-extglob": "^2.1.1" } }, - "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" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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 }, - "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.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^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" - } - }, "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, - "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.0" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, "@angular-devkit/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.5.tgz", - "integrity": "sha512-QGYuGJDzCOjZaRR7pSly9QNM8RO7Q5NawqRYQzsOVhdI4n5GJ2gAYSw+wi5tyavlrNcbvLw9//MAPhBkPrZMJw==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.1.4.tgz", + "integrity": "sha512-3cBVHjSQjMyE/mIyOX82ekdybNRQlN+kUfmdZS6oVW9aV48vdxcVbEGdl8t1H4enMf89u8kXiAAET9jFaqWopg==", "dev": true, "requires": { - "ajv": "~6.4.0", - "chokidar": "^2.0.3", - "rxjs": "~6.2.0", - "source-map": "^0.5.6" + "ajv": "6.5.3", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" }, "dependencies": { "ajv": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "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": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "anymatch": { @@ -394,9 +186,9 @@ } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 }, "glob-parent": { @@ -429,49 +221,62 @@ "is-extglob": "^2.1.1" } }, + "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 + }, "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { "tslib": "^1.9.0" } + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, "@angular-devkit/schematics": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-0.8.5.tgz", - "integrity": "sha512-rf6JyUncrTPpW33PMcDVrcQSLkt6iJEeqI9PXc65VBhGN7RaT00JQHVKdf5FNSmQ2Qenc1KpBrK3k6jrxTZv5Q==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-7.3.0.tgz", + "integrity": "sha512-glOduymftH0LmJhITWgWUJK8QCDUltgTZ943/OyArIvLXTLL/8zCb+G6xL+3k33EQjwJicgQ3WIjonJmeTK/Ww==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.5", - "rxjs": "~6.2.0" + "@angular-devkit/core": "7.3.0", + "rxjs": "6.3.3" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.5.tgz", - "integrity": "sha512-QGYuGJDzCOjZaRR7pSly9QNM8RO7Q5NawqRYQzsOVhdI4n5GJ2gAYSw+wi5tyavlrNcbvLw9//MAPhBkPrZMJw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz", + "integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==", "dev": true, "requires": { - "ajv": "~6.4.0", - "chokidar": "^2.0.3", - "rxjs": "~6.2.0", - "source-map": "^0.5.6" + "ajv": "6.7.0", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, "ajv": { - "version": "6.4.0", - "resolved": "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "anymatch": { @@ -484,35 +289,6 @@ "normalize-path": "^2.1.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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.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.0" - } - } - } - }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", @@ -534,77 +310,10 @@ "upath": "^1.0.5" } }, - "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" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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.0" - } - } - } - }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 }, "glob-parent": { @@ -628,35 +337,6 @@ } } }, - "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.0" - } - }, - "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.0" - } - }, - "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" - } - }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -666,181 +346,92 @@ "is-extglob": "^2.1.1" } }, - "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" - } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "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 }, - "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.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^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" - } - }, "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, - "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.0" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, "@angular/animations": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-6.1.10.tgz", - "integrity": "sha512-dd/lq7kw3uwfHPICan8psu2nthuUpp7PvMLuNIm0XxObZ4oNs0ls6uxKEDPnEkRKoGdiJpvmsyzZZN9ACMPEAA==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-7.2.4.tgz", + "integrity": "sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/cdk": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-6.4.7.tgz", - "integrity": "sha512-18x0U66fLD5kGQWZ9n3nb75xQouXlWs7kUDaTd8HTrHpT1s2QIAqlLd1KxfrYiVhsEC2jPQaoiae7VnBlcvkBg==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-7.3.1.tgz", + "integrity": "sha512-m6hy+HPLDgVM+Y2C3UWvIG06euIV8oG5QxrCitZui8JZ/dj/0V5bxATKgWN62haYnYR4en4z1bfH0kOvQj+LEA==", "dev": true, "requires": { + "parse5": "^5.0.0", "tslib": "^1.7.1" } }, "@angular/cli": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-6.2.5.tgz", - "integrity": "sha512-QG568QHq3X8CZ0D7aPbq9SlFiYyBEhrsfhGFr6jHNeljoCID2071GfnVsvuwj4vpeBT6axgOj0Dpm3M1r6UMMQ==", - "dev": true, - "requires": { - "@angular-devkit/architect": "0.8.5", - "@angular-devkit/core": "0.8.5", - "@angular-devkit/schematics": "0.8.5", - "@schematics/angular": "0.8.5", - "@schematics/update": "0.8.5", - "json-schema-traverse": "^0.4.1", - "opn": "^5.3.0", - "rxjs": "~6.2.0", - "semver": "^5.1.0", - "symbol-observable": "^1.2.0", - "yargs-parser": "^10.0.0" + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-7.3.0.tgz", + "integrity": "sha512-6+NoHsW1MYG7GBHUg71zaWIFeIRps/SVksCmRFCpW0RXqErCQmzf0GZuDTZZ2Yo4RzU01150sVp1R8wEvEZfZQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.13.0", + "@angular-devkit/core": "7.3.0", + "@angular-devkit/schematics": "7.3.0", + "@schematics/angular": "7.3.0", + "@schematics/update": "0.13.0", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "inquirer": "6.2.1", + "npm-package-arg": "6.1.0", + "opn": "5.4.0", + "pacote": "9.4.0", + "semver": "5.6.0", + "symbol-observable": "1.2.0" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.5.tgz", - "integrity": "sha512-QGYuGJDzCOjZaRR7pSly9QNM8RO7Q5NawqRYQzsOVhdI4n5GJ2gAYSw+wi5tyavlrNcbvLw9//MAPhBkPrZMJw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz", + "integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==", "dev": true, "requires": { - "ajv": "~6.4.0", - "chokidar": "^2.0.3", - "rxjs": "~6.2.0", - "source-map": "^0.5.6" + "ajv": "6.7.0", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, "ajv": { - "version": "6.4.0", - "resolved": "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" - }, - "dependencies": { - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - } + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "anymatch": { @@ -853,41 +444,6 @@ "normalize-path": "^2.1.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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.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.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 - }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", @@ -909,77 +465,10 @@ "upath": "^1.0.5" } }, - "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" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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.0" - } - } - } - }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 }, "glob-parent": { @@ -1003,35 +492,6 @@ } } }, - "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.0" - } - }, - "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.0" - } - }, - "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" - } - }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -1041,658 +501,461 @@ "is-extglob": "^2.1.1" } }, - "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" - } - }, "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 }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.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.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^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" - } - }, "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, - "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.0" - } - }, - "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" - }, - "dependencies": { - "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" - } - } - } + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "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" - } + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, "@angular/common": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-6.1.10.tgz", - "integrity": "sha512-73xxTSYJNKfiJ7C1Ajg+sz5l8y+blb/vNgHYg7O3yem5zLBnfPpidJ1UGg4W4d2Y+jwUVJbZKh8SKJarqAJVUQ==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-7.2.4.tgz", + "integrity": "sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/compiler": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-6.1.10.tgz", - "integrity": "sha512-FPIb2j3zfoBwb6vo/u0gQeu70h8InGlSisBr3xMACs/35/pwB6kbQR+JQiUr0D7k6QApg7AuMkvq8aFNelg0aw==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-7.2.4.tgz", + "integrity": "sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "@angular/compiler-cli": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-6.1.10.tgz", - "integrity": "sha512-GCWdyeNQSnF4RfzO4A0+WHsNEgxKpl5arg4ldLSWMNkj/DrhMD4TnmxhR+IVY+7ieMkUBwpcuWRnjdOdnbmV+w==", + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz", + "integrity": "sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg==", "dev": true, "requires": { + "canonical-path": "1.0.0", "chokidar": "^1.4.2", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", "minimist": "^1.2.0", "reflect-metadata": "^0.1.2", - "tsickle": "^0.32.1" + "shelljs": "^0.8.1", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "9.0.1" }, "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } - } - }, - "@angular/core": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-6.1.10.tgz", - "integrity": "sha512-61l3rIQTVdT45eOf6/fBJIeVmV10mcrxqS4N/1OWkuDT29YSJTZSxGcv8QjAyyutuhcqWWpO6gVRkN07rWmkPg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@angular/forms": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-6.1.10.tgz", - "integrity": "sha512-zAPx2kMV1/FbP5DrY472Sd/ze1m+GS6T5ullZCtP392r62p2RkwzDCXieR51YiRJjZj3M6c3AcRND7PWBdXT7A==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@angular/http": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/http/-/http-6.1.10.tgz", - "integrity": "sha512-LDsSqyexh8fj23y+G2oSGLWSZVhbxBBo2ehYHnRgH/jlp0pmZVLRaGgUMNSCVtZc1rxLzpEjZjtw+P+qlutAtw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@angular/material": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-6.4.7.tgz", - "integrity": "sha512-SdNx7Xovi24Kw9eU6lkLhY/7f2M7L9F+/uh6XuPr4jbGgCUVVpeeVI5ztZhsZRbj1sN+/r1p5w8u62apWWl5Ww==", - "dev": true, - "requires": { - "parse5": "^5.0.0", - "tslib": "^1.7.1" - } - }, - "@angular/platform-browser": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-6.1.10.tgz", - "integrity": "sha512-CB7pqMwtgb7KjdHDAJlsXcs0rrU+2xQVaoOaqEfJtUrKhtGMLaZh8Qoic5l92SoGattkOw7SYarAOsWlAsVfvw==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@angular/platform-browser-dynamic": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-6.1.10.tgz", - "integrity": "sha512-DmBSUyFPoyKqkmBXyJ2CrP1oXDioeoBlPA8lmWUDUv2yBuoHIzIkdY/OkTZbdyu/QYa1hK2Jl9OlfoeoenKddg==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@angular/platform-server": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-6.1.10.tgz", - "integrity": "sha512-OKcbDJOCYrk+z5BaTbAsunLazlvFZZqOtYKU8zSCVuTGnGRINchO2RxHezS2+npzY1oO1zl1AA47RR59Nxutww==", - "dev": true, - "requires": { - "domino": "^2.0.1", - "tslib": "^1.9.0", - "xhr2": "^0.1.4" - } - }, - "@angular/router": { - "version": "6.1.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-6.1.10.tgz", - "integrity": "sha512-tekI3dkdvd65oMoxjjgRA+16uDgPUBWHhYxids6pgO8vobZNtCo8VaVlcDyLUhdmtS5kONELx0iL5E2M0Y2Bag==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "@ngtools/webpack": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-6.2.5.tgz", - "integrity": "sha512-gvv4n+M+YIoHX0JPvP+ygnI1L83iiJEDelqXxqdQ65ppM8Ua55xa+jLQc3vAjLbSuC2ANKHb9JK3GihBNghMgQ==", - "dev": true, - "requires": { - "@angular-devkit/core": "0.8.5", - "rxjs": "~6.2.0", - "tree-kill": "^1.0.0", - "webpack-sources": "^1.1.0" - }, - "dependencies": { - "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.0" - } - }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true }, - "webpack-sources": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", - "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - } - } - }, - "@schematics/angular": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-0.8.5.tgz", - "integrity": "sha512-2ZfnXajf7Pz5ZuZ4iwtDpVxcd58IQednhMGuNslzCeq7S2+FTnctTlmye63HoaRN8F/7M2aG4ztpm6VMYPPn2A==", - "dev": true, - "requires": { - "@angular-devkit/core": "0.8.5", - "@angular-devkit/schematics": "0.8.5", - "typescript": ">=2.6.2 <2.10" - }, - "dependencies": { - "@angular-devkit/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.5.tgz", - "integrity": "sha512-QGYuGJDzCOjZaRR7pSly9QNM8RO7Q5NawqRYQzsOVhdI4n5GJ2gAYSw+wi5tyavlrNcbvLw9//MAPhBkPrZMJw==", + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "ajv": "~6.4.0", - "chokidar": "^2.0.3", - "rxjs": "~6.2.0", - "source-map": "^0.5.6" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "http://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, - "ajv": { - "version": "6.4.0", - "resolved": "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "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": { - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "locate-path": "^2.0.0" } }, - "anymatch": { + "load-json-file": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "strip-bom": "^3.0.0" } }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "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": { - "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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.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.0" - } - } + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, - "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", - "glob-parent": "^3.1.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "pify": "^2.0.0" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "load-json-file": "^2.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^2.0.0" } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "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" - } - } + "find-up": "^2.0.0", + "read-pkg": "^2.0.0" } }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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.0" - } - } - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "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-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "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 + }, + "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": { - "is-extglob": "^2.1.0" + "ansi-regex": "^3.0.0" } } } }, - "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.0" - } - }, - "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.0" - } - }, - "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" - } + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "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" - } + "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 }, - "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==", + "yargs": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-9.0.1.tgz", + "integrity": "sha1-UqzCP+7Kw0BCB47njAwAf1CF20w=", "dev": true, "requires": { - "isobject": "^3.0.1" + "camelcase": "^4.1.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "read-pkg-up": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^7.0.0" } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "camelcase": "^4.1.0" } - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + } + } + }, + "@angular/core": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-7.2.4.tgz", + "integrity": "sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-7.2.4.tgz", + "integrity": "sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/http": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-7.2.4.tgz", + "integrity": "sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/material": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-7.3.1.tgz", + "integrity": "sha512-txq2y/JSB+05l8a/OfnByw7AEKSeAWAJ49jzCoeb3804sCeVEbvuWZfpmKBX8vCVTZh005Ypuk55R4NP5AIgaw==", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/material-moment-adapter": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@angular/material-moment-adapter/-/material-moment-adapter-7.3.1.tgz", + "integrity": "sha512-LQEJcK4OKsi8go4C58QCdpMvX6uzi2b8Jcxgc3i1TzDfnz8ejoL4hDTerIaZea3aYqdSVoTLsQmrprd9FOD+eg==", + "dev": true, + "requires": { + "tslib": "^1.7.1" + } + }, + "@angular/platform-browser": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-7.2.4.tgz", + "integrity": "sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz", + "integrity": "sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-server": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-7.2.4.tgz", + "integrity": "sha512-3KbLHw7xMbkxun93HeYX8pSiPmFWim3ftvKbfPlB01fjhdZvhHpf39Dn4T7iyT1vrZMccXL87psv4/lJkTf04A==", + "dev": true, + "requires": { + "domino": "^2.1.0", + "tslib": "^1.9.0", + "xhr2": "^0.1.4" + } + }, + "@angular/router": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-7.2.4.tgz", + "integrity": "sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@mat-datetimepicker/core": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@mat-datetimepicker/core/-/core-2.0.1.tgz", + "integrity": "sha1-4NsdtdTPe6Vrck7AQIF8totXdfI=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@mat-datetimepicker/moment": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@mat-datetimepicker/moment/-/moment-2.0.1.tgz", + "integrity": "sha1-Yr0WQ23j2ds9roFyEYNMMpqdhvA=", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "@ngtools/webpack": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-7.1.4.tgz", + "integrity": "sha512-8A15TPJzg3g7yI70QvBzJ253P32WAgCVre9nMaDdd22UmlbvN8Ke4RuQY7vYVTECLL+bWpFJEFXL+ThzCRUgeA==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.1.4", + "enhanced-resolve": "4.1.0", + "rxjs": "6.3.3", + "tree-kill": "1.2.0", + "webpack-sources": "1.2.0" + }, + "dependencies": { + "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": { - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "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": { - "isobject": "^3.0.1" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { "tslib": "^1.9.0" } }, - "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.0" - } + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, + "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 + }, + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "webpack-sources": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.2.0.tgz", + "integrity": "sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "dependencies": { - "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" - } - } + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" } } } }, - "@schematics/update": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.8.5.tgz", - "integrity": "sha512-kcld8R13bFE/hoY8uSy7srU2MVI8uzzo14q0AbJBAmyM+v03sBRPhQ5U03Yvb+kedlisC4D4Crr8bkJYrM2Qig==", + "@schematics/angular": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-7.3.0.tgz", + "integrity": "sha512-fOjP/3Rz+Nqrgc+YVaiN88uhPX0FZgUjmMKgMp06lc3xmoc1ScGxoz8AF1fV50Zkvh0Etykzy1LTUczzEUJQqw==", "dev": true, "requires": { - "@angular-devkit/core": "0.8.5", - "@angular-devkit/schematics": "0.8.5", - "npm-registry-client": "^8.5.1", - "rxjs": "~6.2.0", - "semver": "^5.3.0", - "semver-intersect": "^1.1.2" + "@angular-devkit/core": "7.3.0", + "@angular-devkit/schematics": "7.3.0", + "typescript": "3.2.2" }, "dependencies": { "@angular-devkit/core": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-0.8.5.tgz", - "integrity": "sha512-QGYuGJDzCOjZaRR7pSly9QNM8RO7Q5NawqRYQzsOVhdI4n5GJ2gAYSw+wi5tyavlrNcbvLw9//MAPhBkPrZMJw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz", + "integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==", "dev": true, "requires": { - "ajv": "~6.4.0", - "chokidar": "^2.0.3", - "rxjs": "~6.2.0", - "source-map": "^0.5.6" + "ajv": "6.7.0", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, "ajv": { - "version": "6.4.0", - "resolved": "http://registry.npmjs.org/ajv/-/ajv-6.4.0.tgz", - "integrity": "sha1-06/3jpJ3VJdx2vAWTP9ISCt1T8Y=", + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "dev": true, "requires": { - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0", - "uri-js": "^3.0.2" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "anymatch": { @@ -1705,35 +968,6 @@ "normalize-path": "^2.1.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.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.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.0" - } - } - } - }, "chokidar": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", @@ -1755,77 +989,10 @@ "upath": "^1.0.5" } }, - "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" - } - }, - "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "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.0" - } - } - } - }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 }, "glob-parent": { @@ -1849,35 +1016,6 @@ } } }, - "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.0" - } - }, - "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.0" - } - }, - "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" - } - }, "is-glob": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", @@ -1887,111 +1025,169 @@ "is-extglob": "^2.1.1" } }, - "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==", + "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 + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", "dev": true, "requires": { - "isobject": "^3.0.1" + "tslib": "^1.9.0" } }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "typescript": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.2.tgz", + "integrity": "sha512-VCj5UiSyHBjwfYacmDuc/NOk4QQixbE+Wn7MFJuS0nRuPQbof132Pw4u53dm264O8LPc2MVsc7RJNml5szurkg==", + "dev": true + } + } + }, + "@schematics/update": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.13.0.tgz", + "integrity": "sha512-HGpZdIL/0w46UyaxpnIAg6SBwzKfaRixHIEihmgJUqA0DG8GZUixRPr1L0YIWC1EZ81cQ+yWL85XhkKBYR+wQg==", + "dev": true, + "requires": { + "@angular-devkit/core": "7.3.0", + "@angular-devkit/schematics": "7.3.0", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.4.0", + "rxjs": "6.3.3", + "semver": "5.6.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "@angular-devkit/core": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-7.3.0.tgz", + "integrity": "sha512-b0qtAUpgqLpWY8W6vWRv1aj6bXkZCP1rvywl8i8TbGMY67CWRcy5J3fNAMmjiZS+LJixFlIXYf4iOydglyJMfg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "ajv": "6.7.0", + "chokidar": "2.0.4", + "fast-json-stable-stringify": "2.0.0", + "rxjs": "6.3.3", + "source-map": "0.7.3" } }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "ajv": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", + "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", "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.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "isobject": "^3.0.1" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" } }, - "rxjs": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.2.tgz", - "integrity": "sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ==", + "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": { - "tslib": "^1.9.0" + "anymatch": "^2.0.0", + "async-each": "^1.0.0", + "braces": "^2.3.0", + "fsevents": "^1.2.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "lodash.debounce": "^4.0.8", + "normalize-path": "^2.1.1", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0", + "upath": "^1.0.5" } }, - "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.0" - } + "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 }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "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": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "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": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "is-extglob": "^2.1.0" } } } + }, + "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" + } + }, + "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 + }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + }, + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "dev": true } } }, @@ -2013,6 +1209,28 @@ "integrity": "sha1-MEQ4FkfhHulzxa8uklMjkw9pHYA=", "dev": true }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, "accepts": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", @@ -2052,6 +1270,24 @@ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", "dev": true }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, "ajv": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.0.tgz", @@ -2122,6 +1358,12 @@ "loader-utils": "^0.2.15" } }, + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, "ansi-html": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", @@ -2242,15 +1484,13 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true, - "optional": true + "dev": true }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, - "optional": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -2283,6 +1523,12 @@ "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-slice": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", @@ -2423,6 +1669,12 @@ "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", "dev": true }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "dev": true + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2625,6 +1877,15 @@ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", "dev": true }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", @@ -2841,6 +2102,80 @@ "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", "dev": true }, + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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 + } + } + }, "cache-base": { "version": "0.8.5", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz", @@ -2881,6 +2216,24 @@ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", "dev": true }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } + } + }, "caniuse-api": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", @@ -2899,6 +2252,12 @@ "integrity": "sha1-IM5qnO7vTvShXcjoDy6PuQSejXc=", "dev": true }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", @@ -2950,6 +2309,12 @@ "supports-color": "^2.0.0" } }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -2973,6 +2338,12 @@ "readdirp": "^2.0.0" } }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -3046,6 +2417,21 @@ "source-map": "0.5.x" } }, + "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": "2.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", @@ -3063,6 +2449,44 @@ "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", "dev": true }, + "clone-deep": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-2.0.2.tgz", + "integrity": "sha512-SZegPTKjCgpQH63E+eN6mVEEPdQBOUzjyJm5Pora4lrwWRFS8I0QAxV/KD6vV/i0WuijHZWQC1fMsPEdxfdVCQ==", + "dev": true, + "requires": { + "for-own": "^1.0.0", + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.0", + "shallow-clone": "^1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "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" + } + }, + "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 + } + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -3277,12 +2701,35 @@ "integrity": "sha1-t9ETrueo3Se9IRM8TcJSnfFyHu0=", "dev": true }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "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.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -3338,6 +2785,35 @@ "sha.js": "^2.4.8" } }, + "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.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, "crypto-browserify": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", @@ -3521,12 +2997,27 @@ "source-map": "^0.5.3" } }, + "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.1" + } + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -3599,8 +3090,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true + "dev": true }, "depd": { "version": "1.1.0", @@ -3608,6 +3098,12 @@ "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=", "dev": true }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -3677,11 +3173,23 @@ } }, "domino": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.0.tgz", - "integrity": "sha512-xINSODvrnuQcm3eXJN4IkBR+JxqLrJN8Ge4fd00y1b7HsY0A4huKN5BflSS/oo8quBWmocTfWdFvrw2H8TjGqQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.1.tgz", + "integrity": "sha512-fqoTi6oQ881wYRENIEmz78hKVoc3X9HqVpklo419yxzebys6dtU5c83iVh3UYvvexPFdAuwlDYCsUM9//CrMMg==", "dev": true }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -3740,6 +3248,15 @@ "iconv-lite": "~0.4.13" } }, + "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" + } + }, "engine.io": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", @@ -3852,6 +3369,12 @@ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, "errno": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", @@ -3876,6 +3399,23 @@ "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", "dev": true }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "http://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + }, + "dependencies": { + "es6-promise": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", + "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "dev": true + } + } + }, "es6-shim": { "version": "0.35.3", "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz", @@ -3944,6 +3484,29 @@ "safe-buffer": "^5.1.1" } }, + "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.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "get-stream": { + "version": "3.0.0", + "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + } + } + }, "expand-braces": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", @@ -4113,6 +3676,37 @@ "is-extendable": "^0.1.0" } }, + "external-editor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz", + "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "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" + } + } + } + }, "extglob": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", @@ -4178,6 +3772,21 @@ "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", "dev": true }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "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" + } + }, "file-loader": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", @@ -4249,6 +3858,38 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", "dev": true }, + "flush-write-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.0.tgz", + "integrity": "sha512-6MHED/cmsyux1G4/Cek2Z776y9t7WCNd3h2h/HW91vFeU7pzMhA8XvAlDhHcanG5IWuIh/xcC7JASY4WQpG6xg==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", + "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "string_decoder": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -4271,25 +3912,14 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" - }, - "dependencies": { - "combined-stream": { - "version": "1.0.6", - "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - } } }, "fragment-cache": { @@ -4301,6 +3931,16 @@ "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.1", + "readable-stream": "^2.0.0" + } + }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -4310,6 +3950,27 @@ "null-check": "^1.0.0" } }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "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.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4845,6 +4506,18 @@ } } }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, "function-bind": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz", @@ -4856,7 +4529,6 @@ "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", "dev": true, - "optional": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4868,6 +4540,21 @@ "wide-align": "^1.1.0" } }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "dev": true, + "requires": { + "globule": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -4880,6 +4567,21 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "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": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -4928,6 +4630,25 @@ "is-glob": "^2.0.0" } }, + "globule": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.1.tgz", + "integrity": "sha512-g7QtgWF4uYSL5/dn71WxubOrS7JVGCnFPEnoeChJmBnyR9Mw8nGoEwOgJL/RC2Te0WhbsEUCejfH8SZNJ+adYQ==", + "dev": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + }, + "dependencies": { + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "dev": true + } + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -4947,31 +4668,37 @@ "dev": true }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" }, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz", + "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "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 + }, + "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 } } @@ -5027,8 +4754,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true + "dev": true }, "has-value": { "version": "0.3.1", @@ -5155,6 +4881,12 @@ "uglify-js": "3.0.x" } }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, "http-errors": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", @@ -5177,6 +4909,27 @@ "requires-port": "1.x.x" } }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "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" + } + } + } + }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", @@ -5194,6 +4947,42 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "dev": true, + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, "iconv-lite": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz", @@ -5269,6 +5058,42 @@ "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 + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "in-publish": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/in-publish/-/in-publish-2.0.0.tgz", + "integrity": "sha1-4g/146KvwmkDILbcVSaCqcf631E=", + "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.0" + } + }, "indexes-of": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", @@ -5297,6 +5122,126 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz", + "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.0", + "figures": "^2.0.0", + "lodash": "^4.17.10", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^6.1.0", + "string-width": "^2.1.0", + "strip-ansi": "^5.0.0", + "through": "^2.3.6" + }, + "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 + }, + "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.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", + "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": { + "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-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz", + "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==", + "dev": true, + "requires": { + "ansi-regex": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz", + "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==", + "dev": true + } + } + }, + "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" + } + } + } + }, "interpret": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", @@ -5309,6 +5254,12 @@ "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 + }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", @@ -5435,6 +5386,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.0" + } + }, "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", @@ -5508,6 +5468,12 @@ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", "dev": true }, + "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", @@ -5593,15 +5559,6 @@ "integrity": "sha1-3skmzQqfoof7bbXHVfpIfnTOysU=", "dev": true }, - "jasmine-diff": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/jasmine-diff/-/jasmine-diff-0.1.3.tgz", - "integrity": "sha1-k8zC3MQQKMXd1GBlWAdIOfLe6qg=", - "dev": true, - "requires": { - "diff": "^3.2.0" - } - }, "js-base64": { "version": "2.1.9", "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz", @@ -5642,6 +5599,12 @@ "integrity": "sha1-i6oTZaYy9Yo8RtIBdfxgAsluN94=", "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": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -5687,6 +5650,12 @@ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", "dev": true }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -5867,18 +5836,48 @@ "object-assign": "^4.0.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" + }, + "dependencies": { + "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 + } + } + }, "lodash": { "version": "4.17.4", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", + "dev": true + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -5891,6 +5890,18 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, + "lodash.mergewith": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz", + "integrity": "sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ==", + "dev": true + }, + "lodash.tail": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.tail/-/lodash.tail-4.1.1.tgz", + "integrity": "sha1-0jM6NtnncXyK0vfKyv7HwytERmQ=", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -5945,6 +5956,16 @@ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", "dev": true }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -5963,12 +5984,64 @@ "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", "dev": true }, + "magic-string": { + "version": "0.25.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.2.tgz", + "integrity": "sha512-iLs9mPjh9IuTtRsqqhNGYcZXGei0Nh/A4xirrsqW7c+QhKVFL2vm7U09ru6cHRD22azaP/wMDgI+HCqbETMTtg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", + "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "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": "0.1.5", "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz", @@ -6010,6 +6083,15 @@ "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.0.0" + } + }, "memory-fs": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz", @@ -6020,6 +6102,32 @@ "readable-stream": "^2.0.1" } }, + "meow": { + "version": "3.7.0", + "resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, "micromatch": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", @@ -6171,6 +6279,12 @@ "mime-db": "~1.27.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", @@ -6198,6 +6312,51 @@ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "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 + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "dev": true, + "requires": { + "minipass": "^2.2.1" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, "mixin-deep": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz", @@ -6208,6 +6367,24 @@ "is-extendable": "^0.1.1" } }, + "mixin-object": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", + "integrity": "sha1-T7lJRB2rGCVA8f4DW6YOGUel5X4=", + "dev": true, + "requires": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-in": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz", + "integrity": "sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE=", + "dev": true + } + } + }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", @@ -6217,18 +6394,43 @@ "minimist": "0.0.8" } }, + "moment": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==", + "dev": true + }, + "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.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "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.11.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", - "dev": true, - "optional": true + "dev": true }, "nanomatch": { "version": "1.2.13", @@ -6364,6 +6566,50 @@ "is-stream": "^1.0.1" } }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "dev": true, + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "tar": { + "version": "2.2.1", + "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + } + } + }, "node-libs-browser": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", @@ -6395,6 +6641,70 @@ "vm-browserify": "0.0.4" } }, + "node-sass": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-4.11.0.tgz", + "integrity": "sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==", + "dev": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^3.0.0", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "in-publish": "^2.0.0", + "lodash.assign": "^4.2.0", + "lodash.clonedeep": "^4.3.2", + "lodash.mergewith": "^4.6.0", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.10.0", + "node-gyp": "^3.8.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "^2.2.4", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + }, + "dependencies": { + "cross-spawn": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz", + "integrity": "sha1-ElYDfsufDF9549bvE14wdwGEuYI=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", @@ -6434,6 +6744,12 @@ "sort-keys": "^1.0.0" } }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==", + "dev": true + }, "npm-package-arg": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", @@ -6460,24 +6776,80 @@ } } }, - "npm-registry-client": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.6.0.tgz", - "integrity": "sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg==", + "npm-packlist": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.3.0.tgz", + "integrity": "sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, + "npm-registry-fetch": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.9.0.tgz", + "integrity": "sha512-srwmt8YhNajAoSAaDWndmZgx89lJwIZ1GWxOuckH4Coek4uHv5S+o/l9FLQe/awA+JwTnj4FJHldxhlXdZEBmw==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "npm-package-arg": "^6.1.0" + }, + "dependencies": { + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } + }, + "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": { - "concat-stream": "^1.5.2", - "graceful-fs": "^4.1.6", - "normalize-package-data": "~1.0.1 || ^2.0.0", - "npm-package-arg": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", - "npmlog": "2 || ^3.1.0 || ^4.0.0", - "once": "^1.3.3", - "request": "^2.74.0", - "retry": "^0.10.0", - "safe-buffer": "^5.1.1", - "semver": "2 >=2.2.1 || 3.x || 4 || 5", - "slide": "^1.1.3", - "ssri": "^5.2.4" + "path-key": "^2.0.0" } }, "npmlog": { @@ -6485,7 +6857,6 @@ "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", "dev": true, - "optional": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -6629,6 +7000,15 @@ "wrappy": "1" } }, + "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.0.0" + } + }, "opn": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", @@ -6691,12 +7071,149 @@ "os-tmpdir": "^1.0.0" } }, + "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.1.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 + }, + "pacote": { + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.4.0.tgz", + "integrity": "sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^11.3.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^3.8.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "bluebird": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.3.tgz", + "integrity": "sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==", + "dev": true + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.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 + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "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" + } + } + } + }, "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.1.5" + } + }, "param-case": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", @@ -6821,6 +7338,12 @@ "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 + }, "path-parse": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", @@ -7464,16 +7987,47 @@ "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", "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 + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, "prr": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", "dev": true }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, "public-encrypt": { @@ -7498,6 +8052,39 @@ } } }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "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.0" + }, + "dependencies": { + "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.1.0", + "once": "^1.3.1" + } + } + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -7672,6 +8259,25 @@ } } }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "^1.1.6" + } + }, + "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" + } + }, "reduce-css-calc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", @@ -7773,6 +8379,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.0" + } + }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -7808,18 +8423,18 @@ "dev": true }, "mime-db": { - "version": "1.36.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", - "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", "dev": true }, "mime-types": { - "version": "2.1.20", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", - "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "dev": true, "requires": { - "mime-db": "~1.36.0" + "mime-db": "~1.37.0" } }, "qs": { @@ -7875,6 +8490,16 @@ "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.0", + "signal-exit": "^3.0.2" + } + }, "ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", @@ -7915,10 +8540,28 @@ "inherits": "^2.0.1" } }, + "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.1.1" + } + }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -7994,6 +8637,127 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sass-graph": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.4.tgz", + "integrity": "sha1-E/vWPNHK8JCLn9k0dq1DpR0eC0k=", + "dev": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "yargs": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.0.tgz", + "integrity": "sha1-a6MY6xaWFyf10oT46gA+jWFU0Mg=", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.0" + } + }, + "yargs-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "^3.0.0" + } + } + } + }, + "sass-loader": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.1.0.tgz", + "integrity": "sha512-+G+BKGglmZM2GUSfT9TLuEp6tzehHPjAMoRRItOojWIqIGPloVCMhNIQuG639eJ+y033PaGTSjLaTHts8Kw79w==", + "dev": true, + "requires": { + "clone-deep": "^2.0.1", + "loader-utils": "^1.0.1", + "lodash.tail": "^4.1.1", + "neo-async": "^2.5.0", + "pify": "^3.0.0", + "semver": "^5.5.0" + }, + "dependencies": { + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true + }, + "json5": { + "version": "1.0.1", + "resolved": "http://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.0.tgz", + "integrity": "sha512-KkQxP+pVgJC6ypy8ePypyhsV/hZeyVlkqiqrxe4pDgCwClbzmr3dGy8LbeSVhmfzYmCpOovdrVs/9chsQXCrLQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", + "dev": true + } + } + }, "sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", @@ -8009,6 +8773,27 @@ "ajv": "^5.0.0" } }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "dev": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "http://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, "semver": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", @@ -8088,17 +8873,61 @@ "safe-buffer": "^5.0.1" } }, + "shallow-clone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-1.0.0.tgz", + "integrity": "sha512-oeXreoKR/SyNJtRJMAKPDSvd28OqEwG4eR/xc856cRGBII7gX9lvAqDxusPm0846z/w/hWYjI1NpKwJ00NHzRA==", + "dev": true, + "requires": { + "is-extendable": "^0.1.1", + "kind-of": "^5.0.0", + "mixin-object": "^2.0.1" + }, + "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 + } + } + }, + "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 + }, + "shelljs": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", + "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", + "dev": true, + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true + "dev": true }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "smart-buffer": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.2.tgz", + "integrity": "sha512-JDhEpTKzXusOqXZ0BUIdH+CjFdO/CR3tLlf5CN34IypI+xMmXW1uB16OOY8z3cICbJlDAVJzNbwBhNO0wt9OAw==", "dev": true }, "snapdragon": { @@ -8322,6 +9151,26 @@ } } }, + "socks": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.3.tgz", + "integrity": "sha512-+2r83WaRT3PXYoO/1z+RDEBE7Z2f9YcdQnJ0K/ncXXbV5gJ6wYfNAebYFYiiUjM6E4JyXnPY8cimwyvFYHVUUA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "4.0.2" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "dev": true, + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -8370,6 +9219,12 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", "dev": true }, + "sourcemap-codec": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz", + "integrity": "sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg==", + "dev": true + }, "spdx-correct": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", @@ -8437,9 +9292,9 @@ "dev": true }, "sshpk": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", - "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", + "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -8454,12 +9309,12 @@ } }, "ssri": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz", - "integrity": "sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "safe-buffer": "^5.1.1" + "figgy-pudding": "^3.5.1" } }, "static-extend": { @@ -8510,6 +9365,15 @@ "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", "dev": true }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, "stream-browserify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", @@ -8520,6 +9384,16 @@ "readable-stream": "^2.0.2" } }, + "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.1.0", + "stream-shift": "^1.0.0" + } + }, "stream-http": { "version": "2.8.3", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", @@ -8565,6 +9439,12 @@ } } }, + "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 + }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", @@ -8609,6 +9489,21 @@ "is-utf8": "^0.2.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://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" + } + }, "style-loader": { "version": "0.18.2", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", @@ -8665,12 +9560,77 @@ "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", "dev": true }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "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 + } + } + }, "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.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "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 + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "http://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.0", + "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.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "http://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.0" + } + } + } + }, "timers-browserify": { "version": "2.0.10", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", @@ -8799,41 +9759,19 @@ "integrity": "sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg==", "dev": true }, - "tsickle": { - "version": "0.32.1", - "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.32.1.tgz", - "integrity": "sha512-JW9j+W0SaMSZGejIFZBk0AiPfnhljK3oLx5SaqxrJhjlvzFyPml5zqG1/PuScUj6yTe1muEqwk5CnDK0cOZmKw==", + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", "dev": true, "requires": { - "jasmine-diff": "^0.1.3", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "source-map": "^0.6.0", - "source-map-support": "^0.5.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "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 - }, - "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - } + "glob": "^7.1.2" } }, "tslib": { @@ -8958,9 +9896,9 @@ "dev": true }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", + "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", "dev": true }, "uglify-js": { @@ -9019,6 +9957,24 @@ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=", "dev": true }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -9048,9 +10004,9 @@ "dev": true }, "uri-js": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-3.0.2.tgz", - "integrity": "sha1-+QuFhQf4HepNz7s8TD2/orVX+qo=", + "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.0" @@ -9524,7 +10480,6 @@ "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, - "optional": true, "requires": { "string-width": "^1.0.2 || 2" } @@ -9603,6 +10558,12 @@ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", "dev": true }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + }, "yargs": { "version": "6.6.0", "resolved": "http://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", @@ -9667,9 +10628,9 @@ "dev": true }, "zone.js": { - "version": "0.8.26", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.26.tgz", - "integrity": "sha512-W9Nj+UmBJG251wkCacIkETgra4QgBo/vgoEkb4a2uoLzpQG7qF9nzwoLXWU5xj3Fg2mxGvEDh47mg24vXccYjA==", + "version": "0.8.29", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.29.tgz", + "integrity": "sha512-mla2acNCMkWXBD+c+yeUrBUrzOxYMNFdQ6FGfigGGtEVBPJx07BQeJekjt9DmH1FtZek4E9rE1eRR9qQpxACOQ==", "dev": true } } diff --git a/DevActivator/package.json b/DevActivator/package.json index 655b8fd..7efee18 100644 --- a/DevActivator/package.json +++ b/DevActivator/package.json @@ -3,27 +3,31 @@ "private": true, "version": "0.0.0", "scripts": { - "start": "node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js && node node_modules/webpack/bin/webpack.js --watch", + "start": "webpack --config webpack.config.vendor.js && webpack --watch", + "build:vendor": "webpack --config webpack.config.vendor.js", "lint": "node node_modules/tslint/bin/tslint -p tsconfig.json -c tslint.json", "test": "karma start ClientApp/test/karma.conf.js", "prod": "node node_modules/webpack/bin/webpack.js --config webpack.config.vendor.js --env.prod && node node_modules/webpack/bin/webpack.js --env.prod" }, "devDependencies": { - "@angular/animations": "6.1.10", - "@angular/cdk": "^6.4.7", - "@angular/cli": "^6.2.5", - "@angular/common": "6.1.10", - "@angular/compiler": "6.1.10", - "@angular/compiler-cli": "6.1.10", - "@angular/core": "6.1.10", - "@angular/forms": "6.1.10", - "@angular/http": "6.1.10", - "@angular/material": "^6.4.7", - "@angular/platform-browser": "6.1.10", - "@angular/platform-browser-dynamic": "6.1.10", - "@angular/platform-server": "6.1.10", - "@angular/router": "6.1.10", - "@ngtools/webpack": "^6.2.5", + "@angular/animations": "7.2.4", + "@angular/cdk": "^7.3.1", + "@angular/cli": "^7.3.0", + "@angular/common": "7.2.4", + "@angular/compiler": "7.2.4", + "@angular/compiler-cli": "7.2.4", + "@angular/core": "7.2.4", + "@angular/forms": "7.2.4", + "@angular/http": "7.2.4", + "@angular/material": "^7.3.1", + "@angular/material-moment-adapter": "^7.3.1", + "@angular/platform-browser": "7.2.4", + "@angular/platform-browser-dynamic": "7.2.4", + "@angular/platform-server": "7.2.4", + "@angular/router": "7.2.4", + "@mat-datetimepicker/core": "^2.0.1", + "@mat-datetimepicker/moment": "^2.0.1", + "@ngtools/webpack": "^7.1.4", "@types/chai": "4.0.1", "@types/jasmine": "^2.5.53", "@types/webpack-env": "1.13.0", @@ -51,20 +55,23 @@ "karma-cli": "1.0.1", "karma-jasmine": "1.1.0", "karma-webpack": "2.0.3", + "moment": "^2.24.0", + "node-sass": "^4.11.0", "preboot": "4.5.2", "raw-loader": "0.5.1", "reflect-metadata": "0.1.10", - "rxjs": "6.3.3", + "rxjs": "6.4.0", "rxjs-tslint": "^0.1.5", + "sass-loader": "^7.1.0", "style-loader": "0.18.2", "to-string-loader": "1.1.5", "tslint": "^5.11.0", - "typescript": "2.9.2", + "typescript": "3.2.4", "url-loader": "0.5.9", "webpack": "^2.5.1", "webpack-hot-middleware": "2.18.2", "webpack-merge": "4.1.0", - "zone.js": "0.8.26" + "zone.js": "0.8.29" }, "dependencies": {} } diff --git a/DevActivator/tslint.json b/DevActivator/tslint.json index d17e372..6d75524 100644 --- a/DevActivator/tslint.json +++ b/DevActivator/tslint.json @@ -6,6 +6,8 @@ ], "jsRules": {}, "rules": { + "object-literal-sort-keys": false, + "ordered-imports": false, "max-line-length": [ true, { diff --git a/DevActivator/webpack.config.vendor.js b/DevActivator/webpack.config.vendor.js index ada0ef2..92c8e4e 100644 --- a/DevActivator/webpack.config.vendor.js +++ b/DevActivator/webpack.config.vendor.js @@ -19,7 +19,8 @@ const nonTreeShakableModules = [ 'es6-promise', 'es6-shim', 'event-source-polyfill', - '@angular/material/prebuilt-themes/indigo-pink.css', + 'moment', + './ClientApp/app/styles.scss' ]; const allModules = treeShakableModules.concat(nonTreeShakableModules); @@ -27,11 +28,11 @@ module.exports = (env) => { const extractCSS = new ExtractTextPlugin('vendor.css'); const isDevBuild = !(env && env.prod); const sharedConfig = { - stats: {modules: false}, - resolve: {extensions: ['.js']}, + stats: { modules: false }, + resolve: { extensions: ['.js'] }, module: { rules: [ - {test: /\.(png|woff|woff2|eot|ttf|svg)(\?|$)/, use: 'url-loader?limit=100000'} + { test: /\.(png|woff|woff2|eot|ttf|svg)(\?|$)/, use: 'url-loader?limit=100000' } ] }, output: { @@ -52,10 +53,16 @@ module.exports = (env) => { // But for production builds, leave the tree-shakable ones out so the AOT compiler can produce a smaller bundle. vendor: isDevBuild ? allModules : nonTreeShakableModules }, - output: {path: path.join(__dirname, 'wwwroot', 'dist')}, + output: { path: path.join(__dirname, 'wwwroot', 'dist') }, module: { rules: [ - {test: /\.css(\?|$)/, use: extractCSS.extract({use: isDevBuild ? 'css-loader' : 'css-loader?minimize'})} + { + test: /\.scss$/, + use: extractCSS.extract([ + isDevBuild ? "css-loader" : "css-loader?minimize", // translates CSS into CommonJS + "sass-loader" // compiles Sass to CSS, using Node Sass by default + ]) + } ] }, plugins: [ diff --git a/DevActivator/wwwroot/icons/meetup.svg b/DevActivator/wwwroot/icons/meetup.svg new file mode 100644 index 0000000..f767bb2 --- /dev/null +++ b/DevActivator/wwwroot/icons/meetup.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/DevActivator/wwwroot/material-icons/font.css b/DevActivator/wwwroot/material-icons/font.css new file mode 100644 index 0000000..ae9c8b0 --- /dev/null +++ b/DevActivator/wwwroot/material-icons/font.css @@ -0,0 +1,24 @@ +/* fallback */ + +@font-face { + font-family: 'Material Icons'; + font-style: normal; + font-weight: 400; + src: url(/material-icons/font.woff2) format('woff2'); +} + +.material-icons { + font-family: 'Material Icons'; + font-weight: normal; + font-style: normal; + font-size: 24px; + line-height: 1; + letter-spacing: normal; + text-transform: none; + display: inline-block; + white-space: nowrap; + word-wrap: normal; + direction: ltr; + -webkit-font-feature-settings: 'liga'; + -webkit-font-smoothing: antialiased; +} \ No newline at end of file diff --git a/DevActivator/wwwroot/material-icons/font.woff2 b/DevActivator/wwwroot/material-icons/font.woff2 new file mode 100644 index 0000000..00e008a Binary files /dev/null and b/DevActivator/wwwroot/material-icons/font.woff2 differ