|
2 | 2 |
|
3 | 3 | namespace Microsoft.CST.OpenSource.PackageManagers |
4 | 4 | { |
| 5 | + using AngleSharp.Html.Dom; |
5 | 6 | using AngleSharp.Html.Parser; |
6 | 7 | using Extensions; |
7 | 8 | using Helpers; |
| 9 | + using Newtonsoft.Json.Linq; |
8 | 10 | using PackageUrl; |
9 | 11 | using System; |
10 | 12 | using System.Collections.Generic; |
@@ -158,17 +160,22 @@ public override async Task<IEnumerable<string>> EnumerateVersionsAsync(PackageUR |
158 | 160 | string? html = await GetHttpStringCache(httpClient, $"{ENV_COCOAPODS_SPECS_ENDPOINT}/Specs/{prefix}/{packageName}"); |
159 | 161 | HtmlParser parser = new(); |
160 | 162 | AngleSharp.Html.Dom.IHtmlDocument document = await parser.ParseDocumentAsync(html); |
161 | | - AngleSharp.Dom.IHtmlCollection<AngleSharp.Dom.IElement> navItems = document.QuerySelectorAll("div.Details a.js-navigation-open"); |
| 163 | + // Fetch the embedded react data |
| 164 | + string innerHtml = document.QuerySelector("script[data-target='react-app.embeddedData']").InnerHtml; |
| 165 | + // The contents of the script tag are JSON, so parse the innerHtml as a JObject |
| 166 | + JObject embeddedData = JObject.Parse(innerHtml); |
| 167 | + // use JsonPath to select the version numbers as JValues |
| 168 | + var versions = embeddedData.SelectTokens("$.payload.tree.items[*].name"); |
162 | 169 | List<string> versionList = new(); |
163 | 170 |
|
164 | | - foreach (AngleSharp.Dom.IElement? navItem in navItems) |
| 171 | + // For each version add it to the list |
| 172 | + foreach (var version in versions) |
165 | 173 | { |
166 | | - if (string.IsNullOrWhiteSpace(Regex.Replace(navItem.TextContent, @"\s", "").Replace(".", ""))) |
| 174 | + if (version is JValue jValue) |
167 | 175 | { |
168 | | - continue; |
| 176 | + Logger.Debug("Identified {0} version {1}.", packageName, jValue.Value); |
| 177 | + versionList.Add(jValue.Value.ToString()); |
169 | 178 | } |
170 | | - Logger.Debug("Identified {0} version {1}.", packageName, navItem.TextContent); |
171 | | - versionList.Add(navItem.TextContent); |
172 | 179 | } |
173 | 180 | return SortVersions(versionList.Distinct()); |
174 | 181 | } |
|
0 commit comments