diff --git a/examples/nodejs-ext/pnpm-demo/package.json b/examples/nodejs-ext/pnpm-demo/package.json index 5f3e96471..32a808872 100644 --- a/examples/nodejs-ext/pnpm-demo/package.json +++ b/examples/nodejs-ext/pnpm-demo/package.json @@ -4,9 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", + "dev": "vite dev", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" diff --git a/examples/nodejs-ext/vite-demo/package.json b/examples/nodejs-ext/vite-demo/package.json index 50e0a8933..001ececb0 100644 --- a/examples/nodejs-ext/vite-demo/package.json +++ b/examples/nodejs-ext/vite-demo/package.json @@ -4,9 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", + "dev": "vite dev", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" @@ -30,3 +28,4 @@ "vite": "^6.3.4" } } + diff --git a/examples/nodejs-ext/yarn-demo/package.json b/examples/nodejs-ext/yarn-demo/package.json index c6a3c1d23..b0fb42e69 100644 --- a/examples/nodejs-ext/yarn-demo/package.json +++ b/examples/nodejs-ext/yarn-demo/package.json @@ -4,9 +4,7 @@ "version": "0.0.0", "type": "module", "scripts": { - "dev": "run-script-os", - "dev:windows": "vite dev --port %PORT%", - "dev:default": "vite dev --port $PORT", + "dev": "vite dev", "build": "tsc -b && vite build", "lint": "eslint .", "preview": "vite preview" @@ -30,3 +28,4 @@ "vite": "^6.3.4" } } + diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index 2363a05f1..0087d090d 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -1,9 +1,9 @@ using Aspire.Hosting.ApplicationModel; using Aspire.Hosting.Lifecycle; using CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; -using Microsoft.Extensions.Hosting; -using Microsoft.Extensions.DependencyInjection; using CommunityToolkit.Aspire.Utils; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; namespace Aspire.Hosting; @@ -37,9 +37,21 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl _ => builder.AddNpmApp(name, wd, "dev") }; - return useHttps - ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() - : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); + _ = useHttps + ? resource.WithHttpsEndpoint(env: "PORT") + : resource.WithHttpEndpoint(env: "PORT"); + + return resource.WithArgs(ctx => + { + if (packageManager == "npm") + { + ctx.Args.Add("--"); + } + + var targetEndpoint = resource.Resource.GetEndpoint(useHttps ? "https" : "http"); + ctx.Args.Add("--port"); + ctx.Args.Add(targetEndpoint.Property(EndpointProperty.TargetPort)); + }); } /// diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index 63df06578..af3bcad3f 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -1,6 +1,4 @@ using Aspire.Hosting; -using Microsoft.AspNetCore.Http; -using System.Diagnostics; namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; @@ -141,7 +139,7 @@ public void ViteAppHasExposedHttpsEndpoints() [Fact] - public void ViteAppHasExposedExternalHttpEndpoints() + public void ViteAppDoesNotExposeExternalHttpEndpointsByDefault() { var builder = DistributedApplication.CreateBuilder(); @@ -157,7 +155,7 @@ public void ViteAppHasExposedExternalHttpEndpoints() Assert.True(resource.TryGetAnnotationsOfType(out var endpoints)); - Assert.Contains(endpoints, e => e.IsExternal); + Assert.DoesNotContain(endpoints, e => e.IsExternal); } [Fact] @@ -195,4 +193,36 @@ public void WithNpmPackageInstallationCanUseCICommand() var resource = Assert.Single(appModel.Resources.OfType()); Assert.Equal("npm", resource.Command); } + + [Fact] + public void ViteAppConfiguresPortFromEnvironment() + { + var builder = DistributedApplication.CreateBuilder(); + + builder.AddViteApp("vite"); + + using var app = builder.Build(); + + var appModel = app.Services.GetRequiredService(); + + var resource = Assert.Single(appModel.Resources.OfType()); + + // Verify that command line arguments callback is configured + Assert.True(resource.TryGetAnnotationsOfType(out var argsCallbackAnnotations)); + List args = []; + var ctx = new CommandLineArgsCallbackContext(args); + + foreach (var annotation in argsCallbackAnnotations) + { + annotation.Callback(ctx); + } + + Assert.Collection(args, + arg => Assert.Equal("run", arg), + arg => Assert.Equal("dev", arg), + arg => Assert.Equal("--", arg), + arg => Assert.Equal("--port", arg), + arg => Assert.IsType(arg) + ); + } } \ No newline at end of file