keycloak_theme/src/bin/shared/promptKeycloakVersion.ts

131 lines
3.6 KiB
TypeScript
Raw Normal View History

import { getLatestsSemVersionedTagFactory } from "../tools/octokit-addons/getLatestsSemVersionedTag";
2022-04-20 00:39:40 +02:00
import { Octokit } from "@octokit/rest";
import cliSelect from "cli-select";
import { SemVer } from "../tools/SemVer";
2024-05-18 09:00:57 +02:00
import { join as pathJoin, dirname as pathDirname } from "path";
import * as fs from "fs";
import type { ReturnType } from "tsafe";
import { id } from "tsafe/id";
2022-04-20 00:39:40 +02:00
2024-05-20 15:48:51 +02:00
export async function promptKeycloakVersion(params: {
startingFromMajor: number | undefined;
2024-06-11 17:12:12 +02:00
excludeMajorVersions: number[];
2024-05-20 15:48:51 +02:00
cacheDirPath: string;
}) {
2024-06-11 17:12:12 +02:00
const { startingFromMajor, excludeMajorVersions, cacheDirPath } = params;
2024-05-17 05:13:41 +02:00
2022-04-20 00:39:40 +02:00
const { getLatestsSemVersionedTag } = (() => {
const { octokit } = (() => {
const githubToken = process.env.GITHUB_TOKEN;
2024-05-20 15:48:51 +02:00
const octokit = new Octokit(
githubToken === undefined ? undefined : { auth: githubToken }
);
2022-04-20 00:39:40 +02:00
return { octokit };
})();
2024-05-20 15:48:51 +02:00
const { getLatestsSemVersionedTag } = getLatestsSemVersionedTagFactory({
octokit
});
2022-04-20 00:39:40 +02:00
return { getLatestsSemVersionedTag };
})();
const semVersionedTagByMajor = new Map<number, { tag: string; version: SemVer }>();
const semVersionedTags = await (async () => {
const cacheFilePath = pathJoin(cacheDirPath, "keycloak-versions.json");
type Cache = {
time: number;
semVersionedTags: ReturnType<typeof getLatestsSemVersionedTag>;
};
use_cache: {
if (!fs.existsSync(cacheFilePath)) {
break use_cache;
}
2024-05-20 15:48:51 +02:00
const cache: Cache = JSON.parse(
fs.readFileSync(cacheFilePath).toString("utf8")
);
if (Date.now() - cache.time > 3_600_000) {
fs.unlinkSync(cacheFilePath);
break use_cache;
}
return cache.semVersionedTags;
}
const semVersionedTags = await getLatestsSemVersionedTag({
2024-05-20 15:48:51 +02:00
count: 50,
owner: "keycloak",
repo: "keycloak"
});
2024-05-18 09:00:57 +02:00
{
const dirPath = pathDirname(cacheFilePath);
if (!fs.existsSync(dirPath)) {
2024-05-20 15:48:51 +02:00
fs.mkdirSync(dirPath, { recursive: true });
2024-05-18 09:00:57 +02:00
}
}
fs.writeFileSync(
cacheFilePath,
JSON.stringify(
id<Cache>({
2024-05-20 15:48:51 +02:00
time: Date.now(),
semVersionedTags
}),
null,
2
)
);
return semVersionedTags;
})();
semVersionedTags.forEach(semVersionedTag => {
2024-05-20 15:48:51 +02:00
if (
startingFromMajor !== undefined &&
semVersionedTag.version.major < startingFromMajor
) {
2024-05-17 05:13:41 +02:00
return;
}
2024-06-11 17:12:12 +02:00
if (excludeMajorVersions.includes(semVersionedTag.version.major)) {
return;
}
2024-05-20 15:48:51 +02:00
const currentSemVersionedTag = semVersionedTagByMajor.get(
semVersionedTag.version.major
);
2024-05-20 15:48:51 +02:00
if (
currentSemVersionedTag !== undefined &&
SemVer.compare(semVersionedTag.version, currentSemVersionedTag.version) === -1
) {
return;
}
semVersionedTagByMajor.set(semVersionedTag.version.major, semVersionedTag);
});
2024-05-20 15:48:51 +02:00
const lastMajorVersions = Array.from(semVersionedTagByMajor.values()).map(
({ tag }) => tag
);
const { value } = await cliSelect<string>({
2024-05-20 15:48:51 +02:00
values: lastMajorVersions
2022-04-20 00:39:40 +02:00
}).catch(() => {
process.exit(-1);
});
const keycloakVersion = value.split(" ")[0];
2022-04-20 00:39:40 +02:00
return { keycloakVersion };
}