Skip to content

Use mts for TypeScript AppHosts#16984

Merged
sebastienros merged 28 commits into
mainfrom
sebros/typescript-codegen
May 22, 2026
Merged

Use mts for TypeScript AppHosts#16984
sebastienros merged 28 commits into
mainfrom
sebros/typescript-codegen

Conversation

@sebastienros
Copy link
Copy Markdown
Contributor

@sebastienros sebastienros commented May 12, 2026

TypeScript AppHosts should be explicit ES modules without requiring existing applications to change their package module mode. This updates new TypeScript AppHosts to use apphost.mts while keeping generated SDK output in the existing .modules folder.

Summary

  • scaffold new TypeScript AppHosts as apphost.mts importing ./.modules/aspire.mjs
  • generate .mts SDK files for new TypeScript AppHosts while preserving legacy .ts generation for existing apphost.ts AppHost projects
  • update TypeScript templates, playgrounds, E2E literals, snapshots, and polyglot fixtures
  • keep aspire init brownfield-safe by preserving existing root files and package module settings; root JS/TS apps get a nested aspire-apphost/ package instead of having Aspire files written into the app package

Examples

  • Existing CommonJS app: root package.json can keep no type or "type": "commonjs"; Aspire creates aspire-apphost/apphost.mts and root delegate scripts.
  • Existing ESM app: root package.json can keep "type": "module"; Aspire creates the same nested aspire-apphost/apphost.mts package without changing root module settings.
  • Existing legacy Aspire TypeScript AppHost: apphost.ts remains supported and continues to use .ts generated SDK files with .js imports.

Fixes #16124

Generate TypeScript AppHost SDK files as .mts with .mjs import specifiers while keeping generated files under .modules.

Scaffold new TypeScript AppHosts as apphost.mts and preserve legacy apphost.ts projects by emitting legacy .ts SDK files when needed.

Update templates, playgrounds, polyglot fixtures, snapshots, and focused tests for the new TypeScript AppHost shape.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 12, 2026

🚀 Dogfood this PR with:

⚠️ WARNING: Do not do this without first carefully reviewing the code of this PR to satisfy yourself it is safe.

curl -fsSL https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.sh | bash -s -- 16984

Or

  • Run remotely in PowerShell:
iex "& { $(irm https://raw.githubusercontent.com/microsoft/aspire/main/eng/scripts/get-aspire-cli-pr.ps1) } 16984"

sebastienros and others added 2 commits May 12, 2026 11:54
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions
Copy link
Copy Markdown
Contributor

Re-running the failed jobs in the CI workflow for this pull request because 1 job was identified as retry-safe transient failures in the CI run attempt.
GitHub was asked to rerun all failed jobs for that attempt, and the rerun is being tracked in the rerun attempt.
The job links below point to the failed attempt jobs that matched the retry-safe transient failure rules.

sebastienros and others added 7 commits May 12, 2026 14:28
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
sebastienros and others added 2 commits May 13, 2026 10:48
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienros sebastienros marked this pull request as ready for review May 14, 2026 21:13
Copilot AI review requested due to automatic review settings May 14, 2026 21:13
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR updates Aspire’s TypeScript AppHost ecosystem to use explicit ESM by default (apphost.mts + .mjs imports), while keeping legacy apphost.ts projects working and making aspire init safer for brownfield JS/TS repos by scaffolding a nested aspire-apphost/ package.

Changes:

  • Switch TypeScript AppHost templates/fixtures to apphost.mts and update imports to ./.modules/*.mjs.
  • Generate TypeScript SDK output as .mts for new AppHosts, while converting back to .ts + .js specifiers for legacy apphost.ts projects.
  • Add brownfield behavior for JS/TS repos: scaffold into aspire-apphost/, add root delegate scripts, and adjust pnpm install behavior for nested packages.

Reviewed changes

Copilot reviewed 229 out of 229 changed files in this pull request and generated 1 comment.

Show a summary per file
File Description
tests/PolyglotAppHosts/Aspire.Hosting/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting/TypeScript/apphost.mts Switch SDK imports to .mjs; update validation filename.
tests/PolyglotAppHosts/Aspire.Hosting.Yarp/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Yarp/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Yarp/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Valkey/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Valkey/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Valkey/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.SqlServer/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.SqlServer/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.SqlServer/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Seq/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Seq/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Seq/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Redis/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Redis/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Redis/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.RabbitMQ/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.RabbitMQ/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.RabbitMQ/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Qdrant/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Qdrant/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Qdrant/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Python/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Python/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Python/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.PostgreSQL/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.PostgreSQL/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.PostgreSQL/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Orleans/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Orleans/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Orleans/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Oracle/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Oracle/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Oracle/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.OpenAI/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.OpenAI/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.OpenAI/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Nats/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Nats/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Nats/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.MySql/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.MySql/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.MySql/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.MongoDB/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.MongoDB/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.MongoDB/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Milvus/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Milvus/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Milvus/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Maui/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Maui/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Maui/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Kubernetes/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Keycloak/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Keycloak/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Keycloak/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Kafka/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Kafka/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Kafka/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.JavaScript/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.JavaScript/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.JavaScript/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Go/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Go/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Go/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.GitHub.Models/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.GitHub.Models/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.GitHub.Models/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Garnet/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Garnet/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Garnet/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Foundry/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Foundry/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Foundry/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.EntityFrameworkCore/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.EntityFrameworkCore/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.EntityFrameworkCore/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Docker/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Docker/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Docker/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.DevTunnels/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.DevTunnels/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.DevTunnels/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.WebPubSub/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.WebPubSub/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.WebPubSub/TypeScript/apphost.mts Switch SDK/base imports to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Storage/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Storage/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Storage/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Sql/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Sql/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Sql/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.SignalR/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.SignalR/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.SignalR/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ServiceBus/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ServiceBus/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ServiceBus/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Search/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Search/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Search/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Redis/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Redis/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Redis/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.PostgreSQL/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.PostgreSQL/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.PostgreSQL/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.OperationalInsights/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.OperationalInsights/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.OperationalInsights/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Network/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Network/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Network/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Kusto/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Kusto/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Kusto/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.KeyVault/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.KeyVault/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.KeyVault/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Functions/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Functions/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.Functions/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.EventHubs/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.EventHubs/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.EventHubs/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.CosmosDB/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.CosmosDB/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.CosmosDB/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ContainerRegistry/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ContainerRegistry/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ContainerRegistry/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.CognitiveServices/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.CognitiveServices/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.CognitiveServices/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppService/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppService/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppService/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ApplicationInsights/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ApplicationInsights/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.ApplicationInsights/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppContainers/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppContainers/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppContainers/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppConfiguration/TypeScript/tsconfig.json Update includes for .mts + generated SDK.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppConfiguration/TypeScript/aspire.config.json Point AppHost path to apphost.mts.
tests/PolyglotAppHosts/Aspire.Hosting.Azure.AppConfiguration/TypeScript/apphost.mts Switch SDK import to .mjs.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/TypeScriptLanguageSupportTests.cs Update scaffolding expectations for .mts + nested package rules.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/TwoPassScanningGeneratedAspire.verified.ts Snapshot updates for .mts + .mjs imports.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/transport.verified.ts Snapshot header updated to .mts.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/base.verified.ts Snapshot updates for .mts + .mjs imports.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/Snapshots/AtsGeneratedAspire.verified.ts Snapshot updates for .mts + .mjs imports.
tests/Aspire.Hosting.CodeGeneration.TypeScript.Tests/AtsTypeScriptCodeGeneratorTests.cs Update generated file names to .mts.
tests/Aspire.Hosting.CodeGeneration.TypeScript.JsTests/vitest.config.ts Update resource aliases to .mts.
tests/Aspire.Hosting.CodeGeneration.TypeScript.JsTests/tsconfig.json Update paths/includes to .mts.
tests/Aspire.Deployment.EndToEnd.Tests/TypeScriptVnetSqlServerInfraDeploymentTests.cs Update test to edit apphost.mts.
tests/Aspire.Deployment.EndToEnd.Tests/TypeScriptExpressDeploymentTests.cs Update test to edit apphost.mts.
tests/Aspire.Deployment.EndToEnd.Tests/PythonFastApiDeploymentTests.cs Update test to edit apphost.mts.
tests/Aspire.Deployment.EndToEnd.Tests/AppServicePythonDeploymentTests.cs Update test to edit apphost.mts.
tests/Aspire.Deployment.EndToEnd.Tests/AcrPurgeTaskDeploymentTests.cs Update test to edit apphost.mts.
tests/Aspire.Cli.Tests/TestServices/TestTypeScriptStarterProjectFactory.cs Recognize both apphost.mts and legacy apphost.ts.
tests/Aspire.Cli.Tests/Scaffolding/ScaffoldingServiceTests.cs Add unit tests for nested brownfield scaffolding + package.json serialization.
tests/Aspire.Cli.Tests/Scaffolding/PackageJsonMergerTests.cs Add test for dependency/devDependency dedup behavior.
tests/Aspire.Cli.Tests/Projects/TypeScriptAppHostToolchainResolverTests.cs Update watch extensions and pnpm install args.
tests/Aspire.Cli.Tests/Projects/GuestAppHostProjectTests.cs Add test for legacy TS SDK conversion (.mts.ts).
tests/Aspire.Cli.Tests/Projects/DefaultLanguageDiscoveryTests.cs Update TypeScript defaults to .mts while keeping .ts detection.
tests/Aspire.Cli.Tests/Commands/TypeScriptAppHostToolingCheckTests.cs Update detection to .mts.
tests/Aspire.Cli.Tests/Commands/NewCommandTests.cs Update TypeScript starter expectations (but see review comment).
tests/Aspire.Cli.Tests/Commands/InitCommandTests.cs Update init behavior for .mts + legacy/brownfield handling.
tests/Aspire.Cli.EndToEnd.Tests/TypeScriptStarterTemplateTests.cs Expect generated SDK file aspire.mts.
tests/Aspire.Cli.EndToEnd.Tests/TypeScriptSqlServerNativeAssetsBundleTests.cs Expect apphost.mts and .mjs imports.
tests/Aspire.Cli.EndToEnd.Tests/TypeScriptReusablePackageTests.cs Update reusable-package test to .mts/.mjs.
tests/Aspire.Cli.EndToEnd.Tests/TypeScriptPublishTests.cs Update publish tests to apphost.mts and .mjs.
tests/Aspire.Cli.EndToEnd.Tests/TypeScriptPolyglotTests.cs Update brownfield nesting assertions and paths.
tests/Aspire.Cli.EndToEnd.Tests/TypeScriptCodegenValidationTests.cs Update expected generated files to .mts.
tests/Aspire.Cli.EndToEnd.Tests/SmokeTests.cs Read stable AppHost path from config (.ts or .mts).
tests/Aspire.Cli.EndToEnd.Tests/SecretTypeScriptAppHostTests.cs Use --apphost apphost.mts.
tests/Aspire.Cli.EndToEnd.Tests/ProjectReferenceTests.cs Update wiring and grep to .mts.
tests/Aspire.Cli.EndToEnd.Tests/LocalConfigMigrationTests.cs Update legacy migration assertions to .mts.
tests/Aspire.Cli.EndToEnd.Tests/KubernetesDeployTypeScriptTests.cs Update test to edit apphost.mts.
tests/Aspire.Cli.EndToEnd.Tests/JavaScriptPublishTests.cs Update init expectation to apphost.mts.
tests/Aspire.Cli.EndToEnd.Tests/Helpers/TypeScriptAppHostToolchainTestHelpers.cs Add helper to detect corepack toolchains.
tests/Aspire.Cli.EndToEnd.Tests/DoctorCommandTests.cs Prepare corepack toolchains before PATH checks.
tests/Aspire.Cli.EndToEnd.Tests/ConfigDiscoveryTests.cs Expect apphost.mts in config discovery.
tests/Aspire.Cli.EndToEnd.Tests/ChannelUpdateWorkflowTests.cs Read appHost path from config and select .mjs import accordingly.
src/Aspire.Hosting.CodeGeneration.TypeScript/TypeScriptLanguageSupport.cs Default AppHost name .mts; add brownfield package naming; extend detection.
src/Aspire.Hosting.CodeGeneration.TypeScript/Resources/transport.mts Rename embedded transport resource to .mts.
src/Aspire.Hosting.CodeGeneration.TypeScript/Resources/base.mts Rename embedded base resource to .mts + .mjs imports.
src/Aspire.Hosting.CodeGeneration.TypeScript/AtsTypeScriptCodeGenerator.cs Emit .mts files and .mjs specifiers.
src/Aspire.Hosting.CodeGeneration.TypeScript/Aspire.Hosting.CodeGeneration.TypeScript.csproj Embed .mts resources instead of .ts.
src/Aspire.Cli/Templating/Templates/ts-starter/tsconfig.apphost.json Update includes for apphost.mts + .mts SDK files.
src/Aspire.Cli/Templating/Templates/ts-starter/package.json Update lint script to apphost.mts.
src/Aspire.Cli/Templating/Templates/ts-starter/eslint.config.mjs Target apphost.mts.
src/Aspire.Cli/Templating/Templates/ts-starter/aspire.config.json Point AppHost path to apphost.mts.
src/Aspire.Cli/Templating/Templates/ts-starter/apphost.mts Switch SDK import to .mjs.
src/Aspire.Cli/Templating/Templates/ts-starter/.gitignore Template change (ignore formatting).
src/Aspire.Cli/Templating/Templates/py-starter/tsconfig.apphost.json Update includes for apphost.mts + .mts SDK files.
src/Aspire.Cli/Templating/Templates/py-starter/package.json Update lint script to apphost.mts.
src/Aspire.Cli/Templating/Templates/py-starter/eslint.config.mjs Target apphost.mts.
src/Aspire.Cli/Templating/Templates/py-starter/aspire.config.json Point AppHost path to apphost.mts.
src/Aspire.Cli/Templating/Templates/py-starter/apphost.mts Switch SDK import to .mjs.
src/Aspire.Cli/Templating/Templates/py-starter/.gitignore Template change (ignore formatting).
src/Aspire.Cli/Templating/CliTemplateFactory.TypeScriptStarterTemplate.cs Find TS AppHost as apphost.mts.
src/Aspire.Cli/Templating/CliTemplateFactory.PythonStarterTemplate.cs Find TS AppHost as apphost.mts.
src/Aspire.Cli/Scaffolding/ScaffoldingService.cs Add nested brownfield scaffolding + root delegate script injection.
src/Aspire.Cli/Scaffolding/PackageJsonMerger.cs Avoid duplicating deps across dependencies/devDependencies.
src/Aspire.Cli/Projects/TypeScriptAppHostToolchainResolver.cs Watch .mts; pnpm nested install --ignore-workspace.
src/Aspire.Cli/Projects/ILanguageDiscovery.cs Clarify docs; keep generated folder .modules.
src/Aspire.Cli/Projects/GuestAppHostProject.cs Convert generated .mts back to legacy .ts for apphost.ts projects.
src/Aspire.Cli/Projects/DefaultLanguageDiscovery.cs Default TypeScript AppHost to apphost.mts + detect legacy .ts.
src/Aspire.Cli/Commands/InitCommand.cs Skip when legacy AppHost exists; display nested created path.
playground/TypeScriptApps/RpsArena/tsconfig.json Update includes for .mts SDK files.
playground/TypeScriptApps/RpsArena/aspire.config.json Point AppHost path to apphost.mts.
playground/TypeScriptApps/RpsArena/apphost.mts Switch SDK import to .mjs.
playground/TypeScriptApps/AzureFunctionsSample/aspire.config.json Point AppHost path to apphost.mts.
playground/TypeScriptApps/AzureFunctionsSample/AppHost/tsconfig.json Update includes for .mts SDK files.
playground/TypeScriptApps/AzureFunctionsSample/AppHost/apphost.mts Switch SDK import to .mjs.
playground/TypeScriptAppHost/tsconfig.json Update includes for .mts SDK files.
playground/TypeScriptAppHost/aspire.config.json Point AppHost path to apphost.mts.
playground/TypeScriptAppHost/apphost.mts Switch SDK import to .mjs.
playground/TypeScriptAppHost/.vscode/launch.json Update debug program to apphost.mts.
.github/workflows/polyglot-validation/test-typescript.sh Update workflow script to edit/run apphost.mts.
.github/workflows/polyglot-validation/test-typescript-playground.sh Update workflow restore to use --apphost apphost.mts.

Comment thread tests/Aspire.Cli.Tests/Commands/NewCommandTests.cs Outdated
sebastienros and others added 3 commits May 14, 2026 15:02
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@davidfowl
Copy link
Copy Markdown
Contributor

I am not loving this mts thing, I dunno why but it feels not great. Does pulumi do this?

@sebastienros
Copy link
Copy Markdown
Contributor Author

@DamianEdwards help! David is questioning this PR, we need your expertize.

@DamianEdwards
Copy link
Copy Markdown
Member

DamianEdwards commented May 19, 2026

RE Plugin they seem to have a bunch of docs about this: https://www.pulumi.com/docs/iac/languages-sdks/javascript/#native-esm-support
Not sure what their default typescript template uses though. See https://www.pulumi.com/docs/iac/languages-sdks/javascript/#enabling-async-support too.

@github-actions
Copy link
Copy Markdown
Contributor

Re-running the failed jobs in the CI workflow for this pull request because 1 job was identified as retry-safe transient failures in the CI run attempt.
GitHub was asked to rerun all failed jobs for that attempt, and the rerun is being tracked in the rerun attempt.
The job links below point to the failed attempt jobs that matched the retry-safe transient failure rules.

Matched test failure patterns (1 test)
  • Aspire.Cli.EndToEnd.Tests.KubernetesDeployWithGarnetTests.DeployK8sWithGarnet — Unable to access container registry during publish

@davidfowl
Copy link
Copy Markdown
Contributor

This needs a pr-testing report.

@IEvangelist
Copy link
Copy Markdown
Member

Took this for a spin against the PR build.

CLI / install

Installed the PR build at dc6b57b7 (one commit behind current HEAD 20c0ef0e). The latest commit, "Heal stale apphost config for explicit launches", has no successful ci.yml run yet, so its artifacts weren't available — the tested commit covers the core .mts migration; the latest is a small healing add-on. I read the latest commit but didn't run it.

Dynamic validation against aspire-ts-starter

Check Result
aspire new aspire-ts-starter produces apphost.mts (not apphost.ts)
aspire.config.json"path": "apphost.mts"
tsconfig.apphost.json include lists apphost.mts + .modules/{aspire,base,transport}.mts
package.json lint script targets apphost.mts
apphost.mts imports use .mjs (e.g. ./.modules/aspire.mjs) per ESM
Codegen .modules/ regenerates as .mts after aspire restore against PR SDK
tsc --noEmit -p tsconfig.apphost.json post-restore ✅ exit 0
aspire run smoke against the starter ✅ apphost launched, dashboard reports "AppHost: apphost.mts"

One thing worth confirming

Out of the box, aspire new aspire-ts-empty still produces apphost.ts (not .mts) and .modules/*.ts. After aspire restore against the PR SDK the user's .modules/ files regenerate as .mts correctly, so this looks like an artifact of the empty template's bundled SDK pin (stable 13.3.3). Just wanted to flag — is the plan for the post-release SDK bump to naturally pull this forward, or does the empty template need an explicit refresh before merge? Not blocking, just want to make sure nobody chases their tail debugging the gap later.

Code review

Walked the diff: detection patterns (["apphost.mts", "apphost.ts"] with .mts first), DropPolyglotSkeletonAsync not clobbering existing .ts, brownfield nesting under aspire-apphost/, legacy emit via ShouldEmitLegacyTypeScriptGeneratedFiles, and the healing/idempotent write in ProjectLocator.cs — all looked correct and internally consistent. No bugs/security/logic concerns from me.

LGTM for the migration itself; just the ts-empty question above.

@sebastienros
Copy link
Copy Markdown
Contributor Author

@IEvangelist

aspire new aspire-ts-empty creates apphost.mts plus .modules/aspire.mts, .modules/base.mts, and .modules/transport.mts.

sebastienros and others added 3 commits May 19, 2026 11:08
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@IEvangelist
Copy link
Copy Markdown
Member

Supporting this change — .mts is the right call for brownfield safety

After digging into this PR, the linked issue (#16124), and how Node.js/TypeScript actually decide what's ESM vs. CJS, I want to register support for the .mts choice and lay out why it's the brownfield-safe option (not the brownfield-risky one).

The core insight

It's easy to read this PR and think ".ts is the safe default, .mts is the exotic choice — why force users into a less familiar extension?" That intuition is inverted by how Node treats these files.

File extension Module format determined by
.ts / .js The nearest package.json "type" field
.mts / .mjs Always ESM — package.json is ignored
.cts / .cjs Always CJS — package.json is ignored

So .ts is the extension whose meaning depends on the user's project. .mts is the extension whose meaning is independent of what we don't know about the user's project. For a brownfield-safe scaffold, .mts is precisely the right primitive.

This isn't a TypeScript design quirk — it mirrors the underlying Node.js spec for .mjs / .cjs, and is exactly the case .mts was added to handle in TypeScript 4.7. From the TS 4.7 release notes:

"The type field in package.json is nice because it allows us to continue using the .ts and .js file extensions which can be convenient; however, you will occasionally need to write a file that differs from what type specifies. You might also just prefer to always be explicit."

And from the Choosing Compiler Options guide:

"Remember to set "type": "module" or use .mts files if you intend to emit ES modules."

Why .ts doesn't work here

The AppHost code uses top-level await:

const builder = await createBuilder();
// ...
await builder.build().run();

Top-level await is ESM-only. There are exactly three ways to make this work:

  1. Set "type": "module" in the user's existing package.json. This is what CLI: TypeScript AppHost top-level await fails in brownfield repos without type:module #16124 specifically calls out as breaking — the excalidraw repro has 11+ build scripts using require() that immediately break the moment the package becomes ESM. This is more brownfield-hostile than the .mts rename.
  2. Wrap the AppHost body in an async IIFE. Works mechanically, but it's hand-written boilerplate every user has to maintain, and it doesn't help if anyone ever wants import.meta or other ESM features.
  3. Use .mts. Node guarantees ESM semantics for this file regardless of the surrounding package.json. The user's existing CJS scripts keep working. The AppHost works. No mutation of the user's "type" field.

Option 3 is what this PR does. It's the only one that doesn't either break the user's CJS code or impose hand-written async boilerplate.

What this PR gets right

A bunch of details that make the integration genuinely brownfield-safe:

  • Brownfield isolation via aspire-apphost/ subfolder. When aspire init finds an existing package.json, the whole AppHost (with its own package.json carrying "type": "module") goes into a nested package. The user's root package.json "type" is never touched. Root scripts become delegate scripts like "aspire:start": "npm --prefix aspire-apphost run aspire:start".
  • tsconfig.apphost.json is isolated with "module": "NodeNext". The user's tsconfig.json is never overwritten — there's even a test (Scaffold_DoesNotEmitRootTsConfig_WhenOneAlreadyExists) pinning that behavior.
  • Scoped ESLint config (files: ['apphost.mts']) — won't fight the user's existing lint setup.
  • tsx is the runtime, not ts-node. tsx natively handles .mts, top-level await, and the .mjs import specifiers in the SDK files. ts-node classic mode is the one tool that hard-fails on .mts, and Aspire correctly avoids it.
  • Legacy apphost.ts projects continue to work. DetectionPatterns: ["apphost.mts", "apphost.ts"] plus ConvertGeneratedFilesForLegacyTypeScriptAppHost() (which rewrites .mts.ts and .mjs.js in generated content) means existing users see no breakage.
  • engines.node: ^20.19.0 || ^22.13.0 || >=24 matches ESLint 10's requirement and rules out Node versions that wouldn't run ESM AppHosts anyway.

Industry precedent

The pattern of "use .mts for one specific file in an otherwise-unknown project" is the dominant industry use of .mts:

  • Vite docs explicitly recommend vite.config.mts to escape a CJS-rooted project: "rename vite.config.js/vite.config.ts to vite.config.mjs/vite.config.mts."
  • Vitestvitest.config.mts appears in 2,600+ GitHub repos.
  • ESLint v9eslint.config.mts appears in 1,350+ repos.
  • Next.js recognizes next.config.mts.
  • Astro 4 adopted astro.config.mts.
  • Cloudflare Workers SDK ships 71+ vitest.config.mts files across packages — same exact pattern as Aspire's AppHost: a CJS-or-unknown root with a single ESM-required entrypoint.

This PR is applying the same precedent to the AppHost entrypoint rather than to a config file.

Things to consider documenting

These don't argue against .mts, but they're real brownfield tooling gotchas that would be worth a docs note:

  1. Root tsconfig.json with "include": ["**/*"] (common in older CRA/Vite/Angular templates) will pick up apphost.mts and fail with TS1479 if the root tsconfig has "module": "CommonJS". A recommended "exclude": ["aspire-apphost", "**/.modules/**"] snippet for the user's tsconfig would prevent surprises during the user's own tsc runs.
  2. ts-jest's default transform regex is ^.+\.tsx?$ — does not match .mts. Brownfield projects running tests through ts-jest need either its ESM preset or ^.+\.m?tsx?$ plus extensionsToTreatAsEsm: ['.mts']. (Jest's own moduleFileExtensions and testMatch already include .mts, so it's only the transform that bites.)
  3. Webpack default resolve.extensions with TS enabled is [".ts", ".js", ".json", ".wasm"] — no .mts. Extensionless imports won't resolve. Explicit references work; defaultRules handles .mts as ESM when encountered.
  4. ESLint configs with files: ["**/*.ts"] silently skip .mts. typescript-eslint's parser defaults include .mts, but explicit files: overrides only match what they say. The user's own lint config may need updating if they want to lint the AppHost themselves.

None of these are reasons to use .ts instead — they'd all be real problems either way, and most flip from "silently incorrect" (with .ts in a CJS project) to "loud failure during a non-Aspire build step" (with .mts). Loud failures are easier to fix.

Summary

  • .mts is the Node-spec-sanctioned way to declare "this file is ESM" without writing into the user's package.json. Not a hack — its intended use case.
  • .ts for the AppHost only works in projects that are already ESM. That's an assumption a brownfield-safe init can't make. CLI: TypeScript AppHost top-level await fails in brownfield repos without type:module #16124 is the documented proof.
  • The PR's isolation design (aspire-apphost/ nesting, isolated tsconfig.apphost.json, scoped ESLint config, tsx runtime, legacy apphost.ts codegen path) is sound and addresses the realistic failure modes.
  • The biggest open item is documentation for ts-jest users and for users with broad root tsconfig.json include globs — not the file extension choice.

LGTM on the direction. 👍

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienros sebastienros force-pushed the sebros/typescript-codegen branch from f18dad0 to c769f1a Compare May 22, 2026 15:52
sebastienros and others added 2 commits May 22, 2026 09:01
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienros sebastienros merged commit f154b15 into main May 22, 2026
308 checks passed
@microsoft-github-policy-service microsoft-github-policy-service Bot added this to the 13.4 milestone May 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

CLI E2E Tests unknown — 96 passed, 0 failed, 5 unknown (commit 6691968)

View all recordings
Status Test Recording
AddPackageInteractiveWhileAppHostRunningDetached ▶️ View recording
AddPackageWhileAppHostRunningDetached ▶️ View recording
AgentCommands_AllHelpOutputs_AreCorrect ▶️ View recording
AgentInitCommand_DefaultSelection_InstallsDefaultSkills ▶️ View recording
AgentInitCommand_MigratesDeprecatedConfig ▶️ View recording
AgentMcpListStructuredLogsFromStarterAppCore ▶️ View recording
AllPublishMethodsBuildDockerImages ▶️ View recording
AspireAddPackageVersionToDirectoryPackagesProps ▶️ View recording
AspireInitSingleFileAppHostRunsViaDotnetRunAppHost ▶️ View recording
AspireInitWithExistingAppHostDirRecreatesMissingNuGetConfigAndPreservesFiles ▶️ View recording
AspireInitWithSolutionFileGeneratesAppHostThatBuildsAgainstChannelHive ▶️ View recording
AspireStartUpdatesStaleTypeScriptAppHostPath ▶️ View recording
AspireUpdateRemovesAppHostPackageVersionFromDirectoryPackagesProps ▶️ View recording
AspireUpdateRemovesOrphanAppHostPackageVersionWhenSdkAlreadyCurrent ▶️ View recording
Banner_DisplayedOnFirstRun ▶️ View recording
Banner_DisplayedWithExplicitFlag ▶️ View recording
Banner_NotDisplayedWithNoLogoFlag ▶️ View recording
CertificatesClean_RemovesCertificates ▶️ View recording
CertificatesTrust_WithNoCert_CreatesAndTrustsCertificate ▶️ View recording
CertificatesTrust_WithUntrustedCert_TrustsCertificate ▶️ View recording
ConfigSetGet_CreatesNestedJsonFormat ▶️ View recording
CreateAndRunAspireStarterProject ▶️ View recording
CreateAndRunAspireStarterProjectWithBundle ▶️ View recording
CreateAndRunEmptyAppHostProject ▶️ View recording
CreateAndRunJavaEmptyAppHostProject ▶️ View recording
CreateAndRunJsReactProject ▶️ View recording
CreateAndRunPythonReactProject ▶️ View recording
CreateAndRunTypeScriptEmptyAppHostProject ▶️ View recording
CreateAndRunTypeScriptStarterProject ▶️ View recording
CreateJavaAppHostWithViteApp ▶️ View recording
CreateTypeScriptAppHostWithViteApp_UsesConfiguredToolchain ▶️ View recording
DashboardRunWithAgentMcpCore ▶️ View recording
DashboardRunWithOtelTracesReturnsNoTracesCore ▶️ View recording
DeployK8sBasicApiService ▶️ View recording
DeployK8sWithExternalHelmChart ▶️ View recording
DeployK8sWithGarnet ▶️ View recording
DeployK8sWithMongoDB ▶️ View recording
DeployK8sWithMySql ▶️ View recording
DeployK8sWithPostgres ▶️ View recording
DeployK8sWithRabbitMQ ▶️ View recording
DeployK8sWithRedis ▶️ View recording
DeployK8sWithSqlServer ▶️ View recording
DeployK8sWithValkey ▶️ View recording
DeployTypeScriptAppToKubernetes ▶️ View recording
DescribeCommandResolvesReplicaNames ▶️ View recording
DescribeCommandShowsRunningResources ▶️ View recording
DetachFormatJsonProducesValidJson ▶️ View recording
DetachFormatJsonProducesValidJsonWhenRestartingExistingInstance ▶️ View recording
DoListStepsShowsPipelineSteps ▶️ View recording
DocsCommand_RendersInteractiveMarkdownFromLocalSource ▶️ View recording
DoctorCommand_DetectsDeprecatedAgentConfig ▶️ View recording
DoctorCommand_TypeScriptAppHostReportsMissingConfiguredToolchain ▶️ View recording
DoctorCommand_WithSslCertDir_ShowsTrusted ▶️ View recording
DoctorCommand_WithoutSslCertDir_ShowsPartiallyTrusted ▶️ View recording
GeneratedAspireDevScript_StartsWatchMode_WithConfiguredToolchain ▶️ View recording
GlobalMigration_HandlesCommentsAndTrailingCommas ▶️ View recording
GlobalMigration_HandlesMalformedLegacyJson ▶️ View recording
GlobalMigration_PreservesAllValueTypes ▶️ View recording
GlobalMigration_SkipsWhenNewConfigExists ▶️ View recording
GlobalSettings_MigratedFromLegacyFormat ▶️ View recording
InitTypeScriptAppHost_AugmentsExistingViteRepoAtRoot ▶️ View recording
InteractiveCSharpInitCreatesExpectedFiles ▶️ View recording
InvalidAppHostPathWithComments_IsHealedOnRun ▶️ View recording
JavaScriptHostingApisRunFromTypeScriptAppHost ▶️ View recording
LatestCliCanStartStableChannelAppHost ▶️ View recording
LatestCliCanStartStableChannelTypeScriptAppHost ▶️ View recording
LegacySettingsMigration_AdjustsRelativeAppHostPath ▶️ View recording
LogLevelTrace_ProducesTraceEntriesInCliLogFile ▶️ View recording
LogsCommandShowsResourceLogs ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterApp ▶️ View recording
OtelLogsReturnsStructuredLogsFromStarterAppIsolated ▶️ View recording
PsCommandListsRunningAppHost ▶️ View recording
PsFormatJsonOutputsOnlyJsonToStdout ▶️ View recording
PublishJavaScriptPatternsGeneratesExpectedDockerComposeArtifacts ▶️ View recording
PublishWithConfigureEnvFileUpdatesEnvOutput ▶️ View recording
PublishWithDockerComposeServiceCallbackSucceeds ▶️ View recording
PublishWithoutOutputPathUsesAppHostDirectoryDefault ▶️ View recording
ResourceCommand_FailedExecution_DisplaysAppHostLogPathAndLogContainsEntries ▶️ View recording
ResourceCommand_FailsWhenInteractionServiceIsRequired ▶️ View recording
ResourceCommand_SetAndDeleteParameterUpdatesDescribeOutput ▶️ View recording
RestoreGeneratesSdkFiles ▶️ View recording
RestoreGeneratesSdkFiles_WithConfiguredToolchain ▶️ View recording
RestoreRefreshesGeneratedSdkAfterAddingIntegration ▶️ View recording
RestoreSupportsConfigOnlyHelperPackageAndCrossPackageTypes ▶️ View recording
RunFromParentDirectory_UsesExistingConfigNearAppHost ▶️ View recording
RunPublishFailureScenarioAsync ▶️ View recording
RunReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
RunReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
SecretCrudOnDotNetAppHost ▶️ View recording
SecretCrudOnTypeScriptAppHost ▶️ View recording
StagingChannel_ConfigureAndVerifySettings_ThenSwitchChannels ▶️ View recording
StartAndWaitForTypeScriptSqlServerAppHostWithNativeAssets ▶️ View recording
StartReportsSyntaxErrorsForDotNetAppHost ▶️ View recording
StartReportsSyntaxErrorsForTypeScriptAppHost ▶️ View recording
StopAllAppHostsFromAppHostDirectory ▶️ View recording
StopJavaPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopNonInteractiveSingleAppHost ▶️ View recording
StopTypeScriptPolyglotAppHostUsingApphostDirectory ▶️ View recording
StopWithNoRunningAppHostExitsSuccessfully ▶️ View recording
UnAwaitedChainsCompileWithAutoResolvePromises ▶️ View recording
UpdateProjectChannelToStable_TypeScript_PicksUpStablePackages ▶️ View recording

📹 Recordings uploaded automatically from CI run #26300715005

eerhardt added a commit that referenced this pull request May 22, 2026
Resolves conflicts from #16984 (Use mts for TypeScript AppHosts).
All generated SDK output continues to land under .aspire/modules/
(now using .mts/.mjs naming for new-style TypeScript AppHosts and
preserving .ts/.js for legacy AppHosts).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@sebastienros sebastienros deleted the sebros/typescript-codegen branch May 23, 2026 18:27
mitchdenny added a commit that referenced this pull request May 24, 2026
PR #16984 switched TypeScript AppHosts to apphost.mts. Two other
deployment E2E tests still referenced apphost.ts and failed with
ResourceGroupNotFound for the same reason:

- TypeScriptAzureContainerAppJobDeploymentTests: writes its custom
  AppHost to apphost.mts instead of apphost.ts.
- AksAzureKubernetesEnvironmentCertManagerTypeScriptDeploymentTests:
  patches apphost.mts (the file emitted by the Express/React starter)
  instead of the no-longer-generated apphost.ts.

Supersedes #17432 and #17433.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

CLI: TypeScript AppHost top-level await fails in brownfield repos without type:module

6 participants