keycloak_theme/scripts/generate-i18n-messages.ts

87 lines
3.2 KiB
TypeScript
Raw Normal View History

import "minimal-polyfills/Object.fromEntries";
2021-02-28 18:40:57 +01:00
import * as fs from "fs";
2022-07-31 18:57:30 +02:00
import { join as pathJoin, relative as pathRelative, dirname as pathDirname } from "path";
2023-03-18 02:12:12 +01:00
import { crawl } from "../src/bin/tools/crawl";
import { downloadBuiltinKeycloakTheme } from "../src/bin/download-builtin-keycloak-theme";
import { getProjectRoot } from "../src/bin/tools/getProjectRoot";
import { getCliOptions } from "../src/bin/tools/cliOptions";
import { getLogger } from "../src/bin/tools/logger";
2021-02-28 18:40:57 +01:00
//NOTE: To run without argument when we want to generate src/i18n/generated_kcMessages files,
// update the version array for generating for newer version.
2021-02-28 18:40:57 +01:00
//@ts-ignore
const propertiesParser = require("properties-parser");
2022-09-08 12:06:26 +03:00
const { isSilent } = getCliOptions(process.argv.slice(2));
const logger = getLogger({ isSilent });
for (const keycloakVersion of ["11.0.3", "15.0.2", "18.0.1"]) {
2022-09-08 12:06:26 +03:00
logger.log(JSON.stringify({ keycloakVersion }));
2021-02-28 18:40:57 +01:00
const tmpDirPath = pathJoin(getProjectRoot(), "tmp_xImOef9dOd44");
2021-02-28 18:40:57 +01:00
2023-01-08 14:57:18 +01:00
fs.rmSync(tmpDirPath, { "recursive": true, "force": true });
2021-02-28 18:40:57 +01:00
downloadBuiltinKeycloakTheme({
keycloakVersion,
2022-09-08 12:06:26 +03:00
"destDirPath": tmpDirPath,
isSilent
});
2021-02-28 18:40:57 +01:00
type Dictionary = { [idiomId: string]: string };
2021-02-28 18:40:57 +01:00
const record: { [typeOfPage: string]: { [language: string]: Dictionary } } = {};
2021-02-28 18:40:57 +01:00
{
const baseThemeDirPath = pathJoin(tmpDirPath, "base");
2021-02-28 18:40:57 +01:00
crawl(baseThemeDirPath).forEach(filePath => {
const match = filePath.match(/^([^/]+)\/messages\/messages_([^.]+)\.properties$/);
if (match === null) {
return;
}
const [, typeOfPage, language] = match;
2021-02-28 18:40:57 +01:00
(record[typeOfPage] ??= {})[language.replace(/_/g, "-")] = Object.fromEntries(
Object.entries(propertiesParser.parse(fs.readFileSync(pathJoin(baseThemeDirPath, filePath)).toString("utf8"))).map(
([key, value]: any) => [key, value.replace(/''/g, "'")]
)
);
});
}
2023-01-08 14:57:18 +01:00
fs.rmSync(tmpDirPath, { recursive: true, force: true });
2021-02-28 20:22:18 +01:00
Object.keys(record).forEach(pageType => {
2022-07-31 18:57:30 +02:00
const recordForPageType = record[pageType];
Object.keys(recordForPageType).forEach(language => {
const filePath = pathJoin(getProjectRoot(), "src", "lib", "i18n", "generated_messages", keycloakVersion, pageType, `${language}.ts`);
2022-07-31 18:57:30 +02:00
fs.mkdirSync(pathDirname(filePath), { "recursive": true });
fs.writeFileSync(
filePath,
Buffer.from(
[
`//This code was automatically generated by running ${pathRelative(getProjectRoot(), __filename)}`,
"//PLEASE DO NOT EDIT MANUALLY",
"",
"/* spell-checker: disable */",
`const messages= ${JSON.stringify(recordForPageType[language], null, 2)};`,
"",
"export default messages;",
"/* spell-checker: enable */"
2022-07-31 18:57:30 +02:00
].join("\n"),
"utf8"
)
2022-07-31 18:57:30 +02:00
);
2022-09-08 12:06:26 +03:00
logger.log(`${filePath} wrote`);
2022-07-31 18:57:30 +02:00
});
});
}