diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 95dd600be..a1d251b66 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -13,7 +13,6 @@ - Hosting integrations: extension methods in `Aspire.Hosting` namespace. - Client integrations: extension methods in `Microsoft.Extensions.Hosting` namespace. - Use file-scoped namespaces. -- **Installer resources:** For Node.js, package installers (npm/yarn/pnpm) are modeled as `ExecutableResource` instances, providing dashboard visibility and proper process management. See `src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md` for rationale and migration. ### Coding Style @@ -56,12 +55,13 @@ public static class SomeProgramExtensions - Integrations must add `Aspire.Hosting` as a dependency; see `Directory.Build.props` for shared MSBuild config. - Use the [create-integration guide](../docs/create-integration.md) for new integrations. - For Azure/Dapr integrations, see `src/Shared/DaprAzureExtensions/README.md` for shared resource patterns. -- Don't update files under */api/*.cs (e.g. src/CommunityToolkit.Aspire.Hosting.Ollama/api/CommunityToolkit.Aspire.Hosting.Ollama.cs) as they are generated. +- Don't update files under _/api/_.cs (e.g. src/CommunityToolkit.Aspire.Hosting.Ollama/api/CommunityToolkit.Aspire.Hosting.Ollama.cs) as they are generated. + ### External Dependencies & Integration - Many integrations wrap external services (e.g., Dapr, MinIO, k6, Node.js, Python, Rust, Java, etc.). - Each integration's README in `src/` or `examples/` details usage, supported versions, and special setup. -- For Node.js, package manager flags can be customized via extension methods (see `src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md`). +- For Node.js, package manager flags can be customized via extension methods (see `src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/README.md`). ### Documentation & Contribution @@ -72,3 +72,4 @@ public static class SomeProgramExtensions --- If you find any unclear or incomplete sections, please provide feedback to improve these instructions. + diff --git a/.github/workflows/code-coverage.yml b/.github/workflows/code-coverage.yml index f1d6e4792..fd02b0b9e 100644 --- a/.github/workflows/code-coverage.yml +++ b/.github/workflows/code-coverage.yml @@ -25,7 +25,7 @@ jobs: tag: "${{ github.run_number }}_${{ github.run_id }}" customSettings: "" toolpath: "reportgeneratortool" - assemblyfilters: "-*.AppHost;-CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.BlazorApp;-*.ServiceDefaults;-CommunityToolkit.Aspire.Testing;-Aspire.Hosting;-Aspire.Hosting.NodeJs;-Aspire.Hosting.SqlServer;-Aspire.Hosting.Python;-Aspire.Hosting.RabbitMQ;-Aspire.Hosting.Redis;-Aspire.Hosting.PostgreSQL;-Aspire.Hosting.MongoDB" + assemblyfilters: "-*.AppHost;-CommunityToolkit.Aspire.Hosting.Azure.DataApiBuilder.BlazorApp;-*.ServiceDefaults;-CommunityToolkit.Aspire.Testing;-Aspire.Hosting;-Aspire.Hosting.JavaScript;-Aspire.Hosting.SqlServer;-Aspire.Hosting.Python;-Aspire.Hosting.RabbitMQ;-Aspire.Hosting.Redis;-Aspire.Hosting.PostgreSQL;-Aspire.Hosting.MongoDB" - name: Upload combined coverage XML uses: actions/upload-artifact@v5 @@ -64,4 +64,3 @@ jobs: - name: Coverage on step summary if: always() run: cat "${{ github.workspace }}/report/SummaryGithub.md" >> $GITHUB_STEP_SUMMARY - diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 4347ec797..971427344 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -44,7 +44,7 @@ jobs: Hosting.MongoDB.Extensions.Tests, Hosting.MySql.Extensions.Tests, Hosting.Ngrok.Tests, - Hosting.NodeJS.Extensions.Tests, + Hosting.JavaScript.Extensions.Tests, Hosting.Ollama.Tests, Hosting.OpenTelemetryCollector.Tests, Hosting.PapercutSmtp.Tests, diff --git a/CommunityToolkit.Aspire.slnx b/CommunityToolkit.Aspire.slnx index c37a57002..a66c47b9a 100644 --- a/CommunityToolkit.Aspire.slnx +++ b/CommunityToolkit.Aspire.slnx @@ -106,8 +106,8 @@ - - + + @@ -184,7 +184,7 @@ - + @@ -237,7 +237,7 @@ - + diff --git a/Directory.Build.props b/Directory.Build.props index 974adbf17..2d9a32bc6 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -12,15 +12,15 @@ enable 13 - $(AspireMajorVersion).0.0-preview.1.25531.6 + $(AspireMajorVersion).0.0 $(AspireVersion) - preview.1.25522.3 + preview.1.25560.3 9.0.0 - 9.0.10 + 10.0.0 1.12.0 4.7.0 9.9.0 - 10.0.0-preview.1.25520.3 + 10.0.0 false 4.20.72 diff --git a/Directory.Packages.props b/Directory.Packages.props index 9cf56162a..40df54c28 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -11,9 +11,9 @@ - - - + + + @@ -44,7 +44,7 @@ - + @@ -113,8 +113,5 @@ - - - - + \ No newline at end of file diff --git a/README.md b/README.md index 87f440261..daaaf5960 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ This repository contains the source code for the .NET Aspire Community Toolkit, | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | - **Learn More**: [`Hosting.Golang`][golang-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields]][golang-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Golang][golang-shields-preview]][golang-nuget-preview] | A hosting integration Golang apps. | | - **Learn More**: [`Hosting.Java`][java-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields]][java-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Java][java-shields-preview]][java-nuget-preview] | An integration for running Java code in .NET Aspire either using the local JDK or using a container. | -| - **Learn More**: [`Hosting.NodeJS.Extensions`][nodejs-ext-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.NodeJS.Extensions][nodejs-ext-shields]][nodejs-ext-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.NodeJS.Extensions][nodejs-ext-shields-preview]][nodejs-ext-nuget-preview] | An integration that contains some additional extensions for running Node.js applications | +| - **Learn More**: [`Hosting.NodeJS.Extensions`][nodejs-ext-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.NodeJS.Extensions][nodejs-ext-shields]][nodejs-ext-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.JavaScript.Extensions][nodejs-ext-shields-preview]][nodejs-ext-nuget-preview] | An integration that contains some additional extensions for running Node.js applications | | - **Learn More**: [`Hosting.Ollama`][ollama-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields]][ollama-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Ollama][ollama-shields-preview]][ollama-nuget-preview] | An Aspire hosting integration leveraging the [Ollama](https://ollama.com) container with support for downloading a model on startup. | | - **Learn More**: [`OllamaSharp`][ollama-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields]][ollamasharp-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.OllamaSharp][ollamasharp-shields-preview]][ollamasharp-nuget-preview] | An Aspire client integration for the [OllamaSharp](https://github.com/awaescher/OllamaSharp) package. | | - **Learn More**: [`Hosting.Meilisearch`][meilisearch-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields]][meilisearch-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Meilisearch][meilisearch-shields-preview]][meilisearch-nuget-preview] | An Aspire hosting integration leveraging the [Meilisearch](https://meilisearch.com) container. | @@ -27,8 +27,8 @@ This repository contains the source code for the .NET Aspire Community Toolkit, | - **Learn More**: [`Hosting.Rust`][rust-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields]][rust-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Rust][rust-shields-preview]][rust-nuget-preview] | A hosting integration for the Rust apps. | | - **Learn More**: [`Hosting.Bun`][bun-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields]][bun-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Bun][bun-shields-preview]][bun-nuget-preview] | A hosting integration for the Bun apps. | | - **Learn More**: [`Hosting.Python.Extensions`][python-ext-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Python.Extensions][python-ext-shields]][python-ext-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Python.Extensions][python-ext-shields-preview]][python-ext-nuget-preview] | An integration that contains some additional extensions for running python applications | -| - **Learn More**: [`Hosting.KurrentDB`][kurrentdb-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields]][kurrentdb-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields-preview]][kurrentdb-nuget-preview] | An Aspire hosting integration leveraging the [KurrentDB](https://www.kurrent.io) container. | -| - **Learn More**: [`KurrentDB`][kurrentdb-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields]][kurrentdb-client-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields-preview]][kurrentdb-client-nuget-preview] | An Aspire client integration for the [KurrentDB](https://github.com/kurrent-io/KurrentDB-Client-Dotnet) package. | +| - **Learn More**: [`Hosting.KurrentDB`][kurrentdb-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields]][kurrentdb-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.KurrentDB][kurrentdb-shields-preview]][kurrentdb-nuget-preview] | An Aspire hosting integration leveraging the [KurrentDB](https://www.kurrent.io) container. | +| - **Learn More**: [`KurrentDB`][kurrentdb-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields]][kurrentdb-client-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.KurrentDB][kurrentdb-client-shields-preview]][kurrentdb-client-nuget-preview] | An Aspire client integration for the [KurrentDB](https://github.com/kurrent-io/KurrentDB-Client-Dotnet) package. | | - **Learn More**: [`Hosting.Flagd`][flagd-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Flagd][flagd-shields]][flagd-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Flagd][flagd-shields-preview]][flagd-nuget-preview] | A .NET Aspire hosting integration for [flagd](https://flagd.dev), a feature flag evaluation engine. | | - **Learn More**: [`Hosting.ActiveMQ`][activemq-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields]][activemq-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.ActiveMQ][activemq-shields-preview]][activemq-nuget-preview] | An Aspire hosting integration leveraging the [ActiveMq](https://activemq.apache.org) container. | | - **Learn More**: [`Hosting.Sqlite`][sqlite-integration-docs]
- Stable πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields]][sqlite-hosting-nuget]
- Preview πŸ“¦: [![CommunityToolkit.Aspire.Hosting.Sqlite][sqlite-shields-preview]][sqlite-hosting-nuget-preview] | An Aspire hosting integration to setup a SQLite database with optional SQLite Web as a dev UI. | @@ -103,10 +103,10 @@ This project is supported by the [.NET Foundation](https://dotnetfoundation.org) [java-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.Java?label=nuget%20(preview) [java-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Java/absoluteLatest [nodejs-ext-integration-docs]: https://learn.microsoft.com/dotnet/aspire/community-toolkit/hosting-nodejs-extensions -[nodejs-ext-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions -[nodejs-ext-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/ -[nodejs-ext-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions?label=nuget%20(preview) -[nodejs-ext-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/absoluteLatest +[nodejs-ext-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions +[nodejs-ext-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/ +[nodejs-ext-shields-preview]: https://img.shields.io/nuget/vpre/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions?label=nuget%20(preview) +[nodejs-ext-nuget-preview]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/absoluteLatest [ollama-integration-docs]: https://learn.microsoft.com/dotnet/aspire/community-toolkit/ollama [ollama-shields]: https://img.shields.io/nuget/v/CommunityToolkit.Aspire.Hosting.Ollama [ollama-nuget]: https://nuget.org/packages/CommunityToolkit.Aspire.Hosting.Ollama/ diff --git a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost.csproj b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj similarity index 53% rename from examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost.csproj rename to examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj index 6f239f88d..c1e322369 100644 --- a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost.csproj +++ b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost.csproj @@ -14,13 +14,7 @@ - + - - - - - -
diff --git a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/Program.cs similarity index 82% rename from examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs rename to examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/Program.cs index fbf72f6fa..98e710107 100644 --- a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Program.cs +++ b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/Program.cs @@ -1,7 +1,8 @@ var builder = DistributedApplication.CreateBuilder(args); var nx = builder.AddNxApp("nx-demo") - .WithNpm(install: true); + .WithNpm(install: true) + .WithPackageManagerLaunch(); nx.AddApp("blog-monorepo") .WithHttpEndpoint(env: "PORT") @@ -9,12 +10,14 @@ .WithHttpHealthCheck(); var turbo = builder.AddTurborepoApp("turborepo-demo") - .WithNpm(install: true); + .WithNpm(install: true) + .WithPackageManagerLaunch(); turbo.AddApp("turbo-web", filter: "web") .WithHttpEndpoint(env: "PORT") .WithMappedEndpointPort() .WithHttpHealthCheck(); + turbo.AddApp("turbo-docs", filter: "docs") .WithHttpEndpoint(env: "PORT") .WithMappedEndpointPort() diff --git a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Properties/launchSettings.json b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/Properties/launchSettings.json similarity index 100% rename from examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/Properties/launchSettings.json rename to examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/Properties/launchSettings.json diff --git a/examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/appsettings.json b/examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/appsettings.json similarity index 100% rename from examples/nodejs-ext/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.AppHost/appsettings.json rename to examples/javascript-ext/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.AppHost/appsettings.json diff --git a/examples/nodejs-ext/nx-demo/.editorconfig b/examples/javascript-ext/nx-demo/.editorconfig similarity index 100% rename from examples/nodejs-ext/nx-demo/.editorconfig rename to examples/javascript-ext/nx-demo/.editorconfig diff --git a/examples/nodejs-ext/nx-demo/.gitignore b/examples/javascript-ext/nx-demo/.gitignore similarity index 100% rename from examples/nodejs-ext/nx-demo/.gitignore rename to examples/javascript-ext/nx-demo/.gitignore diff --git a/examples/nodejs-ext/nx-demo/.prettierignore b/examples/javascript-ext/nx-demo/.prettierignore similarity index 100% rename from examples/nodejs-ext/nx-demo/.prettierignore rename to examples/javascript-ext/nx-demo/.prettierignore diff --git a/examples/nodejs-ext/nx-demo/.prettierrc b/examples/javascript-ext/nx-demo/.prettierrc similarity index 100% rename from examples/nodejs-ext/nx-demo/.prettierrc rename to examples/javascript-ext/nx-demo/.prettierrc diff --git a/examples/nodejs-ext/nx-demo/.vscode/extensions.json b/examples/javascript-ext/nx-demo/.vscode/extensions.json similarity index 100% rename from examples/nodejs-ext/nx-demo/.vscode/extensions.json rename to examples/javascript-ext/nx-demo/.vscode/extensions.json diff --git a/examples/nodejs-ext/nx-demo/README.md b/examples/javascript-ext/nx-demo/README.md similarity index 100% rename from examples/nodejs-ext/nx-demo/README.md rename to examples/javascript-ext/nx-demo/README.md diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/eslint.config.mjs b/examples/javascript-ext/nx-demo/apps/blog-monorepo/eslint.config.mjs similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/eslint.config.mjs rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/eslint.config.mjs diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/index.html b/examples/javascript-ext/nx-demo/apps/blog-monorepo/index.html similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/index.html rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/index.html diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/package.json b/examples/javascript-ext/nx-demo/apps/blog-monorepo/package.json similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/package.json rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/package.json diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/public/favicon.ico b/examples/javascript-ext/nx-demo/apps/blog-monorepo/public/favicon.ico similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/public/favicon.ico rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/public/favicon.ico diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/app/app.module.css b/examples/javascript-ext/nx-demo/apps/blog-monorepo/src/app/app.module.css similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/app/app.module.css rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/src/app/app.module.css diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/app/app.tsx b/examples/javascript-ext/nx-demo/apps/blog-monorepo/src/app/app.tsx similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/app/app.tsx rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/src/app/app.tsx diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/app/nx-welcome.tsx b/examples/javascript-ext/nx-demo/apps/blog-monorepo/src/app/nx-welcome.tsx similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/app/nx-welcome.tsx rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/src/app/nx-welcome.tsx diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/assets/.gitkeep b/examples/javascript-ext/nx-demo/apps/blog-monorepo/src/assets/.gitkeep similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/assets/.gitkeep rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/src/assets/.gitkeep diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/main.tsx b/examples/javascript-ext/nx-demo/apps/blog-monorepo/src/main.tsx similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/main.tsx rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/src/main.tsx diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/styles.css b/examples/javascript-ext/nx-demo/apps/blog-monorepo/src/styles.css similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/src/styles.css rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/src/styles.css diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/tsconfig.app.json b/examples/javascript-ext/nx-demo/apps/blog-monorepo/tsconfig.app.json similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/tsconfig.app.json rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/tsconfig.app.json diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/tsconfig.json b/examples/javascript-ext/nx-demo/apps/blog-monorepo/tsconfig.json similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/tsconfig.json rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/tsconfig.json diff --git a/examples/nodejs-ext/nx-demo/apps/blog-monorepo/vite.config.ts b/examples/javascript-ext/nx-demo/apps/blog-monorepo/vite.config.ts similarity index 100% rename from examples/nodejs-ext/nx-demo/apps/blog-monorepo/vite.config.ts rename to examples/javascript-ext/nx-demo/apps/blog-monorepo/vite.config.ts diff --git a/examples/nodejs-ext/nx-demo/eslint.config.mjs b/examples/javascript-ext/nx-demo/eslint.config.mjs similarity index 100% rename from examples/nodejs-ext/nx-demo/eslint.config.mjs rename to examples/javascript-ext/nx-demo/eslint.config.mjs diff --git a/examples/nodejs-ext/nx-demo/nx.json b/examples/javascript-ext/nx-demo/nx.json similarity index 100% rename from examples/nodejs-ext/nx-demo/nx.json rename to examples/javascript-ext/nx-demo/nx.json diff --git a/examples/nodejs-ext/nx-demo/package-lock.json b/examples/javascript-ext/nx-demo/package-lock.json similarity index 99% rename from examples/nodejs-ext/nx-demo/package-lock.json rename to examples/javascript-ext/nx-demo/package-lock.json index 32c865e61..5d30795d6 100644 --- a/examples/nodejs-ext/nx-demo/package-lock.json +++ b/examples/javascript-ext/nx-demo/package-lock.json @@ -100,6 +100,7 @@ "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -3109,6 +3110,7 @@ "integrity": "sha512-G00xsEx4CzhvhutJi+7yvmnHepOeGd1o+BBqRzAjZS4iwp7zS5h3CCxxEGeQgJdP9BA3/m0HATPSwepL7Bwd0Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime": "0.18.3", "@module-federation/webpack-bundler-runtime": "0.18.3" @@ -4556,6 +4558,7 @@ "integrity": "sha512-eEtiKV+CUcAtnt1K+eiHDzmBXQcNM8CfCXOzr0+gHGp4w4Zks2B8RF36sYD03MM2bg8VRXXsf0MicQ8FvRMCOg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime-tools": "0.18.0", "@rspack/binding": "1.5.0", @@ -4838,6 +4841,7 @@ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -5072,6 +5076,7 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.8" @@ -5297,6 +5302,7 @@ "integrity": "sha512-tjTMh3V4vAORHtdTprLlfoMptu1WfTZG9Rsca6yOKyNYsRr+MUXutKmliB17orgSZk5DpnDxs8GUdd/qwYxOng==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3" } @@ -5377,6 +5383,7 @@ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -5618,6 +5625,7 @@ "integrity": "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.41.0", "@typescript-eslint/types": "8.41.0", @@ -5970,6 +5978,7 @@ "integrity": "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/utils": "3.2.4", "fflate": "^0.8.2", @@ -6409,6 +6418,7 @@ "integrity": "sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "argparse": "^2.0.1" }, @@ -6444,6 +6454,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6513,6 +6524,7 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -7288,6 +7300,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001735", "electron-to-chromium": "^1.5.204", @@ -8666,6 +8679,7 @@ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -8988,6 +9002,7 @@ "integrity": "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -9049,6 +9064,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -9995,6 +10011,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -11997,6 +12014,7 @@ "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -13712,6 +13730,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -14719,6 +14738,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.0.0.tgz", "integrity": "sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -14728,6 +14748,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.0.0.tgz", "integrity": "sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.25.0" }, @@ -15054,6 +15075,7 @@ "integrity": "sha512-jVG20NvbhTYDkGAty2/Yh7HK6/q3DGSRH4o8ALKGArmMuaauM9kLfoMZ+WliPwA5+JHr2lTn3g557FxBV87ifg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -16740,6 +16762,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -17011,6 +17034,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -17109,6 +17133,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -17226,6 +17251,7 @@ "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -17473,6 +17499,7 @@ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, diff --git a/examples/nodejs-ext/nx-demo/package.json b/examples/javascript-ext/nx-demo/package.json similarity index 100% rename from examples/nodejs-ext/nx-demo/package.json rename to examples/javascript-ext/nx-demo/package.json diff --git a/examples/nodejs-ext/nx-demo/tsconfig.base.json b/examples/javascript-ext/nx-demo/tsconfig.base.json similarity index 100% rename from examples/nodejs-ext/nx-demo/tsconfig.base.json rename to examples/javascript-ext/nx-demo/tsconfig.base.json diff --git a/examples/nodejs-ext/nx-demo/tsconfig.json b/examples/javascript-ext/nx-demo/tsconfig.json similarity index 100% rename from examples/nodejs-ext/nx-demo/tsconfig.json rename to examples/javascript-ext/nx-demo/tsconfig.json diff --git a/examples/nodejs-ext/turborepo-demo/.gitignore b/examples/javascript-ext/turborepo-demo/.gitignore similarity index 100% rename from examples/nodejs-ext/turborepo-demo/.gitignore rename to examples/javascript-ext/turborepo-demo/.gitignore diff --git a/examples/nodejs-ext/turborepo-demo/.npmrc b/examples/javascript-ext/turborepo-demo/.npmrc similarity index 100% rename from examples/nodejs-ext/turborepo-demo/.npmrc rename to examples/javascript-ext/turborepo-demo/.npmrc diff --git a/examples/nodejs-ext/turborepo-demo/README.md b/examples/javascript-ext/turborepo-demo/README.md similarity index 100% rename from examples/nodejs-ext/turborepo-demo/README.md rename to examples/javascript-ext/turborepo-demo/README.md diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/.gitignore b/examples/javascript-ext/turborepo-demo/apps/docs/.gitignore similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/.gitignore rename to examples/javascript-ext/turborepo-demo/apps/docs/.gitignore diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/README.md b/examples/javascript-ext/turborepo-demo/apps/docs/README.md similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/README.md rename to examples/javascript-ext/turborepo-demo/apps/docs/README.md diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/favicon.ico b/examples/javascript-ext/turborepo-demo/apps/docs/app/favicon.ico similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/favicon.ico rename to examples/javascript-ext/turborepo-demo/apps/docs/app/favicon.ico diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/fonts/GeistMonoVF.woff b/examples/javascript-ext/turborepo-demo/apps/docs/app/fonts/GeistMonoVF.woff similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/fonts/GeistMonoVF.woff rename to examples/javascript-ext/turborepo-demo/apps/docs/app/fonts/GeistMonoVF.woff diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/fonts/GeistVF.woff b/examples/javascript-ext/turborepo-demo/apps/docs/app/fonts/GeistVF.woff similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/fonts/GeistVF.woff rename to examples/javascript-ext/turborepo-demo/apps/docs/app/fonts/GeistVF.woff diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/globals.css b/examples/javascript-ext/turborepo-demo/apps/docs/app/globals.css similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/globals.css rename to examples/javascript-ext/turborepo-demo/apps/docs/app/globals.css diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/layout.tsx b/examples/javascript-ext/turborepo-demo/apps/docs/app/layout.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/layout.tsx rename to examples/javascript-ext/turborepo-demo/apps/docs/app/layout.tsx diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/page.module.css b/examples/javascript-ext/turborepo-demo/apps/docs/app/page.module.css similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/page.module.css rename to examples/javascript-ext/turborepo-demo/apps/docs/app/page.module.css diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/app/page.tsx b/examples/javascript-ext/turborepo-demo/apps/docs/app/page.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/app/page.tsx rename to examples/javascript-ext/turborepo-demo/apps/docs/app/page.tsx diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/eslint.config.js b/examples/javascript-ext/turborepo-demo/apps/docs/eslint.config.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/eslint.config.js rename to examples/javascript-ext/turborepo-demo/apps/docs/eslint.config.js diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/next.config.js b/examples/javascript-ext/turborepo-demo/apps/docs/next.config.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/next.config.js rename to examples/javascript-ext/turborepo-demo/apps/docs/next.config.js diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/package.json b/examples/javascript-ext/turborepo-demo/apps/docs/package.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/package.json rename to examples/javascript-ext/turborepo-demo/apps/docs/package.json diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/file-text.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/file-text.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/file-text.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/file-text.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/globe.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/globe.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/globe.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/globe.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/next.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/next.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/next.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/next.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/turborepo-dark.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/turborepo-dark.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/turborepo-dark.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/turborepo-dark.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/turborepo-light.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/turborepo-light.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/turborepo-light.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/turborepo-light.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/vercel.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/vercel.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/vercel.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/vercel.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/public/window.svg b/examples/javascript-ext/turborepo-demo/apps/docs/public/window.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/public/window.svg rename to examples/javascript-ext/turborepo-demo/apps/docs/public/window.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/docs/tsconfig.json b/examples/javascript-ext/turborepo-demo/apps/docs/tsconfig.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/docs/tsconfig.json rename to examples/javascript-ext/turborepo-demo/apps/docs/tsconfig.json diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/.gitignore b/examples/javascript-ext/turborepo-demo/apps/web/.gitignore similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/.gitignore rename to examples/javascript-ext/turborepo-demo/apps/web/.gitignore diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/README.md b/examples/javascript-ext/turborepo-demo/apps/web/README.md similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/README.md rename to examples/javascript-ext/turborepo-demo/apps/web/README.md diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/favicon.ico b/examples/javascript-ext/turborepo-demo/apps/web/app/favicon.ico similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/favicon.ico rename to examples/javascript-ext/turborepo-demo/apps/web/app/favicon.ico diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/fonts/GeistMonoVF.woff b/examples/javascript-ext/turborepo-demo/apps/web/app/fonts/GeistMonoVF.woff similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/fonts/GeistMonoVF.woff rename to examples/javascript-ext/turborepo-demo/apps/web/app/fonts/GeistMonoVF.woff diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/fonts/GeistVF.woff b/examples/javascript-ext/turborepo-demo/apps/web/app/fonts/GeistVF.woff similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/fonts/GeistVF.woff rename to examples/javascript-ext/turborepo-demo/apps/web/app/fonts/GeistVF.woff diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/globals.css b/examples/javascript-ext/turborepo-demo/apps/web/app/globals.css similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/globals.css rename to examples/javascript-ext/turborepo-demo/apps/web/app/globals.css diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/layout.tsx b/examples/javascript-ext/turborepo-demo/apps/web/app/layout.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/layout.tsx rename to examples/javascript-ext/turborepo-demo/apps/web/app/layout.tsx diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/page.module.css b/examples/javascript-ext/turborepo-demo/apps/web/app/page.module.css similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/page.module.css rename to examples/javascript-ext/turborepo-demo/apps/web/app/page.module.css diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/app/page.tsx b/examples/javascript-ext/turborepo-demo/apps/web/app/page.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/app/page.tsx rename to examples/javascript-ext/turborepo-demo/apps/web/app/page.tsx diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/eslint.config.js b/examples/javascript-ext/turborepo-demo/apps/web/eslint.config.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/eslint.config.js rename to examples/javascript-ext/turborepo-demo/apps/web/eslint.config.js diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/next.config.js b/examples/javascript-ext/turborepo-demo/apps/web/next.config.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/next.config.js rename to examples/javascript-ext/turborepo-demo/apps/web/next.config.js diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/package.json b/examples/javascript-ext/turborepo-demo/apps/web/package.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/package.json rename to examples/javascript-ext/turborepo-demo/apps/web/package.json diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/file-text.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/file-text.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/file-text.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/file-text.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/globe.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/globe.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/globe.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/globe.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/next.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/next.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/next.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/next.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/turborepo-dark.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/turborepo-dark.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/turborepo-dark.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/turborepo-dark.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/turborepo-light.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/turborepo-light.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/turborepo-light.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/turborepo-light.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/vercel.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/vercel.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/vercel.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/vercel.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/public/window.svg b/examples/javascript-ext/turborepo-demo/apps/web/public/window.svg similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/public/window.svg rename to examples/javascript-ext/turborepo-demo/apps/web/public/window.svg diff --git a/examples/nodejs-ext/turborepo-demo/apps/web/tsconfig.json b/examples/javascript-ext/turborepo-demo/apps/web/tsconfig.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/apps/web/tsconfig.json rename to examples/javascript-ext/turborepo-demo/apps/web/tsconfig.json diff --git a/examples/nodejs-ext/turborepo-demo/package-lock.json b/examples/javascript-ext/turborepo-demo/package-lock.json similarity index 99% rename from examples/nodejs-ext/turborepo-demo/package-lock.json rename to examples/javascript-ext/turborepo-demo/package-lock.json index f955a169e..ecf2fcf74 100644 --- a/examples/nodejs-ext/turborepo-demo/package-lock.json +++ b/examples/javascript-ext/turborepo-demo/package-lock.json @@ -950,6 +950,7 @@ "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.0.2" } @@ -1010,6 +1011,7 @@ "integrity": "sha512-g3WpVQHngx0aLXn6kfIYCZxM6rRJlWzEkVpqEFLT3SgEDsp9cpCbxxgwnE504q4H+ruSDh/VGS6nqZIDynP+vg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.39.0", "@typescript-eslint/types": "8.39.0", @@ -1271,6 +1273,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2063,6 +2066,7 @@ "integrity": "sha512-LSehfdpgMeWcTZkWZVIJl+tkZ2nuSkyyB9C27MZqFWXuph7DvaowgcTvKqxvpLW1JZIk8PN7hFY3Rj9LQ7m7lg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", @@ -3771,6 +3775,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -3780,6 +3785,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.26.0" }, @@ -4407,6 +4413,7 @@ "integrity": "sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "turbo": "bin/turbo" }, @@ -4600,6 +4607,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/examples/nodejs-ext/turborepo-demo/package.json b/examples/javascript-ext/turborepo-demo/package.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/package.json rename to examples/javascript-ext/turborepo-demo/package.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/eslint-config/README.md b/examples/javascript-ext/turborepo-demo/packages/eslint-config/README.md similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/eslint-config/README.md rename to examples/javascript-ext/turborepo-demo/packages/eslint-config/README.md diff --git a/examples/nodejs-ext/turborepo-demo/packages/eslint-config/base.js b/examples/javascript-ext/turborepo-demo/packages/eslint-config/base.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/eslint-config/base.js rename to examples/javascript-ext/turborepo-demo/packages/eslint-config/base.js diff --git a/examples/nodejs-ext/turborepo-demo/packages/eslint-config/next.js b/examples/javascript-ext/turborepo-demo/packages/eslint-config/next.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/eslint-config/next.js rename to examples/javascript-ext/turborepo-demo/packages/eslint-config/next.js diff --git a/examples/nodejs-ext/turborepo-demo/packages/eslint-config/package.json b/examples/javascript-ext/turborepo-demo/packages/eslint-config/package.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/eslint-config/package.json rename to examples/javascript-ext/turborepo-demo/packages/eslint-config/package.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/eslint-config/react-internal.js b/examples/javascript-ext/turborepo-demo/packages/eslint-config/react-internal.js similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/eslint-config/react-internal.js rename to examples/javascript-ext/turborepo-demo/packages/eslint-config/react-internal.js diff --git a/examples/nodejs-ext/turborepo-demo/packages/typescript-config/base.json b/examples/javascript-ext/turborepo-demo/packages/typescript-config/base.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/typescript-config/base.json rename to examples/javascript-ext/turborepo-demo/packages/typescript-config/base.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/typescript-config/nextjs.json b/examples/javascript-ext/turborepo-demo/packages/typescript-config/nextjs.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/typescript-config/nextjs.json rename to examples/javascript-ext/turborepo-demo/packages/typescript-config/nextjs.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/typescript-config/package.json b/examples/javascript-ext/turborepo-demo/packages/typescript-config/package.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/typescript-config/package.json rename to examples/javascript-ext/turborepo-demo/packages/typescript-config/package.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/typescript-config/react-library.json b/examples/javascript-ext/turborepo-demo/packages/typescript-config/react-library.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/typescript-config/react-library.json rename to examples/javascript-ext/turborepo-demo/packages/typescript-config/react-library.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/ui/eslint.config.mjs b/examples/javascript-ext/turborepo-demo/packages/ui/eslint.config.mjs similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/ui/eslint.config.mjs rename to examples/javascript-ext/turborepo-demo/packages/ui/eslint.config.mjs diff --git a/examples/nodejs-ext/turborepo-demo/packages/ui/package.json b/examples/javascript-ext/turborepo-demo/packages/ui/package.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/ui/package.json rename to examples/javascript-ext/turborepo-demo/packages/ui/package.json diff --git a/examples/nodejs-ext/turborepo-demo/packages/ui/src/button.tsx b/examples/javascript-ext/turborepo-demo/packages/ui/src/button.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/ui/src/button.tsx rename to examples/javascript-ext/turborepo-demo/packages/ui/src/button.tsx diff --git a/examples/nodejs-ext/turborepo-demo/packages/ui/src/card.tsx b/examples/javascript-ext/turborepo-demo/packages/ui/src/card.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/ui/src/card.tsx rename to examples/javascript-ext/turborepo-demo/packages/ui/src/card.tsx diff --git a/examples/nodejs-ext/turborepo-demo/packages/ui/src/code.tsx b/examples/javascript-ext/turborepo-demo/packages/ui/src/code.tsx similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/ui/src/code.tsx rename to examples/javascript-ext/turborepo-demo/packages/ui/src/code.tsx diff --git a/examples/nodejs-ext/turborepo-demo/packages/ui/tsconfig.json b/examples/javascript-ext/turborepo-demo/packages/ui/tsconfig.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/packages/ui/tsconfig.json rename to examples/javascript-ext/turborepo-demo/packages/ui/tsconfig.json diff --git a/examples/nodejs-ext/turborepo-demo/turbo.json b/examples/javascript-ext/turborepo-demo/turbo.json similarity index 100% rename from examples/nodejs-ext/turborepo-demo/turbo.json rename to examples/javascript-ext/turborepo-demo/turbo.json diff --git a/global.json b/global.json index a8ab760dd..ffa6e939f 100644 --- a/global.json +++ b/global.json @@ -2,4 +2,5 @@ "sdk": { "allowPrerelease": false } -} \ No newline at end of file +} + diff --git a/nuget.config b/nuget.config index 16a6b5139..d06d9d3ce 100644 --- a/nuget.config +++ b/nuget.config @@ -6,13 +6,8 @@ - - - - - diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.csproj b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.csproj similarity index 79% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.csproj rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.csproj index 324dc983e..7fbb8610e 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.csproj +++ b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.csproj @@ -7,11 +7,15 @@ - + + + + +
diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/JavaScriptHostingExtensions.cs similarity index 92% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/JavaScriptHostingExtensions.cs index d0269a14c..a886f5ddd 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NodeJSHostingExtensions.cs +++ b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/JavaScriptHostingExtensions.cs @@ -1,14 +1,14 @@ ο»Ώusing Aspire.Hosting.ApplicationModel; -using Aspire.Hosting.NodeJs; +using Aspire.Hosting.JavaScript; using CommunityToolkit.Aspire.Utils; using Microsoft.Extensions.Hosting; namespace Aspire.Hosting; /// -/// Provides extension methods for adding Node.js applications to the distributed application builder. +/// Provides extension methods for adding JavaScript applications to the distributed application builder. /// -public static partial class NodeJSHostingExtensions +public static partial class JavaScriptHostingExtensions { /// /// Adds an Nx monorepo workspace to the distributed application builder. @@ -78,7 +78,17 @@ public static IResourceBuilder AddApp(this IResourceBuilder(out var executionAnnotation)) { - rb.WithAnnotation(executionAnnotation); + rb.WithCommand(executionAnnotation.ExecutableName switch + { + "npm" => "npx", + "yarn" => "yarn", + "pnpm" => "pnpx", + _ => executionAnnotation.ExecutableName + }) + .WithArgs(context => + { + context.Args.Insert(0, executionAnnotation.ScriptCommand ?? "nx"); + }); } // If the workspace has an installer annotation, wait for the installer to complete @@ -118,7 +128,17 @@ public static IResourceBuilder AddApp(this IResourceBuilde // If the workspace is configured to use a package manager, bring that annotation forward if (builder.Resource.TryGetLastAnnotation(out var executionAnnotation)) { - rb.WithAnnotation(executionAnnotation); + rb.WithCommand(executionAnnotation.ExecutableName switch + { + "npm" => "npx", + "yarn" => "yarn", + "pnpm" => "pnpx", + _ => executionAnnotation.ExecutableName + }) + .WithArgs(context => + { + context.Args.Insert(0, executionAnnotation.ScriptCommand ?? "nx"); + }); } // If the workspace has an installer annotation, wait for the installer to complete @@ -139,7 +159,7 @@ public static IResourceBuilder AddApp(this IResourceBuilde /// The package manager to use. If none is provided it will attempt to use the installer annotation's resource command. /// A reference to the . /// Thrown if the Nx workspace is already configured to use a different package manager. - public static IResourceBuilder RunWithPackageManager(this IResourceBuilder builder, string? packageManager = null) + public static IResourceBuilder WithPackageManagerLaunch(this IResourceBuilder builder, string? packageManager = null) { ArgumentNullException.ThrowIfNull(builder); @@ -176,7 +196,7 @@ public static IResourceBuilder RunWithPackageManager(this IResourceB /// The package manager to use. If none is provided it will attempt to use the installer annotation's resource command. /// A reference to the . /// Thrown if the Turborepo workspace is already configured to use a different package manager. - public static IResourceBuilder RunWithPackageManager(this IResourceBuilder builder, string? packageManager = null) + public static IResourceBuilder WithPackageManagerLaunch(this IResourceBuilder builder, string? packageManager = null) { ArgumentNullException.ThrowIfNull(builder); @@ -207,12 +227,12 @@ public static IResourceBuilder RunWithPackageManager(this IRe } /// - /// Maps the endpoint port for the to the appropriate command line argument. + /// Maps the endpoint port for the to the appropriate command line argument. /// /// The Node.js app resource. /// The name of the endpoint to map. If not specified, it will use the first HTTP or HTTPS endpoint found. /// A reference to the . - public static IResourceBuilder WithMappedEndpointPort(this IResourceBuilder builder, string? endpointName = null) where TResource : NodeAppResource + public static IResourceBuilder WithMappedEndpointPort(this IResourceBuilder builder, string? endpointName = null) where TResource : JavaScriptAppResource { ArgumentNullException.ThrowIfNull(builder); @@ -220,7 +240,7 @@ public static IResourceBuilder WithMappedEndpointPort(this { var resource = builder.Resource; - // monorepo tools and npm (from Aspire.Hosting.NodeJS) need `--`, but yarn and pnpm don't + // monorepo tools and npm (from Aspire.Hosting.JavaScript) need `--`, but yarn and pnpm don't if (!resource.TryGetLastAnnotation(out var executionAnnotation) || executionAnnotation.ExecutableName == "npm") { ctx.Args.Add("--"); @@ -373,7 +393,7 @@ private static void AddMonorepoInstaller( } } - private static IResourceBuilder WithNodeDefaults(this IResourceBuilder builder) where TResource : NodeAppResource => + private static IResourceBuilder WithNodeDefaults(this IResourceBuilder builder) where TResource : JavaScriptAppResource => builder.WithOtlpExporter() .WithEnvironment("NODE_ENV", builder.ApplicationBuilder.Environment.IsDevelopment() ? "development" : "production") .WithCertificateTrustConfiguration((ctx) => diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/JavaScriptPackageManagerConfiguredAnnotation.cs b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/JavaScriptPackageManagerConfiguredAnnotation.cs similarity index 100% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/JavaScriptPackageManagerConfiguredAnnotation.cs rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/JavaScriptPackageManagerConfiguredAnnotation.cs diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/MONOREPO.md b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/MONOREPO.md similarity index 70% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/MONOREPO.md rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/MONOREPO.md index 54e0511fa..8ebeec273 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/MONOREPO.md +++ b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/MONOREPO.md @@ -10,10 +10,10 @@ When using monorepos, multiple applications share the same `package.json` and wo // This causes race conditions - multiple installers for the same directory var app1 = builder.AddYarnApp("app-1", "./Frontend", args: ["app1"]) .WithYarnPackageInstallation(); - + var app2 = builder.AddYarnApp("app-2", "./Frontend", args: ["app2"]) .WithYarnPackageInstallation(); - + var app3 = builder.AddYarnApp("app-3", "./Frontend", args: ["app3"]) .WithYarnPackageInstallation(); ``` @@ -48,35 +48,36 @@ var app3 = turbo.AddApp("app3"); Both Nx and Turborepo support yarn and pnpm package managers: -- `.WithYarnPackageInstaller()` - uses yarn -- `.WithPnpmPackageInstaller()` - uses pnpm +- `.WithYarnPackageInstaller()` - uses yarn +- `.WithPnpmPackageInstaller()` - uses pnpm -> **Note**: npm support (`AddNpmApp`, `WithNpmPackageInstallation`) is now provided by [Aspire.Hosting.NodeJS](https://www.nuget.org/packages/Aspire.Hosting.NodeJS) starting with Aspire 13. +> **Note**: npm support (`AddNpmApp`, `WithNpmPackageInstallation`) is now provided by [Aspire.Hosting.JavaScript](https://www.nuget.org/packages/Aspire.Hosting.JavaScript) starting with Aspire 13. ### Configuring Package Manager for App Execution -Use `RunWithPackageManager()` to configure which package manager command is used when running individual apps: +Use `WithPackageManagerLaunch()` to configure which package manager command is used when running individual apps: ```csharp // Auto-infer from package installer annotation var nx = builder.AddNxApp("nx", workingDirectory: "../frontend") .WithYarnPackageInstaller() - .RunWithPackageManager(); // Will use 'yarn' command + .WithPackageManagerLaunch(); // Will use 'yarn' command // Explicitly specify package manager (independent of installer) var turbo = builder.AddTurborepoApp("turbo", workingDirectory: "../frontend") .WithPnpmPackageInstaller() - .RunWithPackageManager("yarn"); // Uses 'yarn' despite pnpm installer + .WithPackageManagerLaunch("yarn"); // Uses 'yarn' despite pnpm installer -// Without RunWithPackageManager - uses default commands +// Without WithPackageManagerLaunch - uses default commands var nxDefault = builder.AddNxApp("nx-default", workingDirectory: "../frontend"); nxDefault.AddApp("app1"); // Runs: nx serve app1 (no package manager prefix) ``` **Command Generation Examples:** -- `RunWithPackageManager("yarn")` β†’ `yarn nx serve app1` or `yarn turbo run dev --filter app1` -- `RunWithPackageManager("pnpm")` β†’ `pnpm nx serve app1` or `pnpm turbo run dev --filter app1` -- No `RunWithPackageManager()` β†’ `nx serve app1` or `turbo run dev --filter app1` + +- `WithPackageManagerLaunch("yarn")` β†’ `yarn nx serve app1` or `yarn turbo run dev --filter app1` +- `WithPackageManagerLaunch("pnpm")` β†’ `pnpm nx serve app1` or `pnpm turbo run dev --filter app1` +- No `WithPackageManagerLaunch()` β†’ `nx serve app1` or `turbo run dev --filter app1` ## How It Works @@ -87,12 +88,14 @@ nxDefault.AddApp("app1"); // Runs: nx serve app1 (no package manager prefix) ## Commands Generated ### Nx Apps -- Command: `nx serve {appName}` -- The `appName` parameter controls which app Nx serves -### Turborepo Apps -- Command: `turbo run dev --filter {filter}` -- The `filter` parameter controls which packages Turborepo builds/serves +- Command: `nx serve {appName}` +- The `appName` parameter controls which app Nx serves + +### Turborepo Apps + +- Command: `turbo run dev --filter {filter}` +- The `filter` parameter controls which packages Turborepo builds/serves ## Migration @@ -102,10 +105,10 @@ If you're currently using the workaround pattern: // Old workaround approach var app1 = builder.AddYarnApp("app-1", "./Frontend", args: ["app1"]) .WithYarnPackageInstallation(); - + var app2 = builder.AddYarnApp("app-2", "./Frontend", args: ["app2"]) .WaitFor(app1); // Manual dependency - + var app3 = builder.AddYarnApp("app-3", "./Frontend", args: ["app3"]) .WaitFor(app1); // Manual dependency ``` @@ -116,10 +119,10 @@ You can migrate to: // New monorepo approach var nx = builder.AddNxApp("nx", workingDirectory: "./Frontend") .WithYarnPackageInstaller() - .RunWithPackageManager(); // Configure package manager for app execution + .WithPackageManagerLaunch(); // Configure package manager for app execution var app1 = nx.AddApp("app-1", appName: "app1"); -var app2 = nx.AddApp("app-2", appName: "app2"); +var app2 = nx.AddApp("app-2", appName: "app2"); var app3 = nx.AddApp("app-3", appName: "app3"); ``` @@ -131,13 +134,14 @@ This provides cleaner syntax and automatic dependency management. It's important to understand the difference between package installation and app execution: -- **Package Installer** (`.WithYarnPackageInstaller()`, `.WithPnpmPackageInstaller()`) - Controls how packages are installed in the workspace -- **Package Manager for Apps** (`.RunWithPackageManager()`) - Controls which command is used to run individual apps +- **Package Installer** (`.WithYarnPackageInstaller()`, `.WithPnpmPackageInstaller()`) - Controls how packages are installed in the workspace +- **Package Manager for Apps** (`.WithPackageManagerLaunch()`) - Controls which command is used to run individual apps ```csharp var nx = builder.AddNxApp("nx", workingDirectory: "../frontend") - .WithPnpmPackageInstaller() // Install packages with: pnpm install - .RunWithPackageManager("yarn"); // Run apps with: yarn nx serve app1 + .WithPnpmPackageInstaller() // Install packages with: pnpm install + .WithPackageManagerLaunch("yarn"); // Run apps with: yarn nx serve app1 // This is valid - you can install with pnpm but run apps with yarn -``` \ No newline at end of file +``` + diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NxAppResource.cs b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/NxAppResource.cs similarity index 87% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NxAppResource.cs rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/NxAppResource.cs index 7d1ec7a8c..eff0932d5 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NxAppResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/NxAppResource.cs @@ -1,4 +1,4 @@ -using Aspire.Hosting.ApplicationModel; +using Aspire.Hosting.JavaScript; namespace Aspire.Hosting.ApplicationModel; @@ -10,7 +10,7 @@ namespace Aspire.Hosting.ApplicationModel; /// The Nx app name to run (used in 'nx serve {appName}'). /// The command to run (default is 'nx'). public class NxAppResource(string name, string workingDirectory, string appName, string command = "nx") - : NodeAppResource(name, command, workingDirectory) + : JavaScriptAppResource(name, command, workingDirectory) { /// /// Gets the Nx application name. diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NxResource.cs b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/NxResource.cs similarity index 100% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/NxResource.cs rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/NxResource.cs diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/README.md similarity index 72% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/README.md index e816786e2..992bea1db 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/README.md +++ b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/README.md @@ -1,6 +1,6 @@ -# CommunityToolkit.Aspire.Hosting.NodeJS.Extensions library +# CommunityToolkit.Aspire.Hosting.JavaScript.Extensions library -This integration contains extensions for the [Node.js hosting package](https://nuget.org/packages/Aspire.Hosting.NodeJs) for Aspire, including support for frontend monorepos (Nx, Turborepo). +This integration contains extensions for the [Node.js hosting package](https://nuget.org/packages/Aspire.Hosting.JavaScript) for Aspire, including support for frontend monorepos (Nx, Turborepo). ## Getting Started @@ -9,26 +9,25 @@ This integration contains extensions for the [Node.js hosting package](https://n In your AppHost project, install the package using the following command: ```dotnetcli -dotnet add package CommunityToolkit.Aspire.Hosting.NodeJS.Extensions +dotnet add package CommunityToolkit.Aspire.Hosting.JavaScript.Extensions ``` ### Example usage - For Nx and Turborepo monorepos, use the dedicated monorepo methods to avoid package installation race conditions: ```csharp // Nx workspace var nx = builder.AddNxApp("nx", workingDirectory: "../frontend") .WithYarn() - .RunWithPackageManager(); // Automatically uses yarn from installer + .WithPackageManagerLaunch(); // Automatically uses yarn from installer var app1 = nx.AddApp("app1"); var app2 = nx.AddApp("app2", appName: "my-app-2"); -// Turborepo workspace +// Turborepo workspace var turbo = builder.AddTurborepoApp("turbo", workingDirectory: "../frontend") - .RunWithPackageManager("pnpm"); // Explicitly specify pnpm + .WithPackageManagerLaunch("pnpm"); // Explicitly specify pnpm var turboApp1 = turbo.AddApp("app1"); var turboApp2 = turbo.AddApp("app2", filter: "custom-filter"); @@ -38,18 +37,18 @@ See [MONOREPO.md](./MONOREPO.md) for detailed documentation on monorepo support. ### Configuring Package Manager for Monorepos -The `RunWithPackageManager()` method configures which package manager command is used when running individual apps in Nx or Turborepo workspaces: +The `WithPackageManagerLaunch()` method configures which package manager command is used when running individual apps in Nx or Turborepo workspaces: ```csharp // Auto-infer from package installer var nx = builder.AddNxApp("nx", workingDirectory: "../frontend") .WithYarn() - .RunWithPackageManager(); // Uses 'yarn' command + .WithPackageManagerLaunch(); // Uses 'yarn' command // Explicitly specify package manager var turbo = builder.AddTurborepoApp("turbo", workingDirectory: "../frontend") .WithPnpm() - .RunWithPackageManager("pnpm"); // Uses 'pnpm' command + .WithPackageManagerLaunch("pnpm"); // Uses 'pnpm' command // Generated commands: // Nx with yarn: yarn nx serve app1 @@ -62,7 +61,7 @@ You can pass additional flags to package managers during installation: ```csharp // yarn with frozen lockfile -builder.AddYarnApp("yarn-app", "./path/to/app") +builder.AddYarnApp("yarn-app", "./path/to/app") .WithYarnPackageInstallation(configureInstaller => { configureInstaller.WithArgs("--frozen-lockfile", "--verbose"); diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/TurborepoAppResource.cs b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/TurborepoAppResource.cs similarity index 88% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/TurborepoAppResource.cs rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/TurborepoAppResource.cs index 0b375edea..ae9194a46 100644 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/TurborepoAppResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/TurborepoAppResource.cs @@ -1,4 +1,4 @@ -using Aspire.Hosting.ApplicationModel; +using Aspire.Hosting.JavaScript; namespace Aspire.Hosting.ApplicationModel; @@ -10,7 +10,7 @@ namespace Aspire.Hosting.ApplicationModel; /// The Turborepo filter to use (used in 'turbo run dev --filter={filter}'). /// The command to run (default is 'turbo'). public class TurborepoAppResource(string name, string workingDirectory, string filter, string command = "turbo") - : NodeAppResource(name, command, workingDirectory) + : JavaScriptAppResource(name, command, workingDirectory) { /// /// Gets the Turborepo filter. diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/TurborepoResource.cs b/src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/TurborepoResource.cs similarity index 100% rename from src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/TurborepoResource.cs rename to src/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions/TurborepoResource.cs diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj b/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj index 73320b3f0..72feafe99 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/CommunityToolkit.Aspire.Hosting.McpInspector.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs index 318728f20..ad1769617 100644 --- a/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs +++ b/src/CommunityToolkit.Aspire.Hosting.McpInspector/McpInspectorResource.cs @@ -1,4 +1,4 @@ -using System.Diagnostics.CodeAnalysis; +using Aspire.Hosting.JavaScript; namespace Aspire.Hosting.ApplicationModel; diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md deleted file mode 100644 index 9c4080a6b..000000000 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/REFACTORING_NOTES.md +++ /dev/null @@ -1,107 +0,0 @@ -# Node.js Package Installer Refactoring - -This refactoring transforms the Node.js package installers from lifecycle hooks to ExecutableResource-based resources, addressing issue #732. - -## What Changed - -### Before (Lifecycle Hook Approach) -- Package installation was handled by lifecycle hooks during `BeforeStartAsync` -- No visibility into installation progress in the dashboard -- Limited logging capabilities -- Process management handled manually via `Process.Start` - -### After (Resource-Based Approach) -- Package installers are now proper `ExecutableResource` instances -- They appear as separate resources in the Aspire dashboard -- Full console output visibility and logging -- DCP (Distributed Application Control Plane) handles process management -- Parent-child relationships ensure proper startup ordering - -## New Resource Classes - -### NpmInstallerResource -```csharp -var installer = new NpmInstallerResource("npm-installer", "/path/to/project", useCI: true); -// Supports both 'npm install' and 'npm ci' commands -``` - -### YarnInstallerResource -```csharp -var installer = new YarnInstallerResource("yarn-installer", "/path/to/project"); -// Executes 'yarn install' command -``` - -### PnpmInstallerResource -```csharp -var installer = new PnpmInstallerResource("pnpm-installer", "/path/to/project"); -// Executes 'pnpm install' command -``` - -## Usage Examples - -### Basic Usage (No API Changes) -```csharp -var builder = DistributedApplication.CreateBuilder(); - -// API remains the same - behavior is now resource-based -var viteApp = builder.AddViteApp("frontend", "./frontend") - .WithNpmPackageInstallation(useCI: true); - -var backendApp = builder.AddYarnApp("backend", "./backend") - .WithYarnPackageInstallation(); -``` - -### What Happens Under the Hood -```csharp -// This now creates: -// 1. NodeAppResource named "frontend" -// 2. NpmInstallerResource named "frontend-npm-install" (child of frontend) -// 3. WaitAnnotation on frontend to wait for installer completion -// 4. ResourceRelationshipAnnotation linking installer to parent -``` - -## Benefits - -### Dashboard Visibility -- Installer resources appear as separate items in the Aspire dashboard -- Real-time console output from package installation -- Clear status indication (starting, running, completed, failed) -- Ability to re-run installations if needed - -### Better Resource Management -- DCP handles process lifecycle instead of manual `Process.Start` -- Proper resource cleanup and error handling -- Integration with Aspire's logging and monitoring systems - -### Improved Startup Ordering -- Parent resources automatically wait for installer completion -- Failed installations prevent app startup (fail-fast behavior) -- Clear dependency visualization in the dashboard - -### Development vs Production -- Installers only run during development (excluded from publish mode) -- No overhead in production deployments -- Maintains backward compatibility - -## Migration Guide - -### For Users -No changes required! The existing APIs (`WithNpmPackageInstallation`, `WithYarnPackageInstallation`, `WithPnpmPackageInstallation`) work exactly the same. - -### For Contributors -The lifecycle hook classes are marked as `[Obsolete]` but remain functional for backward compatibility: -- `NpmPackageInstallerLifecycleHook` -- `YarnPackageInstallerLifecycleHook` -- `PnpmPackageInstallerLifecycleHook` -- `NodePackageInstaller` - -These will be removed in a future version once all usage has migrated to the resource-based approach. - -## Testing - -Comprehensive test coverage includes: -- Unit tests for installer resource properties and command generation -- Integration tests for parent-child relationships -- Cross-platform compatibility (Windows vs Unix commands) -- Publish mode exclusion verification -- Wait annotation and resource relationship validation \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs b/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs deleted file mode 100644 index 31be5f568..000000000 --- a/src/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions/api/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.cs +++ /dev/null @@ -1,112 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ -namespace Aspire.Hosting -{ - public sealed partial class JavaScriptPackageInstallerAnnotation : ApplicationModel.IResourceAnnotation - { - public JavaScriptPackageInstallerAnnotation(ApplicationModel.ExecutableResource installerResource) { } - - public ApplicationModel.ExecutableResource Resource { get { throw null; } } - } - - public sealed partial class JavaScriptPackageManagerAnnotation : ApplicationModel.IResourceAnnotation - { - public JavaScriptPackageManagerAnnotation(string packageManager) { } - - public string PackageManager { get { throw null; } } - } - - public static partial class NodeJSHostingExtensions - { - public static ApplicationModel.IResourceBuilder AddApp(this ApplicationModel.IResourceBuilder builder, string name, string? appName = null, System.Func, ApplicationModel.IResourceBuilder>? configure = null) { throw null; } - - public static ApplicationModel.IResourceBuilder AddApp(this ApplicationModel.IResourceBuilder builder, string name, string? filter = null, System.Func, ApplicationModel.IResourceBuilder>? configure = null) { throw null; } - - public static ApplicationModel.IResourceBuilder AddNxApp(this IDistributedApplicationBuilder builder, string name, string? workingDirectory = null) { throw null; } - - public static ApplicationModel.IResourceBuilder AddPnpmApp(this IDistributedApplicationBuilder builder, string name, string workingDirectory, string scriptName = "start", string[]? args = null) { throw null; } - - public static ApplicationModel.IResourceBuilder AddTurborepoApp(this IDistributedApplicationBuilder builder, string name, string? workingDirectory = null) { throw null; } - - public static ApplicationModel.IResourceBuilder AddViteApp(this IDistributedApplicationBuilder builder, string name, string? workingDirectory = null, string packageManager = "npm", bool useHttps = false) { throw null; } - - public static ApplicationModel.IResourceBuilder AddYarnApp(this IDistributedApplicationBuilder builder, string name, string workingDirectory, string scriptName = "start", string[]? args = null) { throw null; } - - public static ApplicationModel.IResourceBuilder RunWithPackageManager(this ApplicationModel.IResourceBuilder builder, string? packageManager = null) { throw null; } - - public static ApplicationModel.IResourceBuilder RunWithPackageManager(this ApplicationModel.IResourceBuilder builder, string? packageManager = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithMappedEndpointPort(this ApplicationModel.IResourceBuilder builder, string? endpointName = null) - where TResource : NodeAppResource { throw null; } - - public static ApplicationModel.IResourceBuilder WithNpmPackageInstallation(this ApplicationModel.IResourceBuilder resource, bool useCI = false, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithNpmPackageInstaller(this ApplicationModel.IResourceBuilder resource, bool useCI = false, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithNpmPackageInstaller(this ApplicationModel.IResourceBuilder resource, bool useCI = false, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithPnpmPackageInstallation(this ApplicationModel.IResourceBuilder resource, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithPnpmPackageInstaller(this ApplicationModel.IResourceBuilder resource, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithPnpmPackageInstaller(this ApplicationModel.IResourceBuilder resource, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithYarnPackageInstallation(this ApplicationModel.IResourceBuilder resource, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithYarnPackageInstaller(this ApplicationModel.IResourceBuilder resource, System.Action>? configureInstaller = null) { throw null; } - - public static ApplicationModel.IResourceBuilder WithYarnPackageInstaller(this ApplicationModel.IResourceBuilder resource, System.Action>? configureInstaller = null) { throw null; } - } -} - -namespace Aspire.Hosting.ApplicationModel -{ - public partial class NpmInstallerResource : ExecutableResource - { - public NpmInstallerResource(string name, string workingDirectory) : base(default!, default!, default!) { } - } - - public partial class NxAppResource : NodeAppResource - { - public NxAppResource(string name, string workingDirectory, string appName, string command = "nx") : base(default!, default!, default!) { } - - public string AppName { get { throw null; } } - } - - public partial class NxResource : Resource - { - public NxResource(string name, string workingDirectory) : base(default!) { } - - public string WorkingDirectory { get { throw null; } } - } - - public partial class PnpmInstallerResource : ExecutableResource - { - public PnpmInstallerResource(string name, string workingDirectory) : base(default!, default!, default!) { } - } - - public partial class TurborepoAppResource : NodeAppResource - { - public TurborepoAppResource(string name, string workingDirectory, string filter, string command = "turbo") : base(default!, default!, default!) { } - - public string Filter { get { throw null; } } - } - - public partial class TurborepoResource : Resource - { - public TurborepoResource(string name, string workingDirectory) : base(default!) { } - - public string WorkingDirectory { get { throw null; } } - } - - public partial class YarnInstallerResource : ExecutableResource - { - public YarnInstallerResource(string name, string workingDirectory) : base(default!, default!, default!) { } - } -} \ No newline at end of file diff --git a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj index 4d6914c83..22d199112 100644 --- a/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj +++ b/src/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions/CommunityToolkit.Aspire.Hosting.SqlServer.Extensions.csproj @@ -18,11 +18,5 @@ - - - - - - diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/AppHostTests.cs similarity index 69% rename from tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs rename to tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/AppHostTests.cs index 356141491..fd01a487a 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/AppHostTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/AppHostTests.cs @@ -1,8 +1,8 @@ using CommunityToolkit.Aspire.Testing; -namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; +namespace CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests; -public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> +public class AppHostTests(AspireIntegrationTestFixture fixture) : IClassFixture> { [Theory] [InlineData("turbo-web")] diff --git a/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests.csproj new file mode 100644 index 000000000..487020628 --- /dev/null +++ b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests.csproj @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/NxResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/NxResourceCreationTests.cs similarity index 84% rename from tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/NxResourceCreationTests.cs rename to tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/NxResourceCreationTests.cs index dcc44c4fd..081f38574 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/NxResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/NxResourceCreationTests.cs @@ -1,7 +1,7 @@ using Aspire.Hosting; -using Aspire.Hosting.NodeJs; +using Aspire.Hosting.JavaScript; -namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; +namespace CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests; public class NxResourceCreationTests { @@ -58,10 +58,10 @@ public void NxResource_IsRunningState() [InlineData("npm")] [InlineData("yarn")] [InlineData("pnpm")] - public async Task Nx_RunWithPackageManager_InfersFromInstallerWhenNotProvided(string packageManager) + public async Task Nx_WithPackageManagerLaunch_InfersFromInstallerWhenNotProvided(string packageManager) { var builder = DistributedApplication.CreateBuilder(); - // Attach a yarn installer annotation to the Nx resource, then call RunWithPackageManager with no arg + // Attach a yarn installer annotation to the Nx resource, then call WithPackageManagerLaunch with no arg var nxBuilder = builder.AddNxApp("nx-with-installer"); nxBuilder = (packageManager switch @@ -70,7 +70,7 @@ public async Task Nx_RunWithPackageManager_InfersFromInstallerWhenNotProvided(st "yarn" => nxBuilder.WithYarn(), "pnpm" => nxBuilder.WithPnpm(), _ => throw new ArgumentOutOfRangeException(nameof(packageManager), $"Unsupported package manager: {packageManager}"), - }).RunWithPackageManager(); + }).WithPackageManagerLaunch(); // Add an app to the Nx workspace to verify app-level command/args var app1 = nxBuilder.AddApp("app1"); @@ -87,31 +87,36 @@ public async Task Nx_RunWithPackageManager_InfersFromInstallerWhenNotProvided(st // Verify the created NxAppResource command and args var nxAppResource = Assert.Single(appModel.Resources.OfType()); // For the inferred package manager, AddApp uses the corresponding command - Assert.True(nxAppResource.TryGetLastAnnotation(out var appPm)); - Assert.Equal(packageManager, appPm.ExecutableName); - Assert.Equal("nx", nxAppResource.Command); + Assert.Equal(packageManager switch + { + "npm" => "npx", + "yarn" => "yarn", + "pnpm" => "pnpx", + _ => packageManager + }, nxAppResource.Command); var nxAppArgs = await nxAppResource.GetArgumentValuesAsync(); Assert.Collection(nxAppArgs, + arg => Assert.Equal("nx", arg), arg => Assert.Equal("serve", arg), arg => Assert.Equal("app1", arg)); } [Fact] - public void Nx_RunWithPackageManager_ThrowsWhenNotConfigured() + public void Nx_WithPackageManagerLaunch_ThrowsWhenNotConfigured() { var builder = DistributedApplication.CreateBuilder(); // No installer and no packageManager argument should cause an exception - Assert.Throws(() => builder.AddNxApp("nx-no-installer").RunWithPackageManager()); + Assert.Throws(() => builder.AddNxApp("nx-no-installer").WithPackageManagerLaunch()); } [Fact] - public async Task Nx_RunWithPackageManager_WithPnpmAndYarn() + public async Task Nx_WithPackageManagerLaunch_WithPnpmAndYarn() { var builder = DistributedApplication.CreateBuilder(); - var nxPnpm = builder.AddNxApp("nx-pnpm").WithPnpm().RunWithPackageManager(); - var nxYarn = builder.AddNxApp("nx-yarn").WithYarn().RunWithPackageManager(); + var nxPnpm = builder.AddNxApp("nx-pnpm").WithPnpm().WithPackageManagerLaunch(); + var nxYarn = builder.AddNxApp("nx-yarn").WithYarn().WithPackageManagerLaunch(); // add apps to both (use unique app names) nxPnpm.AddApp("app1-pnpm"); @@ -126,11 +131,10 @@ public async Task Nx_RunWithPackageManager_WithPnpmAndYarn() Assert.Equal("pnpm", pmPnpm.ExecutableName); var nxPnpmApp = appModel.Resources.OfType().Single(r => r.Name == "app1-pnpm"); - Assert.True(nxPnpmApp.TryGetLastAnnotation(out var appPmPnpm)); - Assert.Equal("pnpm", appPmPnpm.ExecutableName); - Assert.Equal("nx", nxPnpmApp.Command); + Assert.Equal("pnpx", nxPnpmApp.Command); var pnpmArgs = await nxPnpmApp.GetArgumentValuesAsync(); Assert.Collection(pnpmArgs, + arg => Assert.Equal("nx", arg), arg => Assert.Equal("serve", arg), arg => Assert.Equal("app1-pnpm", arg)); @@ -139,21 +143,20 @@ public async Task Nx_RunWithPackageManager_WithPnpmAndYarn() Assert.Equal("yarn", pmYarn.ExecutableName); var nxYarnApp = appModel.Resources.OfType().Single(r => r.Name == "app1-yarn"); - Assert.True(nxYarnApp.TryGetLastAnnotation(out var appPmYarn)); - Assert.Equal("yarn", appPmYarn.ExecutableName); - Assert.Equal("nx", nxYarnApp.Command); + Assert.Equal("yarn", nxYarnApp.Command); var yarnArgs = await nxYarnApp.GetArgumentValuesAsync(); Assert.Collection(yarnArgs, + arg => Assert.Equal("nx", arg), arg => Assert.Equal("serve", arg), arg => Assert.Equal("app1-yarn", arg)); } [Fact] - public async Task Nx_NoRunWithPackageManager_Defaults_AppCommandsIncludeNpxOrDefault() + public async Task Nx_NoWithPackageManagerLaunch_Defaults_AppCommandsIncludeNpxOrDefault() { var builder = DistributedApplication.CreateBuilder(); - // Nx without RunWithPackageManager or installer + // Nx without WithPackageManagerLaunch or installer var nx = builder.AddNxApp("nx-default"); nx.AddApp("app-nx-default"); @@ -178,7 +181,7 @@ public async Task Nx_WithPackageManager_WithoutRunWith_DoesNotAffectAppExecution { var builder = DistributedApplication.CreateBuilder(); - // Configure package manager but don't call RunWithPackageManager + // Configure package manager but don't call WithPackageManagerLaunch var nxBuilder = builder.AddNxApp("nx-configured-only"); nxBuilder = packageManager switch { @@ -210,14 +213,14 @@ public async Task Nx_WithPackageManager_WithoutRunWith_DoesNotAffectAppExecution } [Fact] - public void Nx_RunWithPackageManager_ExplicitOverride_UsesExplicitValue() + public void Nx_WithPackageManagerLaunch_ExplicitOverride_UsesExplicitValue() { var builder = DistributedApplication.CreateBuilder(); // Configure with npm but explicitly run with yarn var nx = builder.AddNxApp("nx-override") .WithNpm() - .RunWithPackageManager("yarn"); + .WithPackageManagerLaunch("yarn"); using var app = builder.Build(); var appModel = app.Services.GetRequiredService(); @@ -234,14 +237,14 @@ public void Nx_RunWithPackageManager_ExplicitOverride_UsesExplicitValue() } [Fact] - public void Nx_RunWithPackageManager_CalledTwiceWithSame_DoesNotThrow() + public void Nx_WithPackageManagerLaunch_CalledTwiceWithSame_DoesNotThrow() { var builder = DistributedApplication.CreateBuilder(); var nx = builder.AddNxApp("nx-idempotent") .WithYarn() - .RunWithPackageManager() - .RunWithPackageManager(); // Second call with same inferred value + .WithPackageManagerLaunch() + .WithPackageManagerLaunch(); // Second call with same inferred value using var app = builder.Build(); var appModel = app.Services.GetRequiredService(); @@ -252,16 +255,16 @@ public void Nx_RunWithPackageManager_CalledTwiceWithSame_DoesNotThrow() } [Fact] - public void Nx_RunWithPackageManager_CalledTwiceWithDifferent_Throws() + public void Nx_WithPackageManagerLaunch_CalledTwiceWithDifferent_Throws() { var builder = DistributedApplication.CreateBuilder(); var nx = builder.AddNxApp("nx-conflict") .WithYarn() - .RunWithPackageManager(); // Sets yarn + .WithPackageManagerLaunch(); // Sets yarn // Trying to change to pnpm should throw - var ex = Assert.Throws(() => nx.RunWithPackageManager("pnpm")); + var ex = Assert.Throws(() => nx.WithPackageManagerLaunch("pnpm")); Assert.Contains("already configured to run with the 'yarn' package manager", ex.Message); } @@ -281,7 +284,7 @@ public async Task Nx_MultipleApps_AllInheritExecutionAnnotation(string packageMa "pnpm" => nx.WithPnpm(), _ => throw new ArgumentOutOfRangeException(nameof(packageManager)) }; - nx = nx.RunWithPackageManager(); + nx = nx.WithPackageManagerLaunch(); nx.AddApp("app1"); nx.AddApp("app2"); @@ -295,11 +298,20 @@ public async Task Nx_MultipleApps_AllInheritExecutionAnnotation(string packageMa foreach (var nxApp in apps) { - Assert.True(nxApp.TryGetLastAnnotation(out var execution)); - Assert.Equal(packageManager, execution.ExecutableName); - Assert.Equal("nx", execution.ScriptCommand); + var launcherName = packageManager switch + { + "npm" => "npx", + "yarn" => "yarn", + "pnpm" => "pnpx", + _ => throw new ArgumentOutOfRangeException(nameof(packageManager)) + }; + + Assert.Equal(launcherName, nxApp.Command); var args = await nxApp.GetArgumentValuesAsync(); - Assert.Equal("serve", args[0]); + Assert.Collection(args, + arg => Assert.Equal("nx", arg), + arg => Assert.Equal("serve", arg), + arg => Assert.Equal(nxApp.Name, arg)); } } @@ -351,7 +363,7 @@ public void Nx_WithInstallTrue_AppsWaitForInstaller() var nx = builder.AddNxApp("nx-with-install") .WithYarn(install: true) - .RunWithPackageManager(); + .WithPackageManagerLaunch(); nx.AddApp("app1"); diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/TurborepoResourceCreationTests.cs b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/TurborepoResourceCreationTests.cs similarity index 85% rename from tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/TurborepoResourceCreationTests.cs rename to tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/TurborepoResourceCreationTests.cs index e596b5e67..cbca136f9 100644 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/TurborepoResourceCreationTests.cs +++ b/tests/CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests/TurborepoResourceCreationTests.cs @@ -1,7 +1,7 @@ using Aspire.Hosting; -using Aspire.Hosting.NodeJs; +using Aspire.Hosting.JavaScript; -namespace CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests; +namespace CommunityToolkit.Aspire.Hosting.JavaScript.Extensions.Tests; public class TurborepoResourceCreationTests { @@ -58,7 +58,7 @@ public void TurborepoResource_IsRunningState() [InlineData("npm")] [InlineData("yarn")] [InlineData("pnpm")] - public async Task Turborepo_RunWithPackageManager_InfersFromInstallerWhenNotProvided(string packageManager) + public async Task Turborepo_WithPackageManagerLaunch_InfersFromInstallerWhenNotProvided(string packageManager) { var builder = DistributedApplication.CreateBuilder(); @@ -70,7 +70,7 @@ public async Task Turborepo_RunWithPackageManager_InfersFromInstallerWhenNotProv "yarn" => turbo.WithYarn(), "pnpm" => turbo.WithPnpm(), _ => throw new ArgumentOutOfRangeException(nameof(packageManager), $"Unsupported package manager: {packageManager}"), - }).RunWithPackageManager(); + }).WithPackageManagerLaunch(); // Add an app to the Turborepo workspace to verify app-level command/args var app1 = turbo.AddApp("app1"); @@ -86,24 +86,29 @@ public async Task Turborepo_RunWithPackageManager_InfersFromInstallerWhenNotProv // Verify Turborepo app command and args var turboApp = Assert.Single(appModel.Resources.OfType()); // For the inferred package manager, AddApp uses the corresponding command - Assert.True(turboApp.TryGetLastAnnotation(out var tapm)); - Assert.Equal(packageManager, tapm.ExecutableName); - Assert.Equal("turbo", tapm.ScriptCommand); + Assert.Equal(packageManager switch + { + "npm" => "npx", + "yarn" => "yarn", + "pnpm" => "pnpx", + _ => packageManager + }, turboApp.Command); var turboArgs = await turboApp.GetArgumentValuesAsync(); Assert.Collection(turboArgs, - arg => Assert.Equal("run", arg), - arg => Assert.Equal("dev", arg), - arg => Assert.Equal("--filter", arg), - arg => Assert.Equal("app1", arg)); + arg => Assert.Equal("turbo", arg), + arg => Assert.Equal("run", arg), + arg => Assert.Equal("dev", arg), + arg => Assert.Equal("--filter", arg), + arg => Assert.Equal("app1", arg)); } [Fact] - public async Task Turborepo_RunWithPackageManager_WithPnpmAndYarn() + public async Task Turborepo_WithPackageManagerLaunch_WithPnpmAndYarn() { var builder = DistributedApplication.CreateBuilder(); - var turboPnpm = builder.AddTurborepoApp("turbo-pnpm").WithPnpm().RunWithPackageManager(); - var turboYarn = builder.AddTurborepoApp("turbo-yarn").WithYarn().RunWithPackageManager(); + var turboPnpm = builder.AddTurborepoApp("turbo-pnpm").WithPnpm().WithPackageManagerLaunch(); + var turboYarn = builder.AddTurborepoApp("turbo-yarn").WithYarn().WithPackageManagerLaunch(); turboPnpm.AddApp("app1-pnpm"); turboYarn.AddApp("app1-yarn"); @@ -117,11 +122,10 @@ public async Task Turborepo_RunWithPackageManager_WithPnpmAndYarn() Assert.Equal("pnpm", tpmPnpm.ExecutableName); var turboPnpmApp = appModel.Resources.OfType().Single(r => r.Name == "app1-pnpm"); - Assert.True(turboPnpmApp.TryGetLastAnnotation(out var tapmPnpm)); - Assert.Equal("pnpm", tapmPnpm.ExecutableName); - Assert.Equal("turbo", tapmPnpm.ScriptCommand); + Assert.Equal("pnpx", turboPnpmApp.Command); var tpnpmArgs = await turboPnpmApp.GetArgumentValuesAsync(); Assert.Collection(tpnpmArgs, + arg => Assert.Equal("turbo", arg), arg => Assert.Equal("run", arg), arg => Assert.Equal("dev", arg), arg => Assert.Equal("--filter", arg), @@ -132,11 +136,10 @@ public async Task Turborepo_RunWithPackageManager_WithPnpmAndYarn() Assert.Equal("yarn", tpmYarn.ExecutableName); var turboYarnApp = appModel.Resources.OfType().Single(r => r.Name == "app1-yarn"); - Assert.True(turboYarnApp.TryGetLastAnnotation(out var tapmYarn)); - Assert.Equal("yarn", tapmYarn.ExecutableName); - Assert.Equal("turbo", tapmYarn.ScriptCommand); + Assert.Equal("yarn", turboYarnApp.Command); var tyarnArgs = await turboYarnApp.GetArgumentValuesAsync(); Assert.Collection(tyarnArgs, + arg => Assert.Equal("turbo", arg), arg => Assert.Equal("run", arg), arg => Assert.Equal("dev", arg), arg => Assert.Equal("--filter", arg), @@ -144,11 +147,11 @@ public async Task Turborepo_RunWithPackageManager_WithPnpmAndYarn() } [Fact] - public async Task Turborepo_NoRunWithPackageManager_Defaults_AppCommandsIncludeNpxOrDefault() + public async Task Turborepo_NoWithPackageManagerLaunch_Defaults_AppCommandsIncludeNpxOrDefault() { var builder = DistributedApplication.CreateBuilder(); - // Turborepo without RunWithPackageManager or installer + // Turborepo without WithPackageManagerLaunch or installer var turbo = builder.AddTurborepoApp("turbo-default"); turbo.AddApp("app-turbo-default"); @@ -207,38 +210,38 @@ public async Task Turborepo_WithPackageManager_WithoutRunWith_DoesNotAffectAppEx } [Fact] - public void Turborepo_RunWithPackageManager_CalledTwiceWithDifferent_Throws() + public void Turborepo_WithPackageManagerLaunch_CalledTwiceWithDifferent_Throws() { var builder = DistributedApplication.CreateBuilder(); var turbo = builder.AddTurborepoApp("turbo-conflict") .WithPnpm() - .RunWithPackageManager(); + .WithPackageManagerLaunch(); - var ex = Assert.Throws(() => turbo.RunWithPackageManager("npm")); + var ex = Assert.Throws(() => turbo.WithPackageManagerLaunch("npm")); Assert.Contains("already configured to run with the 'pnpm' package manager", ex.Message); } [Fact] - public void Turborepo_RunWithPackageManager_ThrowsWhenNotConfigured() + public void Turborepo_WithPackageManagerLaunch_ThrowsWhenNotConfigured() { var builder = DistributedApplication.CreateBuilder(); var ex = Assert.Throws(() => - builder.AddTurborepoApp("turbo-no-config").RunWithPackageManager()); + builder.AddTurborepoApp("turbo-no-config").WithPackageManagerLaunch()); Assert.Contains("not configured with a package manager", ex.Message); } [Fact] - public void Turborepo_RunWithPackageManager_ExplicitOverride_UsesExplicitValue() + public void Turborepo_WithPackageManagerLaunch_ExplicitOverride_UsesExplicitValue() { var builder = DistributedApplication.CreateBuilder(); // Configure with npm but explicitly run with yarn var turbo = builder.AddTurborepoApp("turbo-override") .WithNpm() - .RunWithPackageManager("yarn"); + .WithPackageManagerLaunch("yarn"); using var app = builder.Build(); var appModel = app.Services.GetRequiredService(); @@ -255,14 +258,14 @@ public void Turborepo_RunWithPackageManager_ExplicitOverride_UsesExplicitValue() } [Fact] - public void Turborepo_RunWithPackageManager_CalledTwiceWithSame_DoesNotThrow() + public void Turborepo_WithPackageManagerLaunch_CalledTwiceWithSame_DoesNotThrow() { var builder = DistributedApplication.CreateBuilder(); var turbo = builder.AddTurborepoApp("turbo-idempotent") .WithYarn() - .RunWithPackageManager() - .RunWithPackageManager(); // Second call with same inferred value + .WithPackageManagerLaunch() + .WithPackageManagerLaunch(); // Second call with same inferred value using var app = builder.Build(); var appModel = app.Services.GetRequiredService(); @@ -288,7 +291,7 @@ public async Task Turborepo_MultipleApps_AllInheritExecutionAnnotation(string pa "pnpm" => turbo.WithPnpm(), _ => throw new ArgumentOutOfRangeException(nameof(packageManager)) }; - turbo = turbo.RunWithPackageManager(); + turbo = turbo.WithPackageManagerLaunch(); turbo.AddApp("app1"); turbo.AddApp("app2"); @@ -302,11 +305,18 @@ public async Task Turborepo_MultipleApps_AllInheritExecutionAnnotation(string pa foreach (var turboApp in apps) { - Assert.True(turboApp.TryGetLastAnnotation(out var execution)); - Assert.Equal(packageManager, execution.ExecutableName); - Assert.Equal("turbo", execution.ScriptCommand); + var launcherName = packageManager switch + { + "npm" => "npx", + "yarn" => "yarn", + "pnpm" => "pnpx", + _ => throw new ArgumentOutOfRangeException(nameof(packageManager)) + }; + + Assert.Equal(launcherName, turboApp.Command); var args = await turboApp.GetArgumentValuesAsync(); Assert.Collection(args, + arg => Assert.Equal("turbo", arg), arg => Assert.Equal("run", arg), arg => Assert.Equal("dev", arg), arg => Assert.Equal("--filter", arg), @@ -362,7 +372,7 @@ public void Turborepo_WithInstallTrue_AppsWaitForInstaller() var turbo = builder.AddTurborepoApp("turbo-with-install") .WithYarn(install: true) - .RunWithPackageManager(); + .WithPackageManagerLaunch(); turbo.AddApp("app1"); diff --git a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests.csproj b/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests.csproj deleted file mode 100644 index 80db3f3ee..000000000 --- a/tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests/CommunityToolkit.Aspire.Hosting.NodeJS.Extensions.Tests.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - -