From 7f0990c55728ff22b7ccb1f46eba78715848fb10 Mon Sep 17 00:00:00 2001 From: Ron Don Jon Date: Fri, 13 Dec 2024 14:58:53 +0100 Subject: [PATCH] Fix 'Error fetching Function Core Tools releases: Cannot find download package for Windows' (#899) --- src/core/func-core-tools.ts | 54 ++++++++++++++++++++----------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/core/func-core-tools.ts b/src/core/func-core-tools.ts index 6d8ff2d1..eb291ced 100644 --- a/src/core/func-core-tools.ts +++ b/src/core/func-core-tools.ts @@ -121,31 +121,35 @@ function getPlatform() { export async function getLatestCoreToolsRelease(targetVersion: number): Promise { try { - const response = await fetch(RELEASES_FEED_URL); - const feed = (await response.json()) as { releases: any; tags: any }; - const tag = feed.tags[`v${targetVersion}`]; - if (!tag || tag.hidden) { - throw new Error(`Cannot find the latest version for v${targetVersion}`); - } - - const release = feed.releases[tag.release]; - if (!release) { - throw new Error(`Cannot find release for ${tag.release}`); - } - - const coreTools = release.coreTools.filter((t: CoreToolsZipInfo) => t.size === "full"); - const platform = getPlatform(); - const info = coreTools.find((t: CoreToolsZipInfo) => t.OS === platform); - if (!info) { - throw new Error(`Cannot find download package for ${platform}`); - } - - return { - version: tag.release, - url: info.downloadLink, - sha2: info.sha2, - }; - } catch (error: unknown) { + const response = await fetch(RELEASES_FEED_URL); + const feed = (await response.json()) as { releases: Record>; }; + const platform = getPlatform(); + + const matchingVersions = Object.keys(feed.releases) + .reverse() // JSON has newest versions first; we want the latest first; potential improvement: sort by semver + .filter( + (version) => + version.match(/^\d+\.\d+\.\d+$/) && // only stable versions + version.startsWith(`${targetVersion}.`), // only matching major versions + ); + + for (const version of matchingVersions) { + const matchingDistribution = feed.releases[version].coreTools?.find( + (dist) => + dist.OS === platform && // Distribution for matching platform + dist.size === "full", // exclude minified releases + ); + if (matchingDistribution) { + return { + version, + url: matchingDistribution.downloadLink, + sha2: matchingDistribution.sha2, + }; + } + } + + throw new Error(`Cannot find download package for ${platform}`); + } catch (error: unknown) { throw new Error(`Error fetching Function Core Tools releases: ${(error as Error).message}`); } }