keycloak_theme/src/bin/keycloakify/parsedKeycloakifyViteConfig.ts

117 lines
3.8 KiB
TypeScript
Raw Normal View History

2024-01-30 00:06:17 +01:00
import * as fs from "fs";
import { assert } from "tsafe";
import type { Equals } from "tsafe";
import { z } from "zod";
import { pathJoin } from "../tools/pathJoin";
import { keycloakifyViteConfigJsonBasename } from "../constants";
import type { OptionalIfCanBeUndefined } from "../tools/OptionalIfCanBeUndefined";
2024-01-30 05:54:36 +01:00
import { getAbsoluteAndInOsFormatPath } from "../tools/getAbsoluteAndInOsFormatPath";
2024-01-30 00:06:17 +01:00
export type ParsedKeycloakifyViteConfig = {
2024-01-30 05:54:36 +01:00
buildDir: string;
publicDir: string;
assetsDir: string;
2024-01-30 00:06:17 +01:00
urlPathname: string | undefined;
};
2024-01-30 05:54:36 +01:00
const zParsedKeycloakifyViteConfig = z.object({
"buildDir": z.string(),
"publicDir": z.string(),
"assetsDir": z.string(),
2024-01-30 00:06:17 +01:00
"urlPathname": z.string().optional()
});
{
type Got = ReturnType<(typeof zParsedKeycloakifyViteConfig)["parse"]>;
type Expected = OptionalIfCanBeUndefined<ParsedKeycloakifyViteConfig>;
assert<Equals<Got, Expected>>();
}
2024-01-30 05:54:36 +01:00
export function getParsedKeycloakifyViteConfig(params: {
reactAppRootDirPath: string;
parsedPackageJson_keycloakify_keycloakifyBuildDirPath: string | undefined;
}):
| {
parsedKeycloakifyViteConfig: ParsedKeycloakifyViteConfig;
}
| undefined {
const { reactAppRootDirPath, parsedPackageJson_keycloakify_keycloakifyBuildDirPath } = params;
const viteConfigTsFilePath = pathJoin(reactAppRootDirPath, "vite.config.ts");
if (!fs.existsSync(viteConfigTsFilePath)) {
return undefined;
2024-01-30 00:06:17 +01:00
}
2024-01-30 05:54:36 +01:00
const { keycloakifyBuildDirPath } = getKeycloakifyBuildDirPath({
reactAppRootDirPath,
parsedPackageJson_keycloakify_keycloakifyBuildDirPath,
"bundler": "vite"
});
2024-01-30 00:06:17 +01:00
const parsedKeycloakifyViteConfig = (() => {
const keycloakifyViteConfigJsonFilePath = pathJoin(keycloakifyBuildDirPath, keycloakifyViteConfigJsonBasename);
if (!fs.existsSync(keycloakifyViteConfigJsonFilePath)) {
2024-01-30 05:54:36 +01:00
throw new Error("Missing Keycloakify Vite plugin output.");
2024-01-30 00:06:17 +01:00
}
let out: ParsedKeycloakifyViteConfig;
try {
out = JSON.parse(fs.readFileSync(keycloakifyViteConfigJsonFilePath).toString("utf8"));
} catch {
throw new Error("The output of the Keycloakify Vite plugin is not a valid JSON.");
}
try {
const zodParseReturn = zParsedKeycloakifyViteConfig.parse(out);
// So that objectKeys from tsafe return the expected result no matter what.
Object.keys(zodParseReturn)
.filter(key => !(key in out))
.forEach(key => {
delete (out as any)[key];
});
} catch {
throw new Error("The output of the Keycloakify Vite plugin do not match the expected schema.");
}
return out;
})();
2024-01-30 05:54:36 +01:00
return { parsedKeycloakifyViteConfig };
}
2024-01-30 00:06:17 +01:00
2024-01-30 05:54:36 +01:00
export function getKeycloakifyBuildDirPath(params: {
reactAppRootDirPath: string;
parsedPackageJson_keycloakify_keycloakifyBuildDirPath: string | undefined;
bundler: "vite" | "webpack";
}) {
const { reactAppRootDirPath, parsedPackageJson_keycloakify_keycloakifyBuildDirPath, bundler } = params;
const keycloakifyBuildDirPath = (() => {
if (parsedPackageJson_keycloakify_keycloakifyBuildDirPath !== undefined) {
getAbsoluteAndInOsFormatPath({
"pathIsh": parsedPackageJson_keycloakify_keycloakifyBuildDirPath,
"cwd": reactAppRootDirPath
});
}
return pathJoin(
reactAppRootDirPath,
`${(() => {
switch (bundler) {
case "vite":
return "dist";
case "webpack":
return "build";
}
})()}_keycloak`
);
})();
2024-01-30 00:06:17 +01:00
2024-01-30 05:54:36 +01:00
return { keycloakifyBuildDirPath };
2024-01-30 00:06:17 +01:00
}