diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d788581 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +################################################################################ +# This .gitignore file was automatically created by Microsoft(R) Visual Studio. +################################################################################ + +/GeekHunters.Repository/obj/project.assets.json +/GeekHunters.Repository/obj/GeekHunters.Repository.csproj.nuget.g.targets +/GeekHunters.Repository/obj/GeekHunters.Repository.csproj.nuget.g.props +/GeekHunters.Repository/obj/GeekHunters.Repository.csproj.nuget.cache +/GeekHunters.Repository/obj/Debug/netstandard2.0/GeekHunters.Repository.csproj.CoreCompileInputs.cache +/GeekHunters.Repository/obj/Debug/netstandard2.0/GeekHunters.Repository.AssemblyInfoInputs.cache +/GeekHunters.Repository/obj/Debug/netstandard2.0/GeekHunters.Repository.AssemblyInfo.cs +/GeekHunters.UnitTest/obj/project.assets.json +/GeekHunters.UnitTest/obj/GeekHunters.UnitTest.csproj.nuget.g.targets +/GeekHunters.UnitTest/obj/GeekHunters.UnitTest.csproj.nuget.g.props +/GeekHunters.UnitTest/obj/GeekHunters.UnitTest.csproj.nuget.cache +/GeekHunters.UnitTest/obj/Debug/netcoreapp2.0/GeekHunters.UnitTest.Program.cs +/GeekHunters.UnitTest/obj/Debug/netcoreapp2.0/GeekHunters.UnitTest.csproj.CoreCompileInputs.cache +/GeekHunters.UnitTest/obj/Debug/netcoreapp2.0/GeekHunters.UnitTest.AssemblyInfoInputs.cache +/GeekHunters.UnitTest/obj/Debug/netcoreapp2.0/GeekHunters.UnitTest.AssemblyInfo.cs diff --git a/.vs/GeekHunters/v15/.suo b/.vs/GeekHunters/v15/.suo new file mode 100644 index 0000000..e2d3313 Binary files /dev/null and b/.vs/GeekHunters/v15/.suo differ diff --git a/.vs/GeekHunters/v15/sqlite3/storage.ide b/.vs/GeekHunters/v15/sqlite3/storage.ide new file mode 100644 index 0000000..fb8c0f6 Binary files /dev/null and b/.vs/GeekHunters/v15/sqlite3/storage.ide differ diff --git a/GeekHunter.sqlite b/GeekHunter.sqlite deleted file mode 100644 index 7401c48..0000000 Binary files a/GeekHunter.sqlite and /dev/null differ diff --git a/GeekHunters.Repository/DocumentDBRepository.cs b/GeekHunters.Repository/DocumentDBRepository.cs new file mode 100644 index 0000000..273e7ed --- /dev/null +++ b/GeekHunters.Repository/DocumentDBRepository.cs @@ -0,0 +1,120 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Threading.Tasks; +using Microsoft.Azure.Documents; +using Microsoft.Azure.Documents.Client; +using Microsoft.Azure.Documents.Linq; + +namespace GeekHunters.Repository +{ + public static class DocumentDBRepository where T : class + { + private static readonly string Endpoint = "https://solly-cosmos-db.documents.azure.com:443/"; + private static readonly string Key = "UVfKKF6vLm3SV3HNj7wJ5LvYCC1Ctnl4WTcswJUXwbk3A1gEmOFvsScErzlFi3CwaRPTNJjvVcaUXhHjunyRPw=="; + private static readonly string DatabaseId = "GeekHunters"; + private static readonly string CollectionId = "Candidates"; + private static DocumentClient client; + + public static void Initialize() + { + client = new DocumentClient(new Uri(Endpoint), Key); + CreateDatabaseIfNotExistsAsync().Wait(); + CreateCollectionIfNotExistsAsync().Wait(); + } + + public static async Task GetItemAsync(string id) + { + try + { + Document document = await client.ReadDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id)); + return (T)(dynamic)document; + } + catch (DocumentClientException e) + { + if (e.StatusCode == System.Net.HttpStatusCode.NotFound) + { + return null; + } + else + { + throw; + } + } + } + + public static async Task> GetItemsAsync(Expression> predicate) + { + IDocumentQuery query = client.CreateDocumentQuery( + UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId), + new FeedOptions { MaxItemCount = -1 }) + .Where(predicate) + .AsDocumentQuery(); + + List results = new List(); + while (query.HasMoreResults) + { + results.AddRange(await query.ExecuteNextAsync()); + } + + return results; + } + + public static async Task CreateItemAsync(T item) + { + return await client.CreateDocumentAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId), item); + } + + public static async Task UpdateItemAsync(string id, T item) + { + return await client.ReplaceDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id), item); + } + + public static async Task DeleteItemAsync(string id) + { + await client.DeleteDocumentAsync(UriFactory.CreateDocumentUri(DatabaseId, CollectionId, id)); + } + + private static async Task CreateDatabaseIfNotExistsAsync() + { + try + { + await client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(DatabaseId)); + } + catch (DocumentClientException e) + { + if (e.StatusCode == System.Net.HttpStatusCode.NotFound) + { + await client.CreateDatabaseAsync(new Database { Id = DatabaseId }); + } + else + { + throw; + } + } + } + + private static async Task CreateCollectionIfNotExistsAsync() + { + try + { + await client.ReadDocumentCollectionAsync(UriFactory.CreateDocumentCollectionUri(DatabaseId, CollectionId)); + } + catch (DocumentClientException e) + { + if (e.StatusCode == System.Net.HttpStatusCode.NotFound) + { + await client.CreateDocumentCollectionAsync( + UriFactory.CreateDatabaseUri(DatabaseId), + new DocumentCollection { Id = CollectionId }, + new RequestOptions { OfferThroughput = 1000 }); + } + else + { + throw; + } + } + } + } +} diff --git a/GeekHunters.Repository/GeekHunters.Repository.csproj b/GeekHunters.Repository/GeekHunters.Repository.csproj new file mode 100644 index 0000000..411d971 --- /dev/null +++ b/GeekHunters.Repository/GeekHunters.Repository.csproj @@ -0,0 +1,11 @@ + + + + netstandard2.0 + + + + + + + diff --git a/GeekHunters.UnitTest/CandidateServiceTest.cs b/GeekHunters.UnitTest/CandidateServiceTest.cs new file mode 100644 index 0000000..65abafa --- /dev/null +++ b/GeekHunters.UnitTest/CandidateServiceTest.cs @@ -0,0 +1,219 @@ +using GeekHunters.Interfaces; +using GeekHunters.Models; +using GeekHunters.Repository; +using Moq; +using NUnit.Framework; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace GeekHunters.UnitTest +{ + [TestFixture] + public class CandidateServiceTest + { + private List candidates; + private List technologies; + + [OneTimeSetUp] + public void RepositorySetUp() + { + DocumentDBRepository.Initialize(); + + candidates = new List() { + new Candidate(){ ID = Guid.NewGuid(), FirstName = "FirstName_1", LastName = "LastName_1" }, + new Candidate(){ ID = Guid.NewGuid(), FirstName = "FirstName_2", LastName = "LastName_2" }, + new Candidate(){ ID = Guid.NewGuid(), FirstName = "FirstName_3", LastName = "LastName_3" } + }; + + technologies = new List() { "Azure", "SQL", "CSharp", "Angular" }; + } + + [Test] + public async Task GetAllCandidatesAsync_Success() + { + // Arrange + var mockService = new Mock(); + mockService.Setup(x => x.GetAllAsync()).Returns(async () => + { + await Task.Yield(); + return candidates; + }); + + // Act + var actual = await mockService.Object.GetAllAsync(); + + // Assert + Assert.AreEqual(candidates.Count(), actual.Count()); + } + + [Test] + public async Task GetCandidateAsynch_Success() + { + // Arrange + var candidate = new Candidate + { + ID = Guid.NewGuid(), + FirstName = "Conor", + LastName = "Mcgregor", + Technologies = technologies.Take(2).ToArray() + }; + + var mockService = new Mock(); + mockService.Setup(x => x.GetAsync(candidate.ID.ToString())).Returns(async () => + { + await Task.Yield(); + return candidate; + }); + + // Act + await mockService.Object.AddAsync(candidate); + var actual = await mockService.Object.GetAsync(candidate.ID.ToString()); + + // Assert + Assert.AreEqual(candidate, actual); + } + + [Test] + public async Task GetCandidateAsynch_NotFound_Success() + { + // Arrange + var candidateId = Guid.NewGuid().ToString(); + var mockService = new Mock(); + + mockService.Setup(x => x.GetAsync(candidateId)).Returns(async () => + { + await Task.Yield(); + return null; + }); + + // Act + var actual = await mockService.Object.GetAsync(candidateId); + + // Assert + mockService.Verify(m => m.GetAsync(candidateId), Times.AtLeastOnce()); + Assert.AreEqual(null, actual); + } + + [Test] + public async Task AddCandidateAsynch_Candidate_Success() + { + // Arrange + var candidate = new Candidate + { + ID = Guid.NewGuid(), + FirstName = "Conor", + LastName = "Mcgregor", + Technologies = technologies.Take(2).ToArray() + }; + + var mockService = new Mock(); + mockService.Setup(x => x.AddAsync(It.IsAny())).Returns(async () => + { + await Task.Yield(); + return candidate; + }); + + // Act + var actual = await mockService.Object.AddAsync(candidate); + + // Assert + Assert.AreEqual(candidate, actual); + } + + [Test] + public void AddCandidateAsynch_CandidateIsNull_Failure_Throws() + { + string errorMessage = "Candidate cannot be null"; + + // Arrange + var candidate = It.IsAny(); + + // Act and Assert + Assert.That(async () => + await AddCandidateAsyncThrowException(candidate, errorMessage), + Throws.Exception.TypeOf().And.Message.EqualTo(errorMessage)); + } + + [Test] + public void AddCandidateAsynch_CandidateFirstNameIsEmpty_Failure_Throws() + { + string errorMessage = "First name cannot be empty"; + + // Arrange + var candidate = new Candidate + { + ID = Guid.NewGuid(), + LastName = "Mcgregor", + Technologies = technologies.Take(2).ToArray() + }; + + // Act and Assert + Assert.That(async () => + await AddCandidateAsyncThrowException(candidate, errorMessage), + Throws.Exception.TypeOf().And.Message.EqualTo(errorMessage)); + } + + [Test] + public async Task UpdateCandidateAsynch_Success() + { + // Arrange + var candidate = new Candidate + { + ID = Guid.NewGuid(), + FirstName = "Conor", + LastName = "Mcgregor", + Technologies = technologies.Take(2).ToArray() + }; + + var mockService = new Mock(); + mockService.Setup(x => x.UpdateAsync(candidate.ID.ToString(), It.IsAny())).Returns(async () => + { + await Task.Yield(); + }); + + // Act + await mockService.Object.UpdateAsync(candidate.ID.ToString(), candidate); + + // Assert + mockService.Verify(m => m.UpdateAsync(candidate.ID.ToString(), It.IsAny()), Times.AtLeastOnce()); + Assert.That(candidate.FirstName, Is.EqualTo("Conor")); + } + + [Test] + public async Task DeleteCandidateAsynch_Success() + { + // Arrange + var candidate = new Candidate + { + ID = Guid.NewGuid(), + FirstName = "Conor", + LastName = "Mcgregor", + Technologies = technologies.Take(2).ToArray() + }; + + var mockService = new Mock(); + mockService.Setup(x => x.DeleteAsync(candidate.ID.ToString())).Returns(async () => + { + await Task.Yield(); + }); + + // Act + await mockService.Object.DeleteAsync(candidate.ID.ToString()); + var actual = await mockService.Object.GetAsync(candidate.ID.ToString()); + + // Assert + mockService.Verify(m => m.DeleteAsync(candidate.ID.ToString())); + mockService.Verify(m => m.GetAsync(candidate.ID.ToString())); + Assert.AreEqual(null, actual); + } + + private async Task AddCandidateAsyncThrowException(Candidate candidate, string errorMessage) + { + var mockService = new Mock(); + await mockService.Object.AddAsync(candidate).ConfigureAwait(false); + throw new Exception(errorMessage); + } + } +} diff --git a/GeekHunters.UnitTest/GeekHunters.UnitTest.csproj b/GeekHunters.UnitTest/GeekHunters.UnitTest.csproj new file mode 100644 index 0000000..0b8d6a9 --- /dev/null +++ b/GeekHunters.UnitTest/GeekHunters.UnitTest.csproj @@ -0,0 +1,22 @@ + + + + netcoreapp2.0 + + false + + + + + + + + + + + + + + + + diff --git a/GeekHunters.sln b/GeekHunters.sln new file mode 100644 index 0000000..208b448 --- /dev/null +++ b/GeekHunters.sln @@ -0,0 +1,37 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26730.10 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GeekHunters", "GeekHunters\GeekHunters.csproj", "{0F4CC659-1E74-4D34-84BA-CB3EB4404363}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "GeekHunters.Repository", "GeekHunters.Repository\GeekHunters.Repository.csproj", "{2C4D0ACA-6C80-4F6A-BEEF-8FACFBC57B99}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GeekHunters.UnitTest", "GeekHunters.UnitTest\GeekHunters.UnitTest.csproj", "{BD15F84A-5198-417B-8541-64BC0233827E}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0F4CC659-1E74-4D34-84BA-CB3EB4404363}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0F4CC659-1E74-4D34-84BA-CB3EB4404363}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F4CC659-1E74-4D34-84BA-CB3EB4404363}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0F4CC659-1E74-4D34-84BA-CB3EB4404363}.Release|Any CPU.Build.0 = Release|Any CPU + {2C4D0ACA-6C80-4F6A-BEEF-8FACFBC57B99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2C4D0ACA-6C80-4F6A-BEEF-8FACFBC57B99}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C4D0ACA-6C80-4F6A-BEEF-8FACFBC57B99}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2C4D0ACA-6C80-4F6A-BEEF-8FACFBC57B99}.Release|Any CPU.Build.0 = Release|Any CPU + {BD15F84A-5198-417B-8541-64BC0233827E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD15F84A-5198-417B-8541-64BC0233827E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD15F84A-5198-417B-8541-64BC0233827E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD15F84A-5198-417B-8541-64BC0233827E}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {5FC69AF4-CAE6-4A84-BC5B-92E2E0EF9F92} + EndGlobalSection +EndGlobal diff --git a/GeekHunters/.gitignore b/GeekHunters/.gitignore new file mode 100644 index 0000000..d261e7c --- /dev/null +++ b/GeekHunters/.gitignore @@ -0,0 +1,237 @@ +/Properties/launchSettings.json + +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ +/wwwroot/dist/ +/ClientApp/dist/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +/yarn.lock + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/GeekHunters/ClientApp/app/app.module.browser.ts b/GeekHunters/ClientApp/app/app.module.browser.ts new file mode 100644 index 0000000..69c424c --- /dev/null +++ b/GeekHunters/ClientApp/app/app.module.browser.ts @@ -0,0 +1,23 @@ +import { NgModule } from '@angular/core'; +import { BrowserModule } from '@angular/platform-browser'; +import { AppModuleShared } from './app.module.shared'; +import { AppComponent } from './components/app/app.component'; +import { GeekService } from './components/shared/geek.service'; + +@NgModule({ + bootstrap: [ AppComponent ], + imports: [ + BrowserModule, + AppModuleShared + ], + providers: [ + { provide: 'BASE_URL', useFactory: getBaseUrl }, + GeekService + ] +}) +export class AppModule { +} + +export function getBaseUrl() { + return document.getElementsByTagName('base')[0].href; +} diff --git a/GeekHunters/ClientApp/app/app.module.server.ts b/GeekHunters/ClientApp/app/app.module.server.ts new file mode 100644 index 0000000..02c4b66 --- /dev/null +++ b/GeekHunters/ClientApp/app/app.module.server.ts @@ -0,0 +1,16 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { AppModuleShared } from './app.module.shared'; +import { AppComponent } from './components/app/app.component'; +import { GeekService } from './components/shared/geek.service'; + +@NgModule({ + bootstrap: [ AppComponent ], + imports: [ + ServerModule, + AppModuleShared + ], + providers: [GeekService] +}) +export class AppModule { +} diff --git a/GeekHunters/ClientApp/app/app.module.shared.ts b/GeekHunters/ClientApp/app/app.module.shared.ts new file mode 100644 index 0000000..dda5d1e --- /dev/null +++ b/GeekHunters/ClientApp/app/app.module.shared.ts @@ -0,0 +1,42 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { HttpModule } from '@angular/http'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './components/app/app.component'; +import { NavMenuComponent } from './components/navmenu/navmenu.component'; +import { HomeComponent } from './components/home/home.component'; +import { FetchDataComponent } from './components/fetchdata/fetchdata.component'; +import { CounterComponent } from './components/counter/counter.component'; +import { CandidateComponent } from './components/candidate/candidate.component'; +import { CandidateListComponent } from './components/candidate/candidate-list.component'; + +@NgModule({ + declarations: [ + AppComponent, + NavMenuComponent, + CounterComponent, + FetchDataComponent, + HomeComponent, + CandidateComponent, + CandidateListComponent + ], + imports: [ + CommonModule, + HttpModule, + FormsModule, + RouterModule.forRoot([ + { path: '', redirectTo: 'home', pathMatch: 'full' }, + { path: 'home', component: HomeComponent }, + { path: 'counter', component: CounterComponent }, + { path: 'fetch-data', component: FetchDataComponent }, + { path: 'candidate', component: CandidateListComponent }, + { path: 'candidate/:id', component: CandidateComponent }, + { path: 'candidate/new', component: CandidateComponent }, + { path: '**', redirectTo: 'home' } + ]) + ] +}) +export class AppModuleShared { +} diff --git a/GeekHunters/ClientApp/app/components/app/app.component.css b/GeekHunters/ClientApp/app/components/app/app.component.css new file mode 100644 index 0000000..0601339 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/app/app.component.css @@ -0,0 +1,9 @@ +@media (max-width: 767px) { + /* On small screens, the nav menu spans the full width of the screen. Leave a space for it. */ + .body-content { + padding-top: 50px; + } + .form-control { + width:200px; + } +} diff --git a/GeekHunters/ClientApp/app/components/app/app.component.html b/GeekHunters/ClientApp/app/components/app/app.component.html new file mode 100644 index 0000000..f208d1e --- /dev/null +++ b/GeekHunters/ClientApp/app/components/app/app.component.html @@ -0,0 +1,10 @@ +
+
+
+ +
+
+ +
+
+
diff --git a/GeekHunters/ClientApp/app/components/app/app.component.ts b/GeekHunters/ClientApp/app/components/app/app.component.ts new file mode 100644 index 0000000..b20a1ae --- /dev/null +++ b/GeekHunters/ClientApp/app/components/app/app.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app', + templateUrl: './app.component.html', + styleUrls: ['./app.component.css'] +}) +export class AppComponent { +} diff --git a/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.css b/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.css new file mode 100644 index 0000000..6d1dfd1 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.css @@ -0,0 +1,4 @@ +.btn-sm { + width:60px; + margin-left:3px; +} diff --git a/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.html b/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.html new file mode 100644 index 0000000..bbf25d5 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.html @@ -0,0 +1,39 @@ +

Candidate List

+ +

Loading...

+ +
+
+
+ + +
+
+
+
+ + + + + + + + + + + + + + + + + + +
First NameLast NameTechnology 
{{ candidate.firstName }}{{ candidate.lastName }}{{ candidate.technologies }} + + +
+ diff --git a/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.ts b/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.ts new file mode 100644 index 0000000..f83183b --- /dev/null +++ b/GeekHunters/ClientApp/app/components/candidate/candidate-list.component.ts @@ -0,0 +1,57 @@ + +import { Component } from '@angular/core'; +import { GeekService } from '../shared/geek.service'; +import { Candidate } from '../shared/candidate.type'; + +@Component({ + selector: 'candidate-list', + templateUrl: './candidate-list.component.html', + styleUrls: ['./candidate-list.component.css'] +}) +export class CandidateListComponent { + public candidates: Candidate[]; + public technologyList: string[]; + + constructor(private geekService: GeekService) { + this.technologyList = geekService.TechnologyList; + this.getCandidates(); + } + + private filterCandidates(filter: string) { + if (filter == "All"){ + this.getCandidates(); + return; + } + + this.geekService.getCandidates() + .subscribe(candidates => { + this.candidates = candidates.filter(c => this.findCandidate(c.technologies, [filter])); + }); + } + + private findCandidate = function (haystack: string[], arr: string[]) { + return arr.some(function (v) { + return haystack.indexOf(v) >= 0; + }); + }; + + private getCandidates() { + this.geekService.getCandidates() + .subscribe(candidates => { + this.candidates = candidates; + }); + } + + private deleteCandidate(id: string) { + if (confirm("Are you sure you want to delete this candidate?")) { + this.geekService.deleteCandidate(id) + .subscribe(() => { + this.getCandidates(); + }); + } + } + + private onTechnologyChange(technology: string): void { + this.filterCandidates(technology); + } +} diff --git a/GeekHunters/ClientApp/app/components/candidate/candidate.component.css b/GeekHunters/ClientApp/app/components/candidate/candidate.component.css new file mode 100644 index 0000000..eb03b88 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/candidate/candidate.component.css @@ -0,0 +1,19 @@ +.form-control { + width: 75%; +} + +.btn-success { + width:75px; +} + +.alert-danger { + width: 75%; +} + +.ng-valid[required], .ng-valid.required { + border-left: 5px solid #42A948; /* green */ +} + +.ng-invalid:not(form) { + border-left: 5px solid #a94442; /* red */ +} \ No newline at end of file diff --git a/GeekHunters/ClientApp/app/components/candidate/candidate.component.html b/GeekHunters/ClientApp/app/components/candidate/candidate.component.html new file mode 100644 index 0000000..7a85646 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/candidate/candidate.component.html @@ -0,0 +1,29 @@ +

Candidate Details

+ +
+
+
+ + +
+ First Name is required +
+
+
+ + +
+ Last Name is required +
+
+
+ + +
+ + + +
+
diff --git a/GeekHunters/ClientApp/app/components/candidate/candidate.component.ts b/GeekHunters/ClientApp/app/components/candidate/candidate.component.ts new file mode 100644 index 0000000..423e993 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/candidate/candidate.component.ts @@ -0,0 +1,58 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; +import { GeekService } from '../shared/geek.service'; +import { Candidate } from '../shared/candidate.type'; + +@Component({ + selector: 'candidate', + templateUrl: './candidate.component.html', + styleUrls: ['./candidate.component.css'] +}) + +export class CandidateComponent implements OnInit { + public candidate: Candidate = new Candidate(); + public isNew: boolean = true; + public technologyList: string[]; + + constructor( + private activatedRoute: ActivatedRoute, + private router: Router, + private geekService: GeekService) { + this.technologyList = geekService.TechnologyList; + } + + ngOnInit(): void { + let id = this.activatedRoute.snapshot.params['id'] as string; + if (id !== 'new') { + this.isNew = false; + this.getCandidate(id); + } + } + + private getCandidate(id: string) { + this.geekService.getCandidate(id) + .subscribe(candidate => { + this.candidate = candidate; + }); + } + + public addCandidate() { + this.geekService.addCandidate(this.candidate) + .subscribe(() => { + this.router.navigate(["candidate"]); + }); + } + + public updateCandidate() { + this.geekService.updateCandidate(this.candidate) + .subscribe(() => { + this.router.navigate(['candidate']); + }); + } + + public navigateToList() + { + this.router.navigate(["candidate"]); + } +} \ No newline at end of file diff --git a/GeekHunters/ClientApp/app/components/counter/counter.component.html b/GeekHunters/ClientApp/app/components/counter/counter.component.html new file mode 100644 index 0000000..2521eda --- /dev/null +++ b/GeekHunters/ClientApp/app/components/counter/counter.component.html @@ -0,0 +1,7 @@ +

Counter

+ +

This is a simple example of an Angular component.

+ +

Current count: {{ currentCount }}

+ + diff --git a/GeekHunters/ClientApp/app/components/counter/counter.component.spec.ts b/GeekHunters/ClientApp/app/components/counter/counter.component.spec.ts new file mode 100644 index 0000000..61e49bc --- /dev/null +++ b/GeekHunters/ClientApp/app/components/counter/counter.component.spec.ts @@ -0,0 +1,29 @@ +/// +import { assert } from 'chai'; +import { CounterComponent } from './counter.component'; +import { TestBed, async, ComponentFixture } from '@angular/core/testing'; + +let fixture: ComponentFixture; + +describe('Counter component', () => { + beforeEach(() => { + TestBed.configureTestingModule({ declarations: [CounterComponent] }); + fixture = TestBed.createComponent(CounterComponent); + fixture.detectChanges(); + }); + + it('should display a title', async(() => { + const titleText = fixture.nativeElement.querySelector('h1').textContent; + expect(titleText).toEqual('Counter'); + })); + + it('should start with count 0, then increments by 1 when clicked', async(() => { + const countElement = fixture.nativeElement.querySelector('strong'); + expect(countElement.textContent).toEqual('0'); + + const incrementButton = fixture.nativeElement.querySelector('button'); + incrementButton.click(); + fixture.detectChanges(); + expect(countElement.textContent).toEqual('1'); + })); +}); diff --git a/GeekHunters/ClientApp/app/components/counter/counter.component.ts b/GeekHunters/ClientApp/app/components/counter/counter.component.ts new file mode 100644 index 0000000..69de17d --- /dev/null +++ b/GeekHunters/ClientApp/app/components/counter/counter.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'counter', + templateUrl: './counter.component.html' +}) +export class CounterComponent { + public currentCount = 0; + + public incrementCounter() { + this.currentCount++; + } +} diff --git a/GeekHunters/ClientApp/app/components/fetchdata/fetchdata.component.html b/GeekHunters/ClientApp/app/components/fetchdata/fetchdata.component.html new file mode 100644 index 0000000..8d24e71 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/fetchdata/fetchdata.component.html @@ -0,0 +1,24 @@ +

Weather forecast

+ +

This component demonstrates fetching data from the server.

+ +

Loading...

+ + + + + + + + + + + + + + + + + + +
DateTemp. (C)Temp. (F)Summary
{{ forecast.dateFormatted }}{{ forecast.temperatureC }}{{ forecast.temperatureF }}{{ forecast.summary }}
diff --git a/GeekHunters/ClientApp/app/components/fetchdata/fetchdata.component.ts b/GeekHunters/ClientApp/app/components/fetchdata/fetchdata.component.ts new file mode 100644 index 0000000..a4c06f4 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/fetchdata/fetchdata.component.ts @@ -0,0 +1,23 @@ +import { Component, Inject } from '@angular/core'; +import { Http } from '@angular/http'; + +@Component({ + selector: 'fetchdata', + templateUrl: './fetchdata.component.html' +}) +export class FetchDataComponent { + public forecasts: WeatherForecast[]; + + constructor(http: Http, @Inject('BASE_URL') baseUrl: string) { + http.get(baseUrl + 'api/SampleData/WeatherForecasts').subscribe(result => { + this.forecasts = result.json() as WeatherForecast[]; + }, error => console.error(error)); + } +} + +interface WeatherForecast { + dateFormatted: string; + temperatureC: number; + temperatureF: number; + summary: string; +} diff --git a/GeekHunters/ClientApp/app/components/home/home.component.html b/GeekHunters/ClientApp/app/components/home/home.component.html new file mode 100644 index 0000000..fe65b43 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/home/home.component.html @@ -0,0 +1,28 @@ +

Hello, Geek Hunters!

+

Welcome to your new single-page application, built with:

+ +

To help you get started:

+
    +
  • Azure Geek Hunters: Geek Hunters on Cloud
  • +
  • GitHub Repository: Geek Hunters
  • +
  • Technology, Framework and NuGet Packages: +
      +
    • + .NET Core 2.0 in GeekHunters project (created in vs2017 as a Single Page Application template). +
    • +
    • + .NET Standard 2.0 in GeekHunters.Repository project. +
    • +
    • + Microsoft.Azure.DocumentDB.Core to allow access to GeekHunters in Azure Cosmos DB. +
    • +
    +
  • +
diff --git a/GeekHunters/ClientApp/app/components/home/home.component.ts b/GeekHunters/ClientApp/app/components/home/home.component.ts new file mode 100644 index 0000000..81846ce --- /dev/null +++ b/GeekHunters/ClientApp/app/components/home/home.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'home', + templateUrl: './home.component.html' +}) +export class HomeComponent { +} diff --git a/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.css b/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.css new file mode 100644 index 0000000..e15c612 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.css @@ -0,0 +1,59 @@ +li .glyphicon { + margin-right: 10px; +} + +/* Highlighting rules for nav menu items */ +li.link-active a, +li.link-active a:hover, +li.link-active a:focus { + background-color: #4189C7; + color: white; +} + +/* Keep the nav menu independent of scrolling and on top of other items */ +.main-nav { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 1; +} + +@media (min-width: 768px) { + /* On small screens, convert the nav menu to a vertical sidebar */ + .main-nav { + height: 100%; + width: calc(25% - 20px); + } + .navbar { + border-radius: 0px; + border-width: 0px; + height: 100%; + } + .navbar-header { + float: none; + } + .navbar-collapse { + border-top: 1px solid #444; + padding: 0px; + } + .navbar ul { + float: none; + } + .navbar li { + float: none; + font-size: 15px; + margin: 6px; + } + .navbar li a { + padding: 10px 16px; + border-radius: 4px; + } + .navbar a { + /* If a menu item's text is too long, truncate it */ + width: 100%; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } +} diff --git a/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.html b/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.html new file mode 100644 index 0000000..eed9086 --- /dev/null +++ b/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.html @@ -0,0 +1,46 @@ + diff --git a/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.ts b/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.ts new file mode 100644 index 0000000..7a1691c --- /dev/null +++ b/GeekHunters/ClientApp/app/components/navmenu/navmenu.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'nav-menu', + templateUrl: './navmenu.component.html', + styleUrls: ['./navmenu.component.css'] +}) +export class NavMenuComponent { +} diff --git a/GeekHunters/ClientApp/app/components/shared/candidate.type.ts b/GeekHunters/ClientApp/app/components/shared/candidate.type.ts new file mode 100644 index 0000000..b4992be --- /dev/null +++ b/GeekHunters/ClientApp/app/components/shared/candidate.type.ts @@ -0,0 +1,17 @@ +export class Candidate { + id: string; + firstName: string; + lastName: string; + technologies: string[]; + + public constructor( + fields?: { + id: string, + firstName: string, + lastName: string, + technologies?: string[] + }) { + if (fields) + Object.assign(this, fields); + } +} \ No newline at end of file diff --git a/GeekHunters/ClientApp/app/components/shared/geek.service.ts b/GeekHunters/ClientApp/app/components/shared/geek.service.ts new file mode 100644 index 0000000..38a096b --- /dev/null +++ b/GeekHunters/ClientApp/app/components/shared/geek.service.ts @@ -0,0 +1,47 @@ +import { Component, Inject, Injectable } from '@angular/core'; +import { Http, RequestMethod, RequestOptions, Headers } from '@angular/http'; +import 'rxjs/Rx'; + +import { Candidate } from './candidate.type'; + +@Injectable() +export class GeekService { + public readonly TechnologyList: string[]; + + constructor(private http: Http, @Inject('BASE_URL') private originUrl: string) { + this.TechnologyList = ["Azure", "SQL", "CSharp", "Angular"]; + } + + public getCandidates() { + return this.http.get(this.originUrl + 'api/Candidate/GetCandidatesAsynch/') + .map(response => response.json() as Candidate[]); + } + + public getCandidate(id: string) { + return this.http.get(this.originUrl + 'api/Candidate/GetCandidateAsynch/' + id) + .map(response => response.json() as Candidate); + } + + public updateCandidate(candidate: Candidate) { + let body = JSON.stringify(candidate); + let headers = new Headers({ 'Content-Type': 'application/json' }); + let options = new RequestOptions({ headers: headers }); + + return this.http.post(this.originUrl + 'api/Candidate/UpdateAsync/', body, options) + .map(response => response.text()); + } + + public addCandidate(candidate: Candidate) { + let body = JSON.stringify(candidate); + let headers = new Headers({ 'Content-Type': 'application/json' }); + let options = new RequestOptions({ headers: headers }); + + return this.http.post(this.originUrl + 'api/Candidate/AddAsynch/', body, options) + .map(response => response.text()); + } + + public deleteCandidate(id: string) { + return this.http.get(this.originUrl + 'api/Candidate/DeleteAsynch/' + id) + .map(response => response.text()); + } +} diff --git a/GeekHunters/ClientApp/boot.browser.ts b/GeekHunters/ClientApp/boot.browser.ts new file mode 100644 index 0000000..f9c0ba2 --- /dev/null +++ b/GeekHunters/ClientApp/boot.browser.ts @@ -0,0 +1,23 @@ +import 'reflect-metadata'; +import 'zone.js'; +import 'bootstrap'; +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { AppModule } from './app/app.module.browser'; + +if (module.hot) { + module.hot.accept(); + module.hot.dispose(() => { + // Before restarting the app, we create a new root element and dispose the old one + const oldRootElem = document.querySelector('app'); + const newRootElem = document.createElement('app'); + oldRootElem!.parentNode!.insertBefore(newRootElem, oldRootElem); + modulePromise.then(appModule => appModule.destroy()); + }); +} else { + enableProdMode(); +} + +// Note: @ng-tools/webpack looks for the following expression when performing production +// builds. Don't change how this line looks, otherwise you may break tree-shaking. +const modulePromise = platformBrowserDynamic().bootstrapModule(AppModule); diff --git a/GeekHunters/ClientApp/boot.server.ts b/GeekHunters/ClientApp/boot.server.ts new file mode 100644 index 0000000..00460e9 --- /dev/null +++ b/GeekHunters/ClientApp/boot.server.ts @@ -0,0 +1,38 @@ +import 'reflect-metadata'; +import 'zone.js'; +import 'rxjs/add/operator/first'; +import { APP_BASE_HREF } from '@angular/common'; +import { enableProdMode, ApplicationRef, NgZone, ValueProvider } from '@angular/core'; +import { platformDynamicServer, PlatformState, INITIAL_CONFIG } from '@angular/platform-server'; +import { createServerRenderer, RenderResult } from 'aspnet-prerendering'; +import { AppModule } from './app/app.module.server'; + +enableProdMode(); + +export default createServerRenderer(params => { + const providers = [ + { provide: INITIAL_CONFIG, useValue: { document: '', url: params.url } }, + { provide: APP_BASE_HREF, useValue: params.baseUrl }, + { provide: 'BASE_URL', useValue: params.origin + params.baseUrl }, + ]; + + return platformDynamicServer(providers).bootstrapModule(AppModule).then(moduleRef => { + const appRef: ApplicationRef = moduleRef.injector.get(ApplicationRef); + const state = moduleRef.injector.get(PlatformState); + const zone = moduleRef.injector.get(NgZone); + + return new Promise((resolve, reject) => { + zone.onError.subscribe((errorInfo: any) => reject(errorInfo)); + appRef.isStable.first(isStable => isStable).subscribe(() => { + // Because 'onStable' fires before 'onError', we have to delay slightly before + // completing the request in case there's an error to report + setImmediate(() => { + resolve({ + html: state.renderToString() + }); + moduleRef.destroy(); + }); + }); + }); + }); +}); diff --git a/GeekHunters/ClientApp/test/boot-tests.ts b/GeekHunters/ClientApp/test/boot-tests.ts new file mode 100644 index 0000000..fe3591e --- /dev/null +++ b/GeekHunters/ClientApp/test/boot-tests.ts @@ -0,0 +1,33 @@ +// Load required polyfills and testing libraries +import 'reflect-metadata'; +import 'zone.js'; +import 'zone.js/dist/long-stack-trace-zone'; +import 'zone.js/dist/proxy.js'; +import 'zone.js/dist/sync-test'; +import 'zone.js/dist/jasmine-patch'; +import 'zone.js/dist/async-test'; +import 'zone.js/dist/fake-async-test'; +import * as testing from '@angular/core/testing'; +import * as testingBrowser from '@angular/platform-browser-dynamic/testing'; + +// There's no typing for the `__karma__` variable. Just declare it as any +declare var __karma__: any; +declare var require: any; + +// Prevent Karma from running prematurely +__karma__.loaded = function () {}; + +// First, initialize the Angular testing environment +testing.getTestBed().initTestEnvironment( + testingBrowser.BrowserDynamicTestingModule, + testingBrowser.platformBrowserDynamicTesting() +); + +// Then we find all the tests +const context = require.context('../', true, /\.spec\.ts$/); + +// And load the modules +context.keys().map(context); + +// Finally, start Karma to run the tests +__karma__.start(); diff --git a/GeekHunters/ClientApp/test/karma.conf.js b/GeekHunters/ClientApp/test/karma.conf.js new file mode 100644 index 0000000..c7f03d4 --- /dev/null +++ b/GeekHunters/ClientApp/test/karma.conf.js @@ -0,0 +1,26 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/0.13/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '.', + frameworks: ['jasmine'], + files: [ + '../../wwwroot/dist/vendor.js', + './boot-tests.ts' + ], + preprocessors: { + './boot-tests.ts': ['webpack'] + }, + reporters: ['progress'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + mime: { 'application/javascript': ['ts','tsx'] }, + singleRun: false, + webpack: require('../../webpack.config.js')().filter(config => config.target !== 'node'), // Test against client bundle, because tests run in a browser + webpackMiddleware: { stats: 'errors-only' } + }); +}; diff --git a/GeekHunters/Controllers/CandidateController.cs b/GeekHunters/Controllers/CandidateController.cs new file mode 100644 index 0000000..38111b4 --- /dev/null +++ b/GeekHunters/Controllers/CandidateController.cs @@ -0,0 +1,88 @@ +using GeekHunters.Interfaces; +using GeekHunters.Models; +using GeekHunters.Services; +using Microsoft.AspNetCore.Mvc; +using System.Threading.Tasks; + +namespace GeekHunters.Controllers +{ + [Route("api/[controller]")] + public class CandidateController : Controller + { + private readonly ICandidateService iCandidateService = null; + private readonly CandidateService candidateService = null; + + public CandidateController() + { + candidateService = new CandidateService(iCandidateService); + } + + [HttpGet("[action]")] + public async Task GetCandidatesAsynch() + { + var candidates = await candidateService.GetAllAsync(); + return new ObjectResult(candidates); + } + + [HttpGet("[action]/{id}")] + public async Task GetCandidateAsynch(string id) + { + if (string.IsNullOrEmpty(id)) + { + return BadRequest(); + } + + Candidate candidate = await candidateService.GetAsync(id); + + if (candidate == null) + { + return NotFound(); + } + + return new ObjectResult(candidate); + } + + [HttpPost("[action]")] + public async Task AddAsynch([FromBody] Candidate candidate) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + await candidateService.AddAsync(candidate); + return new ObjectResult(candidate); + } + + [HttpPost("[action]")] + public async Task UpdateAsync([FromBody] Candidate candidate) + { + if (!ModelState.IsValid) + { + return BadRequest(ModelState); + } + + await candidateService.UpdateAsync(candidate.ID.ToString(), candidate); + return new OkResult(); + } + + [HttpGet("[action]/{id}")] + public async Task DeleteAsynch(string id) + { + if (id == null) + { + return BadRequest(); + } + + var candidate = await candidateService.GetAsync(id); + if (candidate == null) + { + return NotFound(); + } + + await candidateService.DeleteAsync(candidate.ID.ToString()); + + return Ok(id); + } + } +} diff --git a/GeekHunters/Controllers/HomeController.cs b/GeekHunters/Controllers/HomeController.cs new file mode 100644 index 0000000..4e11cd7 --- /dev/null +++ b/GeekHunters/Controllers/HomeController.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace GeekHunters.Controllers +{ + public class HomeController : Controller + { + public IActionResult Index() + { + return View(); + } + + public IActionResult Error() + { + ViewData["RequestId"] = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + return View(); + } + } +} diff --git a/GeekHunters/Controllers/SampleDataController.cs b/GeekHunters/Controllers/SampleDataController.cs new file mode 100644 index 0000000..3540f40 --- /dev/null +++ b/GeekHunters/Controllers/SampleDataController.cs @@ -0,0 +1,44 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace GeekHunters.Controllers +{ + [Route("api/[controller]")] + public class SampleDataController : Controller + { + private static string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + [HttpGet("[action]")] + public IEnumerable WeatherForecasts() + { + var rng = new Random(); + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + DateFormatted = DateTime.Now.AddDays(index).ToString("d"), + TemperatureC = rng.Next(-20, 55), + Summary = Summaries[rng.Next(Summaries.Length)] + }); + } + + public class WeatherForecast + { + public string DateFormatted { get; set; } + public int TemperatureC { get; set; } + public string Summary { get; set; } + + public int TemperatureF + { + get + { + return 32 + (int)(TemperatureC / 0.5556); + } + } + } + } +} diff --git a/GeekHunters/GeekHunters.csproj b/GeekHunters/GeekHunters.csproj new file mode 100644 index 0000000..285dd07 --- /dev/null +++ b/GeekHunters/GeekHunters.csproj @@ -0,0 +1,61 @@ + + + + netcoreapp2.0 + true + Latest + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(DistFiles.Identity) + PreserveNewest + + + + + \ No newline at end of file diff --git a/GeekHunters/Interfaces/ICandidateService.cs b/GeekHunters/Interfaces/ICandidateService.cs new file mode 100644 index 0000000..2155689 --- /dev/null +++ b/GeekHunters/Interfaces/ICandidateService.cs @@ -0,0 +1,15 @@ +using GeekHunters.Models; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace GeekHunters.Interfaces +{ + public interface ICandidateService + { + Task> GetAllAsync(); + Task GetAsync(string id); + Task AddAsync(Candidate candidate); + Task UpdateAsync(string id, Candidate candidate); + Task DeleteAsync(string id); + } +} \ No newline at end of file diff --git a/GeekHunters/Models/Candidate.cs b/GeekHunters/Models/Candidate.cs new file mode 100644 index 0000000..e4ca672 --- /dev/null +++ b/GeekHunters/Models/Candidate.cs @@ -0,0 +1,55 @@ +using Newtonsoft.Json; +using System; +using System.ComponentModel.DataAnnotations; + +namespace GeekHunters.Models +{ + public class Candidate + { + Guid _id = Guid.Empty; + string[] _technologies = null; + + [Required] + [JsonProperty(PropertyName = "id")] + public Guid ID + { + get + { + if (_id == Guid.Empty) + { + _id = Guid.NewGuid(); + } + return _id; + } + set + { + _id = value; + } + } + + [Required] + [JsonProperty(PropertyName = "firstName")] + public string FirstName { get; set; } + + [Required] + [JsonProperty(PropertyName = "lastName")] + public string LastName { get; set; } + + [JsonProperty(PropertyName = "technologies")] + public string[] Technologies + { + get + { + if (_technologies == null) + { + _technologies = new string[] { }; + } + return _technologies; + } + set + { + _technologies = value; + } + } + } +} \ No newline at end of file diff --git a/GeekHunters/Program.cs b/GeekHunters/Program.cs new file mode 100644 index 0000000..6b7f403 --- /dev/null +++ b/GeekHunters/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Logging; + +namespace GeekHunters +{ + public class Program + { + public static void Main(string[] args) + { + BuildWebHost(args).Run(); + } + + public static IWebHost BuildWebHost(string[] args) => + WebHost.CreateDefaultBuilder(args) + .UseStartup() + .Build(); + } +} \ No newline at end of file diff --git a/GeekHunters/Services/CandidateService.cs b/GeekHunters/Services/CandidateService.cs new file mode 100644 index 0000000..6a833f6 --- /dev/null +++ b/GeekHunters/Services/CandidateService.cs @@ -0,0 +1,64 @@ +using GeekHunters.Interfaces; +using System.Collections.Generic; +using GeekHunters.Models; +using GeekHunters.Repository; +using System.Threading.Tasks; +using System; + +namespace GeekHunters.Services +{ + public class CandidateService : ICandidateService + { + private readonly ICandidateService _service; + + public CandidateService(ICandidateService service) + { + _service = service; + } + + public async Task> GetAllAsync() + { + var candidates = await DocumentDBRepository.GetItemsAsync(c => true); + return candidates; + } + + public async Task GetAsync(string id) + { + if (string.IsNullOrEmpty(id)) + { + throw new Exception("Candidate ID cannot be empty"); + } + + var candidate = await DocumentDBRepository.GetItemAsync(id); + + return candidate; + } + + public async Task AddAsync(Candidate candidate) + { + if (candidate == null) + { + throw new Exception("Candidate cannot be null"); + } + + if (String.IsNullOrEmpty(candidate.FirstName)) + { + throw new Exception("First name cannot be empty"); + } + + await DocumentDBRepository.CreateItemAsync(candidate); + + return candidate; + } + + public async Task UpdateAsync(string id, Candidate candidate) + { + await DocumentDBRepository.UpdateItemAsync(id, candidate); + } + + public async Task DeleteAsync(string id) + { + await DocumentDBRepository.DeleteItemAsync(id); + } + } +} diff --git a/GeekHunters/Startup.cs b/GeekHunters/Startup.cs new file mode 100644 index 0000000..3574aa1 --- /dev/null +++ b/GeekHunters/Startup.cs @@ -0,0 +1,70 @@ +using GeekHunters.Models; +using GeekHunters.Repository; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.SpaServices.Webpack; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Swashbuckle.AspNetCore.Swagger; + +namespace GeekHunters +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc(); + services.AddSwaggerGen(c => + { + c.SwaggerDoc("v1", new Info { Title = "GeekHunters API", Version = "v1" }); + }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions + { + HotModuleReplacement = true + }); + } + else + { + app.UseExceptionHandler("/Home/Error"); + } + + app.UseSwagger(); + app.UseSwaggerUI(c => + { + c.SwaggerEndpoint("/swagger/v1/swagger.json", "GeekHunters API v1"); + }); + + app.UseStaticFiles(); + app.UseMvc(routes => + { + routes.MapRoute( + name: "default", + template: "{controller=Home}/{action=Index}/{id?}"); + + routes.MapSpaFallbackRoute( + name: "spa-fallback", + defaults: new { controller = "Home", action = "Index" }); + }); + + + + DocumentDBRepository.Initialize(); + } + } +} \ No newline at end of file diff --git a/GeekHunters/Views/Home/Index.cshtml b/GeekHunters/Views/Home/Index.cshtml new file mode 100644 index 0000000..fc1ae58 --- /dev/null +++ b/GeekHunters/Views/Home/Index.cshtml @@ -0,0 +1,10 @@ +@{ + ViewData["Title"] = "Home Page"; +} + +Loading... + + +@section scripts { + +} diff --git a/GeekHunters/Views/Shared/Error.cshtml b/GeekHunters/Views/Shared/Error.cshtml new file mode 100644 index 0000000..78e35d5 --- /dev/null +++ b/GeekHunters/Views/Shared/Error.cshtml @@ -0,0 +1,21 @@ +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (!string.IsNullOrEmpty((string)ViewData["RequestId"])) +{ +

+ Request ID: @ViewData["RequestId"] +

+} + +

Development Mode

+

+ Swapping to Development environment will display more detailed information about the error that occurred. +

+

+ Development environment should not be enabled in deployed applications, as it can result in sensitive information from exceptions being displayed to end users. For local debugging, development environment can be enabled by setting the ASPNETCORE_ENVIRONMENT environment variable to Development, and restarting the application. +

diff --git a/GeekHunters/Views/Shared/_Layout.cshtml b/GeekHunters/Views/Shared/_Layout.cshtml new file mode 100644 index 0000000..7f23bbb --- /dev/null +++ b/GeekHunters/Views/Shared/_Layout.cshtml @@ -0,0 +1,16 @@ + + + + + + @ViewData["Title"] - GeekHunters + + + + + + @RenderBody() + + @RenderSection("scripts", required: false) + + diff --git a/GeekHunters/Views/_ViewImports.cshtml b/GeekHunters/Views/_ViewImports.cshtml new file mode 100644 index 0000000..e48b6ae --- /dev/null +++ b/GeekHunters/Views/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using GeekHunters +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers +@addTagHelper *, Microsoft.AspNetCore.SpaServices diff --git a/GeekHunters/Views/_ViewStart.cshtml b/GeekHunters/Views/_ViewStart.cshtml new file mode 100644 index 0000000..820a2f6 --- /dev/null +++ b/GeekHunters/Views/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/GeekHunters/appsettings.Development.json b/GeekHunters/appsettings.Development.json new file mode 100644 index 0000000..457e003 --- /dev/null +++ b/GeekHunters/appsettings.Development.json @@ -0,0 +1,19 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + }, + "Console": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } + } +} diff --git a/GeekHunters/appsettings.json b/GeekHunters/appsettings.json new file mode 100644 index 0000000..c851e12 --- /dev/null +++ b/GeekHunters/appsettings.json @@ -0,0 +1,15 @@ +{ + "Logging": { + "IncludeScopes": false, + "Debug": { + "LogLevel": { + "Default": "Warning" + } + }, + "Console": { + "LogLevel": { + "Default": "Warning" + } + } + } +} diff --git a/GeekHunters/npm-shrinkwrap.json b/GeekHunters/npm-shrinkwrap.json new file mode 100644 index 0000000..efc0063 --- /dev/null +++ b/GeekHunters/npm-shrinkwrap.json @@ -0,0 +1,3730 @@ +{ + "name": "GeekHunters", + "version": "0.0.0", + "dependencies": { + "@angular/animations": { + "version": "4.2.5", + "from": "@angular/animations@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-4.2.5.tgz" + }, + "@angular/common": { + "version": "4.2.5", + "from": "@angular/common@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-4.2.5.tgz" + }, + "@angular/compiler": { + "version": "4.2.5", + "from": "@angular/compiler@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-4.2.5.tgz" + }, + "@angular/compiler-cli": { + "version": "4.2.5", + "from": "@angular/compiler-cli@latest", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-4.2.5.tgz", + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + } + } + }, + "@angular/core": { + "version": "4.2.5", + "from": "@angular/core@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-4.2.5.tgz" + }, + "@angular/forms": { + "version": "4.2.5", + "from": "@angular/forms@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-4.2.5.tgz" + }, + "@angular/http": { + "version": "4.2.5", + "from": "@angular/http@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/http/-/http-4.2.5.tgz" + }, + "@angular/platform-browser": { + "version": "4.2.5", + "from": "@angular/platform-browser@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-4.2.5.tgz" + }, + "@angular/platform-browser-dynamic": { + "version": "4.2.5", + "from": "@angular/platform-browser-dynamic@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-4.2.5.tgz" + }, + "@angular/platform-server": { + "version": "4.2.5", + "from": "@angular/platform-server@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-4.2.5.tgz" + }, + "@angular/router": { + "version": "4.2.5", + "from": "@angular/router@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-4.2.5.tgz" + }, + "@angular/tsc-wrapped": { + "version": "4.2.5", + "from": "@angular/tsc-wrapped@4.2.5", + "resolved": "https://registry.npmjs.org/@angular/tsc-wrapped/-/tsc-wrapped-4.2.5.tgz" + }, + "@ngtools/webpack": { + "version": "1.5.0", + "from": "@ngtools/webpack@latest", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-1.5.0.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "@types/chai": { + "version": "4.0.1", + "from": "@types/chai@4.0.1", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.1.tgz", + "dev": true + }, + "@types/jasmine": { + "version": "2.5.53", + "from": "@types/jasmine@2.5.53", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.5.53.tgz", + "dev": true + }, + "@types/webpack-env": { + "version": "1.13.0", + "from": "@types/webpack-env@1.13.0", + "resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.13.0.tgz" + }, + "accepts": { + "version": "1.3.3", + "from": "accepts@1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "dev": true + }, + "acorn": { + "version": "5.1.1", + "from": "acorn@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.1.tgz" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "from": "acorn-dynamic-import@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "dependencies": { + "acorn": { + "version": "4.0.13", + "from": "acorn@>=4.0.3 <5.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz" + } + } + }, + "after": { + "version": "0.8.2", + "from": "after@0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "dev": true + }, + "ajv": { + "version": "5.2.0", + "from": "ajv@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.0.tgz" + }, + "ajv-keywords": { + "version": "1.5.1", + "from": "ajv-keywords@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz" + }, + "align-text": { + "version": "0.1.4", + "from": "align-text@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "from": "alphanum-sort@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz" + }, + "amdefine": { + "version": "1.0.1", + "from": "amdefine@>=0.0.4", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + }, + "angular2-template-loader": { + "version": "0.6.2", + "from": "angular2-template-loader@0.6.2", + "resolved": "https://registry.npmjs.org/angular2-template-loader/-/angular2-template-loader-0.6.2.tgz" + }, + "ansi-html": { + "version": "0.0.7", + "from": "ansi-html@0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz" + }, + "ansi-regex": { + "version": "2.1.1", + "from": "ansi-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + }, + "ansi-styles": { + "version": "2.2.1", + "from": "ansi-styles@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" + }, + "anymatch": { + "version": "1.3.0", + "from": "anymatch@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "from": "arr-diff@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz" + }, + "array-unique": { + "version": "0.2.1", + "from": "array-unique@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz" + }, + "braces": { + "version": "1.8.5", + "from": "braces@>=1.8.2 <2.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz" + }, + "expand-brackets": { + "version": "0.1.5", + "from": "expand-brackets@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz" + }, + "extglob": { + "version": "0.3.2", + "from": "extglob@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz" + }, + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "micromatch": { + "version": "2.3.11", + "from": "micromatch@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz" + } + } + }, + "argparse": { + "version": "1.0.9", + "from": "argparse@>=1.0.7 <2.0.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz" + }, + "arr-diff": { + "version": "4.0.0", + "from": "arr-diff@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" + }, + "arr-flatten": { + "version": "1.1.0", + "from": "arr-flatten@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + }, + "arr-union": { + "version": "3.1.0", + "from": "arr-union@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + }, + "array-slice": { + "version": "0.2.3", + "from": "array-slice@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "from": "array-unique@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz" + }, + "arraybuffer.slice": { + "version": "0.0.6", + "from": "arraybuffer.slice@0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + }, + "asn1.js": { + "version": "4.9.1", + "from": "asn1.js@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz" + }, + "aspnet-prerendering": { + "version": "3.0.1", + "from": "aspnet-prerendering@3.0.1", + "resolved": "https://registry.npmjs.org/aspnet-prerendering/-/aspnet-prerendering-3.0.1.tgz" + }, + "aspnet-webpack": { + "version": "2.0.1", + "from": "aspnet-webpack@2.0.1", + "resolved": "https://registry.npmjs.org/aspnet-webpack/-/aspnet-webpack-2.0.1.tgz" + }, + "assert": { + "version": "1.4.1", + "from": "assert@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz" + }, + "assertion-error": { + "version": "1.0.2", + "from": "assertion-error@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "dev": true + }, + "ast-types": { + "version": "0.9.6", + "from": "ast-types@0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz" + }, + "async": { + "version": "2.5.0", + "from": "async@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz" + }, + "async-each": { + "version": "1.0.1", + "from": "async-each@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz" + }, + "atob": { + "version": "2.0.3", + "from": "atob@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz" + }, + "autoprefixer": { + "version": "6.7.7", + "from": "autoprefixer@>=6.3.1 <7.0.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz" + }, + "awesome-typescript-loader": { + "version": "3.2.1", + "from": "awesome-typescript-loader@3.2.1", + "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-3.2.1.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "babel-code-frame": { + "version": "6.22.0", + "from": "babel-code-frame@>=6.11.0 <7.0.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz" + }, + "backo2": { + "version": "1.0.2", + "from": "backo2@1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "dev": true + }, + "balanced-match": { + "version": "0.4.2", + "from": "balanced-match@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz" + }, + "base": { + "version": "0.11.1", + "from": "base@>=0.11.1 <0.12.0", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.1.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "base64-arraybuffer": { + "version": "0.1.5", + "from": "base64-arraybuffer@0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "from": "base64-js@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz" + }, + "base64id": { + "version": "1.0.0", + "from": "base64id@1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "from": "better-assert@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "dev": true + }, + "big.js": { + "version": "3.1.3", + "from": "big.js@>=3.1.3 <4.0.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.1.3.tgz" + }, + "binary-extensions": { + "version": "1.8.0", + "from": "binary-extensions@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz" + }, + "blob": { + "version": "0.0.4", + "from": "blob@0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "dev": true + }, + "bluebird": { + "version": "3.5.0", + "from": "bluebird@>=3.3.0 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", + "dev": true + }, + "bn.js": { + "version": "4.11.7", + "from": "bn.js@>=4.1.1 <5.0.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.7.tgz" + }, + "body-parser": { + "version": "1.17.2", + "from": "body-parser@>=1.16.1 <2.0.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.17.2.tgz", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "from": "iconv-lite@0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "dev": true + } + } + }, + "bootstrap": { + "version": "3.3.7", + "from": "bootstrap@3.3.7", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-3.3.7.tgz" + }, + "brace-expansion": { + "version": "1.1.8", + "from": "brace-expansion@>=1.1.7 <2.0.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "from": "balanced-match@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + } + } + }, + "braces": { + "version": "2.2.2", + "from": "braces@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.2.2.tgz" + }, + "brorand": { + "version": "1.1.0", + "from": "brorand@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz" + }, + "browserify-aes": { + "version": "1.0.6", + "from": "browserify-aes@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.6.tgz" + }, + "browserify-cipher": { + "version": "1.0.0", + "from": "browserify-cipher@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz" + }, + "browserify-des": { + "version": "1.0.0", + "from": "browserify-des@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz" + }, + "browserify-rsa": { + "version": "4.0.1", + "from": "browserify-rsa@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz" + }, + "browserify-sign": { + "version": "4.0.4", + "from": "browserify-sign@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz" + }, + "browserify-zlib": { + "version": "0.1.4", + "from": "browserify-zlib@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz" + }, + "browserslist": { + "version": "1.7.7", + "from": "browserslist@>=1.7.6 <2.0.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz" + }, + "buffer": { + "version": "4.9.1", + "from": "buffer@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz" + }, + "buffer-xor": { + "version": "1.0.3", + "from": "buffer-xor@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz" + }, + "builtin-modules": { + "version": "1.1.1", + "from": "builtin-modules@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + }, + "builtin-status-codes": { + "version": "3.0.0", + "from": "builtin-status-codes@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz" + }, + "bytes": { + "version": "2.4.0", + "from": "bytes@2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "dev": true + }, + "cache-base": { + "version": "0.8.5", + "from": "cache-base@>=0.8.4 <0.9.0", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-0.8.5.tgz" + }, + "callsite": { + "version": "1.0.0", + "from": "callsite@1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "from": "camel-case@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz" + }, + "camelcase": { + "version": "1.2.1", + "from": "camelcase@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz" + }, + "caniuse-api": { + "version": "1.6.1", + "from": "caniuse-api@>=1.5.2 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz" + }, + "caniuse-db": { + "version": "1.0.30000697", + "from": "caniuse-db@>=1.0.30000634 <2.0.0", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000697.tgz" + }, + "center-align": { + "version": "0.1.3", + "from": "center-align@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "from": "lazy-cache@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + } + } + }, + "chai": { + "version": "4.0.2", + "from": "chai@4.0.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.0.2.tgz", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "from": "chalk@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" + }, + "check-error": { + "version": "1.0.2", + "from": "check-error@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "from": "chokidar@>=1.4.3 <2.0.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz" + }, + "cipher-base": { + "version": "1.0.3", + "from": "cipher-base@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.3.tgz" + }, + "clap": { + "version": "1.2.0", + "from": "clap@>=1.0.9 <2.0.0", + "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.0.tgz" + }, + "class-utils": { + "version": "0.3.5", + "from": "class-utils@>=0.3.4 <0.4.0", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.5.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "clean-css": { + "version": "4.1.5", + "from": "clean-css@>=4.1.0 <4.2.0", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.5.tgz" + }, + "cliui": { + "version": "2.1.0", + "from": "cliui@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz" + }, + "clone": { + "version": "1.0.2", + "from": "clone@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz" + }, + "co": { + "version": "4.6.0", + "from": "co@>=4.6.0 <5.0.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + }, + "coa": { + "version": "1.0.3", + "from": "coa@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.3.tgz" + }, + "code-point-at": { + "version": "1.1.0", + "from": "code-point-at@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz" + }, + "collection-visit": { + "version": "0.2.3", + "from": "collection-visit@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-0.2.3.tgz" + }, + "color": { + "version": "0.11.4", + "from": "color@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz" + }, + "color-convert": { + "version": "1.9.0", + "from": "color-convert@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz" + }, + "color-name": { + "version": "1.1.2", + "from": "color-name@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.2.tgz" + }, + "color-string": { + "version": "0.3.0", + "from": "color-string@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz" + }, + "colormin": { + "version": "1.1.2", + "from": "colormin@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz" + }, + "colors": { + "version": "1.1.2", + "from": "colors@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" + }, + "combine-lists": { + "version": "1.0.1", + "from": "combine-lists@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", + "dev": true + }, + "commander": { + "version": "2.9.0", + "from": "commander@>=2.9.0 <2.10.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz" + }, + "component-bind": { + "version": "1.0.0", + "from": "component-bind@1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "dev": true + }, + "component-emitter": { + "version": "1.2.1", + "from": "component-emitter@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz" + }, + "component-inherit": { + "version": "0.0.3", + "from": "component-inherit@0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "connect": { + "version": "3.6.2", + "from": "connect@>=3.4.1 <4.0.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.2.tgz" + }, + "console-browserify": { + "version": "1.1.0", + "from": "console-browserify@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz" + }, + "constants-browserify": { + "version": "1.0.0", + "from": "constants-browserify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz" + }, + "content-type": { + "version": "1.0.2", + "from": "content-type@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.2.tgz", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "from": "copy-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz" + }, + "core-js": { + "version": "2.4.1", + "from": "core-js@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "create-ecdh": { + "version": "4.0.0", + "from": "create-ecdh@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz" + }, + "create-hash": { + "version": "1.1.3", + "from": "create-hash@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz" + }, + "create-hmac": { + "version": "1.1.6", + "from": "create-hmac@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz" + }, + "crypto-browserify": { + "version": "3.11.0", + "from": "crypto-browserify@>=3.11.0 <4.0.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.0.tgz" + }, + "css": { + "version": "2.2.1", + "from": "css@2.2.1", + "resolved": "https://registry.npmjs.org/css/-/css-2.2.1.tgz", + "dependencies": { + "atob": { + "version": "1.1.3", + "from": "atob@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/atob/-/atob-1.1.3.tgz" + }, + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.38 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz" + }, + "source-map-resolve": { + "version": "0.3.1", + "from": "source-map-resolve@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.3.1.tgz" + }, + "source-map-url": { + "version": "0.3.0", + "from": "source-map-url@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.3.0.tgz" + } + } + }, + "css-color-names": { + "version": "0.0.4", + "from": "css-color-names@0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz" + }, + "css-loader": { + "version": "0.28.4", + "from": "css-loader@0.28.4", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.4.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "css-selector-tokenizer": { + "version": "0.7.0", + "from": "css-selector-tokenizer@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz" + }, + "cssesc": { + "version": "0.1.0", + "from": "cssesc@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz" + }, + "cssnano": { + "version": "3.10.0", + "from": "cssnano@>=2.6.1 <4.0.0", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz" + }, + "csso": { + "version": "2.3.2", + "from": "csso@>=2.3.1 <2.4.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz" + }, + "custom-event": { + "version": "1.0.1", + "from": "custom-event@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "dev": true + }, + "date-now": { + "version": "0.1.4", + "from": "date-now@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz" + }, + "debug": { + "version": "2.6.7", + "from": "debug@2.6.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.7.tgz" + }, + "decamelize": { + "version": "1.2.0", + "from": "decamelize@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + }, + "deep-eql": { + "version": "2.0.2", + "from": "deep-eql@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "dev": true, + "dependencies": { + "type-detect": { + "version": "3.0.0", + "from": "type-detect@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "dev": true + } + } + }, + "define-property": { + "version": "1.0.0", + "from": "define-property@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz" + }, + "defined": { + "version": "1.0.0", + "from": "defined@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz" + }, + "depd": { + "version": "1.1.0", + "from": "depd@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "dev": true + }, + "des.js": { + "version": "1.0.0", + "from": "des.js@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz" + }, + "di": { + "version": "0.0.1", + "from": "di@>=0.0.1 <0.0.2", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "from": "diffie-hellman@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz" + }, + "dom-serialize": { + "version": "2.2.1", + "from": "dom-serialize@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "dev": true + }, + "domain-browser": { + "version": "1.1.7", + "from": "domain-browser@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz" + }, + "domain-context": { + "version": "0.5.1", + "from": "domain-context@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/domain-context/-/domain-context-0.5.1.tgz" + }, + "domain-task": { + "version": "3.0.3", + "from": "domain-task@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/domain-task/-/domain-task-3.0.3.tgz" + }, + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + }, + "electron-to-chromium": { + "version": "1.3.15", + "from": "electron-to-chromium@>=1.2.7 <2.0.0", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.15.tgz" + }, + "elliptic": { + "version": "6.4.0", + "from": "elliptic@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz" + }, + "emojis-list": { + "version": "2.1.0", + "from": "emojis-list@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz" + }, + "encodeurl": { + "version": "1.0.1", + "from": "encodeurl@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz" + }, + "encoding": { + "version": "0.1.12", + "from": "encoding@>=0.1.11 <0.2.0", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz" + }, + "engine.io": { + "version": "1.8.3", + "from": "engine.io@1.8.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.3", + "from": "engine.io-client@1.8.3", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.2", + "from": "engine.io-parser@1.3.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.2.tgz", + "dev": true + }, + "enhanced-resolve": { + "version": "3.3.0", + "from": "enhanced-resolve@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.3.0.tgz", + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "from": "memory-fs@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" + } + } + }, + "ent": { + "version": "2.2.0", + "from": "ent@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "dev": true + }, + "errno": { + "version": "0.1.4", + "from": "errno@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz" + }, + "error-ex": { + "version": "1.3.1", + "from": "error-ex@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + }, + "es6-promise": { + "version": "3.3.1", + "from": "es6-promise@>=3.1.2 <4.0.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" + }, + "es6-shim": { + "version": "0.35.3", + "from": "es6-shim@0.35.3", + "resolved": "https://registry.npmjs.org/es6-shim/-/es6-shim-0.35.3.tgz" + }, + "es6-templates": { + "version": "0.2.3", + "from": "es6-templates@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz" + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + }, + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + }, + "esprima": { + "version": "2.7.3", + "from": "esprima@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz" + }, + "esutils": { + "version": "2.0.2", + "from": "esutils@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz" + }, + "event-source-polyfill": { + "version": "0.0.9", + "from": "event-source-polyfill@0.0.9", + "resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-0.0.9.tgz" + }, + "eventemitter3": { + "version": "1.2.0", + "from": "eventemitter3@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "dev": true + }, + "events": { + "version": "1.1.1", + "from": "events@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz" + }, + "evp_bytestokey": { + "version": "1.0.0", + "from": "evp_bytestokey@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.0.tgz" + }, + "expand-braces": { + "version": "0.1.2", + "from": "expand-braces@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", + "dev": true, + "dependencies": { + "array-unique": { + "version": "0.2.1", + "from": "array-unique@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "dev": true + }, + "braces": { + "version": "0.1.5", + "from": "braces@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", + "dev": true + }, + "expand-range": { + "version": "0.1.1", + "from": "expand-range@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", + "dev": true + }, + "is-number": { + "version": "0.1.1", + "from": "is-number@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", + "dev": true + }, + "repeat-string": { + "version": "0.2.2", + "from": "repeat-string@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", + "dev": true + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "from": "expand-brackets@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "expand-range": { + "version": "1.8.2", + "from": "expand-range@>=1.8.1 <2.0.0", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "dependencies": { + "fill-range": { + "version": "2.2.3", + "from": "fill-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" + }, + "is-number": { + "version": "2.1.0", + "from": "is-number@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz" + }, + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "expose-loader": { + "version": "0.7.3", + "from": "expose-loader@0.7.3", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.3.tgz" + }, + "extend": { + "version": "3.0.1", + "from": "extend@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "from": "extend-shallow@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" + }, + "extglob": { + "version": "1.1.0", + "from": "extglob@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-1.1.0.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "to-regex": { + "version": "2.1.0", + "from": "to-regex@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-2.1.0.tgz", + "dependencies": { + "regex-not": { + "version": "0.1.2", + "from": "regex-not@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-0.1.2.tgz" + } + } + } + } + }, + "extract-text-webpack-plugin": { + "version": "2.1.2", + "from": "extract-text-webpack-plugin@2.1.2", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-2.1.2.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "fast-deep-equal": { + "version": "0.1.0", + "from": "fast-deep-equal@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-0.1.0.tgz" + }, + "fastparse": { + "version": "1.1.1", + "from": "fastparse@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz" + }, + "file-loader": { + "version": "0.11.2", + "from": "file-loader@0.11.2", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-0.11.2.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "filename-regex": { + "version": "2.0.1", + "from": "filename-regex@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz" + }, + "fill-range": { + "version": "4.0.0", + "from": "fill-range@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz" + }, + "finalhandler": { + "version": "1.0.3", + "from": "finalhandler@1.0.3", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.0.3.tgz" + }, + "find-up": { + "version": "1.1.2", + "from": "find-up@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + }, + "flatten": { + "version": "1.0.2", + "from": "flatten@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz" + }, + "for-in": { + "version": "1.0.2", + "from": "for-in@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + }, + "for-own": { + "version": "0.1.5", + "from": "for-own@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz" + }, + "fragment-cache": { + "version": "0.2.1", + "from": "fragment-cache@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz" + }, + "fs-access": { + "version": "1.0.1", + "from": "fs-access@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "dev": true + }, + "function-bind": { + "version": "1.1.0", + "from": "function-bind@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.0.tgz" + }, + "get-caller-file": { + "version": "1.0.2", + "from": "get-caller-file@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz" + }, + "get-func-name": { + "version": "2.0.0", + "from": "get-func-name@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "from": "get-value@>=2.0.5 <3.0.0", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz" + }, + "glob": { + "version": "7.1.2", + "from": "glob@>=7.1.1 <8.0.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "from": "glob-base@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz" + }, + "glob-parent": { + "version": "2.0.0", + "from": "glob-parent@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz" + }, + "graceful-fs": { + "version": "4.1.11", + "from": "graceful-fs@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + }, + "graceful-readlink": { + "version": "1.0.1", + "from": "graceful-readlink@>=1.0.0", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz" + }, + "has": { + "version": "1.0.1", + "from": "has@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz" + }, + "has-ansi": { + "version": "2.0.0", + "from": "has-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" + }, + "has-binary": { + "version": "0.1.7", + "from": "has-binary@0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "from": "has-cors@1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "dev": true + }, + "has-flag": { + "version": "1.0.0", + "from": "has-flag@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + }, + "has-value": { + "version": "0.3.1", + "from": "has-value@>=0.3.1 <0.4.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "dependencies": { + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + } + } + }, + "has-values": { + "version": "0.1.4", + "from": "has-values@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz" + }, + "hash-base": { + "version": "2.0.2", + "from": "hash-base@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz" + }, + "hash.js": { + "version": "1.1.3", + "from": "hash.js@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz" + }, + "he": { + "version": "1.1.1", + "from": "he@>=1.1.0 <1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz" + }, + "hmac-drbg": { + "version": "1.0.1", + "from": "hmac-drbg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" + }, + "hosted-git-info": { + "version": "2.5.0", + "from": "hosted-git-info@>=2.1.4 <3.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz" + }, + "html-comment-regex": { + "version": "1.1.1", + "from": "html-comment-regex@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz" + }, + "html-entities": { + "version": "1.2.1", + "from": "html-entities@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz" + }, + "html-loader": { + "version": "0.4.5", + "from": "html-loader@0.4.5", + "resolved": "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "html-minifier": { + "version": "3.5.2", + "from": "html-minifier@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.2.tgz" + }, + "http-errors": { + "version": "1.6.1", + "from": "http-errors@>=1.6.1 <1.7.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.1.tgz", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "from": "http-proxy@>=1.13.0 <2.0.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "dev": true + }, + "https-browserify": { + "version": "0.0.1", + "from": "https-browserify@0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz" + }, + "iconv-lite": { + "version": "0.4.18", + "from": "iconv-lite@>=0.4.13 <0.5.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.18.tgz" + }, + "icss-replace-symbols": { + "version": "1.1.0", + "from": "icss-replace-symbols@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz" + }, + "icss-utils": { + "version": "2.1.0", + "from": "icss-utils@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "from": "ansi-styles@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz" + }, + "chalk": { + "version": "2.0.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz" + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + }, + "postcss": { + "version": "6.0.6", + "from": "postcss@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz" + }, + "supports-color": { + "version": "4.1.0", + "from": "supports-color@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz" + } + } + }, + "ieee754": { + "version": "1.1.8", + "from": "ieee754@>=1.1.4 <2.0.0", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz" + }, + "indexes-of": { + "version": "1.0.1", + "from": "indexes-of@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz" + }, + "indexof": { + "version": "0.0.1", + "from": "indexof@0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz" + }, + "inflight": { + "version": "1.0.6", + "from": "inflight@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "from": "inherits@>=2.0.3 <2.1.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + }, + "interpret": { + "version": "1.0.3", + "from": "interpret@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.3.tgz" + }, + "invert-kv": { + "version": "1.0.0", + "from": "invert-kv@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + }, + "is-absolute-url": { + "version": "2.1.0", + "from": "is-absolute-url@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "from": "is-accessor-descriptor@>=0.1.6 <0.2.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "from": "is-arrayish@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + }, + "is-binary-path": { + "version": "1.0.1", + "from": "is-binary-path@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz" + }, + "is-buffer": { + "version": "1.1.5", + "from": "is-buffer@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + }, + "is-builtin-module": { + "version": "1.0.0", + "from": "is-builtin-module@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz" + }, + "is-data-descriptor": { + "version": "0.1.4", + "from": "is-data-descriptor@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "is-descriptor": { + "version": "1.0.0", + "from": "is-descriptor@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.0.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "from": "is-dotfile@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz" + }, + "is-equal-shallow": { + "version": "0.1.3", + "from": "is-equal-shallow@>=0.1.3 <0.2.0", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" + }, + "is-extendable": { + "version": "0.1.1", + "from": "is-extendable@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + }, + "is-extglob": { + "version": "2.1.1", + "from": "is-extglob@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "from": "is-fullwidth-code-point@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz" + }, + "is-glob": { + "version": "2.0.1", + "from": "is-glob@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + } + }, + "is-number": { + "version": "3.0.0", + "from": "is-number@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "is-odd": { + "version": "1.0.0", + "from": "is-odd@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz" + }, + "is-plain-obj": { + "version": "1.1.0", + "from": "is-plain-obj@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" + }, + "is-plain-object": { + "version": "2.0.3", + "from": "is-plain-object@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.3.tgz" + }, + "is-posix-bracket": { + "version": "0.1.1", + "from": "is-posix-bracket@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + }, + "is-primitive": { + "version": "2.0.0", + "from": "is-primitive@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + }, + "is-stream": { + "version": "1.1.0", + "from": "is-stream@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz" + }, + "is-svg": { + "version": "2.1.0", + "from": "is-svg@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz" + }, + "is-utf8": { + "version": "0.2.1", + "from": "is-utf8@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + }, + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + }, + "isbinaryfile": { + "version": "3.0.2", + "from": "isbinaryfile@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.2.tgz", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "from": "isexe@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "from": "isobject@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + }, + "isomorphic-fetch": { + "version": "2.2.1", + "from": "isomorphic-fetch@2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz" + }, + "jasmine-core": { + "version": "2.6.4", + "from": "jasmine-core@2.6.4", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.6.4.tgz", + "dev": true + }, + "jquery": { + "version": "3.2.1", + "from": "jquery@3.2.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.2.1.tgz" + }, + "js-base64": { + "version": "2.1.9", + "from": "js-base64@>=2.1.9 <3.0.0", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.1.9.tgz" + }, + "js-tokens": { + "version": "3.0.2", + "from": "js-tokens@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + }, + "js-yaml": { + "version": "3.7.0", + "from": "js-yaml@>=3.7.0 <3.8.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz" + }, + "jsesc": { + "version": "0.5.0", + "from": "jsesc@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + }, + "json-loader": { + "version": "0.5.4", + "from": "json-loader@0.5.4", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.4.tgz" + }, + "json-schema-traverse": { + "version": "0.3.1", + "from": "json-schema-traverse@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz" + }, + "json-stable-stringify": { + "version": "1.0.1", + "from": "json-stable-stringify@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz" + }, + "json3": { + "version": "3.3.2", + "from": "json3@3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "dev": true + }, + "json5": { + "version": "0.5.1", + "from": "json5@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz" + }, + "jsonify": { + "version": "0.0.0", + "from": "jsonify@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz" + }, + "karma": { + "version": "1.7.0", + "from": "karma@1.7.0", + "resolved": "https://registry.npmjs.org/karma/-/karma-1.7.0.tgz", + "dev": true, + "dependencies": { + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.8.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "dev": true + } + } + }, + "karma-chai": { + "version": "0.1.0", + "from": "karma-chai@0.1.0", + "resolved": "https://registry.npmjs.org/karma-chai/-/karma-chai-0.1.0.tgz", + "dev": true + }, + "karma-chrome-launcher": { + "version": "2.2.0", + "from": "karma-chrome-launcher@2.2.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", + "dev": true + }, + "karma-cli": { + "version": "1.0.1", + "from": "karma-cli@1.0.1", + "resolved": "https://registry.npmjs.org/karma-cli/-/karma-cli-1.0.1.tgz", + "dev": true + }, + "karma-jasmine": { + "version": "1.1.0", + "from": "karma-jasmine@1.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-1.1.0.tgz", + "dev": true + }, + "karma-webpack": { + "version": "2.0.3", + "from": "karma-webpack@2.0.3", + "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-2.0.3.tgz", + "dev": true, + "dependencies": { + "async": { + "version": "0.9.2", + "from": "async@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "from": "lodash@>=3.8.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "from": "source-map@>=0.1.41 <0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "dev": true + } + } + }, + "kind-of": { + "version": "4.0.0", + "from": "kind-of@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + }, + "lazy-cache": { + "version": "2.0.2", + "from": "lazy-cache@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz" + }, + "lcid": { + "version": "1.0.0", + "from": "lcid@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz" + }, + "load-json-file": { + "version": "1.1.0", + "from": "load-json-file@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz" + }, + "loader-runner": { + "version": "2.3.0", + "from": "loader-runner@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz" + }, + "loader-utils": { + "version": "0.2.17", + "from": "loader-utils@>=0.2.15 <0.3.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz" + }, + "lodash": { + "version": "4.17.4", + "from": "lodash@>=4.17.4 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + }, + "lodash.camelcase": { + "version": "4.3.0", + "from": "lodash.camelcase@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" + }, + "lodash.memoize": { + "version": "4.1.2", + "from": "lodash.memoize@>=4.1.2 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + }, + "lodash.uniq": { + "version": "4.5.0", + "from": "lodash.uniq@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + }, + "log4js": { + "version": "0.6.38", + "from": "log4js@>=0.6.31 <0.7.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-0.6.38.tgz", + "dev": true, + "dependencies": { + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "from": "readable-stream@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "dev": true + }, + "semver": { + "version": "4.3.6", + "from": "semver@>=4.3.3 <4.4.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "dev": true + } + } + }, + "longest": { + "version": "1.0.1", + "from": "longest@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz" + }, + "lower-case": { + "version": "1.1.4", + "from": "lower-case@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz" + }, + "lru-cache": { + "version": "2.2.4", + "from": "lru-cache@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", + "dev": true + }, + "macaddress": { + "version": "0.2.8", + "from": "macaddress@>=0.2.8 <0.3.0", + "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz" + }, + "magic-string": { + "version": "0.19.1", + "from": "magic-string@>=0.19.0 <0.20.0", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.19.1.tgz" + }, + "map-cache": { + "version": "0.2.2", + "from": "map-cache@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz" + }, + "map-visit": { + "version": "0.1.5", + "from": "map-visit@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-0.1.5.tgz" + }, + "math-expression-evaluator": { + "version": "1.2.17", + "from": "math-expression-evaluator@>=1.2.14 <2.0.0", + "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz" + }, + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "dev": true + }, + "memory-fs": { + "version": "0.3.0", + "from": "memory-fs@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.3.0.tgz" + }, + "micromatch": { + "version": "3.0.3", + "from": "micromatch@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.0.3.tgz" + }, + "miller-rabin": { + "version": "4.0.0", + "from": "miller-rabin@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.0.tgz" + }, + "mime": { + "version": "1.3.6", + "from": "mime@>=1.3.4 <2.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.6.tgz" + }, + "mime-db": { + "version": "1.27.0", + "from": "mime-db@>=1.27.0 <1.28.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "from": "mime-types@>=2.1.15 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "from": "minimalistic-assert@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "from": "minimalistic-crypto-utils@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz" + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "mixin-deep": { + "version": "1.2.0", + "from": "mixin-deep@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.2.0.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "ms": { + "version": "2.0.0", + "from": "ms@2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + }, + "nanomatch": { + "version": "1.2.0", + "from": "nanomatch@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.0.tgz" + }, + "ncname": { + "version": "1.0.0", + "from": "ncname@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz" + }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "dev": true + }, + "no-case": { + "version": "2.3.1", + "from": "no-case@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.1.tgz" + }, + "node-fetch": { + "version": "1.7.1", + "from": "node-fetch@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.1.tgz" + }, + "node-libs-browser": { + "version": "2.0.0", + "from": "node-libs-browser@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "from": "string_decoder@>=0.10.25 <0.11.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "from": "normalize-package-data@>=2.3.2 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz" + }, + "normalize-path": { + "version": "2.1.1", + "from": "normalize-path@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz" + }, + "normalize-range": { + "version": "0.1.2", + "from": "normalize-range@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + }, + "normalize-url": { + "version": "1.9.1", + "from": "normalize-url@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz" + }, + "null-check": { + "version": "1.0.0", + "from": "null-check@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "dev": true + }, + "num2fraction": { + "version": "1.2.2", + "from": "num2fraction@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz" + }, + "number-is-nan": { + "version": "1.0.1", + "from": "number-is-nan@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + }, + "object-assign": { + "version": "4.1.1", + "from": "object-assign@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + }, + "object-component": { + "version": "0.0.3", + "from": "object-component@0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "from": "object-copy@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "object-visit": { + "version": "0.3.4", + "from": "object-visit@>=0.3.4 <0.4.0", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-0.3.4.tgz", + "dependencies": { + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + } + } + }, + "object.omit": { + "version": "2.0.1", + "from": "object.omit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz" + }, + "object.pick": { + "version": "1.2.0", + "from": "object.pick@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.2.0.tgz", + "dependencies": { + "isobject": { + "version": "2.1.0", + "from": "isobject@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz" + } + } + }, + "on-finished": { + "version": "2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + }, + "once": { + "version": "1.4.0", + "from": "once@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "from": "optimist@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "dev": true + }, + "options": { + "version": "0.0.6", + "from": "options@>=0.0.5", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "dev": true + }, + "os-browserify": { + "version": "0.2.1", + "from": "os-browserify@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz" + }, + "os-locale": { + "version": "1.4.0", + "from": "os-locale@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz" + }, + "os-tmpdir": { + "version": "1.0.2", + "from": "os-tmpdir@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "dev": true + }, + "pako": { + "version": "0.2.9", + "from": "pako@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz" + }, + "param-case": { + "version": "2.1.1", + "from": "param-case@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz" + }, + "parse-asn1": { + "version": "5.1.0", + "from": "parse-asn1@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz" + }, + "parse-glob": { + "version": "3.0.4", + "from": "parse-glob@>=3.0.4 <4.0.0", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "from": "is-extglob@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + } + }, + "parse-json": { + "version": "2.2.0", + "from": "parse-json@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz" + }, + "parse5": { + "version": "3.0.2", + "from": "parse5@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", + "dependencies": { + "@types/node": { + "version": "6.0.79", + "from": "@types/node@>=6.0.46 <7.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.79.tgz" + } + } + }, + "parsejson": { + "version": "0.0.3", + "from": "parsejson@0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "dev": true + }, + "parseqs": { + "version": "0.0.5", + "from": "parseqs@0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "dev": true + }, + "parseuri": { + "version": "0.0.5", + "from": "parseuri@0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "dev": true + }, + "parseurl": { + "version": "1.3.1", + "from": "parseurl@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz" + }, + "pascalcase": { + "version": "0.1.1", + "from": "pascalcase@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz" + }, + "path-browserify": { + "version": "0.0.0", + "from": "path-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz" + }, + "path-exists": { + "version": "2.1.0", + "from": "path-exists@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz" + }, + "path-is-absolute": { + "version": "1.0.1", + "from": "path-is-absolute@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, + "path-parse": { + "version": "1.0.5", + "from": "path-parse@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "from": "path-type@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + }, + "pathval": { + "version": "1.1.0", + "from": "pathval@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "dev": true + }, + "pbkdf2": { + "version": "3.0.12", + "from": "pbkdf2@>=3.0.3 <4.0.0", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.12.tgz" + }, + "pify": { + "version": "2.3.0", + "from": "pify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + }, + "pinkie": { + "version": "2.0.4", + "from": "pinkie@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + }, + "pinkie-promise": { + "version": "2.0.1", + "from": "pinkie-promise@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + }, + "posix-character-classes": { + "version": "0.1.1", + "from": "posix-character-classes@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz" + }, + "postcss": { + "version": "5.2.17", + "from": "postcss@>=5.0.6 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.17.tgz", + "dependencies": { + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.2.3 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + } + } + }, + "postcss-calc": { + "version": "5.3.1", + "from": "postcss-calc@>=5.2.0 <6.0.0", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz" + }, + "postcss-colormin": { + "version": "2.2.2", + "from": "postcss-colormin@>=2.1.8 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz" + }, + "postcss-convert-values": { + "version": "2.6.1", + "from": "postcss-convert-values@>=2.3.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz" + }, + "postcss-discard-comments": { + "version": "2.0.4", + "from": "postcss-discard-comments@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz" + }, + "postcss-discard-duplicates": { + "version": "2.1.0", + "from": "postcss-discard-duplicates@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz" + }, + "postcss-discard-empty": { + "version": "2.1.0", + "from": "postcss-discard-empty@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz" + }, + "postcss-discard-overridden": { + "version": "0.1.1", + "from": "postcss-discard-overridden@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz" + }, + "postcss-discard-unused": { + "version": "2.2.3", + "from": "postcss-discard-unused@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz" + }, + "postcss-filter-plugins": { + "version": "2.0.2", + "from": "postcss-filter-plugins@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz" + }, + "postcss-merge-idents": { + "version": "2.1.7", + "from": "postcss-merge-idents@>=2.1.5 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz" + }, + "postcss-merge-longhand": { + "version": "2.0.2", + "from": "postcss-merge-longhand@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz" + }, + "postcss-merge-rules": { + "version": "2.1.2", + "from": "postcss-merge-rules@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz" + }, + "postcss-message-helpers": { + "version": "2.0.0", + "from": "postcss-message-helpers@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz" + }, + "postcss-minify-font-values": { + "version": "1.0.5", + "from": "postcss-minify-font-values@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz" + }, + "postcss-minify-gradients": { + "version": "1.0.5", + "from": "postcss-minify-gradients@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz" + }, + "postcss-minify-params": { + "version": "1.2.2", + "from": "postcss-minify-params@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz" + }, + "postcss-minify-selectors": { + "version": "2.1.1", + "from": "postcss-minify-selectors@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz" + }, + "postcss-modules-extract-imports": { + "version": "1.1.0", + "from": "postcss-modules-extract-imports@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz", + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "from": "ansi-styles@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz" + }, + "chalk": { + "version": "2.0.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz" + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + }, + "postcss": { + "version": "6.0.6", + "from": "postcss@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz" + }, + "supports-color": { + "version": "4.1.0", + "from": "supports-color@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz" + } + } + }, + "postcss-modules-local-by-default": { + "version": "1.2.0", + "from": "postcss-modules-local-by-default@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "from": "ansi-styles@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz" + }, + "chalk": { + "version": "2.0.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz" + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + }, + "postcss": { + "version": "6.0.6", + "from": "postcss@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz" + }, + "supports-color": { + "version": "4.1.0", + "from": "supports-color@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz" + } + } + }, + "postcss-modules-scope": { + "version": "1.1.0", + "from": "postcss-modules-scope@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "from": "ansi-styles@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz" + }, + "chalk": { + "version": "2.0.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz" + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + }, + "postcss": { + "version": "6.0.6", + "from": "postcss@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz" + }, + "supports-color": { + "version": "4.1.0", + "from": "supports-color@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz" + } + } + }, + "postcss-modules-values": { + "version": "1.3.0", + "from": "postcss-modules-values@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", + "dependencies": { + "ansi-styles": { + "version": "3.1.0", + "from": "ansi-styles@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.1.0.tgz" + }, + "chalk": { + "version": "2.0.1", + "from": "chalk@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.0.1.tgz" + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz" + }, + "postcss": { + "version": "6.0.6", + "from": "postcss@>=6.0.1 <7.0.0", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.6.tgz" + }, + "supports-color": { + "version": "4.1.0", + "from": "supports-color@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.1.0.tgz" + } + } + }, + "postcss-normalize-charset": { + "version": "1.1.1", + "from": "postcss-normalize-charset@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz" + }, + "postcss-normalize-url": { + "version": "3.0.8", + "from": "postcss-normalize-url@>=3.0.7 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz" + }, + "postcss-ordered-values": { + "version": "2.2.3", + "from": "postcss-ordered-values@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz" + }, + "postcss-reduce-idents": { + "version": "2.4.0", + "from": "postcss-reduce-idents@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz" + }, + "postcss-reduce-initial": { + "version": "1.0.1", + "from": "postcss-reduce-initial@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz" + }, + "postcss-reduce-transforms": { + "version": "1.0.4", + "from": "postcss-reduce-transforms@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz" + }, + "postcss-selector-parser": { + "version": "2.2.3", + "from": "postcss-selector-parser@>=2.2.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz" + }, + "postcss-svgo": { + "version": "2.1.6", + "from": "postcss-svgo@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz" + }, + "postcss-unique-selectors": { + "version": "2.0.2", + "from": "postcss-unique-selectors@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz" + }, + "postcss-value-parser": { + "version": "3.3.0", + "from": "postcss-value-parser@>=3.3.0 <4.0.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz" + }, + "postcss-zindex": { + "version": "2.2.0", + "from": "postcss-zindex@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz" + }, + "preboot": { + "version": "4.5.2", + "from": "preboot@4.5.2", + "resolved": "https://registry.npmjs.org/preboot/-/preboot-4.5.2.tgz" + }, + "prepend-http": { + "version": "1.0.4", + "from": "prepend-http@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz" + }, + "preserve": { + "version": "0.2.0", + "from": "preserve@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz" + }, + "private": { + "version": "0.1.7", + "from": "private@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.7.tgz" + }, + "process": { + "version": "0.11.10", + "from": "process@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz" + }, + "process-nextick-args": { + "version": "1.0.7", + "from": "process-nextick-args@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz" + }, + "prr": { + "version": "0.0.0", + "from": "prr@>=0.0.0 <0.1.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz" + }, + "public-encrypt": { + "version": "4.0.0", + "from": "public-encrypt@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz" + }, + "punycode": { + "version": "1.4.1", + "from": "punycode@>=1.2.4 <2.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" + }, + "q": { + "version": "1.5.0", + "from": "q@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.0.tgz" + }, + "qjobs": { + "version": "1.1.5", + "from": "qjobs@>=1.1.4 <2.0.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.1.5.tgz", + "dev": true + }, + "qs": { + "version": "6.4.0", + "from": "qs@6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "dev": true + }, + "query-string": { + "version": "4.3.4", + "from": "query-string@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz" + }, + "querystring": { + "version": "0.2.0", + "from": "querystring@0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + }, + "querystring-es3": { + "version": "0.2.1", + "from": "querystring-es3@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz" + }, + "randomatic": { + "version": "1.1.7", + "from": "randomatic@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz" + }, + "randombytes": { + "version": "2.0.5", + "from": "randombytes@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz" + }, + "range-parser": { + "version": "1.2.0", + "from": "range-parser@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + }, + "raw-body": { + "version": "2.2.0", + "from": "raw-body@>=2.2.0 <2.3.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.2.0.tgz", + "dev": true, + "dependencies": { + "iconv-lite": { + "version": "0.4.15", + "from": "iconv-lite@0.4.15", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.15.tgz", + "dev": true + } + } + }, + "raw-loader": { + "version": "0.5.1", + "from": "raw-loader@0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz" + }, + "read-pkg": { + "version": "1.1.0", + "from": "read-pkg@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + }, + "read-pkg-up": { + "version": "1.0.1", + "from": "read-pkg-up@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz" + }, + "readable-stream": { + "version": "2.3.3", + "from": "readable-stream@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz" + }, + "readdirp": { + "version": "2.1.0", + "from": "readdirp@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz" + }, + "recast": { + "version": "0.11.23", + "from": "recast@>=0.11.12 <0.12.0", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz", + "dependencies": { + "esprima": { + "version": "3.1.3", + "from": "esprima@>=3.1.0 <3.2.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz" + } + } + }, + "reduce-css-calc": { + "version": "1.3.0", + "from": "reduce-css-calc@>=1.2.6 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz" + }, + "reduce-function-call": { + "version": "1.0.2", + "from": "reduce-function-call@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz" + }, + "reflect-metadata": { + "version": "0.1.10", + "from": "reflect-metadata@0.1.10", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz" + }, + "regenerate": { + "version": "1.3.2", + "from": "regenerate@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.2.tgz" + }, + "regex-cache": { + "version": "0.4.3", + "from": "regex-cache@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz" + }, + "regex-not": { + "version": "1.0.0", + "from": "regex-not@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz" + }, + "regexpu-core": { + "version": "1.0.0", + "from": "regexpu-core@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz" + }, + "regjsgen": { + "version": "0.2.0", + "from": "regjsgen@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz" + }, + "regjsparser": { + "version": "0.1.5", + "from": "regjsparser@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz" + }, + "relateurl": { + "version": "0.2.7", + "from": "relateurl@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + }, + "remove-trailing-separator": { + "version": "1.0.2", + "from": "remove-trailing-separator@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.2.tgz" + }, + "repeat-element": { + "version": "1.1.2", + "from": "repeat-element@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + }, + "repeat-string": { + "version": "1.6.1", + "from": "repeat-string@>=1.6.1 <2.0.0", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + }, + "require-directory": { + "version": "2.1.1", + "from": "require-directory@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + }, + "require-from-string": { + "version": "1.2.1", + "from": "require-from-string@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz" + }, + "require-main-filename": { + "version": "1.0.1", + "from": "require-main-filename@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + }, + "requires-port": { + "version": "1.0.0", + "from": "requires-port@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "dev": true + }, + "resolve": { + "version": "1.3.3", + "from": "resolve@>=1.1.6 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "from": "resolve-url@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz" + }, + "right-align": { + "version": "0.1.3", + "from": "right-align@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz" + }, + "rimraf": { + "version": "2.6.1", + "from": "rimraf@>=2.6.0 <3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "dev": true + }, + "ripemd160": { + "version": "2.0.1", + "from": "ripemd160@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz" + }, + "rxjs": { + "version": "5.4.2", + "from": "rxjs@5.4.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz" + }, + "safe-buffer": { + "version": "5.1.1", + "from": "safe-buffer@>=5.1.1 <5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + }, + "sax": { + "version": "1.2.4", + "from": "sax@>=1.2.1 <1.3.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + }, + "schema-utils": { + "version": "0.3.0", + "from": "schema-utils@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz" + }, + "semver": { + "version": "5.3.0", + "from": "semver@>=2.0.0 <3.0.0||>=3.0.0 <4.0.0||>=4.0.0 <5.0.0||>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" + }, + "set-blocking": { + "version": "2.0.0", + "from": "set-blocking@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz" + }, + "set-getter": { + "version": "0.1.0", + "from": "set-getter@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz" + }, + "set-immediate-shim": { + "version": "1.0.1", + "from": "set-immediate-shim@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz" + }, + "set-value": { + "version": "0.4.3", + "from": "set-value@>=0.4.2 <0.5.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz" + }, + "setimmediate": { + "version": "1.0.5", + "from": "setimmediate@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" + }, + "setprototypeof": { + "version": "1.0.3", + "from": "setprototypeof@1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "dev": true + }, + "sha.js": { + "version": "2.4.8", + "from": "sha.js@>=2.4.0 <3.0.0", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.8.tgz" + }, + "snapdragon": { + "version": "0.8.1", + "from": "snapdragon@>=0.8.1 <0.9.0", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "from": "snapdragon-node@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz" + }, + "snapdragon-util": { + "version": "3.0.1", + "from": "snapdragon-util@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "socket.io": { + "version": "1.7.3", + "from": "socket.io@1.7.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.7.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "from": "object-assign@4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "from": "socket.io-adapter@0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.7.3", + "from": "socket.io-client@1.7.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.7.3.tgz", + "dev": true, + "dependencies": { + "debug": { + "version": "2.3.3", + "from": "debug@2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "dev": true + }, + "ms": { + "version": "0.7.2", + "from": "ms@0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "from": "socket.io-parser@2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "dev": true, + "dependencies": { + "component-emitter": { + "version": "1.1.2", + "from": "component-emitter@1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "dev": true + }, + "debug": { + "version": "2.2.0", + "from": "debug@2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "dev": true + }, + "ms": { + "version": "0.7.1", + "from": "ms@0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "dev": true + } + } + }, + "sort-keys": { + "version": "1.1.2", + "from": "sort-keys@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz" + }, + "source-list-map": { + "version": "0.1.8", + "from": "source-list-map@>=0.1.7 <0.2.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz" + }, + "source-map": { + "version": "0.5.6", + "from": "source-map@>=0.5.6 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz" + }, + "source-map-resolve": { + "version": "0.5.0", + "from": "source-map-resolve@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.0.tgz" + }, + "source-map-support": { + "version": "0.4.15", + "from": "source-map-support@>=0.4.15 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz" + }, + "source-map-url": { + "version": "0.4.0", + "from": "source-map-url@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz" + }, + "spdx-correct": { + "version": "1.0.2", + "from": "spdx-correct@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz" + }, + "spdx-expression-parse": { + "version": "1.0.4", + "from": "spdx-expression-parse@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" + }, + "spdx-license-ids": { + "version": "1.2.2", + "from": "spdx-license-ids@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" + }, + "split-string": { + "version": "2.1.1", + "from": "split-string@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-2.1.1.tgz" + }, + "sprintf-js": { + "version": "1.0.3", + "from": "sprintf-js@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + }, + "static-extend": { + "version": "0.1.2", + "from": "static-extend@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "statuses": { + "version": "1.3.1", + "from": "statuses@>=1.3.1 <1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz" + }, + "stream-browserify": { + "version": "2.0.1", + "from": "stream-browserify@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz" + }, + "stream-http": { + "version": "2.7.2", + "from": "stream-http@>=2.3.1 <3.0.0", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz" + }, + "strict-uri-encode": { + "version": "1.1.0", + "from": "strict-uri-encode@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz" + }, + "string_decoder": { + "version": "1.0.3", + "from": "string_decoder@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz" + }, + "string-width": { + "version": "1.0.2", + "from": "string-width@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" + }, + "strip-ansi": { + "version": "3.0.1", + "from": "strip-ansi@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "strip-bom": { + "version": "2.0.0", + "from": "strip-bom@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + }, + "style-loader": { + "version": "0.18.2", + "from": "style-loader@0.18.2", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.18.2.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "supports-color": { + "version": "2.0.0", + "from": "supports-color@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + }, + "svgo": { + "version": "0.7.2", + "from": "svgo@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz" + }, + "symbol-observable": { + "version": "1.0.4", + "from": "symbol-observable@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.4.tgz" + }, + "tapable": { + "version": "0.2.6", + "from": "tapable@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.6.tgz" + }, + "through": { + "version": "2.3.8", + "from": "through@>=2.3.6 <2.4.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "timers-browserify": { + "version": "2.0.2", + "from": "timers-browserify@>=2.0.2 <3.0.0", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.2.tgz" + }, + "tmp": { + "version": "0.0.31", + "from": "tmp@0.0.31", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.31.tgz", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "from": "to-array@0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "from": "to-arraybuffer@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz" + }, + "to-object-path": { + "version": "0.3.0", + "from": "to-object-path@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "dependencies": { + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "to-regex": { + "version": "3.0.1", + "from": "to-regex@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "from": "to-regex-range@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz" + }, + "to-string-loader": { + "version": "1.1.5", + "from": "to-string-loader@1.1.5", + "resolved": "https://registry.npmjs.org/to-string-loader/-/to-string-loader-1.1.5.tgz" + }, + "tsickle": { + "version": "0.21.6", + "from": "tsickle@>=0.21.0 <0.22.0", + "resolved": "https://registry.npmjs.org/tsickle/-/tsickle-0.21.6.tgz", + "dependencies": { + "minimist": { + "version": "1.2.0", + "from": "minimist@^1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + } + } + }, + "tslib": { + "version": "1.7.1", + "from": "tslib@>=1.7.1 <2.0.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz" + }, + "tty-browserify": { + "version": "0.0.0", + "from": "tty-browserify@0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz" + }, + "type-detect": { + "version": "4.0.3", + "from": "type-detect@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "from": "type-is@>=1.6.15 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "dev": true + }, + "typescript": { + "version": "2.4.1", + "from": "typescript@2.4.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.1.tgz" + }, + "uglify-js": { + "version": "3.0.23", + "from": "uglify-js@>=3.0.0 <3.1.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.0.23.tgz" + }, + "uglify-to-browserify": { + "version": "1.0.2", + "from": "uglify-to-browserify@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "optional": true + }, + "ultron": { + "version": "1.0.2", + "from": "ultron@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "dev": true + }, + "union-value": { + "version": "0.2.4", + "from": "union-value@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-0.2.4.tgz" + }, + "uniq": { + "version": "1.0.1", + "from": "uniq@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz" + }, + "uniqid": { + "version": "4.1.1", + "from": "uniqid@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz" + }, + "uniqs": { + "version": "2.0.0", + "from": "uniqs@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz" + }, + "unpipe": { + "version": "1.0.0", + "from": "unpipe@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "unset-value": { + "version": "0.1.2", + "from": "unset-value@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-0.1.2.tgz" + }, + "upper-case": { + "version": "1.1.3", + "from": "upper-case@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz" + }, + "urix": { + "version": "0.1.0", + "from": "urix@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz" + }, + "url": { + "version": "0.11.0", + "from": "url@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "dependencies": { + "punycode": { + "version": "1.3.2", + "from": "punycode@1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz" + } + } + }, + "url-loader": { + "version": "0.5.9", + "from": "url-loader@0.5.9", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-0.5.9.tgz", + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "from": "loader-utils@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz" + } + } + }, + "use": { + "version": "2.0.2", + "from": "use@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "dependencies": { + "define-property": { + "version": "0.2.5", + "from": "define-property@>=0.2.5 <0.3.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz" + }, + "is-descriptor": { + "version": "0.1.5", + "from": "is-descriptor@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.5.tgz" + }, + "kind-of": { + "version": "3.2.2", + "from": "kind-of@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + } + }, + "useragent": { + "version": "2.2.0", + "from": "useragent@>=2.1.12 <3.0.0", + "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.0.tgz", + "dev": true + }, + "util": { + "version": "0.10.3", + "from": "util@>=0.10.3 <0.11.0", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "dependencies": { + "inherits": { + "version": "2.0.1", + "from": "inherits@2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "utils-merge": { + "version": "1.0.0", + "from": "utils-merge@1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz" + }, + "validate-npm-package-license": { + "version": "3.0.1", + "from": "validate-npm-package-license@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" + }, + "vendors": { + "version": "1.0.1", + "from": "vendors@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz" + }, + "vlq": { + "version": "0.2.2", + "from": "vlq@>=0.2.1 <0.3.0", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.2.tgz" + }, + "vm-browserify": { + "version": "0.0.4", + "from": "vm-browserify@0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz" + }, + "void-elements": { + "version": "2.0.1", + "from": "void-elements@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "dev": true + }, + "watchpack": { + "version": "1.3.1", + "from": "watchpack@>=1.3.1 <2.0.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.3.1.tgz" + }, + "webpack": { + "version": "2.5.1", + "from": "webpack@2.5.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-2.5.1.tgz", + "dependencies": { + "ajv": { + "version": "4.11.8", + "from": "ajv@>=4.7.0 <5.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz" + }, + "memory-fs": { + "version": "0.4.1", + "from": "memory-fs@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" + }, + "source-list-map": { + "version": "1.1.2", + "from": "source-list-map@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-1.1.2.tgz" + }, + "supports-color": { + "version": "3.2.3", + "from": "supports-color@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + }, + "uglify-js": { + "version": "2.8.29", + "from": "uglify-js@>=2.8.5 <3.0.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "dependencies": { + "yargs": { + "version": "3.10.0", + "from": "yargs@>=3.10.0 <3.11.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + } + } + }, + "webpack-sources": { + "version": "0.2.3", + "from": "webpack-sources@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-0.2.3.tgz" + } + } + }, + "webpack-dev-middleware": { + "version": "1.11.0", + "from": "webpack-dev-middleware@>=1.8.4 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.11.0.tgz", + "dependencies": { + "memory-fs": { + "version": "0.4.1", + "from": "memory-fs@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz" + } + } + }, + "webpack-hot-middleware": { + "version": "2.18.2", + "from": "webpack-hot-middleware@2.18.2", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.18.2.tgz" + }, + "webpack-merge": { + "version": "4.1.0", + "from": "webpack-merge@4.1.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.1.0.tgz" + }, + "webpack-node-externals": { + "version": "1.6.0", + "from": "webpack-node-externals@>=1.4.3 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz" + }, + "webpack-sources": { + "version": "1.0.1", + "from": "webpack-sources@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "dependencies": { + "source-list-map": { + "version": "2.0.0", + "from": "source-list-map@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz" + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "from": "whatwg-fetch@>=0.10.0", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz" + }, + "whet.extend": { + "version": "0.9.9", + "from": "whet.extend@>=0.9.9 <0.10.0", + "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz" + }, + "which": { + "version": "1.2.14", + "from": "which@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "dev": true + }, + "which-module": { + "version": "1.0.0", + "from": "which-module@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz" + }, + "window-size": { + "version": "0.1.0", + "from": "window-size@0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + }, + "wordwrap": { + "version": "0.0.2", + "from": "wordwrap@0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "wrap-ansi": { + "version": "2.1.0", + "from": "wrap-ansi@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + }, + "wrappy": { + "version": "1.0.2", + "from": "wrappy@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "dev": true + }, + "ws": { + "version": "1.1.2", + "from": "ws@1.1.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.2.tgz", + "dev": true + }, + "wtf-8": { + "version": "1.0.0", + "from": "wtf-8@1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "dev": true + }, + "xhr2": { + "version": "0.1.4", + "from": "xhr2@>=0.1.4 <0.2.0", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz" + }, + "xml-char-classes": { + "version": "1.0.0", + "from": "xml-char-classes@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz" + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "from": "xmlhttprequest-ssl@1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "y18n": { + "version": "3.2.1", + "from": "y18n@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz" + }, + "yargs": { + "version": "6.6.0", + "from": "yargs@>=6.0.0 <7.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", + "dependencies": { + "camelcase": { + "version": "3.0.0", + "from": "camelcase@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + }, + "cliui": { + "version": "3.2.0", + "from": "cliui@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz" + } + } + }, + "yargs-parser": { + "version": "4.2.1", + "from": "yargs-parser@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", + "dependencies": { + "camelcase": { + "version": "3.0.0", + "from": "camelcase@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + } + } + }, + "yeast": { + "version": "0.1.2", + "from": "yeast@0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "dev": true + }, + "zone.js": { + "version": "0.8.12", + "from": "zone.js@0.8.12", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.8.12.tgz" + } + } +} diff --git a/GeekHunters/package.json b/GeekHunters/package.json new file mode 100644 index 0000000..5700e2a --- /dev/null +++ b/GeekHunters/package.json @@ -0,0 +1,63 @@ +{ + "name": "GeekHunters", + "private": true, + "version": "0.0.0", + "scripts": { + "test": "karma start ClientApp/test/karma.conf.js" + }, + "dependencies": { + "@angular/animations": "4.2.5", + "@angular/common": "4.2.5", + "@angular/compiler": "4.2.5", + "@angular/compiler-cli": "4.2.5", + "@angular/core": "4.2.5", + "@angular/forms": "4.2.5", + "@angular/http": "4.2.5", + "@angular/platform-browser": "4.2.5", + "@angular/platform-browser-dynamic": "4.2.5", + "@angular/platform-server": "4.2.5", + "@angular/router": "4.2.5", + "@ngtools/webpack": "1.5.0", + "@types/webpack-env": "1.13.0", + "angular2-template-loader": "0.6.2", + "aspnet-prerendering": "^3.0.1", + "aspnet-webpack": "^2.0.1", + "awesome-typescript-loader": "3.2.1", + "bootstrap": "3.3.7", + "css": "2.2.1", + "css-loader": "0.28.4", + "es6-shim": "0.35.3", + "event-source-polyfill": "0.0.9", + "expose-loader": "0.7.3", + "extract-text-webpack-plugin": "2.1.2", + "file-loader": "0.11.2", + "html-loader": "0.4.5", + "isomorphic-fetch": "2.2.1", + "jquery": "3.2.1", + "json-loader": "0.5.4", + "preboot": "4.5.2", + "raw-loader": "0.5.1", + "reflect-metadata": "0.1.10", + "rxjs": "5.4.2", + "style-loader": "0.18.2", + "to-string-loader": "1.1.5", + "typescript": "2.4.1", + "url-loader": "0.5.9", + "webpack": "2.5.1", + "webpack-hot-middleware": "2.18.2", + "webpack-merge": "4.1.0", + "zone.js": "0.8.12" + }, + "devDependencies": { + "@types/chai": "4.0.1", + "@types/jasmine": "2.5.53", + "chai": "4.0.2", + "jasmine-core": "2.6.4", + "karma": "1.7.0", + "karma-chai": "0.1.0", + "karma-chrome-launcher": "2.2.0", + "karma-cli": "1.0.1", + "karma-jasmine": "1.1.0", + "karma-webpack": "2.0.3" + } +} diff --git a/GeekHunters/tsconfig.json b/GeekHunters/tsconfig.json new file mode 100644 index 0000000..4a6a371 --- /dev/null +++ b/GeekHunters/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "module": "es2015", + "moduleResolution": "node", + "target": "es5", + "sourceMap": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "skipDefaultLibCheck": true, + "skipLibCheck": true, // Workaround for https://github.com/angular/angular/issues/17863. Remove this if you upgrade to a fixed version of Angular. + "strict": true, + "lib": [ "es6", "dom" ], + "types": [ "webpack-env" ] + }, + "exclude": [ "bin", "node_modules" ], + "atom": { "rewriteTsconfig": false } +} diff --git a/GeekHunters/webpack.config.js b/GeekHunters/webpack.config.js new file mode 100644 index 0000000..85e238d --- /dev/null +++ b/GeekHunters/webpack.config.js @@ -0,0 +1,84 @@ +const path = require('path'); +const webpack = require('webpack'); +const merge = require('webpack-merge'); +const AotPlugin = require('@ngtools/webpack').AotPlugin; +const CheckerPlugin = require('awesome-typescript-loader').CheckerPlugin; + +module.exports = (env) => { + // Configuration in common to both client-side and server-side bundles + const isDevBuild = !(env && env.prod); + const sharedConfig = { + stats: { modules: false }, + context: __dirname, + resolve: { extensions: [ '.js', '.ts' ] }, + output: { + filename: '[name].js', + publicPath: 'dist/' // Webpack dev middleware, if enabled, handles requests for this URL prefix + }, + module: { + rules: [ + { test: /\.ts$/, include: /ClientApp/, use: isDevBuild ? ['awesome-typescript-loader?silent=true', 'angular2-template-loader'] : '@ngtools/webpack' }, + { test: /\.html$/, use: 'html-loader?minimize=false' }, + { test: /\.css$/, use: [ 'to-string-loader', isDevBuild ? 'css-loader' : 'css-loader?minimize' ] }, + { test: /\.(png|jpg|jpeg|gif|svg)$/, use: 'url-loader?limit=25000' } + ] + }, + plugins: [new CheckerPlugin()] + }; + + // Configuration for client-side bundle suitable for running in browsers + const clientBundleOutputDir = './wwwroot/dist'; + const clientBundleConfig = merge(sharedConfig, { + entry: { 'main-client': './ClientApp/boot.browser.ts' }, + output: { path: path.join(__dirname, clientBundleOutputDir) }, + plugins: [ + new webpack.DllReferencePlugin({ + context: __dirname, + manifest: require('./wwwroot/dist/vendor-manifest.json') + }) + ].concat(isDevBuild ? [ + // Plugins that apply in development builds only + new webpack.SourceMapDevToolPlugin({ + filename: '[file].map', // Remove this line if you prefer inline source maps + moduleFilenameTemplate: path.relative(clientBundleOutputDir, '[resourcePath]') // Point sourcemap entries to the original file locations on disk + }) + ] : [ + // Plugins that apply in production builds only + new webpack.optimize.UglifyJsPlugin(), + new AotPlugin({ + tsConfigPath: './tsconfig.json', + entryModule: path.join(__dirname, 'ClientApp/app/app.module.browser#AppModule'), + exclude: ['./**/*.server.ts'] + }) + ]) + }); + + // Configuration for server-side (prerendering) bundle suitable for running in Node + const serverBundleConfig = merge(sharedConfig, { + resolve: { mainFields: ['main'] }, + entry: { 'main-server': './ClientApp/boot.server.ts' }, + plugins: [ + new webpack.DllReferencePlugin({ + context: __dirname, + manifest: require('./ClientApp/dist/vendor-manifest.json'), + sourceType: 'commonjs2', + name: './vendor' + }) + ].concat(isDevBuild ? [] : [ + // Plugins that apply in production builds only + new AotPlugin({ + tsConfigPath: './tsconfig.json', + entryModule: path.join(__dirname, 'ClientApp/app/app.module.server#AppModule'), + exclude: ['./**/*.browser.ts'] + }) + ]), + output: { + libraryTarget: 'commonjs', + path: path.join(__dirname, './ClientApp/dist') + }, + target: 'node', + devtool: 'inline-source-map' + }); + + return [clientBundleConfig, serverBundleConfig]; +}; diff --git a/GeekHunters/webpack.config.vendor.js b/GeekHunters/webpack.config.vendor.js new file mode 100644 index 0000000..36e4386 --- /dev/null +++ b/GeekHunters/webpack.config.vendor.js @@ -0,0 +1,94 @@ +const path = require('path'); +const webpack = require('webpack'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const merge = require('webpack-merge'); +const treeShakableModules = [ + '@angular/animations', + '@angular/common', + '@angular/compiler', + '@angular/core', + '@angular/forms', + '@angular/http', + '@angular/platform-browser', + '@angular/platform-browser-dynamic', + '@angular/router', + 'zone.js', +]; +const nonTreeShakableModules = [ + 'bootstrap', + 'bootstrap/dist/css/bootstrap.css', + 'es6-promise', + 'es6-shim', + 'event-source-polyfill', + 'jquery', +]; +const allModules = treeShakableModules.concat(nonTreeShakableModules); + +module.exports = (env) => { + const extractCSS = new ExtractTextPlugin('vendor.css'); + const isDevBuild = !(env && env.prod); + const sharedConfig = { + stats: { modules: false }, + resolve: { extensions: [ '.js' ] }, + module: { + rules: [ + { test: /\.(png|woff|woff2|eot|ttf|svg)(\?|$)/, use: 'url-loader?limit=100000' } + ] + }, + output: { + publicPath: 'dist/', + filename: '[name].js', + library: '[name]_[hash]' + }, + plugins: [ + new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery' }), // Maps these identifiers to the jQuery package (because Bootstrap expects it to be a global variable) + new webpack.ContextReplacementPlugin(/\@angular\b.*\b(bundles|linker)/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/11580 + new webpack.ContextReplacementPlugin(/angular(\\|\/)core(\\|\/)@angular/, path.join(__dirname, './ClientApp')), // Workaround for https://github.com/angular/angular/issues/14898 + new webpack.IgnorePlugin(/^vertx$/) // Workaround for https://github.com/stefanpenner/es6-promise/issues/100 + ] + }; + + const clientBundleConfig = merge(sharedConfig, { + entry: { + // To keep development builds fast, include all vendor dependencies in the vendor bundle. + // 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') }, + module: { + rules: [ + { test: /\.css(\?|$)/, use: extractCSS.extract({ use: isDevBuild ? 'css-loader' : 'css-loader?minimize' }) } + ] + }, + plugins: [ + extractCSS, + new webpack.DllPlugin({ + path: path.join(__dirname, 'wwwroot', 'dist', '[name]-manifest.json'), + name: '[name]_[hash]' + }) + ].concat(isDevBuild ? [] : [ + new webpack.optimize.UglifyJsPlugin() + ]) + }); + + const serverBundleConfig = merge(sharedConfig, { + target: 'node', + resolve: { mainFields: ['main'] }, + entry: { vendor: allModules.concat(['aspnet-prerendering']) }, + output: { + path: path.join(__dirname, 'ClientApp', 'dist'), + libraryTarget: 'commonjs2', + }, + module: { + rules: [ { test: /\.css(\?|$)/, use: ['to-string-loader', isDevBuild ? 'css-loader' : 'css-loader?minimize' ] } ] + }, + plugins: [ + new webpack.DllPlugin({ + path: path.join(__dirname, 'ClientApp', 'dist', '[name]-manifest.json'), + name: '[name]_[hash]' + }) + ] + }); + + return [clientBundleConfig, serverBundleConfig]; +} diff --git a/GeekHunters/wwwroot/favicon.ico b/GeekHunters/wwwroot/favicon.ico new file mode 100644 index 0000000..a3a7999 Binary files /dev/null and b/GeekHunters/wwwroot/favicon.ico differ diff --git a/README.md b/README.md index b989ffb..d7cfc7b 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,13 @@ # Geek Hunters -You are working in IT-recruiting agency "Geek Hunters". Your employer asked you to implement Geek Registration System -(GRS). +http://geekhunters.azurewebsites.net/ -Using GRS a recruitment agent should be able to: - - register a new candidate: - - first name / last name - - select technologies candidate has experience in from the predefined list - - view all candidates - - filter candidates by technology +Technology, Framework and NuGet Packages: +.NET Core 2.0 in GeekHunters project (created in vs2017 as a Single Page Application template). +.NET Standard 2.0 in GeekHunters.Repository project. +Microsoft.Azure.DocumentDB.Core to allow access to GeekHunters in Azure Cosmos DB. +Swagger: provides API Tooling by Swashbuckle.AspNetCore.Swagger. +Unit Testing with NUnit v3.8.1 +Bundle and deployment with webpack.config.js -Another developer has partially designed and implemented a -SQLite DB for this project - GeekHunters.sqlite. Feel free to modify a structure to -your needs. - -Please fork the project and commit your source code (please do not archive it :) ). - -You are free to use **ANY** technology and frameworks you need - -Console Application / Desktop / Web. However, if you decide to go with third -party package manager or dev tool - don't forget to mention them in the -README.md of your fork. - -Good luck! - -P.S: And unit tests! We love unit tests!