Implement caching for promptKeycloakVersion

This commit is contained in:
Joseph Garrone
2024-05-18 08:11:20 +02:00
parent a3d9016cfe
commit 2f8d89012b
4 changed files with 54 additions and 9 deletions

View File

@ -17,7 +17,8 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
console.log("Select the Keycloak version from which you want to download the builtins theme:"); console.log("Select the Keycloak version from which you want to download the builtins theme:");
const { keycloakVersion } = await promptKeycloakVersion({ const { keycloakVersion } = await promptKeycloakVersion({
"startingFromMajor": undefined "startingFromMajor": undefined,
"cacheDirPath": buildOptions.cacheDirPath
}); });
const destDirPath = pathJoin(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "theme"); const destDirPath = pathJoin(buildOptions.keycloakifyBuildDirPath, "src", "main", "resources", "theme");

View File

@ -32,7 +32,8 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
const { keycloakVersion } = await promptKeycloakVersion({ const { keycloakVersion } = await promptKeycloakVersion({
// NOTE: This is arbitrary // NOTE: This is arbitrary
"startingFromMajor": 17 "startingFromMajor": 17,
"cacheDirPath": buildOptions.cacheDirPath
}); });
const builtinKeycloakThemeTmpDirPath = pathJoin(buildOptions.cacheDirPath, "initialize-email-theme_tmp"); const builtinKeycloakThemeTmpDirPath = pathJoin(buildOptions.cacheDirPath, "initialize-email-theme_tmp");

View File

@ -2,9 +2,13 @@ import { getLatestsSemVersionedTagFactory } from "../tools/octokit-addons/getLat
import { Octokit } from "@octokit/rest"; import { Octokit } from "@octokit/rest";
import cliSelect from "cli-select"; import cliSelect from "cli-select";
import { SemVer } from "../tools/SemVer"; import { SemVer } from "../tools/SemVer";
import { join as pathJoin } from "path";
import * as fs from "fs";
import type { ReturnType } from "tsafe";
import { id } from "tsafe/id";
export async function promptKeycloakVersion(params: { startingFromMajor: number | undefined }) { export async function promptKeycloakVersion(params: { startingFromMajor: number | undefined; cacheDirPath: string }) {
const { startingFromMajor } = params; const { startingFromMajor, cacheDirPath } = params;
const { getLatestsSemVersionedTag } = (() => { const { getLatestsSemVersionedTag } = (() => {
const { octokit } = (() => { const { octokit } = (() => {
@ -22,13 +26,51 @@ export async function promptKeycloakVersion(params: { startingFromMajor: number
const semVersionedTagByMajor = new Map<number, { tag: string; version: SemVer }>(); const semVersionedTagByMajor = new Map<number, { tag: string; version: SemVer }>();
( const semVersionedTags = await (async () => {
await getLatestsSemVersionedTag({ const cacheFilePath = pathJoin(cacheDirPath, "keycloak-versions.json");
type Cache = {
time: number;
semVersionedTags: ReturnType<typeof getLatestsSemVersionedTag>;
};
use_cache: {
if (!fs.existsSync(cacheFilePath)) {
break use_cache;
}
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({
"count": 50, "count": 50,
"owner": "keycloak", "owner": "keycloak",
"repo": "keycloak" "repo": "keycloak"
}) });
).forEach(semVersionedTag => {
fs.writeFileSync(
cacheFilePath,
JSON.stringify(
id<Cache>({
"time": Date.now(),
semVersionedTags
}),
null,
2
)
);
return semVersionedTags;
})();
semVersionedTags.forEach(semVersionedTag => {
if (startingFromMajor !== undefined && semVersionedTag.version.major < startingFromMajor) { if (startingFromMajor !== undefined && semVersionedTag.version.major < startingFromMajor) {
return; return;
} }

View File

@ -29,7 +29,8 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
keycloakMajorNumber: number; keycloakMajorNumber: number;
}> { }> {
const { keycloakVersion } = await promptKeycloakVersion({ const { keycloakVersion } = await promptKeycloakVersion({
"startingFromMajor": 17 "startingFromMajor": 17,
"cacheDirPath": buildOptions.cacheDirPath
}); });
const keycloakMajorNumber = SemVer.parse(keycloakVersion).major; const keycloakMajorNumber = SemVer.parse(keycloakVersion).major;