diff --git a/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts b/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts index b3b8e6dc..6c6a1714 100644 --- a/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +++ b/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts @@ -6,6 +6,7 @@ import { getLatestsSemVersionedTag, type BuildContextLike as BuildContextLike_getLatestsSemVersionedTag } from "../shared/getLatestsSemVersionedTag"; +import { SemVer } from "../tools/SemVer"; import fetch from "make-fetch-happen"; import { z } from "zod"; import { assert, type Equals } from "tsafe/assert"; @@ -68,7 +69,9 @@ export async function initializeAccountTheme_singlePage(params: { })() ); - dependencies.dependencies["@keycloakify/keycloak-account-ui"] = semVersionedTag.tag; + dependencies.dependencies["@keycloakify/keycloak-account-ui"] = SemVer.stringify( + semVersionedTag.version + ); const parsedPackageJson = (() => { type ParsedPackageJson = { diff --git a/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts b/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts index 382631aa..a9ca89d0 100644 --- a/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +++ b/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts @@ -4,8 +4,7 @@ import { join as pathJoin, resolve as pathResolve, relative as pathRelative, - dirname as pathDirname, - basename as pathBasename + dirname as pathDirname } from "path"; import { replaceImportsInJsCode } from "../replacers/replaceImportsInJsCode"; import { replaceImportsInCssCode } from "../replacers/replaceImportsInCssCode"; @@ -43,7 +42,7 @@ import { } from "../../shared/metaInfKeycloakThemes"; import { objectEntries } from "tsafe/objectEntries"; import { escapeStringForPropertiesFile } from "../../tools/escapeStringForPropertiesFile"; -import { downloadAndExtractArchive } from "../../tools/downloadAndExtractArchive"; +import * as child_process from "child_process"; export type BuildContextLike = BuildContextLike_kcContextExclusionsFtlCode & BuildContextLike_downloadKeycloakStaticResources & @@ -56,6 +55,7 @@ export type BuildContextLike = BuildContextLike_kcContextExclusionsFtlCode & implementedThemeTypes: BuildContext["implementedThemeTypes"]; themeSrcDirPath: string; bundler: "vite" | "webpack"; + packageJsonFilePath: string; }; assert(); @@ -313,27 +313,23 @@ export async function generateResourcesForMainTheme(params: { break bring_in_account_v3_i18n_messages; } - const { extractedDirPath } = await downloadAndExtractArchive({ - url: "https://repo1.maven.org/maven2/org/keycloak/keycloak-account-ui/25.0.1/keycloak-account-ui-25.0.1.jar", - cacheDirPath: buildContext.cacheDirPath, - fetchOptions: buildContext.fetchOptions, - uniqueIdOfOnArchiveFile: "bring_in_account_v3_i18n_messages", - onArchiveFile: async ({ fileRelativePath, writeFile }) => { - if ( - !fileRelativePath.startsWith( - pathJoin("theme", "keycloak.v3", "account", "messages") - ) - ) { - return; - } - await writeFile({ - fileRelativePath: pathBasename(fileRelativePath) - }); - } - }); + const accountUiDirPath = child_process + .execSync("npm list @keycloakify/keycloak-account-ui --parseable", { + cwd: pathDirname(buildContext.packageJsonFilePath) + }) + .toString("utf8") + .trim(); + + const messagesDirPath = pathJoin(accountUiDirPath, "messages"); + + if (!fs.existsSync(messagesDirPath)) { + throw new Error( + `Please update @keycloakify/keycloak-account-ui to 25.0.4-rc.5 or later.` + ); + } transformCodebase({ - srcDirPath: extractedDirPath, + srcDirPath: messagesDirPath, destDirPath: pathJoin( getThemeTypeDirPath({ themeType: "account" }), "messages" diff --git a/src/bin/keycloakify/keycloakify.ts b/src/bin/keycloakify/keycloakify.ts index 548a9e67..b39dcad8 100644 --- a/src/bin/keycloakify/keycloakify.ts +++ b/src/bin/keycloakify/keycloakify.ts @@ -12,6 +12,10 @@ import * as os from "os"; import { rmSync } from "../tools/fs.rmSync"; export async function command(params: { cliCommandOptions: CliCommandOptions }) { + const { cliCommandOptions } = params; + + const buildContext = getBuildContext({ cliCommandOptions }); + exit_if_maven_not_installed: { let commandOutput: Buffer | undefined = undefined; @@ -25,31 +29,44 @@ export async function command(params: { cliCommandOptions: CliCommandOptions }) break exit_if_maven_not_installed; } - const installationCommand = (() => { - switch (os.platform()) { - case "darwin": - return "brew install mvn"; - case "win32": - return "choco install mvn"; - case "linux": - default: - return "sudo apt-get install mvn"; - } - })(); + if ( + fs + .readFileSync(buildContext.packageJsonFilePath) + .toString("utf8") + .includes(`"mvn"`) + ) { + console.log( + chalk.red( + [ + "Please remove the 'mvn' package from your package.json'dependencies list,", + "reinstall your dependencies and try again.", + "We need the Apache Maven CLI, not this: https://www.npmjs.com/package/mvn" + ].join(" ") + ) + ); + } else { + const installationCommand = (() => { + switch (os.platform()) { + case "darwin": + return "brew install mvn"; + case "win32": + return "choco install mvn"; + case "linux": + default: + return "sudo apt-get install mvn"; + } + })(); - console.log( - `${chalk.red("Apache Maven required.")} Install it with \`${chalk.bold( - installationCommand - )}\` (for example)` - ); + console.log( + `${chalk.red("Apache Maven required.")} Install it with \`${chalk.bold( + installationCommand + )}\` (for example)` + ); + } process.exit(1); } - const { cliCommandOptions } = params; - - const buildContext = getBuildContext({ cliCommandOptions }); - console.log( [ chalk.cyan(`keycloakify v${readThisNpmPackageVersion()}`),