diff --git a/src/Components/WebAssembly/Build/src/targets/ServiceWorkerAssetsManifest.targets b/src/Components/WebAssembly/Build/src/targets/ServiceWorkerAssetsManifest.targets index c8815ae195..49cb73e1b6 100644 --- a/src/Components/WebAssembly/Build/src/targets/ServiceWorkerAssetsManifest.targets +++ b/src/Components/WebAssembly/Build/src/targets/ServiceWorkerAssetsManifest.targets @@ -39,9 +39,12 @@ - + $([System.String]::Copy('$([System.String]::Copy('%(StaticWebAsset.BasePath)').TrimEnd('/'))/%(StaticWebAsset.RelativePath)').Replace('\','/').TrimStart('/')) + diff --git a/src/Components/WebAssembly/Build/test/BuildIntegrationTests/PwaManifestTests.cs b/src/Components/WebAssembly/Build/test/BuildIntegrationTests/PwaManifestTests.cs new file mode 100644 index 0000000000..891a0a10c7 --- /dev/null +++ b/src/Components/WebAssembly/Build/test/BuildIntegrationTests/PwaManifestTests.cs @@ -0,0 +1,45 @@ +using System.IO; +using System.Linq; +using System.Text.Json; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNetCore.Components.WebAssembly.Build +{ + public class PwaManifestTests + { + [Fact] + public async Task Build_ServiceWorkerAssetsManifest_Works() + { + // Arrange + var expectedExtensions = new[] { ".dll", ".pdb", ".js", ".wasm" }; + using var project = ProjectDirectory.Create("standalone"); + var result = await MSBuildProcessManager.DotnetMSBuild(project, args: "/p:ServiceWorkerAssetsManifest=service-worker-assets.js"); + + Assert.BuildPassed(result); + + var buildOutputDirectory = project.BuildOutputDirectory; + + Assert.FileExists(result, buildOutputDirectory, "wwwroot", "_framework", "blazor.boot.json"); + Assert.FileExists(result, buildOutputDirectory, "wwwroot", "_framework", "blazor.webassembly.js"); + Assert.FileExists(result, buildOutputDirectory, "wwwroot", "_framework", "wasm", "dotnet.wasm"); + Assert.FileCountEquals(result, 1, Path.Combine(buildOutputDirectory, "wwwroot", "_framework", "wasm"), "dotnet.*.js"); + Assert.FileExists(result, buildOutputDirectory, "wwwroot", "_framework", "_bin", "standalone.dll"); + Assert.FileExists(result, buildOutputDirectory, "wwwroot", "_framework", "_bin", "Microsoft.Extensions.Logging.Abstractions.dll"); // Verify dependencies are part of the output. + + var staticWebAssets = Assert.FileExists(result, buildOutputDirectory, "standalone.StaticWebAssets.xml"); + Assert.FileContains(result, staticWebAssets, Path.Combine("netstandard2.1", "wwwroot")); + + var serviceWorkerAssetsManifest = Assert.FileExists(result, buildOutputDirectory, "wwwroot", "service-worker-assets.js"); + // Trim prefix 'self.assetsManifest = ' and suffix ';' + var manifestContents = File.ReadAllText(serviceWorkerAssetsManifest).TrimEnd()[22..^1]; + + var manifestContentsJson = JsonDocument.Parse(manifestContents); + Assert.True(manifestContentsJson.RootElement.TryGetProperty("assets", out var assets)); + Assert.Equal(JsonValueKind.Array, assets.ValueKind); + + var entries = assets.EnumerateArray().Select(e => e.GetProperty("url").GetString()).OrderBy(e => e).ToArray(); + Assert.All(entries, e => expectedExtensions.Contains(Path.GetExtension(e))); + } + } +}