Tell if we should update kcGen based on the hash

This commit is contained in:
Joseph Garrone 2024-10-25 02:57:26 +02:00
parent 329b4cb0fb
commit c83319d6f3

View File

@ -4,6 +4,7 @@ import { join as pathJoin } from "path";
import { existsAsync } from "./tools/fs.existsAsync"; import { existsAsync } from "./tools/fs.existsAsync";
import { maybeDelegateCommandToCustomHandler } from "./shared/customHandler_delegate"; import { maybeDelegateCommandToCustomHandler } from "./shared/customHandler_delegate";
import { runFormat } from "./tools/runFormat"; import { runFormat } from "./tools/runFormat";
import * as crypto from "crypto";
export async function command(params: { buildContext: BuildContext }) { export async function command(params: { buildContext: BuildContext }) {
const { buildContext } = params; const { buildContext } = params;
@ -19,86 +20,106 @@ export async function command(params: { buildContext: BuildContext }) {
const filePath = pathJoin(buildContext.themeSrcDirPath, `kc.gen.tsx`); const filePath = pathJoin(buildContext.themeSrcDirPath, `kc.gen.tsx`);
const currentContent = (await existsAsync(filePath))
? await fs.readFile(filePath)
: undefined;
const hasLoginTheme = buildContext.implementedThemeTypes.login.isImplemented; const hasLoginTheme = buildContext.implementedThemeTypes.login.isImplemented;
const hasAccountTheme = buildContext.implementedThemeTypes.account.isImplemented; const hasAccountTheme = buildContext.implementedThemeTypes.account.isImplemented;
const newContent = Buffer.from( const newContent = [
[ ``,
``, `/* eslint-disable */`,
`// This file is auto-generated by Keycloakify, do not modify it manually.`, ``,
``, `// @ts-nocheck`,
`import { lazy, Suspense, type ReactNode } from "react";`, ``,
``, `// noinspection JSUnusedGlobalSymbols`,
`export type ThemeName = ${buildContext.themeNames.map(themeName => `"${themeName}"`).join(" | ")};`, ``,
``, `import { lazy, Suspense, type ReactNode } from "react";`,
`export const themeNames: ThemeName[] = [${buildContext.themeNames.map(themeName => `"${themeName}"`).join(", ")}];`, ``,
``, `export type ThemeName = ${buildContext.themeNames.map(themeName => `"${themeName}"`).join(" | ")};`,
`export type KcEnvName = ${buildContext.environmentVariables.length === 0 ? "never" : buildContext.environmentVariables.map(({ name }) => `"${name}"`).join(" | ")};`, ``,
``, `export const themeNames: ThemeName[] = [${buildContext.themeNames.map(themeName => `"${themeName}"`).join(", ")}];`,
`export const kcEnvNames: KcEnvName[] = [${buildContext.environmentVariables.map(({ name }) => `"${name}"`).join(", ")}];`, ``,
``, `export type KcEnvName = ${buildContext.environmentVariables.length === 0 ? "never" : buildContext.environmentVariables.map(({ name }) => `"${name}"`).join(" | ")};`,
`export const kcEnvDefaults: Record<KcEnvName, string> = ${JSON.stringify( ``,
Object.fromEntries( `export const kcEnvNames: KcEnvName[] = [${buildContext.environmentVariables.map(({ name }) => `"${name}"`).join(", ")}];`,
buildContext.environmentVariables.map( ``,
({ name, default: defaultValue }) => [name, defaultValue] `export const kcEnvDefaults: Record<KcEnvName, string> = ${JSON.stringify(
) Object.fromEntries(
), buildContext.environmentVariables.map(
null, ({ name, default: defaultValue }) => [name, defaultValue]
2 )
)};`, ),
``, null,
`export type KcContext =`, 2
hasLoginTheme && ` | import("./login/KcContext").KcContext`, )};`,
hasAccountTheme && ` | import("./account/KcContext").KcContext`, ``,
` ;`, `export type KcContext =`,
``, hasLoginTheme && ` | import("./login/KcContext").KcContext`,
`declare global {`, hasAccountTheme && ` | import("./account/KcContext").KcContext`,
` interface Window {`, ` ;`,
` kcContext?: KcContext;`, ``,
` }`, `declare global {`,
`}`, ` interface Window {`,
``, ` kcContext?: KcContext;`,
hasLoginTheme && ` }`,
`export const KcLoginPage = lazy(() => import("./login/KcPage"));`, `}`,
hasAccountTheme && ``,
`export const KcAccountPage = lazy(() => import("./account/KcPage"));`, hasLoginTheme &&
``, `export const KcLoginPage = lazy(() => import("./login/KcPage"));`,
`export function KcPage(`, hasAccountTheme &&
` props: {`, `export const KcAccountPage = lazy(() => import("./account/KcPage"));`,
` kcContext: KcContext;`, ``,
` fallback?: ReactNode;`, `export function KcPage(`,
` }`, ` props: {`,
`) {`, ` kcContext: KcContext;`,
` const { kcContext, fallback } = props;`, ` fallback?: ReactNode;`,
` return (`, ` }`,
` <Suspense fallback={fallback}>`, `) {`,
` {(() => {`, ` const { kcContext, fallback } = props;`,
` switch (kcContext.themeType) {`, ` return (`,
hasLoginTheme && ` <Suspense fallback={fallback}>`,
` case "login": return <KcLoginPage kcContext={kcContext} />;`, ` {(() => {`,
hasAccountTheme && ` switch (kcContext.themeType) {`,
` case "account": return <KcAccountPage kcContext={kcContext} />;`, hasLoginTheme &&
` }`, ` case "login": return <KcLoginPage kcContext={kcContext} />;`,
` })()}`, hasAccountTheme &&
` </Suspense>`, ` case "account": return <KcAccountPage kcContext={kcContext} />;`,
` );`, ` }`,
`}`, ` })()}`,
`` ` </Suspense>`,
] ` );`,
.filter(item => typeof item === "string") `}`,
.join("\n"), ``
"utf8" ]
); .filter(item => typeof item === "string")
.join("\n");
const hash = crypto.createHash("sha256").update(newContent).digest("hex");
skip_if_no_changes: {
if (!(await existsAsync(filePath))) {
break skip_if_no_changes;
}
const currentContent = (await fs.readFile(filePath)).toString("utf8");
if (!currentContent.includes(hash)) {
break skip_if_no_changes;
}
if (currentContent !== undefined && currentContent.equals(newContent)) {
return; return;
} }
await fs.writeFile(filePath, newContent); await fs.writeFile(
filePath,
Buffer.from(
[
`// This file is auto-generated by the \`update-kc-gen\` command. Do not edit it manually.`,
`// Hash: ${hash}`,
``,
newContent
].join("\n"),
"utf8"
)
);
runFormat({ packageJsonFilePath: buildContext.packageJsonFilePath }); runFormat({ packageJsonFilePath: buildContext.packageJsonFilePath });