Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
99 changes: 42 additions & 57 deletions sites/main-site/src/pages/nextflow_version.ts
Original file line number Diff line number Diff line change
@@ -1,67 +1,52 @@
import type { APIRoute } from 'astro';
import { octokit } from '@components/octokit';
import type { OctokitResponse } from '@octokit/types';
import type { APIRoute } from "astro";
import { octokit } from "@components/octokit";

export const GET: APIRoute = async ({ params, request }) => {
try {
// get all releases as versions, go through all release pages
export const GET: APIRoute = async () => {
const versions = await octokit.paginate(octokit.rest.repos.listReleases, {
owner: "nextflow-io",
repo: "nextflow",
per_page: 100,
});

const versions: {}[] = [];
let page = 1;
let releases: OctokitResponse<any>;
do {
releases = await octokit.request('GET /repos/{owner}/{repo}/releases', {
owner: 'nextflow-io',
repo: 'nextflow',
page,
});
versions.push(...releases.data);
page++;
} while (releases.headers.link?.includes('rel="next"'));

const formattedVersions = versions.map((version: any) => ({
version: version['tag_name'],
isEdge: version['prerelease'],
downloadUrl: version['assets'][0] && version['assets'][0]['browser_download_url'],
downloadUrlAll: version['assets'][1] && version['assets'][1]['browser_download_url'],
published_at: version['published_at'],
})).sort((a: any, b: any) => { // sort version by version number, by removing "-edge" suffices and then comparing semver
const aVersion = a['version'].replace('-edge', '').replace('v', '');
const bVersion = b['version'].replace('-edge', '').replace('v', '');
// check first major, then minor, then patch
const aVersionSplit = aVersion.split('.');
const bVersionSplit = bVersion.split('.');
const formattedVersions = versions
.map((version) => ({
version: version.tag_name,
isEdge: version.prerelease,
downloadUrl: version.assets[0]?.browser_download_url,
downloadUrlAll: version.assets[1]?.browser_download_url,
published_at: version.published_at,
}))
.sort((a, b) => {
// remove `-edge` suffixes and then sort by nextflow's date-based versioning
const aParts = a.version.replace("-edge", "").replace("v", "").split(".").map(Number);
const bParts = b.version.replace("-edge", "").replace("v", "").split(".").map(Number);
for (let i = 0; i < 3; i++) {
if (parseInt(aVersionSplit[i]) > parseInt(bVersionSplit[i])) {
return -1;
} else if (parseInt(aVersionSplit[i]) < parseInt(bVersionSplit[i])) {
return 1;
if (aParts[i] !== bParts[i]) {
return bParts[i] - aParts[i];
}
}
return 0;
});

return new Response(
JSON.stringify({
latest:{
stable: formattedVersions.find((version: any) => !version.isEdge),
edge: formattedVersions.find((version: any) => version.isEdge),
everything: formattedVersions[0],
},
versions: formattedVersions,
}), {
status: 200,
headers: {
"Content-Type": "application/json"
}
}
);
} catch (error) {
return new Response(
JSON.stringify({
error: error.message,
}),
{ status: 500 },
);
// Fail if no data. setup-nextflow action depends on this file.
if (formattedVersions.length === 0) {
throw new Error("nextflow_version: GitHub returned no Nextflow versions; refusing to build an empty payload.");
}

return new Response(
JSON.stringify({
latest: {
stable: formattedVersions.find((version) => !version.isEdge),
edge: formattedVersions.find((version) => version.isEdge),
everything: formattedVersions[0],
},
versions: formattedVersions,
}),
{
status: 200,
headers: {
"Content-Type": "application/json",
},
},
);
};
Loading