Skip to content

Commit a8e6dbf

Browse files
committed
feat: Add support generic wasm apps
1 parent 7c42885 commit a8e6dbf

File tree

2 files changed

+50
-33
lines changed

2 files changed

+50
-33
lines changed

src/Uno.Wasm.VersionChecker/Uno.Wasm.VersionChecker.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
<TargetFrameworks>net9.0</TargetFrameworks>
66
<Nullable>enable</Nullable>
77
<RollForward>Major</RollForward>
8+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
89

910
<InformationalVersion Condition="'$(Configuration)'=='Debug'">0.0.0-local-dev-build-DOT-NOT-PUBLISH</InformationalVersion>
1011

src/Uno.Wasm.VersionChecker/UnoVersionExtractor.cs

Lines changed: 49 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Collections.Immutable;
4+
using System.ComponentModel.DataAnnotations;
45
using System.Drawing;
56
using System.IO;
67
using System.Linq;
@@ -28,11 +29,10 @@ internal record UnoConfig(Uri assembliesPath, string? mainAssembly, string[]? as
2829
public record AssemblyDetail(string? name, string version, string fileVersion, string configuration, string targetFramework, string? commit);
2930

3031
private ImmutableArray<AssemblyDetail> _assemblies;
31-
private UnoConfig _unoConfig;
32-
private DotnetConfig _dotnetConfig;
32+
private UnoConfig? _unoConfig;
33+
private DotnetConfig? _dotnetConfig;
3334
private AssemblyDetail? _mainAssemblyDetails;
3435
private (string? version, string? name) _framework;
35-
private bool _isAot;
3636

3737
public UnoVersionExtractor(Uri siteUri)
3838
{
@@ -66,7 +66,7 @@ public async Task<int> Extract()
6666
var web = new HtmlWeb();
6767
var doc = await web.LoadFromWebAsync(_siteUri, default, default, default);
6868

69-
Console.WriteLine("Trying to find Uno bootstrapper configuration...", Color.Gray);
69+
Console.WriteLine("Trying to find App configuration...", Color.Gray);
7070

7171
var files = doc?.DocumentNode
7272
.SelectNodes("//script")
@@ -109,52 +109,54 @@ public async Task<int> Extract()
109109
}
110110
}
111111

112-
if (unoConfigPath is null)
113-
{
114-
Console.WriteLine("No Uno / Uno.UI application found.", Color.Red);
115-
return 2;
116-
}
117-
118112
Console.WriteLine("Application found.", Color.LightGreen);
119113

120-
Console.WriteLineFormatted("Configuration url is {0}.", Color.Gray, new Formatter(unoConfigPath, Color.Aqua));
114+
if (unoConfigPath is not null)
115+
{
116+
Console.WriteLineFormatted("Uno configuration url is {0}.", Color.Gray, new Formatter(unoConfigPath, Color.Aqua));
117+
_unoConfig = await GetUnoConfig(unoConfigPath);
118+
}
121119

122-
_unoConfig = await GetUnoConfig(unoConfigPath);
123120
_dotnetConfig = await GetDotnetConfig(dotnetConfigPath);
124121

125-
if (_unoConfig.server is { Length: > 0 })
122+
if (_dotnetConfig.mainAssemblyName is not null)
123+
{
124+
Console.WriteLineFormatted("Dotnet configuration url is {0}.", Color.Gray, new Formatter(dotnetConfigPath, Color.Aqua));
125+
}
126+
127+
if (_unoConfig?.server is { Length: > 0 })
126128
{
127129
Console.WriteLineFormatted(
128130
"Server is {0}",
129131
Color.Gray,
130132
new Formatter(_unoConfig.server, Color.Aqua));
131133
}
132134

133-
if (_unoConfig.mainAssembly is { Length: > 0 })
135+
if (_unoConfig?.mainAssembly is { Length: > 0 })
134136
{
135137
Console.WriteLineFormatted("Starting assembly is {0}.", Color.Gray,
136138
new Formatter(_unoConfig.mainAssembly, Color.Aqua));
137139
}
138140

139-
if (_dotnetConfig.mainAssemblyName is { Length: > 0 })
141+
if (_dotnetConfig?.mainAssemblyName is { Length: > 0 })
140142
{
141143
Console.WriteLineFormatted("Starting assembly is {0}.", Color.Gray,
142144
new Formatter(_dotnetConfig.mainAssemblyName, Color.Aqua));
143145
}
144146

145147
if (
146-
(_unoConfig.assemblies is null || _unoConfig.assemblies is { Length: 0 })
147-
&& _dotnetConfig.assemblies.Length == 0)
148+
(_unoConfig?.assemblies is null || _unoConfig.assemblies is { Length: 0 })
149+
&& _dotnetConfig?.assemblies.Length == 0)
148150
{
149151
Console.WriteLine("No assemblies found.", Color.Red);
150152
return 1;
151153
}
152154

153-
if(_unoConfig.assemblies is { Length: > 0 })
155+
if(_unoConfig?.assemblies is { Length: > 0 })
154156
{
155157
await DumpAssemblies(_unoConfig.assembliesPath, _unoConfig.assemblies);
156158
}
157-
else if(_dotnetConfig.assembliesPath is not null)
159+
else if(_dotnetConfig?.assembliesPath is not null)
158160
{
159161
await DumpAssemblies(_dotnetConfig.assembliesPath, _dotnetConfig.assemblies);
160162
}
@@ -187,7 +189,7 @@ private async Task DumpAssemblies(Uri basePath, string[] assemblies)
187189

188190
foreach (var assemblyDetail in _assemblies)
189191
{
190-
if (assemblyDetail.name == _unoConfig.mainAssembly)
192+
if (assemblyDetail.name == _unoConfig?.mainAssembly)
191193
{
192194
_mainAssemblyDetails = assemblyDetail;
193195
}
@@ -199,24 +201,34 @@ private async Task DumpAssemblies(Uri basePath, string[] assemblies)
199201
{
200202
_framework = (assemblyDetail.version, assemblyDetail.targetFramework);
201203
}
202-
else if (assemblyDetail.name == "aot-instances")
203-
{
204-
_isAot = true;
205-
}
206204
}
207205
}
208206

209207
private async Task<Uri?> GetDotnetConfigPath()
210208
{
211209
using var http = new HttpClient();
212-
var dotnetConfig = new Uri(_siteUri, "_framework/blazor.boot.json");
210+
211+
if (await GetFile(http, new(_siteUri, "_framework/blazor.boot.json")) is { } frameworkFile)
212+
{
213+
return frameworkFile;
214+
}
215+
else if (await GetFile(http, new(_siteUri, "blazor.boot.json")) is { } baseFile)
216+
{
217+
return baseFile;
218+
}
219+
220+
return null;
221+
}
222+
223+
private static async Task<Uri?> GetFile(HttpClient http, Uri dotnetConfig)
224+
{
213225
var embeddedResponse = await http.GetAsync(dotnetConfig);
214226

215227
if (embeddedResponse.IsSuccessStatusCode)
216228
{
217229
var response = await embeddedResponse.Content.ReadAsStringAsync();
218230

219-
if(response.StartsWith("{"))
231+
if (response.StartsWith("{"))
220232
{
221233
return dotnetConfig;
222234
}
@@ -307,9 +319,13 @@ public void OutputResults()
307319
List<string> assemblies = new();
308320

309321
var resources = json.RootElement.GetProperty("resources");
322+
323+
resources.TryGetProperty("coreAssembly", out var coreAssembly);
324+
resources.TryGetProperty("assembly", out var assembly);
325+
310326
var assembliesList =
311-
resources.GetProperty("coreAssembly").EnumerateObject()
312-
.Concat(resources.GetProperty("assembly").EnumerateObject());
327+
(coreAssembly.ValueKind == JsonValueKind.Undefined ? [] : coreAssembly.EnumerateObject())
328+
.Concat(assembly.ValueKind == JsonValueKind.Undefined ? [] : assembly.EnumerateObject());
313329

314330
foreach (var resource in assembliesList)
315331
{
@@ -319,7 +335,7 @@ public void OutputResults()
319335
}
320336
}
321337

322-
var assembliesPath = new Uri(_siteUri, "_framework/");
338+
var assembliesPath = new Uri(_siteUri, dotnetConfigPath.OriginalString.Contains("_framework") ? "_framework/" : "");
323339

324340
return (mainAssemblyName, globalizationMode, assemblies.ToArray(), assembliesPath);
325341
}
@@ -410,17 +426,17 @@ private async Task<UnoConfig> GetUnoConfig(Uri uri)
410426
var details = await ReadPE(stream);
411427

412428
stream.Position = 0;
413-
details ??= await ReadWebCIL(stream);
429+
details ??= ReadWebCIL(stream);
414430

415431
return details;
416432
}
417-
catch (Exception ex)
433+
catch (Exception)
418434
{
419435
return null;
420436
}
421437
}
422438

423-
private static async Task<AssemblyDetail?> ReadWebCIL(MemoryStream stream)
439+
private static AssemblyDetail? ReadWebCIL(MemoryStream stream)
424440
{
425441
var asmStream = WebcilConverterUtil.ConvertFromWebcil(stream);
426442

@@ -496,7 +512,7 @@ private async Task<UnoConfig> GetUnoConfig(Uri uri)
496512
public void Dispose() => _httpClient.Dispose();
497513
}
498514

499-
internal record struct DotnetConfig(string? mainAssemblyName, string? globalizationMode, string[] assemblies, Uri? assembliesPath)
515+
internal record DotnetConfig(string? mainAssemblyName, string? globalizationMode, string[] assemblies, Uri? assembliesPath)
500516
{
501517
public static implicit operator (string? mainAssemblyName, string? globalizationMode, string[] assemblies, Uri? assembliesPath)(DotnetConfig value) => (value.mainAssemblyName, value.globalizationMode, value.assemblies, value.assembliesPath);
502518
public static implicit operator DotnetConfig((string? mainAssemblyName, string? globalizationMode, string[] assemblies, Uri? assembliesPath) value) => new DotnetConfig(value.mainAssemblyName, value.globalizationMode, value.assemblies, value.assembliesPath);

0 commit comments

Comments
 (0)