From 3e06c5cc39b65a06d6e60e73a4f2bd080bd104ab Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 01:08:18 +0000 Subject: [PATCH 01/13] Initial plan for issue From d959530df85bf2ff907bb59e8a93c61ac55caf06 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 01:19:28 +0000 Subject: [PATCH 02/13] Implement AddViteApp port configuration with command line arguments Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- .../NodeJSHostingExtensions.cs | 11 ++++++++ .../ResourceCreationTests.cs | 27 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index 2363a05f1..ece1b1d7a 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -37,6 +37,17 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl _ => builder.AddNpmApp(name, wd, "dev") }; + // Configure Vite to use the PORT environment variable for the dev server + resource = resource.WithArgs(ctx => + { + // Add -- separator to pass arguments to the underlying command (vite dev) + ctx.Args.Add("--"); + ctx.Args.Add("--port"); + // Read the PORT environment variable at runtime + var port = ctx.EnvironmentVariables.TryGetValue("PORT", out var portValue) ? portValue : "5173"; + ctx.Args.Add(port); + }); + return useHttps ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index 63df06578..df369d7f5 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -1,4 +1,5 @@ using Aspire.Hosting; +using Aspire.Hosting.ApplicationModel; using Microsoft.AspNetCore.Http; using System.Diagnostics; @@ -195,4 +196,30 @@ 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 = appModel.Resources.OfType().SingleOrDefault(); + + Assert.NotNull(resource); + + // Verify that the resource has endpoint with PORT environment variable + Assert.True(resource.TryGetAnnotationsOfType(out var endpoints)); + var httpEndpoint = endpoints.FirstOrDefault(e => e.UriScheme == "http"); + Assert.NotNull(httpEndpoint); + Assert.Equal("PORT", httpEndpoint.EnvVar); + + // Verify that command line arguments are configured to pass port to Vite + Assert.True(resource.TryGetAnnotationsOfType(out var argsCallbacks)); + Assert.NotEmpty(argsCallbacks); + } } \ No newline at end of file From e9edf7693cdab801721170ffe36b4ae58b4d549b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 01:23:35 +0000 Subject: [PATCH 03/13] Finalize AddViteApp port configuration and update example Co-authored-by: aaronpowell <434140+aaronpowell@users.noreply.github.com> --- examples/nodejs-ext/vite-demo/vite.config.ts | 3 +++ .../NodeJSHostingExtensions.cs | 26 ++++++++++++------- .../ResourceCreationTests.cs | 2 +- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/examples/nodejs-ext/vite-demo/vite.config.ts b/examples/nodejs-ext/vite-demo/vite.config.ts index 5a33944a9..0c3e4fb58 100644 --- a/examples/nodejs-ext/vite-demo/vite.config.ts +++ b/examples/nodejs-ext/vite-demo/vite.config.ts @@ -4,4 +4,7 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + server: { + port: parseInt(process.env.PORT || '5173') + } }) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index ece1b1d7a..618331b55 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -37,20 +37,28 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl _ => builder.AddNpmApp(name, wd, "dev") }; - // Configure Vite to use the PORT environment variable for the dev server - resource = resource.WithArgs(ctx => + var endpointBuilder = useHttps + ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() + : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); + + // Configure Vite to use the assigned port from the endpoint + return endpointBuilder.WithArgs(ctx => { // Add -- separator to pass arguments to the underlying command (vite dev) ctx.Args.Add("--"); ctx.Args.Add("--port"); - // Read the PORT environment variable at runtime - var port = ctx.EnvironmentVariables.TryGetValue("PORT", out var portValue) ? portValue : "5173"; - ctx.Args.Add(port); + + // Try to get the port from the environment variable set by the endpoint + if (ctx.EnvironmentVariables.TryGetValue("PORT", out var portValue)) + { + ctx.Args.Add(portValue); + } + else + { + // Fallback to Vite's default port + ctx.Args.Add("5173"); + } }); - - return useHttps - ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() - : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); } /// diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index df369d7f5..94f2ea882 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -218,7 +218,7 @@ public void ViteAppConfiguresPortFromEnvironment() Assert.NotNull(httpEndpoint); Assert.Equal("PORT", httpEndpoint.EnvVar); - // Verify that command line arguments are configured to pass port to Vite + // Verify that command line arguments callback is configured Assert.True(resource.TryGetAnnotationsOfType(out var argsCallbacks)); Assert.NotEmpty(argsCallbacks); } From c2d7e818f868eddb44d102b343ecf14e2d0dc993 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 05:04:14 +0000 Subject: [PATCH 04/13] Improving on Copilots take --- examples/nodejs-ext/pnpm-demo/package.json | 4 +-- examples/nodejs-ext/vite-demo/package.json | 5 ++- examples/nodejs-ext/vite-demo/vite.config.ts | 3 -- examples/nodejs-ext/yarn-demo/package.json | 5 ++- .../NodeJSHostingExtensions.cs | 36 +++++++++++-------- 5 files changed, 26 insertions(+), 27 deletions(-) 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/vite-demo/vite.config.ts b/examples/nodejs-ext/vite-demo/vite.config.ts index 0c3e4fb58..5a33944a9 100644 --- a/examples/nodejs-ext/vite-demo/vite.config.ts +++ b/examples/nodejs-ext/vite-demo/vite.config.ts @@ -4,7 +4,4 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], - server: { - port: parseInt(process.env.PORT || '5173') - } }) 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 618331b55..72fe9ef95 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -38,27 +38,33 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl }; var endpointBuilder = useHttps - ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() - : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); + ? resource.WithHttpsEndpoint().WithExternalHttpEndpoints() + : resource.WithHttpEndpoint().WithExternalHttpEndpoints(); - // Configure Vite to use the assigned port from the endpoint - return endpointBuilder.WithArgs(ctx => + builder.Eventing.Subscribe((@event, ct) => { - // Add -- separator to pass arguments to the underlying command (vite dev) - ctx.Args.Add("--"); - ctx.Args.Add("--port"); - - // Try to get the port from the environment variable set by the endpoint - if (ctx.EnvironmentVariables.TryGetValue("PORT", out var portValue)) + if (@event.Resource.Name != name) { - ctx.Args.Add(portValue); + return Task.CompletedTask; } - else + + endpointBuilder.WithArgs(ctx => { - // Fallback to Vite's default port - ctx.Args.Add("5173"); - } + if (@event.Resource.TryGetEndpoints(out var endpoints)) + { + // Set the PORT environment variable to the first endpoint's port + var firstEndpoint = endpoints.FirstOrDefault(); + + ctx.Args.Add("--"); + ctx.Args.Add("--port"); + ctx.Args.Add(firstEndpoint?.AllocatedEndpoint?.Port.ToString() ?? "5173"); + } + }); + + return Task.CompletedTask; }); + + return resource; } /// From 8ed59fff9f2108b251aa487291aabe7bbd732e84 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 05:33:27 +0000 Subject: [PATCH 05/13] Keeping PORT on env vars --- .../NodeJSHostingExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index 72fe9ef95..e008df07c 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -38,8 +38,8 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl }; var endpointBuilder = useHttps - ? resource.WithHttpsEndpoint().WithExternalHttpEndpoints() - : resource.WithHttpEndpoint().WithExternalHttpEndpoints(); + ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() + : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); builder.Eventing.Subscribe((@event, ct) => { From 6040d2dd5a094067e9236647e480a02be283ecd0 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 06:01:22 +0000 Subject: [PATCH 06/13] Simplify AddViteApp port configuration by using vite.config.ts Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> --- examples/nodejs-ext/pnpm-demo/vite.config.ts | 3 +++ examples/nodejs-ext/vite-demo/vite.config.ts | 3 +++ examples/nodejs-ext/yarn-demo/vite.config.ts | 3 +++ .../NodeJSHostingExtensions.cs | 27 +------------------ .../ResourceCreationTests.cs | 4 --- 5 files changed, 10 insertions(+), 30 deletions(-) diff --git a/examples/nodejs-ext/pnpm-demo/vite.config.ts b/examples/nodejs-ext/pnpm-demo/vite.config.ts index 5a33944a9..a21034cc9 100644 --- a/examples/nodejs-ext/pnpm-demo/vite.config.ts +++ b/examples/nodejs-ext/pnpm-demo/vite.config.ts @@ -4,4 +4,7 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + server: { + port: parseInt(process.env.PORT ?? '5173') + } }) diff --git a/examples/nodejs-ext/vite-demo/vite.config.ts b/examples/nodejs-ext/vite-demo/vite.config.ts index 5a33944a9..a21034cc9 100644 --- a/examples/nodejs-ext/vite-demo/vite.config.ts +++ b/examples/nodejs-ext/vite-demo/vite.config.ts @@ -4,4 +4,7 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + server: { + port: parseInt(process.env.PORT ?? '5173') + } }) diff --git a/examples/nodejs-ext/yarn-demo/vite.config.ts b/examples/nodejs-ext/yarn-demo/vite.config.ts index 5a33944a9..a21034cc9 100644 --- a/examples/nodejs-ext/yarn-demo/vite.config.ts +++ b/examples/nodejs-ext/yarn-demo/vite.config.ts @@ -4,4 +4,7 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], + server: { + port: parseInt(process.env.PORT ?? '5173') + } }) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index e008df07c..2363a05f1 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -37,34 +37,9 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl _ => builder.AddNpmApp(name, wd, "dev") }; - var endpointBuilder = useHttps + return useHttps ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); - - builder.Eventing.Subscribe((@event, ct) => - { - if (@event.Resource.Name != name) - { - return Task.CompletedTask; - } - - endpointBuilder.WithArgs(ctx => - { - if (@event.Resource.TryGetEndpoints(out var endpoints)) - { - // Set the PORT environment variable to the first endpoint's port - var firstEndpoint = endpoints.FirstOrDefault(); - - ctx.Args.Add("--"); - ctx.Args.Add("--port"); - ctx.Args.Add(firstEndpoint?.AllocatedEndpoint?.Port.ToString() ?? "5173"); - } - }); - - return Task.CompletedTask; - }); - - return resource; } /// diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index 94f2ea882..cbd989ae2 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -217,9 +217,5 @@ public void ViteAppConfiguresPortFromEnvironment() var httpEndpoint = endpoints.FirstOrDefault(e => e.UriScheme == "http"); Assert.NotNull(httpEndpoint); Assert.Equal("PORT", httpEndpoint.EnvVar); - - // Verify that command line arguments callback is configured - Assert.True(resource.TryGetAnnotationsOfType(out var argsCallbacks)); - Assert.NotEmpty(argsCallbacks); } } \ No newline at end of file From ac4d9659dc1c6d785ef0fbb26757f651de57ff1c Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 16:02:26 +1000 Subject: [PATCH 07/13] Simplifying the code --- .../NodeJSHostingExtensions.cs | 32 +++---------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index e008df07c..baf4b08b8 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -1,9 +1,10 @@ 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; +using System.Runtime.InteropServices; namespace Aspire.Hosting; @@ -37,34 +38,11 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl _ => builder.AddNpmApp(name, wd, "dev") }; - var endpointBuilder = useHttps + _ = useHttps ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); - builder.Eventing.Subscribe((@event, ct) => - { - if (@event.Resource.Name != name) - { - return Task.CompletedTask; - } - - endpointBuilder.WithArgs(ctx => - { - if (@event.Resource.TryGetEndpoints(out var endpoints)) - { - // Set the PORT environment variable to the first endpoint's port - var firstEndpoint = endpoints.FirstOrDefault(); - - ctx.Args.Add("--"); - ctx.Args.Add("--port"); - ctx.Args.Add(firstEndpoint?.AllocatedEndpoint?.Port.ToString() ?? "5173"); - } - }); - - return Task.CompletedTask; - }); - - return resource; + return resource.WithArgs("--", "--port", RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "%PORT%" : "$PORT"); } /// From 8fa7f76e0c7dd4dd89190e3c111f88f34b92c845 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 16:11:27 +1000 Subject: [PATCH 08/13] Fixing test --- .../ResourceCreationTests.cs | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index 94f2ea882..0ef83fa6b 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -2,6 +2,8 @@ using Aspire.Hosting.ApplicationModel; using Microsoft.AspNetCore.Http; using System.Diagnostics; +using System.Runtime.InteropServices; +using static Google.Protobuf.Reflection.GeneratedCodeInfo.Types; namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; @@ -208,18 +210,24 @@ public void ViteAppConfiguresPortFromEnvironment() var appModel = app.Services.GetRequiredService(); - var resource = appModel.Resources.OfType().SingleOrDefault(); - - Assert.NotNull(resource); - - // Verify that the resource has endpoint with PORT environment variable - Assert.True(resource.TryGetAnnotationsOfType(out var endpoints)); - var httpEndpoint = endpoints.FirstOrDefault(e => e.UriScheme == "http"); - Assert.NotNull(httpEndpoint); - Assert.Equal("PORT", httpEndpoint.EnvVar); + var resource = Assert.Single(appModel.Resources.OfType()); // Verify that command line arguments callback is configured - Assert.True(resource.TryGetAnnotationsOfType(out var argsCallbacks)); - Assert.NotEmpty(argsCallbacks); + 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.Equal(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "%PORT%" : "$PORT", arg) + ); } } \ No newline at end of file From 8d2f7aaedbb402c127498cd73af66e24ca961e25 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 16:15:08 +1000 Subject: [PATCH 09/13] Reverting a copilot change --- examples/nodejs-ext/pnpm-demo/vite.config.ts | 3 --- examples/nodejs-ext/vite-demo/vite.config.ts | 3 --- examples/nodejs-ext/yarn-demo/vite.config.ts | 3 --- 3 files changed, 9 deletions(-) diff --git a/examples/nodejs-ext/pnpm-demo/vite.config.ts b/examples/nodejs-ext/pnpm-demo/vite.config.ts index a21034cc9..5a33944a9 100644 --- a/examples/nodejs-ext/pnpm-demo/vite.config.ts +++ b/examples/nodejs-ext/pnpm-demo/vite.config.ts @@ -4,7 +4,4 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], - server: { - port: parseInt(process.env.PORT ?? '5173') - } }) diff --git a/examples/nodejs-ext/vite-demo/vite.config.ts b/examples/nodejs-ext/vite-demo/vite.config.ts index a21034cc9..5a33944a9 100644 --- a/examples/nodejs-ext/vite-demo/vite.config.ts +++ b/examples/nodejs-ext/vite-demo/vite.config.ts @@ -4,7 +4,4 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], - server: { - port: parseInt(process.env.PORT ?? '5173') - } }) diff --git a/examples/nodejs-ext/yarn-demo/vite.config.ts b/examples/nodejs-ext/yarn-demo/vite.config.ts index a21034cc9..5a33944a9 100644 --- a/examples/nodejs-ext/yarn-demo/vite.config.ts +++ b/examples/nodejs-ext/yarn-demo/vite.config.ts @@ -4,7 +4,4 @@ import react from '@vitejs/plugin-react' // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], - server: { - port: parseInt(process.env.PORT ?? '5173') - } }) From 56c930b218111113888b7e0948b7f9f81ac1953a Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 16:44:10 +1000 Subject: [PATCH 10/13] Using an endpoint reference expression which is a better approach for getting the port --- .../NodeJSHostingExtensions.cs | 13 ++++++++++++- .../ResourceCreationTests.cs | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index baf4b08b8..f44929209 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -2,6 +2,7 @@ using Aspire.Hosting.Lifecycle; using CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; using CommunityToolkit.Aspire.Utils; +using k8s.KubeConfigModels; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Runtime.InteropServices; @@ -42,7 +43,17 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); - return resource.WithArgs("--", "--port", RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "%PORT%" : "$PORT"); + return resource.WithArgs(ctx => + { + if (packageManager != "yarn") + { + 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 0ef83fa6b..ab837387c 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -227,7 +227,7 @@ public void ViteAppConfiguresPortFromEnvironment() arg => Assert.Equal("dev", arg), arg => Assert.Equal("--", arg), arg => Assert.Equal("--port", arg), - arg => Assert.Equal(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "%PORT%" : "$PORT", arg) + arg => Assert.IsType(arg) ); } } \ No newline at end of file From 2da789f47b490ebd155b22007b67809382ecf731 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 07:00:56 +0000 Subject: [PATCH 11/13] Think we only need -- for npm, not other package managers --- .../NodeJSHostingExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index f44929209..0cb8b49ff 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -45,7 +45,7 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl return resource.WithArgs(ctx => { - if (packageManager != "yarn") + if (packageManager == "npm") { ctx.Args.Add("--"); } From ef4e6e9a76e374aa0c990140d484dc7c8b016646 Mon Sep 17 00:00:00 2001 From: Aaron Powell Date: Tue, 10 Jun 2025 07:07:32 +0000 Subject: [PATCH 12/13] Cleaning up using statements --- .../NodeJSHostingExtensions.cs | 2 -- .../ResourceCreationTests.cs | 5 ----- 2 files changed, 7 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index 0cb8b49ff..19b169b70 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -2,10 +2,8 @@ using Aspire.Hosting.Lifecycle; using CommunityToolkit.Aspire.Hosting.NodeJS.Extensions; using CommunityToolkit.Aspire.Utils; -using k8s.KubeConfigModels; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using System.Runtime.InteropServices; namespace Aspire.Hosting; diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index ab837387c..ecdced723 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -1,9 +1,4 @@ using Aspire.Hosting; -using Aspire.Hosting.ApplicationModel; -using Microsoft.AspNetCore.Http; -using System.Diagnostics; -using System.Runtime.InteropServices; -using static Google.Protobuf.Reflection.GeneratedCodeInfo.Types; namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; From 91305aebf46bdf160f858222703fba48d011984d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 10 Jun 2025 13:47:12 +0000 Subject: [PATCH 13/13] Remove automatic WithExternalHttpEndpoints from AddViteApp to let users decide Co-authored-by: davidfowl <95136+davidfowl@users.noreply.github.com> --- .../NodeJSHostingExtensions.cs | 4 ++-- .../ResourceCreationTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs index 19b169b70..0087d090d 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs @@ -38,8 +38,8 @@ public static IResourceBuilder AddViteApp(this IDistributedAppl }; _ = useHttps - ? resource.WithHttpsEndpoint(env: "PORT").WithExternalHttpEndpoints() - : resource.WithHttpEndpoint(env: "PORT").WithExternalHttpEndpoints(); + ? resource.WithHttpsEndpoint(env: "PORT") + : resource.WithHttpEndpoint(env: "PORT"); return resource.WithArgs(ctx => { diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs index ecdced723..af3bcad3f 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/ResourceCreationTests.cs @@ -139,7 +139,7 @@ public void ViteAppHasExposedHttpsEndpoints() [Fact] - public void ViteAppHasExposedExternalHttpEndpoints() + public void ViteAppDoesNotExposeExternalHttpEndpointsByDefault() { var builder = DistributedApplication.CreateBuilder(); @@ -155,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]