From 4636950bfab20d08ce190c4d0a742797b3554d6a Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 26 Aug 2020 11:32:05 -0700 Subject: [PATCH 01/25] Handle auth schemes in cookie names #25266 --- ...ostConfigureCookieAuthenticationOptions.cs | 2 +- .../Core/src/RemoteAuthenticationHandler.cs | 4 +- .../Authentication/test/CookieTests.cs | 31 ++++++ .../Authentication/test/FacebookTests.cs | 2 +- .../Authentication/test/GoogleTests.cs | 44 ++++----- .../test/MicrosoftAccountTests.cs | 6 +- .../Authentication/test/OAuthTests.cs | 8 +- .../OpenIdConnectAuthenticateTests.cs | 2 +- .../OpenIdConnect/OpenIdConnectEventTests.cs | 2 +- src/Security/Security.slnf | 96 +++++++++---------- 10 files changed, 114 insertions(+), 83 deletions(-) diff --git a/src/Security/Authentication/Cookies/src/PostConfigureCookieAuthenticationOptions.cs b/src/Security/Authentication/Cookies/src/PostConfigureCookieAuthenticationOptions.cs index 588109880005..4892287fb790 100644 --- a/src/Security/Authentication/Cookies/src/PostConfigureCookieAuthenticationOptions.cs +++ b/src/Security/Authentication/Cookies/src/PostConfigureCookieAuthenticationOptions.cs @@ -30,7 +30,7 @@ public void PostConfigure(string name, CookieAuthenticationOptions options) if (string.IsNullOrEmpty(options.Cookie.Name)) { - options.Cookie.Name = CookieAuthenticationDefaults.CookiePrefix + name; + options.Cookie.Name = CookieAuthenticationDefaults.CookiePrefix + Uri.EscapeDataString(name); } if (options.TicketDataFormat == null) { diff --git a/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs b/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs index ed5e379d6617..7d56d3d5800a 100644 --- a/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs +++ b/src/Security/Authentication/Core/src/RemoteAuthenticationHandler.cs @@ -200,7 +200,7 @@ protected virtual void GenerateCorrelationId(AuthenticationProperties properties properties.Items[CorrelationProperty] = correlationId; - var cookieName = Options.CorrelationCookie.Name + Scheme.Name + "." + correlationId; + var cookieName = Options.CorrelationCookie.Name + correlationId; Response.Cookies.Append(cookieName, CorrelationMarker, cookieOptions); } @@ -220,7 +220,7 @@ protected virtual bool ValidateCorrelationId(AuthenticationProperties properties properties.Items.Remove(CorrelationProperty); - var cookieName = Options.CorrelationCookie.Name + Scheme.Name + "." + correlationId; + var cookieName = Options.CorrelationCookie.Name + correlationId; var correlationCookie = Request.Cookies[cookieName]; if (string.IsNullOrEmpty(correlationCookie)) diff --git a/src/Security/Authentication/test/CookieTests.cs b/src/Security/Authentication/test/CookieTests.cs index 56bea6c65a05..ff368b283d50 100644 --- a/src/Security/Authentication/test/CookieTests.cs +++ b/src/Security/Authentication/test/CookieTests.cs @@ -151,6 +151,37 @@ public async Task SignInCausesDefaultCookieToBeCreated() Assert.Equal("no-cache", transaction.Response.Headers.Pragma.ToString()); } + [Fact] + public async Task CustomAuthSchemeEncodesCookieName() + { + using var host = await CreateHostWithServices(s => s.AddAuthentication("With Spaces").AddCookie("With Spaces", o => + { + o.LoginPath = new PathString("/login"); + }), context => + { + var user = new ClaimsIdentity(new GenericIdentity("Alice", "Cookies")); + user.AddClaim(new Claim("marker", "true")); + return context.SignInAsync("With Spaces", + new ClaimsPrincipal(user), + new AuthenticationProperties()); + }); + + using var server = host.GetTestServer(); + var transaction = await SendAsync(server, "http://example.com/testpath"); + + var setCookie = transaction.SetCookie; + Assert.StartsWith(".AspNetCore.With%20Spaces=", setCookie); + Assert.Contains("; path=/", setCookie); + Assert.Contains("; httponly", setCookie); + Assert.Contains("; samesite=", setCookie); + Assert.DoesNotContain("; expires=", setCookie); + Assert.DoesNotContain("; domain=", setCookie); + Assert.DoesNotContain("; secure", setCookie); + Assert.True(transaction.Response.Headers.CacheControl.NoCache); + Assert.True(transaction.Response.Headers.CacheControl.NoStore); + Assert.Equal("no-cache", transaction.Response.Headers.Pragma.ToString()); + } + [Fact] public void SettingCookieExpirationOptionThrows() { diff --git a/src/Security/Authentication/test/FacebookTests.cs b/src/Security/Authentication/test/FacebookTests.cs index 2d1a849aa3de..6ca835dff182 100644 --- a/src/Security/Authentication/test/FacebookTests.cs +++ b/src/Security/Authentication/test/FacebookTests.cs @@ -363,7 +363,7 @@ public async Task CustomUserInfoEndpointHasValidGraphQuery() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-facebook?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Facebook.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(1, finalUserInfoEndpoint.Count(c => c == '?')); diff --git a/src/Security/Authentication/test/GoogleTests.cs b/src/Security/Authentication/test/GoogleTests.cs index c53181047b75..c10a3c1583d3 100644 --- a/src/Security/Authentication/test/GoogleTests.cs +++ b/src/Security/Authentication/test/GoogleTests.cs @@ -133,7 +133,7 @@ public async Task ChallengeWillSetCorrelationCookie() }); using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://example.com/challenge"); - Assert.Contains(transaction.SetCookie, cookie => cookie.StartsWith(".AspNetCore.Correlation.Google.")); + Assert.Contains(transaction.SetCookie, cookie => cookie.StartsWith(".AspNetCore.Correlation.")); } [Fact] @@ -392,7 +392,7 @@ public async Task ReplyPathWithAccessDeniedErrorFails(bool redirect) }); using var server = host.GetTestServer(); var sendTask = server.SendAsync("https://example.com/signin-google?error=access_denied&error_description=SoBad&error_uri=foobar&state=protected_state", - ".AspNetCore.Correlation.Google.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); if (redirect) { var transaction = await sendTask; @@ -431,7 +431,7 @@ public async Task ReplyPathWithAccessDeniedError_AllowsCustomizingPath() }); using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://example.com/signin-google?error=access_denied&error_description=SoBad&error_uri=foobar&state=protected_state", - ".AspNetCore.Correlation.Google.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("https://example.com/custom-denied-page?rurl=http%3A%2F%2Fwww.google.com%2F", transaction.Response.Headers.GetValues("Location").First()); } @@ -474,7 +474,7 @@ public async Task ReplyPathWithAccessDeniedErrorAndNoAccessDeniedPath_FallsBackT }); using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://example.com/signin-google?error=access_denied&error_description=whyitfailed&error_uri=https://example.com/fail&state=protected_state", - ".AspNetCore.Correlation.Google.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.StartsWith("/error?FailureMessage=", transaction.Response.Headers.GetValues("Location").First()); Assert.True(accessDeniedCalled); @@ -510,7 +510,7 @@ public async Task ReplyPathWithErrorFails(bool redirect) }); using var server = host.GetTestServer(); var sendTask = server.SendAsync("https://example.com/signin-google?error=itfailed&error_description=whyitfailed&error_uri=https://example.com/fail&state=protected_state", - ".AspNetCore.Correlation.Google.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); if (redirect) { var transaction = await sendTask; @@ -552,11 +552,11 @@ public async Task ReplyPathWillAuthenticateValidAuthorizeCodeAndState(string cla using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; @@ -619,7 +619,7 @@ public async Task ReplyPathWillThrowIfCodeIsInvalid(bool redirect) using var server = host.GetTestServer(); var sendTask = server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); if (redirect) { var transaction = await sendTask; @@ -671,7 +671,7 @@ public async Task ReplyPathWillRejectIfAccessTokenIsMissing(bool redirect) using var server = host.GetTestServer(); var sendTask = server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); if (redirect) { var transaction = await sendTask; @@ -715,11 +715,11 @@ public async Task AuthenticatedEventCanGetRefreshToken() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; @@ -755,11 +755,11 @@ public async Task NullRedirectUriWillRedirectToSlash() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); } @@ -802,7 +802,7 @@ public async Task ValidateAuthenticatedContext() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/foo", transaction.Response.Headers.GetValues("Location").First()); @@ -876,11 +876,11 @@ public async Task AuthenticateAutomaticWhenAlreadySignedInSucceeds() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); // Delete + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); // Delete Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; @@ -920,11 +920,11 @@ public async Task AuthenticateGoogleWhenAlreadySignedInSucceeds() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); // Delete + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); // Delete Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; @@ -964,11 +964,11 @@ public async Task AuthenticateFacebookWhenAlreadySignedWithGoogleReturnsNull() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); // Delete + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); // Delete Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; @@ -1001,11 +1001,11 @@ public async Task ChallengeFacebookWhenAlreadySignedWithGoogleSucceeds() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-google?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Google.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Google.{correlationValue}", transaction.SetCookie[0]); // Delete + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); // Delete Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; diff --git a/src/Security/Authentication/test/MicrosoftAccountTests.cs b/src/Security/Authentication/test/MicrosoftAccountTests.cs index 8797357b461a..3cafef86de5e 100644 --- a/src/Security/Authentication/test/MicrosoftAccountTests.cs +++ b/src/Security/Authentication/test/MicrosoftAccountTests.cs @@ -242,11 +242,11 @@ public async Task AuthenticatedEventCanGetRefreshToken() using var server = host.GetTestServer(); var transaction = await server.SendAsync( "https://example.com/signin-microsoft?code=TestCode&state=" + UrlEncoder.Default.Encode(state), - $".AspNetCore.Correlation.Microsoft.{correlationValue}=N"); + $".AspNetCore.Correlation.{correlationValue}=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.Contains($".AspNetCore.Correlation.Microsoft.{correlationValue}", transaction.SetCookie[0]); + Assert.Contains($".AspNetCore.Correlation.{correlationValue}", transaction.SetCookie[0]); Assert.Contains(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); var authCookie = transaction.AuthenticationCookieValue; @@ -351,7 +351,7 @@ public async Task PkceSentToTokenEndpoint() Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("/me", transaction.Response.Headers.GetValues("Location").First()); Assert.Equal(2, transaction.SetCookie.Count); - Assert.StartsWith(".AspNetCore.Correlation.Microsoft.", transaction.SetCookie[0]); + Assert.StartsWith(".AspNetCore.Correlation.", transaction.SetCookie[0]); Assert.StartsWith(".AspNetCore." + TestExtensions.CookieAuthenticationScheme, transaction.SetCookie[1]); } diff --git a/src/Security/Authentication/test/OAuthTests.cs b/src/Security/Authentication/test/OAuthTests.cs index 5b3ab2eef952..c52fd671f29f 100644 --- a/src/Security/Authentication/test/OAuthTests.cs +++ b/src/Security/Authentication/test/OAuthTests.cs @@ -283,7 +283,7 @@ public async Task HandleRequestAsync_RedirectsToAccessDeniedPathWhenExplicitlySe using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://www.example.com/oauth-callback?error=access_denied&state=protected_state", - ".AspNetCore.Correlation.Weblie.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.Equal("https://www.example.com/access-denied?ReturnUrl=http%3A%2F%2Ftesthost%2Fredirect", transaction.Response.Headers.Location.ToString()); @@ -318,7 +318,7 @@ public async Task HandleRequestAsync_InvokesAccessDeniedEvent() using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://www.example.com/oauth-callback?error=access_denied&state=protected_state", - ".AspNetCore.Correlation.Weblie.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.NotAcceptable, transaction.Response.StatusCode); Assert.Null(transaction.Response.Headers.Location); @@ -354,7 +354,7 @@ public async Task HandleRequestAsync_InvokesRemoteFailureEventWhenAccessDeniedPa using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://www.example.com/oauth-callback?error=access_denied&state=protected_state", - ".AspNetCore.Correlation.Weblie.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.NotAcceptable, transaction.Response.StatusCode); Assert.Null(transaction.Response.Headers.Location); @@ -390,7 +390,7 @@ public async Task RemoteAuthenticationFailed_OAuthError_IncludesProperties() using var server = host.GetTestServer(); var transaction = await server.SendAsync("https://www.example.com/oauth-callback?error=custom_error&state=protected_state", - ".AspNetCore.Correlation.Weblie.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.NotAcceptable, transaction.Response.StatusCode); Assert.Null(transaction.Response.Headers.Location); diff --git a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectAuthenticateTests.cs b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectAuthenticateTests.cs index 8502b0670a65..29003637c4ea 100644 --- a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectAuthenticateTests.cs +++ b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectAuthenticateTests.cs @@ -100,7 +100,7 @@ public async Task ErrorResponseWithDetails() var transaction = await server.SendAsync( "https://example.com/signin-oidc?error=itfailed&error_description=whyitfailed&error_uri=https://example.com/fail&state=protected_state", - ".AspNetCore.Correlation.OpenIdConnect.correlationId=N"); + ".AspNetCore.Correlation.correlationId=N"); Assert.Equal(HttpStatusCode.Redirect, transaction.Response.StatusCode); Assert.StartsWith("/error?FailureMessage=", transaction.Response.Headers.GetValues("Location").First()); } diff --git a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectEventTests.cs b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectEventTests.cs index 691bd9f7301a..97b25e1d96a0 100644 --- a/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectEventTests.cs +++ b/src/Security/Authentication/test/OpenIdConnect/OpenIdConnectEventTests.cs @@ -1309,7 +1309,7 @@ private TestServer CreateServer(OpenIdConnectEvents events, RequestDelegate appC private Task PostAsync(TestServer server, string path, string form) { var client = server.CreateClient(); - var cookie = ".AspNetCore.Correlation." + OpenIdConnectDefaults.AuthenticationScheme + ".correlationId=N"; + var cookie = ".AspNetCore.Correlation.correlationId=N"; client.DefaultRequestHeaders.Add("Cookie", cookie); return client.PostAsync("signin-oidc", new StringContent(form, Encoding.ASCII, "application/x-www-form-urlencoded")); diff --git a/src/Security/Security.slnf b/src/Security/Security.slnf index d4e826e25f71..7b6afc73191a 100644 --- a/src/Security/Security.slnf +++ b/src/Security/Security.slnf @@ -1,15 +1,35 @@ -{ +{ "solution": { "path": "..\\..\\AspNetCore.sln", - "projects" : [ - "src\\Security\\CookiePolicy\\src\\Microsoft.AspNetCore.CookiePolicy.csproj", - "src\\Security\\CookiePolicy\\test\\Microsoft.AspNetCore.CookiePolicy.Test.csproj", - "src\\Security\\CookiePolicy\\samples\\CookiePolicySample\\CookiePolicySample.csproj", - "src\\Security\\Authorization\\Core\\src\\Microsoft.AspNetCore.Authorization.csproj", - "src\\Security\\Authorization\\Policy\\src\\Microsoft.AspNetCore.Authorization.Policy.csproj", - "src\\Security\\Authorization\\test\\Microsoft.AspNetCore.Authorization.Test.csproj", - "src\\Security\\Authentication\\test\\Microsoft.AspNetCore.Authentication.Test.csproj", - "src\\Security\\Authentication\\samples\\SocialSample\\SocialSample.csproj", + "projects": [ + "src\\DataProtection\\Abstractions\\src\\Microsoft.AspNetCore.DataProtection.Abstractions.csproj", + "src\\DataProtection\\Cryptography.Internal\\src\\Microsoft.AspNetCore.Cryptography.Internal.csproj", + "src\\DataProtection\\DataProtection\\src\\Microsoft.AspNetCore.DataProtection.csproj", + "src\\DefaultBuilder\\src\\Microsoft.AspNetCore.csproj", + "src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj", + "src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj", + "src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", + "src\\Hosting\\TestHost\\src\\Microsoft.AspNetCore.TestHost.csproj", + "src\\Http\\Authentication.Abstractions\\src\\Microsoft.AspNetCore.Authentication.Abstractions.csproj", + "src\\Http\\Authentication.Core\\src\\Microsoft.AspNetCore.Authentication.Core.csproj", + "src\\Http\\Headers\\src\\Microsoft.Net.Http.Headers.csproj", + "src\\Http\\Http.Abstractions\\src\\Microsoft.AspNetCore.Http.Abstractions.csproj", + "src\\Http\\Http.Extensions\\src\\Microsoft.AspNetCore.Http.Extensions.csproj", + "src\\Http\\Http.Features\\src\\Microsoft.AspNetCore.Http.Features.csproj", + "src\\Http\\Http\\src\\Microsoft.AspNetCore.Http.csproj", + "src\\Http\\Metadata\\src\\Microsoft.AspNetCore.Metadata.csproj", + "src\\Http\\Routing.Abstractions\\src\\Microsoft.AspNetCore.Routing.Abstractions.csproj", + "src\\Http\\Routing\\src\\Microsoft.AspNetCore.Routing.csproj", + "src\\Http\\WebUtilities\\src\\Microsoft.AspNetCore.WebUtilities.csproj", + "src\\Middleware\\Diagnostics.Abstractions\\src\\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj", + "src\\Middleware\\Diagnostics\\src\\Microsoft.AspNetCore.Diagnostics.csproj", + "src\\Middleware\\HostFiltering\\src\\Microsoft.AspNetCore.HostFiltering.csproj", + "src\\Middleware\\HttpOverrides\\src\\Microsoft.AspNetCore.HttpOverrides.csproj", + "src\\Middleware\\StaticFiles\\src\\Microsoft.AspNetCore.StaticFiles.csproj", + "src\\ObjectPool\\src\\Microsoft.Extensions.ObjectPool.csproj", + "src\\Security\\Authentication\\Certificate\\samples\\Certificate.Optional.Sample\\Certificate.Optional.Sample.csproj", + "src\\Security\\Authentication\\Certificate\\samples\\Certificate.Sample\\Certificate.Sample.csproj", + "src\\Security\\Authentication\\Certificate\\src\\Microsoft.AspNetCore.Authentication.Certificate.csproj", "src\\Security\\Authentication\\Cookies\\samples\\CookieSample\\CookieSample.csproj", "src\\Security\\Authentication\\Cookies\\samples\\CookieSessionSample\\CookieSessionSample.csproj", "src\\Security\\Authentication\\Cookies\\src\\Microsoft.AspNetCore.Authentication.Cookies.csproj", @@ -19,6 +39,10 @@ "src\\Security\\Authentication\\JwtBearer\\samples\\JwtBearerSample\\JwtBearerSample.csproj", "src\\Security\\Authentication\\JwtBearer\\src\\Microsoft.AspNetCore.Authentication.JwtBearer.csproj", "src\\Security\\Authentication\\MicrosoftAccount\\src\\Microsoft.AspNetCore.Authentication.MicrosoftAccount.csproj", + "src\\Security\\Authentication\\Negotiate\\Samples\\NegotiateAuthSample\\NegotiateAuthSample.csproj", + "src\\Security\\Authentication\\Negotiate\\src\\Microsoft.AspNetCore.Authentication.Negotiate.csproj", + "src\\Security\\Authentication\\Negotiate\\test\\Negotiate.FunctionalTest\\Microsoft.AspNetCore.Authentication.Negotiate.FunctionalTest.csproj", + "src\\Security\\Authentication\\Negotiate\\test\\Negotiate.Test\\Microsoft.AspNetCore.Authentication.Negotiate.Test.csproj", "src\\Security\\Authentication\\OAuth\\src\\Microsoft.AspNetCore.Authentication.OAuth.csproj", "src\\Security\\Authentication\\OpenIdConnect\\samples\\OpenIdConnect.AzureAdSample\\OpenIdConnect.AzureAdSample.csproj", "src\\Security\\Authentication\\OpenIdConnect\\samples\\OpenIdConnectSample\\OpenIdConnectSample.csproj", @@ -26,47 +50,23 @@ "src\\Security\\Authentication\\Twitter\\src\\Microsoft.AspNetCore.Authentication.Twitter.csproj", "src\\Security\\Authentication\\WsFederation\\samples\\WsFedSample\\WsFedSample.csproj", "src\\Security\\Authentication\\WsFederation\\src\\Microsoft.AspNetCore.Authentication.WsFederation.csproj", - "src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj", - "src\\Hosting\\TestHost\\src\\Microsoft.AspNetCore.TestHost.csproj", - "src\\Http\\Http\\src\\Microsoft.AspNetCore.Http.csproj", - "src\\Middleware\\Diagnostics\\src\\Microsoft.AspNetCore.Diagnostics.csproj", - "src\\Middleware\\StaticFiles\\src\\Microsoft.AspNetCore.StaticFiles.csproj", - "src\\Servers\\Kestrel\\Kestrel\\src\\Microsoft.AspNetCore.Server.Kestrel.csproj", + "src\\Security\\Authentication\\samples\\SocialSample\\SocialSample.csproj", + "src\\Security\\Authentication\\test\\Microsoft.AspNetCore.Authentication.Test.csproj", + "src\\Security\\Authorization\\Core\\src\\Microsoft.AspNetCore.Authorization.csproj", + "src\\Security\\Authorization\\Policy\\src\\Microsoft.AspNetCore.Authorization.Policy.csproj", + "src\\Security\\Authorization\\test\\Microsoft.AspNetCore.Authorization.Test.csproj", + "src\\Security\\CookiePolicy\\samples\\CookiePolicySample\\CookiePolicySample.csproj", + "src\\Security\\CookiePolicy\\src\\Microsoft.AspNetCore.CookiePolicy.csproj", + "src\\Security\\CookiePolicy\\test\\Microsoft.AspNetCore.CookiePolicy.Test.csproj", "src\\Security\\benchmarks\\Microsoft.AspNetCore.Security.Performance\\Microsoft.AspNetCore.Security.Performance.csproj", - "src\\DataProtection\\Abstractions\\src\\Microsoft.AspNetCore.DataProtection.Abstractions.csproj", - "src\\DataProtection\\DataProtection\\src\\Microsoft.AspNetCore.DataProtection.csproj", - "src\\DataProtection\\Cryptography.Internal\\src\\Microsoft.AspNetCore.Cryptography.Internal.csproj", - "src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj", - "src\\Hosting\\Server.Abstractions\\src\\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", - "src\\Http\\Authentication.Core\\src\\Microsoft.AspNetCore.Authentication.Core.csproj", - "src\\Http\\Authentication.Abstractions\\src\\Microsoft.AspNetCore.Authentication.Abstractions.csproj", - "src\\Http\\Http.Abstractions\\src\\Microsoft.AspNetCore.Http.Abstractions.csproj", - "src\\Http\\Http.Extensions\\src\\Microsoft.AspNetCore.Http.Extensions.csproj", - "src\\Http\\Http.Features\\src\\Microsoft.AspNetCore.Http.Features.csproj", - "src\\Http\\Headers\\src\\Microsoft.Net.Http.Headers.csproj", - "src\\Servers\\Kestrel\\Core\\src\\Microsoft.AspNetCore.Server.Kestrel.Core.csproj", - "src\\Servers\\Kestrel\\Transport.Sockets\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj", "src\\Servers\\Connections.Abstractions\\src\\Microsoft.AspNetCore.Connections.Abstractions.csproj", - "src\\Middleware\\HttpOverrides\\src\\Microsoft.AspNetCore.HttpOverrides.csproj", - "src\\Http\\WebUtilities\\src\\Microsoft.AspNetCore.WebUtilities.csproj", - "src\\Middleware\\Diagnostics.Abstractions\\src\\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj", - "src\\Http\\Routing\\src\\Microsoft.AspNetCore.Routing.csproj", - "src\\Http\\Routing.Abstractions\\src\\Microsoft.AspNetCore.Routing.Abstractions.csproj", + "src\\Servers\\HttpSys\\src\\Microsoft.AspNetCore.Server.HttpSys.csproj", "src\\Servers\\IIS\\IISIntegration\\src\\Microsoft.AspNetCore.Server.IISIntegration.csproj", - "src\\Security\\Authentication\\Negotiate\\Samples\\NegotiateAuthSample\\NegotiateAuthSample.csproj", - "src\\Security\\Authentication\\Negotiate\\src\\Microsoft.AspNetCore.Authentication.Negotiate.csproj", - "src\\Security\\Authentication\\Negotiate\\test\\Negotiate.Test\\Microsoft.AspNetCore.Authentication.Negotiate.Test.csproj", - "src\\Security\\Authentication\\Negotiate\\test\\Negotiate.FunctionalTest\\Microsoft.AspNetCore.Authentication.Negotiate.FunctionalTest.csproj", - "src\\Security\\Authentication\\Negotiate\\test\\testassets\\Negotiate.Client\\Negotiate.Client.csproj", - "src\\Security\\Authentication\\Negotiate\\test\\testassets\\Negotiate.Server\\Negotiate.Server.csproj", - "src\\Security\\Authentication\\Certificate\\src\\Microsoft.AspNetCore.Authentication.Certificate.csproj", - "src\\Security\\Authentication\\Certificate\\samples\\Certificate.Sample\\Certificate.Sample.csproj", - "src\\Http\\Metadata\\src\\Microsoft.AspNetCore.Metadata.csproj", - "src\\DefaultBuilder\\src\\Microsoft.AspNetCore.csproj", - "src\\Middleware\\HostFiltering\\src\\Microsoft.AspNetCore.HostFiltering.csproj", "src\\Servers\\IIS\\IIS\\src\\Microsoft.AspNetCore.Server.IIS.csproj", - "src\\Servers\\HttpSys\\src\\Microsoft.AspNetCore.Server.HttpSys.csproj", - "src\\Security\\Authentication\\Certificate\\samples\\Certificate.Optional.Sample\\Certificate.Optional.Sample.csproj" + "src\\Servers\\Kestrel\\Core\\src\\Microsoft.AspNetCore.Server.Kestrel.Core.csproj", + "src\\Servers\\Kestrel\\Kestrel\\src\\Microsoft.AspNetCore.Server.Kestrel.csproj", + "src\\Servers\\Kestrel\\Transport.Sockets\\src\\Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.csproj", + "src\\WebEncoders\\src\\Microsoft.Extensions.WebEncoders.csproj" ] } -} +} \ No newline at end of file From f33937f04d3c6549710be87a1ae6fd3d8a2524c6 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 26 Aug 2020 12:04:14 -0700 Subject: [PATCH 02/25] With unicode --- src/Security/Authentication/test/CookieTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Security/Authentication/test/CookieTests.cs b/src/Security/Authentication/test/CookieTests.cs index ff368b283d50..41d70c1be658 100644 --- a/src/Security/Authentication/test/CookieTests.cs +++ b/src/Security/Authentication/test/CookieTests.cs @@ -154,14 +154,15 @@ public async Task SignInCausesDefaultCookieToBeCreated() [Fact] public async Task CustomAuthSchemeEncodesCookieName() { - using var host = await CreateHostWithServices(s => s.AddAuthentication("With Spaces").AddCookie("With Spaces", o => + var schemeName = "With spaces and 界"; + using var host = await CreateHostWithServices(s => s.AddAuthentication(schemeName).AddCookie(schemeName, o => { o.LoginPath = new PathString("/login"); }), context => { var user = new ClaimsIdentity(new GenericIdentity("Alice", "Cookies")); user.AddClaim(new Claim("marker", "true")); - return context.SignInAsync("With Spaces", + return context.SignInAsync(schemeName, new ClaimsPrincipal(user), new AuthenticationProperties()); }); @@ -170,7 +171,7 @@ public async Task CustomAuthSchemeEncodesCookieName() var transaction = await SendAsync(server, "http://example.com/testpath"); var setCookie = transaction.SetCookie; - Assert.StartsWith(".AspNetCore.With%20Spaces=", setCookie); + Assert.StartsWith(".AspNetCore.With%20spaces%20and%20%E7%95%8C=", setCookie); Assert.Contains("; path=/", setCookie); Assert.Contains("; httponly", setCookie); Assert.Contains("; samesite=", setCookie); From 5ed38b7eebd2ac9c723b2292513b537d3feb66ac Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 26 Aug 2020 14:19:07 -0700 Subject: [PATCH 03/25] Remove NodeServices + SpaServices Follow up to https://github.com/dotnet/aspnetcore/pull/24912. Not shipping NodeServices isn't enough since it's referenced by SpaServices. This PR removes the two packages that were announced to be removed in 5.0 --- eng/ProjectReferences.props | 2 - src/Middleware/NodeServices/README.md | 340 -- .../Controllers/HomeController.cs | 47 - .../Node/prerenderPage.js | 14 - .../NodeServicesExamples/Node/renderChart.js | 8 - .../Node/transpilation.js | 12 - .../NodeServicesExamples.csproj | 24 - .../Properties/launchSettings.json | 25 - .../samples/NodeServicesExamples/Startup.cs | 83 - .../Views/Home/Chart.cshtml | 12 - .../Views/Home/ES2015Transpilation.cshtml | 16 - .../Views/Home/Index.cshtml | 13 - .../Views/Home/Prerendering.cshtml | 21 - .../Views/Shared/Error.cshtml | 6 - .../Views/Shared/_Layout.cshtml | 12 - .../Views/_ViewImports.cshtml | 2 - .../Views/_ViewStart.cshtml | 3 - .../NodeServicesExamples/appsettings.json | 1 - .../NodeServicesExamples/jsconfig.json | 6 - .../samples/NodeServicesExamples/package.json | 10 - .../wwwroot/css/chartist.min.css | 1 - .../NodeServicesExamples/wwwroot/favicon.ico | Bin 32038 -> 0 bytes .../NodeServicesExamples/wwwroot/js/main.js | 7 - .../NodeServicesExamples/wwwroot/web.config | 9 - .../src/Configuration/NodeServicesFactory.cs | 30 - .../src/Configuration/NodeServicesOptions.cs | 118 - ...NodeServicesServiceCollectionExtensions.cs | 47 - .../src/Content/Node/entrypoint-http.js | 416 --- .../src/HostingModels/HttpNodeInstance.cs | 161 - .../src/HostingModels/INodeInstance.cs | 27 - .../HostingModels/NodeInvocationException.cs | 59 - .../src/HostingModels/NodeInvocationInfo.cs | 30 - .../NodeServicesOptionsExtensions.cs | 24 - .../HostingModels/OutOfProcessNodeInstance.cs | 479 --- .../NodeServices/src/INodeServices.cs | 58 - .../Microsoft.AspNetCore.NodeServices.csproj | 32 - .../NodeServices/src/NodeServicesImpl.cs | 169 - .../TypeScript/HttpNodeInstanceEntryPoint.ts | 97 - .../src/TypeScript/Util/ArgsUtil.ts | 18 - .../TypeScript/Util/ExitWhenParentExits.ts | 81 - .../src/TypeScript/Util/OverrideStdOutputs.ts | 37 - .../Util/PatchModuleResolutionLStat.ts | 48 - .../NodeServices/src/TypeScript/tsconfig.json | 11 - .../src/Util/EmbeddedResourceReader.cs | 35 - .../NodeServices/src/Util/StringAsTempFile.cs | 86 - .../NodeServices/src/Util/TaskExtensions.cs | 37 - src/Middleware/NodeServices/src/package.json | 20 - .../NodeServices/src/webpack.config.js | 24 - src/Middleware/NodeServices/src/yarn.lock | 2962 ----------------- ...osoft.AspNetCore.NodeServices.Tests.csproj | 14 - .../NodeServices/test/NodeServicesTest.cs | 138 - .../test/js/moduleWithDefaultExport.js | 3 - .../NodeServices/test/js/testCases.js | 28 - ...t.AspNetCore.SpaServices.Extensions.csproj | 1 - .../Prerendering/SpaPrerenderingExtensions.cs | 272 -- src/Middleware/SpaServices/README.md | 821 ----- .../src/Content/Node/prerenderer.js | 224 -- .../Content/Node/webpack-dev-middleware.js | 133 - .../Microsoft.AspNetCore.SpaServices.csproj | 34 - .../src/Prerendering/DefaultSpaPrerenderer.cs | 55 - .../src/Prerendering/ISpaPrerenderer.cs | 33 - .../Prerendering/JavaScriptModuleExport.cs | 34 - .../src/Prerendering/PrerenderTagHelper.cs | 132 - .../src/Prerendering/Prerenderer.cs | 109 - ...PrerenderingServiceCollectionExtensions.cs | 27 - .../src/Prerendering/RenderToStringResult.cs | 70 - .../src/Routing/SpaRouteConstraint.cs | 41 - .../src/Routing/SpaRouteExtensions.cs | 98 - .../SpaServices/src/TypeScript/Prerenderer.ts | 113 - .../src/TypeScript/WebpackDevMiddleware.ts | 20 - .../SpaServices/src/TypeScript/tsconfig.json | 12 - .../src/Webpack/ConditionalProxyMiddleware.cs | 126 - .../ConditionalProxyMiddlewareOptions.cs | 24 - .../src/Webpack/WebpackDevMiddleware.cs | 153 - .../Webpack/WebpackDevMiddlewareOptions.cs | 66 - .../src/npm/aspnet-angular/.gitignore | 5 - .../src/npm/aspnet-angular/.npmignore | 3 - .../src/npm/aspnet-angular/LICENSE.txt | 12 - .../src/npm/aspnet-angular/package.json | 33 - .../src/HttpWithStateTransfer.ts | 94 - .../src/npm/aspnet-angular/src/index.ts | 1 - .../src/npm/aspnet-angular/tsconfig.json | 20 - .../src/npm/aspnet-prerendering/.gitignore | 8 - .../src/npm/aspnet-prerendering/.npmignore | 4 - .../src/npm/aspnet-prerendering/LICENSE.txt | 12 - .../src/npm/aspnet-prerendering/README.md | 6 - .../src/npm/aspnet-prerendering/package.json | 27 - .../aspnet-prerendering/src/Prerendering.ts | 112 - .../src/PrerenderingInterfaces.ts | 39 - .../src/npm/aspnet-prerendering/src/index.ts | 2 - .../src/npm/aspnet-prerendering/tsconfig.json | 16 - .../src/npm/aspnet-webpack-react/.gitignore | 3 - .../src/npm/aspnet-webpack-react/.npmignore | 3 - .../src/npm/aspnet-webpack-react/LICENSE.txt | 12 - .../src/npm/aspnet-webpack-react/README.md | 11 - .../src/npm/aspnet-webpack-react/package.json | 28 - .../src/HotModuleReplacement.ts | 53 - .../src/npm/aspnet-webpack-react/src/index.ts | 6 - .../npm/aspnet-webpack-react/tsconfig.json | 16 - .../src/npm/aspnet-webpack/.gitignore | 3 - .../src/npm/aspnet-webpack/.npmignore | 3 - .../src/npm/aspnet-webpack/LICENSE.txt | 12 - .../src/npm/aspnet-webpack/README.md | 6 - .../src/npm/aspnet-webpack/package.json | 38 - .../npm/aspnet-webpack/src/LoadViaWebpack.ts | 146 - .../npm/aspnet-webpack/src/RequireNewCopy.ts | 22 - .../src/WebpackDevMiddleware.ts | 396 --- .../src/WebpackTestPermissions.ts | 58 - .../src/npm/aspnet-webpack/src/index.ts | 2 - .../aspnet-webpack/src/typings/memory-fs.d.ts | 3 - .../src/typings/require-from-string.d.ts | 3 - .../src/typings/webpack-node-externals.d.ts | 2 - .../src/npm/aspnet-webpack/tsconfig.json | 17 - .../src/npm/aspnet-webpack/yarn.lock | 2646 --------------- .../src/npm/domain-task/.gitignore | 3 - .../src/npm/domain-task/.npmignore | 3 - .../src/npm/domain-task/LICENSE.txt | 12 - .../SpaServices/src/npm/domain-task/README.md | 1 - .../src/npm/domain-task/package.json | 29 - .../npm/domain-task/src/domain-context.d.ts | 9 - .../src/npm/domain-task/src/fetch.ts | 105 - .../src/npm/domain-task/src/index.ts | 3 - .../src/npm/domain-task/src/main.ts | 85 - .../src/npm/domain-task/tsconfig.json | 17 - src/Middleware/SpaServices/src/package.json | 20 - .../SpaServices/src/webpack.config.js | 31 - src/Middleware/SpaServices/src/yarn.lock | 2938 ---------------- ...rosoft.AspNetCore.SpaServices.Tests.csproj | 11 - .../test/RenderToStringResultTests.cs | 77 - 129 files changed, 15788 deletions(-) delete mode 100644 src/Middleware/NodeServices/README.md delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Controllers/HomeController.cs delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Node/prerenderPage.js delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Node/renderChart.js delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Node/transpilation.js delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/NodeServicesExamples.csproj delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Properties/launchSettings.json delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Startup.cs delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Chart.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/ES2015Transpilation.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Index.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/Error.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/_Layout.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewImports.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewStart.cshtml delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/appsettings.json delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/jsconfig.json delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/package.json delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/css/chartist.min.css delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/favicon.ico delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/js/main.js delete mode 100644 src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/web.config delete mode 100644 src/Middleware/NodeServices/src/Configuration/NodeServicesFactory.cs delete mode 100644 src/Middleware/NodeServices/src/Configuration/NodeServicesOptions.cs delete mode 100644 src/Middleware/NodeServices/src/Configuration/NodeServicesServiceCollectionExtensions.cs delete mode 100644 src/Middleware/NodeServices/src/Content/Node/entrypoint-http.js delete mode 100644 src/Middleware/NodeServices/src/HostingModels/HttpNodeInstance.cs delete mode 100644 src/Middleware/NodeServices/src/HostingModels/INodeInstance.cs delete mode 100644 src/Middleware/NodeServices/src/HostingModels/NodeInvocationException.cs delete mode 100644 src/Middleware/NodeServices/src/HostingModels/NodeInvocationInfo.cs delete mode 100644 src/Middleware/NodeServices/src/HostingModels/NodeServicesOptionsExtensions.cs delete mode 100644 src/Middleware/NodeServices/src/HostingModels/OutOfProcessNodeInstance.cs delete mode 100644 src/Middleware/NodeServices/src/INodeServices.cs delete mode 100644 src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj delete mode 100644 src/Middleware/NodeServices/src/NodeServicesImpl.cs delete mode 100644 src/Middleware/NodeServices/src/TypeScript/HttpNodeInstanceEntryPoint.ts delete mode 100644 src/Middleware/NodeServices/src/TypeScript/Util/ArgsUtil.ts delete mode 100644 src/Middleware/NodeServices/src/TypeScript/Util/ExitWhenParentExits.ts delete mode 100644 src/Middleware/NodeServices/src/TypeScript/Util/OverrideStdOutputs.ts delete mode 100644 src/Middleware/NodeServices/src/TypeScript/Util/PatchModuleResolutionLStat.ts delete mode 100644 src/Middleware/NodeServices/src/TypeScript/tsconfig.json delete mode 100644 src/Middleware/NodeServices/src/Util/EmbeddedResourceReader.cs delete mode 100644 src/Middleware/NodeServices/src/Util/StringAsTempFile.cs delete mode 100644 src/Middleware/NodeServices/src/Util/TaskExtensions.cs delete mode 100644 src/Middleware/NodeServices/src/package.json delete mode 100644 src/Middleware/NodeServices/src/webpack.config.js delete mode 100644 src/Middleware/NodeServices/src/yarn.lock delete mode 100644 src/Middleware/NodeServices/test/Microsoft.AspNetCore.NodeServices.Tests.csproj delete mode 100644 src/Middleware/NodeServices/test/NodeServicesTest.cs delete mode 100644 src/Middleware/NodeServices/test/js/moduleWithDefaultExport.js delete mode 100644 src/Middleware/NodeServices/test/js/testCases.js delete mode 100644 src/Middleware/SpaServices.Extensions/src/Prerendering/SpaPrerenderingExtensions.cs delete mode 100644 src/Middleware/SpaServices/README.md delete mode 100644 src/Middleware/SpaServices/src/Content/Node/prerenderer.js delete mode 100644 src/Middleware/SpaServices/src/Content/Node/webpack-dev-middleware.js delete mode 100644 src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj delete mode 100644 src/Middleware/SpaServices/src/Prerendering/DefaultSpaPrerenderer.cs delete mode 100644 src/Middleware/SpaServices/src/Prerendering/ISpaPrerenderer.cs delete mode 100644 src/Middleware/SpaServices/src/Prerendering/JavaScriptModuleExport.cs delete mode 100644 src/Middleware/SpaServices/src/Prerendering/PrerenderTagHelper.cs delete mode 100644 src/Middleware/SpaServices/src/Prerendering/Prerenderer.cs delete mode 100644 src/Middleware/SpaServices/src/Prerendering/PrerenderingServiceCollectionExtensions.cs delete mode 100644 src/Middleware/SpaServices/src/Prerendering/RenderToStringResult.cs delete mode 100644 src/Middleware/SpaServices/src/Routing/SpaRouteConstraint.cs delete mode 100644 src/Middleware/SpaServices/src/Routing/SpaRouteExtensions.cs delete mode 100644 src/Middleware/SpaServices/src/TypeScript/Prerenderer.ts delete mode 100644 src/Middleware/SpaServices/src/TypeScript/WebpackDevMiddleware.ts delete mode 100644 src/Middleware/SpaServices/src/TypeScript/tsconfig.json delete mode 100644 src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddleware.cs delete mode 100644 src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddlewareOptions.cs delete mode 100644 src/Middleware/SpaServices/src/Webpack/WebpackDevMiddleware.cs delete mode 100644 src/Middleware/SpaServices/src/Webpack/WebpackDevMiddlewareOptions.cs delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/.gitignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/.npmignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/LICENSE.txt delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/package.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/src/HttpWithStateTransfer.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/src/index.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-angular/tsconfig.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/.gitignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/.npmignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/LICENSE.txt delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/README.md delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/package.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/Prerendering.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/PrerenderingInterfaces.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/index.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-prerendering/tsconfig.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.gitignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.npmignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/LICENSE.txt delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/README.md delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/package.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/HotModuleReplacement.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/index.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack-react/tsconfig.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/.gitignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/.npmignore delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/LICENSE.txt delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/README.md delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/package.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/LoadViaWebpack.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/RequireNewCopy.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackDevMiddleware.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackTestPermissions.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/index.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/memory-fs.d.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/require-from-string.d.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/webpack-node-externals.d.ts delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/tsconfig.json delete mode 100644 src/Middleware/SpaServices/src/npm/aspnet-webpack/yarn.lock delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/.gitignore delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/.npmignore delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/LICENSE.txt delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/README.md delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/package.json delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/src/domain-context.d.ts delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/src/fetch.ts delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/src/index.ts delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/src/main.ts delete mode 100644 src/Middleware/SpaServices/src/npm/domain-task/tsconfig.json delete mode 100644 src/Middleware/SpaServices/src/package.json delete mode 100644 src/Middleware/SpaServices/src/webpack.config.js delete mode 100644 src/Middleware/SpaServices/src/yarn.lock delete mode 100644 src/Middleware/SpaServices/test/Microsoft.AspNetCore.SpaServices.Tests.csproj delete mode 100644 src/Middleware/SpaServices/test/RenderToStringResultTests.cs diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index 96983d78afe3..43a998225972 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -86,14 +86,12 @@ - - diff --git a/src/Middleware/NodeServices/README.md b/src/Middleware/NodeServices/README.md deleted file mode 100644 index 8f9b07289985..000000000000 --- a/src/Middleware/NodeServices/README.md +++ /dev/null @@ -1,340 +0,0 @@ -# Microsoft.AspNetCore.NodeServices - -This NuGet package provides a fast and robust way to invoke Node.js code from a .NET application (typically ASP.NET Core web apps). You can use this whenever you want to use Node/NPM-supplied functionality at runtime in ASP.NET. For example, - - * Executing arbitrary JavaScript - * Runtime integration with JavaScript build or packaging tools, e.g., transpiling code via Babel - * Using of NPM modules for image resizing, audio compression, language recognition, etc. - * Calling third-party services that supply Node-based APIs but don't yet ship native .NET ones - -It is the underlying mechanism supporting the following packages: - - * [`Microsoft.AspNetCore.SpaServices`](/src/Middleware/SpaServices/) - builds on NodeServices, adding functionality commonly used in Single Page Applications, such as server-side prerendering, webpack middleware, and integration between server-side and client-side routing. - -### Requirements - -* [Node.js](https://nodejs.org/en/) - * To test this is installed and can be found, run `node -v` on a command line - * Note: If you're deploying to an Azure web site, you don't need to do anything here - Node is already installed and available in the server environments -* [.NET](https://dot.net) - * For .NET Core (e.g., ASP.NET Core apps), you need at least 1.0 RC2 - * For .NET Framework, you need at least version 4.5.1. - -### Installation - -For .NET Core apps: - - * Add `Microsoft.AspNetCore.NodeServices` to the dependencies list in your `project.json` file - * Run `dotnet restore` (or if you use Visual Studio, just wait a moment - it will restore dependencies automatically) - -For .NET Framework apps: - - * `nuget install Microsoft.AspNetCore.NodeServices` - -### Do you just want to build an ASP.NET Core app with Angular / React / Knockout / etc.? - -In that case, you don't need to use NodeServices directly (or install it manually). You can either: - -* **Recommended:** Use the `aspnetcore-spa` Yeoman generator to get a ready-to-go starting point using your choice of client-side framework. [Instructions here.](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/) -* Or set up your ASP.NET Core and client-side Angular/React/KO/etc. app manually, and then use the [`Microsoft.AspNetCore.SpaServices`](/src/Middleware/SpaServices/) package to add features like server-side prerendering or Webpack middleware. But really, at least try using the `aspnetcore-spa` generator first. - -# Simple usage example - -## For ASP.NET Core apps - -.NET Core has a built-in dependency injection (DI) system. NodeServices is designed to work with this, so you don't have to manage the creation or disposal of instances. - -Enable NodeServices in your application by first adding the following to your `ConfigureServices` method in `Startup.cs`: - -```csharp -public void ConfigureServices(IServiceCollection services) -{ - // ... all your existing configuration is here ... - - // Enable Node Services - services.AddNodeServices(); -} -``` - -Now you can receive an instance of `NodeServices` as an action method parameter to any MVC action, and then use it to make calls into Node.js code, e.g.: - -```csharp -public async Task MyAction([FromServices] INodeServices nodeServices) -{ - var result = await nodeServices.InvokeAsync("./addNumbers", 1, 2); - return Content("1 + 2 = " + result); -} -``` - -Of course, you also need to supply the Node.js code you want to invoke. Create a file called `addNumbers.js` at the root of your ASP.NET Core application, and add the following code: - -```javascript -module.exports = function (callback, first, second) { - var result = first + second; - callback(/* error */ null, result); -}; -``` - -As you can see, the exported JavaScript function will receive the arguments you pass from .NET (as long as they are JSON-serializable), along with a Node-style callback you can use to send back a result or error when you are ready. - -When the `InvokeAsync` method receives the result back from Node, the result will be JSON-deserialized to whatever generic type you specified when calling `InvokeAsync` (e.g., above, that type is `int`). If `InvokeAsync` receives an error from your Node code, it will throw an exception describing that error. - -If you want to put `addNumber.js` inside a subfolder rather than the root of your app, then also amend the path in the `_nodeServices.Invoke` call to match that path. - -## For non-ASP.NET apps - -In other types of .NET Core app, where you don't have ASP.NET supplying an `IServiceCollection` to you, you'll need to instantiate your own DI container. For example, add a reference to the .NET package `Microsoft.Extensions.DependencyInjection`, and then you can construct an `IServiceCollection`, then register NodeServices as usual: - -```csharp -var services = new ServiceCollection(); -services.AddNodeServices(options => { - // Set any properties that you want on 'options' here -}); -``` - -Now you can ask it to supply the shared `INodeServices` instance: - -```csharp -var serviceProvider = services.BuildServiceProvider(); -var nodeServices = serviceProvider.GetRequiredService(); -``` - -Or, if you want to obtain a separate (non-shared) `INodeServices` instance: - -```csharp -var options = new NodeServicesOptions(serviceProvider) { /* Assign/override any other options here */ }; -var nodeServices = NodeServicesFactory.CreateNodeServices(options); -``` - -Besides this, the usage is the same as described for ASP.NET above, so you can now call `nodeServices.InvokeAsync(...)` etc. - -You can dispose the `nodeServices` object whenever you are done with it (and it will shut down the associated Node.js instance), but because these instances are expensive to create, you should whenever possible retain and reuse instances. Don't dispose the shared instance returned from `serviceProvider.GetRequiredService` (except perhaps if you know your application is shutting down, although .NET's finalizers will dispose it anyway if the shutdown is graceful). - -NodeServices instances are thread-safe - you can call `InvokeAsync` simultaneously from multiple threads. Also, they are smart enough to detect if the associated Node instance has died and will automatically start a new Node instance if needed. - -# API Reference - -### AddNodeServices - -**Signatures:** - -```csharp -AddNodeServices() -AddNodeServices(Action setupAction) -``` - -This is an extension method on `IServiceCollection`. It registers NodeServices with ASP.NET Core's DI system. Typically you should call this from the `ConfigureServices` method in your `Startup.cs` file. - -To access this extension method, you'll need to add the following namespace import to the top of your file, if it isn't already there: - -```csharp -using Microsoft.Extensions.DependencyInjection; -``` - -**Examples** - -Using default options: - -```csharp -services.AddNodeServices(); -``` - -Or, specifying options: - -```csharp -services.AddNodeServices(options => -{ - options.WatchFileExtensions = new[] { ".coffee", ".sass" }; - // ... etc. - see other properties below -}); -``` - -**Parameters** - - * `setupAction` - type: `Action` - * Optional. If not specified, defaults will be used. - * Properties on `NodeServicesOptions`: - * `HostingModel` - an `NodeHostingModel` enum value. See: [hosting models](#hosting-models) - * `ProjectPath` - if specified, controls the working directory used when launching Node instances. This affects, for example, the location that `require` statements resolve relative paths against. If not specified, your application root directory is used. - * `WatchFileExtensions` - if specified, the launched Node instance will watch for changes to any files with these extensions, and auto-restarts when any are changed. The default array includes `.js`, `.jsx`, `.ts`, `.tsx`, `.json`, and `.html`. - -**Return type**: None. But once you've done this, you can get `NodeServices` instances out of ASP.NET's DI system. Typically it will be a singleton instance. - -### CreateNodeServices - -**Signature:** - -```csharp -CreateNodeServices(NodeServicesOptions options) -``` - -Supplies a new (non-shared) instance of `NodeServices`. - -**Example** - -```csharp -var options = new NodeServicesOptions(serviceProvider); // Obtains default options from DI config -var nodeServices = NodeServicesFactory.CreateNodeServices(options); -``` - -**Parameters** - * `options` - type: `NodeServicesOptions`. - * Configures the returned `NodeServices` instance. - * Properties: - * `HostingModel` - an `NodeHostingModel` enum value. See: [hosting models](#hosting-models) - * `ProjectPath` - if specified, controls the working directory used when launching Node instances. This affects, for example, the location that `require` statements resolve relative paths against. If not specified, your application root directory is used. - * `WatchFileExtensions` - if specified, the launched Node instance will watch for changes to any files with these extension, and auto-restarts when any are changed. - -**Return type:** `NodeServices` - -If you create a `NodeServices` instance this way, you can also dispose it (call `nodeServiceInstance.Dispose();`) and it will shut down the associated Node instance. But because these instances are expensive to create, you should whenever possible retain and reuse your `NodeServices` object. They are thread-safe - you can call `nodeServiceInstance.InvokeAsync(...)` simultaneously from multiple threads. - -### InvokeAsync<T> - -**Signature:** - -```csharp -InvokeAsync(string moduleName, params object[] args) -``` - -Asynchronously calls a JavaScript function and returns the result, or throws an exception if the result was an error. - -**Example 1: Getting a JSON-serializable object from Node (the most common use case)** - -```csharp -var result = await myNodeServicesInstance.InvokeAsync( - "./Node/transpile", - pathOfSomeFileToBeTranspiled); -``` - -... where `TranspilerResult` might be defined as follows: - -```csharp -public class TranspilerResult -{ - public string Code { get; set; } - public string[] Warnings { get; set; } -} -``` - -... and the corresponding JavaScript module (in `Node/transpile.js`) could be implemented as follows: - -```javascript -module.exports = function (callback, filePath) { - // Invoke some external transpiler (e.g., an NPM module) then: - callback(null, { - code: theTranspiledCodeAsAString, - warnings: someArrayOfStrings - }); -}; -``` - -**Example 2: Getting a stream of binary data from Node** - -```csharp -var imageStream = await myNodeServicesInstance.InvokeAsync( - "./Node/resizeImage", - fullImagePath, - width, - height); - -// In an MVC action method, you can pipe the result to the response as follows -return File(imageStream, someContentType); -``` - -... where the corresponding JavaScript module (in `Node/resizeImage.js`) could be implemented as follows: - -```javascript -var sharp = require('sharp'); // A popular image manipulation package on NPM - -module.exports = function(result, physicalPath, maxWidth, maxHeight) { - // Invoke the 'sharp' NPM module, and have it pipe the resulting image data back to .NET - sharp(physicalPath) - .resize(maxWidth || null, maxHeight || null) - .pipe(result.stream); -} -``` - -**Parameters** - -* `moduleName` - type: `string` - * The name of a JavaScript module that Node.js must be able to resolve by calling `require(moduleName)`. This can be a relative path such as `"./Some/Directory/mymodule"`. If you don't specify the `.js` filename extension, Node.js will infer it anyway. -* `params` - * Any set of JSON-serializable objects you want to pass to the exported JavaScript function - -**Return type:** `T`, which must be: - - * A JSON-serializable .NET type, if your JavaScript code uses the `callback(error, result)` pattern to return an object, as in example 1 above - * Or, the type `System.IO.Stream`, if your JavaScript code writes data to the `result.stream` object (which is a [Node `Duplex` stream](https://nodejs.org/api/stream.html#stream_class_stream_duplex)), as in example 2 above - -### InvokeExportAsync<T> - -**Signature** - -```csharp -InvokeExportAsync(string moduleName, string exportName, params object[] args) -``` - -This is exactly the same as `InvokeAsync`, except that it also takes an `exportName` parameter. You can use this if you want your JavaScript module to export more than one function. - -**Example** - -```csharp -var someString = await myNodeServicesInstance.InvokeExportAsync( - "./Node/myNodeApis", - "getMeAString"); - -var someStringInFrench = await myNodeServicesInstance.InvokeExportAsync( - "./Node/myNodeApis", - "convertLanguage" - someString, - "fr-FR"); -``` - -... where the corresponding JavaScript module (in `Node/myNodeApis.js`) could be implemented as follows: - -```javascript -module.exports = { - - getMeAString: function (callback) { - callback(null, 'Here is a string'); - }, - - convertLanguage: function (callback, sourceString, targetLanguage) { - // Implementation detail left as an exercise for the reader - doMachineTranslation(sourceString, targetLanguage, function(error, result) { - callback(error, result); - }); - } - -}; -``` - -**Parameters, return type, etc.** For all other details, see the docs for [`InvokeAsync`](#invokeasynct) - -## Hosting models - -NodeServices has a pluggable hosting/transport mechanism, because it is an abstraction over various possible ways to invoke Node.js from .NET. This allows more high-level facilities (e.g., for Angular prerendering) to be agnostic to the details of launching Node and communicating with it - those high-level facilities can just trust that *somehow* we can invoke code in Node for them. - -Using this abstraction, we could run Node inside the .NET process, in a separate process on the same machine, or even on a different machine altogether. At the time of writing, all the built-in hosting mechanisms work by launching Node as a separate process on the same machine as your .NET code. - -**What about Edge.js?** - -[Edge.js](http://tjanczuk.github.io/edge/#/) hosts Node.js inside a .NET process, or vice-versa, and lets you interoperate between the two. - -NodeServices is not meant to compete with Edge.js. Instead, NodeServices is an abstraction over all possible ways to invoke Node from .NET. Eventually we may offer an in-process Node hosting mechanism via Edge.js, without you needing to change your higher-level code. This can be done when Edge.js supports hosting Node in cross-platform .NET Core processes ([discussion](https://github.com/tjanczuk/edge/issues/279)). - -**What about VroomJS?** - -People have asked about using [VroomJS](https://github.com/fogzot/vroomjs) as a hosting mechanism. We don't currently plan to implement that, because Vroom only supplies a V8 runtime environment, not a complete Node environment. The difference is that, with a true Node environment, *all* NPM modules and Node code will work exactly as expected, whereas in a Vroom environment, code will only work if it doesn't use any Node primitives, which rules out large portions of the NPM landscape. - -### Custom hosting models - -If you implement a custom hosting model (by implementing `INodeInstance`), then you can cause it to be used by populating `NodeInstanceFactory` on your options: - -```csharp -services.AddNodeServices(options => -{ - options.NodeInstanceFactory = () => new MyCustomNodeInstance(); -}); -``` diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Controllers/HomeController.cs b/src/Middleware/NodeServices/samples/NodeServicesExamples/Controllers/HomeController.cs deleted file mode 100644 index b6cf86a9bd31..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Controllers/HomeController.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Threading.Tasks; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.NodeServices; - -namespace NodeServicesExamples.Controllers -{ - public class HomeController : Controller - { - public IActionResult Index(int pageIndex) - { - return View(); - } - - public IActionResult ES2015Transpilation() - { - return View(); - } - -#pragma warning disable 0618 - public async Task Chart([FromServices] INodeServices nodeServices) -#pragma warning restore 0618 - { - var options = new { width = 400, height = 200, showArea = true, showPoint = true, fullWidth = true }; - var data = new - { - labels = new[] { "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }, - series = new[] { - new[] { 1, 5, 2, 5, 4, 3 }, - new[] { 2, 3, 4, 8, 1, 2 }, - new[] { 5, 4, 3, 2, 1, 0 } - } - }; - - ViewData["ChartMarkup"] = await nodeServices.InvokeAsync("./Node/renderChart", "line", options, data); - - return View(); - } - - public IActionResult Error() - { - return View("~/Views/Shared/Error.cshtml"); - } - } -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/prerenderPage.js b/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/prerenderPage.js deleted file mode 100644 index 7912a6f3cbc1..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/prerenderPage.js +++ /dev/null @@ -1,14 +0,0 @@ -var createServerRenderer = require('aspnet-prerendering').createServerRenderer; - -module.exports = createServerRenderer(function(params) { - return new Promise(function (resolve, reject) { - var message = 'The HTML was returned by the prerendering boot function. ' - + 'The boot function received the following params:' - + '
' + JSON.stringify(params, null, 4) + '
'; - - resolve({ - html: '

Hello, world!

' + message, - globals: { sampleData: { nodeVersion: process.version } } - }); - }); -}); diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/renderChart.js b/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/renderChart.js deleted file mode 100644 index 370df7665401..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/renderChart.js +++ /dev/null @@ -1,8 +0,0 @@ -var generate = require('node-chartist'); - -module.exports = function (callback, type, options, data) { - generate(type, options, data).then( - result => callback(null, result), // Success case - error => callback(error) // Error case - ); -}; diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/transpilation.js b/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/transpilation.js deleted file mode 100644 index 86f605ac94c9..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Node/transpilation.js +++ /dev/null @@ -1,12 +0,0 @@ -var fs = require('fs'); -var babelCore = require('babel-core'); - -module.exports = function(cb, physicalPath, requestPath) { - var originalContents = fs.readFileSync(physicalPath); - var result = babelCore.transform(originalContents, { - presets: ['es2015'], - sourceMaps: 'inline', - sourceFileName: '/sourcemapped' + requestPath - }); - cb(null, result.code); -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/NodeServicesExamples.csproj b/src/Middleware/NodeServices/samples/NodeServicesExamples/NodeServicesExamples.csproj deleted file mode 100644 index 262b569d434b..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/NodeServicesExamples.csproj +++ /dev/null @@ -1,24 +0,0 @@ - - - - $(DefaultNetCoreTargetFramework) - true - - - - - - - - - - - - - - - - - - - diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Properties/launchSettings.json b/src/Middleware/NodeServices/samples/NodeServicesExamples/Properties/launchSettings.json deleted file mode 100644 index f2904dc8ae9f..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Properties/launchSettings.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:51463/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "dotnet cli": { - "commandName": "Project", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Startup.cs b/src/Middleware/NodeServices/samples/NodeServicesExamples/Startup.cs deleted file mode 100644 index 44e7411132f0..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Startup.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.NodeServices; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace NodeServicesExamples -{ - public class Startup - { -#pragma warning disable 0618 - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddMvc(); - - // Enable Node Services - services.AddNodeServices(); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env, INodeServices nodeServices) - { - app.UseDeveloperExceptionPage(); - - // Dynamically transpile any .js files under the '/js/' directory - app.Use(next => async context => - { - var requestPath = context.Request.Path.Value; - if (requestPath.StartsWith("/js/") && requestPath.EndsWith(".js")) - { - var fileInfo = env.WebRootFileProvider.GetFileInfo(requestPath); - if (fileInfo.Exists) - { - var transpiled = await nodeServices.InvokeAsync("./Node/transpilation.js", fileInfo.PhysicalPath, requestPath); - await context.Response.WriteAsync(transpiled); - return; - } - } - - // Not a JS file, or doesn't exist - let some other middleware handle it - await next.Invoke(context); - }); - - app.UseStaticFiles(); - app.UseRouting(); - - app.UseEndpoints(endpoints => - { - endpoints.MapDefaultControllerRoute(); - }); - } -#pragma warning restore 0618 - - public static Task Main(string[] args) - { - var host = new HostBuilder() - .ConfigureWebHost(webHostBuilder => - { - webHostBuilder - .ConfigureLogging(factory => - { - factory.AddConsole(); - factory.AddDebug(); - }) - .UseContentRoot(Directory.GetCurrentDirectory()) - .UseIISIntegration() - .UseKestrel() - .UseStartup(); - }).Build(); - - return host.RunAsync(); - } - } -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Chart.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Chart.cshtml deleted file mode 100644 index 6aed4a56648a..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Chart.cshtml +++ /dev/null @@ -1,12 +0,0 @@ -

Server-rendered chart

- -

- This sample demonstrates how arbitrary NPM modules can be invoked from .NET code. -

-

- In this case, we use node-chartist to render the following chart on the server. The output is - identical to what you'd get if you used chartist.js - on the client, except that in this example, we're not executing any client-side code at all. -

- -@Html.Raw(ViewData["ChartMarkup"]) diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/ES2015Transpilation.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/ES2015Transpilation.cshtml deleted file mode 100644 index 2e28cf67a0b2..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/ES2015Transpilation.cshtml +++ /dev/null @@ -1,16 +0,0 @@ -

ES2015 Transpilation

- -

- This sample demonstrates a way of intercepting requests for .js files and dynamically transpiling them - from ES2015 code to browser-compatible ES5 code using the Babel library. -

- -

- To see that it's working, open your browser's 'Debug' console and look for the log message. This is - produced by the file /js/main.js, which is transpiled from ES2015 dynamically - when requested. -

- -@section scripts { - -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Index.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Index.cshtml deleted file mode 100644 index a89900803f97..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Index.cshtml +++ /dev/null @@ -1,13 +0,0 @@ -

NodeServices examples

- -

- These examples demonstrate the direct use of the NodeServices package, independently of the usual SPA scenarios. - In general, NodeServices offers an efficient way to use Node-provided functionality (e.g., NPM modules) from inside - a .NET application. -

- - diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml deleted file mode 100644 index 3f21ef722ab2..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Home/Prerendering.cshtml +++ /dev/null @@ -1,21 +0,0 @@ -

Server-side prerendering

- -

- This sample demonstrates how you can invoke a JavaScript module that contains - prerendering logic for a Single-Page Application framework. -

-

- Your prerendering boot function will receive parameters that describe the page - being rendered and any data supplied by the .NET code. The return value should be - a promise that resolves with data to be injected into the page, such as the - rendered HTML and any global data that should be made available to client-side code. -

- -@Html.Raw(ViewData["PrerenderedHtml"]) - - - - diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/Error.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/Error.cshtml deleted file mode 100644 index 4852442680b6..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/Error.cshtml +++ /dev/null @@ -1,6 +0,0 @@ -@{ - ViewData["Title"] = "Error"; -} - -

Error.

-

An error occurred while processing your request.

diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/_Layout.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/_Layout.cshtml deleted file mode 100644 index 93314312ad9b..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/Shared/_Layout.cshtml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - NodeServices Examples - - - - @RenderBody() - @RenderSection("scripts", required: false) - - diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewImports.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewImports.cshtml deleted file mode 100644 index 3d98e6eaca21..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewImports.cshtml +++ /dev/null @@ -1,2 +0,0 @@ -@using NodeServicesExamples -@addTagHelper "*, Microsoft.AspNetCore.Mvc.TagHelpers" diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewStart.cshtml b/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewStart.cshtml deleted file mode 100644 index a5f10045db97..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/Views/_ViewStart.cshtml +++ /dev/null @@ -1,3 +0,0 @@ -@{ - Layout = "_Layout"; -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/appsettings.json b/src/Middleware/NodeServices/samples/NodeServicesExamples/appsettings.json deleted file mode 100644 index 0967ef424bce..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/appsettings.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/jsconfig.json b/src/Middleware/NodeServices/samples/NodeServicesExamples/jsconfig.json deleted file mode 100644 index 875bb90cd697..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/jsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "target": "ES6", - "module": "commonjs" - } -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/package.json b/src/Middleware/NodeServices/samples/NodeServicesExamples/package.json deleted file mode 100644 index 9787758bc4ee..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "nodeservicesexamples", - "version": "0.0.0", - "dependencies": { - "aspnet-prerendering": "^2.0.6", - "babel-core": "^6.7.4", - "babel-preset-es2015": "^6.6.0", - "node-chartist": "^1.0.2" - } -} diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/css/chartist.min.css b/src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/css/chartist.min.css deleted file mode 100644 index 9f9b908e719b..000000000000 --- a/src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/css/chartist.min.css +++ /dev/null @@ -1 +0,0 @@ -.ct-double-octave:after,.ct-major-eleventh:after,.ct-major-second:after,.ct-major-seventh:after,.ct-major-sixth:after,.ct-major-tenth:after,.ct-major-third:after,.ct-major-twelfth:after,.ct-minor-second:after,.ct-minor-seventh:after,.ct-minor-sixth:after,.ct-minor-third:after,.ct-octave:after,.ct-perfect-fifth:after,.ct-perfect-fourth:after,.ct-square:after{content:"";clear:both}.ct-label{fill:rgba(0,0,0,.4);color:rgba(0,0,0,.4);font-size:.75rem;line-height:1}.ct-grid-background,.ct-line{fill:none}.ct-chart-bar .ct-label,.ct-chart-line .ct-label{display:block;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex}.ct-chart-donut .ct-label,.ct-chart-pie .ct-label{dominant-baseline:central}.ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-label.ct-vertical.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-label.ct-vertical.ct-end{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;text-align:center;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-start{-webkit-box-align:flex-end;-webkit-align-items:flex-end;-ms-flex-align:flex-end;align-items:flex-end;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-horizontal.ct-end{-webkit-box-align:flex-start;-webkit-align-items:flex-start;-ms-flex-align:flex-start;align-items:flex-start;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:start}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-start{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-end;-webkit-justify-content:flex-end;-ms-flex-pack:flex-end;justify-content:flex-end;text-align:right;text-anchor:end}.ct-chart-bar.ct-horizontal-bars .ct-label.ct-vertical.ct-end{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:flex-start;-webkit-justify-content:flex-start;-ms-flex-pack:flex-start;justify-content:flex-start;text-align:left;text-anchor:end}.ct-grid{stroke:rgba(0,0,0,.2);stroke-width:1px;stroke-dasharray:2px}.ct-point{stroke-width:10px;stroke-linecap:round}.ct-line{stroke-width:4px}.ct-area{stroke:none;fill-opacity:.1}.ct-bar{fill:none;stroke-width:10px}.ct-slice-donut{fill:none;stroke-width:60px}.ct-series-a .ct-bar,.ct-series-a .ct-line,.ct-series-a .ct-point,.ct-series-a .ct-slice-donut{stroke:#d70206}.ct-series-a .ct-area,.ct-series-a .ct-slice-pie{fill:#d70206}.ct-series-b .ct-bar,.ct-series-b .ct-line,.ct-series-b .ct-point,.ct-series-b .ct-slice-donut{stroke:#f05b4f}.ct-series-b .ct-area,.ct-series-b .ct-slice-pie{fill:#f05b4f}.ct-series-c .ct-bar,.ct-series-c .ct-line,.ct-series-c .ct-point,.ct-series-c .ct-slice-donut{stroke:#f4c63d}.ct-series-c .ct-area,.ct-series-c .ct-slice-pie{fill:#f4c63d}.ct-series-d .ct-bar,.ct-series-d .ct-line,.ct-series-d .ct-point,.ct-series-d .ct-slice-donut{stroke:#d17905}.ct-series-d .ct-area,.ct-series-d .ct-slice-pie{fill:#d17905}.ct-series-e .ct-bar,.ct-series-e .ct-line,.ct-series-e .ct-point,.ct-series-e .ct-slice-donut{stroke:#453d3f}.ct-series-e .ct-area,.ct-series-e .ct-slice-pie{fill:#453d3f}.ct-series-f .ct-bar,.ct-series-f .ct-line,.ct-series-f .ct-point,.ct-series-f .ct-slice-donut{stroke:#59922b}.ct-series-f .ct-area,.ct-series-f .ct-slice-pie{fill:#59922b}.ct-series-g .ct-bar,.ct-series-g .ct-line,.ct-series-g .ct-point,.ct-series-g .ct-slice-donut{stroke:#0544d3}.ct-series-g .ct-area,.ct-series-g .ct-slice-pie{fill:#0544d3}.ct-series-h .ct-bar,.ct-series-h .ct-line,.ct-series-h .ct-point,.ct-series-h .ct-slice-donut{stroke:#6b0392}.ct-series-h .ct-area,.ct-series-h .ct-slice-pie{fill:#6b0392}.ct-series-i .ct-bar,.ct-series-i .ct-line,.ct-series-i .ct-point,.ct-series-i .ct-slice-donut{stroke:#f05b4f}.ct-series-i .ct-area,.ct-series-i .ct-slice-pie{fill:#f05b4f}.ct-series-j .ct-bar,.ct-series-j .ct-line,.ct-series-j .ct-point,.ct-series-j .ct-slice-donut{stroke:#dda458}.ct-series-j .ct-area,.ct-series-j .ct-slice-pie{fill:#dda458}.ct-series-k .ct-bar,.ct-series-k .ct-line,.ct-series-k .ct-point,.ct-series-k .ct-slice-donut{stroke:#eacf7d}.ct-series-k .ct-area,.ct-series-k .ct-slice-pie{fill:#eacf7d}.ct-series-l .ct-bar,.ct-series-l .ct-line,.ct-series-l .ct-point,.ct-series-l .ct-slice-donut{stroke:#86797d}.ct-series-l .ct-area,.ct-series-l .ct-slice-pie{fill:#86797d}.ct-series-m .ct-bar,.ct-series-m .ct-line,.ct-series-m .ct-point,.ct-series-m .ct-slice-donut{stroke:#b2c326}.ct-series-m .ct-area,.ct-series-m .ct-slice-pie{fill:#b2c326}.ct-series-n .ct-bar,.ct-series-n .ct-line,.ct-series-n .ct-point,.ct-series-n .ct-slice-donut{stroke:#6188e2}.ct-series-n .ct-area,.ct-series-n .ct-slice-pie{fill:#6188e2}.ct-series-o .ct-bar,.ct-series-o .ct-line,.ct-series-o .ct-point,.ct-series-o .ct-slice-donut{stroke:#a748ca}.ct-series-o .ct-area,.ct-series-o .ct-slice-pie{fill:#a748ca}.ct-square{display:block;position:relative;width:100%}.ct-square:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:100%}.ct-square:after{display:table}.ct-square>svg{display:block;position:absolute;top:0;left:0}.ct-minor-second{display:block;position:relative;width:100%}.ct-minor-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:93.75%}.ct-minor-second:after{display:table}.ct-minor-second>svg{display:block;position:absolute;top:0;left:0}.ct-major-second{display:block;position:relative;width:100%}.ct-major-second:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:88.8888888889%}.ct-major-second:after{display:table}.ct-major-second>svg{display:block;position:absolute;top:0;left:0}.ct-minor-third{display:block;position:relative;width:100%}.ct-minor-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:83.3333333333%}.ct-minor-third:after{display:table}.ct-minor-third>svg{display:block;position:absolute;top:0;left:0}.ct-major-third{display:block;position:relative;width:100%}.ct-major-third:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:80%}.ct-major-third:after{display:table}.ct-major-third>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fourth{display:block;position:relative;width:100%}.ct-perfect-fourth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:75%}.ct-perfect-fourth:after{display:table}.ct-perfect-fourth>svg{display:block;position:absolute;top:0;left:0}.ct-perfect-fifth{display:block;position:relative;width:100%}.ct-perfect-fifth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:66.6666666667%}.ct-perfect-fifth:after{display:table}.ct-perfect-fifth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-sixth{display:block;position:relative;width:100%}.ct-minor-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:62.5%}.ct-minor-sixth:after{display:table}.ct-minor-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-golden-section{display:block;position:relative;width:100%}.ct-golden-section:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:61.804697157%}.ct-golden-section:after{content:"";display:table;clear:both}.ct-golden-section>svg{display:block;position:absolute;top:0;left:0}.ct-major-sixth{display:block;position:relative;width:100%}.ct-major-sixth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:60%}.ct-major-sixth:after{display:table}.ct-major-sixth>svg{display:block;position:absolute;top:0;left:0}.ct-minor-seventh{display:block;position:relative;width:100%}.ct-minor-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:56.25%}.ct-minor-seventh:after{display:table}.ct-minor-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-seventh{display:block;position:relative;width:100%}.ct-major-seventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:53.3333333333%}.ct-major-seventh:after{display:table}.ct-major-seventh>svg{display:block;position:absolute;top:0;left:0}.ct-octave{display:block;position:relative;width:100%}.ct-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:50%}.ct-octave:after{display:table}.ct-octave>svg{display:block;position:absolute;top:0;left:0}.ct-major-tenth{display:block;position:relative;width:100%}.ct-major-tenth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:40%}.ct-major-tenth:after{display:table}.ct-major-tenth>svg{display:block;position:absolute;top:0;left:0}.ct-major-eleventh{display:block;position:relative;width:100%}.ct-major-eleventh:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:37.5%}.ct-major-eleventh:after{display:table}.ct-major-eleventh>svg{display:block;position:absolute;top:0;left:0}.ct-major-twelfth{display:block;position:relative;width:100%}.ct-major-twelfth:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:33.3333333333%}.ct-major-twelfth:after{display:table}.ct-major-twelfth>svg{display:block;position:absolute;top:0;left:0}.ct-double-octave{display:block;position:relative;width:100%}.ct-double-octave:before{display:block;float:left;content:"";width:0;height:0;padding-bottom:25%}.ct-double-octave:after{display:table}.ct-double-octave>svg{display:block;position:absolute;top:0;left:0} \ No newline at end of file diff --git a/src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/favicon.ico b/src/Middleware/NodeServices/samples/NodeServicesExamples/wwwroot/favicon.ico deleted file mode 100644 index a3a799985c43bc7309d701b2cad129023377dc71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32038 zcmeHwX>eTEbtY7aYbrGrkNjgie?1jXjZ#zP%3n{}GObKv$BxI7Sl;Bwl5E+Qtj&t8 z*p|m4DO#HoJC-FyvNnp8NP<{Na0LMnTtO21(rBP}?EAiNjWgeO?z`{3ZoURUQlV2d zY1Pqv{m|X_oO91|?^z!6@@~od!@OH>&BN;>c@O+yUfy5w>LccTKJJ&`-k<%M^Zvi( z<$dKp=jCnNX5Qa+M_%6g|IEv~4R84q9|7E=|Ho(Wz3f-0wPjaRL;W*N^>q%^KGRr7 zxbjSORb_c&eO;oV_DZ7ua!sPH=0c+W;`vzJ#j~-x3uj};50#vqo*0w4!LUqs*UCh9 zvy2S%$#8$K4EOa&e@~aBS65_hc~Mpu=454VT2^KzWqEpBA=ME|O;1cn?8p<+{MKJf zbK#@1wzL44m$k(?85=Obido7=C|xWKe%66$z)NrzRwR>?hK?_bbwT z@Da?lBrBL}Zemo1@!9pYRau&!ld17h{f+UV0sY(R{ET$PBB|-=Nr@l-nY6w8HEAw* zRMIQU`24Jl_IFEPcS=_HdrOP5yf81z_?@M>83Vv65$QFr9nPg(wr`Ke8 zaY4ogdnMA*F7a4Q1_uXadTLUpCk;$ZPRRJ^sMOch;rlbvUGc1R9=u;dr9YANbQ<4Z z#P|Cp9BP$FXNPolgyr1XGt$^lFPF}rmBF5rj1Kh5%dforrP8W}_qJL$2qMBS-#%-|s#BPZBSETsn_EBYcr(W5dq( z@f%}C|iN7)YN`^)h7R?Cg}Do*w-!zwZb9=BMp%Wsh@nb22hA zA{`wa8Q;yz6S)zfo%sl08^GF`9csI9BlGnEy#0^Y3b);M+n<(}6jziM7nhe57a1rj zC@(2ISYBL^UtWChKzVWgf%4LW2Tqg_^7jMw`C$KvU+mcakFjV(BGAW9g%CzSyM;Df z143=mq0oxaK-H;o>F3~zJ<(3-j&?|QBn)WJfP#JR zRuA;`N?L83wQt78QIA$(Z)lGQY9r^SFal;LB^qi`8%8@y+mwcGsf~nv)bBy2S7z~9 z=;X@Gglk)^jpbNz?1;`!J3QUfAOp4U$Uxm5>92iT`mek#$>s`)M>;e4{#%HAAcb^8_Ax%ersk|}# z0bd;ZPu|2}18KtvmIo8`1@H~@2ejwo(5rFS`Z4&O{$$+ch2hC0=06Jh`@p+p8LZzY z&2M~8T6X^*X?yQ$3N5EzRv$(FtSxhW>>ABUyp!{484f8(%C1_y)3D%Qgfl_!sz`LTXOjR&L!zPA0qH_iNS!tY{!^2WfD%uT}P zI<~&?@&))5&hPPHVRl9);TPO>@UI2d!^ksb!$9T96V(F){puTsn(}qt_WXNw4VvHj zf;6A_XCvE`Z@}E-IOaG0rs>K>^=Sr&OgT_p;F@v0VCN0Y$r|Lw1?Wjt`AKK~RT*kJ z2>QPuVgLNcF+XKno;WBv$yj@d_WFJbl*#*V_Cwzo@%3n5%z4g21G*PVZ)wM5$A{klYozmGlB zT@u2+s}=f}25%IA!yNcXUr!!1)z(Nqbhojg0lv@7@0UlvUMT)*r;M$d0-t)Z?B1@qQk()o!4fqvfr_I0r7 zy1(NdkHEj#Yu{K>T#We#b#FD=c1XhS{hdTh9+8gy-vkcdkk*QS@y(xxEMb1w6z<^~ zYcETGfB#ibR#ql0EiD;PR$L&Vrh2uRv5t_$;NxC;>7_S5_OXxsi8udY3BUUdi55Sk zcyKM+PQ9YMA%D1kH1q48OFG(Gbl=FmV;yk8o>k%0$rJ8%-IYsHclnYuTskkaiCGkUlkMY~mx&K}XRlKIW;odWIeuKjtbc^8bBOTqK zjj(ot`_j?A6y_h%vxE9o*ntx#PGrnK7AljD_r58ylE*oy@{IY%+mA^!|2vW_`>`aC{#3`#3;D_$^S^cM zRcF+uTO2sICledvFgNMU@A%M)%8JbSLq{dD|2|2Sg8vvh_uV6*Q?F&rKaV{v_qz&y z`f;stIb?Cb2!Cg7CG91Bhu@D@RaIrq-+o+T2fwFu#|j>lD6ZS9-t^5cx>p|?flqUA z;Cgs#V)O#`Aw4$Kr)L5?|7f4izl!;n0jux}tEW$&&YBXz9o{+~HhoiYDJ`w5BVTl&ARya=M7zdy$FEe}iGBur8XE>rhLj&_yDk5D4n2GJZ07u7%zyAfNtOLn;)M?h*Py-Xtql5aJOtL4U8e|!t? z((sc6&OJXrPdVef^wZV&x=Z&~uA7^ix8rly^rEj?#d&~pQ{HN8Yq|fZ#*bXn-26P^ z5!)xRzYO9{u6vx5@q_{FE4#7BipS#{&J7*>y}lTyV94}dfE%Yk>@@pDe&F7J09(-0|wuI|$of-MRfK51#t@t2+U|*s=W; z!Y&t{dS%!4VEEi$efA!#<<7&04?kB}Soprd8*jYv;-Qj~h~4v>{XX~kjF+@Z7<t?^|i z#>_ag2i-CRAM8Ret^rZt*^K?`G|o>1o(mLkewxyA)38k93`<~4VFI?5VB!kBh%NNU zxb8K(^-MU1ImWQxG~nFB-Un;6n{lQz_FfsW9^H$Xcn{;+W^ZcG$0qLM#eNV=vGE@# z1~k&!h4@T|IiI<47@pS|i?Qcl=XZJL#$JKve;booMqDUYY{(xcdj6STDE=n?;fsS1 ze`h~Q{CT$K{+{t+#*I1=&&-UU8M&}AwAxD-rMa=e!{0gQXP@6azBq9(ji11uJF%@5 zCvV`#*?;ZguQ7o|nH%bm*s&jLej#@B35gy32ZAE0`Pz@#j6R&kN5w{O4~1rhDoU zEBdU)%Nl?8zi|DR((u|gg~r$aLYmGMyK%FO*qLvwxK5+cn*`;O`16c!&&XT{$j~5k zXb^fbh1GT-CI*Nj{-?r7HNg=e3E{6rxuluPXY z5Nm8ktc$o4-^SO0|Es_sp!A$8GVwOX+%)cH<;=u#R#nz;7QsHl;J@a{5NUAmAHq4D zIU5@jT!h?kUp|g~iN*!>jM6K!W5ar0v~fWrSHK@})@6Lh#h)C6F6@)&-+C3(zO! z8+kV|B7LctM3DpI*~EYo>vCj>_?x&H;>y0*vKwE0?vi$CLt zfSJB##P|M2dEUDBPKW=9cY-F;L;h3Fs4E2ERdN#NSL7ctAC z?-}_a{*L@GA7JHJudxtDVA{K5Yh*k(%#x4W7w+^ zcb-+ofbT5ieG+@QG2lx&7!MyE2JWDP@$k`M;0`*d+oQmJ2A^de!3c53HFcfW_Wtv< zKghQ;*FifmI}kE4dc@1y-u;@qs|V75Z^|Q0l0?teobTE8tGl@EB?k#q_wUjypJ*R zyEI=DJ^Z+d*&}B_xoWvs27LtH7972qqMxVFcX9}c&JbeNCXUZM0`nQIkf&C}&skSt z^9fw@b^Hb)!^hE2IJq~~GktG#ZWwWG<`@V&ckVR&r=JAO4YniJewVcG`HF;59}=bf zLyz0uxf6MhuSyH#-^!ZbHxYl^mmBVrx) zyrb8sQ*qBd_WXm9c~Of$&ZP$b^)<~0%nt#7y$1Jg$e}WCK>TeUB{P>|b1FAB?%K7>;XiOfd}JQ`|IP#Vf%kVy zXa4;XFZ+>n;F>uX&3|4zqWK2u3c<>q;tzjsb1;d{u;L$-hq3qe@82(ob<3qom#%`+ z;vzYAs7TIMl_O75BXu|r`Qhc4UT*vN$3Oo0kAC!{f2#HexDy|qUpgTF;k{o6|L>7l z=?`=*LXaow1o;oNNLXsGTrvC)$R&{m=94Tf+2iTT3Y_Or z-!;^0a{kyWtO4vksG_3cyc7HQ0~detf0+2+qxq(e1NS251N}w5iTSrM)`0p8rem!j zZ56hGD=pHI*B+dd)2B`%|9f0goozCSeXPw3 z+58k~sI02Yz#lOneJzYcG)EB0|F+ggC6D|B`6}d0khAK-gz7U3EGT|M_9$ZINqZjwf>P zJCZ=ogSoE`=yV5YXrcTQZx@Un(64*AlLiyxWnCJ9I<5Nc*eK6eV1Mk}ci0*NrJ=t| zCXuJG`#7GBbPceFtFEpl{(lTm`LX=B_!H+& z>$*Hf}}y zkt@nLXFG9%v**s{z&{H4e?aqp%&l#oU8lxUxk2o%K+?aAe6jLojA& z_|J0<-%u^<;NT*%4)n2-OdqfctSl6iCHE?W_Q2zpJken#_xUJlidzs249H=b#g z?}L4-Tnp6)t_5X?_$v)vz`s9@^BME2X@w<>sKZ3=B{%*B$T5Nj%6!-Hr;I!Scj`lH z&2dHFlOISwWJ&S2vf~@I4i~(0*T%OFiuX|eD*nd2utS4$1_JM?zmp>a#CsVy6Er^z zeNNZZDE?R3pM?>~e?H_N`C`hy%m4jb;6L#8=a7l>3eJS2LGgEUxsau-Yh9l~o7=Yh z2mYg3`m5*3Ik|lKQf~euzZlCWzaN&=vHuHtOwK!2@W6)hqq$Zm|7`Nmu%9^F6UH?+ z@2ii+=iJ;ZzhiUKu$QB()nKk3FooI>Jr_IjzY6=qxYy;&mvi7BlQ?t4kRjIhb|2q? zd^K~{-^cxjVSj?!Xs=Da5IHmFzRj!Kzh~b!?`P7c&T9s77VLYB?8_?F zauM^)p;qFG!9PHLfIsnt43UnmV?Wn?Ki7aXSosgq;f?MYUuSIYwOn(5vWhb{f%$pn z4ySN-z}_%7|B);A@PA5k*7kkdr4xZ@s{e9j+9w;*RFm;XPDQwx%~;8iBzSKTIGKO z{53ZZU*OLr@S5=k;?CM^i#zkxs3Sj%z0U`L%q`qM+tP zX$aL;*^g$7UyM2Go+_4A+f)IQcy^G$h2E zb?nT$XlgTEFJI8GN6NQf%-eVn9mPilRqUbT$pN-|;FEjq@Ao&TxpZg=mEgBHB zU@grU;&sfmqlO=6|G3sU;7t8rbK$?X0y_v9$^{X`m4jZ_BR|B|@?ZCLSPPEzz`w1n zP5nA;4(kQFKm%$enjkkBxM%Y}2si&d|62L)U(dCzCGn56HN+i#6|nV-TGIo0;W;`( zW-y=1KF4dp$$mC_|6}pbb>IHoKQeZajXQB>jVR?u`R>%l1o54?6NnS*arpVopdEF; zeC5J3*M0p`*8lif;!irrcjC?(uExejsi~>4wKYwstGY^N@KY}TujLx`S=Cu+T=!dx zKWlPm->I**E{A*q-Z^FFT5$G%7Ij0_*Mo4-y6~RmyTzUB&lfae(WZfO>um}mnsDXPEbau-!13!!xd!qh*{C)6&bz0j1I{>y$D-S)b*)JMCPk!=~KL&6Ngin0p6MCOxF2L_R9t8N!$2Wpced<#`y!F;w zKTi5V_kX&X09wAIJ#anfg9Dhn0s7(C6Nj3S-mVn(i|C6ZAVq0$hE)874co};g z^hR7pe4lU$P;*ggYc4o&UTQC%liCXooIfkI3TNaBV%t~FRr}yHu7kjQ2J*3;e%;iW zvDVCh8=G80KAeyhCuY2LjrC!Od1rvF7h}zszxGV)&!)6ChP5WAjv-zQAMNJIG!JHS zwl?pLxC-V5II#(hQ`l)ZAp&M0xd4%cxmco*MIk?{BD=BK`1vpc}D39|XlV z{c&0oGdDa~TL2FT4lh=~1NL5O-P~0?V2#ie`v^CnANfGUM!b4F=JkCwd7Q`c8Na2q zJGQQk^?6w}Vg9-{|2047((lAV84uN%sK!N2?V(!_1{{v6rdgZl56f0zDMQ+q)jKzzu^ztsVken;=DjAh6G`Cw`Q4G+BjS+n*=KI~^K{W=%t zbD-rN)O4|*Q~@<#@1Vx$E!0W9`B~IZeFn87sHMXD>$M%|Bh93rdGf1lKoX3K651t&nhsl= zXxG|%@8}Bbrlp_u#t*DZX<}_0Yb{A9*1Pd_)LtqNwy6xT4pZrOY{s?N4)pPwT(i#y zT%`lRi8U#Ken4fw>H+N`{f#FF?ZxFlLZg7z7#cr4X>id z{9kUD`d2=w_Zlb{^c`5IOxWCZ1k<0T1D1Z31IU0Q2edsZ1K0xv$pQVYq2KEp&#v#Z z?{m@Lin;*Str(C2sfF^L>{R3cjY`~#)m>Wm$Y|1fzeS0-$(Q^z@} zEO*vlb-^XK9>w&Ef^=Zzo-1AFSP#9zb~X5_+){$(eB4K z8gtW+nl{q+CTh+>v(gWrsP^DB*ge(~Q$AGxJ-eYc1isti%$%nM<_&Ev?%|??PK`$p z{f-PM{Ym8k<$$)(F9)tqzFJ?h&Dk@D?Dt{4CHKJWLs8$zy6+(R)pr@0ur)xY{=uXFFzH_> z-F^tN1y(2hG8V)GpDg%wW0Px_ep~nIjD~*HCSxDi0y`H!`V*~RHs^uQsb1*bK1qGpmd zB1m`Cjw0`nLBF2|umz+a#2X$c?Lj;M?Lj;MUp*d>7j~ayNAyj@SLpeH`)BgRH}byy zyQSat!;U{@O(<<2fp&oQkIy$z`_CQ-)O@RN;QD9T4y|wIJ^%U#(BF%=`i49}j!D-) zkOwPSJaG03SMkE~BzW}b_v>LA&y)EEYO6sbdnTX*$>UF|JhZ&^MSb4}Tgbne_4n+C zwI8U4i~PI>7a3{kVa8|))*%C0|K+bIbmV~a`|G#+`TU#g zXW;bWIcWsQi9c4X*RUDpIfyoPY)2bI-r9)xulm1CJDkQd6u+f)_N=w1ElgEBjprPF z3o?Ly0RVeY_{3~fPVckRMxe2lM8hj!B8F)JO z!`AP6>u>5Y&3o9t0QxBpNE=lJx#NyIbp1gD zzUYBIPYHIv9ngk-Zt~<)62^1Zs1LLYMh@_tP^I7EX-9)Ed0^@y{k65Gp0KRcTmMWw zU|+)qx{#q0SL+4q?Q`i0>COIIF8a0Cf&C`hbMj?LmG9K&iW-?PJt*u)38tTXAP>@R zZL6uH^!RYNq$p>PKz7f-zvg>OKXcZ8h!%Vo@{VUZp|+iUD_xb(N~G|6c#oQK^nHZU zKg#F6<)+`rf~k*Xjjye+syV{bwU2glMMMs-^ss4`bYaVroXzn`YQUd__UlZL_mLs z(vO}k!~(mi|L+(5&;>r<;|OHnbXBE78LruP;{yBxZ6y7K3)nMo-{6PCI7gQi6+rF_ zkPod!Z8n}q46ykrlQS|hVB(}(2Kf7BCZ>Vc;V>ccbk2~NGaf6wGQH@W9&?Zt3v(h*P4xDrN>ex7+jH*+Qg z%^jH$&+*!v{sQ!xkWN4+>|b}qGvEd6ANzgqoVy5Qfws}ef2QqF{iiR5{pT}PS&yjo z>lron#va-p=v;m>WB+XVz|o;UJFdjo5_!RRD|6W{4}A2a#bZv)gS_`b|KsSH)Sd_JIr%<%n06TX&t{&!H#{)?4W9hlJ`R1>FyugOh3=D_{einr zu(Wf`qTkvED+gEULO0I*Hs%f;&=`=X4;N8Ovf28x$A*11`dmfy2=$+PNqX>XcG`h% zJY&A6@&)*WT^rC(Caj}2+|X|6cICm5h0OK0cGB_!wEKFZJU)OQ+TZ1q2bTx9hxnq& z$9ee|f9|0M^)#E&Pr4)f?o&DMM4w>Ksb{hF(0|wh+5_{vPow{V%TFzU2za&gjttNi zIyR9qA56dX52Qbv2aY^g`U7R43-p`#sO1A=KS2aKgfR+Yu^bQ*i-qu z%0mP;Ap)B~zZgO9lG^`325gOf?iUHF{~7jyGC)3L(eL(SQ70VzR~wLN18tnx(Cz2~ zctBl1kI)wAe+cxWHw*NW-d;=pd+>+wd$a@GBju*wFvabSaPtHiT!o#QFC+wBVwYo3s=y;z1jM+M=Fj!FZM>UzpL-eZzOT( zhmZmEfWa=%KE#V3-ZK5#v!Hzd{zc^{ctF~- z>DT-U`}5!fk$aj24`#uGdB7r`>oX5tU|d*b|N3V1lXmv%MGrvE(dXG)^-J*LA>$LE z7kut4`zE)v{@Op|(|@i#c>tM!12FQh?}PfA0`Bp%=%*RiXVzLDXnXtE@4B)5uR}a> zbNU}q+712pIrM`k^odG8dKtG$zwHmQI^c}tfjx5?egx3!e%JRm_64e+>`Ra1IRfLb z1KQ`SxmH{cZfyVS5m(&`{V}Y4j6J{b17`h6KWqZ&hfc(oR zxM%w!$F(mKy05kY&lco3%zvLCxBW+t*rxO+i=qGMvobx0-<7`VUu)ka`){=ew+Ovt zg%52_{&UbkUA8aJPWsk)gYWV4`dnxI%s?7^fGpq{ZQuu=VH{-t7w~K%_E<8`zS;V- zKTho*>;UQQul^1GT^HCt@I-q?)&4!QDgBndn?3sNKYKCQFU4LGKJ$n@Je$&w9@E$X z^p@iJ(v&`1(tq~1zc>0Vow-KR&vm!GUzT?Eqgnc)leZ9p)-Z*C!zqb=-$XG0 z^!8RfuQs5s>Q~qcz92(a_Q+KH?C*vCTr~UdTiR`JGuNH8v(J|FTiSEcPrBpmHRtmd zI2Jng0J=bXK);YY^rM?jzn?~X-Pe`GbAy{D)Y6D&1GY-EBcy%Bq?bKh?A>DD9DD!p z?{q02wno2sraGUkZv5dx+J8)&K$)No43Zr(*S`FEdL!4C)}WE}vJd%{S6-3VUw>Wp z?Aasv`T0^%P$2vE?L+Qhj~qB~K%eW)xH(=b_jU}TLD&BP*Pc9hz@Z=e0nkpLkWl}> z_5J^i(9Z7$(XG9~I3sY)`OGZ#_L06+Dy4E>UstcP-rU@xJ$&rxvo!n1Ao`P~KLU-8 z{zDgN4-&A6N!kPSYbQ&7sLufi`YtE2uN$S?e&5n>Y4(q#|KP!cc1j)T^QrUXMPFaP z_SoYO8S8G}Z$?AL4`;pE?7J5K8yWqy23>cCT2{=-)+A$X^-I9=e!@J@A&-;Ufc)`H}c(VI&;0x zrrGv()5mjP%jXzS{^|29?bLNXS0bC%p!YXI!;O457rjCEEzMkGf~B3$T}dXBO23tP z+Ci>;5UoM?C@bU@f9G1^X3=ly&ZeFH<@|RnOG--A&)fd)AUgjw?%izq{p(KJ`EP0v z2mU)P!+3t@X14DA=E2RR-|p${GZ9ETX=d+kJRZL$nSa0daI@&oUUxnZg0xd_xu>Vz lzF#z5%kSKX?YLH3ll^(hI(_`L*t#Iva2Ede*Z;>H_ - - - - - - - - diff --git a/src/Middleware/NodeServices/src/Configuration/NodeServicesFactory.cs b/src/Middleware/NodeServices/src/Configuration/NodeServicesFactory.cs deleted file mode 100644 index 06968643bd0e..000000000000 --- a/src/Middleware/NodeServices/src/Configuration/NodeServicesFactory.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.NodeServices -{ - /// - /// Supplies INodeServices instances. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class NodeServicesFactory - { - /// - /// Create an instance according to the supplied options. - /// - /// Options for creating the instance. - /// An instance. - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static INodeServices CreateNodeServices(NodeServicesOptions options) - { - if (options == null) - { - throw new ArgumentNullException(nameof (options)); - } - - return new NodeServicesImpl(options.NodeInstanceFactory); - } - } -} diff --git a/src/Middleware/NodeServices/src/Configuration/NodeServicesOptions.cs b/src/Middleware/NodeServices/src/Configuration/NodeServicesOptions.cs deleted file mode 100644 index a7aac6eba4e6..000000000000 --- a/src/Middleware/NodeServices/src/Configuration/NodeServicesOptions.cs +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Threading; -using Microsoft.AspNetCore.NodeServices.HostingModels; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.AspNetCore.NodeServices -{ - /// - /// Describes options used to configure an instance. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class NodeServicesOptions - { - internal const string TimeoutConfigPropertyName = nameof(InvocationTimeoutMilliseconds); - private const int DefaultInvocationTimeoutMilliseconds = 60 * 1000; - private const string LogCategoryName = "Microsoft.AspNetCore.NodeServices"; - private static readonly string[] DefaultWatchFileExtensions = { ".js", ".jsx", ".ts", ".tsx", ".json", ".html" }; - - /// - /// Creates a new instance of . - /// - /// The . - public NodeServicesOptions(IServiceProvider serviceProvider) - { - if (serviceProvider == null) - { - throw new ArgumentNullException(nameof (serviceProvider)); - } - - EnvironmentVariables = new Dictionary(); - InvocationTimeoutMilliseconds = DefaultInvocationTimeoutMilliseconds; - WatchFileExtensions = (string[])DefaultWatchFileExtensions.Clone(); - - var hostEnv = serviceProvider.GetService(); - if (hostEnv != null) - { - // In an ASP.NET environment, we can use the IHostingEnvironment data to auto-populate a few - // things that you'd otherwise have to specify manually - ProjectPath = hostEnv.ContentRootPath; - EnvironmentVariables["NODE_ENV"] = hostEnv.IsDevelopment() ? "development" : "production"; // De-facto standard values for Node - } - else - { - ProjectPath = Directory.GetCurrentDirectory(); - } - - var applicationLifetime = serviceProvider.GetService(); - if (applicationLifetime != null) - { - ApplicationStoppingToken = applicationLifetime.ApplicationStopping; - } - - // If the DI system gives us a logger, use it. Otherwise, set up a default one. - var loggerFactory = serviceProvider.GetService(); - NodeInstanceOutputLogger = loggerFactory != null - ? loggerFactory.CreateLogger(LogCategoryName) - : NullLogger.Instance; - // By default, we use this package's built-in out-of-process-via-HTTP hosting/transport - this.UseHttpHosting(); - } - - /// - /// Specifies how to construct Node.js instances. An encapsulates all details about - /// how Node.js instances are launched and communicated with. A new will be created - /// automatically if the previous instance has terminated (e.g., because a source file changed). - /// - public Func NodeInstanceFactory { get; set; } - - /// - /// If set, overrides the path to the root of your application. This path is used when locating Node.js modules relative to your project. - /// - public string ProjectPath { get; set; } - - /// - /// If set, the Node.js instance should restart when any matching file on disk within your project changes. - /// - public string[] WatchFileExtensions { get; set; } - - /// - /// The Node.js instance's stdout/stderr will be redirected to this . - /// - public ILogger NodeInstanceOutputLogger { get; set; } - - /// - /// If true, the Node.js instance will accept incoming V8 debugger connections (e.g., from node-inspector). - /// - public bool LaunchWithDebugging { get; set; } - - /// - /// If is true, the Node.js instance will listen for V8 debugger connections on this port. - /// - public int DebuggingPort { get; set; } - - /// - /// If set, starts the Node.js instance with the specified environment variables. - /// - public IDictionary EnvironmentVariables { get; set; } - - /// - /// Specifies the maximum duration, in milliseconds, that your .NET code should wait for Node.js RPC calls to return. - /// - public int InvocationTimeoutMilliseconds { get; set; } - - /// - /// A token that indicates when the host application is stopping. - /// - public CancellationToken ApplicationStoppingToken { get; set; } - } -} diff --git a/src/Middleware/NodeServices/src/Configuration/NodeServicesServiceCollectionExtensions.cs b/src/Middleware/NodeServices/src/Configuration/NodeServicesServiceCollectionExtensions.cs deleted file mode 100644 index 1d793671b8cd..000000000000 --- a/src/Middleware/NodeServices/src/Configuration/NodeServicesServiceCollectionExtensions.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.NodeServices; - -namespace Microsoft.Extensions.DependencyInjection -{ - /// - /// Extension methods for setting up NodeServices in an . - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class NodeServicesServiceCollectionExtensions - { - /// - /// Adds NodeServices support to the . - /// - /// The . - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static void AddNodeServices(this IServiceCollection serviceCollection) - => AddNodeServices(serviceCollection, _ => {}); - - /// - /// Adds NodeServices support to the . - /// - /// The . - /// A callback that will be invoked to populate the . - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static void AddNodeServices(this IServiceCollection serviceCollection, Action setupAction) - { - if (setupAction == null) - { - throw new ArgumentNullException(nameof (setupAction)); - } - - serviceCollection.AddSingleton(typeof(INodeServices), serviceProvider => - { - // First we let NodeServicesOptions take its defaults from the IServiceProvider, - // then we let the developer override those options - var options = new NodeServicesOptions(serviceProvider); - setupAction(options); - - return NodeServicesFactory.CreateNodeServices(options); - }); - } - } -} diff --git a/src/Middleware/NodeServices/src/Content/Node/entrypoint-http.js b/src/Middleware/NodeServices/src/Content/Node/entrypoint-http.js deleted file mode 100644 index a992d0fe1677..000000000000 --- a/src/Middleware/NodeServices/src/Content/Node/entrypoint-http.js +++ /dev/null @@ -1,416 +0,0 @@ -(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 1); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports) { - -module.exports = require("path"); - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(2); - - -/***/ }), -/* 2 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -// Limit dependencies to core Node modules. This means the code in this file has to be very low-level and unattractive, -// but simplifies things for the consumer of this module. -__webpack_require__(3); -__webpack_require__(4); -var http = __webpack_require__(5); -var path = __webpack_require__(0); -var ArgsUtil_1 = __webpack_require__(6); -var ExitWhenParentExits_1 = __webpack_require__(7); -// Webpack doesn't support dynamic requires for files not present at compile time, so grab a direct -// reference to Node's runtime 'require' function. -var dynamicRequire = eval('require'); -var server = http.createServer(function (req, res) { - readRequestBodyAsJson(req, function (bodyJson) { - var hasSentResult = false; - var callback = function (errorValue, successValue) { - if (!hasSentResult) { - hasSentResult = true; - if (errorValue) { - respondWithError(res, errorValue); - } - else if (typeof successValue !== 'string') { - // Arbitrary object/number/etc - JSON-serialize it - var successValueJson = void 0; - try { - successValueJson = JSON.stringify(successValue); - } - catch (ex) { - // JSON serialization error - pass it back to .NET - respondWithError(res, ex); - return; - } - res.setHeader('Content-Type', 'application/json'); - res.end(successValueJson); - } - else { - // String - can bypass JSON-serialization altogether - res.setHeader('Content-Type', 'text/plain'); - res.end(successValue); - } - } - }; - // Support streamed responses - Object.defineProperty(callback, 'stream', { - enumerable: true, - get: function () { - if (!hasSentResult) { - hasSentResult = true; - res.setHeader('Content-Type', 'application/octet-stream'); - } - return res; - } - }); - try { - var resolvedPath = path.resolve(process.cwd(), bodyJson.moduleName); - var invokedModule = dynamicRequire(resolvedPath); - var func = bodyJson.exportedFunctionName ? invokedModule[bodyJson.exportedFunctionName] : invokedModule; - if (!func) { - throw new Error('The module "' + resolvedPath + '" has no export named "' + bodyJson.exportedFunctionName + '"'); - } - func.apply(null, [callback].concat(bodyJson.args)); - } - catch (synchronousException) { - callback(synchronousException, null); - } - }); -}); -var parsedArgs = ArgsUtil_1.parseArgs(process.argv); -var requestedPortOrZero = parsedArgs.port || 0; // 0 means 'let the OS decide' -server.listen(requestedPortOrZero, 'localhost', function () { - var addressInfo = server.address(); - // Signal to HttpNodeHost which loopback IP address (IPv4 or IPv6) and port it should make its HTTP connections on - console.log('[Microsoft.AspNetCore.NodeServices.HttpNodeHost:Listening on {' + addressInfo.address + '} port ' + addressInfo.port + '\]'); - // Signal to the NodeServices base class that we're ready to accept invocations - console.log('[Microsoft.AspNetCore.NodeServices:Listening]'); -}); -ExitWhenParentExits_1.exitWhenParentExits(parseInt(parsedArgs.parentPid), /* ignoreSigint */ true); -function readRequestBodyAsJson(request, callback) { - var requestBodyAsString = ''; - request.on('data', function (chunk) { requestBodyAsString += chunk; }); - request.on('end', function () { callback(JSON.parse(requestBodyAsString)); }); -} -function respondWithError(res, errorValue) { - res.statusCode = 500; - res.end(JSON.stringify({ - errorMessage: errorValue.message || errorValue, - errorDetails: errorValue.stack || null - })); -} - - -/***/ }), -/* 3 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -var path = __webpack_require__(0); -var startsWith = function (str, prefix) { return str.substring(0, prefix.length) === prefix; }; -var appRootDir = process.cwd(); -function patchedLStat(pathToStatLong, fsReqWrap) { - try { - // If the lstat completes without errors, we don't modify its behavior at all - return origLStat.apply(this, arguments); - } - catch (ex) { - var shouldOverrideError = startsWith(ex.message, 'EPERM') // It's a permissions error - && typeof appRootDirLong === 'string' - && startsWith(appRootDirLong, pathToStatLong) // ... for an ancestor directory - && ex.stack.indexOf('Object.realpathSync ') >= 0; // ... during symlink resolution - if (shouldOverrideError) { - // Fake the result to give the same result as an 'lstat' on the app root dir. - // This stops Node failing to load modules just because it doesn't know whether - // ancestor directories are symlinks or not. If there's a genuine file - // permissions issue, it will still surface later when Node actually - // tries to read the file. - return origLStat.call(this, appRootDir, fsReqWrap); - } - else { - // In any other case, preserve the original error - throw ex; - } - } -} -; -// It's only necessary to apply this workaround on Windows -var appRootDirLong = null; -var origLStat = null; -if (/^win/.test(process.platform)) { - try { - // Get the app's root dir in Node's internal "long" format (e.g., \\?\C:\dir\subdir) - appRootDirLong = path._makeLong(appRootDir); - // Actually apply the patch, being as defensive as possible - var bindingFs = process.binding('fs'); - origLStat = bindingFs.lstat; - if (typeof origLStat === 'function') { - bindingFs.lstat = patchedLStat; - } - } - catch (ex) { - // If some future version of Node throws (e.g., to prevent use of process.binding()), - // don't apply the patch, but still let the application run. - } -} - - -/***/ }), -/* 4 */ -/***/ (function(module, exports) { - -// When Node writes to stdout/strerr, we capture that and convert the lines into calls on the -// active .NET ILogger. But by default, stdout/stderr don't have any way of distinguishing -// linebreaks inside log messages from the linebreaks that delimit separate log messages, -// so multiline strings will end up being written to the ILogger as multiple independent -// log messages. This makes them very hard to make sense of, especially when they represent -// something like stack traces. -// -// To fix this, we intercept stdout/stderr writes, and replace internal linebreaks with a -// marker token. When .NET receives the lines, it converts the marker tokens back to regular -// linebreaks within the logged messages. -// -// Note that it's better to do the interception at the stdout/stderr level, rather than at -// the console.log/console.error (etc.) level, because this takes place after any native -// message formatting has taken place (e.g., inserting values for % placeholders). -var findInternalNewlinesRegex = /\n(?!$)/g; -var encodedNewline = '__ns_newline__'; -encodeNewlinesWrittenToStream(process.stdout); -encodeNewlinesWrittenToStream(process.stderr); -function encodeNewlinesWrittenToStream(outputStream) { - var origWriteFunction = outputStream.write; - outputStream.write = function (value) { - // Only interfere with the write if it's definitely a string - if (typeof value === 'string') { - var argsClone = Array.prototype.slice.call(arguments, 0); - argsClone[0] = encodeNewlinesInString(value); - origWriteFunction.apply(this, argsClone); - } - else { - origWriteFunction.apply(this, arguments); - } - }; -} -function encodeNewlinesInString(str) { - return str.replace(findInternalNewlinesRegex, encodedNewline); -} - - -/***/ }), -/* 5 */ -/***/ (function(module, exports) { - -module.exports = require("http"); - -/***/ }), -/* 6 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -function parseArgs(args) { - // Very simplistic parsing which is sufficient for the cases needed. We don't want to bring in any external - // dependencies (such as an args-parsing library) to this file. - var result = {}; - var currentKey = null; - args.forEach(function (arg) { - if (arg.indexOf('--') === 0) { - var argName = arg.substring(2); - result[argName] = undefined; - currentKey = argName; - } - else if (currentKey) { - result[currentKey] = arg; - currentKey = null; - } - }); - return result; -} -exports.parseArgs = parseArgs; - - -/***/ }), -/* 7 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -/* -In general, we want the Node child processes to be terminated as soon as the parent .NET processes exit, -because we have no further use for them. If the .NET process shuts down gracefully, it will run its -finalizers, one of which (in OutOfProcessNodeInstance.cs) will kill its associated Node process immediately. - -But if the .NET process is terminated forcefully (e.g., on Linux/OSX with 'kill -9'), then it won't have -any opportunity to shut down its child processes, and by default they will keep running. In this case, it's -up to the child process to detect this has happened and terminate itself. - -There are many possible approaches to detecting when a parent process has exited, most of which behave -differently between Windows and Linux/OS X: - - - On Windows, the parent process can mark its child as being a 'job' that should auto-terminate when - the parent does (http://stackoverflow.com/a/4657392). Not cross-platform. - - The child Node process can get a callback when the parent disconnects (process.on('disconnect', ...)). - But despite http://stackoverflow.com/a/16487966, no callback fires in any case I've tested (Windows / OS X). - - The child Node process can get a callback when its stdin/stdout are disconnected, as described at - http://stackoverflow.com/a/15693934. This works well on OS X, but calling stdout.resume() on Windows - causes the process to terminate prematurely. - - I don't know why, but on Windows, it's enough to invoke process.stdin.resume(). For some reason this causes - the child Node process to exit as soon as the parent one does, but I don't see this documented anywhere. - - You can poll to see if the parent process, or your stdin/stdout connection to it, is gone - - You can directly pass a parent process PID to the child, and then have the child poll to see if it's - still running (e.g., using process.kill(pid, 0), which doesn't kill it but just tests whether it exists, - as per https://nodejs.org/api/process.html#process_process_kill_pid_signal) - - Or, on each poll, you can try writing to process.stdout. If the parent has died, then this will throw. - However I don't see this documented anywhere. It would be nice if you could just poll for whether or not - process.stdout is still connected (without actually writing to it) but I haven't found any property whose - value changes until you actually try to write to it. - -Of these, the only cross-platform approach that is actually documented as a valid strategy is simply polling -to check whether the parent PID is still running. So that's what we do here. -*/ -exports.__esModule = true; -var pollIntervalMs = 1000; -function exitWhenParentExits(parentPid, ignoreSigint) { - setInterval(function () { - if (!processExists(parentPid)) { - // Can't log anything at this point, because out stdout was connected to the parent, - // but the parent is gone. - process.exit(); - } - }, pollIntervalMs); - if (ignoreSigint) { - // Pressing ctrl+c in the terminal sends a SIGINT to all processes in the foreground process tree. - // By default, the Node process would then exit before the .NET process, because ASP.NET implements - // a delayed shutdown to allow ongoing requests to complete. - // - // This is problematic, because if Node exits first, the CopyToAsync code in ConditionalProxyMiddleware - // will experience a read fault, and logs a huge load of errors. Fortunately, since the Node process is - // already set up to shut itself down if it detects the .NET process is terminated, all we have to do is - // ignore the SIGINT. The Node process will then terminate automatically after the .NET process does. - // - // A better solution would be to have WebpackDevMiddleware listen for SIGINT and gracefully close any - // ongoing EventSource connections before letting the Node process exit, independently of the .NET - // process exiting. However, doing this well in general is very nontrivial (see all the discussion at - // https://github.com/nodejs/node/issues/2642). - process.on('SIGINT', function () { - console.log('Received SIGINT. Waiting for .NET process to exit...'); - }); - } -} -exports.exitWhenParentExits = exitWhenParentExits; -function processExists(pid) { - try { - // Sending signal 0 - on all platforms - tests whether the process exists. As long as it doesn't - // throw, that means it does exist. - process.kill(pid, 0); - return true; - } - catch (ex) { - // If the reason for the error is that we don't have permission to ask about this process, - // report that as a separate problem. - if (ex.code === 'EPERM') { - throw new Error("Attempted to check whether process " + pid + " was running, but got a permissions error."); - } - return false; - } -} - - -/***/ }) -/******/ ]))); \ No newline at end of file diff --git a/src/Middleware/NodeServices/src/HostingModels/HttpNodeInstance.cs b/src/Middleware/NodeServices/src/HostingModels/HttpNodeInstance.cs deleted file mode 100644 index 9d7f5726b2c3..000000000000 --- a/src/Middleware/NodeServices/src/HostingModels/HttpNodeInstance.cs +++ /dev/null @@ -1,161 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Net.Http; -using System.Text; -using System.Text.RegularExpressions; -using System.Threading; -using System.Threading.Tasks; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - -namespace Microsoft.AspNetCore.NodeServices.HostingModels -{ - /// - /// A specialisation of the OutOfProcessNodeInstance base class that uses HTTP to perform RPC invocations. - /// - /// The Node child process starts an HTTP listener on an arbitrary available port (except where a nonzero - /// port number is specified as a constructor parameter), and signals which port was selected using the same - /// input/output-based mechanism that the base class uses to determine when the child process is ready to - /// accept RPC invocations. - /// - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal class HttpNodeInstance : OutOfProcessNodeInstance - { - private static readonly Regex EndpointMessageRegex = - new Regex(@"^\[Microsoft.AspNetCore.NodeServices.HttpNodeHost:Listening on {(.*?)} port (\d+)\]$"); - - private static readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings - { - ContractResolver = new CamelCasePropertyNamesContractResolver(), - TypeNameHandling = TypeNameHandling.None - }; - - private readonly HttpClient _client; - private bool _disposed; - private string _endpoint; - - public HttpNodeInstance(NodeServicesOptions options, int port = 0) - : base( - EmbeddedResourceReader.Read( - typeof(HttpNodeInstance), - "/Content/Node/entrypoint-http.js"), - options.ProjectPath, - options.WatchFileExtensions, - MakeCommandLineOptions(port), - options.ApplicationStoppingToken, - options.NodeInstanceOutputLogger, - options.EnvironmentVariables, - options.InvocationTimeoutMilliseconds, - options.LaunchWithDebugging, - options.DebuggingPort) - { - _client = new HttpClient(); - _client.Timeout = TimeSpan.FromMilliseconds(options.InvocationTimeoutMilliseconds + 1000); - } - - private static string MakeCommandLineOptions(int port) - { - return $"--port {port}"; - } - - protected override async Task InvokeExportAsync( - NodeInvocationInfo invocationInfo, CancellationToken cancellationToken) - { - var payloadJson = JsonConvert.SerializeObject(invocationInfo, jsonSerializerSettings); - var payload = new StringContent(payloadJson, Encoding.UTF8, "application/json"); - var response = await _client.PostAsync(_endpoint, payload, cancellationToken); - - if (!response.IsSuccessStatusCode) - { - // Unfortunately there's no true way to cancel ReadAsStringAsync calls, hence AbandonIfCancelled - var responseJson = await response.Content.ReadAsStringAsync().OrThrowOnCancellation(cancellationToken); - var responseError = JsonConvert.DeserializeObject(responseJson, jsonSerializerSettings); - - throw new NodeInvocationException(responseError.ErrorMessage, responseError.ErrorDetails); - } - - var responseContentType = response.Content.Headers.ContentType; - switch (responseContentType.MediaType) - { - case "text/plain": - // String responses can skip JSON encoding/decoding - if (typeof(T) != typeof(string)) - { - throw new ArgumentException( - "Node module responded with non-JSON string. This cannot be converted to the requested generic type: " + - typeof(T).FullName); - } - - var responseString = await response.Content.ReadAsStringAsync().OrThrowOnCancellation(cancellationToken); - return (T)(object)responseString; - - case "application/json": - var responseJson = await response.Content.ReadAsStringAsync().OrThrowOnCancellation(cancellationToken); - return JsonConvert.DeserializeObject(responseJson, jsonSerializerSettings); - - case "application/octet-stream": - // Streamed responses have to be received as System.IO.Stream instances - if (typeof(T) != typeof(Stream) && typeof(T) != typeof(object)) - { - throw new ArgumentException( - "Node module responded with binary stream. This cannot be converted to the requested generic type: " + - typeof(T).FullName + ". Instead you must use the generic type System.IO.Stream."); - } - - return (T)(object)(await response.Content.ReadAsStreamAsync().OrThrowOnCancellation(cancellationToken)); - - default: - throw new InvalidOperationException("Unexpected response content type: " + responseContentType.MediaType); - } - } - - protected override void OnOutputDataReceived(string outputData) - { - // Watch for "port selected" messages, and when observed, - // store the IP (IPv4/IPv6) and port number - // so we can use it when making HTTP requests. The child process will always send - // one of these messages before it sends a "ready for connections" message. - var match = string.IsNullOrEmpty(_endpoint) ? EndpointMessageRegex.Match(outputData) : null; - if (match != null && match.Success) - { - var port = int.Parse(match.Groups[2].Captures[0].Value); - var resolvedIpAddress = match.Groups[1].Captures[0].Value; - - //IPv6 must be wrapped with [] brackets - resolvedIpAddress = resolvedIpAddress == "::1" ? $"[{resolvedIpAddress}]" : resolvedIpAddress; - _endpoint = $"http://{resolvedIpAddress}:{port}"; - } - else - { - base.OnOutputDataReceived(outputData); - } - } - - protected override void Dispose(bool disposing) - { - base.Dispose(disposing); - - if (!_disposed) - { - if (disposing) - { - _client.Dispose(); - } - - _disposed = true; - } - } - -#pragma warning disable 649 // These properties are populated via JSON deserialization - private class RpcJsonResponse - { - public string ErrorMessage { get; set; } - public string ErrorDetails { get; set; } - } -#pragma warning restore 649 - } -} diff --git a/src/Middleware/NodeServices/src/HostingModels/INodeInstance.cs b/src/Middleware/NodeServices/src/HostingModels/INodeInstance.cs deleted file mode 100644 index 00bc1277bab3..000000000000 --- a/src/Middleware/NodeServices/src/HostingModels/INodeInstance.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.NodeServices.HostingModels -{ - /// - /// Represents an instance of Node.js to which Remote Procedure Calls (RPC) may be sent. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public interface INodeInstance : IDisposable - { - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// A that can be used to cancel the invocation. - /// The path to the Node.js module (i.e., JavaScript file) relative to your project root that contains the code to be invoked. - /// If set, specifies the CommonJS export to be invoked. If not set, the module's default CommonJS export itself must be a function to be invoked. - /// Any sequence of JSON-serializable arguments to be passed to the Node.js function. - /// A representing the completion of the RPC call. - Task InvokeExportAsync(CancellationToken cancellationToken, string moduleName, string exportNameOrNull, params object[] args); - } -} diff --git a/src/Middleware/NodeServices/src/HostingModels/NodeInvocationException.cs b/src/Middleware/NodeServices/src/HostingModels/NodeInvocationException.cs deleted file mode 100644 index 6e4b97b4bef7..000000000000 --- a/src/Middleware/NodeServices/src/HostingModels/NodeInvocationException.cs +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.NodeServices.HostingModels -{ - /// - /// Represents an exception caused by invoking Node.js code. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class NodeInvocationException : Exception - { - /// - /// If true, indicates that the invocation failed because the Node.js instance could not be reached. For example, - /// it might have already shut down or previously crashed. - /// - public bool NodeInstanceUnavailable { get; private set; } - - /// - /// If true, indicates that even though the invocation failed because the Node.js instance could not be reached - /// or needs to be restarted, that Node.js instance may remain alive for a period in order to complete any - /// outstanding requests. - /// - public bool AllowConnectionDraining { get; private set;} - - /// - /// Creates a new instance of . - /// - /// A description of the exception. - /// Additional information, such as a Node.js stack trace, representing the exception. - public NodeInvocationException(string message, string details) - : base(message + Environment.NewLine + details) - { - } - - /// - /// Creates a new instance of . - /// - /// A description of the exception. - /// Additional information, such as a Node.js stack trace, representing the exception. - /// Specifies a value for the flag. - /// Specifies a value for the flag. - public NodeInvocationException(string message, string details, bool nodeInstanceUnavailable, bool allowConnectionDraining) - : this(message, details) - { - // Reject a meaningless combination of flags - if (allowConnectionDraining && !nodeInstanceUnavailable) - { - throw new ArgumentException( - $"The '${ nameof(allowConnectionDraining) }' parameter cannot be true " + - $"unless the '${ nameof(nodeInstanceUnavailable) }' parameter is also true."); - } - - NodeInstanceUnavailable = nodeInstanceUnavailable; - AllowConnectionDraining = allowConnectionDraining; - } - } -} diff --git a/src/Middleware/NodeServices/src/HostingModels/NodeInvocationInfo.cs b/src/Middleware/NodeServices/src/HostingModels/NodeInvocationInfo.cs deleted file mode 100644 index 7d32eacb2699..000000000000 --- a/src/Middleware/NodeServices/src/HostingModels/NodeInvocationInfo.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.NodeServices.HostingModels -{ - /// - /// Describes an RPC call sent from .NET code to Node.js code. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class NodeInvocationInfo - { - /// - /// Specifies the path to the Node.js module (i.e., .js file) relative to the project root. - /// - public string ModuleName { get; set; } - - /// - /// If set, specifies the name of CommonJS function export to be invoked. - /// If not set, the Node.js module's default export must itself be a function to be invoked. - /// - public string ExportedFunctionName { get; set; } - - /// - /// A sequence of JSON-serializable arguments to be passed to the Node.js function being invoked. - /// - public object[] Args { get; set; } - } -} diff --git a/src/Middleware/NodeServices/src/HostingModels/NodeServicesOptionsExtensions.cs b/src/Middleware/NodeServices/src/HostingModels/NodeServicesOptionsExtensions.cs deleted file mode 100644 index 674f0ee6dca2..000000000000 --- a/src/Middleware/NodeServices/src/HostingModels/NodeServicesOptionsExtensions.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.NodeServices.HostingModels -{ - /// - /// Extension methods that help with populating a object. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class NodeServicesOptionsExtensions - { - /// - /// Configures the service so that it will use out-of-process - /// Node.js instances and perform RPC calls over HTTP. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static void UseHttpHosting(this NodeServicesOptions options) - { - options.NodeInstanceFactory = () => new HttpNodeInstance(options); - } - } -} diff --git a/src/Middleware/NodeServices/src/HostingModels/OutOfProcessNodeInstance.cs b/src/Middleware/NodeServices/src/HostingModels/OutOfProcessNodeInstance.cs deleted file mode 100644 index cf68baa338b0..000000000000 --- a/src/Middleware/NodeServices/src/HostingModels/OutOfProcessNodeInstance.cs +++ /dev/null @@ -1,479 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Logging; - -namespace Microsoft.AspNetCore.NodeServices.HostingModels -{ - /// - /// Class responsible for launching a Node child process on the local machine, determining when it is ready to - /// accept invocations, detecting if it dies on its own, and finally terminating it on disposal. - /// - /// This abstract base class uses the input/output streams of the child process to perform a simple handshake - /// to determine when the child process is ready to accept invocations. This is agnostic to the mechanism that - /// derived classes use to actually perform the invocations (e.g., they could use HTTP-RPC, or a binary TCP - /// protocol, or any other RPC-type mechanism). - /// - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public abstract class OutOfProcessNodeInstance : INodeInstance - { - /// - /// The to which the Node.js instance's stdout/stderr is being redirected. - /// - protected readonly ILogger OutputLogger; - - private const string ConnectionEstablishedMessage = "[Microsoft.AspNetCore.NodeServices:Listening]"; - private readonly TaskCompletionSource _connectionIsReadySource = new TaskCompletionSource(); - private bool _disposed; - private readonly StringAsTempFile _entryPointScript; - private FileSystemWatcher _fileSystemWatcher; - private int _invocationTimeoutMilliseconds; - private bool _launchWithDebugging; - private readonly Process _nodeProcess; - private int? _nodeDebuggingPort; - private bool _nodeProcessNeedsRestart; - private readonly string[] _watchFileExtensions; - - /// - /// Creates a new instance of . - /// - /// The path to the entry point script that the Node instance should load and execute. - /// The root path of the current project. This is used when resolving Node.js module paths relative to the project root. - /// The filename extensions that should be watched within the project root. The Node instance will automatically shut itself down if any matching file changes. - /// Additional command-line arguments to be passed to the Node.js instance. - /// A token that indicates when the host application is stopping. - /// The to which the Node.js instance's stdout/stderr (and other log information) should be written. - /// Environment variables to be set on the Node.js process. - /// The maximum duration, in milliseconds, to wait for RPC calls to complete. - /// If true, passes a flag to the Node.js process telling it to accept V8 debugger connections. - /// If debugging is enabled, the Node.js process should listen for V8 debugger connections on this port. - public OutOfProcessNodeInstance( - string entryPointScript, - string projectPath, - string[] watchFileExtensions, - string commandLineArguments, - CancellationToken applicationStoppingToken, - ILogger nodeOutputLogger, - IDictionary environmentVars, - int invocationTimeoutMilliseconds, - bool launchWithDebugging, - int debuggingPort) - { - if (nodeOutputLogger == null) - { - throw new ArgumentNullException(nameof(nodeOutputLogger)); - } - - OutputLogger = nodeOutputLogger; - _entryPointScript = new StringAsTempFile(entryPointScript, applicationStoppingToken); - _invocationTimeoutMilliseconds = invocationTimeoutMilliseconds; - _launchWithDebugging = launchWithDebugging; - - var startInfo = PrepareNodeProcessStartInfo(_entryPointScript.FileName, projectPath, commandLineArguments, - environmentVars, _launchWithDebugging, debuggingPort); - _nodeProcess = LaunchNodeProcess(startInfo); - _watchFileExtensions = watchFileExtensions; - _fileSystemWatcher = BeginFileWatcher(projectPath); - ConnectToInputOutputStreams(); - } - - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// A that can be used to cancel the invocation. - /// The path to the Node.js module (i.e., JavaScript file) relative to your project root that contains the code to be invoked. - /// If set, specifies the CommonJS export to be invoked. If not set, the module's default CommonJS export itself must be a function to be invoked. - /// Any sequence of JSON-serializable arguments to be passed to the Node.js function. - /// A representing the completion of the RPC call. - public async Task InvokeExportAsync( - CancellationToken cancellationToken, string moduleName, string exportNameOrNull, params object[] args) - { - if (_nodeProcess.HasExited || _nodeProcessNeedsRestart) - { - // This special kind of exception triggers a transparent retry - NodeServicesImpl will launch - // a new Node instance and pass the invocation to that one instead. - // Note that if the Node process is listening for debugger connections, then we need it to shut - // down immediately and not stay open for connection draining (because if it did, the new Node - // instance wouldn't able to start, because the old one would still hold the debugging port). - var message = _nodeProcess.HasExited - ? "The Node process has exited" - : "The Node process needs to restart"; - throw new NodeInvocationException( - message, - details: null, - nodeInstanceUnavailable: true, - allowConnectionDraining: !_launchWithDebugging); - } - - // Construct a new cancellation token that combines the supplied token with the configured invocation - // timeout. Technically we could avoid wrapping the cancellationToken if no timeout is configured, - // but that's not really a major use case, since timeouts are enabled by default. - using (var timeoutSource = new CancellationTokenSource()) - using (var combinedCancellationTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, timeoutSource.Token)) - { - if (_invocationTimeoutMilliseconds > 0) - { - timeoutSource.CancelAfter(_invocationTimeoutMilliseconds); - } - - // By overwriting the supplied cancellation token, we ensure that it isn't accidentally used - // below. We only want to pass through the token that respects timeouts. - cancellationToken = combinedCancellationTokenSource.Token; - var connectionDidSucceed = false; - - try - { - // Wait until the connection is established. This will throw if the connection fails to initialize, - // or if cancellation is requested first. Note that we can't really cancel the "establishing connection" - // task because that's shared with all callers, but we can stop waiting for it if this call is cancelled. - await _connectionIsReadySource.Task.OrThrowOnCancellation(cancellationToken); - connectionDidSucceed = true; - - return await InvokeExportAsync(new NodeInvocationInfo - { - ModuleName = moduleName, - ExportedFunctionName = exportNameOrNull, - Args = args - }, cancellationToken); - } - catch (TaskCanceledException) - { - if (timeoutSource.IsCancellationRequested) - { - // It was very common for developers to report 'TaskCanceledException' when encountering almost any - // trouble when using NodeServices. Now we have a default invocation timeout, and attempt to give - // a more descriptive exception message if it happens. - if (!connectionDidSucceed) - { - // This is very unlikely, but for debugging, it's still useful to differentiate it from the - // case below. - throw new NodeInvocationException( - $"Attempt to connect to Node timed out after {_invocationTimeoutMilliseconds}ms.", - string.Empty); - } - else - { - // Developers encounter this fairly often (if their Node code fails without invoking the callback, - // all that the .NET side knows is that the invocation eventually times out). Previously, this surfaced - // as a TaskCanceledException, but this led to a lot of issue reports. Now we throw the following - // descriptive error. - throw new NodeInvocationException( - $"The Node invocation timed out after {_invocationTimeoutMilliseconds}ms.", - $"You can change the timeout duration by setting the {NodeServicesOptions.TimeoutConfigPropertyName} " - + $"property on {nameof(NodeServicesOptions)}.\n\n" - + "The first debugging step is to ensure that your Node.js function always invokes the supplied " - + "callback (or throws an exception synchronously), even if it encounters an error. Otherwise, " - + "the .NET code has no way to know that it is finished or has failed." - ); - } - } - else - { - throw; - } - } - } - } - - /// - /// Disposes this instance. - /// - public void Dispose() - { - Dispose(true); - GC.SuppressFinalize(this); - } - - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// Specifies the Node.js function to be invoked and arguments to be passed to it. - /// A that can be used to cancel the invocation. - /// A representing the completion of the RPC call. - protected abstract Task InvokeExportAsync( - NodeInvocationInfo invocationInfo, - CancellationToken cancellationToken); - - /// - /// Configures a instance describing how to launch the Node.js process. - /// - /// The entrypoint JavaScript file that the Node.js process should execute. - /// The root path of the project. This is used when locating Node.js modules relative to the project root. - /// Command-line arguments to be passed to the Node.js process. - /// Environment variables to be set on the Node.js process. - /// If true, passes a flag to the Node.js process telling it to accept V8 Inspector connections. - /// If debugging is enabled, the Node.js process should listen for V8 Inspector connections on this port. - /// - protected virtual ProcessStartInfo PrepareNodeProcessStartInfo( - string entryPointFilename, string projectPath, string commandLineArguments, - IDictionary environmentVars, bool launchWithDebugging, int debuggingPort) - { - // This method is virtual, as it provides a way to override the NODE_PATH or the path to node.exe - string debuggingArgs; - if (launchWithDebugging) - { - debuggingArgs = debuggingPort != default(int) ? $"--inspect={debuggingPort} " : "--inspect "; - _nodeDebuggingPort = debuggingPort; - } - else - { - debuggingArgs = string.Empty; - } - - var thisProcessPid = Process.GetCurrentProcess().Id; - var startInfo = new ProcessStartInfo("node") - { - Arguments = $"{debuggingArgs}\"{entryPointFilename}\" --parentPid {thisProcessPid} {commandLineArguments ?? string.Empty}", - UseShellExecute = false, - RedirectStandardInput = true, - RedirectStandardOutput = true, - RedirectStandardError = true, - WorkingDirectory = projectPath - }; - - // Append environment vars - if (environmentVars != null) - { - foreach (var envVarKey in environmentVars.Keys) - { - var envVarValue = environmentVars[envVarKey]; - if (envVarValue != null) - { - SetEnvironmentVariable(startInfo, envVarKey, envVarValue); - } - } - } - - // Append projectPath to NODE_PATH so it can locate node_modules - var existingNodePath = Environment.GetEnvironmentVariable("NODE_PATH") ?? string.Empty; - if (existingNodePath != string.Empty) - { - existingNodePath += Path.PathSeparator; - } - - var nodePathValue = existingNodePath + Path.Combine(projectPath, "node_modules"); - SetEnvironmentVariable(startInfo, "NODE_PATH", nodePathValue); - - return startInfo; - } - - /// - /// Virtual method invoked whenever the Node.js process emits a line to its stdout. - /// - /// The line emitted to the Node.js process's stdout. - protected virtual void OnOutputDataReceived(string outputData) - { - OutputLogger.LogInformation(outputData); - } - - /// - /// Virtual method invoked whenever the Node.js process emits a line to its stderr. - /// - /// The line emitted to the Node.js process's stderr. - protected virtual void OnErrorDataReceived(string errorData) - { - OutputLogger.LogError(errorData); - } - - /// - /// Disposes the instance. - /// - /// True if the object is disposing or false if it is finalizing. - protected virtual void Dispose(bool disposing) - { - if (!_disposed) - { - if (disposing) - { - _entryPointScript.Dispose(); - EnsureFileSystemWatcherIsDisposed(); - } - - // Make sure the Node process is finished - // TODO: Is there a more graceful way to end it? Or does this still let it perform any cleanup? - if (_nodeProcess != null && !_nodeProcess.HasExited) - { - _nodeProcess.Kill(); - } - - _disposed = true; - } - } - - private void EnsureFileSystemWatcherIsDisposed() - { - if (_fileSystemWatcher != null) - { - _fileSystemWatcher.Dispose(); - _fileSystemWatcher = null; - } - } - - private static void SetEnvironmentVariable(ProcessStartInfo startInfo, string name, string value) - { - startInfo.Environment[name] = value; - } - - private static Process LaunchNodeProcess(ProcessStartInfo startInfo) - { - try { - var process = Process.Start(startInfo); - - // On Mac at least, a killed child process is left open as a zombie until the parent - // captures its exit code. We don't need the exit code for this process, and don't want - // to use process.WaitForExit() explicitly (we'd have to block the thread until it really - // has exited), but we don't want to leave zombies lying around either. It's sufficient - // to use process.EnableRaisingEvents so that .NET will grab the exit code and let the - // zombie be cleaned away without having to block our thread. - process.EnableRaisingEvents = true; - - return process; - } catch (Exception ex) { - var message = "Failed to start Node process. To resolve this:.\n\n" - + "[1] Ensure that Node.js is installed and can be found in one of the PATH directories.\n" - + $" Current PATH enviroment variable is: { Environment.GetEnvironmentVariable("PATH") }\n" - + " Make sure the Node executable is in one of those directories, or update your PATH.\n\n" - + "[2] See the InnerException for further details of the cause."; - throw new InvalidOperationException(message, ex); - } - } - - private static string UnencodeNewlines(string str) - { - if (str != null) - { - // The token here needs to match the const in OverrideStdOutputs.ts. - // See the comment there for why we're doing this. - str = str.Replace("__ns_newline__", Environment.NewLine); - } - - return str; - } - - private void ConnectToInputOutputStreams() - { - var initializationIsCompleted = false; - - _nodeProcess.OutputDataReceived += (sender, evt) => - { - if (evt.Data == ConnectionEstablishedMessage && !initializationIsCompleted) - { - _connectionIsReadySource.SetResult(null); - initializationIsCompleted = true; - } - else if (evt.Data != null) - { - OnOutputDataReceived(UnencodeNewlines(evt.Data)); - } - }; - - _nodeProcess.ErrorDataReceived += (sender, evt) => - { - if (evt.Data != null) - { - if (_launchWithDebugging && IsDebuggerMessage(evt.Data)) - { - OutputLogger.LogWarning(evt.Data); - } - else - { - OnErrorDataReceived(UnencodeNewlines(evt.Data)); - } - } - }; - - _nodeProcess.BeginOutputReadLine(); - _nodeProcess.BeginErrorReadLine(); - } - - private static bool IsDebuggerMessage(string message) - { - return message.StartsWith("Debugger attached", StringComparison.Ordinal) || - message.StartsWith("Debugger listening ", StringComparison.Ordinal) || - message.StartsWith("To start debugging", StringComparison.Ordinal) || - message.Equals("Warning: This is an experimental feature and could change at any time.", StringComparison.Ordinal) || - message.Equals("For help see https://nodejs.org/en/docs/inspector", StringComparison.Ordinal) || - message.Contains("chrome-devtools:"); - } - - private FileSystemWatcher BeginFileWatcher(string rootDir) - { - if (_watchFileExtensions == null || _watchFileExtensions.Length == 0) - { - // Nothing to watch - return null; - } - - var watcher = new FileSystemWatcher(rootDir) - { - IncludeSubdirectories = true, - NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName - }; - watcher.Changed += OnFileChanged; - watcher.Created += OnFileChanged; - watcher.Deleted += OnFileChanged; - watcher.Renamed += OnFileRenamed; - watcher.EnableRaisingEvents = true; - return watcher; - } - - private void OnFileChanged(object source, FileSystemEventArgs e) - { - if (IsFilenameBeingWatched(e.FullPath)) - { - RestartDueToFileChange(e.FullPath); - } - } - - private void OnFileRenamed(object source, RenamedEventArgs e) - { - if (IsFilenameBeingWatched(e.OldFullPath) || IsFilenameBeingWatched(e.FullPath)) - { - RestartDueToFileChange(e.OldFullPath); - } - } - - private bool IsFilenameBeingWatched(string fullPath) - { - if (string.IsNullOrEmpty(fullPath)) - { - return false; - } - else - { - var actualExtension = Path.GetExtension(fullPath) ?? string.Empty; - return _watchFileExtensions.Any(actualExtension.Equals); - } - } - - private void RestartDueToFileChange(string fullPath) - { - OutputLogger.LogInformation($"Node will restart because file changed: {fullPath}"); - - _nodeProcessNeedsRestart = true; - - // There's no need to watch for any more changes, since we're already restarting, and if the - // restart takes some time (e.g., due to connection draining), we could end up getting duplicate - // notifications. - EnsureFileSystemWatcherIsDisposed(); - } - - /// - /// Implements the finalization part of the IDisposable pattern by calling Dispose(false). - /// - ~OutOfProcessNodeInstance() - { - Dispose(false); - } - } -} diff --git a/src/Middleware/NodeServices/src/INodeServices.cs b/src/Middleware/NodeServices/src/INodeServices.cs deleted file mode 100644 index a88ece3c5c7f..000000000000 --- a/src/Middleware/NodeServices/src/INodeServices.cs +++ /dev/null @@ -1,58 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.NodeServices -{ - /// - /// Represents the ability to invoke code in a Node.js environment. Although the underlying Node.js instance - /// might change over time (e.g., the process might be restarted), the instance - /// will remain constant. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public interface INodeServices : IDisposable - { - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// The path to the Node.js module (i.e., JavaScript file) relative to your project root whose default CommonJS export is the function to be invoked. - /// Any sequence of JSON-serializable arguments to be passed to the Node.js function. - /// A representing the completion of the RPC call. - Task InvokeAsync(string moduleName, params object[] args); - - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// A that can be used to cancel the invocation. - /// The path to the Node.js module (i.e., JavaScript file) relative to your project root whose default CommonJS export is the function to be invoked. - /// Any sequence of JSON-serializable arguments to be passed to the Node.js function. - /// A representing the completion of the RPC call. - Task InvokeAsync(CancellationToken cancellationToken, string moduleName, params object[] args); - - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// The path to the Node.js module (i.e., JavaScript file) relative to your project root that contains the code to be invoked. - /// Specifies the CommonJS export to be invoked. - /// Any sequence of JSON-serializable arguments to be passed to the Node.js function. - /// A representing the completion of the RPC call. - Task InvokeExportAsync(string moduleName, string exportedFunctionName, params object[] args); - - /// - /// Asynchronously invokes code in the Node.js instance. - /// - /// The JSON-serializable data type that the Node.js code will asynchronously return. - /// A that can be used to cancel the invocation. - /// The path to the Node.js module (i.e., JavaScript file) relative to your project root that contains the code to be invoked. - /// Specifies the CommonJS export to be invoked. - /// Any sequence of JSON-serializable arguments to be passed to the Node.js function. - /// A representing the completion of the RPC call. - Task InvokeExportAsync(CancellationToken cancellationToken, string moduleName, string exportedFunctionName, params object[] args); - } -} diff --git a/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj b/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj deleted file mode 100644 index 33f90fc61f59..000000000000 --- a/src/Middleware/NodeServices/src/Microsoft.AspNetCore.NodeServices.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - Invoke Node.js modules at runtime in ASP.NET Core applications. - $(DefaultNetCoreTargetFramework) - false - false - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Middleware/NodeServices/src/NodeServicesImpl.cs b/src/Middleware/NodeServices/src/NodeServicesImpl.cs deleted file mode 100644 index 621a9af7cc1f..000000000000 --- a/src/Middleware/NodeServices/src/NodeServicesImpl.cs +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.NodeServices.HostingModels; - -namespace Microsoft.AspNetCore.NodeServices -{ - /// - /// Default implementation of INodeServices. This is the primary API surface through which developers - /// make use of this package. It provides simple "InvokeAsync" methods that dispatch calls to the - /// correct Node instance, creating and destroying those instances as needed. - /// - /// If a Node instance dies (or none was yet created), this class takes care of creating a new one. - /// If a Node instance signals that it needs to be restarted (e.g., because a file changed), then this - /// class will create a new instance and dispatch future calls to it, while keeping the old instance - /// alive for a defined period so that any in-flight RPC calls can complete. This latter feature is - /// analogous to the "connection draining" feature implemented by HTTP load balancers. - /// - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal class NodeServicesImpl : INodeServices - { - private static TimeSpan ConnectionDrainingTimespan = TimeSpan.FromSeconds(15); - private Func _nodeInstanceFactory; - private INodeInstance _currentNodeInstance; - private object _currentNodeInstanceAccessLock = new object(); - private Exception _instanceDelayedDisposalException; - - internal NodeServicesImpl(Func nodeInstanceFactory) - { - _nodeInstanceFactory = nodeInstanceFactory; - } - - public Task InvokeAsync(string moduleName, params object[] args) - { - return InvokeExportAsync(moduleName, null, args); - } - - public Task InvokeAsync(CancellationToken cancellationToken, string moduleName, params object[] args) - { - return InvokeExportAsync(cancellationToken, moduleName, null, args); - } - - public Task InvokeExportAsync(string moduleName, string exportedFunctionName, params object[] args) - { - return InvokeExportWithPossibleRetryAsync(moduleName, exportedFunctionName, args, /* allowRetry */ true, CancellationToken.None); - } - - public Task InvokeExportAsync(CancellationToken cancellationToken, string moduleName, string exportedFunctionName, params object[] args) - { - return InvokeExportWithPossibleRetryAsync(moduleName, exportedFunctionName, args, /* allowRetry */ true, cancellationToken); - } - - private async Task InvokeExportWithPossibleRetryAsync(string moduleName, string exportedFunctionName, object[] args, bool allowRetry, CancellationToken cancellationToken) - { - ThrowAnyOutstandingDelayedDisposalException(); - var nodeInstance = GetOrCreateCurrentNodeInstance(); - - try - { - return await nodeInstance.InvokeExportAsync(cancellationToken, moduleName, exportedFunctionName, args); - } - catch (NodeInvocationException ex) - { - // If the Node instance can't complete the invocation because it needs to restart (e.g., because the underlying - // Node process has exited, or a file it depends on has changed), then we make one attempt to restart transparently. - if (allowRetry && ex.NodeInstanceUnavailable) - { - // Perform the retry after clearing away the old instance - // Since we disposal is delayed even though the node instance is replaced immediately, this produces the - // "connection draining" feature whereby in-flight RPC calls are given a certain period to complete. - lock (_currentNodeInstanceAccessLock) - { - if (_currentNodeInstance == nodeInstance) - { - var disposalDelay = ex.AllowConnectionDraining ? ConnectionDrainingTimespan : TimeSpan.Zero; - DisposeNodeInstance(_currentNodeInstance, disposalDelay); - _currentNodeInstance = null; - } - } - - // One the next call, don't allow retries, because we could get into an infinite retry loop, or a long retry - // loop that masks an underlying problem. A newly-created Node instance should be able to accept invocations, - // or something more serious must be wrong. - return await InvokeExportWithPossibleRetryAsync(moduleName, exportedFunctionName, args, /* allowRetry */ false, cancellationToken); - } - else - { - throw; - } - } - } - - public void Dispose() - { - lock (_currentNodeInstanceAccessLock) - { - if (_currentNodeInstance != null) - { - DisposeNodeInstance(_currentNodeInstance, delay: TimeSpan.Zero); - _currentNodeInstance = null; - } - } - } - - private void DisposeNodeInstance(INodeInstance nodeInstance, TimeSpan delay) - { - if (delay == TimeSpan.Zero) - { - nodeInstance.Dispose(); - } - else - { - Task.Run(async () => { - try - { - await Task.Delay(delay); - nodeInstance.Dispose(); - } - catch(Exception ex) - { - // Nothing's waiting for the delayed disposal task, so any exceptions in it would - // by default just get ignored. To make these discoverable, capture them here so - // they can be rethrown to the next caller to InvokeExportAsync. - _instanceDelayedDisposalException = ex; - } - }); - } - } - - private void ThrowAnyOutstandingDelayedDisposalException() - { - if (_instanceDelayedDisposalException != null) - { - var ex = _instanceDelayedDisposalException; - _instanceDelayedDisposalException = null; - throw new AggregateException( - "A previous attempt to dispose a Node instance failed. See InnerException for details.", - ex); - } - } - - private INodeInstance GetOrCreateCurrentNodeInstance() - { - var instance = _currentNodeInstance; - if (instance == null) - { - lock (_currentNodeInstanceAccessLock) - { - instance = _currentNodeInstance; - if (instance == null) - { - instance = _currentNodeInstance = CreateNewNodeInstance(); - } - } - } - - return instance; - } - - private INodeInstance CreateNewNodeInstance() - { - return _nodeInstanceFactory(); - } - } -} diff --git a/src/Middleware/NodeServices/src/TypeScript/HttpNodeInstanceEntryPoint.ts b/src/Middleware/NodeServices/src/TypeScript/HttpNodeInstanceEntryPoint.ts deleted file mode 100644 index bd2af22a288c..000000000000 --- a/src/Middleware/NodeServices/src/TypeScript/HttpNodeInstanceEntryPoint.ts +++ /dev/null @@ -1,97 +0,0 @@ -// Limit dependencies to core Node modules. This means the code in this file has to be very low-level and unattractive, -// but simplifies things for the consumer of this module. -import './Util/PatchModuleResolutionLStat'; -import './Util/OverrideStdOutputs'; -import * as http from 'http'; -import * as path from 'path'; -import { parseArgs } from './Util/ArgsUtil'; -import { exitWhenParentExits } from './Util/ExitWhenParentExits'; -import { AddressInfo } from 'net'; - -// Webpack doesn't support dynamic requires for files not present at compile time, so grab a direct -// reference to Node's runtime 'require' function. -const dynamicRequire: (name: string) => any = eval('require'); - -const server = http.createServer((req, res) => { - readRequestBodyAsJson(req, bodyJson => { - let hasSentResult = false; - const callback = (errorValue, successValue) => { - if (!hasSentResult) { - hasSentResult = true; - if (errorValue) { - respondWithError(res, errorValue); - } else if (typeof successValue !== 'string') { - // Arbitrary object/number/etc - JSON-serialize it - let successValueJson: string; - try { - successValueJson = JSON.stringify(successValue); - } catch (ex) { - // JSON serialization error - pass it back to .NET - respondWithError(res, ex); - return; - } - res.setHeader('Content-Type', 'application/json'); - res.end(successValueJson); - } else { - // String - can bypass JSON-serialization altogether - res.setHeader('Content-Type', 'text/plain'); - res.end(successValue); - } - } - }; - - // Support streamed responses - Object.defineProperty(callback, 'stream', { - enumerable: true, - get: function() { - if (!hasSentResult) { - hasSentResult = true; - res.setHeader('Content-Type', 'application/octet-stream'); - } - - return res; - } - }); - - try { - const resolvedPath = path.resolve(process.cwd(), bodyJson.moduleName); - const invokedModule = dynamicRequire(resolvedPath); - const func = bodyJson.exportedFunctionName ? invokedModule[bodyJson.exportedFunctionName] : invokedModule; - if (!func) { - throw new Error('The module "' + resolvedPath + '" has no export named "' + bodyJson.exportedFunctionName + '"'); - } - - func.apply(null, [callback].concat(bodyJson.args)); - } catch (synchronousException) { - callback(synchronousException, null); - } - }); -}); - -const parsedArgs = parseArgs(process.argv); -const requestedPortOrZero = parsedArgs.port || 0; // 0 means 'let the OS decide' -server.listen(requestedPortOrZero, 'localhost', function () { - const addressInfo = server.address() as AddressInfo; - - // Signal to HttpNodeHost which loopback IP address (IPv4 or IPv6) and port it should make its HTTP connections on - console.log('[Microsoft.AspNetCore.NodeServices.HttpNodeHost:Listening on {' + addressInfo.address + '} port ' + addressInfo.port + '\]'); - - // Signal to the NodeServices base class that we're ready to accept invocations - console.log('[Microsoft.AspNetCore.NodeServices:Listening]'); -}); - -exitWhenParentExits(parseInt(parsedArgs.parentPid), /* ignoreSigint */ true); - -function readRequestBodyAsJson(request, callback) { - let requestBodyAsString = ''; - request.on('data', chunk => { requestBodyAsString += chunk; }); - request.on('end', () => { callback(JSON.parse(requestBodyAsString)); }); -} - -function respondWithError(res: http.ServerResponse, errorValue: any) { - res.statusCode = 500; - res.end(JSON.stringify({ - errorMessage: errorValue.message || errorValue, - errorDetails: errorValue.stack || null - })); -} diff --git a/src/Middleware/NodeServices/src/TypeScript/Util/ArgsUtil.ts b/src/Middleware/NodeServices/src/TypeScript/Util/ArgsUtil.ts deleted file mode 100644 index cfafb5d2c69d..000000000000 --- a/src/Middleware/NodeServices/src/TypeScript/Util/ArgsUtil.ts +++ /dev/null @@ -1,18 +0,0 @@ -export function parseArgs(args: string[]): any { - // Very simplistic parsing which is sufficient for the cases needed. We don't want to bring in any external - // dependencies (such as an args-parsing library) to this file. - const result = {}; - let currentKey = null; - args.forEach(arg => { - if (arg.indexOf('--') === 0) { - const argName = arg.substring(2); - result[argName] = undefined; - currentKey = argName; - } else if (currentKey) { - result[currentKey] = arg; - currentKey = null; - } - }); - - return result; -} diff --git a/src/Middleware/NodeServices/src/TypeScript/Util/ExitWhenParentExits.ts b/src/Middleware/NodeServices/src/TypeScript/Util/ExitWhenParentExits.ts deleted file mode 100644 index 43c865f352cc..000000000000 --- a/src/Middleware/NodeServices/src/TypeScript/Util/ExitWhenParentExits.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* -In general, we want the Node child processes to be terminated as soon as the parent .NET processes exit, -because we have no further use for them. If the .NET process shuts down gracefully, it will run its -finalizers, one of which (in OutOfProcessNodeInstance.cs) will kill its associated Node process immediately. - -But if the .NET process is terminated forcefully (e.g., on Linux/OSX with 'kill -9'), then it won't have -any opportunity to shut down its child processes, and by default they will keep running. In this case, it's -up to the child process to detect this has happened and terminate itself. - -There are many possible approaches to detecting when a parent process has exited, most of which behave -differently between Windows and Linux/OS X: - - - On Windows, the parent process can mark its child as being a 'job' that should auto-terminate when - the parent does (http://stackoverflow.com/a/4657392). Not cross-platform. - - The child Node process can get a callback when the parent disconnects (process.on('disconnect', ...)). - But despite http://stackoverflow.com/a/16487966, no callback fires in any case I've tested (Windows / OS X). - - The child Node process can get a callback when its stdin/stdout are disconnected, as described at - http://stackoverflow.com/a/15693934. This works well on OS X, but calling stdout.resume() on Windows - causes the process to terminate prematurely. - - I don't know why, but on Windows, it's enough to invoke process.stdin.resume(). For some reason this causes - the child Node process to exit as soon as the parent one does, but I don't see this documented anywhere. - - You can poll to see if the parent process, or your stdin/stdout connection to it, is gone - - You can directly pass a parent process PID to the child, and then have the child poll to see if it's - still running (e.g., using process.kill(pid, 0), which doesn't kill it but just tests whether it exists, - as per https://nodejs.org/api/process.html#process_process_kill_pid_signal) - - Or, on each poll, you can try writing to process.stdout. If the parent has died, then this will throw. - However I don't see this documented anywhere. It would be nice if you could just poll for whether or not - process.stdout is still connected (without actually writing to it) but I haven't found any property whose - value changes until you actually try to write to it. - -Of these, the only cross-platform approach that is actually documented as a valid strategy is simply polling -to check whether the parent PID is still running. So that's what we do here. -*/ - -const pollIntervalMs = 1000; - -export function exitWhenParentExits(parentPid: number, ignoreSigint: boolean) { - setInterval(() => { - if (!processExists(parentPid)) { - // Can't log anything at this point, because out stdout was connected to the parent, - // but the parent is gone. - process.exit(); - } - }, pollIntervalMs); - - if (ignoreSigint) { - // Pressing ctrl+c in the terminal sends a SIGINT to all processes in the foreground process tree. - // By default, the Node process would then exit before the .NET process, because ASP.NET implements - // a delayed shutdown to allow ongoing requests to complete. - // - // This is problematic, because if Node exits first, the CopyToAsync code in ConditionalProxyMiddleware - // will experience a read fault, and logs a huge load of errors. Fortunately, since the Node process is - // already set up to shut itself down if it detects the .NET process is terminated, all we have to do is - // ignore the SIGINT. The Node process will then terminate automatically after the .NET process does. - // - // A better solution would be to have WebpackDevMiddleware listen for SIGINT and gracefully close any - // ongoing EventSource connections before letting the Node process exit, independently of the .NET - // process exiting. However, doing this well in general is very nontrivial (see all the discussion at - // https://github.com/nodejs/node/issues/2642). - process.on('SIGINT', () => { - console.log('Received SIGINT. Waiting for .NET process to exit...'); - }); - } -} - -function processExists(pid: number) { - try { - // Sending signal 0 - on all platforms - tests whether the process exists. As long as it doesn't - // throw, that means it does exist. - process.kill(pid, 0); - return true; - } catch (ex) { - // If the reason for the error is that we don't have permission to ask about this process, - // report that as a separate problem. - if (ex.code === 'EPERM') { - throw new Error(`Attempted to check whether process ${pid} was running, but got a permissions error.`); - } - - return false; - } -} diff --git a/src/Middleware/NodeServices/src/TypeScript/Util/OverrideStdOutputs.ts b/src/Middleware/NodeServices/src/TypeScript/Util/OverrideStdOutputs.ts deleted file mode 100644 index 01e4bc6de3d4..000000000000 --- a/src/Middleware/NodeServices/src/TypeScript/Util/OverrideStdOutputs.ts +++ /dev/null @@ -1,37 +0,0 @@ -// When Node writes to stdout/strerr, we capture that and convert the lines into calls on the -// active .NET ILogger. But by default, stdout/stderr don't have any way of distinguishing -// linebreaks inside log messages from the linebreaks that delimit separate log messages, -// so multiline strings will end up being written to the ILogger as multiple independent -// log messages. This makes them very hard to make sense of, especially when they represent -// something like stack traces. -// -// To fix this, we intercept stdout/stderr writes, and replace internal linebreaks with a -// marker token. When .NET receives the lines, it converts the marker tokens back to regular -// linebreaks within the logged messages. -// -// Note that it's better to do the interception at the stdout/stderr level, rather than at -// the console.log/console.error (etc.) level, because this takes place after any native -// message formatting has taken place (e.g., inserting values for % placeholders). -const findInternalNewlinesRegex = /\n(?!$)/g; -const encodedNewline = '__ns_newline__'; - -encodeNewlinesWrittenToStream(process.stdout); -encodeNewlinesWrittenToStream(process.stderr); - -function encodeNewlinesWrittenToStream(outputStream: NodeJS.WritableStream) { - const origWriteFunction = outputStream.write; - outputStream.write = function (value: any) { - // Only interfere with the write if it's definitely a string - if (typeof value === 'string') { - const argsClone = Array.prototype.slice.call(arguments, 0); - argsClone[0] = encodeNewlinesInString(value); - origWriteFunction.apply(this, argsClone); - } else { - origWriteFunction.apply(this, arguments); - } - }; -} - -function encodeNewlinesInString(str: string): string { - return str.replace(findInternalNewlinesRegex, encodedNewline); -} diff --git a/src/Middleware/NodeServices/src/TypeScript/Util/PatchModuleResolutionLStat.ts b/src/Middleware/NodeServices/src/TypeScript/Util/PatchModuleResolutionLStat.ts deleted file mode 100644 index de5185ff8b83..000000000000 --- a/src/Middleware/NodeServices/src/TypeScript/Util/PatchModuleResolutionLStat.ts +++ /dev/null @@ -1,48 +0,0 @@ -import * as path from 'path'; -const startsWith = (str: string, prefix: string) => str.substring(0, prefix.length) === prefix; -const appRootDir = process.cwd(); - -function patchedLStat(pathToStatLong: string, fsReqWrap?: any) { - try { - // If the lstat completes without errors, we don't modify its behavior at all - return origLStat.apply(this, arguments); - } catch(ex) { - const shouldOverrideError = - startsWith(ex.message, 'EPERM') // It's a permissions error - && typeof appRootDirLong === 'string' - && startsWith(appRootDirLong, pathToStatLong) // ... for an ancestor directory - && ex.stack.indexOf('Object.realpathSync ') >= 0; // ... during symlink resolution - - if (shouldOverrideError) { - // Fake the result to give the same result as an 'lstat' on the app root dir. - // This stops Node failing to load modules just because it doesn't know whether - // ancestor directories are symlinks or not. If there's a genuine file - // permissions issue, it will still surface later when Node actually - // tries to read the file. - return origLStat.call(this, appRootDir, fsReqWrap); - } else { - // In any other case, preserve the original error - throw ex; - } - } -}; - -// It's only necessary to apply this workaround on Windows -let appRootDirLong: string = null; -let origLStat: Function = null; -if (/^win/.test(process.platform)) { - try { - // Get the app's root dir in Node's internal "long" format (e.g., \\?\C:\dir\subdir) - appRootDirLong = (path as any)._makeLong(appRootDir); - - // Actually apply the patch, being as defensive as possible - const bindingFs = (process as any).binding('fs'); - origLStat = bindingFs.lstat; - if (typeof origLStat === 'function') { - bindingFs.lstat = patchedLStat; - } - } catch(ex) { - // If some future version of Node throws (e.g., to prevent use of process.binding()), - // don't apply the patch, but still let the application run. - } -} diff --git a/src/Middleware/NodeServices/src/TypeScript/tsconfig.json b/src/Middleware/NodeServices/src/TypeScript/tsconfig.json deleted file mode 100644 index 896fc88253a0..000000000000 --- a/src/Middleware/NodeServices/src/TypeScript/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "compilerOptions": { - "target": "es3", - "module": "commonjs", - "moduleResolution": "node", - "types": ["node"] - }, - "exclude": [ - "node_modules" - ] -} diff --git a/src/Middleware/NodeServices/src/Util/EmbeddedResourceReader.cs b/src/Middleware/NodeServices/src/Util/EmbeddedResourceReader.cs deleted file mode 100644 index 0c4c777e749e..000000000000 --- a/src/Middleware/NodeServices/src/Util/EmbeddedResourceReader.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Reflection; - -namespace Microsoft.AspNetCore.NodeServices -{ - /// - /// Contains methods for reading embedded resources. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class EmbeddedResourceReader - { - /// - /// Reads the specified embedded resource from a given assembly. - /// - /// Any in the assembly whose resource is to be read. - /// The path of the resource to be read. - /// The contents of the resource. - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static string Read(Type assemblyContainingType, string path) - { - var asm = assemblyContainingType.GetTypeInfo().Assembly; - var embeddedResourceName = asm.GetName().Name + path.Replace("/", "."); - - using (var stream = asm.GetManifestResourceStream(embeddedResourceName)) - using (var sr = new StreamReader(stream)) - { - return sr.ReadToEnd(); - } - } - } -} diff --git a/src/Middleware/NodeServices/src/Util/StringAsTempFile.cs b/src/Middleware/NodeServices/src/Util/StringAsTempFile.cs deleted file mode 100644 index ed9ee7617236..000000000000 --- a/src/Middleware/NodeServices/src/Util/StringAsTempFile.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Threading; - -namespace Microsoft.AspNetCore.NodeServices -{ - /// - /// Makes it easier to pass script files to Node in a way that's sure to clean up after the process exits. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public sealed class StringAsTempFile : IDisposable - { - private bool _disposedValue; - private bool _hasDeletedTempFile; - private object _fileDeletionLock = new object(); - private IDisposable _applicationLifetimeRegistration; - - /// - /// Create a new instance of . - /// - /// The contents of the temporary file to be created. - /// A token that indicates when the host application is stopping. - public StringAsTempFile(string content, CancellationToken applicationStoppingToken) - { - FileName = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - File.WriteAllText(FileName, content); - - // Because .NET finalizers don't reliably run when the process is terminating, also - // add event handlers for other shutdown scenarios. - _applicationLifetimeRegistration = applicationStoppingToken.Register(EnsureTempFileDeleted); - } - - /// - /// Specifies the filename of the temporary file. - /// - public string FileName { get; } - - /// - /// Disposes the instance and deletes the associated temporary file. - /// - public void Dispose() - { - DisposeImpl(true); - GC.SuppressFinalize(this); - } - - private void DisposeImpl(bool disposing) - { - if (!_disposedValue) - { - if (disposing) - { - // Dispose managed state - _applicationLifetimeRegistration.Dispose(); - } - - EnsureTempFileDeleted(); - - _disposedValue = true; - } - } - - private void EnsureTempFileDeleted() - { - lock (_fileDeletionLock) - { - if (!_hasDeletedTempFile) - { - File.Delete(FileName); - _hasDeletedTempFile = true; - } - } - } - - /// - /// Implements the finalization part of the IDisposable pattern by calling Dispose(false). - /// - ~StringAsTempFile() - { - DisposeImpl(false); - } - } -} diff --git a/src/Middleware/NodeServices/src/Util/TaskExtensions.cs b/src/Middleware/NodeServices/src/Util/TaskExtensions.cs deleted file mode 100644 index 8743b9e4b5cd..000000000000 --- a/src/Middleware/NodeServices/src/Util/TaskExtensions.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.NodeServices -{ - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal static class TaskExtensions - { - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static Task OrThrowOnCancellation(this Task task, CancellationToken cancellationToken) - { - return task.IsCompleted - ? task // If the task is already completed, no need to wrap it in a further layer of task - : task.ContinueWith( - _ => {}, // If the task completes, allow execution to continue - cancellationToken, - TaskContinuationOptions.ExecuteSynchronously, - TaskScheduler.Default); - } - - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static Task OrThrowOnCancellation(this Task task, CancellationToken cancellationToken) - { - return task.IsCompleted - ? task // If the task is already completed, no need to wrap it in a further layer of task - : task.ContinueWith( - t => t.Result, // If the task completes, pass through its result - cancellationToken, - TaskContinuationOptions.ExecuteSynchronously, - TaskScheduler.Default); - } - } -} diff --git a/src/Middleware/NodeServices/src/package.json b/src/Middleware/NodeServices/src/package.json deleted file mode 100644 index 4cf724341076..000000000000 --- a/src/Middleware/NodeServices/src/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "nodeservices", - "version": "1.0.0", - "description": "This is not really an NPM package and will not be published. This file exists only to reference compilation tools.", - "private": true, - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "webpack --mode production" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "devDependencies": { - "@types/node": "^10.9.2", - "ts-loader": "^4.5.0", - "typescript": "^3.0.1", - "webpack": "^4.17.1", - "webpack-cli": "^3.1.0" - } -} diff --git a/src/Middleware/NodeServices/src/webpack.config.js b/src/Middleware/NodeServices/src/webpack.config.js deleted file mode 100644 index af32593fb3ba..000000000000 --- a/src/Middleware/NodeServices/src/webpack.config.js +++ /dev/null @@ -1,24 +0,0 @@ -const path = require('path'); - -module.exports = { - target: 'node', - resolve: { - extensions: [ '.ts' ] - }, - module: { - rules: [ - { test: /\.ts$/, use: 'ts-loader' }, - ] - }, - entry: { - 'entrypoint-http': ['./TypeScript/HttpNodeInstanceEntryPoint'] - }, - output: { - libraryTarget: 'commonjs', - path: path.join(__dirname, 'Content', 'Node'), - filename: '[name].js' - }, - optimization: { - minimize: false - } -}; diff --git a/src/Middleware/NodeServices/src/yarn.lock b/src/Middleware/NodeServices/src/yarn.lock deleted file mode 100644 index 09857158cf6a..000000000000 --- a/src/Middleware/NodeServices/src/yarn.lock +++ /dev/null @@ -1,2962 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/node@^10.9.2": - version "10.9.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.9.2.tgz#f0ab8dced5cd6c56b26765e1c0d9e4fdcc9f2a00" - integrity sha512-pwZnkVyCGJ3LsQ0/3flQK5lCFao4esIzwUVzzk5NvL9vnkEyDhNf4fhHzUMHvyr56gNZywWTS2MR0euabMSz4A== - -"@webassemblyjs/ast@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.5.13.tgz#81155a570bd5803a30ec31436bc2c9c0ede38f25" - integrity sha512-49nwvW/Hx9i+OYHg+mRhKZfAlqThr11Dqz8TsrvqGKMhdI2ijy3KBJOun2Z4770TPjrIJhR6KxChQIDaz8clDA== - dependencies: - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/floating-point-hex-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.5.13.tgz#29ce0baa97411f70e8cce68ce9c0f9d819a4e298" - integrity sha512-vrvvB18Kh4uyghSKb0NTv+2WZx871WL2NzwMj61jcq2bXkyhRC+8Q0oD7JGVf0+5i/fKQYQSBCNMMsDMRVAMqA== - -"@webassemblyjs/helper-api-error@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.5.13.tgz#e49b051d67ee19a56e29b9aa8bd949b5b4442a59" - integrity sha512-dBh2CWYqjaDlvMmRP/kudxpdh30uXjIbpkLj9HQe+qtYlwvYjPRjdQXrq1cTAAOUSMTtzqbXIxEdEZmyKfcwsg== - -"@webassemblyjs/helper-buffer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.5.13.tgz#873bb0a1b46449231137c1262ddfd05695195a1e" - integrity sha512-v7igWf1mHcpJNbn4m7e77XOAWXCDT76Xe7Is1VQFXc4K5jRcFrl9D0NrqM4XifQ0bXiuTSkTKMYqDxu5MhNljA== - dependencies: - debug "^3.1.0" - -"@webassemblyjs/helper-code-frame@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.5.13.tgz#1bd2181b6a0be14e004f0fe9f5a660d265362b58" - integrity sha512-yN6ScQQDFCiAXnVctdVO/J5NQRbwyTbQzsGzEgXsAnrxhjp0xihh+nNHQTMrq5UhOqTb5LykpJAvEv9AT0jnAQ== - dependencies: - "@webassemblyjs/wast-printer" "1.5.13" - -"@webassemblyjs/helper-fsm@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.5.13.tgz#cdf3d9d33005d543a5c5e5adaabf679ffa8db924" - integrity sha512-hSIKzbXjVMRvy3Jzhgu+vDd/aswJ+UMEnLRCkZDdknZO3Z9e6rp1DAs0tdLItjCFqkz9+0BeOPK/mk3eYvVzZg== - -"@webassemblyjs/helper-module-context@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.5.13.tgz#dc29ddfb51ed657655286f94a5d72d8a489147c5" - integrity sha512-zxJXULGPLB7r+k+wIlvGlXpT4CYppRz8fLUM/xobGHc9Z3T6qlmJD9ySJ2jknuktuuiR9AjnNpKYDECyaiX+QQ== - dependencies: - debug "^3.1.0" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.5.13.tgz#03245817f0a762382e61733146f5773def15a747" - integrity sha512-0n3SoNGLvbJIZPhtMFq0XmmnA/YmQBXaZKQZcW8maGKwLpVcgjNrxpFZHEOLKjXJYVN5Il8vSfG7nRX50Zn+aw== - -"@webassemblyjs/helper-wasm-section@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.5.13.tgz#efc76f44a10d3073b584b43c38a179df173d5c7d" - integrity sha512-IJ/goicOZ5TT1axZFSnlAtz4m8KEjYr12BNOANAwGFPKXM4byEDaMNXYowHMG0yKV9a397eU/NlibFaLwr1fbw== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/ieee754@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.5.13.tgz#573e97c8c12e4eebb316ca5fde0203ddd90b0364" - integrity sha512-TseswvXEPpG5TCBKoLx9tT7+/GMACjC1ruo09j46ULRZWYm8XHpDWaosOjTnI7kr4SRJFzA6MWoUkAB+YCGKKg== - dependencies: - ieee754 "^1.1.11" - -"@webassemblyjs/leb128@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.5.13.tgz#ab52ebab9cec283c1c1897ac1da833a04a3f4cee" - integrity sha512-0NRMxrL+GG3eISGZBmLBLAVjphbN8Si15s7jzThaw1UE9e5BY1oH49/+MA1xBzxpf1OW5sf9OrPDOclk9wj2yg== - dependencies: - long "4.0.0" - -"@webassemblyjs/utf8@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.5.13.tgz#6b53d2cd861cf94fa99c1f12779dde692fbc2469" - integrity sha512-Ve1ilU2N48Ew0lVGB8FqY7V7hXjaC4+PeZM+vDYxEd+R2iQ0q+Wb3Rw8v0Ri0+rxhoz6gVGsnQNb4FjRiEH/Ng== - -"@webassemblyjs/wasm-edit@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.5.13.tgz#c9cef5664c245cf11b3b3a73110c9155831724a8" - integrity sha512-X7ZNW4+Hga4f2NmqENnHke2V/mGYK/xnybJSIXImt1ulxbCOEs/A+ZK/Km2jgihjyVxp/0z0hwIcxC6PrkWtgw== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/helper-wasm-section" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - "@webassemblyjs/wast-printer" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/wasm-gen@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.5.13.tgz#8e6ea113c4b432fa66540189e79b16d7a140700e" - integrity sha512-yfv94Se8R73zmr8GAYzezFHc3lDwE/lBXQddSiIZEKZFuqy7yWtm3KMwA1uGbv5G1WphimJxboXHR80IgX1hQA== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wasm-opt@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.5.13.tgz#147aad7717a7ee4211c36b21a5f4c30dddf33138" - integrity sha512-IkXSkgzVhQ0QYAdIayuCWMmXSYx0dHGU8Ah/AxJf1gBvstMWVnzJnBwLsXLyD87VSBIcsqkmZ28dVb0mOC3oBg== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-buffer" "1.5.13" - "@webassemblyjs/wasm-gen" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - debug "^3.1.0" - -"@webassemblyjs/wasm-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.5.13.tgz#6f46516c5bb23904fbdf58009233c2dd8a54c72f" - integrity sha512-XnYoIcu2iqq8/LrtmdnN3T+bRjqYFjRHqWbqK3osD/0r/Fcv4d9ecRzjVtC29ENEuNTK4mQ9yyxCBCbK8S/cpg== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-wasm-bytecode" "1.5.13" - "@webassemblyjs/ieee754" "1.5.13" - "@webassemblyjs/leb128" "1.5.13" - "@webassemblyjs/utf8" "1.5.13" - -"@webassemblyjs/wast-parser@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.5.13.tgz#5727a705d397ae6a3ae99d7f5460acf2ec646eea" - integrity sha512-Lbz65T0LQ1LgzKiUytl34CwuhMNhaCLgrh0JW4rJBN6INnBB8NMwUfQM+FxTnLY9qJ+lHJL/gCM5xYhB9oWi4A== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/floating-point-hex-parser" "1.5.13" - "@webassemblyjs/helper-api-error" "1.5.13" - "@webassemblyjs/helper-code-frame" "1.5.13" - "@webassemblyjs/helper-fsm" "1.5.13" - long "^3.2.0" - mamacro "^0.0.3" - -"@webassemblyjs/wast-printer@1.5.13": - version "1.5.13" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.5.13.tgz#bb34d528c14b4f579e7ec11e793ec50ad7cd7c95" - integrity sha512-QcwogrdqcBh8Z+eUF8SG+ag5iwQSXxQJELBEHmLkk790wgQgnIMmntT2sMAMw53GiFNckArf5X0bsCA44j3lWQ== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/wast-parser" "1.5.13" - long "^3.2.0" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== - dependencies: - acorn "^5.0.0" - -acorn@^5.0.0, acorn@^5.6.2: - version "5.7.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.2.tgz#91fa871883485d06708800318404e72bfb26dcc5" - integrity sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw== - -ajv-keywords@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" - integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= - -ajv@^6.1.0: - version "6.5.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" - integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-escapes@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" - integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - integrity sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0= - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^1.1.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.4.1.tgz#99912d591836b5a6f5b345c0f07eefc08fc65d91" - integrity sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE= - dependencies: - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - integrity sha1-GdOGodntxufByF04iu28xW0zYC0= - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.0" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" - integrity sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big.js@^3.1.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" - integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - integrity sha1-RqoXUftqL5PuXmibsQh9SxTGwgU= - -bluebird@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" - integrity sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.0, braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" - integrity sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg= - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -camelcase@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - -chalk@^2.0.0, chalk@^2.3.0, chalk@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" - integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chardet@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.5.0.tgz#fe3ac73c00c3d865ffcc02a0682e2c20b6a06029" - integrity sha512-9ZTaoBaePSCFvNlNGrsyI8ZVACP2svUtq0DkM7t4K2ClAa96sqOIRjAzDTc8zXzFt1cZR46rRzLTiHFSJ+Qw0g== - -chokidar@^2.0.2: - version "2.0.4" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.4.tgz#356ff4e2b0e8e43e322d18a372460bbcf3accd26" - integrity sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.0" - braces "^2.3.0" - glob-parent "^3.1.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - lodash.debounce "^4.0.8" - normalize-path "^2.1.1" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - upath "^1.0.5" - optionalDependencies: - fsevents "^1.2.2" - -chownr@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" - integrity sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE= - -chrome-trace-event@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz#45a91bd2c20c9411f0963b5aaeb9a1b95e09cc48" - integrity sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A== - dependencies: - tslib "^1.9.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cli-cursor@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" - integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= - dependencies: - restore-cursor "^2.0.0" - -cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= - -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" - integrity sha1-E3kY1teCg/ffemt8WmPhQOaUJeY= - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" - integrity sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA= - dependencies: - date-now "^0.1.4" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -cyclist@~0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" - integrity sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA= - -date-now@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" - integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= - -debug@^2.1.2, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" - integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== - dependencies: - ms "2.0.0" - -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== - dependencies: - xregexp "4.0.0" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.5.1.tgz#b894a9dd90d3023fbf1c55a394fb858eb2066f1f" - integrity sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w== - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -des.js@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" - integrity sha1-wHTS4qpqipoH29YfmhXCzYPsjsw= - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.6.0.tgz#592903f5d80b38d037220541264d69a198fb3410" - integrity sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -elliptic@^6.0.0: - version "6.4.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.1.tgz#c2d0b7776911b86722c632c3c06c60f2f819939a" - integrity sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" - integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" - integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" - integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= - -events@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" - integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -external-editor@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.1.tgz#fc9638c4d7cde4f0bb82b12307a1a23912c492e3" - integrity sha512-e1neqvSt5pSwQcFnYc6yfGuJD2Q4336cdbHs5VeUO0zTkqPbrHMyw2q1r47fpfLWbvIG8H8A6YO3sck7upTV6Q== - dependencies: - chardet "^0.5.0" - iconv-lite "^0.4.22" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -figures@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" - integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= - dependencies: - escape-string-regexp "^1.0.5" - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-cache-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" - integrity sha1-kojj6ePMN0hxfTnq3hfPcfww7m8= - dependencies: - commondir "^1.0.1" - make-dir "^1.0.0" - pkg-dir "^2.0.0" - -find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flush-write-stream@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" - integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.4" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" - integrity sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ== - dependencies: - minipass "^2.2.1" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.2: - version "1.2.4" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.4.tgz#f41dcb1af2582af3692da36fc55cbd8e1041c426" - integrity sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg== - dependencies: - nan "^2.9.2" - node-pre-gyp "^0.10.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob@^7.0.5, glob@^7.1.2: - version "7.1.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" - integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules-path@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" - integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== - -graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -iconv-lite@^0.4.22: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -iconv-lite@^0.4.4: - version "0.4.21" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" - integrity sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw== - dependencies: - safer-buffer "^2.1.0" - -ieee754@^1.1.11, ieee754@^1.1.4: - version "1.1.12" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.12.tgz#50bf24e5b9c8bb98af4964c941cdb0918da7b60b" - integrity sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-walk@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.1.tgz#a83e62e7d272ac0e3b551aaa82831a19b69f82f8" - integrity sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ== - dependencies: - minimatch "^3.0.4" - -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -indexof@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" - integrity sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10= - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.3, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -inquirer@^6.0.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" - integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.0" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.0" - figures "^2.0.0" - lodash "^4.17.10" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.1.0" - string-width "^2.1.0" - strip-ansi "^4.0.0" - through "^2.3.6" - -interpret@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" - integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" - integrity sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A= - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json5@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - -loader-runner@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.0.tgz#f482aea82d543e07921700d5a46ef26fdac6b8a2" - integrity sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI= - -loader-utils@^1.0.2, loader-utils@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" - integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= - dependencies: - big.js "^3.1.3" - emojis-list "^2.0.0" - json5 "^0.5.0" - -locate-path@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" - integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= - -lodash@^4.17.10: - version "4.17.10" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" - integrity sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg== - -long@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" - integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== - -long@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/long/-/long-3.2.0.tgz#d821b7138ca1cb581c172990ef14db200b5c474b" - integrity sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s= - -lru-cache@^4.0.1, lru-cache@^4.1.1: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - -make-dir@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ== - dependencies: - pify "^3.0.0" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.4" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" - integrity sha1-6b296UogpawYsENA/Fdk1bCdkB0= - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - -memory-fs@^0.4.0, memory-fs@~0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -micromatch@^3.1.4, micromatch@^3.1.8: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minipass@^2.2.1, minipass@^2.2.4: - version "2.2.4" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.2.4.tgz#03c824d84551ec38a8d1bb5bc350a5a30a354a40" - integrity sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g== - dependencies: - safe-buffer "^5.1.1" - yallist "^3.0.0" - -minizlib@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.1.0.tgz#11e13658ce46bc3a70a267aac58359d1e0c29ceb" - integrity sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA== - dependencies: - minipass "^2.2.1" - -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^2.0.1" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" - integrity sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -mute-stream@0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= - -nan@^2.9.2: - version "2.11.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.0.tgz#574e360e4d954ab16966ec102c0c049fd961a099" - integrity sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -needle@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.0.tgz#f14efc69cee1024b72c8b21c7bdf94a731dc12fa" - integrity sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w== - dependencies: - debug "^2.1.2" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.5.0: - version "2.5.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.2.tgz#489105ce7bc54e709d736b195f82135048c50fcc" - integrity sha512-vdqTKI9GBIYcAEbFAcpKPErKINfPF5zIuz3/niBfq8WUZjpT2tytLlFVrBgWdOtqI4uaA/Rb6No0hux39XXDuw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-libs-browser@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" - integrity sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^1.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.0" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.10.3" - vm-browserify "0.0.4" - -node-pre-gyp@^0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz#6e4ef5bb5c5203c6552448828c852c40111aac46" - integrity sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.0" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.1.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -npm-bundled@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.3.tgz#7e71703d973af3370a9591bafe3a63aca0be2308" - integrity sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow== - -npm-packlist@^1.1.6: - version "1.1.10" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.10.tgz#1039db9e985727e464df066f4cf0ab6ef85c398a" - integrity sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -onetime@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" - integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= - dependencies: - mimic-fn "^1.0.0" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA== - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-limit@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== - dependencies: - p-try "^1.0.0" - -p-limit@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.0.0.tgz#e624ed54ee8c460a778b3c9f3670496ff8a57aec" - integrity sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A== - dependencies: - p-try "^2.0.0" - -p-locate@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - -p-try@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" - integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== - -pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== - -parallel-transform@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" - integrity sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY= - dependencies: - cyclist "~0.2.2" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" - integrity sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" - integrity sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo= - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -pbkdf2@^3.0.3: - version "3.0.16" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.16.tgz#7404208ec6b01b62d85bf83853a8064f8d9c2a5c" - integrity sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pify@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - integrity sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s= - dependencies: - find-up "^2.1.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -pseudomap@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - -public-encrypt@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.2.tgz#46eb9107206bf73489f8b85b69d91334c6610994" - integrity sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - -pump@^2.0.0, pump@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.6" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" - integrity sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -rc@^1.1.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.7.tgz#8a10ca30d588d00464360372b890d06dacd02297" - integrity sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA== - dependencies: - deep-extend "^0.5.1" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - integrity sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg= - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -restore-cursor@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" - integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= - dependencies: - onetime "^2.0.0" - signal-exit "^3.0.2" - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== - dependencies: - glob "^7.0.5" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-async@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" - integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= - dependencies: - is-promise "^2.1.0" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -rxjs@^6.1.0: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - integrity sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== - dependencies: - ajv "^6.1.0" - ajv-keywords "^3.1.0" - -semver@^5.0.1, semver@^5.5.0: - version "5.5.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" - integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw== - -semver@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" - integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== - -serialize-javascript@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.5.0.tgz#1aa336162c88a890ddad5384baebc93a655161fe" - integrity sha512-Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ== - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= - -set-value@^0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" - integrity sha1-fbCPnT0i3H945Trzw79GZuzfzPE= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.1" - to-object-path "^0.3.0" - -set-value@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" - integrity sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0, signal-exit@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" - integrity sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A== - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== - dependencies: - safe-buffer "^5.1.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" - integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds= - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0, string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@^5.3.0, supports-color@^5.4.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -tapable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" - integrity sha512-dQRhbNQkRnaqauC7WqSJ21EEksgT0fYZX2lqXzGkpo8JNig9zGZTYoMGvyI2nWmXlE2VSVXVDu7wLVGu/mQEsg== - -tar@^4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.1.tgz#b25d5a8470c976fd7a9a8a350f42c59e9fa81749" - integrity sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg== - dependencies: - chownr "^1.0.1" - fs-minipass "^1.2.5" - minipass "^2.2.4" - minizlib "^1.1.0" - mkdirp "^0.5.0" - safe-buffer "^5.1.1" - yallist "^3.0.2" - -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - -timers-browserify@^2.0.4: - version "2.0.10" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.10.tgz#1d28e3d2aadf1d5a5996c4e9f95601cd053480ae" - integrity sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg== - dependencies: - setimmediate "^1.0.4" - -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -ts-loader@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.5.0.tgz#a1ce70b2dc799941fb2197605f0d67874097859b" - integrity sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw== - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^3.1.4" - semver "^5.0.1" - -tslib@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" - integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.1.tgz#43738f29585d3a87575520a4b93ab6026ef11fdb" - integrity sha512-zQIMOmC+372pC/CCVLqnQ0zSBiY7HHodU7mpQdjiZddek4GMj31I3dUJ7gAs9o65X7mnRma6OokOkc6f9jjfBg== - -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== - dependencies: - commander "~2.13.0" - source-map "~0.6.1" - -uglifyjs-webpack-plugin@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - -union-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" - integrity sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^0.4.3" - -unique-filename@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" - integrity sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM= - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" - integrity sha1-22Z258fMBimHj/GWCXx4hVrp9Ks= - dependencies: - imurmurhash "^0.1.4" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.0.5: - version "1.1.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" - integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.10.3: - version "0.10.4" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.4.tgz#3aa0125bfe668a4672de58857d3ace27ecb76901" - integrity sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A== - dependencies: - inherits "2.0.3" - -v8-compile-cache@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz#a428b28bb26790734c4fc8bc9fa106fccebf6a6c" - integrity sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw== - -vm-browserify@0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" - integrity sha1-XX6kW7755Kb/ZflUOOCofDV9WnM= - dependencies: - indexof "0.0.1" - -watchpack@^1.5.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -webpack-cli@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.1.0.tgz#d71a83687dcfeb758fdceeb0fe042f96bcf62994" - integrity sha512-p5NeKDtYwjZozUWq6kGNs9w+Gtw/CPvyuXjXn2HMdz8Tie+krjEg8oAtonvIyITZdvpF7XG9xDHwscLr2c+ugQ== - dependencies: - chalk "^2.4.1" - cross-spawn "^6.0.5" - enhanced-resolve "^4.0.0" - global-modules-path "^2.1.0" - import-local "^1.0.0" - inquirer "^6.0.0" - interpret "^1.1.0" - loader-utils "^1.1.0" - supports-color "^5.4.0" - v8-compile-cache "^2.0.0" - yargs "^12.0.1" - -webpack-sources@^1.0.1, webpack-sources@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" - integrity sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.17.1: - version "4.17.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.17.1.tgz#0f026e3d823f3fc604f811ed3ea8f0d9b267fb1e" - integrity sha512-vdPYogljzWPhFKDj3Gcp01Vqgu7K3IQlybc3XIdKSQHelK1C3eIQuysEUR7MxKJmdandZlQB/9BG2Jb1leJHaw== - dependencies: - "@webassemblyjs/ast" "1.5.13" - "@webassemblyjs/helper-module-context" "1.5.13" - "@webassemblyjs/wasm-edit" "1.5.13" - "@webassemblyjs/wasm-opt" "1.5.13" - "@webassemblyjs/wasm-parser" "1.5.13" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" - ajv "^6.1.0" - ajv-keywords "^3.1.0" - chrome-trace-event "^1.0.0" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.0" - json-parse-better-errors "^1.0.2" - loader-runner "^2.3.0" - loader-utils "^1.1.0" - memory-fs "~0.4.1" - micromatch "^3.1.8" - mkdirp "~0.5.0" - neo-async "^2.5.0" - node-libs-browser "^2.0.0" - schema-utils "^0.4.4" - tapable "^1.0.0" - uglifyjs-webpack-plugin "^1.2.4" - watchpack "^1.5.0" - webpack-sources "^1.0.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - integrity sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w== - dependencies: - string-width "^1.0.2" - -worker-farm@^1.5.2: - version "1.6.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" - integrity sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ== - dependencies: - errno "~0.1.7" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= - -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - -yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= - -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - -yargs@^12.0.1: - version "12.0.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.1.tgz#6432e56123bb4e7c3562115401e98374060261c2" - integrity sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ== - dependencies: - cliui "^4.0.0" - decamelize "^2.0.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" diff --git a/src/Middleware/NodeServices/test/Microsoft.AspNetCore.NodeServices.Tests.csproj b/src/Middleware/NodeServices/test/Microsoft.AspNetCore.NodeServices.Tests.csproj deleted file mode 100644 index 2d1a5aab26b4..000000000000 --- a/src/Middleware/NodeServices/test/Microsoft.AspNetCore.NodeServices.Tests.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - $(DefaultNetCoreTargetFramework) - true - - - - - - - - - diff --git a/src/Middleware/NodeServices/test/NodeServicesTest.cs b/src/Middleware/NodeServices/test/NodeServicesTest.cs deleted file mode 100644 index 0ad53c117b3c..000000000000 --- a/src/Middleware/NodeServices/test/NodeServicesTest.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Testing; -using Microsoft.AspNetCore.NodeServices.HostingModels; -using Microsoft.Extensions.DependencyInjection; -using Xunit; - -namespace Microsoft.AspNetCore.NodeServices -{ - [SkipOnHelix("https://github.com/dotnet/aspnetcore/issues/22084", Queues = "Windows.10.Arm64;Windows.10.Arm64.Open")] - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class NodeServicesTest : IDisposable - { - private readonly INodeServices _nodeServices; - - public NodeServicesTest() - { - // In typical ASP.NET Core applications, INodeServices is made available - // through DI using services.AddNodeServices(). But for these tests we - // create our own INodeServices instance manually, since the tests are - // not about DI (and we might want different config for each test). - var serviceProvider = new ServiceCollection().BuildServiceProvider(); - var options = new NodeServicesOptions(serviceProvider); - _nodeServices = NodeServicesFactory.CreateNodeServices(options); - } - - [ConditionalFact] - public async Task CanGetSuccessResult() - { - // Act - var result = await _nodeServices.InvokeExportAsync( - ModulePath("testCases"), - "getFixedString"); - - // Assert - Assert.Equal("test result", result); - } - - [ConditionalFact] - public async Task CanGetErrorResult() - { - // Act/Assert - var ex = await Assert.ThrowsAsync(() => - _nodeServices.InvokeExportAsync( - ModulePath("testCases"), - "raiseError")); - Assert.StartsWith("This is an error from Node", ex.Message); - } - - [ConditionalFact] - public async Task CanGetResultAsynchronously() - { - // Act - // All the invocations are async, but this test shows we're not reliant - // on the response coming back immediately - var result = await _nodeServices.InvokeExportAsync( - ModulePath("testCases"), - "getFixedStringWithDelay"); - - // Assert - Assert.Equal("delayed test result", result); - } - - [ConditionalFact] - public async Task CanPassParameters() - { - // Act - var result = await _nodeServices.InvokeExportAsync( - ModulePath("testCases"), - "echoSimpleParameters", - "Hey", - 123); - - // Assert - Assert.Equal("Param0: Hey; Param1: 123", result); - } - - [ConditionalFact] - public async Task CanPassParametersWithCamelCaseNameConversion() - { - // Act - var result = await _nodeServices.InvokeExportAsync( - ModulePath("testCases"), - "echoComplexParameters", - new ComplexModel { StringProp = "Abc", IntProp = 123, BoolProp = true }); - - // Assert - Assert.Equal("Received: [{\"stringProp\":\"Abc\",\"intProp\":123,\"boolProp\":true}]", result); - } - - [ConditionalFact] - public async Task CanReceiveComplexResultWithPascalCaseNameConversion() - { - // Act - var result = await _nodeServices.InvokeExportAsync( - ModulePath("testCases"), - "getComplexObject"); - - // Assert - Assert.Equal("Hi from Node", result.StringProp); - Assert.Equal(456, result.IntProp); - Assert.True(result.BoolProp); - } - - [ConditionalFact] - public async Task CanInvokeDefaultModuleExport() - { - // Act - var result = await _nodeServices.InvokeAsync( - ModulePath("moduleWithDefaultExport"), - "This is from .NET"); - - // Assert - Assert.Equal("Hello from the default export. You passed: This is from .NET", result); - } - - private static string ModulePath(string testModuleName) - => Path.Combine(AppContext.BaseDirectory, "js", testModuleName); - - public void Dispose() - { - _nodeServices.Dispose(); - } - - class ComplexModel - { - public string StringProp { get; set; } - - public int IntProp { get; set; } - - public bool BoolProp { get; set; } - } - } -} diff --git a/src/Middleware/NodeServices/test/js/moduleWithDefaultExport.js b/src/Middleware/NodeServices/test/js/moduleWithDefaultExport.js deleted file mode 100644 index eae7f7ccf446..000000000000 --- a/src/Middleware/NodeServices/test/js/moduleWithDefaultExport.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = function (callback, message) { - callback(null, `Hello from the default export. You passed: ${message}`); -}; diff --git a/src/Middleware/NodeServices/test/js/testCases.js b/src/Middleware/NodeServices/test/js/testCases.js deleted file mode 100644 index 74b3a49ccfcc..000000000000 --- a/src/Middleware/NodeServices/test/js/testCases.js +++ /dev/null @@ -1,28 +0,0 @@ -// Function signatures follow Node conventions. -// i.e., parameters: (callback, arg0, arg1, ... etc ...) -// When done, functions must invoke 'callback', passing (errorInfo, result) -// where errorInfo should be null/undefined if there was no error. - -exports.getFixedString = function (callback) { - callback(null, 'test result'); -}; - -exports.getFixedStringWithDelay = function (callback) { - setTimeout(callback(null, 'delayed test result'), 100); -}; - -exports.raiseError = function (callback) { - callback('This is an error from Node'); -}; - -exports.echoSimpleParameters = function (callback, param0, param1) { - callback(null, `Param0: ${param0}; Param1: ${param1}`); -}; - -exports.echoComplexParameters = function (callback, ...otherArgs) { - callback(null, `Received: ${JSON.stringify(otherArgs)}`); -}; - -exports.getComplexObject = function (callback) { - callback(null, { stringProp: 'Hi from Node', intProp: 456, boolProp: true }); -}; diff --git a/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj b/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj index 6e6befbe9bb0..897b92d37552 100644 --- a/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj +++ b/src/Middleware/SpaServices.Extensions/src/Microsoft.AspNetCore.SpaServices.Extensions.csproj @@ -6,7 +6,6 @@ - diff --git a/src/Middleware/SpaServices.Extensions/src/Prerendering/SpaPrerenderingExtensions.cs b/src/Middleware/SpaServices.Extensions/src/Prerendering/SpaPrerenderingExtensions.cs deleted file mode 100644 index a9438b3f4cb8..000000000000 --- a/src/Middleware/SpaServices.Extensions/src/Prerendering/SpaPrerenderingExtensions.cs +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.NodeServices; -using Microsoft.AspNetCore.SpaServices; -using Microsoft.AspNetCore.SpaServices.Extensions.Util; -using Microsoft.AspNetCore.SpaServices.Prerendering; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Net.Http.Headers; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.Builder -{ - /// - /// Extension methods for configuring prerendering of a Single Page Application. - /// - [Obsolete("Prerendering is no longer supported out of box")] - public static class SpaPrerenderingExtensions - { - /// - /// Enables server-side prerendering middleware for a Single Page Application. - /// - /// The . - /// Supplies configuration for the prerendering middleware. - [Obsolete("Prerendering is no longer supported out of box")] - public static void UseSpaPrerendering( - this ISpaBuilder spaBuilder, - Action configuration) - { - if (spaBuilder == null) - { - throw new ArgumentNullException(nameof(spaBuilder)); - } - - if (configuration == null) - { - throw new ArgumentNullException(nameof(configuration)); - } - - var options = new SpaPrerenderingOptions(); - configuration.Invoke(options); - - var capturedBootModulePath = options.BootModulePath; - if (string.IsNullOrEmpty(capturedBootModulePath)) - { - throw new InvalidOperationException($"To use {nameof(UseSpaPrerendering)}, you " + - $"must set a nonempty value on the ${nameof(SpaPrerenderingOptions.BootModulePath)} " + - $"property on the ${nameof(SpaPrerenderingOptions)}."); - } - - // If we're building on demand, start that process in the background now - var buildOnDemandTask = options.BootModuleBuilder?.Build(spaBuilder); - - // Get all the necessary context info that will be used for each prerendering call - var applicationBuilder = spaBuilder.ApplicationBuilder; - var serviceProvider = applicationBuilder.ApplicationServices; - var nodeServices = GetNodeServices(serviceProvider); - var applicationStoppingToken = serviceProvider.GetRequiredService() - .ApplicationStopping; - var applicationBasePath = serviceProvider.GetRequiredService() - .ContentRootPath; - var moduleExport = new JavaScriptModuleExport(capturedBootModulePath); - var excludePathStrings = (options.ExcludeUrls ?? Array.Empty()) - .Select(url => new PathString(url)) - .ToArray(); - var buildTimeout = spaBuilder.Options.StartupTimeout; - - applicationBuilder.Use(async (context, next) => - { - // If this URL is excluded, skip prerendering. - // This is typically used to ensure that static client-side resources - // (e.g., /dist/*.css) are served normally or through SPA development - // middleware, and don't return the prerendered index.html page. - foreach (var excludePathString in excludePathStrings) - { - if (context.Request.Path.StartsWithSegments(excludePathString)) - { - await next(); - return; - } - } - - // If we're building on demand, wait for that to finish, or raise any build errors - if (buildOnDemandTask != null && !buildOnDemandTask.IsCompleted) - { - // For better debuggability, create a per-request timeout that makes it clear if the - // prerendering builder took too long for this request, but without aborting the - // underlying build task so that subsequent requests could still work. - await buildOnDemandTask.WithTimeout(buildTimeout, - $"The prerendering build process did not complete within the " + - $"timeout period of {buildTimeout.Seconds} seconds. " + - $"Check the log output for error information."); - } - - // It's no good if we try to return a 304. We need to capture the actual - // HTML content so it can be passed as a template to the prerenderer. - RemoveConditionalRequestHeaders(context.Request); - - // Make sure we're not capturing compressed content, because then we'd have - // to decompress it. Since this sub-request isn't leaving the machine, there's - // little to no benefit in having compression on it. - var originalAcceptEncodingValue = GetAndRemoveAcceptEncodingHeader(context.Request); - - // Capture the non-prerendered responses, which in production will typically only - // be returning the default SPA index.html page (because other resources will be - // served statically from disk). We will use this as a template in which to inject - // the prerendered output. - using (var outputBuffer = new MemoryStream()) - { - var originalResponseStream = context.Response.Body; - context.Response.Body = outputBuffer; - - try - { - await next(); - outputBuffer.Seek(0, SeekOrigin.Begin); - } - finally - { - context.Response.Body = originalResponseStream; - - if (!string.IsNullOrEmpty(originalAcceptEncodingValue)) - { - context.Request.Headers[HeaderNames.AcceptEncoding] = originalAcceptEncodingValue; - } - } - - // If it isn't an HTML page that we can use as the template for prerendering, - // - ... because it's not text/html - // - ... or because it's an error - // then prerendering doesn't apply to this request, so just pass through the - // response as-is. Note that the non-text/html case is not an error: this is - // typically how the SPA dev server responses for static content are returned - // in development mode. - var canPrerender = IsSuccessStatusCode(context.Response.StatusCode) - && IsHtmlContentType(context.Response.ContentType); - if (!canPrerender) - { - await outputBuffer.CopyToAsync(context.Response.Body); - return; - } - - // Most prerendering logic will want to know about the original, unprerendered - // HTML that the client would be getting otherwise. Typically this is used as - // a template from which the fully prerendered page can be generated. - var customData = new Dictionary - { - { "originalHtml", Encoding.UTF8.GetString(outputBuffer.GetBuffer()) } - }; - - // If the developer wants to use custom logic to pass arbitrary data to the - // prerendering JS code (e.g., to pass through cookie data), now's their chance - options.SupplyData?.Invoke(context, customData); - - var (unencodedAbsoluteUrl, unencodedPathAndQuery) - = GetUnencodedUrlAndPathQuery(context); - var renderResult = await Prerenderer.RenderToString( - applicationBasePath, - nodeServices, - applicationStoppingToken, - moduleExport, - unencodedAbsoluteUrl, - unencodedPathAndQuery, - customDataParameter: customData, - timeoutMilliseconds: 0, - requestPathBase: context.Request.PathBase.ToString()); - - await ServePrerenderResult(context, renderResult); - } - }); - } - - private static bool IsHtmlContentType(string contentType) - { - if (string.Equals(contentType, "text/html", StringComparison.Ordinal)) - { - return true; - } - - return contentType != null - && contentType.StartsWith("text/html;", StringComparison.Ordinal); - } - - private static bool IsSuccessStatusCode(int statusCode) - => statusCode >= 200 && statusCode < 300; - - private static void RemoveConditionalRequestHeaders(HttpRequest request) - { - request.Headers.Remove(HeaderNames.IfMatch); - request.Headers.Remove(HeaderNames.IfModifiedSince); - request.Headers.Remove(HeaderNames.IfNoneMatch); - request.Headers.Remove(HeaderNames.IfUnmodifiedSince); - request.Headers.Remove(HeaderNames.IfRange); - } - - private static string GetAndRemoveAcceptEncodingHeader(HttpRequest request) - { - var headers = request.Headers; - var value = (string)null; - - if (headers.ContainsKey(HeaderNames.AcceptEncoding)) - { - value = headers[HeaderNames.AcceptEncoding]; - headers.Remove(HeaderNames.AcceptEncoding); - } - - return value; - } - - private static (string, string) GetUnencodedUrlAndPathQuery(HttpContext httpContext) - { - // This is a duplicate of code from Prerenderer.cs in the SpaServices package. - // Once the SpaServices.Extension package implementation gets merged back into - // SpaServices, this duplicate can be removed. To remove this, change the code - // above that calls Prerenderer.RenderToString to use the internal overload - // that takes an HttpContext instead of a url/path+query pair. - var requestFeature = httpContext.Features.Get(); - var unencodedPathAndQuery = requestFeature.RawTarget; - var request = httpContext.Request; - var unencodedAbsoluteUrl = $"{request.Scheme}://{request.Host}{unencodedPathAndQuery}"; - return (unencodedAbsoluteUrl, unencodedPathAndQuery); - } - - private static async Task ServePrerenderResult(HttpContext context, RenderToStringResult renderResult) - { - context.Response.Clear(); - - if (!string.IsNullOrEmpty(renderResult.RedirectUrl)) - { - var permanentRedirect = renderResult.StatusCode.GetValueOrDefault() == 301; - context.Response.Redirect(renderResult.RedirectUrl, permanentRedirect); - } - else - { - // The Globals property exists for back-compatibility but is meaningless - // for prerendering that returns complete HTML pages - if (renderResult.Globals != null) - { - throw new InvalidOperationException($"{nameof(renderResult.Globals)} is not " + - $"supported when prerendering via {nameof(UseSpaPrerendering)}(). Instead, " + - $"your prerendering logic should return a complete HTML page, in which you " + - $"embed any information you wish to return to the client."); - } - - if (renderResult.StatusCode.HasValue) - { - context.Response.StatusCode = renderResult.StatusCode.Value; - } - - context.Response.ContentType = "text/html"; - await context.Response.WriteAsync(renderResult.Html); - } - } - - private static INodeServices GetNodeServices(IServiceProvider serviceProvider) - { - // Use the registered instance, or create a new private instance if none is registered - var instance = (INodeServices)serviceProvider.GetService(typeof(INodeServices)); - return instance ?? NodeServicesFactory.CreateNodeServices( - new NodeServicesOptions(serviceProvider)); - } - } -} diff --git a/src/Middleware/SpaServices/README.md b/src/Middleware/SpaServices/README.md deleted file mode 100644 index c5a524a6564f..000000000000 --- a/src/Middleware/SpaServices/README.md +++ /dev/null @@ -1,821 +0,0 @@ -# Microsoft.AspNetCore.SpaServices - -If you're building an ASP.NET Core application, and want to use Angular, React, Knockout, or another single-page app (SPA) framework, this NuGet package contains useful infrastructure for you. - -This package enables: - - * [**Server-side prerendering**](#server-side-prerendering) for *universal* (a.k.a. *isomorphic*) applications, where your Angular / React / etc. components are first rendered on the server, and then transferred to the client where execution continues - * [**Webpack middleware**](#webpack-dev-middleware) so that, during development, any webpack-built resources will be generated on demand, without you having to run webpack manually or compile files to disk - * [**Hot module replacement**](#webpack-hot-module-replacement) so that, during development, your code and markup changes will be pushed to your browser and updated in the running application automatically, without even needing to reload the page - * [**Routing helpers**](#routing-helper-mapspafallbackroute) for integrating server-side routing with client-side routing - -Behind the scenes, it uses the [`Microsoft.AspNetCore.NodeServices`](src/Middleware/NodeServices) package as a fast and robust way to invoke Node.js-hosted code from ASP.NET Core at runtime. - -### Requirements - -* [Node.js](https://nodejs.org/en/) - * To test this is installed and can be found, run `node -v` on a command line - * Note: If you're deploying to an Azure web site, you don't need to do anything here - Node is already installed and available in the server environments -* [.NET Core](https://dot.net), version 1.0 RC2 or later - -### Installation into existing projects - - * Install the `Microsoft.AspNetCore.SpaServices` NuGet package - * Run `dotnet restore` (or if you use Visual Studio, just wait a moment - it will restore dependencies automatically) - * Install supporting NPM packages for the features you'll be using: - * For **server-side prerendering**, install `aspnet-prerendering` - * For **server-side prerendering with Webpack build support**, also install `aspnet-webpack` - * For **webpack dev middleware**, install `aspnet-webpack` - * For **webpack dev middleware with hot module replacement**, also install `webpack-hot-middleware` - * For **webpack dev middleware with React hot module replacement**, also install `aspnet-webpack-react` - - For example, run `npm install --save aspnet-prerendering aspnet-webpack` to install `aspnet-prerendering` and `aspnet-webpack`. - - -### Creating entirely new projects - -If you're starting from scratch, you might prefer to use the `aspnetcore-spa` Yeoman generator to get a ready-to-go starting point using your choice of client-side framework. This includes `Microsoft.AspNetCore.SpaServices` along with everything configured for webpack middleware, server-side prerendering, etc. - -See: [Getting started with the aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/) - -Also, if you want to debug projects created with the aspnetcore-spa generator, see [Debugging your projects](#debugging-your-projects) - -## Server-side prerendering - -The `SpaServices` package isn't tied to any particular client-side framework, and it doesn't force you to set up your client-side application in any one particular style. So, `SpaServices` doesn't contain hard-coded logic for rendering Angular / React / etc. components. - -Instead, what `SpaServices` offers is ASP.NET Core APIs that know how to invoke a JavaScript function that you supply, passing through context information that you'll need for server-side prerendering, and then injects the resulting HTML string into your rendered page. In this document, you'll find examples of setting this up to render Angular and React components. - -### 1. Enable the asp-prerender-* tag helpers - -Make sure you've installed into your project: - - * The `Microsoft.AspNetCore.SpaServices` NuGet package, version 1.1.0-* or later - * The `aspnet-prerendering` NPM package, version 2.0.1 or later - -Together these contain the server-side and client-side library code you'll need. Now go to your `Views/_ViewImports.cshtml` file, and add the following line: - - @addTagHelper "*, Microsoft.AspNetCore.SpaServices" - -### 2. Use asp-prerender-* in a view - -Choose a place in one of your MVC views where you want to prerender a SPA component. For example, open `Views/Home/Index.cshtml`, and add markup like the following: - -
- -If you run your application now, and browse to whatever page renders the view you just edited, you should get an error similar to the following (assuming you're running in *Development* mode so you can see the error information): *Error: Cannot find module 'some/directory/ClientApp/boot-server'*. You've told the prerendering tag helper to execute code from a JavaScript module called `boot-server`, but haven't yet supplied any such module! - -### 3. Supplying JavaScript code to perform prerendering - -Create a JavaScript file at the path matching the `asp-prerender-module` value you specified above. In this example, that means creating a folder called `ClientApp` at the root of your project, and creating a file inside it called `boot-server.js`. Try putting the following into it: - -```javascript -var prerendering = require('aspnet-prerendering'); - -module.exports = prerendering.createServerRenderer(function(params) { - return new Promise(function (resolve, reject) { - var result = '

Hello world!

' - + '

Current time in Node is: ' + new Date() + '

' - + '

Request path is: ' + params.location.path + '

' - + '

Absolute URL is: ' + params.absoluteUrl + '

'; - - resolve({ html: result }); - }); -}); -``` - -If you try running your app now, you should see the HTML snippet generated by your JavaScript getting injected into your page. - -As you can see, your JavaScript code receives context information (such as the URL being requested), and returns a `Promise` so that it can asynchronously supply the markup to be injected into the page. You can put whatever logic you like here, but typically you'll want to execute a component from your Angular / React / etc. application. - -**Passing data from .NET code into JavaScript code** - -If you want to supply additional data to the JavaScript function that performs your prerendering, you can use the `asp-prerender-data` attribute. You can give any value as long as it's JSON-serializable. Bear in mind that it will be serialized and sent as part of the remote procedure call (RPC) to Node.js, so avoid trying to pass massive amounts of data. - -For example, in your `cshtml`, - -
- -Now in your JavaScript prerendering function, you can access this data by reading `params.data`, e.g.: - -```javascript -var prerendering = require('aspnet-prerendering'); - -module.exports = prerendering.createServerRenderer(function(params) { - return new Promise(function (resolve, reject) { - var result = '

Hello world!

' - + '

Is gold user: ' + params.data.isGoldUser + '

' - + '

Number of cookies: ' + params.data.cookies.length + '

'; - - resolve({ html: result }); - }); -}); -``` - -Notice that the property names are received in JavaScript-style casing (e.g., `isGoldUser`) even though they were sent in C#-style casing (e.g., `IsGoldUser`). This is because of how the JSON serialization is configured by default. - -**Passing data from server-side to client-side code** - -If, as well as returning HTML, you also want to pass some contextual data from your server-side code to your client-side code, you can supply a `globals` object alongside the initial `html`, e.g.: - -```javascript -resolve({ - html: result, - globals: { - albumsList: someDataHere, - userData: someMoreDataHere - } -}); -``` - -When the `aspnet-prerender-*` tag helper emits this result into the document, as well as injecting the `html` string, it will also emit code that populates `window.albumsList` and `window.userData` with JSON-serialized copies of the objects you passed. - -This can be useful if, for example, you want to avoid loading the same data twice (once on the server and once on the client). - -### 4. Enabling webpack build tooling - -Of course, rather than writing your `boot-server` module and your entire SPA in plain ES5 JavaScript, it's quite likely that you'll want to write your client-side code in TypeScript or at least ES2015 code. To enable this, you need to set up a build system. - -#### Example: Configuring Webpack to build TypeScript - -Let's say you want to write your boot module and SPA code in TypeScript, and build it using Webpack. First ensure that `webpack` is installed, along with the libraries needed for TypeScript compilation: - - npm install -g webpack - npm install --save ts-loader typescript - -Next, create a file `webpack.config.js` at the root of your project, containing: - -```javascript -var path = require('path'); - -module.exports = { - entry: { 'main-server': './ClientApp/boot-server.ts' }, - resolve: { extensions: [ '', '.js', '.ts' ] }, - output: { - path: path.join(__dirname, './ClientApp/dist'), - filename: '[name].js', - libraryTarget: 'commonjs' - }, - module: { - loaders: [ - { test: /\.ts$/, loader: 'ts-loader' } - ] - }, - target: 'node', - devtool: 'inline-source-map' -}; -``` - -This tells webpack that it should compile `.ts` files using TypeScript, and that when looking for modules by name (e.g., `boot-server`), it should also find files with `.js` and `.ts` extensions. - -If you don't already have a `tsconfig.json` file at the root of your project, add one now. Make sure your `tsconfig.json` includes `"es6"` in its `"lib"` array so that TypeScript knows about intrinsics such as `Promise`. Here's an example `tsconfig.json`: - -```json -{ - "compilerOptions": { - "moduleResolution": "node", - "target": "es5", - "sourceMap": true, - "lib": [ "es6", "dom" ] - }, - "exclude": [ "bin", "node_modules" ] -} -``` - -Now you can delete `ClientApp/boot-server.js`, and in its place, create `ClientApp/boot-server.ts`, containing the TypeScript equivalent of what you had before: - -```javascript -import { createServerRenderer } from 'aspnet-prerendering'; - -export default createServerRenderer(params => { - return new Promise((resolve, reject) => { - const html = ` -

Hello world!

-

Current time in Node is: ${ new Date() }

-

Request path is: ${ params.location.path }

-

Absolute URL is: ${ params.absoluteUrl }

`; - - resolve({ html }); - }); -}); -``` - -Finally, run `webpack` on the command line to build `ClientApp/dist/main-server.js`. Then you can tell `SpaServices` to use that file for server-side prerendering. In your MVC view where you use `aspnet-prerender-module`, update the attribute value: - -
- -Webpack is a broad and powerful tool and can do far more than just invoke the TypeScript compiler. To learn more, see the [webpack website](https://webpack.github.io/). - - -### 5(a). Prerendering Angular components - -If you're building an Angular application, you can run your components on the server inside your `boot-server.ts` file so they will be injected into the resulting web page. - -First install the NPM package `angular2-universal` - this contains infrastructure for executing Angular components inside Node.js: - -``` -npm install --save angular2-universal -``` - -Now you can use the [`angular2-universal` APIs](https://github.com/angular/universal) from your `boot-server.ts` TypeScript module to execute your Angular component on the server. The code needed for this is fairly complex, but that's unavoidable because Angular supports so many different ways of being configured, and you need to provide wiring for whatever combination of DI modules you're using. - -The easiest way to get started with Angular server-side rendering on ASP.NET Core is to use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/), which creates a ready-made working starting point. - -### 5(b). Prerendering React components - -React components can be executed synchronously on the server quite easily, although asynchronous execution is tricker as described below. - -#### Setting up client-side React code - -Let's say you want to write a React component in ES2015 code. You might install the NPM modules `react react-dom babel-loader babel-preset-react babel-preset-es2015`, and then prepare Webpack to build `.jsx` files by creating `webpack.config.js` in your project root, containing: - -```javascript -var path = require('path'); - -module.exports = { - resolve: { extensions: [ '', '.js', '.jsx' ] }, - module: { - loaders: [ - { test: /\.jsx?$/, loader: 'babel-loader' } - ] - }, - entry: { - main: ['./ClientApp/react-app.jsx'], - }, - output: { - path: path.join(__dirname, 'wwwroot', 'dist'), - filename: '[name].js' - }, -}; -``` - -You will also need a `.babelrc` file in your project root, containing: - -```javascript -{ - "presets": ["es2015", "react"] -} -``` - -This is enough to be able to build ES2015 `.jsx` files via Webpack. Now you could implement a simple React component, for example the following at `ClientApp/react-app.jsx`: - -```javascript -import * as React from 'react'; - -export class HelloMessage extends React.Component -{ - render() { - return

Hello {this.props.message}!

; - } -} -``` - -... and the following code to run it in a browser at `ClientApp/boot-client.jsx`: - -```javascript -import * as React from 'react'; -import * as ReactDOM from 'react-dom'; -import { HelloMessage } from './react-app'; - -ReactDOM.render(, document.getElementById('my-spa')); -``` - -At this stage, run `webpack` on the command line to build `wwwroot/dist/main.js`. Or, to avoid having to do this manually, you could use the `SpaServices` package to [enable Webpack dev middleware](#webpack-dev-middleware). - -You can now run your React code on the client by adding the following to one of your MVC views: - -
- - -If you want to enable server-side prerendering too, follow the same process as described under [server-side prerendering](#server-side-prerendering). - -#### Realistic React apps and Redux - -The above example is extremely simple - it doesn't use `react-router`, and it doesn't load any data asynchronously. Real applications are likely to do both of these. - -Supporting asynchronous data loading involves more considerations. Unlike Angular applications that run asynchronously on the server and freely overwrite server-generated markup with client-generated markup, React strictly wants to run synchronously on the server and always produce the same markup on the server as it does on the client. - -To make this work, you most likely need some way to know in advance what data your React components will need to use, load it separately from those components, and have some way of transferring information about the loaded data from server to client. If you try to implement this in a generalized way, you'll end up reinventing something like the Flux/Redux pattern. - -To avoid inventing your own incomplete version of Flux/Redux, you probably should just use [Redux](https://github.com/reactjs/redux). This is at first a very unfamiliar and tricky-looking abstraction, but does solve all the problems around server-side execution of React apps. To get a working starting point for an ASP.NET Core site with React+Redux on the client (and server-side prerendering), see the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/). - -## Webpack dev middleware - -If you're using webpack, the webpack dev middleware feature included in `Microsoft.AspNetCore.SpaServices` will streamline your development process. It intercepts requests that would match files built by webpack, and dynamically builds those files on demand. They don't need to be written to disk - they are just held in memory and served directly to the browser. - -Benefits: - - * You don't have to run `webpack` manually or set up any file watchers - * The browser is always guaranteed to receive up-to-date built output - * The built artifacts are normally served instantly or at least extremely quickly, because internally, an instance of `webpack` stays active and has partial compilation states pre-cached in memory - -It lets you work as if the browser natively understands whatever file types you are working with (e.g., TypeScript, SASS), because it's as if there's no build process to wait for. - -### Example: A simple Webpack setup that builds TypeScript - -**Note:** If you already have Webpack in your project, then you can skip this section. - -As a simple example, here's how you can set up Webpack to build TypeScript files. First install the relevant NPM packages by executing this from the root directory of your project: - -``` -npm install --save typescript ts-loader -``` - -And if you don't already have it, you'll find it useful to install the `webpack` command-line tool: - -``` -npm install -g webpack -``` - -Now add a Webpack configuration file. Create `webpack.config.js` in the root of your project, containing the following: - -```javascript -module.exports = { - resolve: { - // For modules referenced with no filename extension, Webpack will consider these extensions - extensions: [ '', '.js', '.ts' ] - }, - module: { - loaders: [ - // This example only configures Webpack to load .ts files. You can also drop in loaders - // for other file types, e.g., .coffee, .sass, .jsx, ... - { test: /\.ts$/, loader: 'ts-loader' } - ] - }, - entry: { - // The loader will follow all chains of reference from this entry point... - main: ['./ClientApp/MyApp.ts'] - }, - output: { - // ... and emit the built result in this location - path: __dirname + '/wwwroot/dist', - filename: '[name].js' - }, -}; -``` - -Now you can put some TypeScript code (minimally, just `console.log('Hello');`) at `ClientApp/MyApp.ts` and then run `webpack` from the command line to build it (and everything it references). The output will be placed in `wwwroot/dist`, so you can load and run it in a browser by adding the following to one of your views (e.g., `Views\Home\Index.cshtml`): - - - -The Webpack loader, `ts-loader`, follows all chains of reference from `MyApp.ts` and will compile all referenced TypeScript code into your output. If you want, you can create a [`tsconfig.json` file](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html) to control things like whether source maps will be included in the output. If you add other Webpack loaders to your `webpack.config.js`, you can even reference things like SASS from your TypeScript, and then it will get built to CSS and loaded automatically. - -So that's enough to build TypeScript. Here's where webpack dev middleware comes in to auto-build your code whenever needed (so you don't need any file watchers or to run `webpack` manually), and optionally hot module replacement (HMR) to push your changes automatically from code editor to browser without even reloading the page. - -### Example: A simple Webpack setup that builds LESS - -Following on from the preceding example that builds TypeScript, you could extend your Webpack configuration further to support building LESS. There are three major approaches to doing this: - -1. **If using Angular, use its native style loader to attach the styles to components**. This is extremely simple and is usually the right choice if you are using Angular. However it only applies to Angular components, not to any other part of the host page, so sometimes you might want to combine this technique with options 2 or 3 below. - -2. **Or, use Webpack's style loader to attach the styles at runtime**. The CSS markup will be included in your JavaScript bundles and will be attached to the document dynamically. This has certain benefits during development but isn't recommended in production. - -3. **Or, have each build write a standalone `.css` file to disk**. At runtime, load it using a regular `` tag. This is likely to be the approach you'll want for production use (at least for non-Angular applications, such as React applications) as it's the most robust and best-performing option. - -If instead of LESS you prefer SASS or another CSS preprocessor, the exact same techniques should work, but of course you'll need to replace the `less-loader` with an equivalent Webpack loader for SASS or your chosen preprocessor. - -#### Approach 1: Scoping styles to Angular components - -If you are using Angular, this is the easiest way to perform styling. It works with both server and client rendering, supports Hot Module Replacement, and robustly scopes styles to particular components (and optionally, their descendant elements). - -This repository's Angular template uses this technique to scope styles to components out of the box. It defines those styles as `.css` files. For example, its components reference `.css` files like this: - -```javascript -@Component({ - ... - styles: [require('./somecomponent.css')] -}) -export class SomeComponent { ... } -``` - -To make this work, the template has Webpack configured to inject the contents of the `.css` file as a string literal in the built file. Here's the configuration that enables this: - -```javascript -// This goes into webpack.config.js, in the module loaders array: -{ test: /\.css/, include: /ClientApp/, loader: 'raw-loader' } -``` - -Now if you want to use LESS instead of plain CSS, you just need to include a LESS loader. Run the following in a command prompt at your project root: - -``` -npm install --save less-loader less -``` - -Next, add the following loader configuration to the `loaders` array in `webpack.config.js`: - -```javascript -{ test: /\.less/, include: /ClientApp/, loader: 'raw-loader!less-loader' } -``` - -Notice how this chains together with `less-loader` (which transforms `.less` syntax to plain CSS syntax), then the `raw` loader (which turn the result into a string literal). With this in place, you can reference `.less` files from your Angular components in the obvious way: - -```javascript -@Component({ - ... - styles: [require('./somecomponent.less')] -}) -export class SomeComponent { ... } -``` - -... and your styles will be applied in both server-side and client-side rendering. - -#### Approach 2: Loading the styles using Webpack and JavaScript - -This technique works with any client-side framework (not just Angular), and can also apply styles to the entire document rather than just individual components. It's a little simpler to set up than technique 3, plus it works flawlessly with Hot Module Replacement (HMR). The downside is that it's really only good for development time, because in production you probably don't want users to wait until JavaScript is loaded before styles are applied to the page (this would mean they'd see a 'flash of unstyled content' while the page is being loaded). - -First create a `.less` file in your project. For example, create a file at `ClientApp/styles/mystyles.less` containing: - -```less -@base: #f938ab; - -h1 { - color: @base; -} -``` - -Reference this file from an `import` or `require` statement in one of your JavaScript or TypeScript files. For example, if you've got a `boot-client.ts` file, add the following near the top: - -```javascript -import './styles/mystyles.less'; -``` - -If you try to run the Webpack compiler now (e.g., via `webpack` on the command line), you'll get an error saying it doesn't know how to build `.less` files. So, it's time to install a Webpack loader for LESS (plus related NPM modules). In a command prompt at your project's root directory, run: - -``` -npm install --save less-loader less -``` - -Finally, tell Webpack to use this whenever it encounters a `.less` file. In `webpack.config.js`, add to the `loaders` array: - -``` -{ test: /\.less/, loader: 'style-loader!css-loader!less-loader' } -``` - -This means that when you `import` or `require` a `.less` file, it should pass it first to the LESS compiler to produce CSS, then the output goes to the CSS and Style loaders that know how to attach it dynamically to the page at runtime. - -That's all you need to do! Restart your site and you should see the LESS styles being applied. This technique is compatible with both source maps and Hot Module Replacement (HMR), so you can edit your `.less` files at will and see the changes appearing live in the browser. - -#### Approach 3: Building LESS to CSS files on disk - -This technique takes a little more work to set up than technique 2, and lacks compatibility with HMR. But it's much better for production use if your styles are applied to the whole page (not just elements constructed via JavaScript), because it loads the CSS independently of JavaScript. - -First add a `.less` file into your project. For example, create a file at `ClientApp/styles/mystyles.less` containing: - -```less -@base: #f938ab; - -h1 { - color: @base; -} -``` - -Reference this file from an `import` or `require` statement in one of your JavaScript or TypeScript files. For example, if you've got a `boot-client.ts` file, add the following near the top: - -```javascript -import './styles/mystyles.less'; -``` - -If you try to run the Webpack compiler now (e.g., via `webpack` on the command line), you'll get an error saying it doesn't know how to build `.less` files. So, it's time to install a Webpack loader for LESS (plus related NPM modules). In a command prompt at your project's root directory, run: - -``` -npm install --save less less-loader extract-text-webpack-plugin -``` - -Next, you can extend your Webpack configuration to handle `.less` files. In `webpack.config.js`, at the top, add: - -```javascript -var extractStyles = new (require('extract-text-webpack-plugin'))('mystyles.css'); -``` - -This creates a plugin instance that will output text to a file called `mystyles.css`. You can now compile `.less` files and emit the resulting CSS text into that file. To do so, add the following to the `loaders` array in your Webpack configuration: - -```javascript -{ test: /\.less$/, loader: extractStyles.extract('css-loader!less-loader') } -``` - -This tells Webpack that, whenever it finds a `.less` file, it should use the LESS loader to produce CSS, and then feed that CSS into the `extractStyles` object which you've already configured to write a file on disk called `mystyles.css`. Finally, for this to actually work, you need to include `extractStyles` in the list of active plugins. Just add that object to the `plugins` array in your Webpack config, e.g.: - -```javascript -plugins: [ - extractStyles, - ... leave any other plugins here ... -] -``` - -If you run `webpack` on the command line now, you should now find that it emits a new file at `dist/mystyles.css`. You can make browsers load this file simply by adding a regular `` tag. For example, in `Views/Shared/_Layout.cshtml`, add: - -```html - -``` - -**Note:** This technique (writing the built `.css` file to disk) is ideal for production use. But note that, at development time, *it does not support Hot Module Replacement (HMR)*. You will need to reload the page each time you edit your `.less` file. This is a known limitation of `extract-text-webpack-plugin`. If you have constructive opinions on how this can be improved, see the [discussion here](https://github.com/webpack/extract-text-webpack-plugin/issues/30). - -### Enabling webpack dev middleware - -First install the `Microsoft.AspNetCore.SpaServices` NuGet package and the `aspnet-webpack` NPM package, then go to your `Startup.cs` file, and **before your call to `UseStaticFiles`**, add the following: - -```csharp -if (env.IsDevelopment()) { - app.UseWebpackDevMiddleware(); -} - -// Your call to app.UseStaticFiles(); should be here -``` - -Also check your webpack configuration at `webpack.config.js`. Since `UseWebpackDevMiddleware` needs to know which incoming requests to intercept, make sure you've specified a `publicPath` value on your `output`, for example: - -```javascript -module.exports = { - // ... rest of your webpack config is here ... - - output: { - path: path.join(__dirname, 'wwwroot', 'dist'), - publicPath: '/dist/', - filename: '[name].js' - }, -}; -``` - -Now, assuming you're running in [development mode](https://docs.asp.net/en/latest/fundamentals/environments.html), any requests for files under `/dist` will be intercepted and served using Webpack dev middleware. - -**This is for development time only, not for production use (hence the `env.IsDevelopment()` check in the code above).** While you could technically remove that check and serve your content in production through the webpack middleware, it's hard to think of a good reason for doing so. For best performance, it makes sense to prebuild your client-side resources so they can be served directly from disk with no build middleware. If you use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/), you'll get a site that produces optimised static builds for production, while also supporting webpack dev middleware at development time. - -## Webpack Hot Module Replacement - -For an even more streamlined development experience, you can enhance webpack dev middleware by enabling Hot Module Replacement (HMR) support. This watches for any changes you make to source files on disk (e.g., `.ts`/`.html`/`.sass`/etc. files), and automatically rebuilds them and pushes the result into your browser window, without even needing to reload the page. - -This is *not* the same as a simple live-reload mechanism. It does not reload the page; it replaces code or markup directly in place. This is better, because it does not interfere with any state your SPA might have in memory, or any debugging session you have in progress. - -Typically, when you change a source file, the effects appear in your local browser window in under 2 seconds, even when your overall application is large. This is superbly productive, especially in multi-monitor setups. If you cause a build error (e.g., a syntax error), details of the error will appear in your browser window. When you fix it, your application will reappear, without having lost its in-memory state. - -### Enabling Hot Module Replacement - -First ensure you already have a working Webpack dev middleware setup. Then, install the `webpack-hot-middleware` NPM module: - -``` -npm install --save-dev webpack-hot-middleware -``` - -At the top of your `Startup.cs` file, add the following namespace reference: - -```csharp -using Microsoft.AspNetCore.SpaServices.Webpack; -``` - -Now amend your call to `UseWebpackDevMiddleware` as follows: - -```csharp -app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions { - HotModuleReplacement = true -}); -``` - -Also, to work around a temporary issue in `SpaServices`, you must ensure that your Webpack config includes a `plugins` array, even if it's empty. For example, in `webpack.config.js`: - -```javascript -module.exports = { - // ... rest of your webpack config is here ... - - plugins: [ - // Put webpack plugins here if needed, or leave it as an empty array if not - ] -}; -``` - -Now when you load your application in a browser, you should see a message like the following in your browser console: - -``` -[HMR] connected -``` - -If you edit any of your source files that get built by webpack, the result will automatically be pushed into the browser. As for what the browser does with these updates - that's a matter of how you configure it - see below. - -**Note for TypeScript + Visual Studio users** - -If you want HMR to work correctly with TypeScript, and you use Visual Studio on Windows as an IDE (but not VS Code), then you will need to make a further configuration change. In your `.csproj` file, in one of the `` elements, add this: - - true - -This is necessary because otherwise, Visual Studio will try to auto-compile TypeScript files as you save changes to them. That default auto-compilation behavior is unhelpful in projects where you have a proper build system (e.g., Webpack), because VS doesn't know about your build system and would emit `.js` files in the wrong locations, which would in turn cause problems with your real build or deployment mechanisms. - -#### Enabling hot replacement for React components - -Webpack has built-in support for updating React components in place. To enable this, amend your `UseWebpackDevMiddleware` call further as follows: - -```csharp -app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions { - HotModuleReplacement = true, - ReactHotModuleReplacement = true -}); -``` - -Also, install the NPM module `aspnet-webpack-react`, e.g.: - -``` -npm install --save-dev aspnet-webpack-react -``` - -Now if you edit any React component (e.g., in `.jsx` or `.tsx` files), the updated component will be injected into the running application, and will even preserve its in-memory state. - -**Note**: In you webpack config, be sure that your React components are loaded using `babel-loader` (and *not* just directly using `babel` or `ts-loader`), because `babel-loader` is where the HMR instrumentation is injected. For an example of HMR for React components built with TypeScript, see the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/). - -#### Enabling hot replacement for other module types - -Webpack has built-in HMR support for various types of module, such as styles and React components as described above. But to support HMR for other code modules, you need to add a small block of code that calls `module.hot.accept` to receive the updated module and update the running application. - -This is [documented in detail on the Webpack site](https://webpack.github.io/docs/hot-module-replacement.html). Or to get a working HMR-enabled ASP.NET Core site with Angular, React, React+Redux, or Knockout, you can use the [aspnetcore-spa generator](http://blog.stevensanderson.com/2016/05/02/angular2-react-knockout-apps-on-aspnet-core/). - -#### Passing options to the Webpack Hot Middleware client - -You can configure the [Webpack Hot Middleware client](https://github.com/glenjamin/webpack-hot-middleware#client) -by using the `HotModuleReplacementClientOptions` property on `WebpackDevMiddlewareOptions`: - -```csharp -app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions { - HotModuleReplacement = true, - HotModuleReplacementClientOptions = new Dictionary { - { "reload", "true" }, - }, -}); -``` - -For the list of available options, please see [Webpack Hot Middleware docs](https://github.com/glenjamin/webpack-hot-middleware#client). - -**Note**: The `path` option cannot be overridden this way - it is controlled by the `HotModuleReplacementEndpoint` setting. - -## Routing helper: MapSpaFallbackRoute - -*Note: this functionality has been superseded by `endpoints.MapFallbackToFile(...)` provided by endpoint routing. -`MapFallbackToFile` behaves similarly to `MapSpaFallbackRoute`.* - -In most single-page applications, you'll want client-side routing as well as your server-side routing. Most of the time, the two routing systems work independently without interfering. However, there is one case where things get challenging: identifying 404s. - -If a request arrives for `/some/page`, and it doesn't match any server-side route, it's likely that you want to return HTML that starts up your client-side application, which probably understands the route `/some/page`. But if a request arrives for `/images/user-512.png`, and it doesn't match any server-side route or static file, it's **not** likely that your client-side application would handle it - you probably want to return a 404. - -To help distinguish between these cases, the `Microsoft.AspNetCore.SpaServices` NuGet package includes a routing helper, `MapSpaFallbackRoute`. For example, in your `Startup.cs` file's `Configure` method, you might add: - -```csharp - 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" }); - }); -``` - -Since `UseStaticFiles` goes first, any requests that actually match physical files under `wwwroot` will be handled by serving that static file. - -Since the default server-side MVC route goes next, any requests that match existing controller/action pairs will be handled by invoking that action. - -Then, since `MapSpaFallbackRoute` is last, any other requests **that don't appear to be for static files** will be served by invoking the `Index` action on `HomeController`. This action's view should serve your client-side application code, allowing the client-side routing system to handle whatever URL has been requested. - -Any requests that do appear to be for static files (i.e., those that end with filename extensions), will *not* be handled by `MapSpaFallbackRoute`, and so will end up as 404s. - -This is not a perfect solution to the problem of identifying 404s, because for example `MapSpaFallbackRoute` will not match requests for `/users/albert.einstein`, because it appears to contain a filename extension (`.einstein`). If you need your SPA to handle routes like that, then don't use `MapSpaFallbackRoute` - just use a regular MVC catch-all route. But then beware that requests for unknown static files will result in your client-side app being rendered. - -## Debugging your projects - -How to attach and use a debugger depends on what code you want to debug. For details, see: - - * [How to debug your C# code that runs on the server](#debugging-your-c-code-that-runs-on-the-server) - * How to debug your JavaScript/TypeScript code: - * ... [when it's running in a browser](#debugging-your-javascripttypescript-code-when-its-running-in-a-browser) - * ... [when it's running on the server](#debugging-your-javascripttypescript-code-when-it-runs-on-the-server) (i.e., via `asp-prerender` or NodeSevices) - -### Debugging your C# code that runs on the server - -You can use any .NET debugger, for example Visual Studio's C# debugger or [Visual Studio Code's C# debugger](https://code.visualstudio.com/Docs/editor/debugging). - -### Debugging your JavaScript/TypeScript code when it's running in a browser - -**The absolute most reliable way of debugging your client-side code is to use your browser's built-in debugger.** This is much easier to make work than debugging via an IDE, plus it offers much richer insight into what's going on than your IDE will do (for example, you'll be able to inspect the DOM and capture performance profiles as well as just set breakpoints and step through code). - -If you're unfamiliar with your browser's debugging tools, then take the time to get familiar with them. You will become more productive. - -#### Using your browser's built-in debugging tools - -##### Using Chrome's developer tools for debugging - -In Chrome, with your application running in the browser, [open the developer tools](https://developer.chrome.com/devtools#access). You can now find your code: - - * In the developer tools *Sources* tab, expand folders in the hierarchy pane on the left to find the file you want - * Or, press `ctrl`+`o` (on Windows) or `cmd`+`o` on Mac, then start to type name name of the file you want to open (e.g., `counter.component.ts`) - -With source maps enabled (which is the case in the project templates in this repo), you'll be able to see your original TypeScript source code, set breakpoints on it, etc. - -##### Using Internet Explorer/Edge's developer tools (F12) for debugging - -In Internet Explorer or Edge, with your application running in the browser, open the F12 developer tools by pressing `F12`. You can now find your code: - - * In the F12 tools *Debugger* tab, expand folders in the hierarchy pane on the left to find the file you want - * Or, press `ctrl`+`o`, then start to type name name of the file you want to open (e.g., `counter.component.ts`) - -With source maps enabled (which is the case in the project templates in this repo), you'll be able to see your original TypeScript source code, set breakpoints on it, etc. - -##### Using Firefox's developer tools for debugging - -In Firefox, with your application running in the browser, open the developer tools by pressing `F12`. You can now find your code: - - * In the developer tools *Debugger* tab, expand folders in the hierarchy pane titled *Sources* towards the bottom to find the file you want - * Or, press `ctrl`+`o` (on Windows) or `cmd`+`o` on Mac, then start to type name name of the file you want to open (e.g., `counter.component.ts`) - -With source maps enabled (which is the case in the project templates in this repo), you'll be able to see your original TypeScript source code, set breakpoints on it, etc. - -##### How browser-based debugging interacts with Hot Module Replacement (HMR) - -If you're using HMR, then each time you modify a file, the Webpack dev middleware restarts your client-side application, adding a new version of each affected module, without reloading the page. This can be confusing during debugging, because any breakpoints set on the old version of the code will still be there, but they will no longer get hit, because the old version of the module is no longer in use. - -You have two options to get breakpoints that will be hit as expected: - - * **Reload the page** (e.g., by pressing `F5`). Then your existing breakpoints will be applied to the new version of the module. This is obviously the easiest solution. - * Or, if you don't want to reload the page, you can **set new breakpoints on the new version of the module**. To do this, look in your browser's debug tools' list of source files, and identify the newly-injected copy of the module you want to debug. It will typically have a suffix on its URL such as `?4a2c`, and may appear in a new top-level hierarchy entry called `webpack://`. Set a breakpoint in the newly-injected module, and it will be hit as expected as your application runs. - -#### Using Visual Studio Code's "Debugger for Chrome" extension - -If you're using Visual Studio Code and Chrome, you can set breakpoints directly on your TypeScript source code in the IDE. To do this: - -1. Install VS Code's [*Debugger for Chrome* extension](https://marketplace.visualstudio.com/items?itemName=msjsdiag.debugger-for-chrome) -2. Ensure your application server has started and can be reached with a browser (for example, run `dotnet watch run`) -3. In VS Code, open its *Debug* view (on Windows/Linux, press `ctrl`+`shift`+`d`; on Mac, press `cmd`+`shift`+`d`). -4. Press the cog icon and when prompted to *Select environment*, choose `Chrome`. VS Code will create a `launch.json` file for you. This describes how the debugger and browser should be launched. -5. Edit your new `.vscode/launch.json` file to specify the correct `url` and `webRoot` for your application. If you're using the project templates in this repo, then the values you probably want are: - * For `url`, put `"http://localhost:5000"` (but of course, change this if you're using a different port) - * For `port`, put `5000` (or your custom port number if applicable) - * For `workspace` in **both** configurations, put `"${workspaceRoot}/wwwroot"` - * This tells the debugger how URLs within your application correspond to files in your VS Code workspace. By default, ASP.NET Core projects treat `wwwroot` as the root directory for publicly-served files, so `http://localhost:5000/dist/myfile.js` corresponds to `/wwwroot/dist/myfile.js`. VS Code doesn't know about `wwwroot` unless you tell it. - * **Important:** If your VS Code window's workspace root is not the same as your ASP.NET Core project root (for example, if VS Code is opened at a higher-level directory to show both your ASP.NET Core project plus other peer-level directories), then you will need to amend `workspace` correspondingly (e.g., to `"${workspaceRoot}/SomeDir/MyAspNetProject/wwwroot"`). -6. Start the debugger: - * While still on the *Debug* view, from the dropdown near the top-left, choose "*Launch Chrome against localhost, with sourcemaps*". - * Press the *Play* icon. Your application will launch in Chrome. - * If it does nothing for a while, then eventually gives the error *Cannot connect to runtime process*, that's because you already have an instance of Chrome running. Close it first, then try again. -7. Finally, you can now set and hit breakpoints in your TypeScript code in VS Code. - -For more information about VS Code's built-in debugging facilities, [see its documentation](https://code.visualstudio.com/Docs/editor/debugging). - -Caveats: - - * The debugging interface between VS Code and Chrome occasionally has issues. If you're unable to set or hit breakpoints, or if you try to set a breakpoint but it appears in the wrong place, you may need to stop and restart the debugger (and often, the whole Chrome process). - * If you're using Hot Module Replacement (HMR), then whenever you edit a file, the breakpoints in it will no longer hit. This is because HMR loads a new version of the module into the browser, so the old code no longer runs. To fix this, you must: - * Reload the page in Chrome (e.g., by pressing `F5`) - * **Then** (and only then), remove and re-add the breakpoint in VS Code. It will now be attached to the current version of your module. Alternatively, stop and restart debugging altogether. - * If you prefer, you can use "*Attach to Chrome, with sourcemaps*" instead of launching a new Chrome instance, but this is a bit trickier: you must first start Chrome using the command-line option `--remote-debugging-port=9222`, and you must ensure there are no other tabs opened (otherwise, it might try to connect to the wrong one). - - -#### Using Visual Studio's built-in debugger for Internet Explorer - -If you're using Visual Studio on Windows, and are running your app in Internet Explorer 11 (not Edge!), then you can use VS's built-in debugger rather than Interner Explorer's F12 tools if you prefer. To do this: - - 1. In Internet Explorer, [enable script debugging](https://msdn.microsoft.com/en-us/library/ms241741\(v=vs.100\).aspx) - 2. In Visual Studio, [set the default "*Browse with*" option](http://stackoverflow.com/a/31959053) to Internet Explorer - 3. In Visual Studio, press F5 to launch your application with the debugger in Internet Explorer. - * When the page has loaded in the browser, you'll be able to set and hit breakpoints in your TypeScript source files in Visual Studio. - -Caveats: - - * If you're using Hot Module Replacement, you'll need to stop and restart the debugger any time you change a source file. VS's IE debugger does not recognise that source files might change while the debugging session is in progress. - * Realistically, you are not going to be as productive using this approach to debugging as you would be if you used your browser's built-in debugging tools. The browser's built-in debugging tools are far more effective: they are always available (you don't have to have launched your application in a special way), they better handle HMR, and they don't make your application very slow to launch. - -## Debugging your JavaScript/TypeScript code when it runs on the server - -When you're using NodeServices or the server-side prerendering feature included in the project templates in this repo, your JavaScript/TypeScript code will execute on the server in a background instance of Node.js. You can enable debugging via [V8 Inspector Integration](https://nodejs.org/api/debugger.html#debugger_v8_inspector_integration_for_node_js) on that Node.js instance. Here's how to do it. - -First, in your `Startup.cs` file, in the `ConfigureServices` method, add the following: - -``` -services.AddNodeServices(options => { - options.LaunchWithDebugging = true; - options.DebuggingPort = 9229; -}); -``` - -Now, run your application from that command line (e.g., `dotnet run`). Then in a browser visit one of your pages that causes server-side JS to execute. - -In the console, you should see all the normal trace messages appear, plus among them will be: - -``` -warn: Microsoft.AspNetCore.NodeServices[0] - Debugger listening on port 9229. -warn: Microsoft.AspNetCore.NodeServices[0] - Warning: This is an experimental feature and could change at any time. -warn: Microsoft.AspNetCore.NodeServices[0] - To start debugging, open the following URL in Chrome: -warn: Microsoft.AspNetCore.NodeServices[0] - chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx -``` - -As per instructions open the URL in Chrome. Alternatively you can go to the `Sources` tab of the Dev Tools (at http://localhost:5000) and connect to the Node instance under `Threads` in the right sidebar. - -By expanding the `webpack://` entry in the sidebar, you'll be able to find your original source code (it's using source maps), and then set breakpoints in it. When you re-run your app in another browser window, your breakpoints will be hit, then you can debug the server-side execution just like you'd debug client-side execution. It looks like this: - -![screenshot from 2017-03-25 13-33-26](https://cloud.githubusercontent.com/assets/1596280/24324604/ab888a7e-115f-11e7-89d1-1586acf5e35c.png) - diff --git a/src/Middleware/SpaServices/src/Content/Node/prerenderer.js b/src/Middleware/SpaServices/src/Content/Node/prerenderer.js deleted file mode 100644 index ffee00bd241e..000000000000 --- a/src/Middleware/SpaServices/src/Content/Node/prerenderer.js +++ /dev/null @@ -1,224 +0,0 @@ -(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 0); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(1); - - -/***/ }), -/* 1 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -var path = __webpack_require__(2); -// Separate declaration and export just to add type checking on function signature -exports.renderToString = renderToStringImpl; -// This function is invoked by .NET code (via NodeServices). Its job is to hand off execution to the application's -// prerendering boot function. It can operate in two modes: -// [1] Legacy mode -// This is for backward compatibility with projects created with templates older than the generator version 0.6.0. -// In this mode, we don't really do anything here - we just load the 'aspnet-prerendering' NPM module (which must -// exist in node_modules, and must be v1.x (not v2+)), and pass through all the parameters to it. Code in -// 'aspnet-prerendering' v1.x will locate the boot function and invoke it. -// The drawback to this mode is that, for it to work, you have to deploy node_modules to production. -// [2] Current mode -// This is for projects created with the Yeoman generator 0.6.0+ (or projects manually updated). In this mode, -// we don't invoke 'require' at runtime at all. All our dependencies are bundled into the NuGet package, so you -// don't have to deploy node_modules to production. -// To determine whether we're in mode [1] or [2], the code locates your prerendering boot function, and checks whether -// a certain flag is attached to the function instance. -function renderToStringImpl(callback, applicationBasePath, bootModule, absoluteRequestUrl, requestPathAndQuery, customDataParameter, overrideTimeoutMilliseconds) { - try { - var forceLegacy = isLegacyAspNetPrerendering(); - var renderToStringFunc = !forceLegacy && findRenderToStringFunc(applicationBasePath, bootModule); - var isNotLegacyMode = renderToStringFunc && renderToStringFunc['isServerRenderer']; - if (isNotLegacyMode) { - // Current (non-legacy) mode - we invoke the exported function directly (instead of going through aspnet-prerendering) - // It's type-safe to just apply the incoming args to this function, because we already type-checked that it's a RenderToStringFunc, - // just like renderToStringImpl itself is. - renderToStringFunc.apply(null, arguments); - } - else { - // Legacy mode - just hand off execution to 'aspnet-prerendering' v1.x, which must exist in node_modules at runtime - var aspNetPrerenderingV1RenderToString = __webpack_require__(3).renderToString; - if (aspNetPrerenderingV1RenderToString) { - aspNetPrerenderingV1RenderToString(callback, applicationBasePath, bootModule, absoluteRequestUrl, requestPathAndQuery, customDataParameter, overrideTimeoutMilliseconds); - } - else { - callback('If you use aspnet-prerendering >= 2.0.0, you must update your server-side boot module to call createServerRenderer. ' - + 'Either update your boot module code, or revert to aspnet-prerendering version 1.x'); - } - } - } - catch (ex) { - // Make sure loading errors are reported back to the .NET part of the app - callback('Prerendering failed because of error: ' - + ex.stack - + '\nCurrent directory is: ' - + process.cwd()); - } -} -; -function findBootModule(applicationBasePath, bootModule) { - var bootModuleNameFullPath = path.resolve(applicationBasePath, bootModule.moduleName); - if (bootModule.webpackConfig) { - // If you're using asp-prerender-webpack-config, you're definitely in legacy mode - return null; - } - else { - return require(bootModuleNameFullPath); - } -} -function findRenderToStringFunc(applicationBasePath, bootModule) { - // First try to load the module - var foundBootModule = findBootModule(applicationBasePath, bootModule); - if (foundBootModule === null) { - return null; // Must be legacy mode - } - // Now try to pick out the function they want us to invoke - var renderToStringFunc; - if (bootModule.exportName) { - // Explicitly-named export - renderToStringFunc = foundBootModule[bootModule.exportName]; - } - else if (typeof foundBootModule !== 'function') { - // TypeScript-style default export - renderToStringFunc = foundBootModule["default"]; - } - else { - // Native default export - renderToStringFunc = foundBootModule; - } - // Validate the result - if (typeof renderToStringFunc !== 'function') { - if (bootModule.exportName) { - throw new Error("The module at " + bootModule.moduleName + " has no function export named " + bootModule.exportName + "."); - } - else { - throw new Error("The module at " + bootModule.moduleName + " does not export a default function, and you have not specified which export to invoke."); - } - } - return renderToStringFunc; -} -function isLegacyAspNetPrerendering() { - var version = getAspNetPrerenderingPackageVersion(); - return version && /^1\./.test(version); -} -function getAspNetPrerenderingPackageVersion() { - try { - var packageEntryPoint = require.resolve('aspnet-prerendering'); - var packageDir = path.dirname(packageEntryPoint); - var packageJsonPath = path.join(packageDir, 'package.json'); - var packageJson = require(packageJsonPath); - return packageJson.version.toString(); - } - catch (ex) { - // Implies aspnet-prerendering isn't in node_modules at all (or node_modules itself doesn't exist, - // which will be the case in production based on latest templates). - return null; - } -} - - -/***/ }), -/* 2 */ -/***/ (function(module, exports) { - -module.exports = require("path"); - -/***/ }), -/* 3 */ -/***/ (function(module, exports) { - -module.exports = require("aspnet-prerendering"); - -/***/ }) -/******/ ]))); \ No newline at end of file diff --git a/src/Middleware/SpaServices/src/Content/Node/webpack-dev-middleware.js b/src/Middleware/SpaServices/src/Content/Node/webpack-dev-middleware.js deleted file mode 100644 index 78d03802c23f..000000000000 --- a/src/Middleware/SpaServices/src/Content/Node/webpack-dev-middleware.js +++ /dev/null @@ -1,133 +0,0 @@ -(function(e, a) { for(var i in a) e[i] = a[i]; }(exports, /******/ (function(modules) { // webpackBootstrap -/******/ // The module cache -/******/ var installedModules = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ -/******/ // Check if module is in cache -/******/ if(installedModules[moduleId]) { -/******/ return installedModules[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = installedModules[moduleId] = { -/******/ i: moduleId, -/******/ l: false, -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Flag the module as loaded -/******/ module.l = true; -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/******/ -/******/ // expose the modules object (__webpack_modules__) -/******/ __webpack_require__.m = modules; -/******/ -/******/ // expose the module cache -/******/ __webpack_require__.c = installedModules; -/******/ -/******/ // define getter function for harmony exports -/******/ __webpack_require__.d = function(exports, name, getter) { -/******/ if(!__webpack_require__.o(exports, name)) { -/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter }); -/******/ } -/******/ }; -/******/ -/******/ // define __esModule on exports -/******/ __webpack_require__.r = function(exports) { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ -/******/ // create a fake namespace object -/******/ // mode & 1: value is a module id, require it -/******/ // mode & 2: merge all properties of value into the ns -/******/ // mode & 4: return value when already ns object -/******/ // mode & 8|1: behave like require -/******/ __webpack_require__.t = function(value, mode) { -/******/ if(mode & 1) value = __webpack_require__(value); -/******/ if(mode & 8) return value; -/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; -/******/ var ns = Object.create(null); -/******/ __webpack_require__.r(ns); -/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value }); -/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); -/******/ return ns; -/******/ }; -/******/ -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = function(module) { -/******/ var getter = module && module.__esModule ? -/******/ function getDefault() { return module['default']; } : -/******/ function getModuleExports() { return module; }; -/******/ __webpack_require__.d(getter, 'a', getter); -/******/ return getter; -/******/ }; -/******/ -/******/ // Object.prototype.hasOwnProperty.call -/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; -/******/ -/******/ // __webpack_public_path__ -/******/ __webpack_require__.p = ""; -/******/ -/******/ -/******/ // Load entry module and return exports -/******/ return __webpack_require__(__webpack_require__.s = 4); -/******/ }) -/************************************************************************/ -/******/ ([ -/* 0 */, -/* 1 */, -/* 2 */, -/* 3 */, -/* 4 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = __webpack_require__(5); - - -/***/ }), -/* 5 */ -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -exports.__esModule = true; -// Pass through the invocation to the 'aspnet-webpack' package, verifying that it can be loaded -function createWebpackDevServer(callback) { - var aspNetWebpack; - try { - aspNetWebpack = __webpack_require__(6); - } - catch (ex) { - // Developers sometimes have trouble with badly-configured Node installations, where it's unable - // to find node_modules. Or they accidentally fail to deploy node_modules, or even to run 'npm install'. - // Make sure such errors are reported back to the .NET part of the app. - callback('Webpack dev middleware failed because of an error while loading \'aspnet-webpack\'. Error was: ' - + ex.stack - + '\nCurrent directory is: ' - + process.cwd()); - return; - } - return aspNetWebpack.createWebpackDevServer.apply(this, arguments); -} -exports.createWebpackDevServer = createWebpackDevServer; - - -/***/ }), -/* 6 */ -/***/ (function(module, exports) { - -module.exports = require("aspnet-webpack"); - -/***/ }) -/******/ ]))); \ No newline at end of file diff --git a/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj b/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj deleted file mode 100644 index 20ad3236ae69..000000000000 --- a/src/Middleware/SpaServices/src/Microsoft.AspNetCore.SpaServices.csproj +++ /dev/null @@ -1,34 +0,0 @@ - - - - Helpers for building single-page applications on ASP.NET MVC Core. - $(DefaultNetCoreTargetFramework) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Middleware/SpaServices/src/Prerendering/DefaultSpaPrerenderer.cs b/src/Middleware/SpaServices/src/Prerendering/DefaultSpaPrerenderer.cs deleted file mode 100644 index be38e0c0f5fb..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/DefaultSpaPrerenderer.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.NodeServices; -using System.Threading.Tasks; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.AspNetCore.SpaServices.Prerendering -{ - /// - /// Default implementation of a DI service that provides convenient access to - /// server-side prerendering APIs. This is an alternative to prerendering via - /// the asp-prerender-module tag helper. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal class DefaultSpaPrerenderer : ISpaPrerenderer - { - private readonly string _applicationBasePath; - private readonly CancellationToken _applicationStoppingToken; - private readonly IHttpContextAccessor _httpContextAccessor; - private readonly INodeServices _nodeServices; - - public DefaultSpaPrerenderer( - INodeServices nodeServices, - IHostApplicationLifetime applicationLifetime, - IWebHostEnvironment hostingEnvironment, - IHttpContextAccessor httpContextAccessor) - { - _applicationBasePath = hostingEnvironment.ContentRootPath; - _applicationStoppingToken = applicationLifetime.ApplicationStopping; - _httpContextAccessor = httpContextAccessor; - _nodeServices = nodeServices; - } - - public Task RenderToString( - string moduleName, - string exportName = null, - object customDataParameter = null, - int timeoutMilliseconds = default(int)) - { - return Prerenderer.RenderToString( - _applicationBasePath, - _nodeServices, - _applicationStoppingToken, - new JavaScriptModuleExport(moduleName) { ExportName = exportName }, - _httpContextAccessor.HttpContext, - customDataParameter, - timeoutMilliseconds); - } - } -} diff --git a/src/Middleware/SpaServices/src/Prerendering/ISpaPrerenderer.cs b/src/Middleware/SpaServices/src/Prerendering/ISpaPrerenderer.cs deleted file mode 100644 index dcf986673e44..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/ISpaPrerenderer.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading.Tasks; - -namespace Microsoft.AspNetCore.SpaServices.Prerendering -{ - /// - /// Represents a service that can perform server-side prerendering for - /// JavaScript-based Single Page Applications. This is an alternative - /// to using the 'asp-prerender-module' tag helper. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public interface ISpaPrerenderer - { - /// - /// Invokes JavaScript code to perform server-side prerendering for a - /// Single-Page Application. This is an alternative to using the - /// 'asp-prerender-module' tag helper. - /// - /// The JavaScript module that exports a prerendering function. - /// The name of the export from the JavaScript module, if it is not the default export. - /// An optional JSON-serializable object to pass to the JavaScript prerendering function. - /// If specified, the prerendering task will time out after this duration if not already completed. - /// - Task RenderToString( - string moduleName, - string exportName = null, - object customDataParameter = null, - int timeoutMilliseconds = default(int)); - } -} diff --git a/src/Middleware/SpaServices/src/Prerendering/JavaScriptModuleExport.cs b/src/Middleware/SpaServices/src/Prerendering/JavaScriptModuleExport.cs deleted file mode 100644 index 13fd2177dd02..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/JavaScriptModuleExport.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.SpaServices.Prerendering -{ - /// - /// Describes how to find the JavaScript code that performs prerendering. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class JavaScriptModuleExport - { - /// - /// Creates a new instance of . - /// - /// The path to the JavaScript module containing prerendering code. - public JavaScriptModuleExport(string moduleName) - { - ModuleName = moduleName; - } - - /// - /// Specifies the path to the JavaScript module containing prerendering code. - /// - public string ModuleName { get; private set; } - - /// - /// If set, specifies the name of the CommonJS export that is the prerendering function to execute. - /// If not set, the JavaScript module's default CommonJS export must itself be the prerendering function. - /// - public string ExportName { get; set; } - } -} diff --git a/src/Middleware/SpaServices/src/Prerendering/PrerenderTagHelper.cs b/src/Middleware/SpaServices/src/Prerendering/PrerenderTagHelper.cs deleted file mode 100644 index 3aaed1445a5f..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/PrerenderTagHelper.cs +++ /dev/null @@ -1,132 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Mvc.ViewFeatures; -using Microsoft.AspNetCore.Mvc.Rendering; -using Microsoft.AspNetCore.NodeServices; -using Microsoft.AspNetCore.Razor.TagHelpers; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.AspNetCore.SpaServices.Prerendering -{ - /// - /// A tag helper for prerendering JavaScript applications on the server. - /// - [HtmlTargetElement(Attributes = PrerenderModuleAttributeName)] - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class PrerenderTagHelper : TagHelper - { - private const string PrerenderModuleAttributeName = "asp-prerender-module"; - private const string PrerenderExportAttributeName = "asp-prerender-export"; - private const string PrerenderDataAttributeName = "asp-prerender-data"; - private const string PrerenderTimeoutAttributeName = "asp-prerender-timeout"; - private static INodeServices _fallbackNodeServices; // Used only if no INodeServices was registered with DI - - private readonly string _applicationBasePath; - private readonly CancellationToken _applicationStoppingToken; - private readonly INodeServices _nodeServices; - - /// - /// Creates a new instance of . - /// - /// The . - public PrerenderTagHelper(IServiceProvider serviceProvider) - { - var hostEnv = (IWebHostEnvironment)serviceProvider.GetService(typeof(IWebHostEnvironment)); - _nodeServices = (INodeServices)serviceProvider.GetService(typeof(INodeServices)) ?? _fallbackNodeServices; - _applicationBasePath = hostEnv.ContentRootPath; - - var applicationLifetime = (IHostApplicationLifetime)serviceProvider.GetService(typeof(IHostApplicationLifetime)); - _applicationStoppingToken = applicationLifetime.ApplicationStopping; - - // Consider removing the following. Having it means you can get away with not putting app.AddNodeServices() - // in your startup file, but then again it might be confusing that you don't need to. - if (_nodeServices == null) - { - _nodeServices = _fallbackNodeServices = NodeServicesFactory.CreateNodeServices( - new NodeServicesOptions(serviceProvider)); - } - } - - /// - /// Specifies the path to the JavaScript module containing prerendering code. - /// - [HtmlAttributeName(PrerenderModuleAttributeName)] - public string ModuleName { get; set; } - - /// - /// If set, specifies the name of the CommonJS export that is the prerendering function to execute. - /// If not set, the JavaScript module's default CommonJS export must itself be the prerendering function. - /// - [HtmlAttributeName(PrerenderExportAttributeName)] - public string ExportName { get; set; } - - /// - /// An optional JSON-serializable parameter to be supplied to the prerendering code. - /// - [HtmlAttributeName(PrerenderDataAttributeName)] - public object CustomDataParameter { get; set; } - - /// - /// The maximum duration to wait for prerendering to complete. - /// - [HtmlAttributeName(PrerenderTimeoutAttributeName)] - public int TimeoutMillisecondsParameter { get; set; } - - /// - /// The . - /// - [HtmlAttributeNotBound] - [ViewContext] - public ViewContext ViewContext { get; set; } - - /// - /// Executes the tag helper to perform server-side prerendering. - /// - /// The . - /// The . - /// A representing the operation. - public override async Task ProcessAsync(TagHelperContext context, TagHelperOutput output) - { - var result = await Prerenderer.RenderToString( - _applicationBasePath, - _nodeServices, - _applicationStoppingToken, - new JavaScriptModuleExport(ModuleName) - { - ExportName = ExportName - }, - ViewContext.HttpContext, - CustomDataParameter, - TimeoutMillisecondsParameter); - - if (!string.IsNullOrEmpty(result.RedirectUrl)) - { - // It's a redirection - var permanentRedirect = result.StatusCode.GetValueOrDefault() == 301; - ViewContext.HttpContext.Response.Redirect(result.RedirectUrl, permanentRedirect); - return; - } - - if (result.StatusCode.HasValue) - { - ViewContext.HttpContext.Response.StatusCode = result.StatusCode.Value; - } - - // It's some HTML to inject - output.Content.SetHtmlContent(result.Html); - - // Also attach any specified globals to the 'window' object. This is useful for transferring - // general state between server and client. - var globalsScript = result.CreateGlobalsAssignmentScript(); - if (!string.IsNullOrEmpty(globalsScript)) - { - output.PostElement.SetHtmlContent($""); - } - } - } -} diff --git a/src/Middleware/SpaServices/src/Prerendering/Prerenderer.cs b/src/Middleware/SpaServices/src/Prerendering/Prerenderer.cs deleted file mode 100644 index 26316320c60e..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/Prerenderer.cs +++ /dev/null @@ -1,109 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.NodeServices; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; - -namespace Microsoft.AspNetCore.SpaServices.Prerendering -{ - /// - /// Performs server-side prerendering by invoking code in Node.js. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class Prerenderer - { - private static readonly object CreateNodeScriptLock = new object(); - - private static StringAsTempFile NodeScript; - - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal static Task RenderToString( - string applicationBasePath, - INodeServices nodeServices, - CancellationToken applicationStoppingToken, - JavaScriptModuleExport bootModule, - HttpContext httpContext, - object customDataParameter, - int timeoutMilliseconds) - { - // We want to pass the original, unencoded incoming URL data through to Node, so that - // server-side code has the same view of the URL as client-side code (on the client, - // location.pathname returns an unencoded string). - // The following logic handles special characters in URL paths in the same way that - // Node and client-side JS does. For example, the path "/a=b%20c" gets passed through - // unchanged (whereas other .NET APIs do change it - Path.Value will return it as - // "/a=b c" and Path.ToString() will return it as "/a%3db%20c") - var requestFeature = httpContext.Features.Get(); - var unencodedPathAndQuery = requestFeature.RawTarget; - - var request = httpContext.Request; - var unencodedAbsoluteUrl = $"{request.Scheme}://{request.Host}{unencodedPathAndQuery}"; - - return RenderToString( - applicationBasePath, - nodeServices, - applicationStoppingToken, - bootModule, - unencodedAbsoluteUrl, - unencodedPathAndQuery, - customDataParameter, - timeoutMilliseconds, - request.PathBase.ToString()); - } - - /// - /// Performs server-side prerendering by invoking code in Node.js. - /// - /// The root path to your application. This is used when resolving project-relative paths. - /// The instance of that will be used to invoke JavaScript code. - /// A token that indicates when the host application is stopping. - /// The path to the JavaScript file containing the prerendering logic. - /// The URL of the currently-executing HTTP request. This is supplied to the prerendering code. - /// The path and query part of the URL of the currently-executing HTTP request. This is supplied to the prerendering code. - /// An optional JSON-serializable parameter to be supplied to the prerendering code. - /// The maximum duration to wait for prerendering to complete. - /// The PathBase for the currently-executing HTTP request. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static Task RenderToString( - string applicationBasePath, - INodeServices nodeServices, - CancellationToken applicationStoppingToken, - JavaScriptModuleExport bootModule, - string requestAbsoluteUrl, - string requestPathAndQuery, - object customDataParameter, - int timeoutMilliseconds, - string requestPathBase) - { - return nodeServices.InvokeExportAsync( - GetNodeScriptFilename(applicationStoppingToken), - "renderToString", - applicationBasePath, - bootModule, - requestAbsoluteUrl, - requestPathAndQuery, - customDataParameter, - timeoutMilliseconds, - requestPathBase); - } - - private static string GetNodeScriptFilename(CancellationToken applicationStoppingToken) - { - lock (CreateNodeScriptLock) - { - if (NodeScript == null) - { - var script = EmbeddedResourceReader.Read(typeof(Prerenderer), "/Content/Node/prerenderer.js"); - NodeScript = new StringAsTempFile(script, applicationStoppingToken); // Will be cleaned up on process exit - } - } - - return NodeScript.FileName; - } - } -} diff --git a/src/Middleware/SpaServices/src/Prerendering/PrerenderingServiceCollectionExtensions.cs b/src/Middleware/SpaServices/src/Prerendering/PrerenderingServiceCollectionExtensions.cs deleted file mode 100644 index cabc57adcfa3..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/PrerenderingServiceCollectionExtensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.SpaServices.Prerendering; - -namespace Microsoft.Extensions.DependencyInjection -{ - /// - /// Extension methods for setting up prerendering features in an . - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class PrerenderingServiceCollectionExtensions - { - /// - /// Configures the dependency injection system to supply an implementation - /// of . - /// - /// The . - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static void AddSpaPrerenderer(this IServiceCollection serviceCollection) - { - serviceCollection.AddHttpContextAccessor(); - serviceCollection.AddSingleton(); - } - } -} diff --git a/src/Middleware/SpaServices/src/Prerendering/RenderToStringResult.cs b/src/Middleware/SpaServices/src/Prerendering/RenderToStringResult.cs deleted file mode 100644 index ce37c54fed57..000000000000 --- a/src/Middleware/SpaServices/src/Prerendering/RenderToStringResult.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using System.Text; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNetCore.SpaServices.Prerendering -{ - /// - /// Describes the prerendering result returned by JavaScript code. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class RenderToStringResult - { - /// - /// If set, specifies JSON-serializable data that should be added as a set of global JavaScript variables in the document. - /// This can be used to transfer arbitrary data from server-side prerendering code to client-side code (for example, to - /// transfer the state of a Redux store). - /// - public JObject Globals { get; set; } - - /// - /// The HTML generated by the prerendering logic. - /// - public string Html { get; set; } - - /// - /// If set, specifies that instead of rendering HTML, the response should be an HTTP redirection to this URL. - /// This can be used if the prerendering code determines that the requested URL would lead to a redirection according - /// to the SPA's routing configuration. - /// - public string RedirectUrl { get; set; } - - /// - /// If set, specifies the HTTP status code that should be sent back with the server response. - /// - public int? StatusCode { get; set; } - - /// - /// Constructs a block of JavaScript code that assigns data from the - /// property to the global namespace. - /// - /// A block of JavaScript code. - public string CreateGlobalsAssignmentScript() - { - if (Globals == null) - { - return string.Empty; - } - - var stringBuilder = new StringBuilder(); - - foreach (var property in Globals.Properties()) - { - var propertyNameJavaScriptString = JavaScriptEncoder.Default.Encode(property.Name); - var valueJson = property.Value.ToString(Formatting.None); - var valueJsonJavaScriptString = JavaScriptEncoder.Default.Encode(valueJson); - - stringBuilder.AppendFormat("window[\"{0}\"] = JSON.parse(\"{1}\");", - propertyNameJavaScriptString, - valueJsonJavaScriptString); - } - - return stringBuilder.ToString(); - } - } -} diff --git a/src/Middleware/SpaServices/src/Routing/SpaRouteConstraint.cs b/src/Middleware/SpaServices/src/Routing/SpaRouteConstraint.cs deleted file mode 100644 index 6f25a2537947..000000000000 --- a/src/Middleware/SpaServices/src/Routing/SpaRouteConstraint.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; - -namespace Microsoft.AspNetCore.SpaServices -{ - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal class SpaRouteConstraint : IRouteConstraint - { - private readonly string _clientRouteTokenName; - - public SpaRouteConstraint(string clientRouteTokenName) - { - if (string.IsNullOrEmpty(clientRouteTokenName)) - { - throw new ArgumentException("Value cannot be null or empty", nameof(clientRouteTokenName)); - } - - _clientRouteTokenName = clientRouteTokenName; - } - - public bool Match( - HttpContext httpContext, - IRouter route, - string routeKey, - RouteValueDictionary values, - RouteDirection routeDirection) - { - return !HasDotInLastSegment(values[_clientRouteTokenName] as string ?? string.Empty); - } - - private bool HasDotInLastSegment(string uri) - { - var lastSegmentStartPos = uri.LastIndexOf('/'); - return uri.IndexOf('.', lastSegmentStartPos + 1) >= 0; - } - } -} diff --git a/src/Middleware/SpaServices/src/Routing/SpaRouteExtensions.cs b/src/Middleware/SpaServices/src/Routing/SpaRouteExtensions.cs deleted file mode 100644 index 547cf7c8add6..000000000000 --- a/src/Middleware/SpaServices/src/Routing/SpaRouteExtensions.cs +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNetCore.Routing; -using Microsoft.AspNetCore.SpaServices; - -// Putting in this namespace so it's always available whenever MapRoute is - -namespace Microsoft.AspNetCore.Builder -{ - /// - /// Extension methods useful for configuring routing in a single-page application (SPA). - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class SpaRouteExtensions - { - private const string ClientRouteTokenName = "clientRoute"; - - /// - /// Configures a route that is automatically bypassed if the requested URL appears to be for a static file - /// (e.g., if it has a filename extension). - /// - /// The . - /// The route name. - /// Default route parameters. - /// Route constraints. - /// Route data tokens. - public static void MapSpaFallbackRoute( - this IRouteBuilder routeBuilder, - string name, - object defaults, - object constraints = null, - object dataTokens = null) - { - MapSpaFallbackRoute( - routeBuilder, - name, - /* templatePrefix */ null, - defaults, - constraints, - dataTokens); - } - - /// - /// Configures a route that is automatically bypassed if the requested URL appears to be for a static file - /// (e.g., if it has a filename extension). - /// - /// The . - /// The route name. - /// The template prefix. - /// Default route parameters. - /// Route constraints. - /// Route data tokens. - public static void MapSpaFallbackRoute( - this IRouteBuilder routeBuilder, - string name, - string templatePrefix, - object defaults, - object constraints = null, - object dataTokens = null) - { - var template = CreateRouteTemplate(templatePrefix); - var constraintsDict = ObjectToDictionary(constraints); - constraintsDict.Add(ClientRouteTokenName, new SpaRouteConstraint(ClientRouteTokenName)); - - routeBuilder.MapRoute(name, template, defaults, constraintsDict, dataTokens); - } - - private static string CreateRouteTemplate(string templatePrefix) - { - templatePrefix = templatePrefix ?? string.Empty; - - if (templatePrefix.Contains("?")) - { - // TODO: Consider supporting this. The {*clientRoute} part should be added immediately before the '?' - throw new ArgumentException("SPA fallback route templates don't support querystrings"); - } - - if (templatePrefix.Contains("#")) - { - throw new ArgumentException( - "SPA fallback route templates should not include # characters. The hash part of a URI does not get sent to the server."); - } - - if (templatePrefix != string.Empty && !templatePrefix.EndsWith("/")) - { - templatePrefix += "/"; - } - - return templatePrefix + $"{{*{ClientRouteTokenName}}}"; - } - - private static IDictionary ObjectToDictionary(object value) - => value as IDictionary ?? new RouteValueDictionary(value); - } -} diff --git a/src/Middleware/SpaServices/src/TypeScript/Prerenderer.ts b/src/Middleware/SpaServices/src/TypeScript/Prerenderer.ts deleted file mode 100644 index bc4915471924..000000000000 --- a/src/Middleware/SpaServices/src/TypeScript/Prerenderer.ts +++ /dev/null @@ -1,113 +0,0 @@ -import { BootModuleInfo, RenderToStringFunc, RenderToStringCallback } from '../npm/aspnet-prerendering/src/PrerenderingInterfaces'; -import * as path from 'path'; -declare var __non_webpack_require__; - -// Separate declaration and export just to add type checking on function signature -export const renderToString: RenderToStringFunc = renderToStringImpl; - -// This function is invoked by .NET code (via NodeServices). Its job is to hand off execution to the application's -// prerendering boot function. It can operate in two modes: -// [1] Legacy mode -// This is for backward compatibility with projects created with templates older than the generator version 0.6.0. -// In this mode, we don't really do anything here - we just load the 'aspnet-prerendering' NPM module (which must -// exist in node_modules, and must be v1.x (not v2+)), and pass through all the parameters to it. Code in -// 'aspnet-prerendering' v1.x will locate the boot function and invoke it. -// The drawback to this mode is that, for it to work, you have to deploy node_modules to production. -// [2] Current mode -// This is for projects created with the Yeoman generator 0.6.0+ (or projects manually updated). In this mode, -// we don't invoke 'require' at runtime at all. All our dependencies are bundled into the NuGet package, so you -// don't have to deploy node_modules to production. -// To determine whether we're in mode [1] or [2], the code locates your prerendering boot function, and checks whether -// a certain flag is attached to the function instance. -function renderToStringImpl(callback: RenderToStringCallback, applicationBasePath: string, bootModule: BootModuleInfo, absoluteRequestUrl: string, requestPathAndQuery: string, customDataParameter: any, overrideTimeoutMilliseconds: number) { - try { - const forceLegacy = isLegacyAspNetPrerendering(); - const renderToStringFunc = !forceLegacy && findRenderToStringFunc(applicationBasePath, bootModule); - const isNotLegacyMode = renderToStringFunc && renderToStringFunc['isServerRenderer']; - - if (isNotLegacyMode) { - // Current (non-legacy) mode - we invoke the exported function directly (instead of going through aspnet-prerendering) - // It's type-safe to just apply the incoming args to this function, because we already type-checked that it's a RenderToStringFunc, - // just like renderToStringImpl itself is. - renderToStringFunc.apply(null, arguments); - } else { - // Legacy mode - just hand off execution to 'aspnet-prerendering' v1.x, which must exist in node_modules at runtime - const aspNetPrerenderingV1RenderToString = require('aspnet-prerendering').renderToString; - if (aspNetPrerenderingV1RenderToString) { - aspNetPrerenderingV1RenderToString(callback, applicationBasePath, bootModule, absoluteRequestUrl, requestPathAndQuery, customDataParameter, overrideTimeoutMilliseconds); - } else { - callback('If you use aspnet-prerendering >= 2.0.0, you must update your server-side boot module to call createServerRenderer. ' - + 'Either update your boot module code, or revert to aspnet-prerendering version 1.x'); - } - } - } catch (ex) { - // Make sure loading errors are reported back to the .NET part of the app - callback( - 'Prerendering failed because of error: ' - + ex.stack - + '\nCurrent directory is: ' - + process.cwd() - ); - } -}; - -function findBootModule(applicationBasePath: string, bootModule: BootModuleInfo): any { - const bootModuleNameFullPath = path.resolve(applicationBasePath, bootModule.moduleName); - if (bootModule.webpackConfig) { - // If you're using asp-prerender-webpack-config, you're definitely in legacy mode - return null; - } else { - return __non_webpack_require__(bootModuleNameFullPath); - } -} - -function findRenderToStringFunc(applicationBasePath: string, bootModule: BootModuleInfo): RenderToStringFunc { - // First try to load the module - const foundBootModule = findBootModule(applicationBasePath, bootModule); - if (foundBootModule === null) { - return null; // Must be legacy mode - } - - // Now try to pick out the function they want us to invoke - let renderToStringFunc: RenderToStringFunc; - if (bootModule.exportName) { - // Explicitly-named export - renderToStringFunc = foundBootModule[bootModule.exportName]; - } else if (typeof foundBootModule !== 'function') { - // TypeScript-style default export - renderToStringFunc = foundBootModule.default; - } else { - // Native default export - renderToStringFunc = foundBootModule; - } - - // Validate the result - if (typeof renderToStringFunc !== 'function') { - if (bootModule.exportName) { - throw new Error(`The module at ${ bootModule.moduleName } has no function export named ${ bootModule.exportName }.`); - } else { - throw new Error(`The module at ${ bootModule.moduleName } does not export a default function, and you have not specified which export to invoke.`); - } - } - - return renderToStringFunc; -} - -function isLegacyAspNetPrerendering() { - const version = getAspNetPrerenderingPackageVersion(); - return version && /^1\./.test(version); -} - -function getAspNetPrerenderingPackageVersion() { - try { - const packageEntryPoint = __non_webpack_require__.resolve('aspnet-prerendering'); - const packageDir = path.dirname(packageEntryPoint); - const packageJsonPath = path.join(packageDir, 'package.json'); - const packageJson = __non_webpack_require__(packageJsonPath); - return packageJson.version.toString(); - } catch(ex) { - // Implies aspnet-prerendering isn't in node_modules at all (or node_modules itself doesn't exist, - // which will be the case in production based on latest templates). - return null; - } -} diff --git a/src/Middleware/SpaServices/src/TypeScript/WebpackDevMiddleware.ts b/src/Middleware/SpaServices/src/TypeScript/WebpackDevMiddleware.ts deleted file mode 100644 index 142ca000abbc..000000000000 --- a/src/Middleware/SpaServices/src/TypeScript/WebpackDevMiddleware.ts +++ /dev/null @@ -1,20 +0,0 @@ -// Pass through the invocation to the 'aspnet-webpack' package, verifying that it can be loaded -export function createWebpackDevServer(callback) { - let aspNetWebpack; - try { - aspNetWebpack = require('aspnet-webpack'); - } catch (ex) { - // Developers sometimes have trouble with badly-configured Node installations, where it's unable - // to find node_modules. Or they accidentally fail to deploy node_modules, or even to run 'npm install'. - // Make sure such errors are reported back to the .NET part of the app. - callback( - 'Webpack dev middleware failed because of an error while loading \'aspnet-webpack\'. Error was: ' - + ex.stack - + '\nCurrent directory is: ' - + process.cwd() - ); - return; - } - - return aspNetWebpack.createWebpackDevServer.apply(this, arguments); -} diff --git a/src/Middleware/SpaServices/src/TypeScript/tsconfig.json b/src/Middleware/SpaServices/src/TypeScript/tsconfig.json deleted file mode 100644 index 433cde049347..000000000000 --- a/src/Middleware/SpaServices/src/TypeScript/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "target": "es3", - "module": "commonjs", - "moduleResolution": "node", - "types": ["node"], - "lib": ["es2015"] - }, - "exclude": [ - "node_modules" - ] -} diff --git a/src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddleware.cs b/src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddleware.cs deleted file mode 100644 index 59623ad8794f..000000000000 --- a/src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddleware.cs +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Http; - -namespace Microsoft.AspNetCore.SpaServices.Webpack -{ - /// - /// Based on ProxyMiddleware from https://github.com/aspnet/Proxy/. - /// Differs in that, if the proxied request returns a 404, we pass through to the next middleware in the chain - /// This is useful for Webpack middleware, because it lets you fall back on prebuilt files on disk for - /// chunks not exposed by the current Webpack config (e.g., DLL/vendor chunks). - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal class ConditionalProxyMiddleware - { - private const int DefaultHttpBufferSize = 4096; - - private readonly HttpClient _httpClient; - private readonly RequestDelegate _next; - private readonly ConditionalProxyMiddlewareOptions _options; - private readonly string _pathPrefix; - private readonly bool _pathPrefixIsRoot; - - public ConditionalProxyMiddleware( - RequestDelegate next, - string pathPrefix, - ConditionalProxyMiddlewareOptions options) - { - if (!pathPrefix.StartsWith("/")) - { - pathPrefix = "/" + pathPrefix; - } - - _next = next; - _pathPrefix = pathPrefix; - _pathPrefixIsRoot = string.Equals(_pathPrefix, "/", StringComparison.Ordinal); - _options = options; - _httpClient = new HttpClient(new HttpClientHandler()); - _httpClient.Timeout = _options.RequestTimeout; - } - - public async Task Invoke(HttpContext context) - { - if (context.Request.Path.StartsWithSegments(_pathPrefix) || _pathPrefixIsRoot) - { - var didProxyRequest = await PerformProxyRequest(context); - if (didProxyRequest) - { - return; - } - } - - // Not a request we can proxy - await _next.Invoke(context); - } - - private async Task PerformProxyRequest(HttpContext context) - { - var requestMessage = new HttpRequestMessage(); - - // Copy the request headers - foreach (var header in context.Request.Headers) - { - if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray())) - { - requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()); - } - } - - requestMessage.Headers.Host = _options.Host + ":" + _options.Port; - var uriString = - $"{_options.Scheme}://{_options.Host}:{_options.Port}{context.Request.Path}{context.Request.QueryString}"; - requestMessage.RequestUri = new Uri(uriString); - requestMessage.Method = new HttpMethod(context.Request.Method); - - using ( - var responseMessage = await _httpClient.SendAsync( - requestMessage, - HttpCompletionOption.ResponseHeadersRead, - context.RequestAborted)) - { - if (responseMessage.StatusCode == HttpStatusCode.NotFound) - { - // Let some other middleware handle this - return false; - } - - // We can handle this - context.Response.StatusCode = (int)responseMessage.StatusCode; - foreach (var header in responseMessage.Headers) - { - context.Response.Headers[header.Key] = header.Value.ToArray(); - } - - foreach (var header in responseMessage.Content.Headers) - { - context.Response.Headers[header.Key] = header.Value.ToArray(); - } - - // SendAsync removes chunking from the response. This removes the header so it doesn't expect a chunked response. - context.Response.Headers.Remove("transfer-encoding"); - - using (var responseStream = await responseMessage.Content.ReadAsStreamAsync()) - { - try - { - await responseStream.CopyToAsync(context.Response.Body, DefaultHttpBufferSize, context.RequestAborted); - } - catch (OperationCanceledException) - { - // The CopyToAsync task will be canceled if the client disconnects (e.g., user - // closes or refreshes the browser tab). Don't treat this as an error. - } - } - - return true; - } - } - } -} diff --git a/src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddlewareOptions.cs b/src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddlewareOptions.cs deleted file mode 100644 index 7f6f80fd77f6..000000000000 --- a/src/Middleware/SpaServices/src/Webpack/ConditionalProxyMiddlewareOptions.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNetCore.SpaServices.Webpack -{ - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - internal class ConditionalProxyMiddlewareOptions - { - public ConditionalProxyMiddlewareOptions(string scheme, string host, string port, TimeSpan requestTimeout) - { - Scheme = scheme; - Host = host; - Port = port; - RequestTimeout = requestTimeout; - } - - public string Scheme { get; } - public string Host { get; } - public string Port { get; } - public TimeSpan RequestTimeout { get; } - } -} diff --git a/src/Middleware/SpaServices/src/Webpack/WebpackDevMiddleware.cs b/src/Middleware/SpaServices/src/Webpack/WebpackDevMiddleware.cs deleted file mode 100644 index 1a39d2de2073..000000000000 --- a/src/Middleware/SpaServices/src/Webpack/WebpackDevMiddleware.cs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Threading; -using Microsoft.AspNetCore.NodeServices; -using Microsoft.AspNetCore.SpaServices.Webpack; -using Newtonsoft.Json; -using Newtonsoft.Json.Serialization; - -namespace Microsoft.AspNetCore.Builder -{ - /// - /// Extension methods that can be used to enable Webpack dev middleware support. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static class WebpackDevMiddleware - { - private const string DefaultConfigFile = "webpack.config.js"; - - private static readonly JsonSerializerSettings jsonSerializerSettings = new JsonSerializerSettings - { - // Note that the aspnet-webpack JS code specifically expects options to be serialized with - // PascalCase property names, so it's important to be explicit about this contract resolver - ContractResolver = new DefaultContractResolver(), - - TypeNameHandling = TypeNameHandling.None - }; - - /// - /// Enables Webpack dev middleware support. This hosts an instance of the Webpack compiler in memory - /// in your application so that you can always serve up-to-date Webpack-built resources without having - /// to run the compiler manually. Since the Webpack compiler instance is retained in memory, incremental - /// compilation is vastly faster that re-running the compiler from scratch. - /// - /// Incoming requests that match Webpack-built files will be handled by returning the Webpack compiler - /// output directly, regardless of files on disk. If compilation is in progress when the request arrives, - /// the response will pause until updated compiler output is ready. - /// - /// The . - /// Options for configuring the Webpack compiler instance. - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public static void UseWebpackDevMiddleware( - this IApplicationBuilder appBuilder, - WebpackDevMiddlewareOptions options = null) - { - // Prepare options - if (options == null) - { - options = new WebpackDevMiddlewareOptions(); - } - - // Validate options - if (options.ReactHotModuleReplacement && !options.HotModuleReplacement) - { - throw new ArgumentException( - "To enable ReactHotModuleReplacement, you must also enable HotModuleReplacement."); - } - - // Unlike other consumers of NodeServices, WebpackDevMiddleware dosen't share Node instances, nor does it - // use your DI configuration. It's important for WebpackDevMiddleware to have its own private Node instance - // because it must *not* restart when files change (if it did, you'd lose all the benefits of Webpack - // middleware). And since this is a dev-time-only feature, it doesn't matter if the default transport isn't - // as fast as some theoretical future alternative. - var nodeServicesOptions = new NodeServicesOptions(appBuilder.ApplicationServices); - nodeServicesOptions.WatchFileExtensions = new string[] { }; // Don't watch anything - if (!string.IsNullOrEmpty(options.ProjectPath)) - { - nodeServicesOptions.ProjectPath = options.ProjectPath; - } - - if (options.EnvironmentVariables != null) - { - foreach (var kvp in options.EnvironmentVariables) - { - nodeServicesOptions.EnvironmentVariables[kvp.Key] = kvp.Value; - } - } - - var nodeServices = NodeServicesFactory.CreateNodeServices(nodeServicesOptions); - - // Get a filename matching the middleware Node script - var script = EmbeddedResourceReader.Read(typeof(WebpackDevMiddleware), - "/Content/Node/webpack-dev-middleware.js"); - var nodeScript = new StringAsTempFile(script, nodeServicesOptions.ApplicationStoppingToken); // Will be cleaned up on process exit - - // Ideally, this would be relative to the application's PathBase (so it could work in virtual directories) - // but it's not clear that such information exists during application startup, as opposed to within the context - // of a request. - var hmrEndpoint = !string.IsNullOrEmpty(options.HotModuleReplacementEndpoint) - ? options.HotModuleReplacementEndpoint - : "/__webpack_hmr"; // Matches webpack's built-in default - - // Tell Node to start the server hosting webpack-dev-middleware - var devServerOptions = new - { - webpackConfigPath = Path.Combine(nodeServicesOptions.ProjectPath, options.ConfigFile ?? DefaultConfigFile), - suppliedOptions = options, - understandsMultiplePublicPaths = true, - hotModuleReplacementEndpointUrl = hmrEndpoint - }; - var devServerInfo = - nodeServices.InvokeExportAsync(nodeScript.FileName, "createWebpackDevServer", - JsonConvert.SerializeObject(devServerOptions, jsonSerializerSettings)).Result; - - // If we're talking to an older version of aspnet-webpack, it will return only a single PublicPath, - // not an array of PublicPaths. Handle that scenario. - if (devServerInfo.PublicPaths == null) - { - devServerInfo.PublicPaths = new[] { devServerInfo.PublicPath }; - } - - // Proxy the corresponding requests through ASP.NET and into the Node listener - // Anything under / (e.g., /dist) is proxied as a normal HTTP request with a typical timeout (100s is the default from HttpClient), - // plus /__webpack_hmr is proxied with infinite timeout, because it's an EventSource (long-lived request). - foreach (var publicPath in devServerInfo.PublicPaths) - { - appBuilder.UseProxyToLocalWebpackDevMiddleware(publicPath + hmrEndpoint, devServerInfo.Port, Timeout.InfiniteTimeSpan); - appBuilder.UseProxyToLocalWebpackDevMiddleware(publicPath, devServerInfo.Port, TimeSpan.FromSeconds(100)); - } - } - - private static void UseProxyToLocalWebpackDevMiddleware(this IApplicationBuilder appBuilder, string publicPath, int proxyToPort, TimeSpan requestTimeout) - { - // Note that this is hardcoded to make requests to "localhost" regardless of the hostname of the - // server as far as the client is concerned. This is because ConditionalProxyMiddlewareOptions is - // the one making the internal HTTP requests, and it's going to be to some port on this machine - // because aspnet-webpack hosts the dev server there. We can't use the hostname that the client - // sees, because that could be anything (e.g., some upstream load balancer) and we might not be - // able to make outbound requests to it from here. - // Also note that the webpack HMR service always uses HTTP, even if your app server uses HTTPS, - // because the HMR service has no need for HTTPS (the client doesn't see it directly - all traffic - // to it is proxied), and the HMR service couldn't use HTTPS anyway (in general it wouldn't have - // the necessary certificate). - var proxyOptions = new ConditionalProxyMiddlewareOptions( - "http", "localhost", proxyToPort.ToString(), requestTimeout); - appBuilder.UseMiddleware(publicPath, proxyOptions); - } - -#pragma warning disable CS0649 - class WebpackDevServerInfo - { - public int Port { get; set; } - public string[] PublicPaths { get; set; } - - // For back-compatibility with older versions of aspnet-webpack, in the case where your webpack - // configuration contains exactly one config entry. This will be removed soon. - public string PublicPath { get; set; } - } - } -#pragma warning restore CS0649 -} diff --git a/src/Middleware/SpaServices/src/Webpack/WebpackDevMiddlewareOptions.cs b/src/Middleware/SpaServices/src/Webpack/WebpackDevMiddlewareOptions.cs deleted file mode 100644 index 28685e0d90a9..000000000000 --- a/src/Middleware/SpaServices/src/Webpack/WebpackDevMiddlewareOptions.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNetCore.SpaServices.Webpack -{ - /// - /// Options for configuring a Webpack dev middleware compiler. - /// - [Obsolete("Use Microsoft.AspNetCore.SpaServices.Extensions")] - public class WebpackDevMiddlewareOptions - { - /// - /// If true, hot module replacement (HMR) will be enabled. This automatically updates Webpack-built - /// resources (such as JavaScript, CSS, or images) in your web browser whenever source files are changed. - /// - public bool HotModuleReplacement { get; set; } - - /// - /// If set, overrides the URL that Webpack's client-side code will connect to when listening for updates. - /// This must be a root-relative URL similar to "/__webpack_hmr" (which is the default endpoint). - /// - public string HotModuleReplacementEndpoint { get; set; } - - /// - /// Overrides the internal port number that client-side HMR code will connect to. - /// - public int HotModuleReplacementServerPort { get; set; } - - /// - /// If true, enables React-specific extensions to Webpack's hot module replacement (HMR) feature. - /// This enables React components to be updated without losing their in-memory state. - /// - public bool ReactHotModuleReplacement { get; set; } - - /// - /// Specifies additional options to be passed to the Webpack Hot Middleware client, if used. - /// - public IDictionary HotModuleReplacementClientOptions { get; set; } - - /// - /// Specifies the Webpack configuration file to be used. If not set, defaults to 'webpack.config.js'. - /// - public string ConfigFile { get; set; } - - /// - /// The root path of your project. Webpack runs in this context. - /// - public string ProjectPath { get; set; } - - /// - /// Specifies additional environment variables to be passed to the Node instance hosting - /// the webpack compiler. - /// - public IDictionary EnvironmentVariables { get; set; } - - /// - /// Specifies a value for the "env" parameter to be passed into the Webpack configuration - /// function. The value must be JSON-serializable, and will only be used if the Webpack - /// configuration is exported as a function. - /// - public object EnvParam { get; set; } - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/.gitignore b/src/Middleware/SpaServices/src/npm/aspnet-angular/.gitignore deleted file mode 100644 index 93666fdf9aa7..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -/node_modules/ -**/*.js -**/*.d.ts -**/*.metadata.json -/compiled diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/.npmignore b/src/Middleware/SpaServices/src/npm/aspnet-angular/.npmignore deleted file mode 100644 index 2df2c09c07d4..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -!/*.js -!/*.d.ts -/compiled diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/LICENSE.txt b/src/Middleware/SpaServices/src/npm/aspnet-angular/LICENSE.txt deleted file mode 100644 index 0bdc1962b610..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) .NET Foundation. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the -License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/package.json b/src/Middleware/SpaServices/src/npm/aspnet-angular/package.json deleted file mode 100644 index 5153adeaad0f..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "aspnet-angular", - "version": "0.1.1", - "description": "Helpers for using Angular in ASP.NET Core projects", - "main": "index.js", - "scripts": { - "prepublish": "rimraf *.d.ts && ngc && echo 'Finished building NPM package \"aspnet-angular\"'", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "https://github.com/aspnet/JavaScriptServices.git" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aspnet/JavaScriptServices/issues" - }, - "devDependencies": { - "@angular/common": "^4.3.2", - "@angular/compiler": "^4.3.2", - "@angular/compiler-cli": "^4.3.2", - "@angular/core": "^4.3.2", - "@angular/http": "^4.3.2", - "@angular/platform-browser": "^4.3.2", - "rimraf": "^2.6.1", - "rxjs": "^5.4.2", - "zone.js": "^0.8.16" - }, - "peerDependencies": { - "@angular/core": "^4.2.5 || ^5.0.0-beta" - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/src/HttpWithStateTransfer.ts b/src/Middleware/SpaServices/src/npm/aspnet-angular/src/HttpWithStateTransfer.ts deleted file mode 100644 index 517dd7e784ec..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/src/HttpWithStateTransfer.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { Provider, NgModule, Inject } from '@angular/core'; -import { Headers, Http, ResponseOptions, RequestOptionsArgs, Response } from '@angular/http'; -import { Observable } from 'rxjs/Observable'; -import 'rxjs/add/observable/of'; -import 'rxjs/add/operator/map'; -const globalSerializedStateKey = 'HTTP_STATE_TRANSFER'; -const backingStoreDIToken = 'HTTP_STATE_BACKING_STORE'; - -export interface CacheOptions { - permanent: boolean; -} - -export interface CachedHttpResponse { - headers: { [name: string]: any } | null; - status: number; - statusText: string | null; - text: string; - url: string; -} - -export type BackingStore = { [key: string]: CachedHttpResponse }; - -export class HttpWithStateTransfer { - private backingStore: BackingStore; - private http: Http; - - constructor(@Inject(Http) http: Http, @Inject(backingStoreDIToken) backingStore: BackingStore) { - this.http = http; - this.backingStore = backingStore; - } - - public stateForTransfer(): any { - return { [globalSerializedStateKey]: this.backingStore }; - } - - public get(url: string, options?: CacheOptions, requestOptions?: RequestOptionsArgs): Observable { - return this.getCachedResponse(/* cacheKey */ url, () => this.http.get(url, requestOptions), options); - } - - private getCachedResponse(cacheKey: string, provider: () => Observable, options?: CacheOptions): Observable { - // By default, the cache is only used for the *first* client-side read. So, we're only performing - // a one-time transfer of server-side response to the client. If you want to keep and reuse cached - // responses continually during server-side and client-side execution, set 'permanent' to 'true. - const isClient = typeof window !== 'undefined'; - const isPermanent = options && options.permanent; - - const allowReadFromCache = isClient || isPermanent; - if (allowReadFromCache && this.backingStore.hasOwnProperty(cacheKey)) { - const cachedValue = this.backingStore[cacheKey]; - if (!isPermanent) { - delete this.backingStore[cacheKey]; - } - return Observable.of(new Response(new ResponseOptions({ - body: cachedValue.text, - headers: new Headers(cachedValue.headers), - status: cachedValue.status, - url: cachedValue.url - }))); - } - - return provider() - .map(response => { - const allowWriteToCache = !isClient || isPermanent; - if (allowWriteToCache) { - this.backingStore[cacheKey] = { - headers: response.headers ? response.headers.toJSON() : null, - status: response.status, - statusText: response.statusText, - text: response.text(), - url: response.url - }; - } - - return response; - }); - } -} - -export function defaultBackingStoreFactory() { - const transferredData = typeof window !== 'undefined' ? (window as any)[globalSerializedStateKey] : null; - return transferredData || {}; -} - -@NgModule({ - providers: [ - // The backing store is a separate DI service so you could override exactly how it gets - // transferred from server to client - { provide: backingStoreDIToken, useFactory: defaultBackingStoreFactory }, - - { provide: HttpWithStateTransfer, useClass: HttpWithStateTransfer }, - ] -}) -export class HttpWithStateTransferModule { -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/src/index.ts b/src/Middleware/SpaServices/src/npm/aspnet-angular/src/index.ts deleted file mode 100644 index 93d21853b369..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/src/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './HttpWithStateTransfer'; diff --git a/src/Middleware/SpaServices/src/npm/aspnet-angular/tsconfig.json b/src/Middleware/SpaServices/src/npm/aspnet-angular/tsconfig.json deleted file mode 100644 index 3c6a30b7699e..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-angular/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "experimentalDecorators": true, - "moduleResolution": "node", - "module": "commonjs", - "target": "es5", - "declaration": true, - "outDir": ".", - "lib": ["es2015", "dom"] - }, - "files": [ - "src/index.ts" - ], - "exclude": [ - "node_modules" - ], - "angularCompilerOptions": { - "genDir": "compiled" - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/.gitignore b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/.gitignore deleted file mode 100644 index e1ef4d0a8380..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -/typings/ -/node_modules/ -/**/*.js - -/**/.d.ts -!/src/**/*.d.ts - -yarn.lock diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/.npmignore b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/.npmignore deleted file mode 100644 index 542947e4a990..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -!/*.js -!/*.d.ts -/typings/ -yarn.lock diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/LICENSE.txt b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/LICENSE.txt deleted file mode 100644 index 0bdc1962b610..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) .NET Foundation. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the -License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/README.md b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/README.md deleted file mode 100644 index 30cdc0c29ff4..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Not for general use - -This NPM package is an internal implementation detail of the `Microsoft.AspNetCore.SpaServices` NuGet package. - -You should not use this package directly in your own applications, because it is not supported, and there are no -guarantees about how its APIs will change in the future. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/package.json b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/package.json deleted file mode 100644 index e239460fe839..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "aspnet-prerendering", - "version": "3.0.1", - "description": "Helpers for server-side rendering of JavaScript applications in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.", - "main": "index.js", - "scripts": { - "prepublish": "rimraf *.d.ts && tsc && echo 'Finished building NPM package \"aspnet-prerendering\"'", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aspnet/JavaScriptServices/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/aspnet/JavaScriptServices.git" - }, - "dependencies": { - "domain-task": "^3.0.0" - }, - "devDependencies": { - "@types/node": "^6.0.42", - "rimraf": "^2.5.4", - "typescript": "^2.2.1" - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/Prerendering.ts b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/Prerendering.ts deleted file mode 100644 index a313cbade0cb..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/Prerendering.ts +++ /dev/null @@ -1,112 +0,0 @@ -import * as url from 'url'; -import * as path from 'path'; -import * as domain from 'domain'; -import { run as domainTaskRun, baseUrl as domainTaskBaseUrl } from 'domain-task/main'; -import { BootFunc, BootFuncParams, BootModuleInfo, RenderToStringCallback, RenderToStringFunc } from './PrerenderingInterfaces'; - -const defaultTimeoutMilliseconds = 30 * 1000; - -export function createServerRenderer(bootFunc: BootFunc): RenderToStringFunc { - const resultFunc = (callback: RenderToStringCallback, applicationBasePath: string, bootModule: BootModuleInfo, absoluteRequestUrl: string, requestPathAndQuery: string, customDataParameter: any, overrideTimeoutMilliseconds: number, requestPathBase: string) => { - // Prepare a promise that will represent the completion of all domain tasks in this execution context. - // The boot code will wait for this before performing its final render. - let domainTaskCompletionPromiseResolve; - const domainTaskCompletionPromise = new Promise((resolve, reject) => { - domainTaskCompletionPromiseResolve = resolve; - }); - const parsedAbsoluteRequestUrl = url.parse(absoluteRequestUrl); - const params: BootFuncParams = { - // It's helpful for boot funcs to receive the query as a key-value object, so parse it here - // e.g., react-redux-router requires location.query to be a key-value object for consistency with client-side behaviour - location: url.parse(requestPathAndQuery, /* parseQueryString */ true), - origin: parsedAbsoluteRequestUrl.protocol + '//' + parsedAbsoluteRequestUrl.host, - url: requestPathAndQuery, - baseUrl: (requestPathBase || '') + '/', - absoluteUrl: absoluteRequestUrl, - domainTasks: domainTaskCompletionPromise, - data: customDataParameter - }; - const absoluteBaseUrl = params.origin + params.baseUrl; // Should be same value as page's - - // Open a new domain that can track all the async tasks involved in the app's execution - domainTaskRun(/* code to run */ () => { - // Workaround for Node bug where native Promise continuations lose their domain context - // (https://github.com/nodejs/node-v0.x-archive/issues/8648) - // The domain.active property is set by the domain-context module - bindPromiseContinuationsToDomain(domainTaskCompletionPromise, domain['active']); - - // Make the base URL available to the 'domain-tasks/fetch' helper within this execution context - domainTaskBaseUrl(absoluteBaseUrl); - - // Begin rendering, and apply a timeout - const bootFuncPromise = bootFunc(params); - if (!bootFuncPromise || typeof bootFuncPromise.then !== 'function') { - callback(`Prerendering failed because the boot function in ${bootModule.moduleName} did not return a promise.`, null); - return; - } - const timeoutMilliseconds = overrideTimeoutMilliseconds || defaultTimeoutMilliseconds; // e.g., pass -1 to override as 'never time out' - const bootFuncPromiseWithTimeout = timeoutMilliseconds > 0 - ? wrapWithTimeout(bootFuncPromise, timeoutMilliseconds, - `Prerendering timed out after ${timeoutMilliseconds}ms because the boot function in '${bootModule.moduleName}' ` - + 'returned a promise that did not resolve or reject. Make sure that your boot function always resolves or ' - + 'rejects its promise. You can change the timeout value using the \'asp-prerender-timeout\' tag helper.') - : bootFuncPromise; - - // Actually perform the rendering - bootFuncPromiseWithTimeout.then(successResult => { - callback(null, successResult); - }, error => { - callback(error, null); - }); - }, /* completion callback */ errorOrNothing => { - if (errorOrNothing) { - callback(errorOrNothing, null); - } else { - // There are no more ongoing domain tasks (typically data access operations), so we can resolve - // the domain tasks promise which notifies the boot code that it can do its final render. - domainTaskCompletionPromiseResolve(); - } - }); - }; - - // Indicate to the prerendering code bundled into Microsoft.AspNetCore.SpaServices that this is a serverside rendering - // function, so it can be invoked directly. This flag exists only so that, in its absence, we can run some different - // backward-compatibility logic. - resultFunc['isServerRenderer'] = true; - - return resultFunc; -} - -function wrapWithTimeout(promise: Promise, timeoutMilliseconds: number, timeoutRejectionValue: any): Promise { - return new Promise((resolve, reject) => { - const timeoutTimer = setTimeout(() => { - reject(timeoutRejectionValue); - }, timeoutMilliseconds); - - promise.then( - resolvedValue => { - clearTimeout(timeoutTimer); - resolve(resolvedValue); - }, - rejectedValue => { - clearTimeout(timeoutTimer); - reject(rejectedValue); - } - ) - }); -} - -function bindPromiseContinuationsToDomain(promise: Promise, domainInstance: domain.Domain) { - const originalThen = promise.then; - promise.then = (function then(resolve, reject) { - if (typeof resolve === 'function') { - resolve = domainInstance.bind(resolve); - } - - if (typeof reject === 'function') { - reject = domainInstance.bind(reject); - } - - return originalThen.call(this, resolve, reject); - }) as any; -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/PrerenderingInterfaces.ts b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/PrerenderingInterfaces.ts deleted file mode 100644 index ae101bdff384..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/PrerenderingInterfaces.ts +++ /dev/null @@ -1,39 +0,0 @@ -export interface RenderToStringFunc { - (callback: RenderToStringCallback, applicationBasePath: string, bootModule: BootModuleInfo, absoluteRequestUrl: string, requestPathAndQuery: string, customDataParameter: any, overrideTimeoutMilliseconds: number, requestPathBase: string): void; -} - -export interface RenderToStringCallback { - (error: any, result?: RenderResult): void; -} - -export interface RenderToStringResult { - html: string; - statusCode?: number; - globals?: { [key: string]: any }; -} - -export interface RedirectResult { - redirectUrl: string; -} - -export type RenderResult = RenderToStringResult | RedirectResult; - -export interface BootFunc { - (params: BootFuncParams): Promise; -} - -export interface BootFuncParams { - location: any; // e.g., Location object containing information '/some/path' - origin: string; // e.g., 'https://example.com:1234' - url: string; // e.g., '/some/path' - baseUrl: string; // e.g., '' or '/myVirtualDir' - absoluteUrl: string; // e.g., 'https://example.com:1234/some/path' - domainTasks: Promise; - data: any; // any custom object passed through from .NET -} - -export interface BootModuleInfo { - moduleName: string; - exportName?: string; - webpackConfig?: string; -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/index.ts b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/index.ts deleted file mode 100644 index 082f07c7859e..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './Prerendering'; -export * from './PrerenderingInterfaces'; diff --git a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/tsconfig.json b/src/Middleware/SpaServices/src/npm/aspnet-prerendering/tsconfig.json deleted file mode 100644 index 19facdd357d1..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-prerendering/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "moduleResolution": "node", - "module": "commonjs", - "target": "es5", - "declaration": true, - "outDir": ".", - "lib": ["es2015", "dom"] - }, - "files": [ - "src/index.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.gitignore b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.gitignore deleted file mode 100644 index 025755a4696c..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/node_modules/ -/*.js -/*.d.ts diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.npmignore b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.npmignore deleted file mode 100644 index 858cdc4c3b5f..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -!/*.js -!/*.d.ts -/typings/ diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/LICENSE.txt b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/LICENSE.txt deleted file mode 100644 index 0bdc1962b610..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) .NET Foundation. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the -License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/README.md b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/README.md deleted file mode 100644 index 65f78bc1b628..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/README.md +++ /dev/null @@ -1,11 +0,0 @@ -# Not for general use - -This NPM package is an internal implementation detail of the `Microsoft.AspNetCore.SpaServices` NuGet package. - -You should not use this package directly in your own applications, because it is not supported, and there are no -guarantees about how its APIs will change in the future. - -## History - -* Version 1.x amends the Webpack config to insert `react-transform` and `react-transform-hmr` entries on `babel-loader`. -* Version 2.x drops support for the Babel plugin, and instead amends the Webpack config to insert `react-hot-loader/webpack` and `react-hot-loader/patch` entries. This means it works with React Hot Loader v3. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/package.json b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/package.json deleted file mode 100644 index 0e469c7802b5..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "aspnet-webpack-react", - "version": "4.0.0", - "description": "Helpers for using Webpack with React in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.", - "main": "index.js", - "scripts": { - "prepublish": "rimraf *.d.ts && tsc && echo 'Finished building NPM package \"aspnet-webpack-react\"'", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aspnet/JavaScriptServices/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/aspnet/JavaScriptServices.git" - }, - "devDependencies": { - "@types/webpack": "^4.4.0", - "rimraf": "^2.5.4", - "typescript": "^2.0.0", - "webpack": "^4.16.0" - }, - "peerDependencies": { - "webpack": "^4.0.0" - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/HotModuleReplacement.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/HotModuleReplacement.ts deleted file mode 100644 index 4f63516c21c7..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/HotModuleReplacement.ts +++ /dev/null @@ -1,53 +0,0 @@ -import * as webpack from 'webpack'; - -const supportedTypeScriptLoaders = ['ts-loader', 'awesome-typescript-loader']; - -export function addReactHotModuleReplacementConfig(webpackConfig: webpack.Configuration) { - const moduleConfig = webpackConfig.module as webpack.Module; - const moduleRules = moduleConfig.rules; - if (!moduleRules) { - return; // Unknown rules list format. Might be Webpack 1.x, which is not supported. - } - - // Find the rule that loads TypeScript files, and prepend 'react-hot-loader/webpack' - // to its array of loaders - for (let ruleIndex = 0; ruleIndex < moduleRules.length; ruleIndex++) { - // We only support NewUseRule (i.e., { use: ... }) because OldUseRule doesn't accept array values - const rule = moduleRules[ruleIndex] as webpack.RuleSetRule; - if (!rule.use) { - continue; - } - - // We're looking for the first 'use' value that's a TypeScript loader - const loadersArray: webpack.RuleSetUseItem[] = rule.use instanceof Array ? rule.use : [rule.use as webpack.RuleSetUseItem]; - const isTypescriptLoader = supportedTypeScriptLoaders.some(typeScriptLoaderName => containsLoader(loadersArray, typeScriptLoaderName)); - if (!isTypescriptLoader) { - continue; - } - - break; - } - - // Ensure the entrypoint is prefixed with 'react-hot-loader/patch' (unless it's already in there). - // We only support entrypoints of the form { name: value } (not just 'name' or ['name']) - // because that gives us a place to prepend the new value - if (!webpackConfig.entry || typeof webpackConfig.entry === 'string' || webpackConfig.entry instanceof Array) { - throw new Error('Cannot enable React HMR because \'entry\' in Webpack config is not of the form { name: value }'); - } - const entryConfig = webpackConfig.entry as webpack.Entry; - Object.getOwnPropertyNames(entryConfig).forEach(entrypointName => { - if (typeof(entryConfig[entrypointName]) === 'string') { - // Normalise to array - entryConfig[entrypointName] = [entryConfig[entrypointName] as string]; - } - }); -} - -function containsLoader(loadersArray: webpack.RuleSetUseItem[], loaderName: string) { - return loadersArray.some(loader => { - // Allow 'use' values to be either { loader: 'name' } or 'name' - // No need to support legacy webpack.OldLoader - const actualLoaderName = (loader as webpack.RuleSetLoader).loader || (loader as string); - return actualLoaderName && new RegExp(`\\b${ loaderName }\\b`).test(actualLoaderName); - }); -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/index.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/index.ts deleted file mode 100644 index c4284f2ff6a8..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { addReactHotModuleReplacementConfig } from './HotModuleReplacement'; - -// Temporarily alias addReactHotModuleReplacementConfig as addReactHotModuleReplacementBabelTransform for backward -// compatibility with aspnet-webpack 1.x. In aspnet-webpack 2.0, we can drop the old name (and also deprecate -// some other no-longer-supported functionality, such as LoadViaWebpack). -export { addReactHotModuleReplacementConfig as addReactHotModuleReplacementBabelTransform } from './HotModuleReplacement'; diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/tsconfig.json b/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/tsconfig.json deleted file mode 100644 index 2ebeb45d5f3e..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack-react/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "moduleResolution": "node", - "module": "commonjs", - "target": "es5", - "declaration": true, - "outDir": ".", - "lib": ["es2015"] - }, - "files": [ - "src/index.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/.gitignore b/src/Middleware/SpaServices/src/npm/aspnet-webpack/.gitignore deleted file mode 100644 index 025755a4696c..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/node_modules/ -/*.js -/*.d.ts diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/.npmignore b/src/Middleware/SpaServices/src/npm/aspnet-webpack/.npmignore deleted file mode 100644 index 858cdc4c3b5f..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -!/*.js -!/*.d.ts -/typings/ diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/LICENSE.txt b/src/Middleware/SpaServices/src/npm/aspnet-webpack/LICENSE.txt deleted file mode 100644 index 0bdc1962b610..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) .NET Foundation. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the -License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/README.md b/src/Middleware/SpaServices/src/npm/aspnet-webpack/README.md deleted file mode 100644 index 30cdc0c29ff4..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# Not for general use - -This NPM package is an internal implementation detail of the `Microsoft.AspNetCore.SpaServices` NuGet package. - -You should not use this package directly in your own applications, because it is not supported, and there are no -guarantees about how its APIs will change in the future. diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/package.json b/src/Middleware/SpaServices/src/npm/aspnet-webpack/package.json deleted file mode 100644 index b9b956c287bf..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "aspnet-webpack", - "version": "3.0.0", - "description": "Helpers for using Webpack in ASP.NET Core projects. Works in conjunction with the Microsoft.AspNetCore.SpaServices NuGet package.", - "main": "index.js", - "scripts": { - "prepublish": "rimraf *.d.ts && tsc && echo 'Finished building NPM package \"aspnet-webpack\"'", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aspnet/JavaScriptServices/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/aspnet/JavaScriptServices.git" - }, - "dependencies": { - "connect": "^3.4.1", - "es6-promise": "^3.1.2", - "memory-fs": "^0.3.0", - "require-from-string": "^1.1.0", - "webpack-node-externals": "^1.4.3" - }, - "devDependencies": { - "@types/connect": "^3.4.30", - "@types/node": "^6.0.42", - "@types/webpack": "^4.1.3", - "rimraf": "^2.5.4", - "typescript": "^2.0.0", - "webpack": "^4.5.0" - }, - "peerDependencies": { - "webpack": "^1.13.2 || ^2.1.0-beta || ^3.0.0 || ^4.0.0", - "webpack-dev-middleware": "^1.8.4 || ^3.0.0" - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/LoadViaWebpack.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/LoadViaWebpack.ts deleted file mode 100644 index 0c75afc8bfc9..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/LoadViaWebpack.ts +++ /dev/null @@ -1,146 +0,0 @@ -// When you're using Webpack, it's often convenient to be able to require modules from regular JavaScript -// and have them transformed by Webpack. This is especially useful when doing ASP.NET server-side prerendering, -// because it means your boot module can use whatever source language you like (e.g., TypeScript), and means -// that your loader plugins (e.g., require('./mystyles.less')) work in exactly the same way on the server as -// on the client. -import 'es6-promise'; -import * as path from 'path'; -import * as webpack from 'webpack'; -import { requireNewCopy } from './RequireNewCopy'; - -// Strange import syntax to work around https://github.com/Microsoft/TypeScript/issues/2719 -import { requirefromstring } from './typings/require-from-string'; -import { memoryfs } from './typings/memory-fs'; -const nodeExternals = require('webpack-node-externals'); -const requireFromString = require('require-from-string') as typeof requirefromstring.requireFromString; -const MemoryFS = require('memory-fs') as typeof memoryfs.MemoryFS; - -// Ensure we only go through the compile process once per [config, module] pair -const loadViaWebpackPromisesCache: { [key: string]: any } = {}; - -export interface LoadViaWebpackCallback { - (error: any, result: T): void; -} - -export function loadViaWebpack(webpackConfigPath: string, modulePath: string, callback: LoadViaWebpackCallback) { - const cacheKey = JSON.stringify(webpackConfigPath) + JSON.stringify(modulePath); - if (!(cacheKey in loadViaWebpackPromisesCache)) { - loadViaWebpackPromisesCache[cacheKey] = loadViaWebpackNoCache(webpackConfigPath, modulePath); - } - loadViaWebpackPromisesCache[cacheKey].then(result => { - callback(null, result); - }, error => { - callback(error, null); - }) -} - -function setExtension(filePath: string, newExtension: string) { - const oldExtensionIfAny = path.extname(filePath); - const basenameWithoutExtension = path.basename(filePath, oldExtensionIfAny); - return path.join(path.dirname(filePath), basenameWithoutExtension) + newExtension; -} - -function loadViaWebpackNoCache(webpackConfigPath: string, modulePath: string) { - return new Promise((resolve, reject) => { - // Load the Webpack config and make alterations needed for loading the output into Node - const webpackConfig: webpack.Configuration = requireNewCopy(webpackConfigPath); - webpackConfig.entry = modulePath; - webpackConfig.target = 'node'; - - // Make sure we preserve the 'path' and 'publicPath' config values if specified, as these - // can affect the build output (e.g., when using 'file' loader, the publicPath value gets - // set as a prefix on output paths). - webpackConfig.output = webpackConfig.output || {}; - webpackConfig.output.path = webpackConfig.output.path || '/'; - webpackConfig.output.filename = 'webpack-output.js'; - webpackConfig.output.libraryTarget = 'commonjs'; - const outputVirtualPath = path.join(webpackConfig.output.path, webpackConfig.output.filename); - - // In Node, we want any JavaScript modules under /node_modules/ to be loaded natively and not bundled into the - // output (partly because it's faster, but also because otherwise there'd be different instances of modules - // depending on how they were loaded, which could lead to errors). - // --- - // NOTE: We have to use webpack-node-externals rather than webpack-externals-plugin because - // webpack-externals-plugin doesn't correctly resolve relative paths, which means you can't - // use css-loader, since tries to require('./../../node_modules/css-loader/lib/css-base.js') (see #132) - // --- - // So, ensure that webpackConfig.externals is an array, and push WebpackNodeExternals into it: - let externalsArray: any[] = (webpackConfig.externals as any[]) || []; - if (!(externalsArray instanceof Array)) { - externalsArray = [externalsArray]; - } - webpackConfig.externals = externalsArray; - externalsArray.push(nodeExternals({ - // However, we do *not* want to treat non-JS files under /node_modules/ as externals (i.e., things - // that should be loaded via regular CommonJS 'require' statements). For example, if you reference - // a .css file inside an NPM module (e.g., require('somepackage/somefile.css')), then we do need to - // load that via Webpack rather than as a regular CommonJS module. - // - // So, configure webpack-externals-plugin to 'whitelist' (i.e., not treat as external) any file - // that has an extension other than .js. Also, since some libraries such as font-awesome refer to - // their own files with cache-busting querystrings (e.g., (url('./something.css?v=4.1.2'))), we - // need to treat '?' as an alternative 'end of filename' marker. - // - // The complex, awkward regex can be eliminated once webpack-externals-plugin merges - // https://github.com/liady/webpack-node-externals/pull/12 - // - // This regex looks for at least one dot character that is *not* followed by "js", but - // is followed by some series of non-dot characters followed by : - whitelist: [/\.(?!js(\?|$))([^.]+(\?|$))/] - })); - - // The CommonsChunkPlugin is not compatible with a CommonJS environment like Node, nor is it needed in that case - const ChunkPlugin = webpack.optimize['CommonsChunkPlugin']; - if (ChunkPlugin !== undefined) { - webpackConfig.plugins = webpackConfig.plugins.filter(plugin => { - return !(plugin instanceof ChunkPlugin); - }); - } - - // The typical use case for DllReferencePlugin is for referencing vendor modules. In a Node - // environment, it doesn't make sense to load them from a DLL bundle, nor would that even - // work, because then you'd get different module instances depending on whether a module - // was referenced via a normal CommonJS 'require' or via Webpack. So just remove any - // DllReferencePlugin from the config. - // If someone wanted to load their own DLL modules (not an NPM module) via DllReferencePlugin, - // that scenario is not supported today. We would have to add some extra option to the - // asp-prerender tag helper to let you specify a list of DLL bundles that should be evaluated - // in this context. But even then you'd need special DLL builds for the Node environment so that - // external dependencies were fetched via CommonJS requires, so it's unclear how that could work. - // The ultimate escape hatch here is just prebuilding your code as part of the application build - // and *not* using asp-prerender-webpack-config at all, then you can do anything you want. - webpackConfig.plugins = webpackConfig.plugins.filter(plugin => { - // DllReferencePlugin is missing from webpack.d.ts for some reason, hence referencing it - // as a key-value object property - return !(plugin instanceof webpack['DllReferencePlugin']); - }); - - // Create a compiler instance that stores its output in memory, then load its output - const compiler = webpack(webpackConfig); - compiler.outputFileSystem = new MemoryFS(); - compiler.run((err, stats) => { - if (err) { - reject(err); - } else { - // We're in a callback, so need an explicit try/catch to propagate any errors up the promise chain - try { - if (stats.hasErrors()) { - throw new Error('Webpack compilation reported errors. Compiler output follows: ' - + stats.toString({ chunks: false })); - } - - // The dynamically-built module will only appear in node-inspector if it has some nonempty - // file path. The following value is arbitrary (since there's no real compiled file on disk) - // but is sufficient to enable debugging. - const fakeModulePath = setExtension(modulePath, '.js'); - - const fileContent = compiler.outputFileSystem.readFileSync(outputVirtualPath, 'utf8'); - const moduleInstance = requireFromString(fileContent, fakeModulePath); - resolve(moduleInstance); - } catch(ex) { - reject(ex); - } - } - }); - }); -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/RequireNewCopy.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/RequireNewCopy.ts deleted file mode 100644 index 940c83ef92e5..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/RequireNewCopy.ts +++ /dev/null @@ -1,22 +0,0 @@ -export function requireNewCopy(moduleNameOrPath: string): any { - // Store a reference to whatever's in the 'require' cache, - // so we don't permanently destroy it, and then ensure there's - // no cache entry for this module - const resolvedModule = require.resolve(moduleNameOrPath); - const wasCached = resolvedModule in require.cache; - let cachedInstance; - if (wasCached) { - cachedInstance = require.cache[resolvedModule]; - delete require.cache[resolvedModule]; - } - - try { - // Return a new copy - return require(resolvedModule); - } finally { - // Restore the cached entry, if any - if (wasCached) { - require.cache[resolvedModule] = cachedInstance; - } - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackDevMiddleware.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackDevMiddleware.ts deleted file mode 100644 index 324f5db87875..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackDevMiddleware.ts +++ /dev/null @@ -1,396 +0,0 @@ -import * as connect from 'connect'; -import * as webpack from 'webpack'; -import * as url from 'url'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as querystring from 'querystring'; -import { requireNewCopy } from './RequireNewCopy'; -import { hasSufficientPermissions } from './WebpackTestPermissions'; - -export type CreateDevServerResult = { - Port: number, - PublicPaths: string[] -}; - -export interface CreateDevServerCallback { - (error: any, result: CreateDevServerResult): void; -} - -// These are the options passed by WebpackDevMiddleware.cs -interface CreateDevServerOptions { - webpackConfigPath: string; - suppliedOptions: DevServerOptions; - hotModuleReplacementEndpointUrl: string; -} - -type EsModuleExports = { __esModule: true, default: T }; -type StringMap = [(key: string) => T]; - -// These are the options configured in C# and then JSON-serialized, hence the C#-style naming -interface DevServerOptions { - HotModuleReplacement: boolean; - HotModuleReplacementServerPort: number; - HotModuleReplacementClientOptions: StringMap; - ReactHotModuleReplacement: boolean; - EnvParam: any; -} - -// Interface as defined in es6-promise -interface Thenable { - then(onFulfilled?: (value: T) => U | Thenable, onRejected?: (error: any) => U | Thenable): Thenable; - then(onFulfilled?: (value: T) => U | Thenable, onRejected?: (error: any) => void): Thenable; -} - -// We support these four kinds of webpack.config.js export -type WebpackConfigOrArray = webpack.Configuration | webpack.Configuration[]; -type WebpackConfigOrArrayOrThenable = WebpackConfigOrArray | Thenable; -interface WebpackConfigFunc { - (env?: any): WebpackConfigOrArrayOrThenable; -} -type WebpackConfigExport = WebpackConfigOrArrayOrThenable | WebpackConfigFunc; -type WebpackConfigModuleExports = WebpackConfigExport | EsModuleExports; - -function isThenable(obj: any): obj is Thenable { - return obj && typeof (>obj).then === 'function'; -} - -function attachWebpackDevMiddleware(app: any, webpackConfig: webpack.Configuration, enableHotModuleReplacement: boolean, enableReactHotModuleReplacement: boolean, hmrClientOptions: StringMap, hmrServerEndpoint: string) { - // Build the final Webpack config based on supplied options - if (enableHotModuleReplacement) { - // For this, we only support the key/value config format, not string or string[], since - // those ones don't clearly indicate what the resulting bundle name will be - const entryPoints = webpackConfig.entry; - const isObjectStyleConfig = entryPoints - && typeof entryPoints === 'object' - && !(entryPoints instanceof Array); - if (!isObjectStyleConfig) { - throw new Error('To use HotModuleReplacement, your webpack config must specify an \'entry\' value as a key-value object (e.g., "entry: { main: \'ClientApp/boot-client.ts\' }")'); - } - - // Augment all entry points so they support HMR (unless they already do) - Object.getOwnPropertyNames(entryPoints).forEach(entryPointName => { - const webpackHotMiddlewareEntryPoint = 'webpack-hot-middleware/client'; - const webpackHotMiddlewareOptions = '?' + querystring.stringify(hmrClientOptions); - if (typeof entryPoints[entryPointName] === 'string') { - entryPoints[entryPointName] = [webpackHotMiddlewareEntryPoint + webpackHotMiddlewareOptions, entryPoints[entryPointName]]; - } else if (firstIndexOfStringStartingWith(entryPoints[entryPointName], webpackHotMiddlewareEntryPoint) < 0) { - entryPoints[entryPointName].unshift(webpackHotMiddlewareEntryPoint + webpackHotMiddlewareOptions); - } - - // Now also inject eventsource polyfill so this can work on IE/Edge (unless it's already there) - // To avoid this being a breaking change for everyone who uses aspnet-webpack, we only do this if you've - // referenced event-source-polyfill in your package.json. Note that having event-source-polyfill available - // on the server in node_modules doesn't imply that you've also included it in your client-side bundle, - // but the converse is true (if it's not in node_modules, then you obviously aren't trying to use it at - // all, so it would definitely not work to take a dependency on it). - const eventSourcePolyfillEntryPoint = 'event-source-polyfill'; - if (npmModuleIsPresent(eventSourcePolyfillEntryPoint)) { - const entryPointsArray: string[] = entryPoints[entryPointName]; // We know by now that it's an array, because if it wasn't, we already wrapped it in one - if (entryPointsArray.indexOf(eventSourcePolyfillEntryPoint) < 0) { - const webpackHmrIndex = firstIndexOfStringStartingWith(entryPointsArray, webpackHotMiddlewareEntryPoint); - if (webpackHmrIndex < 0) { - // This should not be possible, since we just added it if it was missing - throw new Error('Cannot find ' + webpackHotMiddlewareEntryPoint + ' in entry points array: ' + entryPointsArray); - } - - // Insert the polyfill just before the HMR entrypoint - entryPointsArray.splice(webpackHmrIndex, 0, eventSourcePolyfillEntryPoint); - } - } - }); - - webpackConfig.plugins = [].concat(webpackConfig.plugins || []); // Be sure not to mutate the original array, as it might be shared - webpackConfig.plugins.push( - new webpack.HotModuleReplacementPlugin() - ); - - // Set up React HMR support if requested. This requires the 'aspnet-webpack-react' package. - if (enableReactHotModuleReplacement) { - let aspNetWebpackReactModule: any; - try { - aspNetWebpackReactModule = require('aspnet-webpack-react'); - } catch(ex) { - throw new Error('ReactHotModuleReplacement failed because of an error while loading \'aspnet-webpack-react\'. Error was: ' + ex.stack); - } - - aspNetWebpackReactModule.addReactHotModuleReplacementBabelTransform(webpackConfig); - } - } - - // Attach Webpack dev middleware and optional 'hot' middleware - const compiler = webpack(webpackConfig); - app.use(require('webpack-dev-middleware')(compiler, { - noInfo: true, - stats: webpackConfig.stats, - publicPath: ensureLeadingSlash(webpackConfig.output.publicPath), - watchOptions: webpackConfig.watchOptions - })); - - // After each compilation completes, copy the in-memory filesystem to disk. - // This is needed because the debuggers in both VS and VS Code assume that they'll be able to find - // the compiled files on the local disk (though it would be better if they got the source file from - // the browser they are debugging, which would be more correct and make this workaround unnecessary). - // Without this, Webpack plugins like HMR that dynamically modify the compiled output in the dev - // middleware's in-memory filesystem only (and not on disk) would confuse the debugger, because the - // file on disk wouldn't match the file served to the browser, and the source map line numbers wouldn't - // match up. Breakpoints would either not be hit, or would hit the wrong lines. - const copy = stats => copyRecursiveToRealFsSync(compiler.outputFileSystem, '/', [/\.hot-update\.(js|json|js\.map)$/]); - if (compiler.hooks) { - compiler.hooks.done.tap('aspnet-webpack', copy); - } else { - compiler.plugin('done', copy); - } - - if (enableHotModuleReplacement) { - let webpackHotMiddlewareModule; - try { - webpackHotMiddlewareModule = require('webpack-hot-middleware'); - } catch (ex) { - throw new Error('HotModuleReplacement failed because of an error while loading \'webpack-hot-middleware\'. Error was: ' + ex.stack); - } - app.use(workaroundIISExpressEventStreamFlushingIssue(hmrServerEndpoint)); - app.use(webpackHotMiddlewareModule(compiler, { - path: hmrServerEndpoint - })); - } -} - -function workaroundIISExpressEventStreamFlushingIssue(path: string): connect.NextHandleFunction { - // IIS Express makes HMR seem very slow, because when it's reverse-proxying an EventStream response - // from Kestrel, it doesn't pass through the lines to the browser immediately, even if you're calling - // response.Flush (or equivalent) in your ASP.NET Core code. For some reason, it waits until the following - // line is sent. By default, that wouldn't be until the next HMR heartbeat, which can be up to 5 seconds later. - // In effect, it looks as if your code is taking 5 seconds longer to compile than it really does. - // - // As a workaround, this connect middleware intercepts requests to the HMR endpoint, and modifies the response - // stream so that all EventStream 'data' lines are immediately followed with a further blank line. This is - // harmless in non-IIS-Express cases, because it's OK to have extra blank lines in an EventStream response. - // The implementation is simplistic - rather than using a true stream reader, we just patch the 'write' - // method. This relies on webpack's HMR code always writing complete EventStream messages with a single - // 'write' call. That works fine today, but if webpack's HMR code was changed, this workaround might have - // to be updated. - const eventStreamLineStart = /^data\:/; - return (req, res, next) => { - // We only want to interfere with requests to the HMR endpoint, so check this request matches - const urlMatchesPath = (req.url === path) || (req.url.split('?', 1)[0] === path); - if (urlMatchesPath) { - const origWrite = res.write; - res.write = function (chunk) { - const result = origWrite.apply(this, arguments); - - // We only want to interfere with actual EventStream data lines, so check it is one - if (typeof (chunk) === 'string') { - if (eventStreamLineStart.test(chunk) && chunk.charAt(chunk.length - 1) === '\n') { - origWrite.call(this, '\n\n'); - } - } - - return result; - } - } - - return next(); - }; -} - -function copyRecursiveToRealFsSync(from: typeof fs, rootDir: string, exclude: RegExp[]) { - from.readdirSync(rootDir).forEach(filename => { - const fullPath = pathJoinSafe(rootDir, filename); - const shouldExclude = exclude.filter(re => re.test(fullPath)).length > 0; - if (!shouldExclude) { - const fileStat = from.statSync(fullPath); - if (fileStat.isFile()) { - const fileBuf = from.readFileSync(fullPath); - fs.writeFileSync(fullPath, fileBuf); - } else if (fileStat.isDirectory()) { - if (!fs.existsSync(fullPath)) { - fs.mkdirSync(fullPath); - } - copyRecursiveToRealFsSync(from, fullPath, exclude); - } - } - }); -} - -function ensureLeadingSlash(value: string) { - if (value !== null && value.substring(0, 1) !== '/') { - value = '/' + value; - } - - return value; -} - -function pathJoinSafe(rootPath: string, filePath: string) { - // On Windows, MemoryFileSystem's readdirSync output produces directory entries like 'C:' - // which then trigger errors if you call statSync for them. Avoid this by detecting drive - // names at the root, and adding a backslash (so 'C:' becomes 'C:\', which works). - if (rootPath === '/' && path.sep === '\\' && filePath.match(/^[a-z0-9]+\:$/i)) { - return filePath + '\\'; - } else { - return path.join(rootPath, filePath); - } -} - -function beginWebpackWatcher(webpackConfig: webpack.Configuration) { - const compiler = webpack(webpackConfig); - compiler.watch(webpackConfig.watchOptions || {}, (err, stats) => { - // The default error reporter is fine for now, but could be customized here in the future if desired - }); -} - -export function createWebpackDevServer(callback: CreateDevServerCallback, optionsJson: string) { - const options: CreateDevServerOptions = JSON.parse(optionsJson); - - // Enable TypeScript loading if the webpack config is authored in TypeScript - if (path.extname(options.webpackConfigPath) === '.ts') { - try { - require('ts-node/register'); - } catch (ex) { - throw new Error('Error while attempting to enable support for Webpack config file written in TypeScript. Make sure your project depends on the "ts-node" NPM package. The underlying error was: ' + ex.stack); - } - } - - // See the large comment in WebpackTestPermissions.ts for details about this - if (!hasSufficientPermissions()) { - console.log('WARNING: Webpack dev middleware is not enabled because the server process does not have sufficient permissions. You should either remove the UseWebpackDevMiddleware call from your code, or to make it work, give your server process user account permission to write to your application directory and to read all ancestor-level directories.'); - callback(null, { - Port: 0, - PublicPaths: [] - }); - return; - } - - // Read the webpack config's export, and normalize it into the more general 'array of configs' format - const webpackConfigModuleExports: WebpackConfigModuleExports = requireNewCopy(options.webpackConfigPath); - let webpackConfigExport = (webpackConfigModuleExports as EsModuleExports<{}>).__esModule === true - ? (webpackConfigModuleExports as EsModuleExports).default - : (webpackConfigModuleExports as WebpackConfigExport); - - if (webpackConfigExport instanceof Function) { - // If you export a function, then Webpack convention is that it takes zero or one param, - // and that param is called `env` and reflects the `--env.*` args you can specify on - // the command line (e.g., `--env.prod`). - // When invoking it via WebpackDevMiddleware, we let you configure the `env` param in - // your Startup.cs. - webpackConfigExport = webpackConfigExport(options.suppliedOptions.EnvParam); - } - - const webpackConfigThenable = isThenable(webpackConfigExport) - ? webpackConfigExport - : { then: callback => callback(webpackConfigExport) } as Thenable; - - webpackConfigThenable.then(webpackConfigResolved => { - const webpackConfigArray = webpackConfigResolved instanceof Array ? webpackConfigResolved : [webpackConfigResolved]; - - const enableHotModuleReplacement = options.suppliedOptions.HotModuleReplacement; - const enableReactHotModuleReplacement = options.suppliedOptions.ReactHotModuleReplacement; - if (enableReactHotModuleReplacement && !enableHotModuleReplacement) { - callback('To use ReactHotModuleReplacement, you must also enable the HotModuleReplacement option.', null); - return; - } - - // The default value, 0, means 'choose randomly' - const suggestedHMRPortOrZero = options.suppliedOptions.HotModuleReplacementServerPort || 0; - - const app = connect(); - const listener = app.listen(suggestedHMRPortOrZero, () => { - try { - // For each webpack config that specifies a public path, add webpack dev middleware for it - const normalizedPublicPaths: string[] = []; - webpackConfigArray.forEach(webpackConfig => { - if (webpackConfig.target === 'node') { - // For configs that target Node, it's meaningless to set up an HTTP listener, since - // Node isn't going to load those modules over HTTP anyway. It just loads them directly - // from disk. So the most relevant thing we can do with such configs is just write - // updated builds to disk, just like "webpack --watch". - beginWebpackWatcher(webpackConfig); - } else { - // For configs that target browsers, we can set up an HTTP listener, and dynamically - // modify the config to enable HMR etc. This just requires that we have a publicPath. - const publicPath = (webpackConfig.output.publicPath || '').trim(); - if (!publicPath) { - throw new Error('To use the Webpack dev server, you must specify a value for \'publicPath\' on the \'output\' section of your webpack config (for any configuration that targets browsers)'); - } - const publicPathNoTrailingSlash = removeTrailingSlash(publicPath); - normalizedPublicPaths.push(publicPathNoTrailingSlash); - - // This is the URL the client will connect to, except that since it's a relative URL - // (no leading slash), Webpack will resolve it against the runtime URL - // plus it also adds the publicPath - const hmrClientEndpoint = removeLeadingSlash(options.hotModuleReplacementEndpointUrl); - - // This is the URL inside the Webpack middleware Node server that we'll proxy to. - // We have to prefix with the public path because Webpack will add the publicPath - // when it resolves hmrClientEndpoint as a relative URL. - const hmrServerEndpoint = ensureLeadingSlash(publicPathNoTrailingSlash + options.hotModuleReplacementEndpointUrl); - - // We always overwrite the 'path' option as it needs to match what the .NET side is expecting - const hmrClientOptions = options.suppliedOptions.HotModuleReplacementClientOptions || >{}; - hmrClientOptions['path'] = hmrClientEndpoint; - - const dynamicPublicPathKey = 'dynamicPublicPath'; - if (!(dynamicPublicPathKey in hmrClientOptions)) { - // dynamicPublicPath default to true, so we can work with nonempty pathbases (virtual directories) - hmrClientOptions[dynamicPublicPathKey] = true; - } else { - // ... but you can set it to any other value explicitly if you want (e.g., false) - hmrClientOptions[dynamicPublicPathKey] = JSON.parse(hmrClientOptions[dynamicPublicPathKey]); - } - - attachWebpackDevMiddleware(app, webpackConfig, enableHotModuleReplacement, enableReactHotModuleReplacement, hmrClientOptions, hmrServerEndpoint); - } - }); - - // Tell the ASP.NET app what addresses we're listening on, so that it can proxy requests here - callback(null, { - Port: listener.address().port, - PublicPaths: normalizedPublicPaths - }); - } catch (ex) { - callback(ex.stack, null); - } - }); - }, - err => callback(err.stack, null) - ); -} - -function removeLeadingSlash(str: string) { - if (str.indexOf('/') === 0) { - str = str.substring(1); - } - - return str; -} - -function removeTrailingSlash(str: string) { - if (str.lastIndexOf('/') === str.length - 1) { - str = str.substring(0, str.length - 1); - } - - return str; -} - -function getPath(publicPath: string) { - return url.parse(publicPath).path; -} - -function firstIndexOfStringStartingWith(array: string[], prefixToFind: string) { - for (let index = 0; index < array.length; index++) { - const candidate = array[index]; - if ((typeof candidate === 'string') && (candidate.substring(0, prefixToFind.length) === prefixToFind)) { - return index; - } - } - - return -1; // Not found -} - -function npmModuleIsPresent(moduleName: string) { - try { - require.resolve(moduleName); - return true; - } catch (ex) { - return false; - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackTestPermissions.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackTestPermissions.ts deleted file mode 100644 index 574761471549..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/WebpackTestPermissions.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as fs from 'fs'; -import * as path from 'path'; -const isWindows = /^win/.test(process.platform); - -// On Windows, Node (still as of v8.1.3) has an issue whereby, when locating JavaScript modules -// on disk, it walks up the directory hierarchy to the disk root, testing whether each directory -// is a symlink or not. This fails with an exception if the process doesn't have permission to -// read those directories. This is a problem when hosting in full IIS, because in typical cases -// the process does not have read permission for higher-level directories. -// -// NodeServices itself works around this by injecting a patched version of Node's 'lstat' API that -// suppresses these irrelevant errors during module loads. This covers most scenarios, but isn't -// enough to make Webpack dev middleware work, because typical Webpack configs use loaders such as -// 'awesome-typescript-loader', which works by forking a child process to do some of its work. The -// child process does not get the patched 'lstat', and hence fails. It's an especially bad failure, -// because the Webpack compiler doesn't even surface the exception - it just never completes the -// compilation process, causing the application to hang indefinitely. -// -// Additionally, Webpack dev middleware will want to write its output to disk, which is also going -// to fail in a typical IIS process, because you won't have 'write' permission to the app dir by -// default. We have to actually write the build output to disk (and not purely keep it in the in- -// memory file system) because the server-side prerendering Node instance is a separate process -// that only knows about code changes when it sees the compiled files on disk change. -// -// In the future, we'll hopefully get Node to fix its underlying issue, and figure out whether VS -// could give 'write' access to the app dir when launching sites in IIS. But until then, disable -// Webpack dev middleware if we detect the server process doesn't have the necessary permissions. - -export function hasSufficientPermissions() { - if (isWindows) { - return canReadDirectoryAndAllAncestors(process.cwd()); - } else { - return true; - } -} - -function canReadDirectoryAndAllAncestors(dir: string): boolean { - if (!canReadDirectory(dir)) { - return false; - } - - const parentDir = path.resolve(dir, '..'); - if (parentDir === dir) { - // There are no more parent directories - we've reached the disk root - return true; - } else { - return canReadDirectoryAndAllAncestors(parentDir); - } -} - -function canReadDirectory(dir: string): boolean { - try { - fs.statSync(dir); - return true; - } catch(ex) { - return false; - } -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/index.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/index.ts deleted file mode 100644 index 2d5ff4b8564f..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { createWebpackDevServer } from './WebpackDevMiddleware'; -export { loadViaWebpack } from './LoadViaWebpack'; diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/memory-fs.d.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/memory-fs.d.ts deleted file mode 100644 index 6a2d353ed6ef..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/memory-fs.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export namespace memoryfs { - export class MemoryFS {} -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/require-from-string.d.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/require-from-string.d.ts deleted file mode 100644 index ba41884c7d58..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/require-from-string.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export namespace requirefromstring { - export function requireFromString(fileContent: string, filename?: string): T; -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/webpack-node-externals.d.ts b/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/webpack-node-externals.d.ts deleted file mode 100644 index 0bc9e4506dd8..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/src/typings/webpack-node-externals.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module 'webpack-node-externals' { -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/tsconfig.json b/src/Middleware/SpaServices/src/npm/aspnet-webpack/tsconfig.json deleted file mode 100644 index edd184de471d..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "moduleResolution": "node", - "module": "commonjs", - "target": "es5", - "declaration": true, - "outDir": ".", - "lib": ["es2015"], - "types": ["node"] - }, - "files": [ - "src/index.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/src/Middleware/SpaServices/src/npm/aspnet-webpack/yarn.lock b/src/Middleware/SpaServices/src/npm/aspnet-webpack/yarn.lock deleted file mode 100644 index 3727098d925e..000000000000 --- a/src/Middleware/SpaServices/src/npm/aspnet-webpack/yarn.lock +++ /dev/null @@ -1,2646 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/anymatch@*": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" - integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA== - -"@types/connect@^3.4.30": - version "3.4.32" - resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" - integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== - dependencies: - "@types/node" "*" - -"@types/node@*": - version "12.12.14" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.14.tgz#1c1d6e3c75dba466e0326948d56e8bd72a1903d2" - integrity sha512-u/SJDyXwuihpwjXy7hOOghagLEV1KdAST6syfnOk6QZAMzZuWZqXy5aYYZbh8Jdpd4escVFP0MvftHNDb9pruA== - -"@types/node@^6.0.42": - version "6.14.9" - resolved "https://registry.yarnpkg.com/@types/node/-/node-6.14.9.tgz#733583e21ef0eab85a9737dfafbaa66345a92ef0" - integrity sha512-leP/gxHunuazPdZaCvsCefPQxinqUDsCxCR5xaDUrY2MkYxQRFZZwU5e7GojyYsGB7QVtCi7iVEl/hoFXQYc+w== - -"@types/source-list-map@*": - version "0.1.2" - resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" - integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== - -"@types/tapable@*": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.4.tgz#b4ffc7dc97b498c969b360a41eee247f82616370" - integrity sha512-78AdXtlhpCHT0K3EytMpn4JNxaf5tbqbLcbIRoQIHzpTIyjpxLQKRoxU55ujBXAtg3Nl2h/XWvfDa9dsMOd0pQ== - -"@types/uglify-js@*": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.4.tgz#96beae23df6f561862a830b4288a49e86baac082" - integrity sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ== - dependencies: - source-map "^0.6.1" - -"@types/webpack-sources@*": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92" - integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w== - dependencies: - "@types/node" "*" - "@types/source-list-map" "*" - source-map "^0.6.1" - -"@types/webpack@^4.1.3": - version "4.41.0" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.0.tgz#b813a044d8b0dec7dfcd7622fdbe327bde06eb9a" - integrity sha512-tWkdf9nO0zFgAY/EumUKwrDUhraHKDqCPhwfFR/R8l0qnPdgb9le0Gzhvb7uzVpouuDGBgiE//ZdY+5jcZy2TA== - dependencies: - "@types/anymatch" "*" - "@types/node" "*" - "@types/tapable" "*" - "@types/uglify-js" "*" - "@types/webpack-sources" "*" - source-map "^0.6.0" - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn@^6.2.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@^6.1.0, ajv@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -chokidar@^2.0.2: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -connect@^3.4.1: - version "3.7.0" - resolved "https://registry.yarnpkg.com/connect/-/connect-3.7.0.tgz#5d49348910caa5e07a01800b030d0c35f20484f8" - integrity sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ== - dependencies: - debug "2.6.9" - finalhandler "1.1.2" - parseurl "~1.3.3" - utils-merge "1.0.1" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -debug@2.6.9, debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -es6-promise@^3.1.2: - version "3.3.1" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" - integrity sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM= - -escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -finalhandler@1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -memory-fs@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.3.0.tgz#7bcc6b629e3a43e871d7e29aca6ae8a7f15cbb20" - integrity sha1-e8xrYp46Q+hx1+Kaymrop/FcuyA= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -on-finished@~2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-from-string@^1.1.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" - integrity sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -semver@^5.3.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -serialize-javascript@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.1.tgz#952907a04a3e3a75af7f73d92d15e233862048b2" - integrity sha512-MPLPRpD4FNqWq9tTIjYG5LesFouDhdyH0EPY3gVK4DRD5+g4aDqdNSzLIwceulo3Yj+PL1bPh6laE5+H6LTcrQ== - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string_decoder@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -terser-webpack-plugin@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.2.tgz#e23c0d554587d1f473bd0cf68627720e733890a4" - integrity sha512-fdEb91kR2l+BVgES77N/NTXWZlpX6vX+pYPjnX5grcDYBF2CMnzJiXX4NNlna4l04lvCW39lZ+O/jSvUhHH/ew== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^2.1.1" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.2.tgz#448fffad0245f4c8a277ce89788b458bfd7706e8" - integrity sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^2.0.0: - version "2.9.2" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" - integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -webpack-node-externals@^1.4.3: - version "1.7.2" - resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz#6e1ee79ac67c070402ba700ef033a9b8d52ac4e3" - integrity sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg== - -webpack-sources@^1.4.0, webpack-sources@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.5.0: - version "4.41.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e" - integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.1" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.1" - watchpack "^1.6.0" - webpack-sources "^1.4.1" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== diff --git a/src/Middleware/SpaServices/src/npm/domain-task/.gitignore b/src/Middleware/SpaServices/src/npm/domain-task/.gitignore deleted file mode 100644 index 025755a4696c..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -/node_modules/ -/*.js -/*.d.ts diff --git a/src/Middleware/SpaServices/src/npm/domain-task/.npmignore b/src/Middleware/SpaServices/src/npm/domain-task/.npmignore deleted file mode 100644 index 858cdc4c3b5f..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/.npmignore +++ /dev/null @@ -1,3 +0,0 @@ -!/*.js -!/*.d.ts -/typings/ diff --git a/src/Middleware/SpaServices/src/npm/domain-task/LICENSE.txt b/src/Middleware/SpaServices/src/npm/domain-task/LICENSE.txt deleted file mode 100644 index 0bdc1962b610..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/LICENSE.txt +++ /dev/null @@ -1,12 +0,0 @@ -Copyright (c) .NET Foundation. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -these files except in compliance with the License. You may obtain a copy of the -License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software distributed -under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR -CONDITIONS OF ANY KIND, either express or implied. See the License for the -specific language governing permissions and limitations under the License. diff --git a/src/Middleware/SpaServices/src/npm/domain-task/README.md b/src/Middleware/SpaServices/src/npm/domain-task/README.md deleted file mode 100644 index 1333ed77b7e1..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/README.md +++ /dev/null @@ -1 +0,0 @@ -TODO diff --git a/src/Middleware/SpaServices/src/npm/domain-task/package.json b/src/Middleware/SpaServices/src/npm/domain-task/package.json deleted file mode 100644 index b22be854a229..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/package.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "name": "domain-task", - "version": "3.0.3", - "description": "Tracks outstanding operations for a logical thread of execution", - "main": "index.js", - "scripts": { - "prepublish": "rimraf *.d.ts && tsc && echo 'Finished building NPM package \"domain-task\"'", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "bugs": { - "url": "https://github.com/aspnet/JavaScriptServices/issues" - }, - "repository": { - "type": "git", - "url": "https://github.com/aspnet/JavaScriptServices.git" - }, - "dependencies": { - "domain-context": "^0.5.1", - "is-absolute-url": "^2.1.0", - "isomorphic-fetch": "^2.2.1" - }, - "devDependencies": { - "@types/node": "^6.0.42", - "rimraf": "^2.5.4", - "typescript": "^2.2.1" - } -} diff --git a/src/Middleware/SpaServices/src/npm/domain-task/src/domain-context.d.ts b/src/Middleware/SpaServices/src/npm/domain-task/src/domain-context.d.ts deleted file mode 100644 index 1114f929fdd9..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/src/domain-context.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -declare module 'domain' { - var active: Domain; -} - -declare module 'domain-context' { - function get(key: string): any; - function set(key: string, value: any): void; - function runInNewDomain(code: () => void): void; -} diff --git a/src/Middleware/SpaServices/src/npm/domain-task/src/fetch.ts b/src/Middleware/SpaServices/src/npm/domain-task/src/fetch.ts deleted file mode 100644 index fa576cf679ac..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/src/fetch.ts +++ /dev/null @@ -1,105 +0,0 @@ -import * as url from 'url'; -import * as domain from 'domain'; -import * as domainContext from 'domain-context'; -import * as isAbsoluteUrl from 'is-absolute-url'; -import { baseUrl } from './main'; -const isomorphicFetch = require('isomorphic-fetch'); -const isNode = typeof process === 'object' && process.versions && !!process.versions.node; -const nodeHttps = isNode && require('https'); -const isHttpsRegex = /^https\:/; - -function issueRequest(baseUrl: string, req: string | Request, init?: RequestInit): Promise { - const reqUrl = (req instanceof Request) ? req.url : req; - const isRelativeUrl = reqUrl && !isAbsoluteUrl(reqUrl); - - // Resolve relative URLs - if (baseUrl) { - if (req instanceof Request) { - const reqAsRequest = req as Request; - (reqAsRequest as any).url = url.resolve(baseUrl, reqAsRequest.url); - } else { - req = url.resolve(baseUrl, req as string); - } - } else if (isNode) { - // TODO: Consider only throwing if it's a relative URL, since absolute ones would work fine - throw new Error(` - When running outside the browser (e.g., in Node.js), you must specify a base URL - before invoking domain-task's 'fetch' wrapper. - Example: - import { baseUrl } from 'domain-task/fetch'; - baseUrl('http://example.com'); // Relative URLs will be resolved against this - `); - } - - init = applyHttpsAgentPolicy(init, isRelativeUrl, baseUrl); - return isomorphicFetch(req, init); -} - -function applyHttpsAgentPolicy(init: RequestInit, isRelativeUrl: boolean, baseUrl: string): RequestInit { - // HTTPS is awkward in Node because it uses a built-in list of CAs, rather than recognizing - // the OS's system-level CA list. There are dozens of issues filed against Node about this, - // but still (as of v8.0.0) no resolution besides manually duplicating your CA config. - // - // The biggest problem for typical isomorphic-SPA development this causes is that if you're - // using a self-signed localhost cert in development, Node won't be able to make API calls - // to it (e.g., https://github.com/aspnet/JavaScriptServices/issues/1089). Developers could - // fix this by either manually configuring the cert in Node (which is extremely inconvenient, - // especially if multiple devs on a team have different self-signed localhost certs), or by - // disabling cert verification on their API requests. - // - // Fortunately, 'domain-task/fetch' knows when you're making a relative-URL request to your - // own web server (as opposed to an arbitrary request to anywhere else). In this specific case, - // there's no real point in cert verification, since the request never even leaves the machine - // so a MitM attack isn't meaningful. So by default, when your code is running in Node and - // is making a relative-URL request, *and* if you haven't explicitly configured any option - // for 'agent' (which would let you set up other HTTPS-handling policies), then we automatically - // disable cert verification for that request. - if (isNode && isRelativeUrl) { - const isHttps = baseUrl && isHttpsRegex.test(baseUrl); - if (isHttps) { - const hasAgentConfig = init && ('agent' in init); - if (!hasAgentConfig) { - const agentForRequest = new (nodeHttps.Agent)({ rejectUnauthorized: false }); - - init = init || {}; - (init as any).agent = agentForRequest; - } - } - } - - return init; -} - -export function fetch(url: string | Request, init?: RequestInit): Promise { - // As of domain-task 2.0.0, we no longer auto-add the 'fetch' promise to the current domain task list. - // This is because it's misleading to do so, and can result in race-condition bugs, e.g., - // https://github.com/aspnet/JavaScriptServices/issues/166 - // - // Consider this usage: - // - // import { fetch } from 'domain-task/fetch'; - // fetch(something).then(callback1).then(callback2) ...etc... .then(data => updateCriticalAppState); - // - // If we auto-add the very first 'fetch' promise to the domain task list, then the domain task completion - // callback might fire at any point among all the chained callbacks. If there are enough chained callbacks, - // it's likely to occur before the final 'updateCriticalAppState' one. Previously we thought it was enough - // for domain-task to use setTimeout(..., 0) so that its action occurred after all synchronously-scheduled - // chained promise callbacks, but this turns out not to be the case. Current versions of Node will run - // setTimeout-scheduled callbacks *before* setImmediate ones, if their timeout has elapsed. So even if you - // use setTimeout(..., 10), then this callback will run before setImmediate(...) if there were 10ms or more - // of CPU-blocking activity. In other words, a race condition. - // - // The correct design is for the final chained promise to be the thing added to the domain task list, but - // this can only be done by the developer and not baked into the 'fetch' API. The developer needs to write - // something like: - // - // var myTask = fetch(something).then(callback1).then(callback2) ...etc... .then(data => updateCriticalAppState); - // addDomainTask(myTask); - // - // ... so that the domain-tasks-completed callback never fires until after 'updateCriticalAppState'. - return issueRequest(baseUrl(), url, init); -} - -// Re-exporting baseUrl from this module for back-compatibility only -// Newer code that wants to access baseUrl should use the version exported from the root of this package -export { baseUrl } from './main'; diff --git a/src/Middleware/SpaServices/src/npm/domain-task/src/index.ts b/src/Middleware/SpaServices/src/npm/domain-task/src/index.ts deleted file mode 100644 index b6cb2ab2da84..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/src/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// This file determines the top-level package exports -export { addTask, run, baseUrl } from './main'; -export { fetch } from './fetch'; diff --git a/src/Middleware/SpaServices/src/npm/domain-task/src/main.ts b/src/Middleware/SpaServices/src/npm/domain-task/src/main.ts deleted file mode 100644 index 0a944d0cc4cc..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/src/main.ts +++ /dev/null @@ -1,85 +0,0 @@ -import * as domain from 'domain'; -import * as domainContext from 'domain-context'; - -// Not using symbols, because this may need to run in a version of Node.js that doesn't support them -const domainTasksStateKey = '__DOMAIN_TASKS'; -const domainTaskBaseUrlStateKey = '__DOMAIN_TASK_INTERNAL_FETCH_BASEURL__DO_NOT_REFERENCE_THIS__'; - -let noDomainBaseUrl: string; - -export function addTask(task: PromiseLike): PromiseLike { - if (task && domain.active) { - const state = domainContext.get(domainTasksStateKey) as DomainTasksState; - if (state) { - state.numRemainingTasks++; - task.then(() => { - // The application may have other listeners chained to this promise *after* - // this listener, which may in turn register further tasks. Since we don't - // want the combined task to complete until all the handlers for child tasks - // have finished, delay the response to give time for more tasks to be added - // synchronously. - setTimeout(() => { - state.numRemainingTasks--; - if (state.numRemainingTasks === 0 && !state.hasIssuedSuccessCallback) { - state.hasIssuedSuccessCallback = true; - setTimeout(() => { - state.completionCallback(/* error */ null); - }, 0); - } - }, 0); - }, (error) => { - state.completionCallback(error); - }); - } - } - - return task; -} - -export function run(codeToRun: () => T, completionCallback: (error: any) => void): T { - let synchronousResult: T; - domainContext.runInNewDomain(() => { - const state: DomainTasksState = { - numRemainingTasks: 0, - hasIssuedSuccessCallback: false, - completionCallback: domain.active.bind(completionCallback) - }; - - try { - domainContext.set(domainTasksStateKey, state); - synchronousResult = codeToRun(); - - // If no tasks were registered synchronously, then we're done already - if (state.numRemainingTasks === 0 && !state.hasIssuedSuccessCallback) { - state.hasIssuedSuccessCallback = true; - setTimeout(() => { - state.completionCallback(/* error */ null); - }, 0); - } - } catch(ex) { - state.completionCallback(ex); - } - }); - - return synchronousResult; -} - -export function baseUrl(url?: string): string { - if (url) { - if (domain.active) { - // There's an active domain (e.g., in Node.js), so associate the base URL with it - domainContext.set(domainTaskBaseUrlStateKey, url); - } else { - // There's no active domain (e.g., in browser), so there's just one shared base URL - noDomainBaseUrl = url; - } - } - - return domain.active ? domainContext.get(domainTaskBaseUrlStateKey) : noDomainBaseUrl; -} - -interface DomainTasksState { - numRemainingTasks: number; - hasIssuedSuccessCallback: boolean; - completionCallback: (error: any) => void; -} diff --git a/src/Middleware/SpaServices/src/npm/domain-task/tsconfig.json b/src/Middleware/SpaServices/src/npm/domain-task/tsconfig.json deleted file mode 100644 index 518dc798e9ae..000000000000 --- a/src/Middleware/SpaServices/src/npm/domain-task/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "moduleResolution": "node", - "module": "commonjs", - "target": "es5", - "declaration": true, - "outDir": ".", - "lib": ["es2015", "dom"] - }, - "files": [ - "src/index.ts", - "src/domain-context.d.ts" - ], - "exclude": [ - "node_modules" - ] -} diff --git a/src/Middleware/SpaServices/src/package.json b/src/Middleware/SpaServices/src/package.json deleted file mode 100644 index 9e9cd841acfa..000000000000 --- a/src/Middleware/SpaServices/src/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "spaservices", - "version": "1.0.0", - "description": "This is not really an NPM package and will not be published. This file exists only to reference compilation tools.", - "private": true, - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1", - "build": "webpack --mode production" - }, - "author": "Microsoft", - "license": "Apache-2.0", - "devDependencies": { - "@types/node": "^10.9.2", - "ts-loader": "^4.5.0", - "typescript": "^3.0.1", - "webpack": "^4.17.1", - "webpack-cli": "^3.1.0" - } -} diff --git a/src/Middleware/SpaServices/src/webpack.config.js b/src/Middleware/SpaServices/src/webpack.config.js deleted file mode 100644 index e2d4c5d60a22..000000000000 --- a/src/Middleware/SpaServices/src/webpack.config.js +++ /dev/null @@ -1,31 +0,0 @@ -const path = require('path'); - -module.exports = { - target: 'node', - externals: [ - // These NPM modules are loaded dynamically at runtime, rather than being bundled into the Content/Node/*.js files - // So, at runtime, they have to either be in node_modules or be built-in Node modules (e.g., 'fs') - 'aspnet-prerendering', - 'aspnet-webpack' - ], - resolve: { - extensions: [ '.ts' ] - }, - module: { - rules: [ - { test: /\.ts$/, use: 'ts-loader' }, - ] - }, - entry: { - 'prerenderer': ['./TypeScript/Prerenderer'], - 'webpack-dev-middleware': ['./TypeScript/WebpackDevMiddleware'], - }, - output: { - libraryTarget: 'commonjs', - path: path.join(__dirname, 'Content', 'Node'), - filename: '[name].js' - }, - optimization: { - minimize: false - } -}; diff --git a/src/Middleware/SpaServices/src/yarn.lock b/src/Middleware/SpaServices/src/yarn.lock deleted file mode 100644 index 78a57b8922e2..000000000000 --- a/src/Middleware/SpaServices/src/yarn.lock +++ /dev/null @@ -1,2938 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/node@^10.9.2": - version "10.17.6" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.6.tgz#1aaabd6f6470a6ac3824ab1e94d731ca1326d93d" - integrity sha512-0a2X6cgN3RdPBL2MIlR6Lt0KlM7fOFsutuXcdglcOq6WvLnYXgPQSh0Mx6tO1KCAE8MxbHSOSTWDoUxRq+l3DA== - -"@webassemblyjs/ast@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.8.5.tgz#51b1c5fe6576a34953bf4b253df9f0d490d9e359" - integrity sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - -"@webassemblyjs/floating-point-hex-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz#1ba926a2923613edce496fd5b02e8ce8a5f49721" - integrity sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ== - -"@webassemblyjs/helper-api-error@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz#c49dad22f645227c5edb610bdb9697f1aab721f7" - integrity sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA== - -"@webassemblyjs/helper-buffer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz#fea93e429863dd5e4338555f42292385a653f204" - integrity sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q== - -"@webassemblyjs/helper-code-frame@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz#9a740ff48e3faa3022b1dff54423df9aa293c25e" - integrity sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ== - dependencies: - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/helper-fsm@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz#ba0b7d3b3f7e4733da6059c9332275d860702452" - integrity sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow== - -"@webassemblyjs/helper-module-context@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz#def4b9927b0101dc8cbbd8d1edb5b7b9c82eb245" - integrity sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g== - dependencies: - "@webassemblyjs/ast" "1.8.5" - mamacro "^0.0.3" - -"@webassemblyjs/helper-wasm-bytecode@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz#537a750eddf5c1e932f3744206551c91c1b93e61" - integrity sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ== - -"@webassemblyjs/helper-wasm-section@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz#74ca6a6bcbe19e50a3b6b462847e69503e6bfcbf" - integrity sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - -"@webassemblyjs/ieee754@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz#712329dbef240f36bf57bd2f7b8fb9bf4154421e" - integrity sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.8.5.tgz#044edeb34ea679f3e04cd4fd9824d5e35767ae10" - integrity sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.8.5.tgz#a8bf3b5d8ffe986c7c1e373ccbdc2a0915f0cedc" - integrity sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw== - -"@webassemblyjs/wasm-edit@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz#962da12aa5acc1c131c81c4232991c82ce56e01a" - integrity sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/helper-wasm-section" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-opt" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - "@webassemblyjs/wast-printer" "1.8.5" - -"@webassemblyjs/wasm-gen@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz#54840766c2c1002eb64ed1abe720aded714f98bc" - integrity sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wasm-opt@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz#b24d9f6ba50394af1349f510afa8ffcb8a63d264" - integrity sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-buffer" "1.8.5" - "@webassemblyjs/wasm-gen" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - -"@webassemblyjs/wasm-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz#21576f0ec88b91427357b8536383668ef7c66b8d" - integrity sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-wasm-bytecode" "1.8.5" - "@webassemblyjs/ieee754" "1.8.5" - "@webassemblyjs/leb128" "1.8.5" - "@webassemblyjs/utf8" "1.8.5" - -"@webassemblyjs/wast-parser@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz#e10eecd542d0e7bd394f6827c49f3df6d4eefb8c" - integrity sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/floating-point-hex-parser" "1.8.5" - "@webassemblyjs/helper-api-error" "1.8.5" - "@webassemblyjs/helper-code-frame" "1.8.5" - "@webassemblyjs/helper-fsm" "1.8.5" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.8.5": - version "1.8.5" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz#114bbc481fd10ca0e23b3560fa812748b0bae5bc" - integrity sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/wast-parser" "1.8.5" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - -acorn@^6.2.1: - version "6.4.0" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.0.tgz#b659d2ffbafa24baf5db1cdbb2c94a983ecd2784" - integrity sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw== - -ajv-errors@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" - integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== - -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da" - integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== - -ajv@^6.1.0, ajv@^6.10.2: - version "6.10.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.10.2.tgz#d3cea04d6b017b2894ad69040fec8b623eb4bd52" - integrity sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw== - dependencies: - fast-deep-equal "^2.0.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - -ansi-regex@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" - integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== - -ansi-styles@^3.2.0, ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - -asn1.js@^4.0.0: - version "4.10.1" - resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" - integrity sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw== - dependencies: - bn.js "^4.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -assert@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" - integrity sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA== - dependencies: - object-assign "^4.1.1" - util "0.10.3" - -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - -atob@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -base64-js@^1.0.2: - version "1.3.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" - integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: - version "4.11.8" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" - integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - -brorand@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= - -browserify-aes@^1.0.0, browserify-aes@^1.0.4: - version "1.2.0" - resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" - integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== - dependencies: - buffer-xor "^1.0.3" - cipher-base "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.3" - inherits "^2.0.1" - safe-buffer "^5.0.1" - -browserify-cipher@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0" - integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w== - dependencies: - browserify-aes "^1.0.4" - browserify-des "^1.0.0" - evp_bytestokey "^1.0.0" - -browserify-des@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz#3af4f1f59839403572f1c66204375f7a7f703e9c" - integrity sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A== - dependencies: - cipher-base "^1.0.1" - des.js "^1.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -browserify-rsa@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" - integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= - dependencies: - bn.js "^4.1.0" - randombytes "^2.0.1" - -browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= - dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" - -browserify-zlib@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" - integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== - dependencies: - pako "~1.0.5" - -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - -buffer-xor@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" - integrity sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk= - -buffer@^4.3.0: - version "4.9.2" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz#230ead344002988644841ab0244af8c44bbe3ef8" - integrity sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg== - dependencies: - base64-js "^1.0.2" - ieee754 "^1.1.4" - isarray "^1.0.0" - -builtin-status-codes@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" - integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug= - -cacache@^12.0.2: - version "12.0.3" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390" - integrity sha512-kqdmfXEGFepesTuROHMs3MpFLWrPkSSpRqOw80RCflZXy/khxaArvFrQ7uJxSUduzAufc6G0g1VUCOZXxWavPw== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - -camelcase@^5.0.0: - version "5.3.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" - integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== - -chalk@2.4.2, chalk@^2.3.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chokidar@^2.0.2: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.3.tgz#42d837d5239688d55f303003a508230fa6727142" - integrity sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - -cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" - integrity sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -cliui@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" - integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== - dependencies: - string-width "^3.1.0" - strip-ansi "^5.2.0" - wrap-ansi "^5.1.0" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - -console-browserify@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" - integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" - integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= - -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -create-ecdh@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" - integrity sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw== - dependencies: - bn.js "^4.1.0" - elliptic "^6.0.0" - -create-hash@^1.1.0, create-hash@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" - integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== - dependencies: - cipher-base "^1.0.1" - inherits "^2.0.1" - md5.js "^1.3.4" - ripemd160 "^2.0.1" - sha.js "^2.4.0" - -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: - version "1.1.7" - resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" - integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== - dependencies: - cipher-base "^1.0.3" - create-hash "^1.1.0" - inherits "^2.0.1" - ripemd160 "^2.0.0" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -cross-spawn@6.0.5, cross-spawn@^6.0.0: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - -crypto-browserify@^3.11.0: - version "3.12.0" - resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" - integrity sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg== - dependencies: - browserify-cipher "^1.0.0" - browserify-sign "^4.0.0" - create-ecdh "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.0" - diffie-hellman "^5.0.0" - inherits "^2.0.1" - pbkdf2 "^3.0.3" - public-encrypt "^4.0.0" - randombytes "^2.0.0" - randomfill "^1.0.3" - -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@^3.2.6: - version "3.2.6" - resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" - integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== - dependencies: - ms "^2.1.1" - -decamelize@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= - -des.js@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz#5382142e1bdc53f85d86d53e5f4aa7deb91e0843" - integrity sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA== - dependencies: - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - -diffie-hellman@^5.0.0: - version "5.0.3" - resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" - integrity sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg== - dependencies: - bn.js "^4.1.0" - miller-rabin "^4.0.0" - randombytes "^2.0.0" - -domain-browser@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" - integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== - -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -elliptic@^6.0.0: - version "6.5.2" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" - integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== - dependencies: - bn.js "^4.4.0" - brorand "^1.0.1" - hash.js "^1.0.0" - hmac-drbg "^1.0.0" - inherits "^2.0.1" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.0" - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== - -emojis-list@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" - integrity sha1-TapNnbAPmBmIDHn6RXrlsJof04k= - -end-of-stream@^1.0.0, end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz#41c7e0bfdfe74ac1ffe1e57ad6a5c6c9f3742a7f" - integrity sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.4.0" - tapable "^1.0.0" - -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz#2937e2b8066cd0fe7ce0990a98f0d71a35189f66" - integrity sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.7" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" - integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== - dependencies: - prr "~1.0.1" - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== - dependencies: - estraverse "^4.1.0" - -estraverse@^4.1.0, estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -events@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88" - integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA== - -evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" - integrity sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA== - dependencies: - md5.js "^1.3.4" - safe-buffer "^5.1.1" - -execa@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" - integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== - dependencies: - cross-spawn "^6.0.0" - get-stream "^4.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -fast-deep-equal@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" - integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= - -fast-json-stable-stringify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" - integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= - -figgy-pudding@^3.5.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" - integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -findup-sync@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - -for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-minipass@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.7.tgz#ccff8570841e7fe4265693da88936c55aed7f7c7" - integrity sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA== - dependencies: - minipass "^2.6.0" - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.9" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.9.tgz#3f5ed66583ccd6f400b5a00db6f7e861363e388f" - integrity sha512-oeyj2H3EjjonWcFjD5NvZNE9Rqe4UW+nQBU2HNeKw0koVLEFIhtyETyAakeAM3de7Z/SW5kcA+fZUait9EApnw== - dependencies: - nan "^2.12.1" - node-pre-gyp "^0.12.0" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -get-caller-file@^2.0.1: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-stream@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-modules@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= - -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hmac-drbg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - -https-browserify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" - integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= - -iconv-lite@^0.4.4: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -ieee754@^1.1.4: - version "1.1.13" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" - integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== - -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - -ignore-walk@^3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.3.tgz#017e2447184bfeade7c238e4aefdd1e8f95b1e37" - integrity sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw== - dependencies: - minimatch "^3.0.4" - -import-local@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" - integrity sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ== - dependencies: - pkg-dir "^3.0.0" - resolve-cwd "^2.0.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" - integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - -ini@^1.3.4, ini@^1.3.5, ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" - integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== - -interpret@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.2.0.tgz#d5061a6224be58e8083985f5014d844359576296" - integrity sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw== - -invert-kv@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" - integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - -is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - -isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== - dependencies: - minimist "^1.2.0" - -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" - integrity sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA== - -lcid@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" - integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== - dependencies: - invert-kv "^2.0.0" - -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - -loader-utils@1.2.3, loader-utils@^1.0.2, loader-utils@^1.2.3: - version "1.2.3" - resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" - integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA== - dependencies: - big.js "^5.2.2" - emojis-list "^2.0.0" - json5 "^1.0.1" - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - -map-age-cleaner@^0.1.1: - version "0.1.3" - resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" - integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== - dependencies: - p-defer "^1.0.0" - -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - -md5.js@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" - integrity sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - safe-buffer "^5.1.2" - -mem@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" - integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== - dependencies: - map-age-cleaner "^0.1.1" - mimic-fn "^2.0.0" - p-is-promise "^2.0.0" - -memory-fs@^0.4.0, memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - -miller-rabin@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" - integrity sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA== - dependencies: - bn.js "^4.0.0" - brorand "^1.0.1" - -mimic-fn@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - -minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.9.0.tgz#e713762e7d3e32fed803115cf93e04bca9fcc9a6" - integrity sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg== - dependencies: - safe-buffer "^5.1.2" - yallist "^3.0.0" - -minizlib@^1.2.1: - version "1.3.3" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-1.3.3.tgz#2290de96818a34c29551c8a8d301216bd65a861d" - integrity sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q== - dependencies: - minipass "^2.9.0" - -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - -ms@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== - -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -needle@^2.2.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/needle/-/needle-2.4.0.tgz#6833e74975c444642590e15a750288c5f939b57c" - integrity sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg== - dependencies: - debug "^3.2.6" - iconv-lite "^0.4.4" - sax "^1.2.4" - -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" - integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== - -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - -node-libs-browser@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz#b64f513d18338625f90346d27b0d235e631f6425" - integrity sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q== - dependencies: - assert "^1.1.1" - browserify-zlib "^0.2.0" - buffer "^4.3.0" - console-browserify "^1.1.0" - constants-browserify "^1.0.0" - crypto-browserify "^3.11.0" - domain-browser "^1.1.1" - events "^3.0.0" - https-browserify "^1.0.0" - os-browserify "^0.3.0" - path-browserify "0.0.1" - process "^0.11.10" - punycode "^1.2.4" - querystring-es3 "^0.2.0" - readable-stream "^2.3.3" - stream-browserify "^2.0.1" - stream-http "^2.7.2" - string_decoder "^1.0.0" - timers-browserify "^2.0.4" - tty-browserify "0.0.0" - url "^0.11.0" - util "^0.11.0" - vm-browserify "^1.0.1" - -node-pre-gyp@^0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz#39ba4bb1439da030295f899e3b520b7785766149" - integrity sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A== - dependencies: - detect-libc "^1.0.2" - mkdirp "^0.5.1" - needle "^2.2.1" - nopt "^4.0.1" - npm-packlist "^1.1.6" - npmlog "^4.0.2" - rc "^1.2.7" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^4" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - integrity sha1-0NRoWv1UFRk8jHUFYC0NF81kR00= - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - -normalize-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -npm-bundled@^1.0.1: - version "1.0.6" - resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" - integrity sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g== - -npm-packlist@^1.1.6: - version "1.4.6" - resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.4.6.tgz#53ba3ed11f8523079f1457376dd379ee4ea42ff4" - integrity sha512-u65uQdb+qwtGvEJh/DgQgW1Xg7sqeNbmxYyrvlNznaVTjV3E5P6F/EFjM+BVHXl7JJlsdG8A64M0XI8FI/IOlg== - dependencies: - ignore-walk "^3.0.1" - npm-bundled "^1.0.1" - -npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -os-browserify@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" - integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - -os-locale@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" - integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== - dependencies: - execa "^1.0.0" - lcid "^2.0.0" - mem "^4.0.0" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= - -osenv@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" - integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -p-defer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" - integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= - -p-finally@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - -p-is-promise@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" - integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== - -p-limit@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" - integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== - dependencies: - p-try "^2.0.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -pako@~1.0.5: - version "1.0.10" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.10.tgz#4328badb5086a426aa90f541977d4955da5c9732" - integrity sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw== - -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - -parse-asn1@^5.0.0: - version "5.1.5" - resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" - integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== - dependencies: - asn1.js "^4.0.0" - browserify-aes "^1.0.0" - create-hash "^1.1.0" - evp_bytestokey "^1.0.0" - pbkdf2 "^3.0.3" - safe-buffer "^5.1.1" - -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - -path-browserify@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" - integrity sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ== - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-key@^2.0.0, path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - -pbkdf2@^3.0.3: - version "3.0.17" - resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6" - integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA== - dependencies: - create-hash "^1.1.2" - create-hmac "^1.1.4" - ripemd160 "^2.0.1" - safe-buffer "^5.0.1" - sha.js "^2.4.8" - -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -process@^0.11.10: - version "0.11.10" - resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" - integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= - -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - -public-encrypt@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" - integrity sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q== - dependencies: - bn.js "^4.1.0" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - parse-asn1 "^5.0.0" - randombytes "^2.0.1" - safe-buffer "^5.1.2" - -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - -punycode@1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" - integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0= - -punycode@^1.2.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - -punycode@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== - -querystring-es3@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" - integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= - -querystring@0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" - integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA= - -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.1.0" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -randomfill@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458" - integrity sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw== - dependencies: - randombytes "^2.0.5" - safe-buffer "^5.1.0" - -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: - version "2.3.6" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" - integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -require-main-filename@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" - integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== - -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - integrity sha1-AKn3OHVW4nA46uIyyqNypqWbZlo= - dependencies: - resolve-from "^3.0.0" - -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - -resolve-from@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" - integrity sha1-six699nWiBvItuZTM17rywoYh0g= - -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - -ripemd160@^2.0.0, ripemd160@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" - integrity sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA== - dependencies: - hash-base "^3.0.0" - inherits "^2.0.1" - -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -schema-utils@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" - integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== - dependencies: - ajv "^6.1.0" - ajv-errors "^1.0.0" - ajv-keywords "^3.1.0" - -semver@^5.0.1, semver@^5.3.0, semver@^5.5.0, semver@^5.6.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -serialize-javascript@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.1.tgz#952907a04a3e3a75af7f73d92d15e233862048b2" - integrity sha512-MPLPRpD4FNqWq9tTIjYG5LesFouDhdyH0EPY3gVK4DRD5+g4aDqdNSzLIwceulo3Yj+PL1bPh6laE5+H6LTcrQ== - -set-blocking@^2.0.0, set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - -setimmediate@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" - integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= - -sha.js@^2.4.0, sha.js@^2.4.8: - version "2.4.11" - resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" - integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== - dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" - -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - -source-list-map@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" - integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== - -source-map-resolve@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.2.tgz#72e2cc34095543e43b2c62b2c4c10d4a9054f259" - integrity sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA== - dependencies: - atob "^2.1.1" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" - integrity sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM= - -source-map@^0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -stream-browserify@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b" - integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg== - dependencies: - inherits "~2.0.1" - readable-stream "^2.0.2" - -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== - dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" - -stream-http@^2.7.2: - version "2.8.3" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz#b2d242469288a5a27ec4fe8933acf623de6514fc" - integrity sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw== - dependencies: - builtin-status-codes "^3.0.0" - inherits "^2.0.1" - readable-stream "^2.3.6" - to-arraybuffer "^1.0.0" - xtend "^4.0.0" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= - -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - -string-width@^3.0.0, string-width@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" - -string_decoder@^1.0.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - -supports-color@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" - integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== - dependencies: - has-flag "^3.0.0" - -supports-color@^5.3.0: - version "5.5.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tar@^4: - version "4.4.13" - resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525" - integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA== - dependencies: - chownr "^1.1.1" - fs-minipass "^1.2.5" - minipass "^2.8.6" - minizlib "^1.2.1" - mkdirp "^0.5.0" - safe-buffer "^5.1.2" - yallist "^3.0.3" - -terser-webpack-plugin@^1.4.1: - version "1.4.2" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.2.tgz#e23c0d554587d1f473bd0cf68627720e733890a4" - integrity sha512-fdEb91kR2l+BVgES77N/NTXWZlpX6vX+pYPjnX5grcDYBF2CMnzJiXX4NNlna4l04lvCW39lZ+O/jSvUhHH/ew== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^2.1.1" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2: - version "4.4.2" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.4.2.tgz#448fffad0245f4c8a277ce89788b458bfd7706e8" - integrity sha512-Uufrsvhj9O1ikwgITGsZ5EZS6qPokUOkCegS7fYOdGTv+OA90vndUbU6PEjr5ePqHfNUbGyMO7xyIZv2MhsALQ== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -timers-browserify@^2.0.4: - version "2.0.11" - resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" - integrity sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ== - dependencies: - setimmediate "^1.0.4" - -to-arraybuffer@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" - integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= - -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - -ts-loader@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-4.5.0.tgz#a1ce70b2dc799941fb2197605f0d67874097859b" - integrity sha512-ihgVaSmgrX4crGV4n7yuoHPoCHbDzj9aepCZR9TgIx4SgJ9gdnB6xLHgUBb7bsFM/f0K6x9iXa65KY/Fu1Klkw== - dependencies: - chalk "^2.3.0" - enhanced-resolve "^4.0.0" - loader-utils "^1.0.2" - micromatch "^3.1.4" - semver "^5.0.1" - -tslib@^1.9.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a" - integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ== - -tty-browserify@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" - integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= - -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - -typescript@^3.0.1: - version "3.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.3.tgz#b36840668a16458a7025b9eabfad11b66ab85c69" - integrity sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw== - -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - -uri-js@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" - integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== - dependencies: - punycode "^2.1.0" - -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - -url@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" - integrity sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE= - dependencies: - punycode "1.3.2" - querystring "0.2.0" - -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -util@0.10.3: - version "0.10.3" - resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" - integrity sha1-evsa/lCAUkZInj23/g7TeTNqwPk= - dependencies: - inherits "2.0.1" - -util@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" - integrity sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ== - dependencies: - inherits "2.0.3" - -v8-compile-cache@2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.3.tgz#00f7494d2ae2b688cfe2899df6ed2c54bef91dbe" - integrity sha512-CNmdbwQMBjwr9Gsmohvm0pbL954tJrNzf6gWL3K+QMQf00PF7ERGrEiLgjuU3mKreLC2MeGhUsNV9ybTbLgd3w== - -vm-browserify@^1.0.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" - integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== - -watchpack@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.0.tgz#4bc12c2ebe8aa277a71f1d3f14d685c7b446cd00" - integrity sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA== - dependencies: - chokidar "^2.0.2" - graceful-fs "^4.1.2" - neo-async "^2.5.0" - -webpack-cli@^3.1.0: - version "3.3.10" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.10.tgz#17b279267e9b4fb549023fae170da8e6e766da13" - integrity sha512-u1dgND9+MXaEt74sJR4PR7qkPxXUSQ0RXYq8x1L6Jg1MYVEmGPrH6Ah6C4arD4r0J1P5HKjRqpab36k0eIzPqg== - dependencies: - chalk "2.4.2" - cross-spawn "6.0.5" - enhanced-resolve "4.1.0" - findup-sync "3.0.0" - global-modules "2.0.0" - import-local "2.0.0" - interpret "1.2.0" - loader-utils "1.2.3" - supports-color "6.1.0" - v8-compile-cache "2.0.3" - yargs "13.2.4" - -webpack-sources@^1.4.0, webpack-sources@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" - integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - -webpack@^4.17.1: - version "4.41.2" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.41.2.tgz#c34ec76daa3a8468c9b61a50336d8e3303dce74e" - integrity sha512-Zhw69edTGfbz9/8JJoyRQ/pq8FYUoY0diOXqW0T6yhgdhCv6wr0hra5DwwWexNRns2Z2+gsnrNcbe9hbGBgk/A== - dependencies: - "@webassemblyjs/ast" "1.8.5" - "@webassemblyjs/helper-module-context" "1.8.5" - "@webassemblyjs/wasm-edit" "1.8.5" - "@webassemblyjs/wasm-parser" "1.8.5" - acorn "^6.2.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.1.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.1" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.1" - watchpack "^1.6.0" - webpack-sources "^1.4.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - -which@^1.2.14, which@^1.2.9, which@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== - dependencies: - string-width "^1.0.2 || 2" - -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== - dependencies: - errno "~0.1.7" - -wrap-ansi@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" - integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== - dependencies: - ansi-styles "^3.2.0" - string-width "^3.0.0" - strip-ansi "^5.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -xtend@^4.0.0, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" - integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== - -yallist@^3.0.0, yallist@^3.0.2, yallist@^3.0.3: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yargs-parser@^13.1.0: - version "13.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.1.tgz#d26058532aa06d365fe091f6a1fc06b2f7e5eca0" - integrity sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" - -yargs@13.2.4: - version "13.2.4" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" - integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== - dependencies: - cliui "^5.0.0" - find-up "^3.0.0" - get-caller-file "^2.0.1" - os-locale "^3.1.0" - require-directory "^2.1.1" - require-main-filename "^2.0.0" - set-blocking "^2.0.0" - string-width "^3.0.0" - which-module "^2.0.0" - y18n "^4.0.0" - yargs-parser "^13.1.0" diff --git a/src/Middleware/SpaServices/test/Microsoft.AspNetCore.SpaServices.Tests.csproj b/src/Middleware/SpaServices/test/Microsoft.AspNetCore.SpaServices.Tests.csproj deleted file mode 100644 index bf7f3dbbb2be..000000000000 --- a/src/Middleware/SpaServices/test/Microsoft.AspNetCore.SpaServices.Tests.csproj +++ /dev/null @@ -1,11 +0,0 @@ - - - - $(DefaultNetCoreTargetFramework) - - - - - - - diff --git a/src/Middleware/SpaServices/test/RenderToStringResultTests.cs b/src/Middleware/SpaServices/test/RenderToStringResultTests.cs deleted file mode 100644 index 2a828c65967d..000000000000 --- a/src/Middleware/SpaServices/test/RenderToStringResultTests.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.AspNetCore.SpaServices.Prerendering; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; -using Xunit; - -namespace Microsoft.AspNetCore.SpaServices.Tests -{ - public class RenderToStringResultTest - { - [Fact] - public void HandlesNullGlobals() - { - // Arrange -#pragma warning disable CS0618 // Type or member is obsolete - var renderToStringResult = new RenderToStringResult(); -#pragma warning restore CS0618 // Type or member is obsolete - renderToStringResult.Globals = null; - - // Act - var actualScript = renderToStringResult.CreateGlobalsAssignmentScript(); - - // Assert - Assert.Equal(string.Empty, actualScript); - } - - [Fact] - public void HandlesGlobalsWithMultipleProperties() - { - // Arrange -#pragma warning disable CS0618 // Type or member is obsolete - var renderToStringResult = new RenderToStringResult(); -#pragma warning restore CS0618 // Type or member is obsolete - renderToStringResult.Globals = ToJObject(new - { - FirstProperty = "first value", - SecondProperty = new[] { "Array entry 0", "Array entry 1" } - }); - - // Act - var actualScript = renderToStringResult.CreateGlobalsAssignmentScript(); - - // Assert - var expectedScript = @"window[""FirstProperty""] = JSON.parse(""\u0022first value\u0022"");" + - @"window[""SecondProperty""] = JSON.parse(""[\u0022Array entry 0\u0022,\u0022Array entry 1\u0022]"");"; - Assert.Equal(expectedScript, actualScript); - } - - [Fact] - public void HandlesGlobalsWithCorrectStringEncoding() - { - // Arrange -#pragma warning disable CS0618 // Type or member is obsolete - var renderToStringResult = new RenderToStringResult(); -#pragma warning restore CS0618 // Type or member is obsolete - renderToStringResult.Globals = ToJObject(new Dictionary - { - { "Va\"'}\u260E" } - }); - - // Act - var actualScript = renderToStringResult.CreateGlobalsAssignmentScript(); - - // Assert - var expectedScript = @"window[""Va\u003Cl\u0027u\u0022e""] = JSON.parse(""\u0022\u003C/tag\u003E\\\u0022\u0027}\u260E\u0022"");"; - Assert.Equal(expectedScript, actualScript); - } - - private static JObject ToJObject(object value) - { - return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(value)); - } - } -} From d9590840d9b72d648b982768ca33731c9b88e1c4 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Wed, 26 Aug 2020 16:21:03 -0700 Subject: [PATCH 04/25] Pass generators to CSC during component discovery --- .../netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets b/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets index 922d3fb34ef2..37bfc6a3d52c 100644 --- a/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets +++ b/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets @@ -187,6 +187,7 @@ Copyright (c) .NET Foundation. All rights reserved. AddModules="@(AddModules)" AdditionalFiles="@(AdditionalFiles)" AllowUnsafeBlocks="$(AllowUnsafeBlocks)" + Analyzers="@(Analyzer)" ApplicationConfiguration="$(AppConfigForCompiler)" BaseAddress="$(BaseAddress)" CheckForOverflowUnderflow="$(CheckForOverflowUnderflow)" @@ -231,6 +232,7 @@ Copyright (c) .NET Foundation. All rights reserved. ResponseFiles="$(CompilerResponseFile)" RuntimeMetadataVersion="$(RuntimeMetadataVersion)" SharedCompilationId="$(SharedCompilationId)" + SkipAnalyzers="true" SkipCompilerExecution="$(SkipCompilerExecution)" Sources="@(_RazorComponentDeclaration);@(Compile)" SubsystemVersion="$(SubsystemVersion)" From a54c5baf7a1fbf90487f375b8dc93d55216b7944 Mon Sep 17 00:00:00 2001 From: William Godbe Date: Thu, 27 Aug 2020 15:56:51 -0700 Subject: [PATCH 05/25] Add TypeReference class to signalr java client (#25286) * Add TypeReference class to signalr java client * Fix syntax * Add comments * Update src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/TypeReference.java Co-authored-by: Brennan * Feedback Co-authored-by: Brennan --- .../com/microsoft/signalr/HubConnection.java | 9 +++++ .../com/microsoft/signalr/TypeReference.java | 38 +++++++++++++++++++ .../microsoft/signalr/HubConnectionTest.java | 2 - .../signalr/JsonHubProtocolTest.java | 2 - .../signalr/MessagePackHubProtocolTest.java | 2 - 5 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/TypeReference.java diff --git a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java index b0bcbb364829..0aa4e4c336ca 100644 --- a/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java +++ b/src/SignalR/clients/java/signalr/src/main/java/com/microsoft/signalr/HubConnection.java @@ -718,6 +718,7 @@ public Single invoke(Class returnType, String method, Object... args) /** * Invokes a hub method on the server using the specified method name and arguments. + * A Type can be retrieved using {@link TypeReference} * * @param returnType The expected return type. * @param method The name of the server method to invoke. @@ -1097,6 +1098,7 @@ public Subscription on(String target, Action8 Subscription on(String target, Action1 callback, Type param1) { /** * Registers a handler that will be invoked when the hub method with the specified method name is invoked. * Should be used for generic classes and Parameterized Collections, like List or Map. + * A Type can be retrieved using {@link TypeReference} * * @param target The name of the hub method to define. * @param callback The handler that will be raised when the hub method is invoked. @@ -1133,6 +1136,7 @@ public Subscription on(String target, Action2 callback, Type pa /** * Registers a handler that will be invoked when the hub method with the specified method name is invoked. * Should be used for generic classes and Parameterized Collections, like List or Map. + * A Type can be retrieved using {@link TypeReference} * * @param target The name of the hub method to define. * @param callback The handler that will be raised when the hub method is invoked. @@ -1157,6 +1161,7 @@ public Subscription on(String target, Action3 callback, /** * Registers a handler that will be invoked when the hub method with the specified method name is invoked. * Should be used for generic classes and Parameterized Collections, like List or Map. + * A Type can be retrieved using {@link TypeReference} * * @param target The name of the hub method to define. * @param callback The handler that will be raised when the hub method is invoked. @@ -1183,6 +1188,7 @@ public Subscription on(String target, Action4 c /** * Registers a handler that will be invoked when the hub method with the specified method name is invoked. * Should be used for generic classes and Parameterized Collections, like List or Map. + * A Type can be retrieved using {@link TypeReference} * * @param target The name of the hub method to define. * @param callback The handler that will be raised when the hub method is invoked. @@ -1212,6 +1218,7 @@ public Subscription on(String target, Action5 Subscription on(String target, Action6 Subscription on(String target, Action7 { + + private final Type type; + + /** + * Creates a new instance of {@link TypeReference}. + * + * To get the Type of Class Foo, use the following syntax: + *
{@code
+     * Type fooType = (new TypeReference() { }).getType();
+     * }
+ */ + public TypeReference() { + Type superclass = getClass().getGenericSuperclass(); + if (superclass instanceof Class) { + throw new RuntimeException("Missing type parameter."); + } + this.type = ((ParameterizedType) superclass).getActualTypeArguments()[0]; + } + + /** + * Gets the referenced type. + */ + public Type getType() { + return this.type; + } +} diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java index 89b5a0efdd9e..402a21c74b91 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/HubConnectionTest.java @@ -18,8 +18,6 @@ import org.junit.jupiter.api.Test; -import com.fasterxml.jackson.core.type.TypeReference; - import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.Single; diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/JsonHubProtocolTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/JsonHubProtocolTest.java index 92febe6ad0bd..1b707d6a53e6 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/JsonHubProtocolTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/JsonHubProtocolTest.java @@ -13,8 +13,6 @@ import org.junit.jupiter.api.Test; -import com.fasterxml.jackson.core.type.TypeReference; - class JsonHubProtocolTest { private JsonHubProtocol jsonHubProtocol = new JsonHubProtocol(); diff --git a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/MessagePackHubProtocolTest.java b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/MessagePackHubProtocolTest.java index 0b508d6e210f..37df89fabfb2 100644 --- a/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/MessagePackHubProtocolTest.java +++ b/src/SignalR/clients/java/signalr/src/test/java/com/microsoft/signalr/MessagePackHubProtocolTest.java @@ -19,8 +19,6 @@ import org.junit.jupiter.api.Test; -import com.fasterxml.jackson.core.type.TypeReference; - class MessagePackHubProtocolTest { private MessagePackHubProtocol messagePackHubProtocol = new MessagePackHubProtocol(); From 866df807a892271e55e0751e17a4fd04dce23e92 Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Thu, 27 Aug 2020 15:57:33 -0700 Subject: [PATCH 06/25] Disable compiler warnings during component discovery phase --- .../netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets b/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets index 37bfc6a3d52c..5ac2e81cd987 100644 --- a/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets +++ b/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets @@ -244,7 +244,7 @@ Copyright (c) .NET Foundation. All rights reserved. UseSharedCompilation="$(UseSharedCompilation)" Utf8Output="$(Utf8Output)" VsSessionGuid="$(VsSessionGuid)" - WarningLevel="$(WarningLevel)" + WarningLevel="0" WarningsAsErrors="$(WarningsAsErrors)" WarningsNotAsErrors="$(WarningsNotAsErrors)" PathMap="$(PathMap)" From aa51b8c1d100a3677d31e66a32eb8608f13cd6df Mon Sep 17 00:00:00 2001 From: Chris Sienkiewicz Date: Thu, 27 Aug 2020 15:57:56 -0700 Subject: [PATCH 07/25] Remove unsupported SkipAnalyzers param --- .../netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets b/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets index 5ac2e81cd987..8f1ceefb014d 100644 --- a/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets +++ b/src/Razor/Microsoft.NET.Sdk.Razor/src/build/netstandard2.0/Microsoft.NET.Sdk.Razor.Component.targets @@ -232,7 +232,6 @@ Copyright (c) .NET Foundation. All rights reserved. ResponseFiles="$(CompilerResponseFile)" RuntimeMetadataVersion="$(RuntimeMetadataVersion)" SharedCompilationId="$(SharedCompilationId)" - SkipAnalyzers="true" SkipCompilerExecution="$(SkipCompilerExecution)" Sources="@(_RazorComponentDeclaration);@(Compile)" SubsystemVersion="$(SubsystemVersion)" From ce058f639cb0fdb12ff8445200071fd83c7f80c0 Mon Sep 17 00:00:00 2001 From: William Godbe Date: Thu, 27 Aug 2020 16:05:40 -0700 Subject: [PATCH 08/25] Add net461 TFM to netstandard2.0 projects (#25094) * Add net461 TFM to netstandard2.0 projects * Fix a couple of errors * Fix some errors * Get rid of Sockets reference * Respond to feedback * net461 -> property * Fixup clientSample * Remove net461 from analyzers/razor * Remove net461 from test projects * Feedback * Add net461 test configs * Remove some incompatible test configs * Fix test --- Directory.Build.props | 1 + eng/Dependencies.props | 1 + eng/Versions.props | 3 ++- ...Extensions.Configuration.KeyPerFile.csproj | 2 +- ...ions.Configuration.KeyPerFile.Tests.csproj | 2 +- ...NetCore.DataProtection.Abstractions.csproj | 2 +- ...e.DataProtection.Abstractions.Tests.csproj | 2 +- ...ft.AspNetCore.Cryptography.Internal.csproj | 2 +- ...NetCore.Cryptography.Internal.Tests.csproj | 2 +- ...pNetCore.Cryptography.KeyDerivation.csproj | 2 +- .../src/PBKDF2/Pbkdf2Util.cs | 2 +- ...re.Cryptography.KeyDerivation.Tests.csproj | 2 +- .../test/Pbkdf2Tests.cs | 19 +++++++++++++++++++ .../src/Managed/ManagedGenRandomImpl.cs | 4 ++-- ...Microsoft.AspNetCore.DataProtection.csproj | 6 +++++- ...spNetCore.DataProtection.Extensions.csproj | 2 +- ...ore.DataProtection.Extensions.Tests.csproj | 2 +- ...e.DataProtection.StackExchangeRedis.csproj | 2 +- ...Protection.StackExchangeRedis.Tests.csproj | 2 +- .../src/Microsoft.AspNetCore.JsonPatch.csproj | 2 +- ...icrosoft.AspNetCore.JsonPatch.Tests.csproj | 2 +- ...t.Extensions.FileProviders.Embedded.csproj | 2 +- ...nsions.FileProviders.Embedded.Tests.csproj | 2 +- ...agnostics.HealthChecks.Abstractions.csproj | 2 +- ...Extensions.Diagnostics.HealthChecks.csproj | 2 +- ...ions.Diagnostics.HealthChecks.Tests.csproj | 2 +- .../Microsoft.AspNetCore.Http.Features.csproj | 7 +++++-- ...soft.AspNetCore.Http.Features.Tests.csproj | 2 +- .../src/Microsoft.AspNetCore.Metadata.csproj | 2 +- .../Microsoft.Extensions.Identity.Core.csproj | 6 ++++-- .../Extensions.Core/src/PasswordHasher.cs | 6 +++--- .../src/Rfc6238AuthenticationService.cs | 6 +++--- .../Extensions.Core/src/UserManager.cs | 4 ++-- ...icrosoft.Extensions.Identity.Stores.csproj | 2 +- ...xtensions.Localization.Abstractions.csproj | 2 +- .../Microsoft.Extensions.Localization.csproj | 2 +- ...ns.Localization.RootNamespace.Tests.csproj | 2 +- ...osoft.Extensions.Localization.Tests.csproj | 2 +- ...Extensions.Logging.AzureAppServices.csproj | 6 +++++- ...ions.Logging.AzureAppServices.Tests.csproj | 2 +- .../Microsoft.Extensions.ObjectPool.csproj | 2 +- ...crosoft.Extensions.ObjectPool.Tests.csproj | 2 +- ...vc.Razor.Extensions.Version1_X.Test.csproj | 2 +- ...vc.Razor.Extensions.Version2_X.Test.csproj | 2 +- ...spNetCore.Mvc.Razor.Extensions.Test.csproj | 2 +- ...soft.AspNetCore.Razor.Language.Test.csproj | 2 +- .../Microsoft.CodeAnalysis.Razor.Test.csproj | 2 +- ...rosoft.AspNetCore.Razor.Test.Common.csproj | 2 +- ...AspNetCore.Razor.Test.ComponentShim.csproj | 2 +- ...tCore.Razor.Test.MvcShim.Version1_X.csproj | 2 +- ...tCore.Razor.Test.MvcShim.Version2_X.csproj | 2 +- ...osoft.AspNetCore.Razor.Test.MvcShim.csproj | 2 +- .../Microsoft.AspNetCore.Authorization.csproj | 2 +- ...AspNetCore.Connections.Abstractions.csproj | 4 ++-- ...soft.AspNetCore.SignalR.Client.Core.csproj | 2 +- ...Microsoft.AspNetCore.SignalR.Client.csproj | 2 +- .../src/Internal/WebSocketsTransport.cs | 2 +- ....AspNetCore.Http.Connections.Client.csproj | 7 ++++++- ....AspNetCore.Http.Connections.Common.csproj | 4 ++-- ...t.AspNetCore.SignalR.Protocols.Json.csproj | 2 +- ...tCore.SignalR.Protocols.MessagePack.csproj | 2 +- ...re.SignalR.Protocols.NewtonsoftJson.csproj | 2 +- ...Microsoft.AspNetCore.SignalR.Common.csproj | 8 ++++++-- .../samples/ClientSample/ClientSample.csproj | 2 +- ...Core.AzureAppServices.SiteExtension.csproj | 2 +- ...zureAppServices.SiteExtension.Tests.csproj | 2 +- src/SiteExtensions/LoggingBranch/LB.csproj | 2 +- .../src/Microsoft.Web.Xdt.Extensions.csproj | 2 +- .../Microsoft.Web.Xdt.Extensions.Tests.csproj | 2 +- .../src/Microsoft.AspNetCore.Testing.csproj | 4 ++-- ...ft.Extensions.ApiDescription.Server.csproj | 2 +- .../src/GetDocument.Insider.csproj | 6 +++--- .../Microsoft.Extensions.WebEncoders.csproj | 4 ++-- ...rosoft.Extensions.WebEncoders.Tests.csproj | 2 +- 74 files changed, 130 insertions(+), 86 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index 520064f60c31..ef167aadb34a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -90,6 +90,7 @@ net5.0 + net461
diff --git a/eng/Dependencies.props b/eng/Dependencies.props index 68e1f6149cd7..1543d4c13bd8 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -69,6 +69,7 @@ and are generated based on the last package release. + diff --git a/eng/Versions.props b/eng/Versions.props index 9c2fd0000ebc..382830cbc124 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -203,7 +203,8 @@ 4.4.0 0.3.0-alpha.19317.1 4.3.0 - 4.3.2 + 4.3.4 + 4.3.0 4.3.0 4.5.3 4.5.0 diff --git a/src/Configuration.KeyPerFile/src/Microsoft.Extensions.Configuration.KeyPerFile.csproj b/src/Configuration.KeyPerFile/src/Microsoft.Extensions.Configuration.KeyPerFile.csproj index aeffe0a751ca..68b2d7072923 100644 --- a/src/Configuration.KeyPerFile/src/Microsoft.Extensions.Configuration.KeyPerFile.csproj +++ b/src/Configuration.KeyPerFile/src/Microsoft.Extensions.Configuration.KeyPerFile.csproj @@ -2,7 +2,7 @@ Configuration provider that uses files in a directory for Microsoft.Extensions.Configuration. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true true diff --git a/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj b/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj index 053553b984ea..09120547434b 100644 --- a/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj +++ b/src/Configuration.KeyPerFile/test/Microsoft.Extensions.Configuration.KeyPerFile.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) diff --git a/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj b/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj index 160fff97e335..55e687fa18e4 100644 --- a/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj +++ b/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj @@ -5,7 +5,7 @@ Commonly used types: Microsoft.AspNetCore.DataProtection.IDataProtectionProvider Microsoft.AspNetCore.DataProtection.IDataProtector - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) true true aspnetcore;dataprotection diff --git a/src/DataProtection/Abstractions/test/Microsoft.AspNetCore.DataProtection.Abstractions.Tests.csproj b/src/DataProtection/Abstractions/test/Microsoft.AspNetCore.DataProtection.Abstractions.Tests.csproj index a6eeb69ec80e..d4566743b294 100644 --- a/src/DataProtection/Abstractions/test/Microsoft.AspNetCore.DataProtection.Abstractions.Tests.csproj +++ b/src/DataProtection/Abstractions/test/Microsoft.AspNetCore.DataProtection.Abstractions.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) diff --git a/src/DataProtection/Cryptography.Internal/src/Microsoft.AspNetCore.Cryptography.Internal.csproj b/src/DataProtection/Cryptography.Internal/src/Microsoft.AspNetCore.Cryptography.Internal.csproj index b23c38e9e5a5..9c9458698e52 100644 --- a/src/DataProtection/Cryptography.Internal/src/Microsoft.AspNetCore.Cryptography.Internal.csproj +++ b/src/DataProtection/Cryptography.Internal/src/Microsoft.AspNetCore.Cryptography.Internal.csproj @@ -2,7 +2,7 @@ Infrastructure for ASP.NET Core cryptographic packages. Applications and libraries should not reference this package directly. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) true $(NoWarn);CS1591 true diff --git a/src/DataProtection/Cryptography.Internal/test/Microsoft.AspNetCore.Cryptography.Internal.Tests.csproj b/src/DataProtection/Cryptography.Internal/test/Microsoft.AspNetCore.Cryptography.Internal.Tests.csproj index 2bce1bc39170..159332b17889 100644 --- a/src/DataProtection/Cryptography.Internal/test/Microsoft.AspNetCore.Cryptography.Internal.Tests.csproj +++ b/src/DataProtection/Cryptography.Internal/test/Microsoft.AspNetCore.Cryptography.Internal.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) true diff --git a/src/DataProtection/Cryptography.KeyDerivation/src/Microsoft.AspNetCore.Cryptography.KeyDerivation.csproj b/src/DataProtection/Cryptography.KeyDerivation/src/Microsoft.AspNetCore.Cryptography.KeyDerivation.csproj index 48e0bf5f5f0b..6d36d60b5a5c 100644 --- a/src/DataProtection/Cryptography.KeyDerivation/src/Microsoft.AspNetCore.Cryptography.KeyDerivation.csproj +++ b/src/DataProtection/Cryptography.KeyDerivation/src/Microsoft.AspNetCore.Cryptography.KeyDerivation.csproj @@ -2,7 +2,7 @@ ASP.NET Core utilities for key derivation. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) true true true diff --git a/src/DataProtection/Cryptography.KeyDerivation/src/PBKDF2/Pbkdf2Util.cs b/src/DataProtection/Cryptography.KeyDerivation/src/PBKDF2/Pbkdf2Util.cs index a3340b13b291..bc4d7efdc29f 100644 --- a/src/DataProtection/Cryptography.KeyDerivation/src/PBKDF2/Pbkdf2Util.cs +++ b/src/DataProtection/Cryptography.KeyDerivation/src/PBKDF2/Pbkdf2Util.cs @@ -27,7 +27,7 @@ private static IPbkdf2Provider GetPbkdf2Provider() } else { -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 return new ManagedPbkdf2Provider(); #elif NETCOREAPP // fastest implementation on .NET Core for Linux/macOS. diff --git a/src/DataProtection/Cryptography.KeyDerivation/test/Microsoft.AspNetCore.Cryptography.KeyDerivation.Tests.csproj b/src/DataProtection/Cryptography.KeyDerivation/test/Microsoft.AspNetCore.Cryptography.KeyDerivation.Tests.csproj index c0d90626fb0b..f650905dd733 100644 --- a/src/DataProtection/Cryptography.KeyDerivation/test/Microsoft.AspNetCore.Cryptography.KeyDerivation.Tests.csproj +++ b/src/DataProtection/Cryptography.KeyDerivation/test/Microsoft.AspNetCore.Cryptography.KeyDerivation.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) true diff --git a/src/DataProtection/Cryptography.KeyDerivation/test/Pbkdf2Tests.cs b/src/DataProtection/Cryptography.KeyDerivation/test/Pbkdf2Tests.cs index aa96359dc8d5..0f088c1a513e 100644 --- a/src/DataProtection/Cryptography.KeyDerivation/test/Pbkdf2Tests.cs +++ b/src/DataProtection/Cryptography.KeyDerivation/test/Pbkdf2Tests.cs @@ -37,7 +37,13 @@ public void RunTest_Normal_NetCore(string password, KeyDerivationPrf prf, int it } // Act & assert +#if NET461 + TestProvider(password, salt, prf, iterationCount, numBytesRequested, expectedValueAsBase64); +#elif NETCOREAPP TestProvider(password, salt, prf, iterationCount, numBytesRequested, expectedValueAsBase64); +#else +#error Update target frameworks +#endif } [Fact] @@ -47,7 +53,13 @@ public void RunTest_WithLongPassword_NetCore_FallbackToManaged() byte[] salt = Encoding.UTF8.GetBytes("salt"); const string expectedDerivedKeyBase64 = "Sc+V/c3fiZq5Z5qH3iavAiojTsW97FAp2eBNmCQAwCNzA8hfhFFYyQLIMK65qPnBFHOHXQPwAxNQNhaEAH9hzfiaNBSRJpF9V4rpl02d5ZpI6cZbsQFF7TJW7XJzQVpYoPDgJlg0xVmYLhn1E9qMtUVUuXsBjOOdd7K1M+ZI00c="; +#if NET461 + RunTest_WithLongPassword_Impl(salt, expectedDerivedKeyBase64); +#elif NETCOREAPP RunTest_WithLongPassword_Impl(salt, expectedDerivedKeyBase64); +#else +#error Update target frameworks +#endif } [Fact] @@ -55,7 +67,14 @@ public void RunTest_WithLongPassword_NetCore() { // salt longer than 8 bytes var salt = Encoding.UTF8.GetBytes("abcdefghijkl"); + +#if NET461 + RunTest_WithLongPassword_Impl(salt, "NGJtFzYUaaSxu+3ZsMeZO5d/qPJDUYW4caLkFlaY0cLSYdh1PN4+nHUVp4pUUubJWu3UeXNMnHKNDfnn8GMfnDVrAGTv1lldszsvUJ0JQ6p4+daQEYBc//Tj/ejuB3luwW0IinyE7U/ViOQKbfi5pCZFMQ0FFx9I+eXRlyT+I74="); +#elif NETCOREAPP RunTest_WithLongPassword_Impl(salt, "NGJtFzYUaaSxu+3ZsMeZO5d/qPJDUYW4caLkFlaY0cLSYdh1PN4+nHUVp4pUUubJWu3UeXNMnHKNDfnn8GMfnDVrAGTv1lldszsvUJ0JQ6p4+daQEYBc//Tj/ejuB3luwW0IinyE7U/ViOQKbfi5pCZFMQ0FFx9I+eXRlyT+I74="); +#else +#error Update target frameworks +#endif } // The 'numBytesRequested' parameters below are chosen to exercise code paths where diff --git a/src/DataProtection/DataProtection/src/Managed/ManagedGenRandomImpl.cs b/src/DataProtection/DataProtection/src/Managed/ManagedGenRandomImpl.cs index 1a96268960f6..c94c2f21f51a 100644 --- a/src/DataProtection/DataProtection/src/Managed/ManagedGenRandomImpl.cs +++ b/src/DataProtection/DataProtection/src/Managed/ManagedGenRandomImpl.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNetCore.DataProtection.Managed { internal unsafe sealed class ManagedGenRandomImpl : IManagedGenRandom { -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); #endif public static readonly ManagedGenRandomImpl Instance = new ManagedGenRandomImpl(); @@ -20,7 +20,7 @@ private ManagedGenRandomImpl() public byte[] GenRandom(int numBytes) { var bytes = new byte[numBytes]; -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 _rng.GetBytes(bytes); #else RandomNumberGenerator.Fill(bytes); diff --git a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj index de50517328a8..8a207fb49174 100644 --- a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj +++ b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj @@ -2,7 +2,7 @@ ASP.NET Core logic to protect and unprotect data, similar to DPAPI. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true $(NoWarn);CS1591 @@ -32,4 +32,8 @@ + + + + diff --git a/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj b/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj index a8947d0584ef..35624976d7ad 100644 --- a/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj +++ b/src/DataProtection/Extensions/src/Microsoft.AspNetCore.DataProtection.Extensions.csproj @@ -2,7 +2,7 @@ Additional APIs for ASP.NET Core data protection. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true true diff --git a/src/DataProtection/Extensions/test/Microsoft.AspNetCore.DataProtection.Extensions.Tests.csproj b/src/DataProtection/Extensions/test/Microsoft.AspNetCore.DataProtection.Extensions.Tests.csproj index 6d8f3d313a24..d8b1cfa10384 100644 --- a/src/DataProtection/Extensions/test/Microsoft.AspNetCore.DataProtection.Extensions.Tests.csproj +++ b/src/DataProtection/Extensions/test/Microsoft.AspNetCore.DataProtection.Extensions.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) diff --git a/src/DataProtection/StackExchangeRedis/src/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.csproj b/src/DataProtection/StackExchangeRedis/src/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.csproj index 499e6be9cafa..ec7a580b6e2f 100644 --- a/src/DataProtection/StackExchangeRedis/src/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.csproj +++ b/src/DataProtection/StackExchangeRedis/src/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.csproj @@ -2,7 +2,7 @@ Support for storing data protection keys in Redis. - netstandard2.0 + $(DefaultNetFxTargetFramework);netstandard2.0 true true aspnetcore;dataprotection;redis diff --git a/src/DataProtection/StackExchangeRedis/test/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.Tests.csproj b/src/DataProtection/StackExchangeRedis/test/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.Tests.csproj index 149d2fff52be..5a457b9c909c 100644 --- a/src/DataProtection/StackExchangeRedis/test/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.Tests.csproj +++ b/src/DataProtection/StackExchangeRedis/test/Microsoft.AspNetCore.DataProtection.StackExchangeRedis.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) diff --git a/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj b/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj index f6f11fd3b3fc..54ac89b43f0e 100644 --- a/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj +++ b/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj @@ -2,7 +2,7 @@ ASP.NET Core support for JSON PATCH. - netstandard2.0 + $(DefaultNetFxTargetFramework);netstandard2.0 $(NoWarn);CS1591 true aspnetcore;json;jsonpatch diff --git a/src/Features/JsonPatch/test/Microsoft.AspNetCore.JsonPatch.Tests.csproj b/src/Features/JsonPatch/test/Microsoft.AspNetCore.JsonPatch.Tests.csproj index d378a4e87696..2afab5ce0a7e 100644 --- a/src/Features/JsonPatch/test/Microsoft.AspNetCore.JsonPatch.Tests.csproj +++ b/src/Features/JsonPatch/test/Microsoft.AspNetCore.JsonPatch.Tests.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) diff --git a/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj b/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj index 459a9973b941..5802aee04053 100644 --- a/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj +++ b/src/FileProviders/Embedded/src/Microsoft.Extensions.FileProviders.Embedded.csproj @@ -3,7 +3,7 @@ Microsoft.Extensions.FileProviders File provider for files in embedded resources for Microsoft.Extensions.FileProviders. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(MSBuildProjectName).multitarget.nuspec $(DefaultNetCoreTargetFramework) $(MSBuildProjectName).netcoreapp.nuspec diff --git a/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj b/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj index a199e4383757..052d44225d22 100644 --- a/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj +++ b/src/FileProviders/Embedded/test/Microsoft.Extensions.FileProviders.Embedded.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) diff --git a/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj b/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj index 93fda5d4de8b..aa4c8c0098fb 100644 --- a/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj +++ b/src/HealthChecks/Abstractions/src/Microsoft.Extensions.Diagnostics.HealthChecks.Abstractions.csproj @@ -7,7 +7,7 @@ Commonly Used Types Microsoft.Extensions.Diagnostics.HealthChecks.IHealthCheck Microsoft.Extensions.Diagnostics.HealthChecks - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) $(NoWarn);CS1591 true diff --git a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj index 7b000f965782..dfcd59db0e46 100644 --- a/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj +++ b/src/HealthChecks/HealthChecks/src/Microsoft.Extensions.Diagnostics.HealthChecks.csproj @@ -6,7 +6,7 @@ Commonly Used Types: Microsoft.Extensions.Diagnostics.HealthChecks.HealthCheckService Microsoft.Extensions.Diagnostics.HealthChecks.IHealthChecksBuilder - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) $(NoWarn);CS1591 true diff --git a/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj b/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj index b58da4203114..8b62bed1155f 100644 --- a/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj +++ b/src/HealthChecks/HealthChecks/test/Microsoft.Extensions.Diagnostics.HealthChecks.Tests.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) Microsoft.Extensions.Diagnostics.HealthChecks enable diff --git a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj index 573821ef754c..aff4e11d9d2c 100644 --- a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj @@ -2,7 +2,7 @@ ASP.NET Core HTTP feature interface definitions. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true $(NoWarn);CS1591 @@ -14,7 +14,10 @@ - + + + + diff --git a/src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj b/src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj index 44552938d5c7..d3e0be0991fe 100644 --- a/src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj +++ b/src/Http/Http.Features/test/Microsoft.AspNetCore.Http.Features.Tests.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);$(DefaultNetCoreTargetFramework) enable diff --git a/src/Http/Metadata/src/Microsoft.AspNetCore.Metadata.csproj b/src/Http/Metadata/src/Microsoft.AspNetCore.Metadata.csproj index 0a760c3f291b..95e8ae3a5eef 100644 --- a/src/Http/Metadata/src/Microsoft.AspNetCore.Metadata.csproj +++ b/src/Http/Metadata/src/Microsoft.AspNetCore.Metadata.csproj @@ -2,7 +2,7 @@ ASP.NET Core metadata. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) true $(NoWarn);CS1591 true diff --git a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj index 5f6681e26114..adf0a1a68e58 100644 --- a/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj +++ b/src/Identity/Extensions.Core/src/Microsoft.Extensions.Identity.Core.csproj @@ -2,7 +2,7 @@ ASP.NET Core Identity is the membership system for building ASP.NET Core web applications, including membership, login, and user data. ASP.NET Core Identity allows you to add login features to your application and makes it easy to customize data about the logged in user. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true true @@ -13,8 +13,10 @@ + - + + diff --git a/src/Identity/Extensions.Core/src/PasswordHasher.cs b/src/Identity/Extensions.Core/src/PasswordHasher.cs index 31703ac59b06..9b8951f20dfe 100644 --- a/src/Identity/Extensions.Core/src/PasswordHasher.cs +++ b/src/Identity/Extensions.Core/src/PasswordHasher.cs @@ -65,7 +65,7 @@ public PasswordHasher(IOptions optionsAccessor = null) _rng = options.Rng; } -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 // Compares two byte arrays for equality. The method is specifically written so that the loop is not optimized. [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] private static bool ByteArraysEqual(byte[] a, byte[] b) @@ -244,7 +244,7 @@ private static bool VerifyHashedPasswordV2(byte[] hashedPassword, string passwor // Hash the incoming password and verify it byte[] actualSubkey = KeyDerivation.Pbkdf2(password, salt, Pbkdf2Prf, Pbkdf2IterCount, Pbkdf2SubkeyLength); -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 return ByteArraysEqual(actualSubkey, expectedSubkey); #elif NETCOREAPP return CryptographicOperations.FixedTimeEquals(actualSubkey, expectedSubkey); @@ -283,7 +283,7 @@ private static bool VerifyHashedPasswordV3(byte[] hashedPassword, string passwor // Hash the incoming password and verify it byte[] actualSubkey = KeyDerivation.Pbkdf2(password, salt, prf, iterCount, subkeyLength); -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 return ByteArraysEqual(actualSubkey, expectedSubkey); #elif NETCOREAPP return CryptographicOperations.FixedTimeEquals(actualSubkey, expectedSubkey); diff --git a/src/Identity/Extensions.Core/src/Rfc6238AuthenticationService.cs b/src/Identity/Extensions.Core/src/Rfc6238AuthenticationService.cs index 9b2b98a39201..3d1ab86933d4 100644 --- a/src/Identity/Extensions.Core/src/Rfc6238AuthenticationService.cs +++ b/src/Identity/Extensions.Core/src/Rfc6238AuthenticationService.cs @@ -13,7 +13,7 @@ internal static class Rfc6238AuthenticationService { private static readonly TimeSpan _timestep = TimeSpan.FromMinutes(3); private static readonly Encoding _encoding = new UTF8Encoding(false, true); -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 private static readonly DateTime _unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); #endif @@ -22,7 +22,7 @@ internal static class Rfc6238AuthenticationService public static byte[] GenerateRandomKey() { byte[] bytes = new byte[20]; -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 _rng.GetBytes(bytes); #else RandomNumberGenerator.Fill(bytes); @@ -68,7 +68,7 @@ private static byte[] ApplyModifier(byte[] input, string modifier) // More info: https://tools.ietf.org/html/rfc6238#section-4 private static ulong GetCurrentTimeStepNumber() { -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 var delta = DateTime.UtcNow - _unixEpoch; #else var delta = DateTimeOffset.UtcNow - DateTimeOffset.UnixEpoch; diff --git a/src/Identity/Extensions.Core/src/UserManager.cs b/src/Identity/Extensions.Core/src/UserManager.cs index afecd4d2355a..8bf0cdfb4861 100644 --- a/src/Identity/Extensions.Core/src/UserManager.cs +++ b/src/Identity/Extensions.Core/src/UserManager.cs @@ -43,7 +43,7 @@ public class UserManager : IDisposable where TUser : class private TimeSpan _defaultLockout = TimeSpan.Zero; private bool _disposed; -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 private static readonly RandomNumberGenerator _rng = RandomNumberGenerator.Create(); #endif private IServiceProvider _services; @@ -2430,7 +2430,7 @@ private IUserRoleStore GetUserRoleStore() private static string NewSecurityStamp() { byte[] bytes = new byte[20]; -#if NETSTANDARD2_0 +#if NETSTANDARD2_0 || NET461 _rng.GetBytes(bytes); #else RandomNumberGenerator.Fill(bytes); diff --git a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj index fd80d41fcd3e..380bf7818c8f 100644 --- a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj +++ b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj @@ -2,7 +2,7 @@ ASP.NET Core Identity is the membership system for building ASP.NET Core web applications, including membership, login, and user data. ASP.NET Core Identity allows you to add login features to your application and makes it easy to customize data about the logged in user. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true true diff --git a/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj b/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj index b97304edf825..d1d954caa380 100644 --- a/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj +++ b/src/Localization/Abstractions/src/Microsoft.Extensions.Localization.Abstractions.csproj @@ -6,7 +6,7 @@ Commonly used types: Microsoft.Extensions.Localization.IStringLocalizer Microsoft.Extensions.Localization.IStringLocalizer<T> - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) $(NoWarn);CS1591 true diff --git a/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj b/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj index d9275db6593d..1f42ed382772 100644 --- a/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj +++ b/src/Localization/Localization/src/Microsoft.Extensions.Localization.csproj @@ -3,7 +3,7 @@ Microsoft .NET Extensions Application localization services and default implementation based on ResourceManager to load localized assembly resources. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) $(NoWarn);CS1591 true diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj index 29d2e8f5046b..793627e68337 100644 --- a/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj +++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.RootNamespace.Tests/Microsoft.Extensions.Localization.RootNamespace.Tests.csproj @@ -1,6 +1,6 @@ - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) LocalizationTest.Abc enable diff --git a/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj index 508310f142ca..f0b96ae1f3c3 100644 --- a/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj +++ b/src/Localization/Localization/test/Microsoft.Extensions.Localization.Tests/Microsoft.Extensions.Localization.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) enable diff --git a/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj b/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj index 2a25b5b2c3d9..ab036f72f275 100644 --- a/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj +++ b/src/Logging.AzureAppServices/src/Microsoft.Extensions.Logging.AzureAppServices.csproj @@ -2,7 +2,7 @@ Logger implementation to support Azure App Services 'Diagnostics logs' and 'Log stream' features. - netstandard2.0 + $(DefaultNetFxTargetFramework);netstandard2.0 $(NoWarn);CS1591 true @@ -20,4 +20,8 @@ + + + + diff --git a/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj b/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj index 7365c790766e..fde35d5fa24d 100644 --- a/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj +++ b/src/Logging.AzureAppServices/test/Microsoft.Extensions.Logging.AzureAppServices.Tests.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) diff --git a/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj b/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj index ff51de0442ad..b2f3e690e35b 100644 --- a/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj +++ b/src/ObjectPool/src/Microsoft.Extensions.ObjectPool.csproj @@ -2,7 +2,7 @@ A simple object pool implementation. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(NoWarn);CS1591 true pooling diff --git a/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj b/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj index bef91a57ebc7..e292498a03cd 100644 --- a/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj +++ b/src/ObjectPool/test/Microsoft.Extensions.ObjectPool.Tests.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) enable diff --git a/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test.csproj b/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test.csproj index 083ef0113425..cccdb7fa3e64 100644 --- a/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test.csproj +++ b/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version1_X.Test.csproj @@ -2,7 +2,7 @@ $(DefaultNetCoreTargetFramework) - $(TargetFrameworks);net461 + $(TargetFrameworks);$(DefaultNetFxTargetFramework) true $(DefaultItemExcludes);TestFiles\** diff --git a/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.Test.csproj b/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.Test.csproj index 2e2fc83450ba..da741703dcb5 100644 --- a/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.Test.csproj +++ b/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Version2_X.Test.csproj @@ -2,7 +2,7 @@ $(DefaultNetCoreTargetFramework) - $(TargetFrameworks);net461 + $(TargetFrameworks);$(DefaultNetFxTargetFramework) true $(DefaultItemExcludes);TestFiles\** diff --git a/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test.csproj b/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test.csproj index 4b460daa5832..c72d1cef6a4b 100644 --- a/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test.csproj +++ b/src/Razor/Microsoft.AspNetCore.Mvc.Razor.Extensions/test/Microsoft.AspNetCore.Mvc.Razor.Extensions.Test.csproj @@ -2,7 +2,7 @@ $(DefaultNetCoreTargetFramework) - $(TargetFrameworks);net461 + $(TargetFrameworks);$(DefaultNetFxTargetFramework) true $(DefaultItemExcludes);TestFiles\** diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Microsoft.AspNetCore.Razor.Language.Test.csproj b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Microsoft.AspNetCore.Razor.Language.Test.csproj index d90b125693fe..368ca11ab81a 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Microsoft.AspNetCore.Razor.Language.Test.csproj +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/Microsoft.AspNetCore.Razor.Language.Test.csproj @@ -2,7 +2,7 @@ $(DefaultNetCoreTargetFramework) - $(TargetFrameworks);net461 + $(TargetFrameworks);$(DefaultNetFxTargetFramework) $(DefaultItemExcludes);TestFiles\**\* $(DefineConstants);GENERATE_BASELINES diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/test/Microsoft.CodeAnalysis.Razor.Test.csproj b/src/Razor/Microsoft.CodeAnalysis.Razor/test/Microsoft.CodeAnalysis.Razor.Test.csproj index b4fd5a0f6fe3..4b81fe11f86c 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/test/Microsoft.CodeAnalysis.Razor.Test.csproj +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/test/Microsoft.CodeAnalysis.Razor.Test.csproj @@ -2,7 +2,7 @@ $(DefaultNetCoreTargetFramework) - $(TargetFrameworks);net461 + $(TargetFrameworks);$(DefaultNetFxTargetFramework) $(DefaultItemExcludes);TestFiles\**\* true diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj index 73f5cd3f3aa7..6b94a9dd92e5 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Microsoft.AspNetCore.Razor.Test.Common.csproj @@ -4,7 +4,7 @@ $(DefineConstants);GENERATE_BASELINES $(DefineConstants);__RemoveThisBitTo__GENERATE_BASELINES - netstandard2.0;net461 + $(DefaultNetFxTargetFramework);netstandard2.0 diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.ComponentShim/Microsoft.AspNetCore.Razor.Test.ComponentShim.csproj b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.ComponentShim/Microsoft.AspNetCore.Razor.Test.ComponentShim.csproj index 756371e76dbe..6c1b0a1a9a67 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.ComponentShim/Microsoft.AspNetCore.Razor.Test.ComponentShim.csproj +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.ComponentShim/Microsoft.AspNetCore.Razor.Test.ComponentShim.csproj @@ -1,7 +1,7 @@  - netstandard2.0;net461 + $(DefaultNetFxTargetFramework);netstandard2.0 diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.csproj b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.csproj index 583b94d948df..2bc4c2d591b2 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.csproj +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version1_X.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework);net461 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) true diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X.csproj b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X.csproj index 583b94d948df..2bc4c2d591b2 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X.csproj +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X/Microsoft.AspNetCore.Razor.Test.MvcShim.Version2_X.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework);net461 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) true diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim/Microsoft.AspNetCore.Razor.Test.MvcShim.csproj b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim/Microsoft.AspNetCore.Razor.Test.MvcShim.csproj index 0d860cdd0980..a113e28e88ad 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim/Microsoft.AspNetCore.Razor.Test.MvcShim.csproj +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.MvcShim/Microsoft.AspNetCore.Razor.Test.MvcShim.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework);net461 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) true diff --git a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj index bada0ab62b5d..904fe35cf82d 100644 --- a/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj +++ b/src/Security/Authorization/Core/src/Microsoft.AspNetCore.Authorization.csproj @@ -5,7 +5,7 @@ Commonly used types: Microsoft.AspNetCore.Authorization.AllowAnonymousAttribute Microsoft.AspNetCore.Authorization.AuthorizeAttribute - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true $(NoWarn);CS1591 diff --git a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj index 5cfbd655e99a..943461e7f76a 100644 --- a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj +++ b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj @@ -2,7 +2,7 @@ Core components of ASP.NET Core networking protocol stack. - netstandard2.0;netstandard2.1;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;netstandard2.1;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true true @@ -19,7 +19,7 @@ - + diff --git a/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj b/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj index 71e4f7fd2045..cc35aef6bdfb 100644 --- a/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj +++ b/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj @@ -2,7 +2,7 @@ Client for ASP.NET Core SignalR - netstandard2.0;netstandard2.1 + $(DefaultNetFxTargetFramework);netstandard2.0;netstandard2.1 Microsoft.AspNetCore.SignalR.Client diff --git a/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj b/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj index 7dd94f76740b..47444465b45f 100644 --- a/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj +++ b/src/SignalR/clients/csharp/Client/src/Microsoft.AspNetCore.SignalR.Client.csproj @@ -2,7 +2,7 @@ Client for ASP.NET Core SignalR - netstandard2.0 + $(DefaultNetFxTargetFramework);netstandard2.0 diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/WebSocketsTransport.cs b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/WebSocketsTransport.cs index f3cda1c3add3..e0b8d08aa017 100644 --- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/WebSocketsTransport.cs +++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Internal/WebSocketsTransport.cs @@ -244,7 +244,7 @@ private async Task StartReceiving(WebSocket socket) #if NETSTANDARD2_1 // Because we checked the CloseStatus from the 0 byte read above, we don't need to check again after reading var receiveResult = await socket.ReceiveAsync(memory, CancellationToken.None); -#elif NETSTANDARD2_0 +#elif NETSTANDARD2_0 || NET461 var isArray = MemoryMarshal.TryGetArray(memory, out var arraySegment); Debug.Assert(isArray); diff --git a/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj b/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj index c0fedd3797e0..bae3bab800ac 100644 --- a/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj +++ b/src/SignalR/clients/csharp/Http.Connections.Client/src/Microsoft.AspNetCore.Http.Connections.Client.csproj @@ -2,7 +2,7 @@ Client for ASP.NET Core Connection Handlers - netstandard2.0;netstandard2.1 + $(DefaultNetFxTargetFramework);netstandard2.0;netstandard2.1 @@ -19,6 +19,11 @@ + + + + + diff --git a/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj b/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj index 4277aaef64d0..3ecebb0f5c48 100644 --- a/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj +++ b/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj @@ -2,7 +2,7 @@ Common primitives for ASP.NET Connection Handlers and clients - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true Microsoft.AspNetCore.Http.Connections @@ -19,7 +19,7 @@ - + diff --git a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj index fa1317d365d9..afe8cf0816ef 100644 --- a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj +++ b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj @@ -2,7 +2,7 @@ Implements the SignalR Hub Protocol using System.Text.Json. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true Microsoft.AspNetCore.SignalR diff --git a/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj b/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj index 65817ce39e85..8ed07be5dcdc 100644 --- a/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj +++ b/src/SignalR/common/Protocols.MessagePack/src/Microsoft.AspNetCore.SignalR.Protocols.MessagePack.csproj @@ -2,7 +2,7 @@ Implements the SignalR Hub Protocol over MsgPack. - netstandard2.0 + $(DefaultNetFxTargetFramework);netstandard2.0 Microsoft.AspNetCore.SignalR true enable diff --git a/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj b/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj index ee6a01dfbf6d..00e59a9ceef2 100644 --- a/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj +++ b/src/SignalR/common/Protocols.NewtonsoftJson/src/Microsoft.AspNetCore.SignalR.Protocols.NewtonsoftJson.csproj @@ -2,7 +2,7 @@ Implements the SignalR Hub Protocol using Newtonsoft.Json. - netstandard2.0 + $(DefaultNetFxTargetFramework);netstandard2.0 Microsoft.AspNetCore.SignalR true enable diff --git a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj index ff1a013cf8ed..730549a8d9d6 100644 --- a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj +++ b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj @@ -2,7 +2,7 @@ Common serialiation primitives for SignalR Clients Servers - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) true Microsoft.AspNetCore.SignalR @@ -25,10 +25,14 @@ - + + + + + diff --git a/src/SignalR/samples/ClientSample/ClientSample.csproj b/src/SignalR/samples/ClientSample/ClientSample.csproj index 82330ad3e98d..d5f892ec7501 100644 --- a/src/SignalR/samples/ClientSample/ClientSample.csproj +++ b/src/SignalR/samples/ClientSample/ClientSample.csproj @@ -1,7 +1,7 @@  - $(DefaultNetCoreTargetFramework);net461 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) Exe diff --git a/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj b/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj index ebe593e808bf..dcb3bfe974fc 100644 --- a/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj +++ b/src/SiteExtensions/LoggingAggregate/src/Microsoft.AspNetCore.AzureAppServices.SiteExtension/Microsoft.AspNetCore.AzureAppServices.SiteExtension.csproj @@ -3,7 +3,7 @@ ASP.NET Core Logging Integration This site extension enables logging integration for ASP.NET Core applications on Azure App Service. - net461 + $(DefaultNetFxTargetFramework) false aspnet;logging;aspnetcore;AzureSiteExtension;keyvault;configuration;dataprotection false diff --git a/src/SiteExtensions/LoggingAggregate/test/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests.csproj b/src/SiteExtensions/LoggingAggregate/test/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests.csproj index 4711b0989025..b22f270d0c18 100644 --- a/src/SiteExtensions/LoggingAggregate/test/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests.csproj +++ b/src/SiteExtensions/LoggingAggregate/test/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests/Microsoft.AspNetCore.AzureAppServices.SiteExtension.Tests.csproj @@ -1,7 +1,7 @@ - net461 + $(DefaultNetFxTargetFramework) diff --git a/src/SiteExtensions/LoggingBranch/LB.csproj b/src/SiteExtensions/LoggingBranch/LB.csproj index fc4257f0b40f..631f5d56a083 100644 --- a/src/SiteExtensions/LoggingBranch/LB.csproj +++ b/src/SiteExtensions/LoggingBranch/LB.csproj @@ -3,7 +3,7 @@ ASP.NET Core Extensions This extension enables additional functionality for ASP.NET Core on Azure WebSites, such as enabling Azure logging. - net461 + $(DefaultNetFxTargetFramework) false aspnet;logging;aspnetcore;AzureSiteExtension;keyvault;configuration;dataprotection content diff --git a/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/src/Microsoft.Web.Xdt.Extensions.csproj b/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/src/Microsoft.Web.Xdt.Extensions.csproj index 0844815979b6..21b53f618a0c 100644 --- a/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/src/Microsoft.Web.Xdt.Extensions.csproj +++ b/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/src/Microsoft.Web.Xdt.Extensions.csproj @@ -2,7 +2,7 @@ Additional functionality for Xdt transforms. - net461 + $(DefaultNetFxTargetFramework) true false false diff --git a/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/tests/Microsoft.Web.Xdt.Extensions.Tests.csproj b/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/tests/Microsoft.Web.Xdt.Extensions.Tests.csproj index d794280afcee..46839e5c4803 100644 --- a/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/tests/Microsoft.Web.Xdt.Extensions.Tests.csproj +++ b/src/SiteExtensions/Microsoft.Web.Xdt.Extensions/tests/Microsoft.Web.Xdt.Extensions.Tests.csproj @@ -1,7 +1,7 @@ - net461 + $(DefaultNetFxTargetFramework) diff --git a/src/Testing/src/Microsoft.AspNetCore.Testing.csproj b/src/Testing/src/Microsoft.AspNetCore.Testing.csproj index 7d95e026a79e..7001a12439d3 100644 --- a/src/Testing/src/Microsoft.AspNetCore.Testing.csproj +++ b/src/Testing/src/Microsoft.AspNetCore.Testing.csproj @@ -2,7 +2,7 @@ Various helpers for writing tests that use ASP.NET Core. - netstandard2.0;net461 + $(DefaultNetFxTargetFramework);netstandard2.0 $(NoWarn);CS1591 true aspnetcore @@ -39,7 +39,7 @@ - + diff --git a/src/Tools/Extensions.ApiDescription.Server/src/Microsoft.Extensions.ApiDescription.Server.csproj b/src/Tools/Extensions.ApiDescription.Server/src/Microsoft.Extensions.ApiDescription.Server.csproj index db7bc7926a1d..712fa8362b46 100644 --- a/src/Tools/Extensions.ApiDescription.Server/src/Microsoft.Extensions.ApiDescription.Server.csproj +++ b/src/Tools/Extensions.ApiDescription.Server/src/Microsoft.Extensions.ApiDescription.Server.csproj @@ -3,7 +3,7 @@ - netcoreapp2.1;net461 + netcoreapp2.1;$(DefaultNetFxTargetFramework) MSBuild tasks and targets for build-time Swagger and OpenApi document generation true diff --git a/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj b/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj index cf667b1e8519..0fce0f052847 100644 --- a/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj +++ b/src/Tools/GetDocumentInsider/src/GetDocument.Insider.csproj @@ -5,11 +5,11 @@ false Exe Microsoft.Extensions.ApiDescription.Tool - netcoreapp2.1;net461 + netcoreapp2.1;$(DefaultNetFxTargetFramework) false - + @@ -19,7 +19,7 @@ - + diff --git a/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj b/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj index 920d4e2869d0..3ddf648cdd27 100644 --- a/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj +++ b/src/WebEncoders/src/Microsoft.Extensions.WebEncoders.csproj @@ -2,7 +2,7 @@ Contains registration and configuration APIs to add the core framework encoders to a dependency injection container. - netstandard2.0;$(DefaultNetCoreTargetFramework) + $(DefaultNetFxTargetFramework);netstandard2.0;$(DefaultNetCoreTargetFramework) $(DefaultNetCoreTargetFramework) $(NoWarn);CS1591 true @@ -16,7 +16,7 @@ - + diff --git a/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj b/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj index 57884af9763c..628f6fa66983 100755 --- a/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj +++ b/src/WebEncoders/test/Microsoft.Extensions.WebEncoders.Tests.csproj @@ -1,7 +1,7 @@ - $(DefaultNetCoreTargetFramework);net472 + $(DefaultNetCoreTargetFramework);$(DefaultNetFxTargetFramework) enable From 966aa02ccdd77eb53934271055e71985d2a5d39a Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2020 03:41:54 +0000 Subject: [PATCH 09/25] [release/5.0] Update dependencies from dotnet/runtime dotnet/efcore (#25247) [release/5.0] Update dependencies from dotnet/runtime dotnet/efcore - Updates: - Microsoft.EntityFrameworkCore.Tools: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - Microsoft.EntityFrameworkCore.SqlServer: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - dotnet-ef: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - Microsoft.EntityFrameworkCore: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - Microsoft.EntityFrameworkCore.Design: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - Microsoft.EntityFrameworkCore.Relational: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - Microsoft.EntityFrameworkCore.Sqlite: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 - Microsoft.EntityFrameworkCore.InMemory: from 5.0.0-rc.1.20425.4 to 5.0.0-rc.1.20427.10 --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 16 ++++++++-------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index db9cc55f62af..0629af5e4390 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -13,37 +13,37 @@ https://github.com/dotnet/blazor cc449601d638ffaab58ae9487f0fd010bb178a12 - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d - + https://github.com/dotnet/efcore - 9638c0cda4bfb2eb8b70a047baefc982ffa7dade + dc0cdccac7102582f027fd63c153fc5fce4e395d https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index 382830cbc124..0f748867df9f 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -134,14 +134,14 @@ 3.2.0 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 - 5.0.0-rc.1.20425.4 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20425.11 - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a - + https://github.com/dotnet/runtime - f4e99f4afa445b519abcd7c5c87cbf54771614db + d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index 0f748867df9f..10ef13184251 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -64,84 +64,84 @@ 3.8.0-2.20407.3 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 - 5.0.0-rc.1.20425.1 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20425.1 + 5.0.0-rc.1.20427.12 3.2.0 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 - 5.0.0-rc.1.20425.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20427.11 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 - + https://github.com/dotnet/runtime - d5e0627b44f25dbcf02d6d3a8fdbbc31a6e8e35a + cb2023c5fc31d447227cf21eb360e356b79284e8 https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index 10ef13184251..d0e8f7093f76 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -64,84 +64,84 @@ 3.8.0-2.20407.3 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 - 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.12 + 5.0.0-rc.1.20427.16 3.2.0 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 - 5.0.0-rc.1.20427.11 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.1 - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - cb2023c5fc31d447227cf21eb360e356b79284e8 + 1dfd9438149f74ae11918a7b0709b8d58c61443f https://github.com/dotnet/arcade diff --git a/eng/Versions.props b/eng/Versions.props index d0e8f7093f76..e7cc59f8a605 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -64,73 +64,73 @@ 3.8.0-2.20407.3 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 - 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 - 5.0.0-rc.1.20427.16 + 5.0.0-rc.1.20428.3 3.2.0 From cfdab3d095b8c911a83e7aba98972181ace41c68 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Fri, 28 Aug 2020 07:43:57 -0700 Subject: [PATCH 13/25] Update solution file --- AspNetCore.sln | 84 -------------------------------------------------- 1 file changed, 84 deletions(-) diff --git a/AspNetCore.sln b/AspNetCore.sln index 968ff850f8df..1bbae199eebc 100644 --- a/AspNetCore.sln +++ b/AspNetCore.sln @@ -393,10 +393,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HttpOverrides", "HttpOverri EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.HttpOverrides", "src\Middleware\HttpOverrides\src\Microsoft.AspNetCore.HttpOverrides.csproj", "{34F24889-22D2-40A1-A2AB-A43B9061FE0D}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NodeServices", "NodeServices", "{ED90A0D9-867B-4212-846F-3E09D60A5B7E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.NodeServices", "src\Middleware\NodeServices\src\Microsoft.AspNetCore.NodeServices.csproj", "{C68A3531-E47A-4F2F-842E-4A3A7C844CC1}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ResponseCompression", "ResponseCompression", "{512EFCA7-1590-492A-8D06-84744F79DA91}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCompression", "src\Middleware\ResponseCompression\src\Microsoft.AspNetCore.ResponseCompression.csproj", "{CC783D3A-71CB-4DFD-9769-9EC7EF1ADF1B}" @@ -405,10 +401,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SpaServices.Extensions", "S EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SpaServices.Extensions", "src\Middleware\SpaServices.Extensions\src\Microsoft.AspNetCore.SpaServices.Extensions.csproj", "{566B6729-63FF-484D-8F47-91561D76F445}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SpaServices", "SpaServices", "{1EBEF6FF-4A0D-4668-A9F3-74587ECAC969}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SpaServices", "src\Middleware\SpaServices\src\Microsoft.AspNetCore.SpaServices.csproj", "{797B9228-5BC9-4C0C-B444-C490A98D057E}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Mvc.Analyzers", "Mvc.Analyzers", "{515282B6-6EF9-46E0-8EF1-DBD1CD948D9E}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Analyzers", "src\Mvc\Mvc.Analyzers\src\Microsoft.AspNetCore.Mvc.Analyzers.csproj", "{02A85F31-A092-4322-A3D9-91E894D9ECD2}" @@ -839,12 +831,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HttpSys", "HttpSys", "{166E EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.HttpSys", "src\Servers\HttpSys\src\Microsoft.AspNetCore.Server.HttpSys.csproj", "{AC0CBDEB-B750-4B81-AEC3-F218A384FB16}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{81AF139E-F3BB-46FD-B8DB-93A645E5222C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NodeServicesExamples", "src\Middleware\NodeServices\samples\NodeServicesExamples\NodeServicesExamples.csproj", "{49EAD781-92BF-4863-9159-08674548D1BE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.NodeServices.Tests", "src\Middleware\NodeServices\test\Microsoft.AspNetCore.NodeServices.Tests.csproj", "{F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "HeaderPropagation", "HeaderPropagation", "{5527E368-FD50-4E8C-B8D8-C3D1374BE4F1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.HeaderPropagation", "src\Middleware\HeaderPropagation\src\Microsoft.AspNetCore.HeaderPropagation.csproj", "{EC7CA990-BB0E-44AF-81B6-44E0E27FDE9B}" @@ -877,8 +863,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{EE65018D-F EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebSockets.Microbenchmarks", "src\Middleware\perf\Microbenchmarks\Microsoft.AspNetCore.WebSockets.Microbenchmarks.csproj", "{A8E1962B-688E-44B3-81F3-BBB9891534CE}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SpaServices.Tests", "src\Middleware\SpaServices\test\Microsoft.AspNetCore.SpaServices.Tests.csproj", "{81E8CF5B-F285-40C6-B935-6E5F7AA7A072}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching.Microbenchmarks", "src\Middleware\perf\ResponseCaching.Microbenchmarks\Microsoft.AspNetCore.ResponseCaching.Microbenchmarks.csproj", "{8A745E35-8098-4EB4-AC55-587B9F0DC4BE}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "MusicStore", "MusicStore", "{884AED21-7931-42A3-B08A-E58F7B0D6E7F}" @@ -2623,18 +2607,6 @@ Global {34F24889-22D2-40A1-A2AB-A43B9061FE0D}.Release|x64.Build.0 = Release|Any CPU {34F24889-22D2-40A1-A2AB-A43B9061FE0D}.Release|x86.ActiveCfg = Release|Any CPU {34F24889-22D2-40A1-A2AB-A43B9061FE0D}.Release|x86.Build.0 = Release|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Debug|x64.ActiveCfg = Debug|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Debug|x64.Build.0 = Debug|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Debug|x86.ActiveCfg = Debug|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Debug|x86.Build.0 = Debug|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Release|Any CPU.Build.0 = Release|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Release|x64.ActiveCfg = Release|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Release|x64.Build.0 = Release|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Release|x86.ActiveCfg = Release|Any CPU - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1}.Release|x86.Build.0 = Release|Any CPU {CC783D3A-71CB-4DFD-9769-9EC7EF1ADF1B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CC783D3A-71CB-4DFD-9769-9EC7EF1ADF1B}.Debug|Any CPU.Build.0 = Debug|Any CPU {CC783D3A-71CB-4DFD-9769-9EC7EF1ADF1B}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -2659,18 +2631,6 @@ Global {566B6729-63FF-484D-8F47-91561D76F445}.Release|x64.Build.0 = Release|Any CPU {566B6729-63FF-484D-8F47-91561D76F445}.Release|x86.ActiveCfg = Release|Any CPU {566B6729-63FF-484D-8F47-91561D76F445}.Release|x86.Build.0 = Release|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Debug|x64.ActiveCfg = Debug|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Debug|x64.Build.0 = Debug|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Debug|x86.ActiveCfg = Debug|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Debug|x86.Build.0 = Debug|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Release|Any CPU.Build.0 = Release|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Release|x64.ActiveCfg = Release|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Release|x64.Build.0 = Release|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Release|x86.ActiveCfg = Release|Any CPU - {797B9228-5BC9-4C0C-B444-C490A98D057E}.Release|x86.Build.0 = Release|Any CPU {02A85F31-A092-4322-A3D9-91E894D9ECD2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {02A85F31-A092-4322-A3D9-91E894D9ECD2}.Debug|Any CPU.Build.0 = Debug|Any CPU {02A85F31-A092-4322-A3D9-91E894D9ECD2}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -4303,30 +4263,6 @@ Global {AC0CBDEB-B750-4B81-AEC3-F218A384FB16}.Release|x64.Build.0 = Release|Any CPU {AC0CBDEB-B750-4B81-AEC3-F218A384FB16}.Release|x86.ActiveCfg = Release|Any CPU {AC0CBDEB-B750-4B81-AEC3-F218A384FB16}.Release|x86.Build.0 = Release|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Debug|x64.ActiveCfg = Debug|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Debug|x64.Build.0 = Debug|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Debug|x86.ActiveCfg = Debug|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Debug|x86.Build.0 = Debug|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Release|Any CPU.Build.0 = Release|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Release|x64.ActiveCfg = Release|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Release|x64.Build.0 = Release|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Release|x86.ActiveCfg = Release|Any CPU - {49EAD781-92BF-4863-9159-08674548D1BE}.Release|x86.Build.0 = Release|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Debug|x64.ActiveCfg = Debug|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Debug|x64.Build.0 = Debug|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Debug|x86.ActiveCfg = Debug|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Debug|x86.Build.0 = Debug|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Release|Any CPU.Build.0 = Release|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Release|x64.ActiveCfg = Release|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Release|x64.Build.0 = Release|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Release|x86.ActiveCfg = Release|Any CPU - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F}.Release|x86.Build.0 = Release|Any CPU {EC7CA990-BB0E-44AF-81B6-44E0E27FDE9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EC7CA990-BB0E-44AF-81B6-44E0E27FDE9B}.Debug|Any CPU.Build.0 = Debug|Any CPU {EC7CA990-BB0E-44AF-81B6-44E0E27FDE9B}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -4447,18 +4383,6 @@ Global {A8E1962B-688E-44B3-81F3-BBB9891534CE}.Release|x64.Build.0 = Release|Any CPU {A8E1962B-688E-44B3-81F3-BBB9891534CE}.Release|x86.ActiveCfg = Release|Any CPU {A8E1962B-688E-44B3-81F3-BBB9891534CE}.Release|x86.Build.0 = Release|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Debug|Any CPU.Build.0 = Debug|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Debug|x64.ActiveCfg = Debug|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Debug|x64.Build.0 = Debug|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Debug|x86.ActiveCfg = Debug|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Debug|x86.Build.0 = Debug|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Release|Any CPU.ActiveCfg = Release|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Release|Any CPU.Build.0 = Release|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Release|x64.ActiveCfg = Release|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Release|x64.Build.0 = Release|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Release|x86.ActiveCfg = Release|Any CPU - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072}.Release|x86.Build.0 = Release|Any CPU {8A745E35-8098-4EB4-AC55-587B9F0DC4BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A745E35-8098-4EB4-AC55-587B9F0DC4BE}.Debug|Any CPU.Build.0 = Debug|Any CPU {8A745E35-8098-4EB4-AC55-587B9F0DC4BE}.Debug|x64.ActiveCfg = Debug|Any CPU @@ -7391,14 +7315,10 @@ Global {7FC5CFC7-9BFE-4C19-90DE-A84A76A8E03D} = {58915BB2-CEF5-4CA3-8886-A61156564505} {39086512-EBC8-4061-BE34-DCCA5D1BA585} = {E5963C9F-20A6-4385-B364-814D2581FADF} {34F24889-22D2-40A1-A2AB-A43B9061FE0D} = {39086512-EBC8-4061-BE34-DCCA5D1BA585} - {ED90A0D9-867B-4212-846F-3E09D60A5B7E} = {E5963C9F-20A6-4385-B364-814D2581FADF} - {C68A3531-E47A-4F2F-842E-4A3A7C844CC1} = {ED90A0D9-867B-4212-846F-3E09D60A5B7E} {512EFCA7-1590-492A-8D06-84744F79DA91} = {E5963C9F-20A6-4385-B364-814D2581FADF} {CC783D3A-71CB-4DFD-9769-9EC7EF1ADF1B} = {512EFCA7-1590-492A-8D06-84744F79DA91} {B06D06BD-DE60-46E8-AC05-0C1D39E40638} = {E5963C9F-20A6-4385-B364-814D2581FADF} {566B6729-63FF-484D-8F47-91561D76F445} = {B06D06BD-DE60-46E8-AC05-0C1D39E40638} - {1EBEF6FF-4A0D-4668-A9F3-74587ECAC969} = {E5963C9F-20A6-4385-B364-814D2581FADF} - {797B9228-5BC9-4C0C-B444-C490A98D057E} = {1EBEF6FF-4A0D-4668-A9F3-74587ECAC969} {515282B6-6EF9-46E0-8EF1-DBD1CD948D9E} = {1A0EFF9F-E699-4303-AE50-BFAF9804EEB6} {02A85F31-A092-4322-A3D9-91E894D9ECD2} = {515282B6-6EF9-46E0-8EF1-DBD1CD948D9E} {33CAD745-5912-47D3-BAF3-5AE580FED275} = {D67E977E-75DF-41EE-8315-6DBF5C2B7357} @@ -7614,9 +7534,6 @@ Global {A01B523B-35CA-4C14-B792-3887F8741E99} = {48BEABD3-2446-466C-8694-D34EF0949369} {166E48ED-9738-4E13-8618-0D805F6F0F65} = {0ACCEDA7-339C-4B4D-8DD4-1AC271F31C04} {AC0CBDEB-B750-4B81-AEC3-F218A384FB16} = {166E48ED-9738-4E13-8618-0D805F6F0F65} - {81AF139E-F3BB-46FD-B8DB-93A645E5222C} = {ED90A0D9-867B-4212-846F-3E09D60A5B7E} - {49EAD781-92BF-4863-9159-08674548D1BE} = {81AF139E-F3BB-46FD-B8DB-93A645E5222C} - {F7E4CC45-B553-4D58-8B3E-B9F426FAF67F} = {ED90A0D9-867B-4212-846F-3E09D60A5B7E} {5527E368-FD50-4E8C-B8D8-C3D1374BE4F1} = {E5963C9F-20A6-4385-B364-814D2581FADF} {EC7CA990-BB0E-44AF-81B6-44E0E27FDE9B} = {5527E368-FD50-4E8C-B8D8-C3D1374BE4F1} {399AC9FB-7DCA-4868-B299-2EE4C88D41AD} = {5527E368-FD50-4E8C-B8D8-C3D1374BE4F1} @@ -7633,7 +7550,6 @@ Global {AF964703-404B-4632-9D1F-8EEE646BBA37} = {B06D06BD-DE60-46E8-AC05-0C1D39E40638} {EE65018D-FA12-461D-B2C5-44CA6E385530} = {E5963C9F-20A6-4385-B364-814D2581FADF} {A8E1962B-688E-44B3-81F3-BBB9891534CE} = {EE65018D-FA12-461D-B2C5-44CA6E385530} - {81E8CF5B-F285-40C6-B935-6E5F7AA7A072} = {1EBEF6FF-4A0D-4668-A9F3-74587ECAC969} {8A745E35-8098-4EB4-AC55-587B9F0DC4BE} = {EE65018D-FA12-461D-B2C5-44CA6E385530} {884AED21-7931-42A3-B08A-E58F7B0D6E7F} = {017429CC-C5FB-48B4-9C46-034E29EE2F06} {8DA88110-5A13-41A9-9F9D-674D921EB442} = {884AED21-7931-42A3-B08A-E58F7B0D6E7F} From 691910c67d80dec3fca30a1dd3a296bfa900339c Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Sun, 9 Aug 2020 11:13:09 -0700 Subject: [PATCH 14/25] Use MonoProxy package for debugging --- eng/Dependencies.props | 1 + eng/Version.Details.xml | 4 + .../DebugProxy/src/DebugProxyOptions.cs | 10 - .../DebugProxy/src/Hosting/DebugProxyHost.cs | 65 -- ...e.Components.WebAssembly.DebugProxy.csproj | 30 - .../src/MonoDebugProxy/ws-proxy/DebugStore.cs | 843 ----------------- .../MonoDebugProxy/ws-proxy/DevToolsHelper.cs | 298 ------ .../MonoDebugProxy/ws-proxy/DevToolsProxy.cs | 337 ------- .../ws-proxy/EvaluateExpression.cs | 182 ---- .../src/MonoDebugProxy/ws-proxy/MonoProxy.cs | 885 ------------------ .../WebAssembly/DebugProxy/src/Program.cs | 71 -- .../WebAssembly/DebugProxy/src/Startup.cs | 45 - .../Server/src/DebugProxyLauncher.cs | 4 +- ...tCore.Components.WebAssembly.Server.csproj | 23 +- .../src/TargetPickerUi.cs | 25 +- ...semblyNetDebugProxyAppBuilderExtensions.cs | 6 +- 16 files changed, 28 insertions(+), 2801 deletions(-) delete mode 100644 src/Components/WebAssembly/DebugProxy/src/DebugProxyOptions.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/Hosting/DebugProxyHost.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj delete mode 100644 src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DebugStore.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsHelper.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsProxy.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/EvaluateExpression.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/MonoProxy.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/Program.cs delete mode 100644 src/Components/WebAssembly/DebugProxy/src/Startup.cs rename src/Components/WebAssembly/{DebugProxy => Server}/src/TargetPickerUi.cs (91%) diff --git a/eng/Dependencies.props b/eng/Dependencies.props index 1543d4c13bd8..d86ab879db42 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -124,6 +124,7 @@ and are generated based on the last package release. + diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index b351d947e8f4..bf00659030ac 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -306,6 +306,10 @@ https://github.com/dotnet/runtime 1dfd9438149f74ae11918a7b0709b8d58c61443f + + https://github.com/dotnet/runtime + 6cc7cffaff2e0413ee84d9a7736f9ae1aa9a3f12 + diff --git a/src/Components/WebAssembly/DebugProxy/src/DebugProxyOptions.cs b/src/Components/WebAssembly/DebugProxy/src/DebugProxyOptions.cs deleted file mode 100644 index 70a76258c6cf..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/DebugProxyOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNetCore.Components.WebAssembly.DebugProxy -{ - public class DebugProxyOptions - { - public string BrowserHost { get; set; } - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/Hosting/DebugProxyHost.cs b/src/Components/WebAssembly/DebugProxy/src/Hosting/DebugProxyHost.cs deleted file mode 100644 index 4edbddc2f545..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/Hosting/DebugProxyHost.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.Logging; - -namespace Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.Hosting -{ - public static class DebugProxyHost - { - /// - /// Creates a custom HostBuilder for the DebugProxyLauncher so that we can inject - /// only the needed configurations. - /// - /// Command line arguments passed in - /// Host where browser is listening for debug connections - /// - public static IHostBuilder CreateDefaultBuilder(string[] args, string browserHost) - { - var builder = new HostBuilder(); - - builder.ConfigureAppConfiguration((hostingContext, config) => - { - if (args != null) - { - config.AddCommandLine(args); - } - config.SetBasePath(Directory.GetCurrentDirectory()); - config.AddJsonFile("blazor-debugproxysettings.json", optional: true, reloadOnChange: true); - }) - .ConfigureLogging((hostingContext, logging) => - { - logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")); - logging.AddConsole(); - logging.AddDebug(); - logging.AddEventSourceLogger(); - }) - .ConfigureWebHostDefaults(webBuilder => - { - webBuilder.UseStartup(); - - // By default we bind to a dyamic port - // This can be overridden using an option like "--urls http://localhost:9500" - webBuilder.UseUrls("http://127.0.0.1:0"); - }) - .ConfigureServices(serviceCollection => - { - serviceCollection.AddSingleton(new DebugProxyOptions - { - BrowserHost = browserHost - }); - }); - - return builder; - - } - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj b/src/Components/WebAssembly/DebugProxy/src/Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj deleted file mode 100644 index 4a727c739db5..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - $(DefaultNetCoreTargetFramework) - Exe - Microsoft.AspNetCore.Components.WebAssembly.DebugProxy - true - Debug proxy for use when building Blazor applications. - - false - $(NoWarn);CS0649 - true - - - - - - - - - - - - - - - - - - diff --git a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DebugStore.cs b/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DebugStore.cs deleted file mode 100644 index 1b9568de804a..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DebugStore.cs +++ /dev/null @@ -1,843 +0,0 @@ -using System; -using System.IO; -using System.Collections.Generic; -using Mono.Cecil; -using Mono.Cecil.Cil; -using System.Linq; -using Newtonsoft.Json.Linq; -using System.Net.Http; -using Mono.Cecil.Pdb; -using Newtonsoft.Json; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using System.Threading; -using Microsoft.Extensions.Logging; -using System.Runtime.CompilerServices; -using System.Security.Cryptography; - -namespace WebAssembly.Net.Debugging { - internal class BreakpointRequest { - public string Id { get; private set; } - public string Assembly { get; private set; } - public string File { get; private set; } - public int Line { get; private set; } - public int Column { get; private set; } - public MethodInfo Method { get; private set; } - - JObject request; - - public bool IsResolved => Assembly != null; - public List Locations { get; } = new List (); - - public override string ToString () - => $"BreakpointRequest Assembly: {Assembly} File: {File} Line: {Line} Column: {Column}"; - - public object AsSetBreakpointByUrlResponse (IEnumerable jsloc) - => new { breakpointId = Id, locations = Locations.Select(l => l.Location.AsLocation ()).Concat (jsloc) }; - - public BreakpointRequest () { - } - - public BreakpointRequest (string id, MethodInfo method) { - Id = id; - Method = method; - } - - public BreakpointRequest (string id, JObject request) { - Id = id; - this.request = request; - } - - public static BreakpointRequest Parse (string id, JObject args) - { - return new BreakpointRequest (id, args); - } - - public BreakpointRequest Clone () - => new BreakpointRequest { Id = Id, request = request }; - - public bool IsMatch (SourceFile sourceFile) - { - var url = request? ["url"]?.Value (); - if (url == null) { - var urlRegex = request?["urlRegex"].Value(); - var regex = new Regex (urlRegex); - return regex.IsMatch (sourceFile.Url.ToString ()) || regex.IsMatch (sourceFile.DocUrl); - } - - return sourceFile.Url.ToString () == url || sourceFile.DotNetUrl == url; - } - - public bool TryResolve (SourceFile sourceFile) - { - if (!IsMatch (sourceFile)) - return false; - - var line = request? ["lineNumber"]?.Value (); - var column = request? ["columnNumber"]?.Value (); - - if (line == null || column == null) - return false; - - Assembly = sourceFile.AssemblyName; - File = sourceFile.DebuggerFileName; - Line = line.Value; - Column = column.Value; - return true; - } - - public bool TryResolve (DebugStore store) - { - if (request == null || store == null) - return false; - - return store.AllSources().FirstOrDefault (source => TryResolve (source)) != null; - } - } - - internal class VarInfo { - public VarInfo (VariableDebugInformation v) - { - this.Name = v.Name; - this.Index = v.Index; - } - - public VarInfo (ParameterDefinition p) - { - this.Name = p.Name; - this.Index = (p.Index + 1) * -1; - } - - public string Name { get; } - public int Index { get; } - - public override string ToString () - => $"(var-info [{Index}] '{Name}')"; - } - - internal class CliLocation { - public CliLocation (MethodInfo method, int offset) - { - Method = method; - Offset = offset; - } - - public MethodInfo Method { get; } - public int Offset { get; } - } - - internal class SourceLocation { - SourceId id; - int line; - int column; - CliLocation cliLoc; - - public SourceLocation (SourceId id, int line, int column) - { - this.id = id; - this.line = line; - this.column = column; - } - - public SourceLocation (MethodInfo mi, SequencePoint sp) - { - this.id = mi.SourceId; - this.line = sp.StartLine - 1; - this.column = sp.StartColumn - 1; - this.cliLoc = new CliLocation (mi, sp.Offset); - } - - public SourceId Id { get => id; } - public int Line { get => line; } - public int Column { get => column; } - public CliLocation CliLocation => this.cliLoc; - - public override string ToString () - => $"{id}:{Line}:{Column}"; - - public static SourceLocation Parse (JObject obj) - { - if (obj == null) - return null; - - if (!SourceId.TryParse (obj ["scriptId"]?.Value (), out var id)) - return null; - - var line = obj ["lineNumber"]?.Value (); - var column = obj ["columnNumber"]?.Value (); - if (id == null || line == null || column == null) - return null; - - return new SourceLocation (id, line.Value, column.Value); - } - - - internal class LocationComparer : EqualityComparer - { - public override bool Equals (SourceLocation l1, SourceLocation l2) - { - if (l1 == null && l2 == null) - return true; - else if (l1 == null || l2 == null) - return false; - - return (l1.Line == l2.Line && - l1.Column == l2.Column && - l1.Id == l2.Id); - } - - public override int GetHashCode (SourceLocation loc) - { - int hCode = loc.Line ^ loc.Column; - return loc.Id.GetHashCode () ^ hCode.GetHashCode (); - } - } - - internal object AsLocation () - => new { - scriptId = id.ToString (), - lineNumber = line, - columnNumber = column - }; - } - - internal class SourceId { - const string Scheme = "dotnet://"; - - readonly int assembly, document; - - public int Assembly => assembly; - public int Document => document; - - internal SourceId (int assembly, int document) - { - this.assembly = assembly; - this.document = document; - } - - public SourceId (string id) - { - if (!TryParse (id, out assembly, out document)) - throw new ArgumentException ("invalid source identifier", nameof (id)); - } - - public static bool TryParse (string id, out SourceId source) - { - source = null; - if (!TryParse (id, out var assembly, out var document)) - return false; - - source = new SourceId (assembly, document); - return true; - } - - static bool TryParse (string id, out int assembly, out int document) - { - assembly = document = 0; - if (id == null || !id.StartsWith (Scheme, StringComparison.Ordinal)) - return false; - - var sp = id.Substring (Scheme.Length).Split ('_'); - if (sp.Length != 2) - return false; - - if (!int.TryParse (sp [0], out assembly)) - return false; - - if (!int.TryParse (sp [1], out document)) - return false; - - return true; - } - - public override string ToString () - => $"{Scheme}{assembly}_{document}"; - - public override bool Equals (object obj) - { - if (obj == null) - return false; - SourceId that = obj as SourceId; - return that.assembly == this.assembly && that.document == this.document; - } - - public override int GetHashCode () - => assembly.GetHashCode () ^ document.GetHashCode (); - - public static bool operator == (SourceId a, SourceId b) - => ((object)a == null) ? (object)b == null : a.Equals (b); - - public static bool operator != (SourceId a, SourceId b) - => !a.Equals (b); - } - - internal class MethodInfo { - MethodDefinition methodDef; - SourceFile source; - - public SourceId SourceId => source.SourceId; - - public string Name => methodDef.Name; - public MethodDebugInformation DebugInformation => methodDef.DebugInformation; - - public SourceLocation StartLocation { get; } - public SourceLocation EndLocation { get; } - public AssemblyInfo Assembly { get; } - public uint Token => methodDef.MetadataToken.RID; - - public MethodInfo (AssemblyInfo assembly, MethodDefinition methodDef, SourceFile source) - { - this.Assembly = assembly; - this.methodDef = methodDef; - this.source = source; - - var sps = DebugInformation.SequencePoints; - if (sps == null || sps.Count() < 1) - return; - - SequencePoint start = sps [0]; - SequencePoint end = sps [0]; - - foreach (var sp in sps) { - if (sp.StartLine < start.StartLine) - start = sp; - else if (sp.StartLine == start.StartLine && sp.StartColumn < start.StartColumn) - start = sp; - - if (sp.EndLine > end.EndLine) - end = sp; - else if (sp.EndLine == end.EndLine && sp.EndColumn > end.EndColumn) - end = sp; - } - - StartLocation = new SourceLocation (this, start); - EndLocation = new SourceLocation (this, end); - } - - public SourceLocation GetLocationByIl (int pos) - { - SequencePoint prev = null; - foreach (var sp in DebugInformation.SequencePoints) { - if (sp.Offset > pos) - break; - prev = sp; - } - - if (prev != null) - return new SourceLocation (this, prev); - - return null; - } - - public VarInfo [] GetLiveVarsAt (int offset) - { - var res = new List (); - - res.AddRange (methodDef.Parameters.Select (p => new VarInfo (p))); - res.AddRange (methodDef.DebugInformation.GetScopes () - .Where (s => s.Start.Offset <= offset && (s.End.IsEndOfMethod || s.End.Offset > offset)) - .SelectMany (s => s.Variables) - .Where (v => !v.IsDebuggerHidden) - .Select (v => new VarInfo (v))); - - return res.ToArray (); - } - - public override string ToString () => "MethodInfo(" + methodDef.FullName + ")"; - } - - internal class TypeInfo { - AssemblyInfo assembly; - TypeDefinition type; - List methods; - - public TypeInfo (AssemblyInfo assembly, TypeDefinition type) { - this.assembly = assembly; - this.type = type; - methods = new List (); - } - - public string Name => type.Name; - public string FullName => type.FullName; - public List Methods => methods; - - public override string ToString () => "TypeInfo('" + FullName + "')"; - } - - class AssemblyInfo { - static int next_id; - ModuleDefinition image; - readonly int id; - readonly ILogger logger; - Dictionary methods = new Dictionary (); - Dictionary sourceLinkMappings = new Dictionary(); - Dictionary typesByName = new Dictionary (); - readonly List sources = new List(); - internal string Url { get; } - - public AssemblyInfo (string url, byte[] assembly, byte[] pdb) - { - this.id = Interlocked.Increment (ref next_id); - - try { - Url = url; - ReaderParameters rp = new ReaderParameters (/*ReadingMode.Immediate*/); - - // set ReadSymbols = true unconditionally in case there - // is an embedded pdb then handle ArgumentException - // and assume that if pdb == null that is the cause - rp.ReadSymbols = true; - rp.SymbolReaderProvider = new PdbReaderProvider (); - if (pdb != null) - rp.SymbolStream = new MemoryStream (pdb); - rp.ReadingMode = ReadingMode.Immediate; - rp.InMemory = true; - - this.image = ModuleDefinition.ReadModule (new MemoryStream (assembly), rp); - } catch (BadImageFormatException ex) { - logger.LogWarning ($"Failed to read assembly as portable PDB: {ex.Message}"); - } catch (ArgumentException) { - // if pdb == null this is expected and we - // read the assembly without symbols below - if (pdb != null) - throw; - } - - if (this.image == null) { - ReaderParameters rp = new ReaderParameters (/*ReadingMode.Immediate*/); - if (pdb != null) { - rp.ReadSymbols = true; - rp.SymbolReaderProvider = new PdbReaderProvider (); - rp.SymbolStream = new MemoryStream (pdb); - } - - rp.ReadingMode = ReadingMode.Immediate; - rp.InMemory = true; - - this.image = ModuleDefinition.ReadModule (new MemoryStream (assembly), rp); - } - - Populate (); - } - - public AssemblyInfo (ILogger logger) - { - this.logger = logger; - } - - void Populate () - { - ProcessSourceLink(); - - var d2s = new Dictionary (); - - SourceFile FindSource (Document doc) - { - if (doc == null) - return null; - - if (d2s.TryGetValue (doc, out var source)) - return source; - - var src = new SourceFile (this, sources.Count, doc, GetSourceLinkUrl (doc.Url)); - sources.Add (src); - d2s [doc] = src; - return src; - }; - - foreach (var type in image.GetTypes()) { - var typeInfo = new TypeInfo (this, type); - typesByName [type.FullName] = typeInfo; - - foreach (var method in type.Methods) { - foreach (var sp in method.DebugInformation.SequencePoints) { - var source = FindSource (sp.Document); - var methodInfo = new MethodInfo (this, method, source); - methods [method.MetadataToken.RID] = methodInfo; - if (source != null) - source.AddMethod (methodInfo); - - typeInfo.Methods.Add (methodInfo); - } - } - } - } - - private void ProcessSourceLink () - { - var sourceLinkDebugInfo = image.CustomDebugInformations.FirstOrDefault (i => i.Kind == CustomDebugInformationKind.SourceLink); - - if (sourceLinkDebugInfo != null) { - var sourceLinkContent = ((SourceLinkDebugInformation)sourceLinkDebugInfo).Content; - - if (sourceLinkContent != null) { - var jObject = JObject.Parse (sourceLinkContent) ["documents"]; - sourceLinkMappings = JsonConvert.DeserializeObject> (jObject.ToString ()); - } - } - } - - private Uri GetSourceLinkUrl (string document) - { - if (sourceLinkMappings.TryGetValue (document, out string url)) - return new Uri (url); - - foreach (var sourceLinkDocument in sourceLinkMappings) { - string key = sourceLinkDocument.Key; - - if (Path.GetFileName (key) != "*") { - continue; - } - - var keyTrim = key.TrimEnd ('*'); - - if (document.StartsWith(keyTrim, StringComparison.OrdinalIgnoreCase)) { - var docUrlPart = document.Replace (keyTrim, ""); - return new Uri (sourceLinkDocument.Value.TrimEnd ('*') + docUrlPart); - } - } - - return null; - } - - private static string GetRelativePath (string relativeTo, string path) - { - var uri = new Uri (relativeTo, UriKind.RelativeOrAbsolute); - var rel = Uri.UnescapeDataString (uri.MakeRelativeUri (new Uri (path, UriKind.RelativeOrAbsolute)).ToString ()).Replace (Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar); - if (rel.Contains (Path.DirectorySeparatorChar.ToString ()) == false) { - rel = $".{ Path.DirectorySeparatorChar }{ rel }"; - } - return rel; - } - - public IEnumerable Sources - => this.sources; - - public int Id => id; - public string Name => image.Name; - - public SourceFile GetDocById (int document) - { - return sources.FirstOrDefault (s => s.SourceId.Document == document); - } - - public MethodInfo GetMethodByToken (uint token) - { - methods.TryGetValue (token, out var value); - return value; - } - - public TypeInfo GetTypeByName (string name) { - typesByName.TryGetValue (name, out var res); - return res; - } - } - - internal class SourceFile { - Dictionary methods; - AssemblyInfo assembly; - int id; - Document doc; - - internal SourceFile (AssemblyInfo assembly, int id, Document doc, Uri sourceLinkUri) - { - this.methods = new Dictionary (); - this.SourceLinkUri = sourceLinkUri; - this.assembly = assembly; - this.id = id; - this.doc = doc; - this.DebuggerFileName = doc.Url.Replace ("\\", "/").Replace (":", ""); - - this.SourceUri = new Uri ((Path.IsPathRooted (doc.Url) ? "file://" : "") + doc.Url, UriKind.RelativeOrAbsolute); - if (SourceUri.IsFile && File.Exists (SourceUri.LocalPath)) { - this.Url = this.SourceUri.ToString (); - } else { - this.Url = DotNetUrl; - } - } - - internal void AddMethod (MethodInfo mi) - { - if (!this.methods.ContainsKey (mi.Token)) - this.methods [mi.Token] = mi; - } - - public string DebuggerFileName { get; } - public string Url { get; } - public string AssemblyName => assembly.Name; - public string DotNetUrl => $"dotnet://{assembly.Name}/{DebuggerFileName}"; - - public SourceId SourceId => new SourceId (assembly.Id, this.id); - public Uri SourceLinkUri { get; } - public Uri SourceUri { get; } - - public IEnumerable Methods => this.methods.Values; - - public string DocUrl => doc.Url; - - public (int startLine, int startColumn, int endLine, int endColumn) GetExtents () - { - var start = Methods.OrderBy (m => m.StartLocation.Line).ThenBy (m => m.StartLocation.Column).First (); - var end = Methods.OrderByDescending (m => m.EndLocation.Line).ThenByDescending (m => m.EndLocation.Column).First (); - return (start.StartLocation.Line, start.StartLocation.Column, end.EndLocation.Line, end.EndLocation.Column); - } - - async Task GetDataAsync (Uri uri, CancellationToken token) - { - var mem = new MemoryStream (); - try { - if (uri.IsFile && File.Exists (uri.LocalPath)) { - using (var file = File.Open (SourceUri.LocalPath, FileMode.Open)) { - await file.CopyToAsync (mem, token); - mem.Position = 0; - } - } else if (uri.Scheme == "http" || uri.Scheme == "https") { - var client = new HttpClient (); - using (var stream = await client.GetStreamAsync (uri)) { - await stream.CopyToAsync (mem, token); - mem.Position = 0; - } - } - } catch (Exception) { - return null; - } - return mem; - } - - static HashAlgorithm GetHashAlgorithm (DocumentHashAlgorithm algorithm) - { - switch (algorithm) { - case DocumentHashAlgorithm.SHA1: return SHA1.Create (); - case DocumentHashAlgorithm.SHA256: return SHA256.Create (); - case DocumentHashAlgorithm.MD5: return MD5.Create (); - } - return null; - } - - bool CheckPdbHash (byte [] computedHash) - { - if (computedHash.Length != doc.Hash.Length) - return false; - - for (var i = 0; i < computedHash.Length; i++) - if (computedHash[i] != doc.Hash[i]) - return false; - - return true; - } - - byte[] ComputePdbHash (Stream sourceStream) - { - var algorithm = GetHashAlgorithm (doc.HashAlgorithm); - if (algorithm != null) - using (algorithm) - return algorithm.ComputeHash (sourceStream); - - return Array.Empty (); - } - - public async Task GetSourceAsync (bool checkHash, CancellationToken token = default(CancellationToken)) - { - if (doc.EmbeddedSource.Length > 0) - return new MemoryStream (doc.EmbeddedSource, false); - - MemoryStream mem; - - mem = await GetDataAsync (SourceUri, token); - if (mem != null && (!checkHash || CheckPdbHash (ComputePdbHash (mem)))) { - mem.Position = 0; - return mem; - } - - mem = await GetDataAsync (SourceLinkUri, token); - if (mem != null && (!checkHash || CheckPdbHash (ComputePdbHash (mem)))) { - mem.Position = 0; - return mem; - } - - return MemoryStream.Null; - } - - public object ToScriptSource (int executionContextId, object executionContextAuxData) - { - return new { - scriptId = SourceId.ToString (), - url = Url, - executionContextId, - executionContextAuxData, - //hash: should be the v8 hash algo, managed implementation is pending - dotNetUrl = DotNetUrl, - }; - } - } - - internal class DebugStore { - List assemblies = new List (); - readonly HttpClient client; - readonly ILogger logger; - - public DebugStore (ILogger logger, HttpClient client) { - this.client = client; - this.logger = logger; - } - - public DebugStore (ILogger logger) : this (logger, new HttpClient ()) - { - } - - class DebugItem { - public string Url { get; set; } - public Task Data { get; set; } - } - - public async IAsyncEnumerable Load (SessionId sessionId, string [] loaded_files, [EnumeratorCancellation] CancellationToken token) - { - static bool MatchPdb (string asm, string pdb) - => Path.ChangeExtension (asm, "pdb") == pdb; - - var asm_files = new List (); - var pdb_files = new List (); - foreach (var file_name in loaded_files) { - if (file_name.EndsWith (".pdb", StringComparison.OrdinalIgnoreCase)) - pdb_files.Add (file_name); - else - asm_files.Add (file_name); - } - - List steps = new List (); - foreach (var url in asm_files) { - try { - var pdb = pdb_files.FirstOrDefault (n => MatchPdb (url, n)); - steps.Add ( - new DebugItem { - Url = url, - Data = Task.WhenAll (client.GetByteArrayAsync (url), pdb != null ? client.GetByteArrayAsync (pdb) : Task.FromResult (null)) - }); - } catch (Exception e) { - logger.LogDebug ($"Failed to read {url} ({e.Message})"); - } - } - - foreach (var step in steps) { - AssemblyInfo assembly = null; - try { - var bytes = await step.Data; - assembly = new AssemblyInfo (step.Url, bytes [0], bytes [1]); - } catch (Exception e) { - logger.LogDebug ($"Failed to load {step.Url} ({e.Message})"); - } - if (assembly == null) - continue; - - assemblies.Add (assembly); - foreach (var source in assembly.Sources) - yield return source; - } - } - - public IEnumerable AllSources () - => assemblies.SelectMany (a => a.Sources); - - public SourceFile GetFileById (SourceId id) - => AllSources ().SingleOrDefault (f => f.SourceId.Equals (id)); - - public AssemblyInfo GetAssemblyByName (string name) - => assemblies.FirstOrDefault (a => a.Name.Equals (name, StringComparison.InvariantCultureIgnoreCase)); - - /* - V8 uses zero based indexing for both line and column. - PPDBs uses one based indexing for both line and column. - */ - static bool Match (SequencePoint sp, SourceLocation start, SourceLocation end) - { - var spStart = (Line: sp.StartLine - 1, Column: sp.StartColumn - 1); - var spEnd = (Line: sp.EndLine - 1, Column: sp.EndColumn - 1); - - if (start.Line > spEnd.Line) - return false; - - if (start.Column > spEnd.Column && start.Line == spEnd.Line) - return false; - - if (end.Line < spStart.Line) - return false; - - if (end.Column < spStart.Column && end.Line == spStart.Line) - return false; - - return true; - } - - public List FindPossibleBreakpoints (SourceLocation start, SourceLocation end) - { - //XXX FIXME no idea what todo with locations on different files - if (start.Id != end.Id) { - logger.LogDebug ($"FindPossibleBreakpoints: documents differ (start: {start.Id}) (end {end.Id}"); - return null; - } - - var sourceId = start.Id; - - var doc = GetFileById (sourceId); - - var res = new List (); - if (doc == null) { - logger.LogDebug ($"Could not find document {sourceId}"); - return res; - } - - foreach (var method in doc.Methods) { - foreach (var sequencePoint in method.DebugInformation.SequencePoints) { - if (!sequencePoint.IsHidden && Match (sequencePoint, start, end)) - res.Add (new SourceLocation (method, sequencePoint)); - } - } - return res; - } - - /* - V8 uses zero based indexing for both line and column. - PPDBs uses one based indexing for both line and column. - */ - static bool Match (SequencePoint sp, int line, int column) - { - var bp = (line: line + 1, column: column + 1); - - if (sp.StartLine > bp.line || sp.EndLine < bp.line) - return false; - - //Chrome sends a zero column even if getPossibleBreakpoints say something else - if (column == 0) - return true; - - if (sp.StartColumn > bp.column && sp.StartLine == bp.line) - return false; - - if (sp.EndColumn < bp.column && sp.EndLine == bp.line) - return false; - - return true; - } - - public IEnumerable FindBreakpointLocations (BreakpointRequest request) - { - request.TryResolve (this); - - var asm = assemblies.FirstOrDefault (a => a.Name.Equals (request.Assembly, StringComparison.OrdinalIgnoreCase)); - var sourceFile = asm?.Sources?.SingleOrDefault (s => s.DebuggerFileName.Equals (request.File, StringComparison.OrdinalIgnoreCase)); - - if (sourceFile == null) - yield break; - - foreach (var method in sourceFile.Methods) { - foreach (var sequencePoint in method.DebugInformation.SequencePoints) { - if (!sequencePoint.IsHidden && Match (sequencePoint, request.Line, request.Column)) - yield return new SourceLocation (method, sequencePoint); - } - } - } - - public string ToUrl (SourceLocation location) - => location != null ? GetFileById (location.Id).Url : ""; - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsHelper.cs b/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsHelper.cs deleted file mode 100644 index 871c10de9b01..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsHelper.cs +++ /dev/null @@ -1,298 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Newtonsoft.Json.Linq; - -using System.Threading; -using System.IO; -using System.Collections.Generic; -using System.Net; -using Microsoft.Extensions.Logging; - -namespace WebAssembly.Net.Debugging { - - internal struct SessionId { - public readonly string sessionId; - - public SessionId (string sessionId) - { - this.sessionId = sessionId; - } - - // hashset treats 0 as unset - public override int GetHashCode () - => sessionId?.GetHashCode () ?? -1; - - public override bool Equals (object obj) - => (obj is SessionId) ? ((SessionId) obj).sessionId == sessionId : false; - - public static bool operator == (SessionId a, SessionId b) - => a.sessionId == b.sessionId; - - public static bool operator != (SessionId a, SessionId b) - => a.sessionId != b.sessionId; - - public static SessionId Null { get; } = new SessionId (); - - public override string ToString () - => $"session-{sessionId}"; - } - - internal struct MessageId { - public readonly string sessionId; - public readonly int id; - - public MessageId (string sessionId, int id) - { - this.sessionId = sessionId; - this.id = id; - } - - public static implicit operator SessionId (MessageId id) - => new SessionId (id.sessionId); - - public override string ToString () - => $"msg-{sessionId}:::{id}"; - - public override int GetHashCode () - => (sessionId?.GetHashCode () ?? 0) ^ id.GetHashCode (); - - public override bool Equals (object obj) - => (obj is MessageId) ? ((MessageId) obj).sessionId == sessionId && ((MessageId) obj).id == id : false; - } - - internal class DotnetObjectId { - public string Scheme { get; } - public string Value { get; } - - public static bool TryParse (JToken jToken, out DotnetObjectId objectId) - => TryParse (jToken?.Value(), out objectId); - - public static bool TryParse (string id, out DotnetObjectId objectId) - { - objectId = null; - if (id == null) - return false; - - if (!id.StartsWith ("dotnet:")) - return false; - - var parts = id.Split (":", 3); - - if (parts.Length < 3) - return false; - - objectId = new DotnetObjectId (parts[1], parts[2]); - - return true; - } - - public DotnetObjectId (string scheme, string value) - { - Scheme = scheme; - Value = value; - } - - public override string ToString () - => $"dotnet:{Scheme}:{Value}"; - } - - internal struct Result { - public JObject Value { get; private set; } - public JObject Error { get; private set; } - - public bool IsOk => Value != null; - public bool IsErr => Error != null; - - Result (JObject result, JObject error) - { - if (result != null && error != null) - throw new ArgumentException ($"Both {nameof(result)} and {nameof(error)} arguments cannot be non-null."); - - bool resultHasError = String.Compare ((result? ["result"] as JObject)? ["subtype"]?. Value (), "error") == 0; - if (result != null && resultHasError) { - this.Value = null; - this.Error = result; - } else { - this.Value = result; - this.Error = error; - } - } - - public static Result FromJson (JObject obj) - { - //Log ("protocol", $"from result: {obj}"); - return new Result (obj ["result"] as JObject, obj ["error"] as JObject); - } - - public static Result Ok (JObject ok) - => new Result (ok, null); - - public static Result OkFromObject (object ok) - => Ok (JObject.FromObject(ok)); - - public static Result Err (JObject err) - => new Result (null, err); - - public static Result Err (string msg) - => new Result (null, JObject.FromObject (new { message = msg })); - - public static Result Exception (Exception e) - => new Result (null, JObject.FromObject (new { message = e.Message })); - - public JObject ToJObject (MessageId target) { - if (IsOk) { - return JObject.FromObject (new { - target.id, - target.sessionId, - result = Value - }); - } else { - return JObject.FromObject (new { - target.id, - target.sessionId, - error = Error - }); - } - } - - public override string ToString () - { - return $"[Result: IsOk: {IsOk}, IsErr: {IsErr}, Value: {Value?.ToString ()}, Error: {Error?.ToString ()} ]"; - } - } - - internal class MonoCommands { - public string expression { get; set; } - public string objectGroup { get; set; } = "mono-debugger"; - public bool includeCommandLineAPI { get; set; } = false; - public bool silent { get; set; } = false; - public bool returnByValue { get; set; } = true; - - public MonoCommands (string expression) - => this.expression = expression; - - public static MonoCommands GetCallStack () - => new MonoCommands ("MONO.mono_wasm_get_call_stack()"); - - public static MonoCommands IsRuntimeReady () - => new MonoCommands ("MONO.mono_wasm_runtime_is_ready"); - - public static MonoCommands StartSingleStepping (StepKind kind) - => new MonoCommands ($"MONO.mono_wasm_start_single_stepping ({(int)kind})"); - - public static MonoCommands GetLoadedFiles () - => new MonoCommands ("MONO.mono_wasm_get_loaded_files()"); - - public static MonoCommands ClearAllBreakpoints () - => new MonoCommands ("MONO.mono_wasm_clear_all_breakpoints()"); - - public static MonoCommands GetDetails (DotnetObjectId objectId, JToken args = null) - => new MonoCommands ($"MONO.mono_wasm_get_details ('{objectId}', {(args ?? "{}")})"); - - public static MonoCommands GetScopeVariables (int scopeId, params int[] vars) - => new MonoCommands ($"MONO.mono_wasm_get_variables({scopeId}, [ {string.Join (",", vars)} ])"); - - public static MonoCommands SetBreakpoint (string assemblyName, uint methodToken, int ilOffset) - => new MonoCommands ($"MONO.mono_wasm_set_breakpoint (\"{assemblyName}\", {methodToken}, {ilOffset})"); - - public static MonoCommands RemoveBreakpoint (int breakpointId) - => new MonoCommands ($"MONO.mono_wasm_remove_breakpoint({breakpointId})"); - - public static MonoCommands ReleaseObject (DotnetObjectId objectId) - => new MonoCommands ($"MONO.mono_wasm_release_object('{objectId}')"); - - public static MonoCommands CallFunctionOn (JToken args) - => new MonoCommands ($"MONO.mono_wasm_call_function_on ({args.ToString ()})"); - } - - internal enum MonoErrorCodes { - BpNotFound = 100000, - } - - internal class MonoConstants { - public const string RUNTIME_IS_READY = "mono_wasm_runtime_ready"; - } - - class Frame { - public Frame (MethodInfo method, SourceLocation location, int id) - { - this.Method = method; - this.Location = location; - this.Id = id; - } - - public MethodInfo Method { get; private set; } - public SourceLocation Location { get; private set; } - public int Id { get; private set; } - } - - class Breakpoint { - public SourceLocation Location { get; private set; } - public int RemoteId { get; set; } - public BreakpointState State { get; set; } - public string StackId { get; private set; } - - public static bool TryParseId (string stackId, out int id) - { - id = -1; - if (stackId?.StartsWith ("dotnet:", StringComparison.Ordinal) != true) - return false; - - return int.TryParse (stackId.Substring ("dotnet:".Length), out id); - } - - public Breakpoint (string stackId, SourceLocation loc, BreakpointState state) - { - this.StackId = stackId; - this.Location = loc; - this.State = state; - } - } - - enum BreakpointState { - Active, - Disabled, - Pending - } - - enum StepKind { - Into, - Out, - Over - } - - internal class ExecutionContext { - public string DebuggerId { get; set; } - public Dictionary BreakpointRequests { get; } = new Dictionary (); - - public TaskCompletionSource ready = null; - public bool IsRuntimeReady => ready != null && ready.Task.IsCompleted; - - public int Id { get; set; } - public object AuxData { get; set; } - - public List CallStack { get; set; } - - internal DebugStore store; - public TaskCompletionSource Source { get; } = new TaskCompletionSource (); - - public Dictionary LocalsCache = new Dictionary (); - - public DebugStore Store { - get { - if (store == null || !Source.Task.IsCompleted) - return null; - - return store; - } - } - - public void ClearState () - { - CallStack = null; - LocalsCache.Clear (); - } - - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsProxy.cs b/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsProxy.cs deleted file mode 100644 index 5eac86d124a5..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/DevToolsProxy.cs +++ /dev/null @@ -1,337 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -using System.Net.WebSockets; -using System.Threading; -using System.IO; -using System.Text; -using System.Collections.Generic; -using Microsoft.Extensions.Logging; - -namespace WebAssembly.Net.Debugging { - - class DevToolsQueue { - Task current_send; - List pending; - - public WebSocket Ws { get; private set; } - public Task CurrentSend { get { return current_send; } } - public DevToolsQueue (WebSocket sock) - { - this.Ws = sock; - pending = new List (); - } - - public Task Send (byte [] bytes, CancellationToken token) - { - pending.Add (bytes); - if (pending.Count == 1) { - if (current_send != null) - throw new Exception ("current_send MUST BE NULL IF THERE'S no pending send"); - //logger.LogTrace ("sending {0} bytes", bytes.Length); - current_send = Ws.SendAsync (new ArraySegment (bytes), WebSocketMessageType.Text, true, token); - return current_send; - } - return null; - } - - public Task Pump (CancellationToken token) - { - current_send = null; - pending.RemoveAt (0); - - if (pending.Count > 0) { - if (current_send != null) - throw new Exception ("current_send MUST BE NULL IF THERE'S no pending send"); - - current_send = Ws.SendAsync (new ArraySegment (pending [0]), WebSocketMessageType.Text, true, token); - return current_send; - } - return null; - } - } - - internal class DevToolsProxy { - TaskCompletionSource side_exception = new TaskCompletionSource (); - TaskCompletionSource client_initiated_close = new TaskCompletionSource (); - Dictionary> pending_cmds = new Dictionary> (); - ClientWebSocket browser; - WebSocket ide; - int next_cmd_id; - List pending_ops = new List (); - List queues = new List (); - - protected readonly ILogger logger; - - public DevToolsProxy (ILoggerFactory loggerFactory) - { - logger = loggerFactory.CreateLogger(); - } - - protected virtual Task AcceptEvent (SessionId sessionId, string method, JObject args, CancellationToken token) - { - return Task.FromResult (false); - } - - protected virtual Task AcceptCommand (MessageId id, string method, JObject args, CancellationToken token) - { - return Task.FromResult (false); - } - - async Task ReadOne (WebSocket socket, CancellationToken token) - { - byte [] buff = new byte [4000]; - var mem = new MemoryStream (); - while (true) { - - if (socket.State != WebSocketState.Open) { - Log ("error", $"DevToolsProxy: Socket is no longer open."); - client_initiated_close.TrySetResult (true); - return null; - } - - var result = await socket.ReceiveAsync (new ArraySegment (buff), token); - if (result.MessageType == WebSocketMessageType.Close) { - client_initiated_close.TrySetResult (true); - return null; - } - - mem.Write (buff, 0, result.Count); - - if (result.EndOfMessage) - return Encoding.UTF8.GetString (mem.GetBuffer (), 0, (int)mem.Length); - } - } - - DevToolsQueue GetQueueForSocket (WebSocket ws) - { - return queues.FirstOrDefault (q => q.Ws == ws); - } - - DevToolsQueue GetQueueForTask (Task task) - { - return queues.FirstOrDefault (q => q.CurrentSend == task); - } - - void Send (WebSocket to, JObject o, CancellationToken token) - { - var sender = browser == to ? "Send-browser" : "Send-ide"; - - var method = o ["method"]?.ToString (); - //if (method != "Debugger.scriptParsed" && method != "Runtime.consoleAPICalled") - Log ("protocol", $"{sender}: " + JsonConvert.SerializeObject (o)); - var bytes = Encoding.UTF8.GetBytes (o.ToString ()); - - var queue = GetQueueForSocket (to); - - var task = queue.Send (bytes, token); - if (task != null) - pending_ops.Add (task); - } - - async Task OnEvent (SessionId sessionId, string method, JObject args, CancellationToken token) - { - try { - if (!await AcceptEvent (sessionId, method, args, token)) { - //logger.LogDebug ("proxy browser: {0}::{1}",method, args); - SendEventInternal (sessionId, method, args, token); - } - } catch (Exception e) { - side_exception.TrySetException (e); - } - } - - async Task OnCommand (MessageId id, string method, JObject args, CancellationToken token) - { - try { - if (!await AcceptCommand (id, method, args, token)) { - var res = await SendCommandInternal (id, method, args, token); - SendResponseInternal (id, res, token); - } - } catch (Exception e) { - side_exception.TrySetException (e); - } - } - - void OnResponse (MessageId id, Result result) - { - //logger.LogTrace ("got id {0} res {1}", id, result); - // Fixme - if (pending_cmds.Remove (id, out var task)) { - task.SetResult (result); - return; - } - logger.LogError ("Cannot respond to command: {id} with result: {result} - command is not pending", id, result); - } - - void ProcessBrowserMessage (string msg, CancellationToken token) - { - var res = JObject.Parse (msg); - - var method = res ["method"]?.ToString (); - //if (method != "Debugger.scriptParsed" && method != "Runtime.consoleAPICalled") - Log ("protocol", $"browser: {msg}"); - - if (res ["id"] == null) - pending_ops.Add (OnEvent (new SessionId (res ["sessionId"]?.Value ()), res ["method"].Value (), res ["params"] as JObject, token)); - else - OnResponse (new MessageId (res ["sessionId"]?.Value (), res ["id"].Value ()), Result.FromJson (res)); - } - - void ProcessIdeMessage (string msg, CancellationToken token) - { - Log ("protocol", $"ide: {msg}"); - if (!string.IsNullOrEmpty (msg)) { - var res = JObject.Parse (msg); - pending_ops.Add (OnCommand ( - new MessageId (res ["sessionId"]?.Value (), res ["id"].Value ()), - res ["method"].Value (), - res ["params"] as JObject, token)); - } - } - - internal async Task SendCommand (SessionId id, string method, JObject args, CancellationToken token) { - //Log ("verbose", $"sending command {method}: {args}"); - return await SendCommandInternal (id, method, args, token); - } - - Task SendCommandInternal (SessionId sessionId, string method, JObject args, CancellationToken token) - { - int id = Interlocked.Increment (ref next_cmd_id); - - var o = JObject.FromObject (new { - id, - method, - @params = args - }); - if (sessionId.sessionId != null) - o["sessionId"] = sessionId.sessionId; - var tcs = new TaskCompletionSource (); - - var msgId = new MessageId (sessionId.sessionId, id); - //Log ("verbose", $"add cmd id {sessionId}-{id}"); - pending_cmds[msgId] = tcs; - - Send (this.browser, o, token); - return tcs.Task; - } - - public void SendEvent (SessionId sessionId, string method, JObject args, CancellationToken token) - { - //Log ("verbose", $"sending event {method}: {args}"); - SendEventInternal (sessionId, method, args, token); - } - - void SendEventInternal (SessionId sessionId, string method, JObject args, CancellationToken token) - { - var o = JObject.FromObject (new { - method, - @params = args - }); - if (sessionId.sessionId != null) - o["sessionId"] = sessionId.sessionId; - - Send (this.ide, o, token); - } - - internal void SendResponse (MessageId id, Result result, CancellationToken token) - { - SendResponseInternal (id, result, token); - } - - void SendResponseInternal (MessageId id, Result result, CancellationToken token) - { - JObject o = result.ToJObject (id); - if (result.IsErr) - logger.LogError ($"sending error response for id: {id} -> {result}"); - - Send (this.ide, o, token); - } - - // , HttpContext context) - public async Task Run (Uri browserUri, WebSocket ideSocket) - { - Log ("info", $"DevToolsProxy: Starting on {browserUri}"); - using (this.ide = ideSocket) { - Log ("verbose", $"DevToolsProxy: IDE waiting for connection on {browserUri}"); - queues.Add (new DevToolsQueue (this.ide)); - using (this.browser = new ClientWebSocket ()) { - this.browser.Options.KeepAliveInterval = Timeout.InfiniteTimeSpan; - await this.browser.ConnectAsync (browserUri, CancellationToken.None); - queues.Add (new DevToolsQueue (this.browser)); - - Log ("verbose", $"DevToolsProxy: Client connected on {browserUri}"); - var x = new CancellationTokenSource (); - - pending_ops.Add (ReadOne (browser, x.Token)); - pending_ops.Add (ReadOne (ide, x.Token)); - pending_ops.Add (side_exception.Task); - pending_ops.Add (client_initiated_close.Task); - - try { - while (!x.IsCancellationRequested) { - var task = await Task.WhenAny (pending_ops.ToArray ()); - //logger.LogTrace ("pump {0} {1}", task, pending_ops.IndexOf (task)); - if (task == pending_ops [0]) { - var msg = ((Task)task).Result; - if (msg != null) { - pending_ops [0] = ReadOne (browser, x.Token); //queue next read - ProcessBrowserMessage (msg, x.Token); - } - } else if (task == pending_ops [1]) { - var msg = ((Task)task).Result; - if (msg != null) { - pending_ops [1] = ReadOne (ide, x.Token); //queue next read - ProcessIdeMessage (msg, x.Token); - } - } else if (task == pending_ops [2]) { - var res = ((Task)task).Result; - throw new Exception ("side task must always complete with an exception, what's going on???"); - } else if (task == pending_ops [3]) { - var res = ((Task)task).Result; - Log ("verbose", $"DevToolsProxy: Client initiated close from {browserUri}"); - x.Cancel (); - } else { - //must be a background task - pending_ops.Remove (task); - var queue = GetQueueForTask (task); - if (queue != null) { - var tsk = queue.Pump (x.Token); - if (tsk != null) - pending_ops.Add (tsk); - } - } - } - } catch (Exception e) { - Log ("error", $"DevToolsProxy::Run: Exception {e}"); - //throw; - } finally { - if (!x.IsCancellationRequested) - x.Cancel (); - } - } - } - } - - protected void Log (string priority, string msg) - { - switch (priority) { - case "protocol": - logger.LogTrace (msg); - break; - case "verbose": - logger.LogDebug (msg); - break; - case "info": - case "warning": - case "error": - default: - logger.LogDebug (msg); - break; - } - } - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/EvaluateExpression.cs b/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/EvaluateExpression.cs deleted file mode 100644 index fb7e776ed902..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/EvaluateExpression.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Newtonsoft.Json.Linq; - -using System.Threading; -using System.IO; -using System.Collections.Generic; -using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp; -using Microsoft.CodeAnalysis.Emit; -using System.Reflection; -using Microsoft.CodeAnalysis.CSharp.Syntax; - -namespace WebAssembly.Net.Debugging { - - internal class EvaluateExpression { - - class FindThisExpression : CSharpSyntaxWalker { - public List thisExpressions = new List (); - public SyntaxTree syntaxTree; - public FindThisExpression (SyntaxTree syntax) - { - syntaxTree = syntax; - } - public override void Visit (SyntaxNode node) - { - if (node is ThisExpressionSyntax) { - if (node.Parent is MemberAccessExpressionSyntax thisParent && thisParent.Name is IdentifierNameSyntax) { - IdentifierNameSyntax var = thisParent.Name as IdentifierNameSyntax; - thisExpressions.Add(var.Identifier.Text); - var newRoot = syntaxTree.GetRoot ().ReplaceNode (node.Parent, thisParent.Name); - syntaxTree = syntaxTree.WithRootAndOptions (newRoot, syntaxTree.Options); - this.Visit (GetExpressionFromSyntaxTree(syntaxTree)); - } - } - else - base.Visit (node); - } - - public async Task CheckIfIsProperty (MonoProxy proxy, MessageId msg_id, int scope_id, CancellationToken token) - { - foreach (var var in thisExpressions) { - JToken value = await proxy.TryGetVariableValue (msg_id, scope_id, var, true, token); - if (value == null) - throw new Exception ($"The property {var} does not exist in the current context"); - } - } - } - - class FindVariableNMethodCall : CSharpSyntaxWalker { - public List variables = new List (); - public List thisList = new List (); - public List methodCall = new List (); - public List values = new List (); - - public override void Visit (SyntaxNode node) - { - if (node is IdentifierNameSyntax identifier && !variables.Any (x => x.Identifier.Text == identifier.Identifier.Text)) - variables.Add (identifier); - if (node is InvocationExpressionSyntax) { - methodCall.Add (node as InvocationExpressionSyntax); - throw new Exception ("Method Call is not implemented yet"); - } - if (node is AssignmentExpressionSyntax) - throw new Exception ("Assignment is not implemented yet"); - base.Visit (node); - } - public async Task ReplaceVars (SyntaxTree syntaxTree, MonoProxy proxy, MessageId msg_id, int scope_id, CancellationToken token) - { - CompilationUnitSyntax root = syntaxTree.GetCompilationUnitRoot (); - foreach (var var in variables) { - ClassDeclarationSyntax classDeclaration = root.Members.ElementAt (0) as ClassDeclarationSyntax; - MethodDeclarationSyntax method = classDeclaration.Members.ElementAt (0) as MethodDeclarationSyntax; - - JToken value = await proxy.TryGetVariableValue (msg_id, scope_id, var.Identifier.Text, false, token); - - if (value == null) - throw new Exception ($"The name {var.Identifier.Text} does not exist in the current context"); - - values.Add (ConvertJSToCSharpType (value ["value"] ["value"].ToString (), value ["value"] ["type"].ToString ())); - - var updatedMethod = method.AddParameterListParameters ( - SyntaxFactory.Parameter ( - SyntaxFactory.Identifier (var.Identifier.Text)) - .WithType (SyntaxFactory.ParseTypeName (GetTypeFullName(value["value"]["type"].ToString())))); - root = root.ReplaceNode (method, updatedMethod); - } - syntaxTree = syntaxTree.WithRootAndOptions (root, syntaxTree.Options); - return syntaxTree; - } - - private object ConvertJSToCSharpType (string v, string type) - { - switch (type) { - case "number": - return Convert.ChangeType (v, typeof (int)); - case "string": - return v; - } - - throw new Exception ($"Evaluate of this datatype {type} not implemented yet"); - } - - private string GetTypeFullName (string type) - { - switch (type) { - case "number": - return typeof (int).FullName; - case "string": - return typeof (string).FullName; - } - - throw new Exception ($"Evaluate of this datatype {type} not implemented yet"); - } - } - static SyntaxNode GetExpressionFromSyntaxTree (SyntaxTree syntaxTree) - { - CompilationUnitSyntax root = syntaxTree.GetCompilationUnitRoot (); - ClassDeclarationSyntax classDeclaration = root.Members.ElementAt (0) as ClassDeclarationSyntax; - MethodDeclarationSyntax methodDeclaration = classDeclaration.Members.ElementAt (0) as MethodDeclarationSyntax; - BlockSyntax blockValue = methodDeclaration.Body; - ReturnStatementSyntax returnValue = blockValue.Statements.ElementAt (0) as ReturnStatementSyntax; - InvocationExpressionSyntax expressionInvocation = returnValue.Expression as InvocationExpressionSyntax; - MemberAccessExpressionSyntax expressionMember = expressionInvocation.Expression as MemberAccessExpressionSyntax; - ParenthesizedExpressionSyntax expressionParenthesized = expressionMember.Expression as ParenthesizedExpressionSyntax; - return expressionParenthesized.Expression; - } - internal static async Task CompileAndRunTheExpression (MonoProxy proxy, MessageId msg_id, int scope_id, string expression, CancellationToken token) - { - FindVariableNMethodCall findVarNMethodCall = new FindVariableNMethodCall (); - string retString; - SyntaxTree syntaxTree = CSharpSyntaxTree.ParseText (@" - using System; - public class CompileAndRunTheExpression - { - public string Evaluate() - { - return (" + expression + @").ToString(); - } - }"); - - FindThisExpression findThisExpression = new FindThisExpression (syntaxTree); - var expressionTree = GetExpressionFromSyntaxTree(syntaxTree); - findThisExpression.Visit (expressionTree); - await findThisExpression.CheckIfIsProperty (proxy, msg_id, scope_id, token); - syntaxTree = findThisExpression.syntaxTree; - - expressionTree = GetExpressionFromSyntaxTree (syntaxTree); - findVarNMethodCall.Visit (expressionTree); - - syntaxTree = await findVarNMethodCall.ReplaceVars (syntaxTree, proxy, msg_id, scope_id, token); - - MetadataReference [] references = new MetadataReference [] - { - MetadataReference.CreateFromFile(typeof(object).Assembly.Location), - MetadataReference.CreateFromFile(typeof(Enumerable).Assembly.Location) - }; - - CSharpCompilation compilation = CSharpCompilation.Create ( - "compileAndRunTheExpression", - syntaxTrees: new [] { syntaxTree }, - references: references, - options: new CSharpCompilationOptions (OutputKind.DynamicallyLinkedLibrary)); - using (var ms = new MemoryStream ()) { - EmitResult result = compilation.Emit (ms); - ms.Seek (0, SeekOrigin.Begin); - Assembly assembly = Assembly.Load (ms.ToArray ()); - Type type = assembly.GetType ("CompileAndRunTheExpression"); - object obj = Activator.CreateInstance (type); - var ret = type.InvokeMember ("Evaluate", - BindingFlags.Default | BindingFlags.InvokeMethod, - null, - obj, - //new object [] { 10 } - findVarNMethodCall.values.ToArray ()); - retString = ret.ToString (); - } - return retString; - } - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/MonoProxy.cs b/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/MonoProxy.cs deleted file mode 100644 index 1b26dd93fd40..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/MonoDebugProxy/ws-proxy/MonoProxy.cs +++ /dev/null @@ -1,885 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using Newtonsoft.Json.Linq; - -using System.Threading; -using System.IO; -using System.Collections.Generic; -using System.Net; -using Microsoft.Extensions.Logging; -using Microsoft.CodeAnalysis; - - -namespace WebAssembly.Net.Debugging { - - internal class MonoProxy : DevToolsProxy { - HashSet sessions = new HashSet (); - Dictionary contexts = new Dictionary (); - - public MonoProxy (ILoggerFactory loggerFactory, bool hideWebDriver = true) : base(loggerFactory) { this.hideWebDriver = hideWebDriver; } - - readonly bool hideWebDriver; - - internal ExecutionContext GetContext (SessionId sessionId) - { - if (contexts.TryGetValue (sessionId, out var context)) - return context; - - throw new ArgumentException ($"Invalid Session: \"{sessionId}\"", nameof (sessionId)); - } - - bool UpdateContext (SessionId sessionId, ExecutionContext executionContext, out ExecutionContext previousExecutionContext) - { - var previous = contexts.TryGetValue (sessionId, out previousExecutionContext); - contexts[sessionId] = executionContext; - return previous; - } - - internal Task SendMonoCommand (SessionId id, MonoCommands cmd, CancellationToken token) - => SendCommand (id, "Runtime.evaluate", JObject.FromObject (cmd), token); - - protected override async Task AcceptEvent (SessionId sessionId, string method, JObject args, CancellationToken token) - { - switch (method) { - case "Runtime.consoleAPICalled": { - var type = args["type"]?.ToString (); - if (type == "debug") { - if (args["args"]?[0]?["value"]?.ToString () == MonoConstants.RUNTIME_IS_READY && args["args"]?[1]?["value"]?.ToString () == "fe00e07a-5519-4dfe-b35a-f867dbaf2e28") - await RuntimeReady (sessionId, token); - } - break; - } - - case "Runtime.executionContextCreated": { - SendEvent (sessionId, method, args, token); - var ctx = args? ["context"]; - var aux_data = ctx? ["auxData"] as JObject; - var id = ctx ["id"].Value (); - if (aux_data != null) { - var is_default = aux_data ["isDefault"]?.Value (); - if (is_default == true) { - await OnDefaultContext (sessionId, new ExecutionContext { Id = id, AuxData = aux_data }, token); - } - } - return true; - } - - case "Debugger.paused": { - //TODO figure out how to stich out more frames and, in particular what happens when real wasm is on the stack - var top_func = args? ["callFrames"]? [0]? ["functionName"]?.Value (); - - if (top_func == "mono_wasm_fire_bp" || top_func == "_mono_wasm_fire_bp") { - return await OnBreakpointHit (sessionId, args, token); - } - break; - } - - case "Debugger.breakpointResolved": { - break; - } - - case "Debugger.scriptParsed": { - var url = args? ["url"]?.Value () ?? ""; - - switch (url) { - case var _ when url == "": - case var _ when url.StartsWith ("wasm://", StringComparison.Ordinal): { - Log ("verbose", $"ignoring wasm: Debugger.scriptParsed {url}"); - return true; - } - } - Log ("verbose", $"proxying Debugger.scriptParsed ({sessionId.sessionId}) {url} {args}"); - break; - } - - case "Target.attachedToTarget": { - if (args["targetInfo"]["type"]?.ToString() == "page") - await DeleteWebDriver (new SessionId (args["sessionId"]?.ToString ()), token); - break; - } - - } - - return false; - } - - async Task IsRuntimeAlreadyReadyAlready (SessionId sessionId, CancellationToken token) - { - var res = await SendMonoCommand (sessionId, MonoCommands.IsRuntimeReady (), token); - return res.Value? ["result"]? ["value"]?.Value () ?? false; - } - - static int bpIdGenerator; - - protected override async Task AcceptCommand (MessageId id, string method, JObject args, CancellationToken token) - { - // Inspector doesn't use the Target domain or sessions - // so we try to init immediately - if (hideWebDriver && id == SessionId.Null) - await DeleteWebDriver (id, token); - - if (!contexts.TryGetValue (id, out var context)) - return false; - - switch (method) { - case "Target.attachToTarget": { - var resp = await SendCommand (id, method, args, token); - await DeleteWebDriver (new SessionId (resp.Value ["sessionId"]?.ToString ()), token); - break; - } - - case "Debugger.enable": { - var resp = await SendCommand (id, method, args, token); - - context.DebuggerId = resp.Value ["debuggerId"]?.ToString (); - - if (await IsRuntimeAlreadyReadyAlready (id, token)) - await RuntimeReady (id, token); - - SendResponse (id,resp,token); - return true; - } - - case "Debugger.getScriptSource": { - var script = args? ["scriptId"]?.Value (); - return await OnGetScriptSource (id, script, token); - } - - case "Runtime.compileScript": { - var exp = args? ["expression"]?.Value (); - if (exp.StartsWith ("//dotnet:", StringComparison.Ordinal)) { - OnCompileDotnetScript (id, token); - return true; - } - break; - } - - case "Debugger.getPossibleBreakpoints": { - var resp = await SendCommand (id, method, args, token); - if (resp.IsOk && resp.Value["locations"].HasValues) { - SendResponse (id, resp, token); - return true; - } - - var start = SourceLocation.Parse (args? ["start"] as JObject); - //FIXME support variant where restrictToFunction=true and end is omitted - var end = SourceLocation.Parse (args? ["end"] as JObject); - if (start != null && end != null && await GetPossibleBreakpoints (id, start, end, token)) - return true; - - SendResponse (id, resp, token); - return true; - } - - case "Debugger.setBreakpoint": { - break; - } - - case "Debugger.setBreakpointByUrl": { - var resp = await SendCommand (id, method, args, token); - if (!resp.IsOk) { - SendResponse (id, resp, token); - return true; - } - - var bpid = resp.Value["breakpointId"]?.ToString (); - var locations = resp.Value["locations"]?.Values(); - var request = BreakpointRequest.Parse (bpid, args); - - // is the store done loading? - var loaded = context.Source.Task.IsCompleted; - if (!loaded) { - // Send and empty response immediately if not - // and register the breakpoint for resolution - context.BreakpointRequests [bpid] = request; - SendResponse (id, resp, token); - } - - if (await IsRuntimeAlreadyReadyAlready (id, token)) { - var store = await RuntimeReady (id, token); - - Log ("verbose", $"BP req {args}"); - await SetBreakpoint (id, store, request, !loaded, token); - } - - if (loaded) { - // we were already loaded so we should send a response - // with the locations included and register the request - context.BreakpointRequests [bpid] = request; - var result = Result.OkFromObject (request.AsSetBreakpointByUrlResponse (locations)); - SendResponse (id, result, token); - - } - return true; - } - - case "Debugger.removeBreakpoint": { - await RemoveBreakpoint (id, args, token); - break; - } - - case "Debugger.resume": { - await OnResume (id, token); - break; - } - - case "Debugger.stepInto": { - return await Step (id, StepKind.Into, token); - } - - case "Debugger.stepOut": { - return await Step (id, StepKind.Out, token); - } - - case "Debugger.stepOver": { - return await Step (id, StepKind.Over, token); - } - - case "Debugger.evaluateOnCallFrame": { - if (!DotnetObjectId.TryParse (args? ["callFrameId"], out var objectId)) - return false; - - switch (objectId.Scheme) { - case "scope": - return await OnEvaluateOnCallFrame (id, - int.Parse (objectId.Value), - args? ["expression"]?.Value (), token); - default: - return false; - } - } - - case "Runtime.getProperties": { - if (!DotnetObjectId.TryParse (args? ["objectId"], out var objectId)) - break; - - var result = await RuntimeGetProperties (id, objectId, args, token); - SendResponse (id, result, token); - return true; - } - - case "Runtime.releaseObject": { - if (!(DotnetObjectId.TryParse (args ["objectId"], out var objectId) && objectId.Scheme == "cfo_res")) - break; - - await SendMonoCommand (id, MonoCommands.ReleaseObject (objectId), token); - SendResponse (id, Result.OkFromObject (new{}), token); - return true; - } - - // Protocol extensions - case "Dotnet-test.setBreakpointByMethod": { - Console.WriteLine ("set-breakpoint-by-method: " + id + " " + args); - - var store = await RuntimeReady (id, token); - string aname = args ["assemblyName"]?.Value (); - string typeName = args ["typeName"]?.Value (); - string methodName = args ["methodName"]?.Value (); - if (aname == null || typeName == null || methodName == null) { - SendResponse (id, Result.Err ("Invalid protocol message '" + args + "'."), token); - return true; - } - - // GetAssemblyByName seems to work on file names - var assembly = store.GetAssemblyByName (aname); - if (assembly == null) - assembly = store.GetAssemblyByName (aname + ".exe"); - if (assembly == null) - assembly = store.GetAssemblyByName (aname + ".dll"); - if (assembly == null) { - SendResponse (id, Result.Err ("Assembly '" + aname + "' not found."), token); - return true; - } - - var type = assembly.GetTypeByName (typeName); - if (type == null) { - SendResponse (id, Result.Err ($"Type '{typeName}' not found."), token); - return true; - } - - var methodInfo = type.Methods.FirstOrDefault (m => m.Name == methodName); - if (methodInfo == null) { - SendResponse (id, Result.Err ($"Method '{typeName}:{methodName}' not found."), token); - return true; - } - - bpIdGenerator ++; - string bpid = "by-method-" + bpIdGenerator.ToString (); - var request = new BreakpointRequest (bpid, methodInfo); - context.BreakpointRequests[bpid] = request; - - var loc = methodInfo.StartLocation; - var bp = await SetMonoBreakpoint (id, bpid, loc, token); - if (bp.State != BreakpointState.Active) { - // FIXME: - throw new NotImplementedException (); - } - - var resolvedLocation = new { - breakpointId = bpid, - location = loc.AsLocation () - }; - - SendEvent (id, "Debugger.breakpointResolved", JObject.FromObject (resolvedLocation), token); - - SendResponse (id, Result.OkFromObject (new { - result = new { breakpointId = bpid, locations = new object [] { loc.AsLocation () }} - }), token); - - return true; - } - case "Runtime.callFunctionOn": { - if (!DotnetObjectId.TryParse (args ["objectId"], out var objectId)) - return false; - - var silent = args ["silent"]?.Value () ?? false; - if (objectId.Scheme == "scope") { - var fail = silent ? Result.OkFromObject (new { result = new { } }) : Result.Exception (new ArgumentException ($"Runtime.callFunctionOn not supported with scope ({objectId}).")); - - SendResponse (id, fail, token); - return true; - } - - var returnByValue = args ["returnByValue"]?.Value () ?? false; - var res = await SendMonoCommand (id, MonoCommands.CallFunctionOn (args), token); - - if (!returnByValue && - DotnetObjectId.TryParse (res.Value?["result"]?["value"]?["objectId"], out var resultObjectId) && - resultObjectId.Scheme == "cfo_res") - res = Result.OkFromObject (new { result = res.Value ["result"]["value"] }); - - if (res.IsErr && silent) - res = Result.OkFromObject (new { result = new { } }); - - SendResponse (id, res, token); - return true; - } - } - - return false; - } - - async Task RuntimeGetProperties (MessageId id, DotnetObjectId objectId, JToken args, CancellationToken token) - { - if (objectId.Scheme == "scope") - return await GetScopeProperties (id, int.Parse (objectId.Value), token); - - var res = await SendMonoCommand (id, MonoCommands.GetDetails (objectId, args), token); - if (res.IsErr) - return res; - - if (objectId.Scheme == "cfo_res") { - // Runtime.callFunctionOn result object - var value_json_str = res.Value ["result"]?["value"]?["__value_as_json_string__"]?.Value (); - if (value_json_str != null) { - res = Result.OkFromObject (new { - result = JArray.Parse (value_json_str.Replace (@"\""", "\"")) - }); - } else { - res = Result.OkFromObject (new { result = new {} }); - } - } else { - res = Result.Ok (JObject.FromObject (new { result = res.Value ["result"] ["value"] })); - } - - return res; - } - - //static int frame_id=0; - async Task OnBreakpointHit (SessionId sessionId, JObject args, CancellationToken token) - { - //FIXME we should send release objects every now and then? Or intercept those we inject and deal in the runtime - var res = await SendMonoCommand (sessionId, MonoCommands.GetCallStack(), token); - var orig_callframes = args? ["callFrames"]?.Values (); - var context = GetContext (sessionId); - - if (res.IsErr) { - //Give up and send the original call stack - return false; - } - - //step one, figure out where did we hit - var res_value = res.Value? ["result"]? ["value"]; - if (res_value == null || res_value is JValue) { - //Give up and send the original call stack - return false; - } - - Log ("verbose", $"call stack (err is {res.Error} value is:\n{res.Value}"); - var bp_id = res_value? ["breakpoint_id"]?.Value (); - Log ("verbose", $"We just hit bp {bp_id}"); - if (!bp_id.HasValue) { - //Give up and send the original call stack - return false; - } - - var bp = context.BreakpointRequests.Values.SelectMany (v => v.Locations).FirstOrDefault (b => b.RemoteId == bp_id.Value); - - var callFrames = new List (); - foreach (var frame in orig_callframes) { - var function_name = frame ["functionName"]?.Value (); - var url = frame ["url"]?.Value (); - if ("mono_wasm_fire_bp" == function_name || "_mono_wasm_fire_bp" == function_name) { - var frames = new List (); - int frame_id = 0; - var the_mono_frames = res.Value? ["result"]? ["value"]? ["frames"]?.Values (); - - foreach (var mono_frame in the_mono_frames) { - ++frame_id; - var il_pos = mono_frame ["il_pos"].Value (); - var method_token = mono_frame ["method_token"].Value (); - var assembly_name = mono_frame ["assembly_name"].Value (); - - // This can be different than `method.Name`, like in case of generic methods - var method_name = mono_frame ["method_name"]?.Value (); - - var store = await LoadStore (sessionId, token); - var asm = store.GetAssemblyByName (assembly_name); - if (asm == null) { - Log ("info",$"Unable to find assembly: {assembly_name}"); - continue; - } - - var method = asm.GetMethodByToken (method_token); - - if (method == null) { - Log ("info", $"Unable to find il offset: {il_pos} in method token: {method_token} assembly name: {assembly_name}"); - continue; - } - - var location = method?.GetLocationByIl (il_pos); - - // When hitting a breakpoint on the "IncrementCount" method in the standard - // Blazor project template, one of the stack frames is inside mscorlib.dll - // and we get location==null for it. It will trigger a NullReferenceException - // if we don't skip over that stack frame. - if (location == null) { - continue; - } - - Log ("info", $"frame il offset: {il_pos} method token: {method_token} assembly name: {assembly_name}"); - Log ("info", $"\tmethod {method_name} location: {location}"); - frames.Add (new Frame (method, location, frame_id-1)); - - callFrames.Add (new { - functionName = method_name, - callFrameId = $"dotnet:scope:{frame_id-1}", - functionLocation = method.StartLocation.AsLocation (), - - location = location.AsLocation (), - - url = store.ToUrl (location), - - scopeChain = new [] { - new { - type = "local", - @object = new { - @type = "object", - className = "Object", - description = "Object", - objectId = $"dotnet:scope:{frame_id-1}", - }, - name = method_name, - startLocation = method.StartLocation.AsLocation (), - endLocation = method.EndLocation.AsLocation (), - }} - }); - - context.CallStack = frames; - - } - } else if (!(function_name.StartsWith ("wasm-function", StringComparison.Ordinal) - || url.StartsWith ("wasm://wasm/", StringComparison.Ordinal))) { - callFrames.Add (frame); - } - } - - var bp_list = new string [bp == null ? 0 : 1]; - if (bp != null) - bp_list [0] = bp.StackId; - - var o = JObject.FromObject (new { - callFrames, - reason = "other", //other means breakpoint - hitBreakpoints = bp_list, - }); - - SendEvent (sessionId, "Debugger.paused", o, token); - return true; - } - - async Task OnDefaultContext (SessionId sessionId, ExecutionContext context, CancellationToken token) - { - Log ("verbose", "Default context created, clearing state and sending events"); - if (UpdateContext (sessionId, context, out var previousContext)) { - foreach (var kvp in previousContext.BreakpointRequests) { - context.BreakpointRequests[kvp.Key] = kvp.Value.Clone(); - } - } - - if (await IsRuntimeAlreadyReadyAlready (sessionId, token)) - await RuntimeReady (sessionId, token); - } - - async Task OnResume (MessageId msd_id, CancellationToken token) - { - //discard managed frames - GetContext (msd_id).ClearState (); - await Task.CompletedTask; - } - - async Task Step (MessageId msg_id, StepKind kind, CancellationToken token) - { - var context = GetContext (msg_id); - if (context.CallStack == null) - return false; - - if (context.CallStack.Count <= 1 && kind == StepKind.Out) - return false; - - var res = await SendMonoCommand (msg_id, MonoCommands.StartSingleStepping (kind), token); - - var ret_code = res.Value? ["result"]? ["value"]?.Value (); - - if (ret_code.HasValue && ret_code.Value == 0) { - context.ClearState (); - await SendCommand (msg_id, "Debugger.stepOut", new JObject (), token); - return false; - } - - SendResponse (msg_id, Result.Ok (new JObject ()), token); - - context.ClearState (); - - await SendCommand (msg_id, "Debugger.resume", new JObject (), token); - return true; - } - - internal bool TryFindVariableValueInCache(ExecutionContext ctx, string expression, bool only_search_on_this, out JToken obj) - { - if (ctx.LocalsCache.TryGetValue (expression, out obj)) { - if (only_search_on_this && obj["fromThis"] == null) - return false; - return true; - } - return false; - } - - internal async Task TryGetVariableValue (MessageId msg_id, int scope_id, string expression, bool only_search_on_this, CancellationToken token) - { - JToken thisValue = null; - var context = GetContext (msg_id); - if (context.CallStack == null) - return null; - - if (TryFindVariableValueInCache(context, expression, only_search_on_this, out JToken obj)) - return obj; - - var scope = context.CallStack.FirstOrDefault (s => s.Id == scope_id); - var live_vars = scope.Method.GetLiveVarsAt (scope.Location.CliLocation.Offset); - //get_this - var res = await SendMonoCommand (msg_id, MonoCommands.GetScopeVariables (scope.Id, live_vars.Select (lv => lv.Index).ToArray ()), token); - - var scope_values = res.Value? ["result"]? ["value"]?.Values ()?.ToArray (); - thisValue = scope_values?.FirstOrDefault (v => v ["name"]?.Value () == "this"); - - if (!only_search_on_this) { - if (thisValue != null && expression == "this") - return thisValue; - - var value = scope_values.SingleOrDefault (sv => sv ["name"]?.Value () == expression); - if (value != null) - return value; - } - - //search in scope - if (thisValue != null) { - if (!DotnetObjectId.TryParse (thisValue ["value"] ["objectId"], out var objectId)) - return null; - - res = await SendMonoCommand (msg_id, MonoCommands.GetDetails (objectId), token); - scope_values = res.Value? ["result"]? ["value"]?.Values ().ToArray (); - var foundValue = scope_values.FirstOrDefault (v => v ["name"].Value () == expression); - if (foundValue != null) { - foundValue["fromThis"] = true; - context.LocalsCache[foundValue ["name"].Value ()] = foundValue; - return foundValue; - } - } - return null; - } - - async Task OnEvaluateOnCallFrame (MessageId msg_id, int scope_id, string expression, CancellationToken token) - { - try { - var context = GetContext (msg_id); - if (context.CallStack == null) - return false; - - var varValue = await TryGetVariableValue (msg_id, scope_id, expression, false, token); - - if (varValue != null) { - SendResponse (msg_id, Result.OkFromObject (new { - result = varValue ["value"] - }), token); - return true; - } - - string retValue = await EvaluateExpression.CompileAndRunTheExpression (this, msg_id, scope_id, expression, token); - SendResponse (msg_id, Result.OkFromObject (new { - result = new { - value = retValue - } - }), token); - return true; - } catch (Exception e) { - logger.LogDebug (e, $"Error in EvaluateOnCallFrame for expression '{expression}."); - } - return false; - } - - async Task GetScopeProperties (MessageId msg_id, int scope_id, CancellationToken token) - { - try { - var ctx = GetContext (msg_id); - var scope = ctx.CallStack.FirstOrDefault (s => s.Id == scope_id); - if (scope == null) - return Result.Err (JObject.FromObject (new { message = $"Could not find scope with id #{scope_id}" })); - - var vars = scope.Method.GetLiveVarsAt (scope.Location.CliLocation.Offset); - - var var_ids = vars.Select (v => v.Index).ToArray (); - var res = await SendMonoCommand (msg_id, MonoCommands.GetScopeVariables (scope.Id, var_ids), token); - - //if we fail we just buble that to the IDE (and let it panic over it) - if (res.IsErr) - return res; - - var values = res.Value? ["result"]? ["value"]?.Values ().ToArray (); - - if(values == null) - return Result.OkFromObject (new { result = Array.Empty () }); - - var var_list = new List (); - int i = 0; - for (; i < vars.Length && i < values.Length; i ++) { - // For async methods, we get locals with names, unlike non-async methods - // and the order may not match the var_ids, so, use the names that they - // come with - if (values [i]["name"] != null) - continue; - - ctx.LocalsCache[vars [i].Name] = values [i]; - var_list.Add (new { name = vars [i].Name, value = values [i]["value"] }); - } - for (; i < values.Length; i ++) { - ctx.LocalsCache[values [i]["name"].ToString()] = values [i]; - var_list.Add (values [i]); - } - - return Result.OkFromObject (new { result = var_list }); - } catch (Exception exception) { - Log ("verbose", $"Error resolving scope properties {exception.Message}"); - return Result.Exception (exception); - } - } - - async Task SetMonoBreakpoint (SessionId sessionId, string reqId, SourceLocation location, CancellationToken token) - { - var bp = new Breakpoint (reqId, location, BreakpointState.Pending); - var asm_name = bp.Location.CliLocation.Method.Assembly.Name; - var method_token = bp.Location.CliLocation.Method.Token; - var il_offset = bp.Location.CliLocation.Offset; - - var res = await SendMonoCommand (sessionId, MonoCommands.SetBreakpoint (asm_name, method_token, il_offset), token); - var ret_code = res.Value? ["result"]? ["value"]?.Value (); - - if (ret_code.HasValue) { - bp.RemoteId = ret_code.Value; - bp.State = BreakpointState.Active; - //Log ("verbose", $"BP local id {bp.LocalId} enabled with remote id {bp.RemoteId}"); - } - - return bp; - } - - async Task LoadStore (SessionId sessionId, CancellationToken token) - { - var context = GetContext (sessionId); - - if (Interlocked.CompareExchange (ref context.store, new DebugStore (logger), null) != null) - return await context.Source.Task; - - try { - var loaded_pdbs = await SendMonoCommand (sessionId, MonoCommands.GetLoadedFiles(), token); - var the_value = loaded_pdbs.Value? ["result"]? ["value"]; - var the_pdbs = the_value?.ToObject (); - - await foreach (var source in context.store.Load(sessionId, the_pdbs, token).WithCancellation (token)) { - var scriptSource = JObject.FromObject (source.ToScriptSource (context.Id, context.AuxData)); - Log ("verbose", $"\tsending {source.Url} {context.Id} {sessionId.sessionId}"); - - SendEvent (sessionId, "Debugger.scriptParsed", scriptSource, token); - - foreach (var req in context.BreakpointRequests.Values) { - if (req.TryResolve (source)) { - await SetBreakpoint (sessionId, context.store, req, true, token); - } - } - } - } catch (Exception e) { - context.Source.SetException (e); - } - - if (!context.Source.Task.IsCompleted) - context.Source.SetResult (context.store); - return context.store; - } - - async Task RuntimeReady (SessionId sessionId, CancellationToken token) - { - var context = GetContext (sessionId); - if (Interlocked.CompareExchange (ref context.ready, new TaskCompletionSource (), null) != null) - return await context.ready.Task; - - var clear_result = await SendMonoCommand (sessionId, MonoCommands.ClearAllBreakpoints (), token); - if (clear_result.IsErr) { - Log ("verbose", $"Failed to clear breakpoints due to {clear_result}"); - } - - var store = await LoadStore (sessionId, token); - - context.ready.SetResult (store); - SendEvent (sessionId, "Mono.runtimeReady", new JObject (), token); - return store; - } - - async Task RemoveBreakpoint(MessageId msg_id, JObject args, CancellationToken token) { - var bpid = args? ["breakpointId"]?.Value (); - - var context = GetContext (msg_id); - if (!context.BreakpointRequests.TryGetValue (bpid, out var breakpointRequest)) - return; - - foreach (var bp in breakpointRequest.Locations) { - var res = await SendMonoCommand (msg_id, MonoCommands.RemoveBreakpoint (bp.RemoteId), token); - var ret_code = res.Value? ["result"]? ["value"]?.Value (); - - if (ret_code.HasValue) { - bp.RemoteId = -1; - bp.State = BreakpointState.Disabled; - } - } - breakpointRequest.Locations.Clear (); - } - - async Task SetBreakpoint (SessionId sessionId, DebugStore store, BreakpointRequest req, bool sendResolvedEvent, CancellationToken token) - { - var context = GetContext (sessionId); - if (req.Locations.Any ()) { - Log ("debug", $"locations already loaded for {req.Id}"); - return; - } - - var comparer = new SourceLocation.LocationComparer (); - // if column is specified the frontend wants the exact matches - // and will clear the bp if it isn't close enoug - var locations = store.FindBreakpointLocations (req) - .Distinct (comparer) - .Where (l => l.Line == req.Line && (req.Column == 0 || l.Column == req.Column)) - .OrderBy (l => l.Column) - .GroupBy (l => l.Id); - - logger.LogDebug ("BP request for '{req}' runtime ready {context.RuntimeReady}", req, GetContext (sessionId).IsRuntimeReady); - - var breakpoints = new List (); - - foreach (var sourceId in locations) { - var loc = sourceId.First (); - var bp = await SetMonoBreakpoint (sessionId, req.Id, loc, token); - - // If we didn't successfully enable the breakpoint - // don't add it to the list of locations for this id - if (bp.State != BreakpointState.Active) - continue; - - breakpoints.Add (bp); - - var resolvedLocation = new { - breakpointId = req.Id, - location = loc.AsLocation () - }; - - if (sendResolvedEvent) - SendEvent (sessionId, "Debugger.breakpointResolved", JObject.FromObject (resolvedLocation), token); - } - - req.Locations.AddRange (breakpoints); - return; - } - - async Task GetPossibleBreakpoints (MessageId msg, SourceLocation start, SourceLocation end, CancellationToken token) - { - var bps = (await RuntimeReady (msg, token)).FindPossibleBreakpoints (start, end); - - if (bps == null) - return false; - - var response = new { locations = bps.Select (b => b.AsLocation ()) }; - - SendResponse (msg, Result.OkFromObject (response), token); - return true; - } - - void OnCompileDotnetScript (MessageId msg_id, CancellationToken token) - { - SendResponse (msg_id, Result.OkFromObject (new { }), token); - } - - async Task OnGetScriptSource (MessageId msg_id, string script_id, CancellationToken token) - { - if (!SourceId.TryParse (script_id, out var id)) - return false; - - var src_file = (await LoadStore (msg_id, token)).GetFileById (id); - - try { - var uri = new Uri (src_file.Url); - string source = $"// Unable to find document {src_file.SourceUri}"; - - using (var data = await src_file.GetSourceAsync (checkHash: false, token: token)) { - if (data.Length == 0) - return false; - - using (var reader = new StreamReader (data)) - source = await reader.ReadToEndAsync (); - } - SendResponse (msg_id, Result.OkFromObject (new { scriptSource = source }), token); - } catch (Exception e) { - var o = new { - scriptSource = $"// Unable to read document ({e.Message})\n" + - $"Local path: {src_file?.SourceUri}\n" + - $"SourceLink path: {src_file?.SourceLinkUri}\n" - }; - - SendResponse (msg_id, Result.OkFromObject (o), token); - } - return true; - } - - async Task DeleteWebDriver (SessionId sessionId, CancellationToken token) - { - // see https://github.com/mono/mono/issues/19549 for background - if (hideWebDriver && sessions.Add (sessionId)) { - var res = await SendCommand (sessionId, - "Page.addScriptToEvaluateOnNewDocument", - JObject.FromObject (new { source = "delete navigator.constructor.prototype.webdriver"}), - token); - - if (sessionId != SessionId.Null && !res.IsOk) - sessions.Remove (sessionId); - } - } - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/Program.cs b/src/Components/WebAssembly/DebugProxy/src/Program.cs deleted file mode 100644 index ce67276e6e04..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/Program.cs +++ /dev/null @@ -1,71 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.Hosting; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.CommandLineUtils; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; - -namespace Microsoft.AspNetCore.Components.WebAssembly.DebugProxy -{ - public class Program - { - static int Main(string[] args) - { - var app = new CommandLineApplication(throwOnUnexpectedArg: false) - { - Name = "webassembly-debugproxy" - }; - app.HelpOption("-?|-h|--help"); - - var browserHostOption = new CommandOption("-b|--browser-host", CommandOptionType.SingleValue) - { - Description = "Host on which the browser is listening for debug connections. Example: http://localhost:9300" - }; - - var ownerPidOption = new CommandOption("-op|--owner-pid", CommandOptionType.SingleValue) - { - Description = "ID of the owner process. The debug proxy will shut down if this process exits." - }; - - app.Options.Add(browserHostOption); - app.Options.Add(ownerPidOption); - - app.OnExecute(() => - { - var browserHost = browserHostOption.HasValue() ? browserHostOption.Value(): "http://127.0.0.1:9222"; - var host = DebugProxyHost.CreateDefaultBuilder(args, browserHost).Build(); - - if (ownerPidOption.HasValue()) - { - var ownerProcess = Process.GetProcessById(int.Parse(ownerPidOption.Value())); - ownerProcess.EnableRaisingEvents = true; - ownerProcess.Exited += async (sender, eventArgs) => - { - Console.WriteLine("Exiting because parent process has exited"); - await host.StopAsync(); - }; - } - - host.Run(); - - return 0; - }); - - try - { - return app.Execute(args); - } - catch (CommandParsingException cex) - { - app.Error.WriteLine(cex.Message); - app.ShowHelp(); - return 1; - } - } - } -} diff --git a/src/Components/WebAssembly/DebugProxy/src/Startup.cs b/src/Components/WebAssembly/DebugProxy/src/Startup.cs deleted file mode 100644 index 9a80b2a2527a..000000000000 --- a/src/Components/WebAssembly/DebugProxy/src/Startup.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Net; -using Microsoft.AspNetCore.Builder; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using WebAssembly.Net.Debugging; - -namespace Microsoft.AspNetCore.Components.WebAssembly.DebugProxy -{ - public class Startup - { - public void Configure(IApplicationBuilder app, DebugProxyOptions debugProxyOptions) - { - app.UseDeveloperExceptionPage(); - app.UseWebSockets(); - app.UseRouting(); - - app.UseEndpoints(endpoints => - { - // At the homepage, we check whether we can uniquely identify the target tab - // - If yes, we redirect directly to the debug tools, proxying to that tab - // - If no, we present a list of available tabs for the user to pick from - endpoints.MapGet("/", new TargetPickerUi(debugProxyOptions).Display); - - // At this URL, we wire up the actual WebAssembly proxy - endpoints.MapGet("/ws-proxy", async (context) => - { - if (!context.WebSockets.IsWebSocketRequest) - { - context.Response.StatusCode = (int)HttpStatusCode.BadRequest; - return; - } - - var loggerFactory = context.RequestServices.GetRequiredService(); - var browserUri = new Uri(context.Request.Query["browser"]); - var ideSocket = await context.WebSockets.AcceptWebSocketAsync(); - await new MonoProxy(loggerFactory).Run(browserUri, ideSocket); - }); - }); - } - } -} diff --git a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs index a8351af1062b..f6cc0ebe21be 100644 --- a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs +++ b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs @@ -48,7 +48,7 @@ private static async Task LaunchAndGetUrl(IServiceProvider serviceProvid var processStartInfo = new ProcessStartInfo { FileName = muxerPath, - Arguments = $"exec \"{executablePath}\" --owner-pid {ownerPid}", + Arguments = $"exec \"{executablePath}\"", UseShellExecute = false, RedirectStandardOutput = true, }; @@ -87,7 +87,7 @@ private static string LocateDebugProxyExecutable(IWebHostEnvironment environment var debugProxyPath = Path.Combine( Path.GetDirectoryName(assembly.Location), "BlazorDebugProxy", - "Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.dll"); + "BrowserDebugHost.dll"); if (!File.Exists(debugProxyPath)) { diff --git a/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj b/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj index 0b94d5c6e831..f77658c0e097 100644 --- a/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj +++ b/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj @@ -12,6 +12,9 @@ + + + @@ -22,27 +25,13 @@ - - - - - - + - - diff --git a/src/Components/WebAssembly/DebugProxy/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs similarity index 91% rename from src/Components/WebAssembly/DebugProxy/src/TargetPickerUi.cs rename to src/Components/WebAssembly/Server/src/TargetPickerUi.cs index 249e2e5f379f..e063ba8fefe6 100644 --- a/src/Components/WebAssembly/DebugProxy/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNetCore.Components.WebAssembly.DebugProxy +namespace Microsoft.AspNetCore.Components.WebAssembly.Server { public class TargetPickerUi { @@ -23,11 +23,12 @@ public class TargetPickerUi IgnoreNullValues = true }; - private readonly DebugProxyOptions _options; + private readonly string BrowserHost = "http://localhost:9222"; + private string _debugProxyUrl; - public TargetPickerUi(DebugProxyOptions options) + public TargetPickerUi(string debugProxyUrl) { - _options = options ?? throw new ArgumentNullException(nameof(options)); + _debugProxyUrl = debugProxyUrl; } public async Task Display(HttpContext context) @@ -37,7 +38,7 @@ public async Task Display(HttpContext context) var request = context.Request; var targetApplicationUrl = request.Query["url"]; - var debuggerTabsListUrl = $"{_options.BrowserHost}/json"; + var debuggerTabsListUrl = $"{BrowserHost}/json"; IEnumerable availableTabs; try @@ -134,17 +135,17 @@ await context.Response.WriteAsync( private string GetDevToolsUrlWithProxy(HttpRequest request, BrowserTab tabToDebug) { - var underlyingV8Endpoint = tabToDebug.WebSocketDebuggerUrl; - var proxyEndpoint = GetProxyEndpoint(request, underlyingV8Endpoint); - var devToolsUrlAbsolute = new Uri(_options.BrowserHost + tabToDebug.DevtoolsFrontendUrl); - var devToolsUrlWithProxy = $"{devToolsUrlAbsolute.Scheme}://{devToolsUrlAbsolute.Authority}{devToolsUrlAbsolute.AbsolutePath}?{proxyEndpoint.Scheme}={proxyEndpoint.Authority}{proxyEndpoint.PathAndQuery}"; + var underlyingV8Endpoint = new Uri(tabToDebug.WebSocketDebuggerUrl); + var proxyEndpoint = new Uri(_debugProxyUrl); + var devToolsUrlAbsolute = new Uri(BrowserHost + tabToDebug.DevtoolsFrontendUrl); + var devToolsUrlWithProxy = $"{devToolsUrlAbsolute.Scheme}://{devToolsUrlAbsolute.Authority}{devToolsUrlAbsolute.AbsolutePath}?{underlyingV8Endpoint.Scheme}={proxyEndpoint.Authority}{underlyingV8Endpoint.PathAndQuery}"; return devToolsUrlWithProxy; } private string GetLaunchChromeInstructions(string targetApplicationUrl) { var profilePath = Path.Combine(Path.GetTempPath(), "blazor-chrome-debug"); - var debuggerPort = new Uri(_options.BrowserHost).Port; + var debuggerPort = new Uri(BrowserHost).Port; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { @@ -170,7 +171,7 @@ private string GetLaunchChromeInstructions(string targetApplicationUrl) private string GetLaunchEdgeInstructions(string targetApplicationUrl) { var profilePath = Path.Combine(Path.GetTempPath(), "blazor-edge-debug"); - var debuggerPort = new Uri(_options.BrowserHost).Port; + var debuggerPort = new Uri(BrowserHost).Port; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { @@ -209,7 +210,7 @@ private static Uri GetProxyEndpoint(HttpRequest incomingRequest, string browserE private async Task> GetOpenedBrowserTabs() { using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(5) }; - var jsonResponse = await httpClient.GetStringAsync($"{_options.BrowserHost}/json"); + var jsonResponse = await httpClient.GetStringAsync($"{BrowserHost}/json"); return JsonSerializer.Deserialize(jsonResponse, JsonOptions); } diff --git a/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs b/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs index 6d51d4ff9bcc..25e80543b017 100644 --- a/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs +++ b/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; +using Microsoft.AspNetCore.Components.WebAssembly.Server; namespace Microsoft.AspNetCore.Builder { @@ -27,11 +28,12 @@ public static void UseWebAssemblyDebugging(this IApplicationBuilder app) requestPath = "/"; } - // Although we could redirect for every URL we see here, we filter the allowed set - // to ensure this doesn't get misused as some kind of more general redirector switch (requestPath) { case "/": + var targetPickerUi = new TargetPickerUi(debugProxyBaseUrl); + await targetPickerUi.Display(context); + break; case "/ws-proxy": context.Response.Redirect($"{debugProxyBaseUrl}{requestPath}{context.Request.QueryString}"); break; From 302d79a347e0a9043417f1c6f01831933634045f Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Thu, 20 Aug 2020 16:05:32 -0700 Subject: [PATCH 15/25] Initial working end-to-end --- eng/Version.Details.xml | 4 ++-- eng/Versions.props | 1 + .../Server/src/DebugProxyLauncher.cs | 11 +++++++---- ...etCore.Components.WebAssembly.Server.csproj | 11 ++--------- .../WebAssembly/Server/src/TargetPickerUi.cs | 15 ++++++++------- ...ssemblyNetDebugProxyAppBuilderExtensions.cs | 18 +++++++++++++++--- 6 files changed, 35 insertions(+), 25 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index bf00659030ac..69c68697c8df 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -306,9 +306,9 @@ https://github.com/dotnet/runtime 1dfd9438149f74ae11918a7b0709b8d58c61443f - + https://github.com/dotnet/runtime - 6cc7cffaff2e0413ee84d9a7736f9ae1aa9a3f12 + 1dfd9438149f74ae11918a7b0709b8d58c61443f diff --git a/eng/Versions.props b/eng/Versions.props index e7cc59f8a605..5d26db11d95e 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -68,6 +68,7 @@ 5.0.0-rc.1.20428.3 5.0.0-rc.1.20428.3 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 5.0.0-rc.1.20428.3 5.0.0-rc.1.20428.3 5.0.0-rc.1.20428.3 diff --git a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs index f6cc0ebe21be..26d51d49b8a6 100644 --- a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs +++ b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs @@ -10,7 +10,9 @@ using System.Text.RegularExpressions; using System.Threading; using System.Threading.Tasks; +using System.Web; using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.CommandLineUtils; using Microsoft.Extensions.DependencyInjection; @@ -24,20 +26,20 @@ internal static class DebugProxyLauncher private static readonly Regex NowListeningRegex = new Regex(@"^\s*Now listening on: (?.*)$", RegexOptions.None, TimeSpan.FromSeconds(10)); private static readonly Regex ApplicationStartedRegex = new Regex(@"^\s*Application started\. Press Ctrl\+C to shut down\.$", RegexOptions.None, TimeSpan.FromSeconds(10)); - public static Task EnsureLaunchedAndGetUrl(IServiceProvider serviceProvider) + public static Task EnsureLaunchedAndGetUrl(IServiceProvider serviceProvider, string devToolsHost) { lock (LaunchLock) { if (LaunchedDebugProxyUrl == null) { - LaunchedDebugProxyUrl = LaunchAndGetUrl(serviceProvider); + LaunchedDebugProxyUrl = LaunchAndGetUrl(serviceProvider, devToolsHost); } return LaunchedDebugProxyUrl; } } - private static async Task LaunchAndGetUrl(IServiceProvider serviceProvider) + private static async Task LaunchAndGetUrl(IServiceProvider serviceProvider, string devToolsHost) { var tcs = new TaskCompletionSource(); @@ -45,10 +47,11 @@ private static async Task LaunchAndGetUrl(IServiceProvider serviceProvid var executablePath = LocateDebugProxyExecutable(environment); var muxerPath = DotNetMuxer.MuxerPathOrDefault(); var ownerPid = Process.GetCurrentProcess().Id; + var processStartInfo = new ProcessStartInfo { FileName = muxerPath, - Arguments = $"exec \"{executablePath}\"", + Arguments = $"exec \"{executablePath}\" --owner-pid {ownerPid} --DevToolsUrl {devToolsHost}", UseShellExecute = false, RedirectStandardOutput = true, }; diff --git a/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj b/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj index f77658c0e097..e789734fcdf3 100644 --- a/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj +++ b/src/Components/WebAssembly/Server/src/Microsoft.AspNetCore.Components.WebAssembly.Server.csproj @@ -12,9 +12,7 @@ - - - + @@ -32,12 +30,7 @@ - + diff --git a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs index e063ba8fefe6..538086f29cdd 100644 --- a/src/Components/WebAssembly/Server/src/TargetPickerUi.cs +++ b/src/Components/WebAssembly/Server/src/TargetPickerUi.cs @@ -23,12 +23,13 @@ public class TargetPickerUi IgnoreNullValues = true }; - private readonly string BrowserHost = "http://localhost:9222"; + private string _browserHost; private string _debugProxyUrl; - public TargetPickerUi(string debugProxyUrl) + public TargetPickerUi(string debugProxyUrl, string devToolsHost) { _debugProxyUrl = debugProxyUrl; + _browserHost = devToolsHost; } public async Task Display(HttpContext context) @@ -38,7 +39,7 @@ public async Task Display(HttpContext context) var request = context.Request; var targetApplicationUrl = request.Query["url"]; - var debuggerTabsListUrl = $"{BrowserHost}/json"; + var debuggerTabsListUrl = $"{_browserHost}/json"; IEnumerable availableTabs; try @@ -137,7 +138,7 @@ private string GetDevToolsUrlWithProxy(HttpRequest request, BrowserTab tabToDebu { var underlyingV8Endpoint = new Uri(tabToDebug.WebSocketDebuggerUrl); var proxyEndpoint = new Uri(_debugProxyUrl); - var devToolsUrlAbsolute = new Uri(BrowserHost + tabToDebug.DevtoolsFrontendUrl); + var devToolsUrlAbsolute = new Uri(_browserHost + tabToDebug.DevtoolsFrontendUrl); var devToolsUrlWithProxy = $"{devToolsUrlAbsolute.Scheme}://{devToolsUrlAbsolute.Authority}{devToolsUrlAbsolute.AbsolutePath}?{underlyingV8Endpoint.Scheme}={proxyEndpoint.Authority}{underlyingV8Endpoint.PathAndQuery}"; return devToolsUrlWithProxy; } @@ -145,7 +146,7 @@ private string GetDevToolsUrlWithProxy(HttpRequest request, BrowserTab tabToDebu private string GetLaunchChromeInstructions(string targetApplicationUrl) { var profilePath = Path.Combine(Path.GetTempPath(), "blazor-chrome-debug"); - var debuggerPort = new Uri(BrowserHost).Port; + var debuggerPort = new Uri(_browserHost).Port; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { @@ -171,7 +172,7 @@ private string GetLaunchChromeInstructions(string targetApplicationUrl) private string GetLaunchEdgeInstructions(string targetApplicationUrl) { var profilePath = Path.Combine(Path.GetTempPath(), "blazor-edge-debug"); - var debuggerPort = new Uri(BrowserHost).Port; + var debuggerPort = new Uri(_browserHost).Port; if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { @@ -210,7 +211,7 @@ private static Uri GetProxyEndpoint(HttpRequest incomingRequest, string browserE private async Task> GetOpenedBrowserTabs() { using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(5) }; - var jsonResponse = await httpClient.GetStringAsync($"{BrowserHost}/json"); + var jsonResponse = await httpClient.GetStringAsync($"{_browserHost}/json"); return JsonSerializer.Deserialize(jsonResponse, JsonOptions); } diff --git a/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs b/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs index 25e80543b017..81eb09641bb8 100644 --- a/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs +++ b/src/Components/WebAssembly/Server/src/WebAssemblyNetDebugProxyAppBuilderExtensions.cs @@ -1,7 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Net; +using System.Web; using Microsoft.AspNetCore.Components.WebAssembly.Server; namespace Microsoft.AspNetCore.Builder @@ -21,7 +23,17 @@ public static void UseWebAssemblyDebugging(this IApplicationBuilder app) { app.Use(async (context, next) => { - var debugProxyBaseUrl = await DebugProxyLauncher.EnsureLaunchedAndGetUrl(context.RequestServices); + var queryParams = HttpUtility.ParseQueryString(context.Request.QueryString.Value); + var browserParam = queryParams.Get("browser"); + Uri browserUrl = null; + var devToolsHost = "http://localhost:9222"; + if (browserParam != null) + { + browserUrl = new Uri(browserParam); + devToolsHost = $"http://{browserUrl.Host}:{browserUrl.Port}"; + } + + var debugProxyBaseUrl = await DebugProxyLauncher.EnsureLaunchedAndGetUrl(context.RequestServices, devToolsHost); var requestPath = context.Request.Path.ToString(); if (requestPath == string.Empty) { @@ -31,11 +43,11 @@ public static void UseWebAssemblyDebugging(this IApplicationBuilder app) switch (requestPath) { case "/": - var targetPickerUi = new TargetPickerUi(debugProxyBaseUrl); + var targetPickerUi = new TargetPickerUi(debugProxyBaseUrl, devToolsHost); await targetPickerUi.Display(context); break; case "/ws-proxy": - context.Response.Redirect($"{debugProxyBaseUrl}{requestPath}{context.Request.QueryString}"); + context.Response.Redirect($"{debugProxyBaseUrl}{browserUrl.PathAndQuery}"); break; default: context.Response.StatusCode = (int)HttpStatusCode.NotFound; From a3ed9add5d4ebf87081ef3a5abb6a22f03c74553 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Tue, 25 Aug 2020 17:22:44 -0700 Subject: [PATCH 16/25] Update package version and polish up dbging issues --- AspNetCore.sln | 4 ---- src/Components/Components.slnf | 1 - src/Components/ComponentsNoDeps.slnf | 3 +-- .../Web.JS/dist/Release/blazor.webassembly.js | 2 +- .../Web.JS/src/Platform/Mono/MonoDebugger.ts | 10 +--------- .../WebAssembly/Server/src/DebugProxyLauncher.cs | 2 +- 6 files changed, 4 insertions(+), 18 deletions(-) diff --git a/AspNetCore.sln b/AspNetCore.sln index 968ff850f8df..d6fedce7492c 100644 --- a/AspNetCore.sln +++ b/AspNetCore.sln @@ -493,10 +493,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Authentication.Msal", "Auth EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Authentication.WebAssembly.Msal", "src\Components\WebAssembly\Authentication.Msal\src\Microsoft.Authentication.WebAssembly.Msal.csproj", "{09F72EF0-2BDE-4B73-B116-A87E38C432FE}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "DebugProxy", "DebugProxy", "{F01E5B0D-1277-481D-8879-41A87F3F9524}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.WebAssembly.DebugProxy", "src\Components\WebAssembly\DebugProxy\src\Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj", "{67F51062-6897-4019-AA88-6BDB5E30B015}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "JSInterop", "JSInterop", "{44161B20-CC30-403A-AC94-247592ED7590}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.JSInterop.WebAssembly", "src\Components\WebAssembly\JSInterop\src\Microsoft.JSInterop.WebAssembly.csproj", "{E0B1F2AA-4EBA-4DC7-92D5-2F081354C8DE}" diff --git a/src/Components/Components.slnf b/src/Components/Components.slnf index 637ec1a38458..4b37d8775682 100644 --- a/src/Components/Components.slnf +++ b/src/Components/Components.slnf @@ -104,7 +104,6 @@ "src\\Components\\Web.Extensions\\test\\Microsoft.AspNetCore.Components.Web.Extensions.Tests.csproj", "src\\Components\\WebAssembly\\Server\\test\\Microsoft.AspNetCore.Components.WebAssembly.Server.Tests.csproj", "src\\Components\\WebAssembly\\Authentication.Msal\\src\\Microsoft.Authentication.WebAssembly.Msal.csproj", - "src\\Components\\WebAssembly\\DebugProxy\\src\\Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj", "src\\Components\\WebAssembly\\JSInterop\\src\\Microsoft.JSInterop.WebAssembly.csproj", "src\\Components\\WebAssembly\\WebAssembly.Authentication\\src\\Microsoft.AspNetCore.Components.WebAssembly.Authentication.csproj", "src\\Components\\WebAssembly\\WebAssembly.Authentication\\test\\Microsoft.AspNetCore.Components.WebAssembly.Authentication.Tests.csproj", diff --git a/src/Components/ComponentsNoDeps.slnf b/src/Components/ComponentsNoDeps.slnf index 861f0ce53c7c..d94935df7bbd 100644 --- a/src/Components/ComponentsNoDeps.slnf +++ b/src/Components/ComponentsNoDeps.slnf @@ -19,7 +19,6 @@ "src\\Components\\Web.Extensions\\src\\Microsoft.AspNetCore.Components.Web.Extensions.csproj", "src\\Components\\Web.Extensions\\test\\Microsoft.AspNetCore.Components.Web.Extensions.Tests.csproj", "src\\Components\\WebAssembly\\Authentication.Msal\\src\\Microsoft.Authentication.WebAssembly.Msal.csproj", - "src\\Components\\WebAssembly\\DebugProxy\\src\\Microsoft.AspNetCore.Components.WebAssembly.DebugProxy.csproj", "src\\Components\\WebAssembly\\DevServer\\src\\Microsoft.AspNetCore.Components.WebAssembly.DevServer.csproj", "src\\Components\\WebAssembly\\JSInterop\\src\\Microsoft.JSInterop.WebAssembly.csproj", "src\\Components\\WebAssembly\\Sdk\\integrationtests\\Microsoft.NET.Sdk.BlazorWebAssembly.IntegrationTests.csproj", @@ -50,4 +49,4 @@ "src\\Components\\test\\testassets\\TestServer\\Components.TestServer.csproj" ] } -} \ No newline at end of file +} diff --git a/src/Components/Web.JS/dist/Release/blazor.webassembly.js b/src/Components/Web.JS/dist/Release/blazor.webassembly.js index df469f8e58c7..fb13841846a1 100644 --- a/src/Components/Web.JS/dist/Release/blazor.webassembly.js +++ b/src/Components/Web.JS/dist/Release/blazor.webassembly.js @@ -1 +1 @@ -!function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=44)}([,,,function(e,t,n){"use strict";var r;n.r(t),n.d(t,"DotNet",(function(){return r})),function(e){var t;window.DotNet=e;var n=[],r=function(){function e(e){this._jsObject=e,this._cachedFunctions=new Map}return e.prototype.findFunction=function(e){var t=this._cachedFunctions.get(e);if(t)return t;var n,r=this._jsObject;if(e.split(".").forEach((function(t){if(!(t in r))throw new Error("Could not find '"+e+"' ('"+t+"' was undefined).");n=r,r=r[t]})),r instanceof Function)return r=r.bind(n),this._cachedFunctions.set(e,r),r;throw new Error("The value '"+e+"' is not a function.")},e.prototype.getWrappedObject=function(){return this._jsObject},e}(),o={},i=((t={})[0]=new r(window),t);i[0]._cachedFunctions.set("import",(function(e){return"string"==typeof e&&e.startsWith("./")&&(e=document.baseURI+e.substr(2)),import(e)}));var a,s=1,u=1,c=null;function l(e){n.push(e)}function f(e){var t;if(e&&"object"==typeof e){i[u]=new r(e);var n=((t={}).__jsObjectId=u,t);return u++,n}throw new Error("Cannot create a JSObjectReference from the value '"+e+"'.")}function d(e){return e?JSON.parse(e,(function(e,t){return n.reduce((function(t,n){return n(e,t)}),t)})):null}function p(e,t,n,r){var o=m();if(o.invokeDotNetFromJS){var i=JSON.stringify(r,_),a=o.invokeDotNetFromJS(e,t,n,i);return a?d(a):null}throw new Error("The current dispatcher does not support synchronous calls from JS to .NET. Use invokeMethodAsync instead.")}function h(e,t,n,r){if(e&&n)throw new Error("For instance method calls, assemblyName should be null. Received '"+e+"'.");var i=s++,a=new Promise((function(e,t){o[i]={resolve:e,reject:t}}));try{var u=JSON.stringify(r,_);m().beginInvokeDotNetFromJS(i,e,t,n,u)}catch(e){v(i,!1,e)}return a}function m(){if(null!==c)return c;throw new Error("No .NET call dispatcher has been set.")}function v(e,t,n){if(!o.hasOwnProperty(e))throw new Error("There is no pending async call with ID "+e+".");var r=o[e];delete o[e],t?r.resolve(n):r.reject(n)}function y(e){return e instanceof Error?e.message+"\n"+e.stack:e?e.toString():"null"}function b(e,t){var n=i[t];if(n)return n.findFunction(e);throw new Error("JS object instance with ID "+t+" does not exist (has it been disposed?).")}function g(e){delete i[e]}e.attachDispatcher=function(e){c=e},e.attachReviver=l,e.invokeMethod=function(e,t){for(var n=[],r=2;r0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return r in e||(e[r]=[]),e}function s(e,t,n){var i=e;if(e instanceof Comment&&(c(i)&&c(i).length>0))throw new Error("Not implemented: inserting non-empty logical container");if(u(i))throw new Error("Not implemented: moving existing logical children");var a=c(t);if(n0;)e(r,0)}var i=r;i.parentNode.removeChild(i)},t.getLogicalParent=u,t.getLogicalSiblingEnd=function(e){return e[i]||null},t.getLogicalChild=function(e,t){return c(e)[t]},t.isSvgElement=function(e){return"http://www.w3.org/2000/svg"===l(e).namespaceURI},t.getLogicalChildrenArray=c,t.permuteLogicalChildren=function(e,t){var n=c(e);t.forEach((function(e){e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=function e(t){if(t instanceof Element)return t;var n=f(t);if(n)return n.previousSibling;var r=u(t);return r instanceof Element?r.lastChild:e(r)}(e.moveRangeStart)})),t.forEach((function(t){var r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):d(r,e)})),t.forEach((function(e){for(var t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd,i=r;i;){var a=i.nextSibling;if(n.insertBefore(i,t),i===o)break;i=a}n.removeChild(t)})),t.forEach((function(e){n[e.toSiblingIndex]=e.moveRangeStart}))},t.getClosestDomElement=l},,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(23),n(17);var r=n(24),o=n(7),i={},a=!1;function s(e,t,n){var o=i[e];o||(o=i[e]=new r.BrowserRenderer(e)),o.attachRootComponentToLogicalElement(n,t)}t.attachRootComponentToLogicalElement=s,t.attachRootComponentToElement=function(e,t,n){var r=document.querySelector(e);if(!r)throw new Error("Could not find any element matching selector '"+e+"'.");s(n||0,o.toLogicalElement(r,!0),t)},t.getRendererer=function(e){return i[e]},t.renderBatch=function(e,t){var n=i[e];if(!n)throw new Error("There is no browser renderer with ID "+e+".");for(var r=t.arrayRangeReader,o=t.updatedComponents(),s=r.values(o),u=r.count(o),c=t.referenceFrames(),l=r.values(c),f=t.diffReader,d=0;d0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,i,a)}}))}),{root:o(t),rootMargin:i+"px"});a.observe(t),a.observe(n);var s=c(t),u=c(n);function c(e){var t=new MutationObserver((function(){a.unobserve(e),a.observe(e)}));return t.observe(e,{attributes:!0}),t}r[e._id]={intersectionObserver:a,mutationObserverBefore:s,mutationObserverAfter:u}},dispose:function(e){var t=r[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete r[e._id])}};var r={};function o(e){return e?"visible"!==getComputedStyle(e).overflowY?e:o(e.parentElement):null}},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1].*)$/;function i(e,t){var n=e.currentElement;if(n&&n.nodeType===Node.COMMENT_NODE&&n.textContent){var r=new RegExp(o).exec(n.textContent),i=r&&r.groups&&r.groups.descriptor;if(!i)return;try{var s=function(e){var t=JSON.parse(e),n=t.type;if("server"!==n&&"webassembly"!==n)throw new Error("Invalid component type '"+n+"'.");return t}(i);switch(t){case"webassembly":return function(e,t,n){var r=e.type,o=e.assembly,i=e.typeName,s=e.parameterDefinitions,u=e.parameterValues,c=e.prerenderId;if("webassembly"!==r)return;if(!o)throw new Error("assembly must be defined when using a descriptor.");if(!i)throw new Error("typeName must be defined when using a descriptor.");if(c){var l=a(c,n);if(!l)throw new Error("Could not find an end component comment for '"+t+"'");return{type:r,assembly:o,typeName:i,parameterDefinitions:s&&atob(s),parameterValues:u&&atob(u),start:t,prerenderId:c,end:l}}return{type:r,assembly:o,typeName:i,parameterDefinitions:s&&atob(s),parameterValues:u&&atob(u),start:t}}(s,n,e);case"server":return function(e,t,n){var r=e.type,o=e.descriptor,i=e.sequence,s=e.prerenderId;if("server"!==r)return;if(!o)throw new Error("descriptor must be defined when using a descriptor.");if(void 0===i)throw new Error("sequence must be defined when using a descriptor.");if(!Number.isInteger(i))throw new Error("Error parsing the sequence '"+i+"' for component '"+JSON.stringify(e)+"'");if(s){var u=a(s,n);if(!u)throw new Error("Could not find an end component comment for '"+t+"'");return{type:r,sequence:i,descriptor:o,start:t,prerenderId:s,end:u}}return{type:r,sequence:i,descriptor:o,start:t}}(s,n,e)}}catch(e){throw new Error("Found malformed component comment at "+n.textContent)}}}function a(e,t){for(;t.next()&&t.currentElement;){var n=t.currentElement;if(n.nodeType===Node.COMMENT_NODE&&n.textContent){var r=new RegExp(o).exec(n.textContent),i=r&&r[1];if(i)return s(i,e),n}}}function s(e,t){var n=JSON.parse(e);if(1!==Object.keys(n).length)throw new Error("Invalid end of component comment: '"+e+"'");var r=n.prerenderId;if(!r)throw new Error("End of component comment must have a value for the prerendered property: '"+e+"'");if(r!==t)throw new Error("End of component comment prerendered property must match the start comment prerender id: '"+t+"', '"+r+"'")}var u=function(){function e(e){this.childNodes=e,this.currentIndex=-1,this.length=e.length}return e.prototype.next=function(){return this.currentIndex++,this.currentIndex0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a};Object.defineProperty(t,"__esModule",{value:!0});var a=n(3);n(22);var s=n(17),u=n(45),c=n(12),l=n(47),f=n(33),d=n(18),p=n(48),h=n(49),m=n(50),v=n(51),y=n(34),b=!1;function g(e){return r(this,void 0,void 0,(function(){var t,n,f,g,E,_,I,C,N,A,S,k=this;return o(this,(function(O){switch(O.label){case 0:if(b)throw new Error("Blazor has already started.");return b=!0,d.setEventDispatcher((function(e,t){c.getRendererer(e.browserRendererId).eventDelegator.getHandler(e.eventHandlerId)&&u.monoPlatform.invokeWhenHeapUnlocked((function(){return a.DotNet.invokeMethodAsync("Microsoft.AspNetCore.Components.WebAssembly","DispatchEvent",e,JSON.stringify(t))}))})),window.Blazor._internal.invokeJSFromDotNet=w,t=s.setPlatform(u.monoPlatform),window.Blazor.platform=t,window.Blazor._internal.renderBatch=function(e,t){var n=u.monoPlatform.beginHeapLock();try{c.renderBatch(e,new l.SharedMemoryRenderBatch(t))}finally{n.release()}},n=window.Blazor._internal.navigationManager.getBaseURI,f=window.Blazor._internal.navigationManager.getLocationHref,window.Blazor._internal.navigationManager.getUnmarshalledBaseURI=function(){return BINDING.js_string_to_mono_string(n())},window.Blazor._internal.navigationManager.getUnmarshalledLocationHref=function(){return BINDING.js_string_to_mono_string(f())},window.Blazor._internal.navigationManager.listenForNavigationEvents((function(e,t){return r(k,void 0,void 0,(function(){return o(this,(function(n){switch(n.label){case 0:return[4,a.DotNet.invokeMethodAsync("Microsoft.AspNetCore.Components.WebAssembly","NotifyLocationChanged",e,t)];case 1:return n.sent(),[2]}}))}))})),g=null==e?void 0:e.environment,E=m.BootConfigResult.initAsync(g),_=y.discoverComponents(document,"webassembly"),I=new v.WebAssemblyComponentAttacher(_),window.Blazor._internal.registeredComponents={getRegisteredComponentsCount:function(){return I.getCount()},getId:function(e){return I.getId(e)},getAssembly:function(e){return BINDING.js_string_to_mono_string(I.getAssembly(e))},getTypeName:function(e){return BINDING.js_string_to_mono_string(I.getTypeName(e))},getParameterDefinitions:function(e){return BINDING.js_string_to_mono_string(I.getParameterDefinitions(e)||"")},getParameterValues:function(e){return BINDING.js_string_to_mono_string(I.getParameterValues(e)||"")}},window.Blazor._internal.attachRootComponentToElement=function(e,t,n){var r=I.resolveRegisteredElement(e);r?c.attachRootComponentToLogicalElement(n,r,t):c.attachRootComponentToElement(e,t,n)},[4,E];case 1:return C=O.sent(),[4,Promise.all([p.WebAssemblyResourceLoader.initAsync(C.bootConfig,e||{}),h.WebAssemblyConfigLoader.initAsync(C)])];case 2:N=i.apply(void 0,[O.sent(),1]),A=N[0],O.label=3;case 3:return O.trys.push([3,5,,6]),[4,t.start(A)];case 4:return O.sent(),[3,6];case 5:throw S=O.sent(),new Error("Failed to start platform. Reason: "+S);case 6:return t.callEntryPoint(A.bootConfig.entryAssembly),[2]}}))}))}function w(e,t,n,r){var o=u.monoPlatform.readStringField(e,0),i=u.monoPlatform.readInt32Field(e,4),s=u.monoPlatform.readStringField(e,8),c=u.monoPlatform.readUint64Field(e,20);if(null!==s){var l=u.monoPlatform.readUint64Field(e,12);if(0!==l)return a.DotNet.jsCallDispatcher.beginInvokeJSFromDotNet(l,o,s,i,c),0;var f=a.DotNet.jsCallDispatcher.invokeJSFromDotNet(o,s,i,c);return null===f?0:BINDING.js_string_to_mono_string(f)}return a.DotNet.jsCallDispatcher.findJSFunction(o,c).call(null,t,n,r)}window.Blazor.start=g,f.shouldAutoStart()&&g().catch((function(e){"undefined"!=typeof Module&&Module.printErr?Module.printErr(e):console.error(e)}))},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]>2]}t.monoPlatform={start:function(e){return new Promise((function(t,n){var c,l;s.attachDebuggerHotkey(e),window.Browser={init:function(){}},c=function(){window.Module=function(e,t,n){var c=this,l=e.bootConfig.resources,f=window.Module||{},d=["DEBUGGING ENABLED"];f.print=function(e){return d.indexOf(e)<0&&console.log(e)},f.printErr=function(e){console.error(e),u.showErrorNotification()},f.preRun=f.preRun||[],f.postRun=f.postRun||[],f.preloadPlugins=[];var h,b,g=e.loadResources(l.assembly,(function(e){return"_framework/"+e}),"assembly"),w=e.loadResources(l.pdb||{},(function(e){return"_framework/"+e}),"pdb"),E=e.loadResource("dotnet.wasm","_framework/dotnet.wasm",e.bootConfig.resources.runtime["dotnet.wasm"],"dotnetwasm");return e.bootConfig.resources.runtime.hasOwnProperty("dotnet.timezones.blat")&&(h=e.loadResource("dotnet.timezones.blat","_framework/dotnet.timezones.blat",e.bootConfig.resources.runtime["dotnet.timezones.blat"],"globalization")),e.bootConfig.resources.runtime.hasOwnProperty("icudt.dat")&&(b=e.loadResource("icudt.dat","_framework/icudt.dat",e.bootConfig.resources.runtime["icudt.dat"],"globalization")),f.instantiateWasm=function(e,t){return r(c,void 0,void 0,(function(){var n,r;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,E];case 1:return[4,v(o.sent(),e)];case 2:return n=o.sent(),[3,4];case 3:throw r=o.sent(),f.printErr(r),r;case 4:return t(n),[2]}}))})),[]},f.preRun.push((function(){i=cwrap("mono_wasm_add_assembly",null,["string","number","number"]),MONO.loaded_files=[],h&&function(e){r(this,void 0,void 0,(function(){var t,n;return o(this,(function(r){switch(r.label){case 0:return t="blazor:timezonedata",addRunDependency(t),[4,e.response];case 1:return[4,r.sent().arrayBuffer()];case 2:return n=r.sent(),Module.FS_createPath("/","usr",!0,!0),Module.FS_createPath("/usr/","share",!0,!0),Module.FS_createPath("/usr/share/","zoneinfo",!0,!0),MONO.mono_wasm_load_data_archive(new Uint8Array(n),"/usr/share/zoneinfo/"),removeRunDependency(t),[2]}}))}))}(h),b?function(e){r(this,void 0,void 0,(function(){var t,n,r,i,a;return o(this,(function(o){switch(o.label){case 0:return t="blazor:icudata",addRunDependency(t),[4,e.response];case 1:return n=o.sent(),i=Uint8Array.bind,[4,n.arrayBuffer()];case 2:if(r=new(i.apply(Uint8Array,[void 0,o.sent()])),a=MONO.mono_wasm_load_bytes_into_heap(r),!MONO.mono_wasm_load_icu_data(a))throw new Error("Error loading ICU asset.");return removeRunDependency(t),[2]}}))}))}(b):MONO.mono_wasm_setenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT","1"),g.forEach((function(e){return _(e,function(e,t){var n=e.lastIndexOf(".");if(n<0)throw new Error("No extension to replace in '"+e+"'");return e.substr(0,n)+t}(e.name,".dll"))})),w.forEach((function(e){return _(e,e.name)})),window.Blazor._internal.dotNetCriticalError=function(e){f.printErr(BINDING.conv_string(e)||"(null)")},window.Blazor._internal.getSatelliteAssemblies=function(t){var n=BINDING.mono_array_to_js_array(t),i=e.bootConfig.resources.satelliteResources;if(i){var a=Promise.all(n.filter((function(e){return i.hasOwnProperty(e)})).map((function(t){return e.loadResources(i[t],(function(e){return"_framework/"+e}),"assembly")})).reduce((function(e,t){return e.concat(t)}),new Array).map((function(e){return r(c,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,e.response];case 1:return[2,t.sent().arrayBuffer()]}}))}))})));return BINDING.js_to_mono_obj(a.then((function(e){return e.length&&(window.Blazor._internal.readSatelliteAssemblies=function(){for(var t=BINDING.mono_obj_array_new(e.length),n=0;n>1];var n},readInt32Field:function(e,t){return d(e+(t||0))},readUint64Field:function(e,t){return function(e){var t=e>>2,n=Module.HEAPU32[t+1];if(n>l)throw new Error("Cannot read uint64 with high order part "+n+", because the result would exceed Number.MAX_SAFE_INTEGER.");return n*c+Module.HEAPU32[t]}(e+(t||0))},readFloatField:function(e,t){return n=e+(t||0),Module.HEAPF32[n>>2];var n},readObjectField:function(e,t){return d(e+(t||0))},readStringField:function(e,t,n){var r,o=d(e+(t||0));if(0===o)return null;if(n){var i=BINDING.unbox_mono_obj(o);return"boolean"==typeof i?i?"":null:i}return f?void 0===(r=f.stringCache.get(o))&&(r=BINDING.conv_string(o),f.stringCache.set(o,r)):r=BINDING.conv_string(o),r},readStructField:function(e,t){return e+(t||0)},beginHeapLock:function(){return y(),f=new b},invokeWhenHeapUnlocked:function(e){f?f.enqueuePostReleaseAction(e):e()}};var p=document.createElement("a");function h(e){return e+12}function m(e,t,n){var r="["+e+"] "+t+":"+n;return BINDING.bind_static_method(r)}function v(e,t){return r(this,void 0,void 0,(function(){var n,r;return o(this,(function(o){switch(o.label){case 0:if("function"!=typeof WebAssembly.instantiateStreaming)return[3,4];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,WebAssembly.instantiateStreaming(e.response,t)];case 2:return[2,o.sent().instance];case 3:return n=o.sent(),console.info("Streaming compilation failed. Falling back to ArrayBuffer instantiation. ",n),[3,4];case 4:return[4,e.response.then((function(e){return e.arrayBuffer()}))];case 5:return r=o.sent(),[4,WebAssembly.instantiate(r,t)];case 6:return[2,o.sent().instance]}}))}))}function y(){if(f)throw new Error("Assertion failed - heap is currently locked")}var b=function(){function e(){this.stringCache=new Map}return e.prototype.enqueuePostReleaseAction=function(e){this.postReleaseActions||(this.postReleaseActions=[]),this.postReleaseActions.push(e)},e.prototype.release=function(){var e;if(f!==this)throw new Error("Trying to release a lock which isn't current");for(f=null;null===(e=this.postReleaseActions)||void 0===e?void 0:e.length;){this.postReleaseActions.shift()(),y()}},e}()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=window.chrome&&navigator.userAgent.indexOf("Edge")<0,o=!0;window.addEventListener("load",(function(){var e=new URLSearchParams(window.location.search);o="true"===e.get("_blazor_debug")}));var i=!1;function a(){return o&&i&&r}t.hasDebuggingEnabled=a,t.attachDebuggerHotkey=function(e){i=!!e.bootConfig.resources.pdb;var t=navigator.platform.match(/^Mac/i)?"Cmd":"Alt";a()&&console.info("Debugging hotkey: Shift+"+t+"+D (when application has focus)"),document.addEventListener("keydown",(function(e){var t;e.shiftKey&&(e.metaKey||e.altKey)&&"KeyD"===e.code&&(i?r?o?((t=document.createElement("a")).href="_framework/debug?url="+encodeURIComponent(location.href),t.target="_blank",t.rel="noopener noreferrer",t.click()):console.error("_blazor_debug query parameter must be set to enable debugging. To enable debugging, go to "+location.href+"?_blazor_debug=true."):console.error("Currently, only Microsoft Edge (80+), or Google Chrome, are supported for debugging."):console.error("Cannot start debugging, because the application was not compiled with debugging enabled."))}))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(17),o=function(){function e(e){this.batchAddress=e,this.arrayRangeReader=i,this.arrayBuilderSegmentReader=a,this.diffReader=s,this.editReader=u,this.frameReader=c}return e.prototype.updatedComponents=function(){return r.platform.readStructField(this.batchAddress,0)},e.prototype.referenceFrames=function(){return r.platform.readStructField(this.batchAddress,i.structLength)},e.prototype.disposedComponentIds=function(){return r.platform.readStructField(this.batchAddress,2*i.structLength)},e.prototype.disposedEventHandlerIds=function(){return r.platform.readStructField(this.batchAddress,3*i.structLength)},e.prototype.updatedComponentsEntry=function(e,t){return l(e,t,s.structLength)},e.prototype.referenceFramesEntry=function(e,t){return l(e,t,c.structLength)},e.prototype.disposedComponentIdsEntry=function(e,t){var n=l(e,t,4);return r.platform.readInt32Field(n)},e.prototype.disposedEventHandlerIdsEntry=function(e,t){var n=l(e,t,8);return r.platform.readUint64Field(n)},e}();t.SharedMemoryRenderBatch=o;var i={structLength:8,values:function(e){return r.platform.readObjectField(e,0)},count:function(e){return r.platform.readInt32Field(e,4)}},a={structLength:12,values:function(e){var t=r.platform.readObjectField(e,0),n=r.platform.getObjectFieldsBaseAddress(t);return r.platform.readObjectField(n,0)},offset:function(e){return r.platform.readInt32Field(e,4)},count:function(e){return r.platform.readInt32Field(e,8)}},s={structLength:4+a.structLength,componentId:function(e){return r.platform.readInt32Field(e,0)},edits:function(e){return r.platform.readStructField(e,4)},editsEntry:function(e,t){return l(e,t,u.structLength)}},u={structLength:20,editType:function(e){return r.platform.readInt32Field(e,0)},siblingIndex:function(e){return r.platform.readInt32Field(e,4)},newTreeIndex:function(e){return r.platform.readInt32Field(e,8)},moveToSiblingIndex:function(e){return r.platform.readInt32Field(e,8)},removedAttributeName:function(e){return r.platform.readStringField(e,16)}},c={structLength:36,frameType:function(e){return r.platform.readInt16Field(e,4)},subtreeLength:function(e){return r.platform.readInt32Field(e,8)},elementReferenceCaptureId:function(e){return r.platform.readStringField(e,16)},componentId:function(e){return r.platform.readInt32Field(e,12)},elementName:function(e){return r.platform.readStringField(e,16)},textContent:function(e){return r.platform.readStringField(e,16)},markupContent:function(e){return r.platform.readStringField(e,16)},attributeName:function(e){return r.platform.readStringField(e,16)},attributeValue:function(e){return r.platform.readStringField(e,24,!0)},attributeEventHandlerId:function(e){return r.platform.readUint64Field(e,8)}};function l(e,t,n){return r.platform.getArrayEntryPtr(e,t,n)}},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&!t)throw new Error("New logical elements must start empty, or allowExistingContents must be true");return r in e||(e[r]=[]),e}function s(e,t,n){var i=e;if(e instanceof Comment&&(c(i)&&c(i).length>0))throw new Error("Not implemented: inserting non-empty logical container");if(u(i))throw new Error("Not implemented: moving existing logical children");var a=c(t);if(n0;)e(r,0)}var i=r;i.parentNode.removeChild(i)},t.getLogicalParent=u,t.getLogicalSiblingEnd=function(e){return e[i]||null},t.getLogicalChild=function(e,t){return c(e)[t]},t.isSvgElement=function(e){return"http://www.w3.org/2000/svg"===l(e).namespaceURI},t.getLogicalChildrenArray=c,t.permuteLogicalChildren=function(e,t){var n=c(e);t.forEach((function(e){e.moveRangeStart=n[e.fromSiblingIndex],e.moveRangeEnd=function e(t){if(t instanceof Element)return t;var n=f(t);if(n)return n.previousSibling;var r=u(t);return r instanceof Element?r.lastChild:e(r)}(e.moveRangeStart)})),t.forEach((function(t){var r=t.moveToBeforeMarker=document.createComment("marker"),o=n[t.toSiblingIndex+1];o?o.parentNode.insertBefore(r,o):d(r,e)})),t.forEach((function(e){for(var t=e.moveToBeforeMarker,n=t.parentNode,r=e.moveRangeStart,o=e.moveRangeEnd,i=r;i;){var a=i.nextSibling;if(n.insertBefore(i,t),i===o)break;i=a}n.removeChild(t)})),t.forEach((function(e){n[e.toSiblingIndex]=e.moveRangeStart}))},t.getClosestDomElement=l},,,,,function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),n(23),n(17);var r=n(24),o=n(7),i={},a=!1;function s(e,t,n){var o=i[e];o||(o=i[e]=new r.BrowserRenderer(e)),o.attachRootComponentToLogicalElement(n,t)}t.attachRootComponentToLogicalElement=s,t.attachRootComponentToElement=function(e,t,n){var r=document.querySelector(e);if(!r)throw new Error("Could not find any element matching selector '"+e+"'.");s(n||0,o.toLogicalElement(r,!0),t)},t.getRendererer=function(e){return i[e]},t.renderBatch=function(e,t){var n=i[e];if(!n)throw new Error("There is no browser renderer with ID "+e+".");for(var r=t.arrayRangeReader,o=t.updatedComponents(),s=r.values(o),u=r.count(o),c=t.referenceFrames(),l=r.values(c),f=t.diffReader,d=0;d0&&e.invokeMethodAsync("OnSpacerAfterVisible",r.boundingClientRect.bottom-r.intersectionRect.bottom,i,a)}}))}),{root:o(t),rootMargin:i+"px"});a.observe(t),a.observe(n);var s=c(t),u=c(n);function c(e){var t=new MutationObserver((function(){a.unobserve(e),a.observe(e)}));return t.observe(e,{attributes:!0}),t}r[e._id]={intersectionObserver:a,mutationObserverBefore:s,mutationObserverAfter:u}},dispose:function(e){var t=r[e._id];t&&(t.intersectionObserver.disconnect(),t.mutationObserverBefore.disconnect(),t.mutationObserverAfter.disconnect(),e.dispose(),delete r[e._id])}};var r={};function o(e){return e?"visible"!==getComputedStyle(e).overflowY?e:o(e.parentElement):null}},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1].*)$/;function i(e,t){var n=e.currentElement;if(n&&n.nodeType===Node.COMMENT_NODE&&n.textContent){var r=new RegExp(o).exec(n.textContent),i=r&&r.groups&&r.groups.descriptor;if(!i)return;try{var s=function(e){var t=JSON.parse(e),n=t.type;if("server"!==n&&"webassembly"!==n)throw new Error("Invalid component type '"+n+"'.");return t}(i);switch(t){case"webassembly":return function(e,t,n){var r=e.type,o=e.assembly,i=e.typeName,s=e.parameterDefinitions,u=e.parameterValues,c=e.prerenderId;if("webassembly"!==r)return;if(!o)throw new Error("assembly must be defined when using a descriptor.");if(!i)throw new Error("typeName must be defined when using a descriptor.");if(c){var l=a(c,n);if(!l)throw new Error("Could not find an end component comment for '"+t+"'");return{type:r,assembly:o,typeName:i,parameterDefinitions:s&&atob(s),parameterValues:u&&atob(u),start:t,prerenderId:c,end:l}}return{type:r,assembly:o,typeName:i,parameterDefinitions:s&&atob(s),parameterValues:u&&atob(u),start:t}}(s,n,e);case"server":return function(e,t,n){var r=e.type,o=e.descriptor,i=e.sequence,s=e.prerenderId;if("server"!==r)return;if(!o)throw new Error("descriptor must be defined when using a descriptor.");if(void 0===i)throw new Error("sequence must be defined when using a descriptor.");if(!Number.isInteger(i))throw new Error("Error parsing the sequence '"+i+"' for component '"+JSON.stringify(e)+"'");if(s){var u=a(s,n);if(!u)throw new Error("Could not find an end component comment for '"+t+"'");return{type:r,sequence:i,descriptor:o,start:t,prerenderId:s,end:u}}return{type:r,sequence:i,descriptor:o,start:t}}(s,n,e)}}catch(e){throw new Error("Found malformed component comment at "+n.textContent)}}}function a(e,t){for(;t.next()&&t.currentElement;){var n=t.currentElement;if(n.nodeType===Node.COMMENT_NODE&&n.textContent){var r=new RegExp(o).exec(n.textContent),i=r&&r[1];if(i)return s(i,e),n}}}function s(e,t){var n=JSON.parse(e);if(1!==Object.keys(n).length)throw new Error("Invalid end of component comment: '"+e+"'");var r=n.prerenderId;if(!r)throw new Error("End of component comment must have a value for the prerendered property: '"+e+"'");if(r!==t)throw new Error("End of component comment prerendered property must match the start comment prerender id: '"+t+"', '"+r+"'")}var u=function(){function e(e){this.childNodes=e,this.currentIndex=-1,this.length=e.length}return e.prototype.next=function(){return this.currentIndex++,this.currentIndex0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0)&&!(r=i.next()).done;)a.push(r.value)}catch(e){o={error:e}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a};Object.defineProperty(t,"__esModule",{value:!0});var a=n(3);n(22);var s=n(17),u=n(45),c=n(12),l=n(47),f=n(33),d=n(18),p=n(48),h=n(49),m=n(50),v=n(51),y=n(34),b=!1;function g(e){return r(this,void 0,void 0,(function(){var t,n,f,g,E,_,I,C,N,A,S,k=this;return o(this,(function(O){switch(O.label){case 0:if(b)throw new Error("Blazor has already started.");return b=!0,d.setEventDispatcher((function(e,t){c.getRendererer(e.browserRendererId).eventDelegator.getHandler(e.eventHandlerId)&&u.monoPlatform.invokeWhenHeapUnlocked((function(){return a.DotNet.invokeMethodAsync("Microsoft.AspNetCore.Components.WebAssembly","DispatchEvent",e,JSON.stringify(t))}))})),window.Blazor._internal.invokeJSFromDotNet=w,t=s.setPlatform(u.monoPlatform),window.Blazor.platform=t,window.Blazor._internal.renderBatch=function(e,t){var n=u.monoPlatform.beginHeapLock();try{c.renderBatch(e,new l.SharedMemoryRenderBatch(t))}finally{n.release()}},n=window.Blazor._internal.navigationManager.getBaseURI,f=window.Blazor._internal.navigationManager.getLocationHref,window.Blazor._internal.navigationManager.getUnmarshalledBaseURI=function(){return BINDING.js_string_to_mono_string(n())},window.Blazor._internal.navigationManager.getUnmarshalledLocationHref=function(){return BINDING.js_string_to_mono_string(f())},window.Blazor._internal.navigationManager.listenForNavigationEvents((function(e,t){return r(k,void 0,void 0,(function(){return o(this,(function(n){switch(n.label){case 0:return[4,a.DotNet.invokeMethodAsync("Microsoft.AspNetCore.Components.WebAssembly","NotifyLocationChanged",e,t)];case 1:return n.sent(),[2]}}))}))})),g=null==e?void 0:e.environment,E=m.BootConfigResult.initAsync(g),_=y.discoverComponents(document,"webassembly"),I=new v.WebAssemblyComponentAttacher(_),window.Blazor._internal.registeredComponents={getRegisteredComponentsCount:function(){return I.getCount()},getId:function(e){return I.getId(e)},getAssembly:function(e){return BINDING.js_string_to_mono_string(I.getAssembly(e))},getTypeName:function(e){return BINDING.js_string_to_mono_string(I.getTypeName(e))},getParameterDefinitions:function(e){return BINDING.js_string_to_mono_string(I.getParameterDefinitions(e)||"")},getParameterValues:function(e){return BINDING.js_string_to_mono_string(I.getParameterValues(e)||"")}},window.Blazor._internal.attachRootComponentToElement=function(e,t,n){var r=I.resolveRegisteredElement(e);r?c.attachRootComponentToLogicalElement(n,r,t):c.attachRootComponentToElement(e,t,n)},[4,E];case 1:return C=O.sent(),[4,Promise.all([p.WebAssemblyResourceLoader.initAsync(C.bootConfig,e||{}),h.WebAssemblyConfigLoader.initAsync(C)])];case 2:N=i.apply(void 0,[O.sent(),1]),A=N[0],O.label=3;case 3:return O.trys.push([3,5,,6]),[4,t.start(A)];case 4:return O.sent(),[3,6];case 5:throw S=O.sent(),new Error("Failed to start platform. Reason: "+S);case 6:return t.callEntryPoint(A.bootConfig.entryAssembly),[2]}}))}))}function w(e,t,n,r){var o=u.monoPlatform.readStringField(e,0),i=u.monoPlatform.readInt32Field(e,4),s=u.monoPlatform.readStringField(e,8),c=u.monoPlatform.readUint64Field(e,20);if(null!==s){var l=u.monoPlatform.readUint64Field(e,12);if(0!==l)return a.DotNet.jsCallDispatcher.beginInvokeJSFromDotNet(l,o,s,i,c),0;var f=a.DotNet.jsCallDispatcher.invokeJSFromDotNet(o,s,i,c);return null===f?0:BINDING.js_string_to_mono_string(f)}return a.DotNet.jsCallDispatcher.findJSFunction(o,c).call(null,t,n,r)}window.Blazor.start=g,f.shouldAutoStart()&&g().catch((function(e){"undefined"!=typeof Module&&Module.printErr?Module.printErr(e):console.error(e)}))},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]>2]}t.monoPlatform={start:function(e){return new Promise((function(t,n){var c,l;s.attachDebuggerHotkey(e),window.Browser={init:function(){}},c=function(){window.Module=function(e,t,n){var c=this,l=e.bootConfig.resources,f=window.Module||{},d=["DEBUGGING ENABLED"];f.print=function(e){return d.indexOf(e)<0&&console.log(e)},f.printErr=function(e){console.error(e),u.showErrorNotification()},f.preRun=f.preRun||[],f.postRun=f.postRun||[],f.preloadPlugins=[];var h,b,g=e.loadResources(l.assembly,(function(e){return"_framework/"+e}),"assembly"),w=e.loadResources(l.pdb||{},(function(e){return"_framework/"+e}),"pdb"),E=e.loadResource("dotnet.wasm","_framework/dotnet.wasm",e.bootConfig.resources.runtime["dotnet.wasm"],"dotnetwasm");return e.bootConfig.resources.runtime.hasOwnProperty("dotnet.timezones.blat")&&(h=e.loadResource("dotnet.timezones.blat","_framework/dotnet.timezones.blat",e.bootConfig.resources.runtime["dotnet.timezones.blat"],"globalization")),e.bootConfig.resources.runtime.hasOwnProperty("icudt.dat")&&(b=e.loadResource("icudt.dat","_framework/icudt.dat",e.bootConfig.resources.runtime["icudt.dat"],"globalization")),f.instantiateWasm=function(e,t){return r(c,void 0,void 0,(function(){var n,r;return o(this,(function(o){switch(o.label){case 0:return o.trys.push([0,3,,4]),[4,E];case 1:return[4,v(o.sent(),e)];case 2:return n=o.sent(),[3,4];case 3:throw r=o.sent(),f.printErr(r),r;case 4:return t(n),[2]}}))})),[]},f.preRun.push((function(){i=cwrap("mono_wasm_add_assembly",null,["string","number","number"]),MONO.loaded_files=[],h&&function(e){r(this,void 0,void 0,(function(){var t,n;return o(this,(function(r){switch(r.label){case 0:return t="blazor:timezonedata",addRunDependency(t),[4,e.response];case 1:return[4,r.sent().arrayBuffer()];case 2:return n=r.sent(),Module.FS_createPath("/","usr",!0,!0),Module.FS_createPath("/usr/","share",!0,!0),Module.FS_createPath("/usr/share/","zoneinfo",!0,!0),MONO.mono_wasm_load_data_archive(new Uint8Array(n),"/usr/share/zoneinfo/"),removeRunDependency(t),[2]}}))}))}(h),b?function(e){r(this,void 0,void 0,(function(){var t,n,r,i,a;return o(this,(function(o){switch(o.label){case 0:return t="blazor:icudata",addRunDependency(t),[4,e.response];case 1:return n=o.sent(),i=Uint8Array.bind,[4,n.arrayBuffer()];case 2:if(r=new(i.apply(Uint8Array,[void 0,o.sent()])),a=MONO.mono_wasm_load_bytes_into_heap(r),!MONO.mono_wasm_load_icu_data(a))throw new Error("Error loading ICU asset.");return removeRunDependency(t),[2]}}))}))}(b):MONO.mono_wasm_setenv("DOTNET_SYSTEM_GLOBALIZATION_INVARIANT","1"),g.forEach((function(e){return _(e,function(e,t){var n=e.lastIndexOf(".");if(n<0)throw new Error("No extension to replace in '"+e+"'");return e.substr(0,n)+t}(e.name,".dll"))})),w.forEach((function(e){return _(e,e.name)})),window.Blazor._internal.dotNetCriticalError=function(e){f.printErr(BINDING.conv_string(e)||"(null)")},window.Blazor._internal.getSatelliteAssemblies=function(t){var n=BINDING.mono_array_to_js_array(t),i=e.bootConfig.resources.satelliteResources;if(i){var a=Promise.all(n.filter((function(e){return i.hasOwnProperty(e)})).map((function(t){return e.loadResources(i[t],(function(e){return"_framework/"+e}),"assembly")})).reduce((function(e,t){return e.concat(t)}),new Array).map((function(e){return r(c,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return[4,e.response];case 1:return[2,t.sent().arrayBuffer()]}}))}))})));return BINDING.js_to_mono_obj(a.then((function(e){return e.length&&(window.Blazor._internal.readSatelliteAssemblies=function(){for(var t=BINDING.mono_obj_array_new(e.length),n=0;n>1];var n},readInt32Field:function(e,t){return d(e+(t||0))},readUint64Field:function(e,t){return function(e){var t=e>>2,n=Module.HEAPU32[t+1];if(n>l)throw new Error("Cannot read uint64 with high order part "+n+", because the result would exceed Number.MAX_SAFE_INTEGER.");return n*c+Module.HEAPU32[t]}(e+(t||0))},readFloatField:function(e,t){return n=e+(t||0),Module.HEAPF32[n>>2];var n},readObjectField:function(e,t){return d(e+(t||0))},readStringField:function(e,t,n){var r,o=d(e+(t||0));if(0===o)return null;if(n){var i=BINDING.unbox_mono_obj(o);return"boolean"==typeof i?i?"":null:i}return f?void 0===(r=f.stringCache.get(o))&&(r=BINDING.conv_string(o),f.stringCache.set(o,r)):r=BINDING.conv_string(o),r},readStructField:function(e,t){return e+(t||0)},beginHeapLock:function(){return y(),f=new b},invokeWhenHeapUnlocked:function(e){f?f.enqueuePostReleaseAction(e):e()}};var p=document.createElement("a");function h(e){return e+12}function m(e,t,n){var r="["+e+"] "+t+":"+n;return BINDING.bind_static_method(r)}function v(e,t){return r(this,void 0,void 0,(function(){var n,r;return o(this,(function(o){switch(o.label){case 0:if("function"!=typeof WebAssembly.instantiateStreaming)return[3,4];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,WebAssembly.instantiateStreaming(e.response,t)];case 2:return[2,o.sent().instance];case 3:return n=o.sent(),console.info("Streaming compilation failed. Falling back to ArrayBuffer instantiation. ",n),[3,4];case 4:return[4,e.response.then((function(e){return e.arrayBuffer()}))];case 5:return r=o.sent(),[4,WebAssembly.instantiate(r,t)];case 6:return[2,o.sent().instance]}}))}))}function y(){if(f)throw new Error("Assertion failed - heap is currently locked")}var b=function(){function e(){this.stringCache=new Map}return e.prototype.enqueuePostReleaseAction=function(e){this.postReleaseActions||(this.postReleaseActions=[]),this.postReleaseActions.push(e)},e.prototype.release=function(){var e;if(f!==this)throw new Error("Trying to release a lock which isn't current");for(f=null;null===(e=this.postReleaseActions)||void 0===e?void 0:e.length;){this.postReleaseActions.shift()(),y()}},e}()},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=window.chrome&&navigator.userAgent.indexOf("Edge")<0,o=!1;function i(){return o&&r}t.hasDebuggingEnabled=i,t.attachDebuggerHotkey=function(e){o=!!e.bootConfig.resources.pdb;var t=navigator.platform.match(/^Mac/i)?"Cmd":"Alt";i()&&console.info("Debugging hotkey: Shift+"+t+"+D (when application has focus)"),document.addEventListener("keydown",(function(e){var t;e.shiftKey&&(e.metaKey||e.altKey)&&"KeyD"===e.code&&(o?r?((t=document.createElement("a")).href="_framework/debug?url="+encodeURIComponent(location.href),t.target="_blank",t.rel="noopener noreferrer",t.click()):console.error("Currently, only Microsoft Edge (80+), or Google Chrome, are supported for debugging."):console.error("Cannot start debugging, because the application was not compiled with debugging enabled."))}))}},function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=n(17),o=function(){function e(e){this.batchAddress=e,this.arrayRangeReader=i,this.arrayBuilderSegmentReader=a,this.diffReader=s,this.editReader=u,this.frameReader=c}return e.prototype.updatedComponents=function(){return r.platform.readStructField(this.batchAddress,0)},e.prototype.referenceFrames=function(){return r.platform.readStructField(this.batchAddress,i.structLength)},e.prototype.disposedComponentIds=function(){return r.platform.readStructField(this.batchAddress,2*i.structLength)},e.prototype.disposedEventHandlerIds=function(){return r.platform.readStructField(this.batchAddress,3*i.structLength)},e.prototype.updatedComponentsEntry=function(e,t){return l(e,t,s.structLength)},e.prototype.referenceFramesEntry=function(e,t){return l(e,t,c.structLength)},e.prototype.disposedComponentIdsEntry=function(e,t){var n=l(e,t,4);return r.platform.readInt32Field(n)},e.prototype.disposedEventHandlerIdsEntry=function(e,t){var n=l(e,t,8);return r.platform.readUint64Field(n)},e}();t.SharedMemoryRenderBatch=o;var i={structLength:8,values:function(e){return r.platform.readObjectField(e,0)},count:function(e){return r.platform.readInt32Field(e,4)}},a={structLength:12,values:function(e){var t=r.platform.readObjectField(e,0),n=r.platform.getObjectFieldsBaseAddress(t);return r.platform.readObjectField(n,0)},offset:function(e){return r.platform.readInt32Field(e,4)},count:function(e){return r.platform.readInt32Field(e,8)}},s={structLength:4+a.structLength,componentId:function(e){return r.platform.readInt32Field(e,0)},edits:function(e){return r.platform.readStructField(e,4)},editsEntry:function(e,t){return l(e,t,u.structLength)}},u={structLength:20,editType:function(e){return r.platform.readInt32Field(e,0)},siblingIndex:function(e){return r.platform.readInt32Field(e,4)},newTreeIndex:function(e){return r.platform.readInt32Field(e,8)},moveToSiblingIndex:function(e){return r.platform.readInt32Field(e,8)},removedAttributeName:function(e){return r.platform.readStringField(e,16)}},c={structLength:36,frameType:function(e){return r.platform.readInt16Field(e,4)},subtreeLength:function(e){return r.platform.readInt32Field(e,8)},elementReferenceCaptureId:function(e){return r.platform.readStringField(e,16)},componentId:function(e){return r.platform.readInt32Field(e,12)},elementName:function(e){return r.platform.readStringField(e,16)},textContent:function(e){return r.platform.readStringField(e,16)},markupContent:function(e){return r.platform.readStringField(e,16)},attributeName:function(e){return r.platform.readStringField(e,16)},attributeValue:function(e){return r.platform.readStringField(e,24,!0)},attributeEventHandlerId:function(e){return r.platform.readUint64Field(e,8)}};function l(e,t,n){return r.platform.getArrayEntryPtr(e,t,n)}},function(e,t,n){"use strict";var r=this&&this.__awaiter||function(e,t,n,r){return new(n||(n=Promise))((function(o,i){function a(e){try{u(r.next(e))}catch(e){i(e)}}function s(e){try{u(r.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,s)}u((r=r.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1] { - const params = new URLSearchParams(window.location.search); - isDebugging = params.get('_blazor_debug') === 'true'; -}) let hasReferencedPdbs = false; export function hasDebuggingEnabled() { - return isDebugging && hasReferencedPdbs && currentBrowserIsChrome; + return hasReferencedPdbs && currentBrowserIsChrome; } export function attachDebuggerHotkey(resourceLoader: WebAssemblyResourceLoader) { @@ -33,8 +27,6 @@ export function attachDebuggerHotkey(resourceLoader: WebAssemblyResourceLoader) console.error('Cannot start debugging, because the application was not compiled with debugging enabled.'); } else if (!currentBrowserIsChrome) { console.error('Currently, only Microsoft Edge (80+), or Google Chrome, are supported for debugging.'); - } else if (!isDebugging) { - console.error(`_blazor_debug query parameter must be set to enable debugging. To enable debugging, go to ${location.href}?_blazor_debug=true.`); } else { launchDebugger(); } diff --git a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs index 26d51d49b8a6..a2ede57649eb 100644 --- a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs +++ b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs @@ -117,7 +117,7 @@ private static void CompleteTaskWhenServerIsReady(Process aspNetProcess, TaskCom void OnOutputDataReceived(object sender, DataReceivedEventArgs eventArgs) { - if (ApplicationStartedRegex.IsMatch(eventArgs.Data)) + if (!String.IsNullOrEmpty(eventArgs.Data) && ApplicationStartedRegex.IsMatch(eventArgs.Data)) { aspNetProcess.OutputDataReceived -= OnOutputDataReceived; if (!string.IsNullOrEmpty(capturedUrl)) From 6f780bb9ea1cc2439c6c16dfd17b22a220e8cd70 Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Fri, 28 Aug 2020 08:04:22 -0700 Subject: [PATCH 17/25] Throw exception if DebugProxy received no output --- .../WebAssembly/Server/src/DebugProxyLauncher.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs index a2ede57649eb..2b294ac8a62b 100644 --- a/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs +++ b/src/Components/WebAssembly/Server/src/DebugProxyLauncher.cs @@ -117,7 +117,13 @@ private static void CompleteTaskWhenServerIsReady(Process aspNetProcess, TaskCom void OnOutputDataReceived(object sender, DataReceivedEventArgs eventArgs) { - if (!String.IsNullOrEmpty(eventArgs.Data) && ApplicationStartedRegex.IsMatch(eventArgs.Data)) + if (String.IsNullOrEmpty(eventArgs.Data)) + { + taskCompletionSource.TrySetException(new InvalidOperationException( + "No output has been recevied from the application.")); + } + + if (ApplicationStartedRegex.IsMatch(eventArgs.Data)) { aspNetProcess.OutputDataReceived -= OnOutputDataReceived; if (!string.IsNullOrEmpty(capturedUrl)) From ebaaa0f01d52bc637d398a25c020534facf2d6d1 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Fri, 28 Aug 2020 16:37:30 +0100 Subject: [PATCH 18/25] Fix minimized attributes when using 5.0 SDK with 3.x target (#25307) * Write minimized attribute values explicitly for older language version * Add tests * Add baselines for new tests --- .../Components/ComponentRuntimeNodeWriter.cs | 9 +++++ .../src/DefaultRazorCodeGenerationOptions.cs | 8 +++-- ...efaultRazorCodeGenerationOptionsBuilder.cs | 7 ++-- .../src/RazorCodeGenerationOptions.cs | 13 +++++-- .../src/RazorCodeGenerationOptionsBuilder.cs | 7 +++- .../ComponentCodeGenerationTestBase.cs | 36 +++++++++++++++++++ .../TestComponent.codegen.cs | 36 +++++++++++++++++++ .../TestComponent.ir.txt | 22 ++++++++++++ .../TestComponent.mappings.txt | 5 +++ .../TestComponent.codegen.cs | 36 +++++++++++++++++++ .../TestComponent.ir.txt | 22 ++++++++++++ .../TestComponent.mappings.txt | 5 +++ .../TestComponent.codegen.cs | 33 +++++++++++++++++ .../TestComponent.ir.txt | 15 ++++++++ .../TestComponent.codegen.cs | 33 +++++++++++++++++ .../TestComponent.ir.txt | 15 ++++++++ .../RazorProjectEngineBuilderExtensions.cs | 12 ++++--- .../RazorIntegrationTestBase.cs | 4 +-- 18 files changed, 304 insertions(+), 14 deletions(-) create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.mappings.txt create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.mappings.txt create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs create mode 100644 src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentRuntimeNodeWriter.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentRuntimeNodeWriter.cs index 93df99a41eb5..005941d9156f 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentRuntimeNodeWriter.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/Components/ComponentRuntimeNodeWriter.cs @@ -852,11 +852,20 @@ protected override void WriteReferenceCaptureInnards(CodeRenderingContext contex private void WriteAttribute(CodeRenderingContext context, string key, IList value) { BeginWriteAttribute(context, key); + if (value.Count > 0) { context.CodeWriter.WriteParameterSeparator(); WriteAttributeValue(context, value); } + else if (!context.Options.OmitMinimizedComponentAttributeValues) + { + // In version 5+, there's no need to supply a value for a minimized attribute. + // But for older language versions, minimized attributes were represented as "true". + context.CodeWriter.WriteParameterSeparator(); + context.CodeWriter.WriteBooleanLiteral(true); + } + context.CodeWriter.WriteEndMethodInvocation(); } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptions.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptions.cs index 5addb92cf21b..0b1441b945ac 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptions.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNetCore.Razor.Language @@ -13,7 +13,8 @@ public DefaultRazorCodeGenerationOptions( bool suppressChecksum, bool suppressMetadataAttributes, bool suppressPrimaryMethodBody, - bool suppressNullabilityEnforcement) + bool suppressNullabilityEnforcement, + bool omitMinimizedComponentAttributeValues) { IndentWithTabs = indentWithTabs; IndentSize = indentSize; @@ -23,6 +24,7 @@ public DefaultRazorCodeGenerationOptions( SuppressMetadataAttributes = suppressMetadataAttributes; SuppressPrimaryMethodBody = suppressPrimaryMethodBody; SuppressNullabilityEnforcement = suppressNullabilityEnforcement; + OmitMinimizedComponentAttributeValues = omitMinimizedComponentAttributeValues; } public override bool DesignTime { get; } @@ -36,5 +38,7 @@ public DefaultRazorCodeGenerationOptions( public override bool SuppressChecksum { get; } public override bool SuppressNullabilityEnforcement { get; } + + public override bool OmitMinimizedComponentAttributeValues { get; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptionsBuilder.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptionsBuilder.cs index 12f2f119c44a..1422b410ff41 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptionsBuilder.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/DefaultRazorCodeGenerationOptionsBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -39,6 +39,8 @@ public DefaultRazorCodeGenerationOptionsBuilder(bool designTime) public override bool SuppressNullabilityEnforcement { get; set; } + public override bool OmitMinimizedComponentAttributeValues { get; set; } + public override RazorCodeGenerationOptions Build() { return new DefaultRazorCodeGenerationOptions( @@ -49,7 +51,8 @@ public override RazorCodeGenerationOptions Build() SuppressChecksum, SuppressMetadataAttributes, SuppressPrimaryMethodBody, - SuppressNullabilityEnforcement); + SuppressNullabilityEnforcement, + OmitMinimizedComponentAttributeValues); } public override void SetDesignTime(bool designTime) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptions.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptions.cs index 36a8499ba966..b481dfeb07a6 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptions.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -17,7 +17,8 @@ public static RazorCodeGenerationOptions CreateDefault() rootNamespace: null, suppressMetadataAttributes: false, suppressPrimaryMethodBody: false, - suppressNullabilityEnforcement: false); + suppressNullabilityEnforcement: false, + omitMinimizedComponentAttributeValues: false); } public static RazorCodeGenerationOptions CreateDesignTimeDefault() @@ -30,7 +31,8 @@ public static RazorCodeGenerationOptions CreateDesignTimeDefault() suppressChecksum: false, suppressMetadataAttributes: true, suppressPrimaryMethodBody: false, - suppressNullabilityEnforcement: false); + suppressNullabilityEnforcement: false, + omitMinimizedComponentAttributeValues: false); } public static RazorCodeGenerationOptions Create(Action configure) @@ -114,5 +116,10 @@ public static RazorCodeGenerationOptions CreateDesignTime(Action public virtual bool SuppressNullabilityEnforcement { get; } + + /// + /// Gets a value that determines if the components code writer may omit values for minimized attributes. + /// + public virtual bool OmitMinimizedComponentAttributeValues { get; } } } diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptionsBuilder.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptionsBuilder.cs index ed6914aebebb..48d725b6145f 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptionsBuilder.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/src/RazorCodeGenerationOptionsBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNetCore.Razor.Language @@ -59,6 +59,11 @@ public abstract class RazorCodeGenerationOptionsBuilder /// public virtual bool SuppressNullabilityEnforcement { get; set; } + /// + /// Gets or sets a value that determines if the components code writer may omit values for minimized attributes. + /// + public virtual bool OmitMinimizedComponentAttributeValues { get; set; } + public abstract RazorCodeGenerationOptions Build(); public virtual void SetDesignTime(bool designTime) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs index 0308fe46c4b1..c0b3fd708e1a 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/IntegrationTests/ComponentCodeGenerationTestBase.cs @@ -9,10 +9,14 @@ namespace Microsoft.AspNetCore.Razor.Language.IntegrationTests { public abstract class ComponentCodeGenerationTestBase : RazorBaselineIntegrationTestBase { + private RazorConfiguration _configuration; + internal override string FileKind => FileKinds.Component; internal override bool UseTwoPhaseCompilation => true; + internal override RazorConfiguration Configuration => _configuration ?? base.Configuration; + protected ComponentCodeGenerationTestBase() : base(generateBaselines: null) { @@ -364,6 +368,38 @@ public void MarkupComment_IsNotIncluded() CompileToAssembly(generated); } + [Fact] + public void OmitsMinimizedAttributeValueParameter() + { + // Act + var generated = CompileToCSharp(@" +"); + + // Assert + AssertDocumentNodeMatchesBaseline(generated.CodeDocument); + AssertCSharpDocumentMatchesBaseline(generated.CodeDocument); + CompileToAssembly(generated); + } + + [Fact] + public void IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5() + { + // Arrange + _configuration = RazorConfiguration.Create( + RazorLanguageVersion.Version_3_0, + base.Configuration.ConfigurationName, + base.Configuration.Extensions); + + // Act + var generated = CompileToCSharp(@" +"); + + // Assert + AssertDocumentNodeMatchesBaseline(generated.CodeDocument); + AssertCSharpDocumentMatchesBaseline(generated.CodeDocument); + CompileToAssembly(generated); + } + [Fact] public void Component_WithFullyQualifiedTagNames() { diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs new file mode 100644 index 000000000000..1024b82fc9aa --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs @@ -0,0 +1,36 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line hidden + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Components; + public partial class TestComponent : Microsoft.AspNetCore.Components.ComponentBase + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static System.Object __o = null; + #pragma warning restore 0414 + #pragma warning disable 1998 + protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + __o = +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" + "val" + +#line default +#line hidden +#nullable disable + ; + } + #pragma warning restore 1998 + } +} +#pragma warning restore 1591 diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt new file mode 100644 index 000000000000..ef767a96b4e1 --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt @@ -0,0 +1,22 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [12] ) - System + UsingDirective - (18:2,1 [32] ) - System.Collections.Generic + UsingDirective - (53:3,1 [17] ) - System.Linq + UsingDirective - (73:4,1 [28] ) - System.Threading.Tasks + UsingDirective - (104:5,1 [37] ) - Microsoft.AspNetCore.Components + ClassDeclaration - - public partial - TestComponent - Microsoft.AspNetCore.Components.ComponentBase - + DesignTimeDirective - + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static System.Object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + MethodDeclaration - - protected override - void - BuildRenderTree + MarkupElement - (0:0,0 [73] x:\dir\subdir\Test\TestComponent.cshtml) - elem + HtmlAttribute - (5:0,5 [23] x:\dir\subdir\Test\TestComponent.cshtml) - normal-attr=" - " + CSharpExpressionAttributeValue - (19:0,19 [8] x:\dir\subdir\Test\TestComponent.cshtml) - + LazyIntermediateToken - (21:0,21 [5] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - "val" + HtmlAttribute - (28:0,28 [15] x:\dir\subdir\Test\TestComponent.cshtml) - minimized-attr - + HtmlAttribute - (43:0,43 [22] x:\dir\subdir\Test\TestComponent.cshtml) - empty-string-atttr=" - " diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.mappings.txt b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.mappings.txt new file mode 100644 index 000000000000..35f1e0834bea --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (21:0,21 [5] x:\dir\subdir\Test\TestComponent.cshtml) +|"val"| +Generated Location: (893:25,21 [5] ) +|"val"| + diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs new file mode 100644 index 000000000000..1024b82fc9aa --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs @@ -0,0 +1,36 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line hidden + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Components; + public partial class TestComponent : Microsoft.AspNetCore.Components.ComponentBase + { + #pragma warning disable 219 + private void __RazorDirectiveTokenHelpers__() { + } + #pragma warning restore 219 + #pragma warning disable 0414 + private static System.Object __o = null; + #pragma warning restore 0414 + #pragma warning disable 1998 + protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + __o = +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" + "val" + +#line default +#line hidden +#nullable disable + ; + } + #pragma warning restore 1998 + } +} +#pragma warning restore 1591 diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt new file mode 100644 index 000000000000..ef767a96b4e1 --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt @@ -0,0 +1,22 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [12] ) - System + UsingDirective - (18:2,1 [32] ) - System.Collections.Generic + UsingDirective - (53:3,1 [17] ) - System.Linq + UsingDirective - (73:4,1 [28] ) - System.Threading.Tasks + UsingDirective - (104:5,1 [37] ) - Microsoft.AspNetCore.Components + ClassDeclaration - - public partial - TestComponent - Microsoft.AspNetCore.Components.ComponentBase - + DesignTimeDirective - + CSharpCode - + IntermediateToken - - CSharp - #pragma warning disable 0414 + CSharpCode - + IntermediateToken - - CSharp - private static System.Object __o = null; + CSharpCode - + IntermediateToken - - CSharp - #pragma warning restore 0414 + MethodDeclaration - - protected override - void - BuildRenderTree + MarkupElement - (0:0,0 [73] x:\dir\subdir\Test\TestComponent.cshtml) - elem + HtmlAttribute - (5:0,5 [23] x:\dir\subdir\Test\TestComponent.cshtml) - normal-attr=" - " + CSharpExpressionAttributeValue - (19:0,19 [8] x:\dir\subdir\Test\TestComponent.cshtml) - + LazyIntermediateToken - (21:0,21 [5] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - "val" + HtmlAttribute - (28:0,28 [15] x:\dir\subdir\Test\TestComponent.cshtml) - minimized-attr - + HtmlAttribute - (43:0,43 [22] x:\dir\subdir\Test\TestComponent.cshtml) - empty-string-atttr=" - " diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.mappings.txt b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.mappings.txt new file mode 100644 index 000000000000..35f1e0834bea --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentDesignTimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.mappings.txt @@ -0,0 +1,5 @@ +Source Location: (21:0,21 [5] x:\dir\subdir\Test\TestComponent.cshtml) +|"val"| +Generated Location: (893:25,21 [5] ) +|"val"| + diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs new file mode 100644 index 000000000000..c99a988b7609 --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.codegen.cs @@ -0,0 +1,33 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line hidden + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Components; + public partial class TestComponent : Microsoft.AspNetCore.Components.ComponentBase + { + #pragma warning disable 1998 + protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + __builder.OpenElement(0, "elem"); + __builder.AddAttribute(1, "normal-attr", +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" + "val" + +#line default +#line hidden +#nullable disable + ); + __builder.AddAttribute(2, "minimized-attr", true); + __builder.AddAttribute(3, "empty-string-atttr", true); + __builder.CloseElement(); + } + #pragma warning restore 1998 + } +} +#pragma warning restore 1591 diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt new file mode 100644 index 000000000000..77da360ab01a --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/IncludesMinimizedAttributeValueParameterBeforeLanguageVersion5/TestComponent.ir.txt @@ -0,0 +1,15 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [14] ) - System + UsingDirective - (18:2,1 [34] ) - System.Collections.Generic + UsingDirective - (53:3,1 [19] ) - System.Linq + UsingDirective - (73:4,1 [30] ) - System.Threading.Tasks + UsingDirective - (104:5,1 [39] ) - Microsoft.AspNetCore.Components + ClassDeclaration - - public partial - TestComponent - Microsoft.AspNetCore.Components.ComponentBase - + MethodDeclaration - - protected override - void - BuildRenderTree + MarkupElement - (0:0,0 [73] x:\dir\subdir\Test\TestComponent.cshtml) - elem + HtmlAttribute - (5:0,5 [23] x:\dir\subdir\Test\TestComponent.cshtml) - normal-attr=" - " + CSharpExpressionAttributeValue - (19:0,19 [8] x:\dir\subdir\Test\TestComponent.cshtml) - + LazyIntermediateToken - (21:0,21 [5] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - "val" + HtmlAttribute - (28:0,28 [15] x:\dir\subdir\Test\TestComponent.cshtml) - minimized-attr - + HtmlAttribute - (43:0,43 [22] x:\dir\subdir\Test\TestComponent.cshtml) - empty-string-atttr=" - " diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs new file mode 100644 index 000000000000..81d863fb9207 --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.codegen.cs @@ -0,0 +1,33 @@ +// +#pragma warning disable 1591 +namespace Test +{ + #line hidden + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using Microsoft.AspNetCore.Components; + public partial class TestComponent : Microsoft.AspNetCore.Components.ComponentBase + { + #pragma warning disable 1998 + protected override void BuildRenderTree(Microsoft.AspNetCore.Components.Rendering.RenderTreeBuilder __builder) + { + __builder.OpenElement(0, "elem"); + __builder.AddAttribute(1, "normal-attr", +#nullable restore +#line 1 "x:\dir\subdir\Test\TestComponent.cshtml" + "val" + +#line default +#line hidden +#nullable disable + ); + __builder.AddAttribute(2, "minimized-attr"); + __builder.AddAttribute(3, "empty-string-atttr"); + __builder.CloseElement(); + } + #pragma warning restore 1998 + } +} +#pragma warning restore 1591 diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt new file mode 100644 index 000000000000..77da360ab01a --- /dev/null +++ b/src/Razor/Microsoft.AspNetCore.Razor.Language/test/TestFiles/IntegrationTests/ComponentRuntimeCodeGenerationTest/OmitsMinimizedAttributeValueParameter/TestComponent.ir.txt @@ -0,0 +1,15 @@ +Document - + NamespaceDeclaration - - Test + UsingDirective - (3:1,1 [14] ) - System + UsingDirective - (18:2,1 [34] ) - System.Collections.Generic + UsingDirective - (53:3,1 [19] ) - System.Linq + UsingDirective - (73:4,1 [30] ) - System.Threading.Tasks + UsingDirective - (104:5,1 [39] ) - Microsoft.AspNetCore.Components + ClassDeclaration - - public partial - TestComponent - Microsoft.AspNetCore.Components.ComponentBase - + MethodDeclaration - - protected override - void - BuildRenderTree + MarkupElement - (0:0,0 [73] x:\dir\subdir\Test\TestComponent.cshtml) - elem + HtmlAttribute - (5:0,5 [23] x:\dir\subdir\Test\TestComponent.cshtml) - normal-attr=" - " + CSharpExpressionAttributeValue - (19:0,19 [8] x:\dir\subdir\Test\TestComponent.cshtml) - + LazyIntermediateToken - (21:0,21 [5] x:\dir\subdir\Test\TestComponent.cshtml) - CSharp - "val" + HtmlAttribute - (28:0,28 [15] x:\dir\subdir\Test\TestComponent.cshtml) - minimized-attr - + HtmlAttribute - (43:0,43 [22] x:\dir\subdir\Test\TestComponent.cshtml) - empty-string-atttr=" - " diff --git a/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs b/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs index e49264372367..aa07cd9cf6ad 100644 --- a/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs +++ b/src/Razor/Microsoft.CodeAnalysis.Razor/src/RazorProjectEngineBuilderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -64,10 +64,8 @@ public void Configure(RazorCodeGenerationOptionsBuilder options) { // Prior to 3.0 there were no C# version specific controlled features. Suppress nullability enforcement. options.SuppressNullabilityEnforcement = true; - return; } - - if (CSharpLanguageVersion < LanguageVersion.CSharp8) + else if (CSharpLanguageVersion < LanguageVersion.CSharp8) { // Having nullable flags < C# 8.0 would cause compile errors. options.SuppressNullabilityEnforcement = true; @@ -85,6 +83,12 @@ public void Configure(RazorCodeGenerationOptionsBuilder options) // Roslyn project and acquires the effective C# version at that point. options.SuppressNullabilityEnforcement = false; } + + if (options.Configuration?.LanguageVersion.Major >= 5) + { + // This is a useful optimization but isn't supported by older framework versions + options.OmitMinimizedComponentAttributeValues = true; + } } } } diff --git a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs index ddd1b5dbd1c4..07f4572c5b01 100644 --- a/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs +++ b/src/Razor/test/Microsoft.AspNetCore.Razor.Test.Common/Language/IntegrationTests/RazorIntegrationTestBase.cs @@ -189,7 +189,7 @@ protected CompileToCSharpResult CompileToCSharp(string cshtmlRelativePath, strin { // The first phase won't include any metadata references for component discovery. This mirrors // what the build does. - var projectEngine = CreateProjectEngine(RazorConfiguration.Default, Array.Empty()); + var projectEngine = CreateProjectEngine(Configuration, Array.Empty()); RazorCodeDocument codeDocument; foreach (var item in AdditionalRazorItems) @@ -218,7 +218,7 @@ protected CompileToCSharpResult CompileToCSharp(string cshtmlRelativePath, strin // Add the 'temp' compilation as a metadata reference var references = BaseCompilation.References.Concat(new[] { tempAssembly.Compilation.ToMetadataReference() }).ToArray(); - projectEngine = CreateProjectEngine(RazorConfiguration.Default, references); + projectEngine = CreateProjectEngine(Configuration, references); // Now update the any additional files foreach (var item in AdditionalRazorItems) From d793f473c432c1868a71f89b46f35f517044373c Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Fri, 28 Aug 2020 16:37:37 +0100 Subject: [PATCH 19/25] Support pseudoelements in CSS scoping (#25270) * Support pseudoelements in CSS scoping. Fixes #25268 * CR: More test cases * Another pseudoelement case * Case insensitivity for single-colon pseudoelements Not that anybody should ever want to do this * Avoid an allocation --- .../src/RewriteCssCommand.cs | 68 +++++++++++---- .../test/RewriteCssCommandTest.cs | 83 +++++++++++++++++++ 2 files changed, 133 insertions(+), 18 deletions(-) diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/RewriteCssCommand.cs b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/RewriteCssCommand.cs index 3babba81e0b4..745bfb03841c 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/RewriteCssCommand.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Tools/src/RewriteCssCommand.cs @@ -187,7 +187,7 @@ protected override void VisitSelector(Selector selector) var lastSimpleSelector = allSimpleSelectors.TakeWhile(s => s != firstDeepCombinator).LastOrDefault(); if (lastSimpleSelector != null) { - Edits.Add(new InsertSelectorScopeEdit { Position = FindPositionBeforeTrailingCombinator(lastSimpleSelector) }); + Edits.Add(new InsertSelectorScopeEdit { Position = FindPositionToInsertInSelector(lastSimpleSelector) }); } else if (firstDeepCombinator != null) { @@ -203,30 +203,62 @@ protected override void VisitSelector(Selector selector) } } - private int FindPositionBeforeTrailingCombinator(SimpleSelector lastSimpleSelector) + private int FindPositionToInsertInSelector(SimpleSelector lastSimpleSelector) { - // For a selector like "a > ::deep b", the parser splits it as "a >", "::deep", "b". - // The place we want to insert the scope is right after "a", hence we need to detect - // if the simple selector ends with " >" or similar, and if so, insert before that. - var text = lastSimpleSelector.Text; - var lastChar = text.Length > 0 ? text[^1] : default; - switch (lastChar) + var children = lastSimpleSelector.Children; + for (var i = 0; i < children.Count; i++) { - case '>': - case '+': - case '~': - var trailingCombinatorMatch = _trailingCombinatorRegex.Match(text); - if (trailingCombinatorMatch.Success) - { - var trailingCombinatorLength = trailingCombinatorMatch.Length; - return lastSimpleSelector.AfterEnd - trailingCombinatorLength; - } - break; + switch (children[i]) + { + // Selectors like "a > ::deep b" get parsed as [[a][>]][::deep][b], and we want to + // insert right after the "a". So if we're processing a SimpleSelector like [[a][>]], + // consider the ">" to signal the "insert before" position. + case TokenItem t when IsTrailingCombinator(t.TokenType): + + // Similarly selectors like "a::before" get parsed as [[a][::before]], and we want to + // insert right after the "a". So if we're processing a SimpleSelector like [[a][::before]], + // consider the pseudoelement to signal the "insert before" position. + case PseudoElementSelector: + case PseudoElementFunctionSelector: + case PseudoClassSelector s when IsSingleColonPseudoElement(s): + // Insert after the previous token if there is one, otherwise before the whole thing + return i > 0 ? children[i - 1].AfterEnd : lastSimpleSelector.Start; + } } + // Since we didn't find any children that signal the insert-before position, + // insert after the whole thing return lastSimpleSelector.AfterEnd; } + private static bool IsSingleColonPseudoElement(PseudoClassSelector selector) + { + // See https://developer.mozilla.org/en-US/docs/Web/CSS/Pseudo-elements + // Normally, pseudoelements require a double-colon prefix. However the following "original set" + // of pseudoelements also support single-colon prefixes for back-compatibility with older versions + // of the W3C spec. Our CSS parser sees them as pseudoselectors rather than pseudoelements, so + // we have to special-case them. The single-colon option doesn't exist for other more modern + // pseudoelements. + var selectorText = selector.Text; + return string.Equals(selectorText, ":after", StringComparison.OrdinalIgnoreCase) + || string.Equals(selectorText, ":before", StringComparison.OrdinalIgnoreCase) + || string.Equals(selectorText, ":first-letter", StringComparison.OrdinalIgnoreCase) + || string.Equals(selectorText, ":first-line", StringComparison.OrdinalIgnoreCase); + } + + private static bool IsTrailingCombinator(CssTokenType tokenType) + { + switch (tokenType) + { + case CssTokenType.Plus: + case CssTokenType.Tilde: + case CssTokenType.Greater: + return true; + default: + return false; + } + } + protected override void VisitAtDirective(AtDirective item) { // Whenever we see "@keyframes something { ... }", we want to insert right after "something" diff --git a/src/Razor/Microsoft.AspNetCore.Razor.Tools/test/RewriteCssCommandTest.cs b/src/Razor/Microsoft.AspNetCore.Razor.Tools/test/RewriteCssCommandTest.cs index 37b1c37a300b..76ab33e6ca39 100644 --- a/src/Razor/Microsoft.AspNetCore.Razor.Tools/test/RewriteCssCommandTest.cs +++ b/src/Razor/Microsoft.AspNetCore.Razor.Tools/test/RewriteCssCommandTest.cs @@ -41,6 +41,9 @@ public void HandlesMultipleSelectors() var result = RewriteCssCommand.AddScopeToSelectors("file.css", @" .first, .second { color: red; } .third { color: blue; } + :root { color: green; } + * { color: white; } + #some-id { color: yellow; } ", "TestScope", out var diagnostics); // Assert @@ -48,6 +51,9 @@ public void HandlesMultipleSelectors() Assert.Equal(@" .first[TestScope], .second[TestScope] { color: red; } .third[TestScope] { color: blue; } + :root[TestScope] { color: green; } + *[TestScope] { color: white; } + #some-id[TestScope] { color: yellow; } ", result); } @@ -81,6 +87,83 @@ public void HandlesSpacesAndCommentsWithinSelectors() ", result); } + [Fact] + public void HandlesPseudoClasses() + { + // Arrange/act + var result = RewriteCssCommand.AddScopeToSelectors("file.css", @" + a:fake-pseudo-class { color: red; } + a:focus b:hover { color: green; } + tr:nth-child(4n + 1) { color: blue; } + a:has(b > c) { color: yellow; } + a:last-child > ::deep b { color: pink; } + a:not(#something) { color: purple; } +", "TestScope", out var diagnostics); + + // Assert + Assert.Empty(diagnostics); + Assert.Equal(@" + a:fake-pseudo-class[TestScope] { color: red; } + a:focus b:hover[TestScope] { color: green; } + tr:nth-child(4n + 1)[TestScope] { color: blue; } + a:has(b > c)[TestScope] { color: yellow; } + a:last-child[TestScope] > b { color: pink; } + a:not(#something)[TestScope] { color: purple; } +", result); + } + + [Fact] + public void HandlesPseudoElements() + { + // Arrange/act + var result = RewriteCssCommand.AddScopeToSelectors("file.css", @" + a::before { content: ""✋""; } + a::after::placeholder { content: ""🐯""; } + custom-element::part(foo) { content: ""🤷‍""; } + a::before > ::deep another { content: ""👞""; } + a::fake-PsEuDo-element { content: ""🐔""; } + ::selection { content: ""😾""; } + other, ::selection { content: ""👂""; } +", "TestScope", out var diagnostics); + + // Assert + Assert.Empty(diagnostics); + Assert.Equal(@" + a[TestScope]::before { content: ""✋""; } + a[TestScope]::after::placeholder { content: ""🐯""; } + custom-element[TestScope]::part(foo) { content: ""🤷‍""; } + a[TestScope]::before > another { content: ""👞""; } + a[TestScope]::fake-PsEuDo-element { content: ""🐔""; } + [TestScope]::selection { content: ""😾""; } + other[TestScope], [TestScope]::selection { content: ""👂""; } +", result); + } + + [Fact] + public void HandlesSingleColonPseudoElements() + { + // Arrange/act + var result = RewriteCssCommand.AddScopeToSelectors("file.css", @" + a:after { content: ""x""; } + a:before { content: ""x""; } + a:first-letter { content: ""x""; } + a:first-line { content: ""x""; } + a:AFTER { content: ""x""; } + a:not(something):before { content: ""x""; } +", "TestScope", out var diagnostics); + + // Assert + Assert.Empty(diagnostics); + Assert.Equal(@" + a[TestScope]:after { content: ""x""; } + a[TestScope]:before { content: ""x""; } + a[TestScope]:first-letter { content: ""x""; } + a[TestScope]:first-line { content: ""x""; } + a[TestScope]:AFTER { content: ""x""; } + a:not(something)[TestScope]:before { content: ""x""; } +", result); + } + [Fact] public void RespectsDeepCombinator() { From 97280fe5f644c17f2e3cce8380276b429859a87a Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Fri, 28 Aug 2020 16:00:09 +0000 Subject: [PATCH 20/25] Revert identity package workaround and bump versions (#24819) * Revert "Add workaround for deprecated overload in authentication scenarios (#24600)" This reverts commit 7eb58e045ddc71d76ff7a7f0092d859928184e74. * Update identity package versions --- eng/Versions.props | 4 ++-- .../Web.ProjectTemplates/BlazorServerWeb-CSharp.csproj.in | 2 -- .../ComponentsWebAssembly-CSharp.Server.csproj.in | 4 +--- .../Microsoft.DotNet.Web.ProjectTemplates.csproj | 2 -- .../Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in | 2 -- .../Web.ProjectTemplates/StarterWeb-CSharp.csproj.in | 2 -- .../Web.ProjectTemplates/WebApi-CSharp.csproj.in | 2 -- 7 files changed, 3 insertions(+), 15 deletions(-) diff --git a/eng/Versions.props b/eng/Versions.props index e7cc59f8a605..91e62dabeec3 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -259,8 +259,8 @@ 4.0.4 4.0.4 2.1.90 - 0.2.1-preview - 0.2.1-preview + 0.2.3-preview + 0.2.3-preview 3.8.0 $(MessagePackPackageVersion) 4.10.0 diff --git a/src/ProjectTemplates/Web.ProjectTemplates/BlazorServerWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/BlazorServerWeb-CSharp.csproj.in index 6eeaeb4d72ae..c47e9753cd6d 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/BlazorServerWeb-CSharp.csproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/BlazorServerWeb-CSharp.csproj.in @@ -23,8 +23,6 @@ - - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/ComponentsWebAssembly-CSharp.Server.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/ComponentsWebAssembly-CSharp.Server.csproj.in index dfa8d096e1e7..20efa3e9e2ab 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/ComponentsWebAssembly-CSharp.Server.csproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/ComponentsWebAssembly-CSharp.Server.csproj.in @@ -1,4 +1,4 @@ - + ${DefaultNetCoreTargetFramework} @@ -38,8 +38,6 @@ - - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj b/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj index e2021461e61c..b61cd6f6d328 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj +++ b/src/ProjectTemplates/Web.ProjectTemplates/Microsoft.DotNet.Web.ProjectTemplates.csproj @@ -38,8 +38,6 @@ - - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in index 193e19b5a96b..13f3a992758d 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/RazorPagesWeb-CSharp.csproj.in @@ -23,8 +23,6 @@ - - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in index dce287512dfa..205c905eb649 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/StarterWeb-CSharp.csproj.in @@ -23,8 +23,6 @@ - - diff --git a/src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in index 44619a166374..fd6d56ec32d3 100644 --- a/src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in +++ b/src/ProjectTemplates/Web.ProjectTemplates/WebApi-CSharp.csproj.in @@ -9,8 +9,6 @@ - - From 7686c0b4e76e728a38d8ceabb69cfd7c29ff5135 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 28 Aug 2020 09:42:11 -0700 Subject: [PATCH 21/25] Record type follow ups: (#25218) * Record type follow ups: * Throw an error if a record type property has validation metadata * Disallow TryUpdateModel on a top-level record type * Ignore previously specified model value when binding a record type * Unskip record type tests * Clean up record type detection * Update src/Mvc/Mvc.Abstractions/src/Resources.resx Co-authored-by: James Newton-King * Fixup tests * Update src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelMetadata.cs * Update src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelMetadata.cs * Update src/Mvc/Mvc.Abstractions/src/Resources.resx Co-authored-by: Doug Bunting <6431421+dougbu@users.noreply.github.com> * Update src/Mvc/Mvc.Core/src/Resources.resx Co-authored-by: Doug Bunting <6431421+dougbu@users.noreply.github.com> * Apply suggestions from code review Co-authored-by: James Newton-King Co-authored-by: Doug Bunting <6431421+dougbu@users.noreply.github.com> --- .../src/ModelBinding/ModelMetadata.cs | 93 +++++++--- src/Mvc/Mvc.Abstractions/src/Resources.resx | 5 +- .../Binders/ComplexObjectModelBinder.cs | 39 ++--- .../DefaultBindingMetadataProvider.cs | 3 +- .../Metadata/DefaultModelMetadata.cs | 2 + ...HasValidatorsValidationMetadataProvider.cs | 20 ++- .../Metadata/ValidationMetadata.cs | 7 +- .../src/ModelBinding/ModelBindingHelper.cs | 6 + .../DefaultComplexObjectValidationStrategy.cs | 1 + .../Validation/ValidationVisitor.cs | 5 + src/Mvc/Mvc.Core/src/Resources.resx | 3 + .../SystemTextJsonInputFormatterTest.cs | 4 +- .../TryUpdateModelIntegrationTest.cs | 92 +++------- .../ValidationWithRecordIntegrationTests.cs | 159 +++++++++++++++++- 14 files changed, 319 insertions(+), 120 deletions(-) diff --git a/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelMetadata.cs b/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelMetadata.cs index 4ce3e2afbbb4..d27f38d104aa 100644 --- a/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelMetadata.cs +++ b/src/Mvc/Mvc.Abstractions/src/ModelBinding/ModelMetadata.cs @@ -7,8 +7,10 @@ using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; +using Microsoft.AspNetCore.Mvc.Abstractions; using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; using Microsoft.AspNetCore.Mvc.ModelBinding.Validation; using Microsoft.Extensions.Internal; @@ -26,11 +28,11 @@ public abstract class ModelMetadata : IEquatable, IModelMetadata /// public static readonly int DefaultOrder = 10000; - private static readonly IReadOnlyDictionary EmptyParameterMapping = new Dictionary(0); - private int? _hashCode; private IReadOnlyList? _boundProperties; private IReadOnlyDictionary? _parameterMapping; + private Exception? _recordTypeValidatorsOnPropertiesError; + private bool _recordTypeConstructorDetailsCalculated; /// /// Creates a new . @@ -137,37 +139,16 @@ internal IReadOnlyList BoundProperties } } + /// + /// A mapping from parameters to their corresponding properties on a record type. + /// internal IReadOnlyDictionary BoundConstructorParameterMapping { get { - if (_parameterMapping != null) - { - return _parameterMapping; - } - - if (BoundConstructor is null) - { - _parameterMapping = EmptyParameterMapping; - return _parameterMapping; - } - - var boundParameters = BoundConstructor.BoundConstructorParameters!; - var parameterMapping = new Dictionary(); - - foreach (var parameter in boundParameters) - { - var property = Properties.FirstOrDefault(p => - string.Equals(p.Name, parameter.ParameterName, StringComparison.Ordinal) && - p.ModelType == parameter.ModelType); - - if (property != null) - { - parameterMapping[parameter] = property; - } - } + Debug.Assert(BoundConstructor != null, "This API can be only called for types with bound constructors."); + CalculateRecordTypeConstructorDetails(); - _parameterMapping = parameterMapping; return _parameterMapping; } } @@ -494,6 +475,62 @@ internal IReadOnlyDictionary BoundConstructorParam /// public virtual Func? BoundConstructorInvoker => null; + /// + /// Gets a value that determines if validators can be constructed using metadata exclusively defined on the property. + /// + internal virtual bool PropertyHasValidators => false; + + /// + /// Throws if the ModelMetadata is for a record type with validation on properties. + /// + internal void ThrowIfRecordTypeHasValidationOnProperties() + { + CalculateRecordTypeConstructorDetails(); + if (_recordTypeValidatorsOnPropertiesError != null) + { + throw _recordTypeValidatorsOnPropertiesError; + } + } + + [MemberNotNull(nameof(_parameterMapping))] + private void CalculateRecordTypeConstructorDetails() + { + if (_recordTypeConstructorDetailsCalculated) + { + Debug.Assert(_parameterMapping != null); + return; + } + + + var boundParameters = BoundConstructor!.BoundConstructorParameters!; + var parameterMapping = new Dictionary(); + + foreach (var parameter in boundParameters) + { + var property = Properties.FirstOrDefault(p => + string.Equals(p.Name, parameter.ParameterName, StringComparison.Ordinal) && + p.ModelType == parameter.ModelType); + + if (property != null) + { + parameterMapping[parameter] = property; + + if (property.PropertyHasValidators) + { + // When constructing the mapping of paramets -> properties, also determine + // if the property has any validators (without looking at metadata on the type). + // This will help us throw during validation if a user defines validation attributes + // on the property of a record type. + _recordTypeValidatorsOnPropertiesError = new InvalidOperationException( + Resources.FormatRecordTypeHasValidationOnProperties(ModelType, property.Name)); + } + } + } + + _recordTypeConstructorDetailsCalculated = true; + _parameterMapping = parameterMapping; + } + /// /// Gets a display name for the model. /// diff --git a/src/Mvc/Mvc.Abstractions/src/Resources.resx b/src/Mvc/Mvc.Abstractions/src/Resources.resx index 99f5998ae610..c4159218e799 100644 --- a/src/Mvc/Mvc.Abstractions/src/Resources.resx +++ b/src/Mvc/Mvc.Abstractions/src/Resources.resx @@ -177,4 +177,7 @@ The type '{0}' must implement '{1}' to be used as a model binder. - \ No newline at end of file + + Record type '{0}' has validation metadata defined on property '{1}' that will be ignored. '{1}' is a parameter in the record primary constructor and validation metadata must be associated with the constructor parameter. + + diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ComplexObjectModelBinder.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ComplexObjectModelBinder.cs index 2bd38a4baeff..392af54ea637 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ComplexObjectModelBinder.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Binders/ComplexObjectModelBinder.cs @@ -75,32 +75,33 @@ private async Task BindModelCoreAsync(ModelBindingContext bindingContext, int pr var bindingSucceeded = false; var modelMetadata = bindingContext.ModelMetadata; + var boundConstructor = modelMetadata.BoundConstructor; - if (bindingContext.Model == null) + if (boundConstructor != null) { - var boundConstructor = modelMetadata.BoundConstructor; - if (boundConstructor != null) - { - var values = new object[boundConstructor.BoundConstructorParameters.Count]; - var (attemptedParameterBinding, parameterBindingSucceeded) = await BindParametersAsync( - bindingContext, - propertyData, - boundConstructor.BoundConstructorParameters, - values); + // Only record types are allowed to have a BoundConstructor. Binding a record type requires + // instantiating the type. This means we'll ignore a previously assigned bindingContext.Model value. + // This behaior is identical to input formatting with S.T.Json and Json.NET. + + var values = new object[boundConstructor.BoundConstructorParameters.Count]; + var (attemptedParameterBinding, parameterBindingSucceeded) = await BindParametersAsync( + bindingContext, + propertyData, + boundConstructor.BoundConstructorParameters, + values); - attemptedBinding |= attemptedParameterBinding; - bindingSucceeded |= parameterBindingSucceeded; + attemptedBinding |= attemptedParameterBinding; + bindingSucceeded |= parameterBindingSucceeded; - if (!CreateModel(bindingContext, boundConstructor, values)) - { - return; - } - } - else + if (!CreateModel(bindingContext, boundConstructor, values)) { - CreateModel(bindingContext); + return; } } + else if (bindingContext.Model == null) + { + CreateModel(bindingContext); + } var (attemptedPropertyBinding, propertyBindingSucceeded) = await BindPropertiesAsync( bindingContext, diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs index e5b7c54df0d4..dcb76f2afa23 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultBindingMetadataProvider.cs @@ -143,8 +143,7 @@ private static ConstructorInfo GetRecordTypeConstructor(Type type, ConstructorIn static bool IsRecordType(Type type) { // Based on the state of the art as described in https://github.com/dotnet/roslyn/issues/45777 - var cloneMethod = type.GetMethod("$", BindingFlags.Public | BindingFlags.Instance) ?? - type.GetMethod("<>Clone", BindingFlags.Public | BindingFlags.Instance); + var cloneMethod = type.GetMethod("$", BindingFlags.Public | BindingFlags.Instance); return cloneMethod != null && cloneMethod.ReturnType == type; } } diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultModelMetadata.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultModelMetadata.cs index 7d57a10f3939..ef55b0e71191 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultModelMetadata.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/DefaultModelMetadata.cs @@ -468,6 +468,8 @@ public override bool? HasValidators } } + internal override bool PropertyHasValidators => ValidationMetadata.PropertyHasValidators; + internal static bool CalculateHasValidators(HashSet visited, ModelMetadata metadata) { RuntimeHelpers.EnsureSufficientExecutionStack(); diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs index 6378ba518fdc..a3ca24190806 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/HasValidatorsValidationMetadataProvider.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -40,7 +40,23 @@ public void CreateValidationMetadata(ValidationMetadataProviderContext context) if (provider.HasValidators(context.Key.ModelType, context.ValidationMetadata.ValidatorMetadata)) { context.ValidationMetadata.HasValidators = true; - return; + + if (context.Key.MetadataKind == ModelMetadataKind.Property) + { + // For properties, additionally determine that if there's validators defined exclusively + // from property attributes. This is later used to produce a error for record types + // where a record type property that is bound as a parameter defines validation attributes. + + if (!(context.PropertyAttributes is IList propertyAttributes)) + { + propertyAttributes = context.PropertyAttributes.ToList(); + } + + if (provider.HasValidators(typeof(object), propertyAttributes)) + { + context.ValidationMetadata.PropertyHasValidators = true; + } + } } } diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/ValidationMetadata.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/ValidationMetadata.cs index d205fdf17257..0785f720f974 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/ValidationMetadata.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Metadata/ValidationMetadata.cs @@ -46,5 +46,10 @@ public class ValidationMetadata /// Gets a value that indicates if the model has validators . /// public bool? HasValidators { get; set; } + + /// + /// Gets or sets a value that determines if validators can be constructed using metadata on properties. + /// + internal bool PropertyHasValidators { get; set; } } -} \ No newline at end of file +} diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs b/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs index bc2f84b23575..8e7e6bbcf4e6 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/ModelBindingHelper.cs @@ -268,6 +268,12 @@ public static async Task TryUpdateModelAsync( } var modelMetadata = metadataProvider.GetMetadataForType(modelType); + + if (modelMetadata.BoundConstructor != null) + { + throw new NotSupportedException(Resources.FormatTryUpdateModel_RecordTypeNotSupported(nameof(TryUpdateModelAsync), modelType)); + } + var modelState = actionContext.ModelState; var modelBindingContext = DefaultModelBindingContext.CreateBindingContext( diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs index e9a17b5a4beb..ec1f794c3781 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/DefaultComplexObjectValidationStrategy.cs @@ -58,6 +58,7 @@ public Enumerator( } else { + _modelMetadata.ThrowIfRecordTypeHasValidationOnProperties(); _parameters = _modelMetadata.BoundConstructor.BoundConstructorParameters; } diff --git a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationVisitor.cs b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationVisitor.cs index ba2bbcf21490..79108314f378 100644 --- a/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationVisitor.cs +++ b/src/Mvc/Mvc.Core/src/ModelBinding/Validation/ValidationVisitor.cs @@ -304,6 +304,11 @@ private bool VisitImplementation(ref ModelMetadata metadata, ref string key, obj else if (metadata.HasValidators == false && ModelState.GetFieldValidationState(key) != ModelValidationState.Invalid) { + if (metadata.BoundConstructor != null) + { + metadata.ThrowIfRecordTypeHasValidationOnProperties(); + } + // No validators will be created for this graph of objects. Mark it as valid if it wasn't previously validated. var entries = ModelState.FindKeysWithPrefix(key); foreach (var item in entries) diff --git a/src/Mvc/Mvc.Core/src/Resources.resx b/src/Mvc/Mvc.Core/src/Resources.resx index 2ae174341060..acdcf3cb995c 100644 --- a/src/Mvc/Mvc.Core/src/Resources.resx +++ b/src/Mvc/Mvc.Core/src/Resources.resx @@ -534,4 +534,7 @@ No property found that maps to constructor parameter '{0}' for type '{1}'. Validation requires that each bound parameter of a record type's primary constructor must have a property to read the value. + + {0} cannot update a record type model. If a '{1}' must be updated, include it in an object type. + diff --git a/src/Mvc/test/Mvc.FunctionalTests/SystemTextJsonInputFormatterTest.cs b/src/Mvc/test/Mvc.FunctionalTests/SystemTextJsonInputFormatterTest.cs index a81adfeb804c..c59c7369b765 100644 --- a/src/Mvc/test/Mvc.FunctionalTests/SystemTextJsonInputFormatterTest.cs +++ b/src/Mvc/test/Mvc.FunctionalTests/SystemTextJsonInputFormatterTest.cs @@ -17,11 +17,11 @@ public SystemTextJsonInputFormatterTest(MvcTestFixture base.JsonInputFormatter_RoundtripsRecordType(); - [Fact(Skip = "https://github.com/dotnet/runtime/issues/38539")] + [Fact] public override Task JsonInputFormatter_ValidationWithRecordTypes_NoValidationErrors() => base.JsonInputFormatter_ValidationWithRecordTypes_NoValidationErrors(); - [Fact(Skip = "https://github.com/dotnet/runtime/issues/38539")] + [Fact] public override Task JsonInputFormatter_ValidationWithRecordTypes_ValidationErrors() => base.JsonInputFormatter_ValidationWithRecordTypes_ValidationErrors(); } diff --git a/src/Mvc/test/Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs b/src/Mvc/test/Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs index 1487aa7cffbe..1e5ebffeaf87 100644 --- a/src/Mvc/test/Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs +++ b/src/Mvc/test/Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; @@ -1145,7 +1146,7 @@ private record AddressRecord(string Street, string City) } [Fact] - public async Task TryUpdateModel_RecordTypeModel_DoesNotOverwriteConstructorParameters() + public async Task TryUpdateModel_RecordTypeModel_Throws() { // Arrange var testContext = ModelBindingTestHelper.GetTestContext(request => @@ -1160,61 +1161,10 @@ public async Task TryUpdateModel_RecordTypeModel_DoesNotOverwriteConstructorPara }; var oldModel = model; - // Act - var result = await TryUpdateModelAsync(model, string.Empty, testContext); - - // Assert - Assert.True(result); - - // Model - Assert.Same(oldModel, model); - Assert.Equal("DefaultStreet", model.Street); - Assert.Equal("Toronto", model.City); - Assert.Equal("98001", model.ZipCode); - - // ModelState - Assert.True(modelState.IsValid); - Assert.Empty(modelState); - } - - [Fact] - public async Task TryUpdateModel_RecordTypeModel_UpdatesProperties() - { - // Arrange - var testContext = ModelBindingTestHelper.GetTestContext(request => - { - request.QueryString = QueryString.Create("ZipCode", "98007").Add("Street", "SomeStreet"); - }); - - var modelState = testContext.ModelState; - var model = new AddressRecord("DefaultStreet", "Toronto") - { - ZipCode = "98001", - }; - var oldModel = model; - - // Act - var result = await TryUpdateModelAsync(model, string.Empty, testContext); - - // Assert - Assert.True(result); - - // Model - Assert.Same(oldModel, model); - Assert.Equal("DefaultStreet", model.Street); - Assert.Equal("Toronto", model.City); - Assert.Equal("98007", model.ZipCode); + // Act & Assert + var ex = await Assert.ThrowsAsync(() => TryUpdateModelAsync(model, string.Empty, testContext)); + Assert.Equal($"TryUpdateModelAsync cannot update a record type model. If a '{model.GetType()}' must be updated, include it in an object type." , ex.Message); - // ModelState - Assert.True(modelState.IsValid); - - var entry = Assert.Single(modelState); - Assert.Equal("ZipCode", entry.Key); - var state = entry.Value; - Assert.Equal("98007", state.AttemptedValue); - Assert.Equal("98007", state.RawValue); - Assert.Empty(state.Errors); - Assert.Equal(ModelValidationState.Valid, state.ValidationState); } private class ModelWithRecordTypeProperty @@ -1269,7 +1219,7 @@ public async Task TryUpdateModel_RecordTypeProperty() } [Fact] - public async Task TryUpdateModel_RecordTypeProperty_InitializedDoesNotOverwriteConstructorParameters() + public async Task TryUpdateModel_RecordTypePropertyIsOverwritten() { // Arrange var testContext = ModelBindingTestHelper.GetTestContext(request => @@ -1297,19 +1247,33 @@ public async Task TryUpdateModel_RecordTypeProperty_InitializedDoesNotOverwriteC Assert.Same(oldModel, model); Assert.NotNull(model.Address); var address = model.Address; - Assert.Equal("DefaultStreet", address.Street); - Assert.Equal("DefaultCity", address.City); + Assert.Equal("SomeStreet", address.Street); + Assert.Null(address.City); Assert.Equal("98007", address.ZipCode); // ModelState Assert.True(modelState.IsValid); - var entry = Assert.Single(modelState); - var state = entry.Value; - Assert.Equal("98007", state.AttemptedValue); - Assert.Equal("98007", state.RawValue); - Assert.Empty(state.Errors); - Assert.Equal(ModelValidationState.Valid, state.ValidationState); + Assert.Collection( + modelState.OrderBy(kvp => kvp.Key), + kvp => + { + Assert.Equal("Address.Street", kvp.Key); + var state = kvp.Value; + Assert.Equal("SomeStreet", state.AttemptedValue); + Assert.Equal("SomeStreet", state.RawValue); + Assert.Empty(state.Errors); + Assert.Equal(ModelValidationState.Valid, state.ValidationState); + }, + kvp => + { + Assert.Equal("Address.ZipCode", kvp.Key); + var state = kvp.Value; + Assert.Equal("98007", state.AttemptedValue); + Assert.Equal("98007", state.RawValue); + Assert.Empty(state.Errors); + Assert.Equal(ModelValidationState.Valid, state.ValidationState); + }); } private void UpdateRequest(HttpRequest request, string data, string name) diff --git a/src/Mvc/test/Mvc.IntegrationTests/ValidationWithRecordIntegrationTests.cs b/src/Mvc/test/Mvc.IntegrationTests/ValidationWithRecordIntegrationTests.cs index 92865e46bffa..1b4fb23dacda 100644 --- a/src/Mvc/test/Mvc.IntegrationTests/ValidationWithRecordIntegrationTests.cs +++ b/src/Mvc/test/Mvc.IntegrationTests/ValidationWithRecordIntegrationTests.cs @@ -1151,7 +1151,7 @@ public async Task Validation_OverflowException_ShowsInvalidValueMessage_OnSimple Assert.Equal("The value '-123' is not valid.", error.ErrorMessage); } - private record NeverValid(string NeverValidProperty) : IValidatableObject + private record NeverValid(string NeverValidProperty) : IValidatableObject { public IEnumerable Validate(ValidationContext validationContext) { @@ -2298,6 +2298,163 @@ public async Task Validation_InifnitelyRecursiveModel_ValidationOnTopLevelParame private static void Validation_InifnitelyRecursiveModel_ValidationOnTopLevelParameterMethod([Required] RecursiveModel model) { } + private record RecordTypeWithValidatorsOnProperties(string Property1) + { + [Required] + public string Property1 { get; init; } + } + + [Fact] + public async Task Validation_ValidatorsDefinedOnRecordTypeProperties() + { + // Arrange + var modelType = typeof(RecordTypeWithValidatorsOnProperties); + var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); + var modelMetadata = modelMetadataProvider.GetMetadataForType(modelType); + var parameterBinder = ModelBindingTestHelper.GetParameterBinder(modelMetadataProvider); + var expected = $"Record type '{modelType}' has validation metadata defined on property 'Property1' that will be ignored. " + + "'Property1' is a parameter in the record primary constructor and validation metadata must be associated with the constructor parameter."; + + var parameter = new ParameterDescriptor() + { + Name = "parameter", + ParameterType = modelType, + }; + + var testContext = ModelBindingTestHelper.GetTestContext(request => + { + request.QueryString = new QueryString("?Property1=8"); + }); + + var modelState = testContext.ModelState; + + // Act & Assert + var ex = await Assert.ThrowsAsync(() => + parameterBinder.BindModelAsync(parameter, testContext, modelMetadataProvider, modelMetadata)); + + Assert.Equal(expected, ex.Message); + } + + private record RecordTypeWithValidatorsOnPropertiesAndParameters([Required] string Property1) + { + [Required] + public string Property1 { get; init; } + } + + [Fact] + public async Task Validation_ValidatorsDefinedOnRecordTypePropertiesAndParameters() + { + // Arrange + var modelType = typeof(RecordTypeWithValidatorsOnPropertiesAndParameters); + var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); + var modelMetadata = modelMetadataProvider.GetMetadataForType(modelType); + var parameterBinder = ModelBindingTestHelper.GetParameterBinder(modelMetadataProvider); + var expected = $"Record type '{modelType}' has validation metadata defined on property 'Property1' that will be ignored. " + + "'Property1' is a parameter in the record primary constructor and validation metadata must be associated with the constructor parameter."; + + var parameter = new ParameterDescriptor() + { + Name = "parameter", + ParameterType = modelType, + }; + + var testContext = ModelBindingTestHelper.GetTestContext(request => + { + request.QueryString = new QueryString("?Property1=8"); + }); + + var modelState = testContext.ModelState; + + // Act & Assert + var ex = await Assert.ThrowsAsync(() => + parameterBinder.BindModelAsync(parameter, testContext, modelMetadataProvider, modelMetadata)); + + Assert.Equal(expected, ex.Message); + } + + private record RecordTypeWithValidatorsOnMixOfPropertiesAndParameters([Required] string Property1, string Property2) + { + [Required] + public string Property2 { get; init; } + } + + [Fact] + public async Task Validation_ValidatorsDefinedOnMixOfRecordTypePropertiesAndParameters() + { + // Variation of Validation_ValidatorsDefinedOnRecordTypePropertiesAndParameters, but validators + // appear on a mix of properties and parameters. + // Arrange + var modelType = typeof(RecordTypeWithValidatorsOnMixOfPropertiesAndParameters); + var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); + var modelMetadata = modelMetadataProvider.GetMetadataForType(modelType); + var parameterBinder = ModelBindingTestHelper.GetParameterBinder(modelMetadataProvider); + var expected = $"Record type '{modelType}' has validation metadata defined on property 'Property2' that will be ignored. " + + "'Property2' is a parameter in the record primary constructor and validation metadata must be associated with the constructor parameter."; + + var parameter = new ParameterDescriptor() + { + Name = "parameter", + ParameterType = modelType, + }; + + var testContext = ModelBindingTestHelper.GetTestContext(request => + { + request.QueryString = new QueryString("?Property1=8"); + }); + + var modelState = testContext.ModelState; + + // Act & Assert + var ex = await Assert.ThrowsAsync(() => + parameterBinder.BindModelAsync(parameter, testContext, modelMetadataProvider, modelMetadata)); + + Assert.Equal(expected, ex.Message); + } + + private record RecordTypeWithPropertiesAndParameters([Required] string Property1) + { + [Required] + public string Property2 { get; init; } + } + + [Fact] + public async Task Validation_ValidatorsOnParametersAndProperties() + { + // Arrange + var modelType = typeof(RecordTypeWithPropertiesAndParameters); + var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); + var modelMetadata = modelMetadataProvider.GetMetadataForType(modelType); + var parameterBinder = ModelBindingTestHelper.GetParameterBinder(modelMetadataProvider); + + var parameter = new ParameterDescriptor() + { + Name = "parameter", + ParameterType = modelType, + }; + + var testContext = ModelBindingTestHelper.GetTestContext(request => + { + request.QueryString = new QueryString("?Property1=SomeValue"); + }); + + var modelState = testContext.ModelState; + + // Act + var modelBindingResult = await parameterBinder.BindModelAsync(parameter, testContext); + + Assert.Equal(2, modelState.Count); + Assert.Equal(1, modelState.ErrorCount); + Assert.False(modelState.IsValid); + + var entry = Assert.Single(modelState, e => e.Key == "Property1").Value; + Assert.Equal("SomeValue", entry.AttemptedValue); + Assert.Equal("SomeValue", entry.RawValue); + Assert.Equal(ModelValidationState.Valid, entry.ValidationState); + + entry = Assert.Single(modelState, e => e.Key == "Property2").Value; + Assert.Equal(ModelValidationState.Invalid, entry.ValidationState); + } + private static void AssertRequiredError(string key, ModelError error) { Assert.Equal(ValidationAttributeUtil.GetRequiredErrorMessage(key), error.ErrorMessage); From 31bd4d4b1d9b2dc8082a150547cd3e06837f7fc4 Mon Sep 17 00:00:00 2001 From: Doug Bunting <6431421+dougbu@users.noreply.github.com> Date: Fri, 28 Aug 2020 09:53:20 -0700 Subject: [PATCH 22/25] [release/5.0] Correct baseline checks (#25227) - mostly duplicates #25217 - update `BaselineGenerator` to produce baselines useful in 6.0 (too) - update Baseline.Designer.props using new generator (matching 3.1.7 release) - always suppress references expressed only in `*.nuspec` files - needed even in servicing builds - restore warning and errors about removed references (new for 5.0) - adjust exclusions to handle `@(_ProjectReferenceByAssemblyName)` removal nit: do not generate empty `` elements * Correct `@(SuppressBaselineReference)` items - remove out-of-date `@(SuppressBaselineReference)` items - either 3.1.7 baselines we're using don't include reference or still using package - fix some comments and `Condition` attributes to make remainder easy to find - add missing `@(SuppressBaselineReference)` items --- eng/Baseline.Designer.props | 100 ++++++++---------- eng/targets/ResolveReferences.targets | 22 +++- eng/tools/BaselineGenerator/Program.cs | 40 +++++-- .../Microsoft.AspNetCore.Components.csproj | 14 ++- ...t.AspNetCore.Components.WebAssembly.csproj | 12 ++- ...Microsoft.AspNetCore.DataProtection.csproj | 1 - .../src/Microsoft.AspNetCore.TestHost.csproj | 5 + .../Microsoft.AspNetCore.Http.Features.csproj | 5 + ...icrosoft.Extensions.Identity.Stores.csproj | 1 - ...etCore.Identity.Specification.Tests.csproj | 4 - .../Microsoft.AspNetCore.Identity.UI.csproj | 5 + ...AspNetCore.Connections.Abstractions.csproj | 8 ++ ...soft.AspNetCore.SignalR.Client.Core.csproj | 6 +- ....AspNetCore.Http.Connections.Common.csproj | 8 -- ...t.AspNetCore.SignalR.Protocols.Json.csproj | 5 - ...Microsoft.AspNetCore.SignalR.Common.csproj | 8 -- .../src/dotnet-sql-cache.csproj | 3 - 17 files changed, 139 insertions(+), 108 deletions(-) diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index c4f0bf31d397..d3894b52f088 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -8,12 +8,10 @@ 3.0.3 - 3.0.3 - 3.1.7 @@ -29,7 +27,7 @@ 3.1.7 - + @@ -48,7 +46,7 @@ 3.1.7 - + @@ -56,7 +54,7 @@ 3.1.7 - + @@ -64,53 +62,48 @@ 3.1.7 - 3.1.7 - 3.1.7 - 3.1.7 - + 3.1.7 - 3.1.7 - + 3.1.7 - + 3.1.7 - 3.1.7 - + @@ -118,7 +111,7 @@ 3.1.7 - + @@ -132,7 +125,7 @@ 3.1.7 - + @@ -147,7 +140,7 @@ 3.1.7 - + @@ -160,7 +153,7 @@ - + @@ -173,7 +166,7 @@ 3.1.7 - + @@ -185,7 +178,7 @@ 3.1.7 - + @@ -196,7 +189,7 @@ 3.1.7 - + @@ -230,7 +223,6 @@ 3.2.1 - 3.2.1 @@ -243,7 +235,6 @@ 3.2.1 - 3.2.1 @@ -255,7 +246,7 @@ 3.1.7 - + @@ -263,7 +254,7 @@ 3.1.7 - + @@ -280,8 +271,6 @@ 3.1.7 - - 3.1.7 @@ -289,7 +278,7 @@ - + @@ -299,7 +288,7 @@ 3.1.7 - + @@ -324,8 +313,6 @@ 3.1.7 - - 3.1.7 @@ -356,7 +343,7 @@ 3.1.7 - + @@ -376,14 +363,14 @@ 3.1.7 - + 3.1.7 - + @@ -391,7 +378,7 @@ 3.1.7 - + @@ -412,7 +399,7 @@ 3.1.7 - + @@ -423,7 +410,7 @@ 3.1.7 - + @@ -435,7 +422,7 @@ 3.1.7 - + @@ -447,7 +434,7 @@ 3.1.7 - + @@ -458,7 +445,7 @@ 3.1.7 - + @@ -475,20 +462,18 @@ 3.1.7 - - 3.1.7 - + 3.1.7 - + @@ -497,7 +482,7 @@ 3.1.7 - + @@ -506,7 +491,7 @@ 3.1.7 - + @@ -515,7 +500,7 @@ 3.1.7 - + @@ -523,12 +508,11 @@ 3.1.7 - 3.1.7 - + @@ -565,7 +549,7 @@ 3.1.7 - + @@ -578,7 +562,7 @@ 3.1.7 - + @@ -604,7 +588,7 @@ 3.1.7 - + @@ -616,7 +600,7 @@ 3.1.7 - + @@ -625,14 +609,14 @@ 3.1.7 - + 3.1.7 - + @@ -640,7 +624,7 @@ 3.1.7 - + @@ -684,7 +668,7 @@ 3.1.7 - + @@ -698,7 +682,7 @@ 3.1.7 - + diff --git a/eng/targets/ResolveReferences.targets b/eng/targets/ResolveReferences.targets index 646a526c8161..fe8224d1988d 100644 --- a/eng/targets/ResolveReferences.targets +++ b/eng/targets/ResolveReferences.targets @@ -175,9 +175,15 @@ - - + Exclude="@(Reference);@(PackageReference);@(ProjectReference->'%(Filename)')" /> + + + + + + + + + + ", "The NuGet source of packages to fetch", CommandOptionType.SingleValue); + _source = Option( + "-s|--package-source ", + "The NuGet source of packages to fetch", + CommandOptionType.SingleValue); _output = Option("-o|--output ", "The generated file output path", CommandOptionType.SingleValue); _update = Option("-u|--update", "Regenerate the input (Baseline.xml) file.", CommandOptionType.NoValue); @@ -45,9 +48,6 @@ public Program() private async Task Run() { - var source = _source.HasValue() - ? _source.Value().TrimEnd('/') - : "https://api.nuget.org/v3/index.json"; if (_output.HasValue() && _update.HasValue()) { await Error.WriteLineAsync("'--output' and '--update' options must not be used together."); @@ -56,6 +56,7 @@ private async Task Run() var inputPath = Path.Combine(Directory.GetCurrentDirectory(), "Baseline.xml"); var input = XDocument.Load(inputPath); + var source = _source.HasValue() ? _source.Value().TrimEnd('/') : "https://api.nuget.org/v3/index.json"; var packageSource = new PackageSource(source); var providers = Repository.Provider.GetCoreV3(); // Get v2 and v3 API support var sourceRepository = new SourceRepository(packageSource, providers); @@ -89,6 +90,11 @@ private async Task Run() var baselineVersion = input.Root.Attribute("Version").Value; + // Baseline and .NET Core versions always align in non-preview releases. + var parsedVersion = Version.Parse(baselineVersion); + var defaultTarget = ((parsedVersion.Major < 5) ? "netcoreapp" : "net") + + $"{parsedVersion.Major}.{parsedVersion.Minor}"; + var doc = new XDocument( new XComment(" Auto generated. Do not edit manually, use eng/tools/BaselineGenerator/ to recreate. "), new XElement("Project", @@ -136,12 +142,34 @@ private async Task Run() foreach (var group in reader.NuspecReader.GetDependencyGroups()) { - var itemGroup = new XElement("ItemGroup", new XAttribute("Condition", $" '$(PackageId)' == '{id}' AND '$(TargetFramework)' == '{group.TargetFramework.GetShortFolderName()}' ")); + // Don't bother generating empty ItemGroup elements. + if (group.Packages.Count() == 0) + { + continue; + } + + // Handle changes to $(DefaultNetCoreTargetFramework) even if some projects are held back. + var targetCondition = $"'$(TargetFramework)' == '{group.TargetFramework.GetShortFolderName()}'"; + if (string.Equals( + group.TargetFramework.GetShortFolderName(), + defaultTarget, + StringComparison.OrdinalIgnoreCase)) + { + targetCondition = + $"('$(TargetFramework)' == '$(DefaultNetCoreTargetFramework)' OR {targetCondition})"; + } + + var itemGroup = new XElement( + "ItemGroup", + new XAttribute("Condition", $" '$(PackageId)' == '{id}' AND {targetCondition} ")); doc.Root.Add(itemGroup); foreach (var dependency in group.Packages) { - itemGroup.Add(new XElement("BaselinePackageReference", new XAttribute("Include", dependency.Id), new XAttribute("Version", dependency.VersionRange.ToString()))); + itemGroup.Add( + new XElement("BaselinePackageReference", + new XAttribute("Include", dependency.Id), + new XAttribute("Version", dependency.VersionRange.ToString()))); } } } diff --git a/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj b/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj index 1e7f881ed501..110ed5f7ae81 100644 --- a/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj +++ b/src/Components/Components/src/Microsoft.AspNetCore.Components.csproj @@ -17,11 +17,17 @@ - + - - - + + + diff --git a/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj b/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj index 906e03fe82e6..cf30c9c9e2e1 100644 --- a/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj +++ b/src/Components/WebAssembly/WebAssembly/src/Microsoft.AspNetCore.Components.WebAssembly.csproj @@ -1,4 +1,4 @@ - + $(DefaultNetCoreTargetFramework) @@ -15,9 +15,13 @@ - - - + diff --git a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj index 8a207fb49174..8f16e3348034 100644 --- a/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj +++ b/src/DataProtection/DataProtection/src/Microsoft.AspNetCore.DataProtection.csproj @@ -29,7 +29,6 @@ - diff --git a/src/Hosting/TestHost/src/Microsoft.AspNetCore.TestHost.csproj b/src/Hosting/TestHost/src/Microsoft.AspNetCore.TestHost.csproj index b4465d4958a7..45f833b2f3c3 100644 --- a/src/Hosting/TestHost/src/Microsoft.AspNetCore.TestHost.csproj +++ b/src/Hosting/TestHost/src/Microsoft.AspNetCore.TestHost.csproj @@ -13,4 +13,9 @@ + + + + + diff --git a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj index aff4e11d9d2c..d6e93d7b0212 100644 --- a/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj +++ b/src/Http/Http.Features/src/Microsoft.AspNetCore.Http.Features.csproj @@ -20,4 +20,9 @@ + + + + + diff --git a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj index 380bf7818c8f..367a0069f14a 100644 --- a/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj +++ b/src/Identity/Extensions.Stores/src/Microsoft.Extensions.Identity.Stores.csproj @@ -13,7 +13,6 @@ - diff --git a/src/Identity/Specification.Tests/src/Microsoft.AspNetCore.Identity.Specification.Tests.csproj b/src/Identity/Specification.Tests/src/Microsoft.AspNetCore.Identity.Specification.Tests.csproj index ab593d04a163..ba7e177bfbd0 100644 --- a/src/Identity/Specification.Tests/src/Microsoft.AspNetCore.Identity.Specification.Tests.csproj +++ b/src/Identity/Specification.Tests/src/Microsoft.AspNetCore.Identity.Specification.Tests.csproj @@ -20,8 +20,4 @@ - - - - diff --git a/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj b/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj index fb2f0d6eaae9..685ffe67b5f7 100644 --- a/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj +++ b/src/Identity/UI/src/Microsoft.AspNetCore.Identity.UI.csproj @@ -42,6 +42,11 @@ + + + + + diff --git a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj index 943461e7f76a..b9614fcb0221 100644 --- a/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj +++ b/src/Servers/Connections.Abstractions/src/Microsoft.AspNetCore.Connections.Abstractions.csproj @@ -23,4 +23,12 @@ + + + + + diff --git a/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj b/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj index cc35aef6bdfb..504f2e454992 100644 --- a/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj +++ b/src/SignalR/clients/csharp/Client.Core/src/Microsoft.AspNetCore.SignalR.Client.Core.csproj @@ -27,9 +27,9 @@ - - - + + + diff --git a/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj b/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj index 3ecebb0f5c48..02f97edfb68c 100644 --- a/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj +++ b/src/SignalR/common/Http.Connections.Common/src/Microsoft.AspNetCore.Http.Connections.Common.csproj @@ -23,12 +23,4 @@ - - - - - - - - diff --git a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj index afe8cf0816ef..cae05aae1122 100644 --- a/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj +++ b/src/SignalR/common/Protocols.Json/src/Microsoft.AspNetCore.SignalR.Protocols.Json.csproj @@ -23,9 +23,4 @@ - - - - - diff --git a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj index 730549a8d9d6..1206aeed6833 100644 --- a/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj +++ b/src/SignalR/common/SignalR.Common/src/Microsoft.AspNetCore.SignalR.Common.csproj @@ -33,14 +33,6 @@ - - - - - - - - diff --git a/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj b/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj index bedcf8c05199..24f2823009cf 100644 --- a/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj +++ b/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj @@ -15,9 +15,6 @@ - - - From 3c3995f65388fc584c0f99c91ee1eef509ed782e Mon Sep 17 00:00:00 2001 From: Safia Abdalla Date: Fri, 28 Aug 2020 17:29:24 +0000 Subject: [PATCH 23/25] Add media type mappings for .blat files (#25284) --- src/Components/WebAssembly/Sdk/src/targets/BlazorWasm.web.config | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Components/WebAssembly/Sdk/src/targets/BlazorWasm.web.config b/src/Components/WebAssembly/Sdk/src/targets/BlazorWasm.web.config index c16575f7519c..c461dc0b3d06 100644 --- a/src/Components/WebAssembly/Sdk/src/targets/BlazorWasm.web.config +++ b/src/Components/WebAssembly/Sdk/src/targets/BlazorWasm.web.config @@ -9,6 +9,7 @@ + From d0da0637f042cfe9432deacbb2624fac3c32aaad Mon Sep 17 00:00:00 2001 From: "dotnet-maestro[bot]" <42748379+dotnet-maestro[bot]@users.noreply.github.com> Date: Fri, 28 Aug 2020 18:02:26 +0000 Subject: [PATCH 24/25] [release/5.0] Update dependencies from dotnet/efcore (#25349) [release/5.0] Update dependencies from dotnet/efcore - Updates: - Microsoft.EntityFrameworkCore.Tools: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - Microsoft.EntityFrameworkCore.SqlServer: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - dotnet-ef: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - Microsoft.EntityFrameworkCore: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - Microsoft.EntityFrameworkCore.Design: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - Microsoft.EntityFrameworkCore.Relational: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - Microsoft.EntityFrameworkCore.Sqlite: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 - Microsoft.EntityFrameworkCore.InMemory: from 5.0.0-rc.1.20428.1 to 5.0.0-rc.1.20428.3 --- eng/Version.Details.xml | 32 ++++++++++++++++---------------- eng/Versions.props | 16 ++++++++-------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml index 69c68697c8df..4a952f3855c4 100644 --- a/eng/Version.Details.xml +++ b/eng/Version.Details.xml @@ -13,37 +13,37 @@ https://github.com/dotnet/blazor cc449601d638ffaab58ae9487f0fd010bb178a12 - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec - + https://github.com/dotnet/efcore - ce2c24a337ab67316ff191c41ff88cdca0192841 + f76334c60ceebb3c4255cf803558c2d166cd98ec https://github.com/dotnet/runtime diff --git a/eng/Versions.props b/eng/Versions.props index b562c9aa9652..b7afd659e901 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -135,14 +135,14 @@ 3.2.0 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 - 5.0.0-rc.1.20428.1 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + 5.0.0-rc.1.20428.3 + +