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
+}