Tell if we should update kcGen based on the hash
This commit is contained in:
parent
329b4cb0fb
commit
c83319d6f3
@ -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 });
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user