diff --git a/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets b/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets index 30970d18aa4eb9..e27f90693ea004 100644 --- a/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets +++ b/src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets @@ -62,6 +62,7 @@ Copyright (c) .NET Foundation. All rights reserved. $(CompressionIncludePatterns);_framework\** + true @@ -85,6 +86,8 @@ Copyright (c) .NET Foundation. All rights reserved. false _GatherWasmFilesToPublish;$(WasmNestedPublishAppDependsOn) <_WasmNestedPublishAppPreTarget>ComputeFilesToPublish + + <_WasmEnableHotReload Condition="'$(WasmBundlerFriendlyBootConfig)' == 'true'">false @@ -210,10 +213,12 @@ Copyright (c) .NET Foundation. All rights reserved. <_WasmInlineBootConfig Condition="'$(_WasmInlineBootConfig)' == ''">false <_WasmFingerprintAssets>$(WasmFingerprintAssets) + <_WasmFingerprintAssets Condition="'$(WasmBundlerFriendlyBootConfig)' == 'true'">false <_WasmFingerprintAssets Condition="'$(_WasmFingerprintAssets)' == '' and '$(_TargetingNET90OrLater)' == 'true'">true <_WasmFingerprintAssets Condition="'$(_WasmFingerprintAssets)' == ''">false <_WasmFingerprintDotnetJs>$(WasmFingerprintDotnetJs) + <_WasmFingerprintDotnetJs Condition="'$(WasmBundlerFriendlyBootConfig)' == 'true'">false <_WasmFingerprintDotnetJs Condition="'$(_WasmFingerprintDotnetJs)' == ''">$(OverrideHtmlAssetPlaceholders) <_WasmFingerprintDotnetJs Condition="'$(_WasmFingerprintDotnetJs)' == ''">false <_WasmBootConfigFileName>$(WasmBootConfigFileName) @@ -661,6 +666,43 @@ Copyright (c) .NET Foundation. All rights reserved. + + + + + %(StaticWebAsset.CopyToPublishDirectory) + + + + + + + + + + + + + + + + <_BuildStaticWebAssetsCopyAlways Include="@(_StaticWebAssetsToCopyTargetPath)" Condition="'%(CopyToOutputDirectory)' == 'Always'" /> + <_BuildStaticWebAssetsPreserveNewest Include="@(_StaticWebAssetsToCopyTargetPath)" Condition="'%(CopyToOutputDirectory)' == 'PreserveNewest'" /> + <_BuildStaticWebAssetsIfDifferent Include="@(_StaticWebAssetsToCopyTargetPath)" Condition="'%(CopyToOutputDirectory)' == 'IfDifferent'" /> + + + diff --git a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs index 4e993991471be5..49c69733e88a1a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/BuildTestBase.cs @@ -66,6 +66,7 @@ public abstract class BuildTestBase : IClassFixture s_buildEnv.IsMonoRuntime; public static bool IsCoreClrRuntime => s_buildEnv.IsCoreClrRuntime; public static bool UseWebcil => s_buildEnv.UseWebcil; + public static bool UseJavascriptBundler => EnvironmentVariables.UseJavascriptBundler; public static string GetNuGetConfigPath() => Path.Combine(BuildEnvironment.TestDataPath, "nuget.config"); diff --git a/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs index 47d1bc3c0426bf..d07d2864bdc671 100644 --- a/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/DebugLevelTests.cs @@ -112,4 +112,17 @@ public async Task PublishWithDefaultLevelAndPdbs(Configuration configuration) RunResult result = await RunForPublishWithWebServer(options); AssertDebugLevel(result.TestOutput, -1); } + + [ConditionalFact(typeof(BuildTestBase), nameof(UseJavascriptBundler)), TestCategory("bundler-friendly")] + public void BundlerFriendlyBuildProvidesValidOutputForNpmBuild() + { + Configuration config = Configuration.Debug; + ProjectInfo info = CopyTestAsset(config, aot: false, TestAsset.WasmBasicTestApp, "DebugLevelTests_BundlerFriendlyBootConfigHasNoHotReloadLibraryInitializer"); + // Project exists and contains true. + BuildProject(info, config, noDefaultOptions: true, wasmFingerprintDotnetJs: false); + string bootConfigPath = GetBootConfigPath(GetBinFrameworkDir(config, forPublish: false)); + string bootJSObject = ProjectProviderBase.GetBootJsonContent(bootConfigPath); + // The bundler-friendly boot config is emitted as a JavaScript object literal, not JSON, so it cannot be parsed as JSON. It can still be inspected to ensure it does not contain hot reload. + Assert.DoesNotContain("Microsoft.DotNet.HotReload.WebAssembly.Browser", bootJSObject); + } } diff --git a/src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs b/src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs index 2ef6e921a754a2..809f41e8fca6ed 100644 --- a/src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs +++ b/src/mono/wasm/Wasm.Build.Tests/LibraryInitializerTests.cs @@ -9,7 +9,6 @@ using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; -using Microsoft.Playwright; using Xunit.Abstractions; using Xunit; diff --git a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs index ee91db28f23c87..45ba5220a5c87a 100644 --- a/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs +++ b/src/mono/wasm/Wasm.Build.Tests/Templates/WasmTemplateTestsBase.cs @@ -20,9 +20,9 @@ namespace Wasm.Build.Tests; public class WasmTemplateTestsBase : BuildTestBase { - private readonly WasmSdkBasedProjectProvider _provider; private readonly string _extraBuildArgsBuild = "-p:WasmEnableHotReload=false"; private readonly string _extraBuildArgsPublish = "-p:CompressionEnabled=false -p:WasmEnableHotReload=false"; + private readonly WasmSdkBasedProjectProvider _provider; protected readonly PublishOptions _defaultPublishOptions; protected readonly BuildOptions _defaultBuildOptions; protected const string DefaultRuntimeAssetsRelativePath = "./_framework/"; @@ -119,8 +119,6 @@ protected ProjectInfo CopyTestAsset( extraProperties += """ true - false - false """; } @@ -190,9 +188,10 @@ public virtual (string projectDir, string buildOutput) PublishProject( public virtual (string projectDir, string buildOutput) BuildProject( ProjectInfo info, Configuration configuration, + bool noDefaultOptions = false, bool? isNativeBuild = null, bool? wasmFingerprintDotnetJs = null) => // null for unset properties - BuildProjectCore(info, configuration, _defaultBuildOptions, isNativeBuild, wasmFingerprintDotnetJs); + BuildProjectCore(info, configuration, noDefaultOptions ? new BuildOptions() : _defaultBuildOptions, isNativeBuild, wasmFingerprintDotnetJs); public virtual (string projectDir, string buildOutput) BuildProject( ProjectInfo info, @@ -242,9 +241,9 @@ public virtual (string projectDir, string buildOutput) BuildProject( return (_projectDir, res.Output); } - if (EnvironmentVariables.UseJavascriptBundler && buildOptions.IsPublish) + if (EnvironmentVariables.UseJavascriptBundler) { - string publicWwwrootDir = Path.GetFullPath(Path.Combine(GetBinFrameworkDir(configuration, forPublish: true), "..")); + string publicWwwrootDir = Path.GetFullPath(Path.Combine(GetBinFrameworkDir(configuration, forPublish: buildOptions.IsPublish), "..")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "JavascriptBundlers", "package.json"), Path.Combine(publicWwwrootDir, "package.json")); File.Copy(Path.Combine(BuildEnvironment.TestAssetsPath, "JavascriptBundlers", "rollup.config.mjs"), Path.Combine(publicWwwrootDir, "rollup.config.mjs")); @@ -485,6 +484,9 @@ void OnErrorMessage(string msg) } } + public string GetBootConfigPath(string binFrameworkDir, string? bootConfigFileName = null) => + _provider.GetBootConfigPath(binFrameworkDir, bootConfigFileName); + public string GetBinFrameworkDir(Configuration config, bool forPublish, string? framework = null, string? projectDir = null) => _provider.GetBinFrameworkDir(config, forPublish, framework ?? DefaultTargetFramework, projectDir); diff --git a/src/mono/wasm/testassets/JavascriptBundlers/rollup.config.mjs b/src/mono/wasm/testassets/JavascriptBundlers/rollup.config.mjs index f9ba590ed0b4b2..de79658c228003 100644 --- a/src/mono/wasm/testassets/JavascriptBundlers/rollup.config.mjs +++ b/src/mono/wasm/testassets/JavascriptBundlers/rollup.config.mjs @@ -13,7 +13,7 @@ export default { plugins: [ files({ output: 'public', - extensions: /\.(wasm|dat)$/, + extensions: /\.(wasm|dat|pdb)$/, hash: true, }), files({ @@ -39,4 +39,4 @@ export default { 'process.env.NODE_ENV': '"production"' }), ] -} \ No newline at end of file +}