Git Product home page Git Product logo

framework's Introduction

.NET Boxed Banner

Twitter URL Twitter Follow

.NET Core Extensions and Helper NuGet packages. If you are looking for the .NET Boxed project templates, you can find them here.

Boxed.Mapping Boxed.Mapping package in dotnet-boxed feed in Azure Artifacts Boxed.Mapping NuGet Package Downloads

Boxed.AspNetCore Boxed.AspNetCore package in dotnet-boxed feed in Azure Artifacts Boxed.AspNetCore NuGet Package Downloads

Boxed.AspNetCore.Swagger Boxed.AspNetCore.Swagger package in dotnet-boxed feed in Azure Artifacts Boxed.AspNetCore.Swagger NuGet Package Downloads

Boxed.AspNetCore.TagHelpers Boxed.AspNetCore.TagHelpers package in dotnet-boxed feed in Azure Artifacts Boxed.AspNetCore.TagHelpers NuGet Package Downloads

Boxed.DotnetNewTest Boxed.DotnetNewTest package in dotnet-boxed feed in Azure Artifacts Boxed.DotnetNewTest NuGet Package Downloads

Continuous Integration

Name Operating System Status History
Azure Pipelines Ubuntu Azure Pipelines Ubuntu Build Status
Azure Pipelines Mac Azure Pipelines Mac Build Status
Azure Pipelines Windows Azure Pipelines Windows Build Status
Azure Pipelines Overall Azure Pipelines Overall Build Status Azure DevOps Build History
GitHub Actions Ubuntu, Mac & Windows GitHub Actions Status GitHub Actions Build History
AppVeyor Ubuntu, Mac & Windows AppVeyor Build Status AppVeyor Build History

Contributions and Thanks

Please view the contributing guide for more information.

  • VictorioBerra - Helping to create the Boxed.DotnetNewTest NuGet package.

framework's People

Contributors

alexrp avatar andycook71 avatar ariellourenco avatar cannehag avatar dependabot-preview[bot] avatar dependabot-support avatar dependabot[bot] avatar johanndev avatar michalstanko avatar miroslavpopovic avatar rehansaeed avatar renovate-bot avatar renovate[bot] avatar vexharbinger avatar victorioberra avatar xperiandri avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

framework's Issues

[Boxed.DotnetNewTest] Mismatched ports when testing ASP.NET Core templates

Describe the bug

I'm trying to test my ASP.NET Core project template to ensure that all appropriate endpoints are available as expected. Unfortunately, the readinessCheck delegate in DotnetRunAsync never completes successfully and is cancelled after 2 min.

After stepping through the code, I observed that the automatically chosen ports are never propagated to the ASP.NET Core application. The app rather uses the automatically chosen ports (configured in launchsettings.json). The automatically configured HttpClients in the readinessCheck lambda have their baseUrls set to the ports determined by the PortHelper.GetFreeTcpPort() helper chosen during DotnetNewAsync.

Accessing the endpoint shown in the console window (enabled via showShellWindow: true) shows that the app was successfully started and the endpoints can be reached.

A solution could be to pass the ports determined by PortHelper.GetFreeTcpPort() via the --urls Argument to dotnet run.

Steps to reproduce

  1. Create a new xunit test project
  2. Add the following test case:
    public async Task Run_DefaultArguments_IsSuccessful()
    {
    	await using var tempDirectory = TempDirectory.NewTempDirectory();
    	var project = await tempDirectory.DotnetNewAsync("webapi", "DefaultArguments");
    	await project.DotnetRestoreAsync();
    	await project.DotnetBuildAsync();
    	await project.DotnetRunAsync(
    		projectRelativeDirectoryPath: "",
    		readinessCheck: async (httpClient, httpsClient) =>
    		{
    			var httpResponse = await httpsClient.GetAsync("weatherforecast");
    			return httpResponse.IsSuccessStatusCode;
    		},
    		action: async (httpClient, httpsClient) =>
    		{
    			var httpResponse = await httpsClient.GetAsync("weatherforecast");
    			Assert.Equal(HttpStatusCode.OK, httpResponse.StatusCode);
    		},
    		showShellWindow: true);
    }
  3. Run the test
  4. Observe that the test never completes, but is cancelled after approx. 2 min

Expected behaviour

The basic test case can be successfully executed.

Make "name" in DotnetNewAsync optional

Make "name" in DotnetNewAsync extension method optional

On Boxed.DotnetNewTest.TempDirectoryExtensions make argument name optional or nullable, to be able to test scenarios where preferNameDirectory is set to true.

At the moment, name is a required field that cannot be set to null. The default behavior of dotnet new when the --name parameter is passed is to create a subfolder at the root with the given name, and then incorporate the contents of the template. However, in when --name is not passed, the folder is not created and the root's name is taken as --name by default.

This last scenario cannot be tested with the current tooling.

NRE in GetPolicyRequirements()

Bare with me here, because I dont have a TON of information because I am encountering this error when I use another library called PolicyServer.

The NRE happens on this line:
https://github.com/Dotnet-Boxed/Framework/blob/master/Source/Boxed.AspNetCore.Swagger/FilterDescriptorExtensions.cs#L25

I get an NRE on that line, Policy is null because of the above library. I think we need to code more defensively here somehow. I believe the error is somewhere in here https://github.com/PolicyServer/PolicyServer.Local/blob/dev/src/PolicyServer.Local/AspNetCore/AuthorizationPolicyProvider.cs

Somehow, PolicyServer is creating its own handler and requirements. But I am not sure whats wrong. Why would Policy be blank? Maybe there is no policy? I mentioned this over in https://github.com/PolicyServer/PolicyServer.Local/issues/17

Boxed.Mapping Unity3D support

Describe the feature

I want to use Boxed.Mapping in my Unity project, but it uses Expression.Lambda.Compile from System.Linq.Expressions here. Since compiling the game to mobile platforms requires AOT compiling, Unity forbids the usage of this method. Is it really necessary there? Is it possible to switch to plain new()?

Dependency Dashboard

This issue lists Renovate updates and detected dependencies. Read the Dependency Dashboard docs to learn more.

Rate-Limited

These updates are currently rate-limited. Click on a checkbox below to force their creation now.

  • Update dependency Moq to 4.20.72
  • Update dependency StyleCop.Analyzers to 1.2.0-beta.556
  • Update dependency coverlet.collector to 6.0.2
  • Update actions/upload-artifact action to v3.2.1
  • Update dependency DotNet.ReproducibleBuilds to 1.2.4
  • Update dependency JunitXml.TestLogger to 3.1.12
  • Update dependency Swashbuckle.AspNetCore to 6.7.3
  • Update GitHub Artifact Actions to v4 (major) (actions/download-artifact, actions/upload-artifact)
  • Update actions/setup-dotnet action to v4
  • Update dependency AutoMapper to v13
  • Update dependency JunitXml.TestLogger to v4
  • Update dependency MinVer to v6
  • Update github/codeql-action action to v3
  • Update release-drafter/release-drafter action to v6
  • ๐Ÿ” Create all rate-limited PRs at once ๐Ÿ”

Open

These updates have all been created already. Click a checkbox below to force a retry/rebase of any.

Detected dependencies

cake
build.cake
github-actions
.github/workflows/build.yml
  • actions/checkout v4.1.0
  • actions/setup-dotnet v3.2.0
  • actions/upload-artifact v3.1.3
  • actions/download-artifact v3.0.2
  • test-summary/action v2
  • actions/download-artifact v3.0.2
  • actions/download-artifact v3.0.2
.github/workflows/codeql-analysis.yml
  • actions/checkout v4.1.0
  • github/codeql-action v2
  • github/codeql-action v2
  • github/codeql-action v2
.github/workflows/release-drafter.yml
  • release-drafter/release-drafter v5.24.0
  • release-drafter/release-drafter v5.24.0
  • release-drafter/release-drafter v5.24.0
nuget
Benchmarks/Boxed.Mapping.Benchmark/Boxed.Mapping.Benchmark.csproj
  • BenchmarkDotNet 0.13.8
  • AutoMapper 12.0.1
Directory.Build.props
  • StyleCop.Analyzers 1.2.0-beta.507
  • MinVer 4.3.0
  • Microsoft.VisualStudio.Threading.Analyzers 17.7.30
Source/Boxed.AspNetCore.Swagger/Boxed.AspNetCore.Swagger.csproj
  • Swashbuckle.AspNetCore 6.0.0
  • Microsoft.AspNetCore.JsonPatch 6.0.0
  • Swashbuckle.AspNetCore 6.5.0
  • Microsoft.AspNetCore.JsonPatch 7.0.0
Source/Boxed.DotnetNewTest/Boxed.DotnetNewTest.csproj
  • Microsoft.AspNetCore.Mvc.Testing 6.0.0
  • Microsoft.AspNetCore.Mvc.Testing 7.0.0
Source/Directory.Build.props
  • DotNet.ReproducibleBuilds 1.1.1
Tests/Boxed.Mapping.Test/Boxed.Mapping.Test.csproj
  • System.Linq.Async 6.0.1
Tests/Directory.Build.props
  • xunit.runner.visualstudio 2.5.1
  • xunit 2.5.1
  • Moq 4.20.69
  • Microsoft.NET.Test.Sdk 17.7.2
  • JunitXml.TestLogger 3.0.134
  • coverlet.collector 6.0.0
dotnet-tools.json
  • cake.tool 3.1.0
global.json
  • dotnet-sdk 7.0.401

  • Check this box to trigger a request for Renovate to run again on this repository

Problem with UseInternalServerErrorOnException/InternalServerErrorOnExceptionMiddleware

On the production site that uses this Boilerplate I temporary turned stdout logging, and I see random errors like the one below. Looks like InternalServerErrorOnExceptionMiddleware is being called, but it's failing because the response code is already set. Is there a workaround for this issue? I can't even figure out what is causing this random 500 error....

Thanks.

info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[2]
Executed action PSA_Public_Site.Controllers.ps.Get (PSA_Public_Site) in 127.0757ms
info: Boilerplate.AspNetCore.Middleware.InternalServerErrorOnExceptionMiddleware[0]
Executing InternalServerErrorOnExceptionMiddleware, setting HTTP status code 500.
fail: Microsoft.AspNetCore.Server.Kestrel[13]
Connection id "0HL0ITDU5M447": An unhandled exception was thrown by the application.
System.InvalidOperationException: StatusCode cannot be set, response has already started.

at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.ThrowResponseAlreadyStartedException(String value)
at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.set_StatusCode(Int32 value)
at Boilerplate.AspNetCore.Middleware.InternalServerErrorOnExceptionMiddleware.d__2.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.d__8.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Hosting.Internal.RequestServicesContainerMiddleware.d__3.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame`1.d__2.MoveNext()

Where is the documentation for Dotnet-Boxed?

I checked the GitHub and the Blog and cannot find detailed documentation anywhere. I think this is something incredibly important to have and it should be front and center in the README.md

Updated to Core 2.1 and now I get this error: `Application startup exception: System.MissingMethodException: Method not found: 'Void Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenOptions.IncludeXmlComments(System.String)'.`

Application startup exception: System.MissingMethodException: Method not found: 'Void Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenOptions.IncludeXmlComments(System.String)'.
   at Boilerplate.AspNetCore.Swagger.SwaggerGenOptionsExtensions.IncludeXmlCommentsIfExists(SwaggerGenOptions options, String filePath)
   at Boilerplate.AspNetCore.Swagger.SwaggerGenOptionsExtensions.IncludeXmlCommentsIfExists(SwaggerGenOptions options, Assembly assembly)
   at WuitCMDB.API.ServiceCollectionExtensions.<>c__DisplayClass8_0.<AddSwagger>b__0(SwaggerGenOptions options) in C:\Source\MyApp\ServiceCollectionExtensions.cs:line 192
   at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
   at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
   at Microsoft.Extensions.Options.OptionsManager`1.<>c__DisplayClass5_0.<Get>b__0()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at Microsoft.Extensions.Options.OptionsCache`1.GetOrAdd(String name, Func`1 createOptions)
   at Microsoft.Extensions.Options.OptionsManager`1.Get(String name)
   at Microsoft.Extensions.Options.OptionsManager`1.get_Value()
   at Microsoft.Extensions.DependencyInjection.SwaggerGenServiceCollectionExtensions.CreateSwaggerProvider(IServiceProvider serviceProvider)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType)
   at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
   at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass4_0.<UseMiddleware>b__0(RequestDelegate next)
   at Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder.Build()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
DevConf [17:30:16 Fatal] Microsoft.AspNetCore.Hosting.Internal.WebHost

Mapping Immutable Types

Hi.

Is there exists a way to map enum types? For example I have two enums A and B and want to map A to B.

public enum A
{
	A1 = 0,
	A2 = 1
}

public enum B
{
	B1 = 0,
	B2 = 1
}

internal sealed class SomeMapper : IMapper<A, B>
{
	public void Map(A source, B destination) =>
		destination = source switch
		{
			A.A1 => B.B1,
			A.A2 => B.B2,
			_ => throw new ArgumentException("Unknown enum value", nameof(source)),
		};
}

new SomeMapper(A2).Map(src); // Here is always B1 as default value for B.

Have I missed something or there is no way to map value types?

InvalidCastException When Using Tag Helper

I am trying to use the asp-subresource-integrity-src tag helper in my _Layout page. I did not use the Boilerplate project template because, for now, I am only taking advantage of the SRI features. My _ViewImports.cshtml file looks like this:

@using MyApp
@using Boilerplate.AspNetCore.TagHelpers

@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@addTagHelper *, Boilerplate.AspNetCore.TagHelpers

and my _Layout.cshtml file includes <script> elements like the following:

<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"
        asp-subresource-integrity-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
        asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.min.js"
        asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal">
</script>

Unfortunately, when I run the application from the command line with dotnet MyApp.dll and navigate to localhost:5000, I get the following stack trace:

fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HL5SP6T01RHV": An unhandled exception was thrown by the application.
System.InvalidCastException: Unable to cast object of type '<GetFlags>d__19' to type 'System.Collections.Generic.IEnumerable`1[Boilerplate.AspNetCore.TagHelpers.SubresourceIntegrityHashAlgorithm]'.
   at Boilerplate.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper.GetSpaceDelimetedSri(Byte[] bytes, SubresourceIntegrityHashAlgorithm hashAlgorithms)
   at Boilerplate.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper.<ProcessAsync>d__17.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.<RunAsync>d__0.MoveNext()

    . . .
    A ton more ExceptionDispatchInfo.Throw() blocks similar to the above, from various Microsoft.AspNetCore.Mvc locations.
    . . .

It looks like Boilerplate is having some kind of trouble parsing my SubresourceIntegrityHashAlgorithm values since I didn't provide any. But according to this post from @RehanSaeed's blog, I shouldn't need to provide any algorithms explicitly. I'm guessing that I just forgot a @using statement or something, but I'm at a loss. Any help would be appreciated!

Boxed.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper v4.0 with .net core 3.1

Firstly thank you for a great project.

Describe the bug

I've been using your Boxed.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper for a while, but I ran into an issue when I recently updated to .net core 3.1 using your v4.0.0 of the library.

It actually threw an unhandled exception. It seems the wrong path is used
Version 3.2.0 is OK, version 4.0.0 causes issues for me

...Deployments\Foo\Staging\Foo.Web\js\vendor\jquery.min.js'. doesn't seem to have the wwroot like as follows: Deployments\Foo\Staging\Foo.Web\wwroot\js\vendor\jquery.min.js'.

fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
      An unhandled exception has occurred while executing the request.
System.IO.DirectoryNotFoundException: Could not find a part of the path 'C:\Programming\Deployments\Foo\Staging\Foo.Web\js\vendor\jquery.min.js'.

   at System.IO.FileStream.ValidateFileHandle(SafeFileHandle fileHandle)

   at System.IO.FileStream.CreateFileOpenHandle(FileMode mode, FileShare share, FileOptions options)

   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)

   at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize)

   at System.IO.File.ReadAllBytes(String path)

   at Boxed.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper.ReadAllBytes(String filePath)

   at Boxed.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper.GetSubresourceIntegrityFromContentFile(String contentPath, SubresourceIntegrityHashAlgorithm hashAlgorithms)

   at Boxed.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper.ProcessAsync(TagHelperContext context, TagHelperOutput output)

   at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperRunner.<RunAsync>g__Awaited|0_0(Task task, TagHelperExecutionContext executionContext, Int32 i, Int32 count)

   at AspNetCore.Views_Shared__Layout.<>c__DisplayClass78_0.<<ExecuteAsync>b__31>d.MoveNext() in C:\Programming\GitLab-Runner\builds\aacd9b09\0\thedomainpublisher\Foo\src\foo.Web\Views\Shared\_Layout.cshtml:line 410

--- End of stack trace from previous location where exception was thrown ---

   at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()

   at AspNetCore.Views_Shared__Layout.<>c__DisplayClass78_0.<<ExecuteAsync>b__1>d.MoveNext() in C:\Programming\GitLab-Runner\builds\aacd9b09\0\thedomainpublisher\foo\src\foo.Web\Views\Shared\_Layout.cshtml:line 396

--- End of stack trace from previous location where exception was thrown ---

   at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.SetOutputContentAsync()

A clear and concise description of what the bug is.

To Reproduce

Unfortunately can't give you a test project just yet

Expected behaviour

Shouldn't throw an exception

Migration guide for IAsyncCommand

Describe the feature

Hi,

we are using the IAsyncCommand interfaces from this project, but now they have been removed during NET6 update - without notice.

Is there now a better way to get this functionality?
If yes: It would be nice to have a short migration guide.

Thank you!

[Boxed.DotnetNewTest] Add uninstall command

Describe the feature

Hi there!

First, I wanted to say thanks for your work on these packages - they are all very useful!

I'm currently developing a ASP.NET Core project template and your Boxed.DotnetNewTest package is incredible helpful and a real time saver, compared to manually installing my template over and over again ^^

During development, I sometimes run into problems because the dotnet cli seems to use a stale version of my template; i.e., I change the available symbols in my template.json, but the changes are not picked up on the next run of my unit test.

Uninstalling the template between test runs reliable fixes these problems.

I therefore propose to add a new DotnetNew.UninstallAsync method (similar to the existing DotnewNew.InstallAsync method) to enable users of the library to programmatically uninstall project templates.

I already prepared the necessary changes to the library in a local branch - I would be very happy to open a PR with my changes, if you agree that it would be a useful addition to your library.

Thanks!

Host environment path

Describe the bug

Just found this and was trying out the resource integrity helper in a local dev environment, but was getting an error about the local file not being found.
I did some digging into the source but wasn't sure if this was a bug or if I'm using it wrong. Assuming the intent is to fallback to the local version of a resource if its hash doesn't match that of the CDN, shouldn't the logic in the GetSubresourceIntegrityFromContentFile() be combining the relative path with WebRootPath, not ContentRootPath?

Steps to reproduce

I was trying this with jQuery as a test and was using the below tag

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.4/jquery.min.js"
        asp-subresource-integrity-src="~/js/jquery/jquery.min.js"
        asp-fallback-src="~/js/jquery/jquery.min.js" asp-append-version="true"
        asp-fallback-test="window.jQuery"></script>

Expected behaviour

Was expecting it to output the script tag with a SRI hash

RequestCanceledMiddleware cannot work when url use 0.0.0.0

Describe the bug

When I Set asp.net core's applicationUrl to 'http://0.0.0.0:8080', the RequestCanceledMiddleware not work.
But it is working well in 'http://127.0.0.1:8080' or 'http://localhost:8080'

real ip
localhost
127IP

Steps to reproduce

"profiles": {
    "LTM.Module.CCM.TiehejiService01": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "weatherforecast",
      "applicationUrl": "http://0.0.0.0:5074",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
app.UseHttpException();
app.UseRequestCanceled();

Expected behaviour

none

[Question] IAsyncMapper with EF Core 6

Hello,

I have faced an issue whilst using the provided IAsyncMapper and I was wondering if you could provide some additional information.

I have the following model:

public class Blog
{
  public string Id {get; set;}
  public string Name {get; set;}
}

and the associadted view model:

public class BlogViewModel
{
  public string Name {get; set;}
}

I create and then register the associated mapper as a Scoped Service

public class BlogToBlogViewModelMapper : IAsyncMapper<Blog, BlogViewModel>
{
  private readonly Blogrepository blogrepository;
  public BlogToBlogViewModelMapper (Blogrepository blogrepository)
  {
    this.blogrepository = blogrepository
  }
  
  public async Task MapAsync(Blog source, BlogViewModel destination, CancellationToken token)
  {
    destination.Name = await this.blogrepository.GetBlogName(token);
  }
}

Blogrepository is also registered as a scoped service

Now, in another class where I want to make a mapping

public class Example
{
  private readonly Blogrepository blogrepository;
  private IAsyncMapper<Blog, BlogViewModel> myAsyncMapper;
  public Example(
  Blogrepository blogrepository
  IAsyncMapper<Blog, BlogViewModel> myAsyncMapper)
  {
    this.blogrepository = blogrepository;
    this.myAsyncMapper = myAsyncMapper;
  }

  List<Blog> models = await this.blogrepository.GetBlogs();
  
  List<BlogViewModels> updateModels = await this.myAsyncMapper.MapListAsync(models, CancellationToken.None);
}

when the aforementioned myAsyncMapper.MapListAsync(models, CancellationToken.None); is executed, I get the following error:

A second operation started on this context before a previous operation completed. This is usually caused by different threads using the same instance of DbContext, however instance members are not guaranteed to be thread safe.

I am trying to figure out what is the source of the problem here.

  • Are my services registered with the wrong lifetime? (Both Blogrepository and IAsyncMapper are registered as scoped)
  • Should I create a new DbContext() each time I want to run blogrepository.GetBlogName(token);?

Any information or resource is appreciated

Boxed.AspNetCore.TagHelpers.SubresourceIntegrityTagHelper v5.1.0 - Blazor AspNetCore 5.0 - 5.0.203

Describe the bug

Have installed the Nuget package (5.1.0)

Im not sure I have things set up correctly but the articles don't seem to mention Blazor support specifically and any steps beyond adding the additional attributes to the <script> elements etc.

On inspection of the generated index.htm I see that the adding the script attributes per the articles seems to do noting.
Screen Shot 2021-05-28 at 1 10 58 PM

To Reproduce

A link to some code to reproduce the bug can speed up a fix. Alternatively, show steps to reproduce the behaviour:

  1. installed the Nuget Package
  2. Edited the _Host.cshtml as follows (excerpt):
 <environment exclude="Development">
        <link rel="stylesheet" href="<cdn URL to file>"
              asp-fallback-href="<local path to file>"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute"
              asp-subresource-integrity-src="<local path to file>"
              asp-subresource-integrity-hash-algorithms="SHA256 | SHA384 | SHA512"
              crossorigin="anonymous" />
      </environment>   
  1. Build Blazor App
  2. Connect browser and view page source (see image above)

Perhaps either the tag helps is doing nothing n this context (badly configured) or the Blazor code is not letting the tag helper run ?

Expected behavior

Have the SRI integrity has suitably generated, and assume it removes the asp-subresource-integrity-src and asp-subresource-integrity-hash-algorithms attributes and values.

[TagHelpers] How to use TwitterCard?

Describe the bug

Please, update TwitterCard docs as they are not relevant.
Also, the tag in docs must be autoclosed (trailing slash). Because otherwise, it corrupts HTML if something is bad with tag helper.

Expected behaviour

Copy-pasting from docs allows using TwitterCard tag helper

Unable to resolve service for type 'Microsoft.AspNetCore.Mvc.IUrlHelper'

There is a bug in the SrcSubresourceIntegrityTagHelper
could you implement by UrlHelperFactory, it might solve the problem https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Razor/TagHelpers/UrlResolutionTagHelper.cs#L264

InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Mvc.IUrlHelper' while attempting to activate 'Boilerplate.AspNetCore.TagHelpers.SrcSubresourceIntegrityTagHelper'.

System.InvalidOperationException: Unable to resolve service for type 'Microsoft.AspNetCore.Mvc.IUrlHelper' while attempting to activate 'Boilerplate.AspNetCore.TagHelpers.SrcSubresourceIntegrityTagHelper'.
   at Microsoft.Extensions.Internal.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
   at lambda_method(Closure , IServiceProvider , Object[] )
   at Microsoft.AspNetCore.Mvc.Internal.TypeActivatorCache.CreateInstance[TInstance](IServiceProvider serviceProvider, Type implementationType)
   at Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultTagHelperActivator.Create[TTagHelper](ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.Internal.DefaultTagHelperFactory.CreateTagHelper[TTagHelper](ViewContext context)
   at Microsoft.AspNetCore.Mvc.Razor.RazorPageBase.CreateTagHelper[TTagHelper]()
   at AspNetCore._Views_Home_Index_cshtml.<<ExecuteAsync>b__13_0>d.MoveNext() in C:\Users\Michael\source\repos\www.renet\UI\Renet\Views\Home\Index.cshtml:line 0
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Razor.RazorPage.<RenderSectionAsyncCore>d__14.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.AspNetCore.Mvc.Razor.RazorPage.RenderSection(String name, Boolean required)
   at AspNetCore._Views_Shared__Layout_cshtml.<<ExecuteAsync>b__45_25>d.MoveNext() in C:\Users\Michael\source\repos\www.renet\UI\Renet\Views\Shared\_Layout.cshtml:line 87
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Razor.Runtime.TagHelpers.TagHelperExecutionContext.<SetOutputContentAsync>d__30.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at AspNetCore._Views_Shared__Layout_cshtml.<ExecuteAsync>d__45.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.<RenderPageCoreAsync>d__16.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.<RenderPageAsync>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.<RenderLayoutAsync>d__18.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Razor.RazorView.<RenderAsync>d__14.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.<ExecuteAsync>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.ViewFeatures.ViewExecutor.<ExecuteAsync>d__21.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.ViewResult.<ExecuteResultAsync>d__26.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeResultAsync>d__19.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextResultFilterAsync>d__24.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResultExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeNextResourceFilter>d__22.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeFilterPipelineAsync>d__17.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.<InvokeAsync>d__15.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.SpaServices.Webpack.ConditionalProxyMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.SpaServices.Webpack.ConditionalProxyMiddleware.<Invoke>d__6.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()

Expanding the Username & Id Properties of the Twitter Cards

I created this issue to explain the code changes in my branch. I extended the Twitter Cards to handle either using the Twitter Username e.g. @microsoft, or Twitter Id for the Website, as well as the Twitter @username of content creator e.g. @RehanSaeedUK.
I also modified the Validate function using the current list of required fields based upon the Twitter Card Type. Tag Mark-up.

So the new code-set now handles the "twitter:site", "twitter:site:id", "twitter:creator", and "twitter:creator:id" tags.

I figure that you'll want to review this data before I issue a Pull request. Also, this should be committed after the other PR about the Depreciated Card Types.
The code changes for my branch are located here

Tag Summary Summary Large Player App
twitter:card R R R R
twitter:site R R U R
twitter:site:id - U U -
twitter:creator - U - -
twitter:creator:id U U - -
twitter:description R R U U
twitter:title R R R -
twitter:image U U R -
twitter:image:alt U U R* -
twitter:player - - R -
twitter:player:width - - R -
twitter:player:height - - R -
twitter:player:stream - - U -
twitter:app:name:iphone - - - U
twitter:app:id:iphone - - - R
twitter:app:url:iphone - - - U
twitter:app:name:ipad - - - U
twitter:app:id:ipad - - - R
twitter:app:name:googleplay - - - R
twitter:app:id:googleplay - - - R
twitter:app:url:googleplay - - - U

R = Required
U = Usable
R* = Required, If the streamUrl is provided.

SubresourceIntegrityTagHelper: Invalid value from attribute content

I couldn't get the subresource functionality to work. So I debugged the code and noticed that that value of output.Attributes[this.UrlAttributeName].Value.ToString() isn't a string but an object: Microsoft.AspNetCore.Mvc.Razor.TagHelpers.UrlResolutionTagHelper+EncodeFirstSegmentContent

In order to solve it I used the code from a similar issue on Mvc:

private string GetEncodedStringValue(object attributeValue)
{
    var stringValue = attributeValue as string;
    if (stringValue != null)
    {
        var encodedStringValue = HtmlEncoder.Encode(stringValue);
        return encodedStringValue;
    }
    else
    {
        var htmlContent = attributeValue as IHtmlContent;
        if (htmlContent != null)
        {
            var htmlString = htmlContent as HtmlString;
            if (htmlString != null)
            {
                // No need for a StringWriter in this case.
                stringValue = htmlString.ToString();
            }
            else
            {
                using (var writer = new StringWriter())
                {
                    htmlContent.WriteTo(writer, HtmlEncoder);
                    stringValue = writer.ToString();
                }
            }
            return stringValue;
        }
    }
    return attributeValue.ToString();
}

After injecting an HtmlEncoder and replacing line 108:

var url = output.Attributes[this.UrlAttributeName].Value.ToString();

with:

var url = GetEncodedStringValue(output.Attributes[UrlAttributeName].Value);

it works.

app.UseHttpException(); throws

Describe the bug

The package throws an unhandled exception when adding exception middleware with app.UseHttpException();. Just happens on with 5.* versions.

System.NotSupportedException: Types that implement 'Microsoft.AspNetCore.Http.IMiddleware' do not support explicit arguments.
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.UseMiddleware(IApplicationBuilder app, Type middleware, Object[] args)
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.UseMiddleware[TMiddleware](IApplicationBuilder app, Object[] args)
   at Boxed.AspNetCore.ApplicationBuilderExtensions.UseHttpException(IApplicationBuilder application, Action`1 configureOptions)
   at Boxed.AspNetCore.ApplicationBuilderExtensions.UseHttpException(IApplicationBuilder application)
   at bla.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env) in /Users/oeisenhut/Projects/playground/bla/Startup.cs:line 40
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor, Boolean wrapExceptions)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.Invoke(Object instance, IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.ConfigureBuilder.<>c__DisplayClass4_0.<Build>b__0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.Hosting.GenericWebHostBuilder.<>c__DisplayClass13_0.<UseStartup>b__2(IApplicationBuilder app)
   at Microsoft.AspNetCore.Mvc.Filters.MiddlewareFilterBuilderStartupFilter.<>c__DisplayClass0_0.<Configure>g__MiddlewareFilterBuilder|0(IApplicationBuilder builder)
   at Microsoft.AspNetCore.HostFilteringStartupFilter.<>c__DisplayClass0_0.<Configure>b__0(IApplicationBuilder app)
   at Microsoft.AspNetCore.Hosting.GenericWebHostService.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.Internal.Host.StartAsync(CancellationToken cancellationToken)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync(IHost host, CancellationToken token)
   at Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run(IHost host)
   at bla.Program.Main(String[] args) in /Users/oeisenhut/Projects/playground/bla/Program.cs:line 16

To Reproduce

  1. Create new api dotnet new webapi
  2. Add Boxed.AspNetCore Nuget package with version >= 5
  3. Add app.UseHttpException(); to Startup.cs
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpException();
            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

        }
  1. Start the app.
  2. See the exception

Expected behaviour

The api starts without throwing an exception.

Boxed.Mapping: Allow source to be null (and set destination to null if so)

Describe the feature

Currently the Boxed.Mapping.MapperExtensions.Map method specifically checks whether source == null and throws an ArgumentNullException if so. It would be nice if it instead followed .NET nullable rules, and allowed a null source if the mapper defined a nullable type as source. In that case the destination would obviously also simply be null.

Instead, you currently have to do a workaround like: "var result = source == null ? null : _mapper.Map(source)" on every line calling a mapper where the source is a nullable type.

ILoggerFactory extension methods appear mistargeted?

There is an example in the README:

loggerfactory
    .AddIfElse(
        hostingEnvironment.IsDevelopment(),
        x => x.AddConsole(...).AddDebug(),
        x => x.AddSerilog(...));

I'm not sure this makes any sense. Methods like AddConsole and AddDebug are extensions on ILoggingBuilder, not ILoggerFactory. It seems to me like the LoggerFactoryExtensions type is completely mistargeted, but perhaps I'm just missing something.

Twitter:card is required !

in TwitterCard.cs file you have written this line of code

        `if (this.Type != TwitterCardType.Summary)
        {
            stringBuilder.AppendMetaNameContent("twitter:card", this.Type.ToTwitterString());
        }`

and it think this is wrong , because twitter:card meta tag is required.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.