keycloakify 10.0.0-rc.37 → 10.0.0-rc.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/account/Fallback.d.ts +1 -2
- package/account/Fallback.js.map +1 -1
- package/account/KcContext/KcContext.d.ts +6 -6
- package/account/KcContext/getKcContextMock.d.ts +9 -9
- package/account/KcContext/getKcContextMock.js +3 -3
- package/account/KcContext/getKcContextMock.js.map +1 -1
- package/account/Template.d.ts +1 -2
- package/account/Template.js +7 -6
- package/account/Template.js.map +1 -1
- package/account/TemplateProps.d.ts +1 -3
- package/account/i18n/i18n.d.ts +9 -4
- package/account/i18n/i18n.js +132 -87
- package/account/i18n/i18n.js.map +1 -1
- package/account/i18n/index.d.ts +9 -2
- package/account/i18n/index.js +5 -1
- package/account/i18n/index.js.map +1 -1
- package/account/lib/kcClsx.d.ts +9 -0
- package/account/lib/{useGetClassName.js → kcClsx.js} +3 -3
- package/account/lib/kcClsx.js.map +1 -0
- package/account/pages/Account.d.ts +1 -2
- package/account/pages/Account.js +9 -7
- package/account/pages/Account.js.map +1 -1
- package/account/pages/Applications.d.ts +1 -2
- package/account/pages/Applications.js +7 -7
- package/account/pages/Applications.js.map +1 -1
- package/account/pages/FederatedIdentity.d.ts +1 -2
- package/account/pages/FederatedIdentity.js +4 -3
- package/account/pages/FederatedIdentity.js.map +1 -1
- package/account/pages/Log.d.ts +1 -2
- package/account/pages/Log.js +6 -5
- package/account/pages/Log.js.map +1 -1
- package/account/pages/PageProps.d.ts +2 -4
- package/account/pages/Password.d.ts +1 -2
- package/account/pages/Password.js +10 -9
- package/account/pages/Password.js.map +1 -1
- package/account/pages/Sessions.d.ts +1 -2
- package/account/pages/Sessions.js +6 -6
- package/account/pages/Sessions.js.map +1 -1
- package/account/pages/Totp.d.ts +1 -2
- package/account/pages/Totp.js +6 -5
- package/account/pages/Totp.js.map +1 -1
- package/bin/193.index.js +13 -13
- package/bin/{430.index.js → 214.index.js} +161 -2
- package/bin/3.index.js +165 -149
- package/bin/322.index.js +595 -0
- package/bin/453.index.js +3 -3
- package/bin/526.index.js +42 -632
- package/bin/538.index.js +563 -0
- package/bin/932.index.js +7 -7
- package/bin/{890.index.js → 941.index.js} +2 -159
- package/bin/944.index.js +621 -0
- package/bin/961.index.js +5 -5
- package/bin/97.index.js +3 -3
- package/bin/{314.index.js → 98.index.js} +217 -48
- package/bin/main.js +20 -8
- package/lib/getKcClsx.d.ts +11 -0
- package/lib/getKcClsx.js +55 -0
- package/lib/getKcClsx.js.map +1 -0
- package/login/Fallback.d.ts +2 -2
- package/login/Fallback.js.map +1 -1
- package/login/KcContext/KcContext.d.ts +6 -6
- package/login/KcContext/getKcContextMock.d.ts +9 -9
- package/login/KcContext/getKcContextMock.js +3 -3
- package/login/KcContext/getKcContextMock.js.map +1 -1
- package/login/Template.d.ts +1 -2
- package/login/Template.js +10 -9
- package/login/Template.js.map +1 -1
- package/login/TemplateProps.d.ts +1 -3
- package/login/UserProfileFormFields.d.ts +6 -5
- package/login/UserProfileFormFields.js +35 -36
- package/login/UserProfileFormFields.js.map +1 -1
- package/login/i18n/i18n.d.ts +9 -4
- package/login/i18n/i18n.js +136 -91
- package/login/i18n/i18n.js.map +1 -1
- package/login/i18n/index.d.ts +9 -2
- package/login/i18n/index.js +5 -1
- package/login/i18n/index.js.map +1 -1
- package/login/lib/kcClsx.d.ts +9 -0
- package/login/lib/{useGetClassName.js → kcClsx.js} +3 -3
- package/login/lib/kcClsx.js.map +1 -0
- package/login/lib/useUserProfileForm.d.ts +9 -6
- package/login/lib/useUserProfileForm.js +7 -5
- package/login/lib/useUserProfileForm.js.map +1 -1
- package/login/pages/Code.d.ts +1 -2
- package/login/pages/Code.js +6 -5
- package/login/pages/Code.js.map +1 -1
- package/login/pages/DeleteAccountConfirm.d.ts +1 -2
- package/login/pages/DeleteAccountConfirm.js +7 -7
- package/login/pages/DeleteAccountConfirm.js.map +1 -1
- package/login/pages/DeleteCredential.d.ts +1 -2
- package/login/pages/DeleteCredential.js +6 -6
- package/login/pages/DeleteCredential.js.map +1 -1
- package/login/pages/Error.d.ts +1 -2
- package/login/pages/Error.js +4 -3
- package/login/pages/Error.js.map +1 -1
- package/login/pages/FrontchannelLogout.d.ts +1 -2
- package/login/pages/FrontchannelLogout.js +4 -3
- package/login/pages/FrontchannelLogout.js.map +1 -1
- package/login/pages/IdpReviewUserProfile.d.ts +2 -2
- package/login/pages/IdpReviewUserProfile.js +6 -6
- package/login/pages/IdpReviewUserProfile.js.map +1 -1
- package/login/pages/Info.d.ts +1 -2
- package/login/pages/Info.js +4 -3
- package/login/pages/Info.js.map +1 -1
- package/login/pages/Login.d.ts +1 -2
- package/login/pages/Login.js +10 -8
- package/login/pages/Login.js.map +1 -1
- package/login/pages/LoginConfigTotp.d.ts +1 -2
- package/login/pages/LoginConfigTotp.js +8 -7
- package/login/pages/LoginConfigTotp.js.map +1 -1
- package/login/pages/LoginIdpLinkConfirm.d.ts +1 -2
- package/login/pages/LoginIdpLinkConfirm.js +6 -6
- package/login/pages/LoginIdpLinkConfirm.js.map +1 -1
- package/login/pages/LoginIdpLinkEmail.d.ts +1 -2
- package/login/pages/LoginIdpLinkEmail.js +4 -3
- package/login/pages/LoginIdpLinkEmail.js.map +1 -1
- package/login/pages/LoginOauth2DeviceVerifyUserCode.d.ts +1 -2
- package/login/pages/LoginOauth2DeviceVerifyUserCode.js +6 -6
- package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -1
- package/login/pages/LoginOauthGrant.d.ts +1 -2
- package/login/pages/LoginOauthGrant.js +7 -7
- package/login/pages/LoginOauthGrant.js.map +1 -1
- package/login/pages/LoginOtp.d.ts +1 -2
- package/login/pages/LoginOtp.js +6 -6
- package/login/pages/LoginOtp.js.map +1 -1
- package/login/pages/LoginPageExpired.d.ts +1 -2
- package/login/pages/LoginPageExpired.js +4 -3
- package/login/pages/LoginPageExpired.js.map +1 -1
- package/login/pages/LoginPassword.d.ts +1 -2
- package/login/pages/LoginPassword.js +9 -7
- package/login/pages/LoginPassword.js.map +1 -1
- package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +1 -2
- package/login/pages/LoginRecoveryAuthnCodeConfig.js +9 -7
- package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -1
- package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +1 -2
- package/login/pages/LoginRecoveryAuthnCodeInput.js +6 -6
- package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
- package/login/pages/LoginResetOtp.d.ts +1 -2
- package/login/pages/LoginResetOtp.js +6 -6
- package/login/pages/LoginResetOtp.js.map +1 -1
- package/login/pages/LoginResetPassword.d.ts +1 -2
- package/login/pages/LoginResetPassword.js +7 -7
- package/login/pages/LoginResetPassword.js.map +1 -1
- package/login/pages/LoginUpdatePassword.d.ts +1 -2
- package/login/pages/LoginUpdatePassword.js +10 -9
- package/login/pages/LoginUpdatePassword.js.map +1 -1
- package/login/pages/LoginUpdateProfile.d.ts +2 -2
- package/login/pages/LoginUpdateProfile.js +7 -12
- package/login/pages/LoginUpdateProfile.js.map +1 -1
- package/login/pages/LoginUsername.d.ts +1 -2
- package/login/pages/LoginUsername.js +8 -7
- package/login/pages/LoginUsername.js.map +1 -1
- package/login/pages/LoginVerifyEmail.d.ts +1 -2
- package/login/pages/LoginVerifyEmail.js +4 -3
- package/login/pages/LoginVerifyEmail.js.map +1 -1
- package/login/pages/LoginX509Info.d.ts +1 -2
- package/login/pages/LoginX509Info.js +6 -6
- package/login/pages/LoginX509Info.js.map +1 -1
- package/login/pages/LogoutConfirm.d.ts +1 -2
- package/login/pages/LogoutConfirm.js +6 -6
- package/login/pages/LogoutConfirm.js.map +1 -1
- package/login/pages/PageProps.d.ts +2 -4
- package/login/pages/Register.d.ts +2 -2
- package/login/pages/Register.js +8 -16
- package/login/pages/Register.js.map +1 -1
- package/login/pages/SamlPostForm.d.ts +1 -2
- package/login/pages/SamlPostForm.js +4 -3
- package/login/pages/SamlPostForm.js.map +1 -1
- package/login/pages/SelectAuthenticator.d.ts +1 -2
- package/login/pages/SelectAuthenticator.js +6 -9
- package/login/pages/SelectAuthenticator.js.map +1 -1
- package/login/pages/Terms.d.ts +1 -2
- package/login/pages/Terms.js +6 -6
- package/login/pages/Terms.js.map +1 -1
- package/login/pages/UpdateEmail.d.ts +2 -2
- package/login/pages/UpdateEmail.js +8 -12
- package/login/pages/UpdateEmail.js.map +1 -1
- package/login/pages/WebauthnAuthenticate.d.ts +1 -2
- package/login/pages/WebauthnAuthenticate.js +13 -12
- package/login/pages/WebauthnAuthenticate.js.map +1 -1
- package/login/pages/WebauthnError.d.ts +1 -2
- package/login/pages/WebauthnError.js +7 -7
- package/login/pages/WebauthnError.js.map +1 -1
- package/login/pages/WebauthnRegister.d.ts +1 -2
- package/login/pages/WebauthnRegister.js +9 -8
- package/login/pages/WebauthnRegister.js.map +1 -1
- package/package.json +27 -22
- package/src/account/Fallback.tsx +1 -2
- package/src/account/KcContext/KcContext.ts +7 -7
- package/src/account/KcContext/getKcContextMock.ts +13 -24
- package/src/account/Template.tsx +8 -8
- package/src/account/TemplateProps.ts +1 -6
- package/src/account/i18n/i18n.tsx +204 -125
- package/src/account/i18n/index.ts +10 -2
- package/src/account/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
- package/src/account/pages/Account.tsx +15 -21
- package/src/account/pages/Applications.tsx +8 -9
- package/src/account/pages/FederatedIdentity.tsx +5 -5
- package/src/account/pages/Log.tsx +8 -8
- package/src/account/pages/PageProps.ts +2 -4
- package/src/account/pages/Password.tsx +13 -16
- package/src/account/pages/Sessions.tsx +9 -10
- package/src/account/pages/Totp.tsx +19 -28
- package/src/bin/add-story.ts +3 -3
- package/src/bin/copy-keycloak-resources-to-public.ts +3 -3
- package/src/bin/download-keycloak-default-theme.ts +5 -5
- package/src/bin/eject-page.ts +3 -3
- package/src/bin/initialize-email-theme.ts +5 -5
- package/src/bin/keycloakify/buildJars/buildJar.ts +14 -14
- package/src/bin/keycloakify/buildJars/buildJars.ts +8 -8
- package/src/bin/keycloakify/buildJars/generatePom.ts +9 -9
- package/src/bin/keycloakify/generateFtl/generateFtl.ts +12 -12
- package/src/bin/keycloakify/generateSrcMainResources/bringInAccountV1.ts +7 -7
- package/src/bin/keycloakify/generateSrcMainResources/generateMessageProperties.ts +2 -66
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResources.ts +9 -9
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +30 -24
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForThemeVariant.ts +8 -8
- package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +9 -9
- package/src/bin/keycloakify/keycloakify.ts +11 -11
- package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +6 -6
- package/src/bin/keycloakify/replacers/replaceImportsInInlineCssCode.ts +7 -7
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +10 -10
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +13 -13
- package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +11 -11
- package/src/bin/main.ts +17 -2
- package/src/bin/shared/{buildOptions.ts → buildContext.ts} +65 -51
- package/src/bin/shared/copyKeycloakResourcesToPublic.ts +12 -12
- package/src/bin/shared/downloadKeycloakDefaultTheme.ts +7 -7
- package/src/bin/shared/downloadKeycloakStaticResources.ts +7 -7
- package/src/bin/shared/generateKcGenTs.ts +61 -0
- package/src/bin/shared/getThemeSrcDirPath.ts +3 -3
- package/src/bin/start-keycloak/appBuild.ts +11 -11
- package/src/bin/start-keycloak/keycloakifyBuild.ts +7 -7
- package/src/bin/start-keycloak/start-keycloak.ts +34 -22
- package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
- package/src/bin/tools/getNpmWorkspaceRootDirPath.ts +3 -3
- package/src/bin/update-kc-gen.ts +13 -0
- package/src/lib/getKcClsx.ts +89 -0
- package/src/login/Fallback.tsx +2 -2
- package/src/login/KcContext/KcContext.ts +7 -7
- package/src/login/KcContext/getKcContextMock.ts +13 -24
- package/src/login/Template.tsx +36 -37
- package/src/login/TemplateProps.ts +1 -6
- package/src/login/UserProfileFormFields.tsx +67 -84
- package/src/login/i18n/i18n.tsx +208 -129
- package/src/login/i18n/index.ts +10 -2
- package/src/login/lib/{useGetClassName.ts → kcClsx.ts} +6 -2
- package/src/login/lib/useUserProfileForm.tsx +29 -21
- package/src/login/pages/Code.tsx +10 -8
- package/src/login/pages/DeleteAccountConfirm.tsx +9 -10
- package/src/login/pages/DeleteCredential.tsx +11 -10
- package/src/login/pages/Error.tsx +5 -5
- package/src/login/pages/FrontchannelLogout.tsx +7 -5
- package/src/login/pages/IdpReviewUserProfile.tsx +18 -21
- package/src/login/pages/Info.tsx +7 -5
- package/src/login/pages/Login.tsx +34 -53
- package/src/login/pages/LoginConfigTotp.tsx +30 -38
- package/src/login/pages/LoginIdpLinkConfirm.tsx +10 -21
- package/src/login/pages/LoginIdpLinkEmail.tsx +5 -5
- package/src/login/pages/LoginOauth2DeviceVerifyUserCode.tsx +19 -24
- package/src/login/pages/LoginOauthGrant.tsx +14 -21
- package/src/login/pages/LoginOtp.tsx +29 -33
- package/src/login/pages/LoginPageExpired.tsx +5 -5
- package/src/login/pages/LoginPassword.tsx +23 -33
- package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +21 -25
- package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +21 -25
- package/src/login/pages/LoginResetOtp.tsx +21 -25
- package/src/login/pages/LoginResetPassword.tsx +21 -25
- package/src/login/pages/LoginUpdatePassword.tsx +42 -52
- package/src/login/pages/LoginUpdateProfile.tsx +29 -30
- package/src/login/pages/LoginUsername.tsx +23 -35
- package/src/login/pages/LoginVerifyEmail.tsx +7 -5
- package/src/login/pages/LoginX509Info.tsx +27 -36
- package/src/login/pages/LogoutConfirm.tsx +11 -17
- package/src/login/pages/PageProps.ts +2 -4
- package/src/login/pages/Register.tsx +27 -46
- package/src/login/pages/SamlPostForm.tsx +5 -5
- package/src/login/pages/SelectAuthenticator.tsx +24 -26
- package/src/login/pages/Terms.tsx +9 -16
- package/src/login/pages/UpdateEmail.tsx +29 -33
- package/src/login/pages/WebauthnAuthenticate.tsx +26 -32
- package/src/login/pages/WebauthnError.tsx +11 -22
- package/src/login/pages/WebauthnRegister.tsx +20 -28
- package/src/tools/clsx.ts +6 -48
- package/src/tools/clsx_withTransform.ts +55 -0
- package/src/vite-plugin/vite-plugin.ts +29 -21
- package/tools/clsx.d.ts +3 -2
- package/tools/clsx.js +5 -41
- package/tools/clsx.js.map +1 -1
- package/tools/clsx_withTransform.d.ts +5 -0
- package/tools/clsx_withTransform.js +43 -0
- package/tools/clsx_withTransform.js.map +1 -0
- package/vite-plugin/index.js +243 -102
- package/vite-plugin/vite-plugin.d.ts +3 -3
- package/account/lib/useGetClassName.d.ts +0 -7
- package/account/lib/useGetClassName.js.map +0 -1
- package/bin/795.index.js +0 -1197
- package/lib/isStorybook.d.ts +0 -1
- package/lib/isStorybook.js +0 -3
- package/lib/isStorybook.js.map +0 -1
- package/lib/useGetClassName.d.ts +0 -10
- package/lib/useGetClassName.js +0 -14
- package/lib/useGetClassName.js.map +0 -1
- package/login/lib/useGetClassName.d.ts +0 -7
- package/login/lib/useGetClassName.js.map +0 -1
- package/src/lib/isStorybook.ts +0 -3
- package/src/lib/useGetClassName.ts +0 -27
@@ -7,10 +7,10 @@ import { themeTypes } from "./constants";
|
|
7
7
|
const themeSrcDirBasenames = ["keycloak-theme", "keycloak_theme"];
|
8
8
|
|
9
9
|
/** Can't catch error, if the directory isn't found, this function will just exit the process with an error message. */
|
10
|
-
export function getThemeSrcDirPath(params: {
|
11
|
-
const {
|
10
|
+
export function getThemeSrcDirPath(params: { projectDirPath: string }) {
|
11
|
+
const { projectDirPath } = params;
|
12
12
|
|
13
|
-
const srcDirPath = pathJoin(
|
13
|
+
const srcDirPath = pathJoin(projectDirPath, "src");
|
14
14
|
|
15
15
|
const themeSrcDirPath: string | undefined = crawl({
|
16
16
|
dirPath: srcDirPath,
|
@@ -2,26 +2,26 @@ import * as child_process from "child_process";
|
|
2
2
|
import { Deferred } from "evt/tools/Deferred";
|
3
3
|
import { assert } from "tsafe/assert";
|
4
4
|
import { is } from "tsafe/is";
|
5
|
-
import type {
|
5
|
+
import type { BuildContext } from "../shared/buildContext";
|
6
6
|
import * as fs from "fs";
|
7
7
|
import { join as pathJoin } from "path";
|
8
8
|
|
9
|
-
export type
|
10
|
-
|
9
|
+
export type BuildContextLike = {
|
10
|
+
projectDirPath: string;
|
11
11
|
keycloakifyBuildDirPath: string;
|
12
12
|
bundler: "vite" | "webpack";
|
13
13
|
npmWorkspaceRootDirPath: string;
|
14
|
-
|
14
|
+
projectBuildDirPath: string;
|
15
15
|
};
|
16
16
|
|
17
|
-
assert<
|
17
|
+
assert<BuildContext extends BuildContextLike ? true : false>();
|
18
18
|
|
19
19
|
export async function appBuild(params: {
|
20
|
-
|
20
|
+
buildContext: BuildContextLike;
|
21
21
|
}): Promise<{ isAppBuildSuccess: boolean }> {
|
22
|
-
const {
|
22
|
+
const { buildContext } = params;
|
23
23
|
|
24
|
-
const { bundler } =
|
24
|
+
const { bundler } = buildContext;
|
25
25
|
|
26
26
|
const { command, args, cwd } = (() => {
|
27
27
|
switch (bundler) {
|
@@ -29,12 +29,12 @@ export async function appBuild(params: {
|
|
29
29
|
return {
|
30
30
|
command: "npx",
|
31
31
|
args: ["vite", "build"],
|
32
|
-
cwd:
|
32
|
+
cwd: buildContext.projectDirPath
|
33
33
|
};
|
34
34
|
case "webpack": {
|
35
35
|
for (const dirPath of [
|
36
|
-
|
37
|
-
|
36
|
+
buildContext.projectDirPath,
|
37
|
+
buildContext.npmWorkspaceRootDirPath
|
38
38
|
]) {
|
39
39
|
try {
|
40
40
|
const parsedPackageJson = JSON.parse(
|
@@ -2,27 +2,27 @@ import { skipBuildJarsEnvName } from "../shared/constants";
|
|
2
2
|
import * as child_process from "child_process";
|
3
3
|
import { Deferred } from "evt/tools/Deferred";
|
4
4
|
import { assert } from "tsafe/assert";
|
5
|
-
import type {
|
5
|
+
import type { BuildContext } from "../shared/buildContext";
|
6
6
|
|
7
|
-
export type
|
8
|
-
|
7
|
+
export type BuildContextLike = {
|
8
|
+
projectDirPath: string;
|
9
9
|
keycloakifyBuildDirPath: string;
|
10
10
|
bundler: "vite" | "webpack";
|
11
11
|
npmWorkspaceRootDirPath: string;
|
12
12
|
};
|
13
13
|
|
14
|
-
assert<
|
14
|
+
assert<BuildContext extends BuildContextLike ? true : false>();
|
15
15
|
|
16
16
|
export async function keycloakifyBuild(params: {
|
17
17
|
doSkipBuildJars: boolean;
|
18
|
-
|
18
|
+
buildContext: BuildContextLike;
|
19
19
|
}): Promise<{ isKeycloakifyBuildSuccess: boolean }> {
|
20
|
-
const {
|
20
|
+
const { buildContext, doSkipBuildJars } = params;
|
21
21
|
|
22
22
|
const dResult = new Deferred<{ isSuccess: boolean }>();
|
23
23
|
|
24
24
|
const child = child_process.spawn("npx", ["keycloakify", "build"], {
|
25
|
-
cwd:
|
25
|
+
cwd: buildContext.projectDirPath,
|
26
26
|
env: {
|
27
27
|
...process.env,
|
28
28
|
...(doSkipBuildJars ? { [skipBuildJarsEnvName]: "true" } : {})
|
@@ -1,4 +1,5 @@
|
|
1
|
-
import {
|
1
|
+
import { getBuildContext } from "../shared/buildContext";
|
2
|
+
import { exclude } from "tsafe/exclude";
|
2
3
|
import type { CliCommandOptions as CliCommandOptions_common } from "../main";
|
3
4
|
import { promptKeycloakVersion } from "../shared/promptKeycloakVersion";
|
4
5
|
import { readMetaInfKeycloakThemes } from "../shared/metaInfKeycloakThemes";
|
@@ -80,11 +81,11 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
80
81
|
|
81
82
|
const { cliCommandOptions } = params;
|
82
83
|
|
83
|
-
const
|
84
|
+
const buildContext = getBuildContext({ cliCommandOptions });
|
84
85
|
|
85
86
|
{
|
86
87
|
const { isAppBuildSuccess } = await appBuild({
|
87
|
-
|
88
|
+
buildContext
|
88
89
|
});
|
89
90
|
|
90
91
|
if (!isAppBuildSuccess) {
|
@@ -98,7 +99,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
98
99
|
|
99
100
|
const { isKeycloakifyBuildSuccess } = await keycloakifyBuild({
|
100
101
|
doSkipBuildJars: false,
|
101
|
-
|
102
|
+
buildContext
|
102
103
|
});
|
103
104
|
|
104
105
|
if (!isKeycloakifyBuildSuccess) {
|
@@ -112,7 +113,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
112
113
|
}
|
113
114
|
|
114
115
|
const metaInfKeycloakThemes = readMetaInfKeycloakThemes({
|
115
|
-
keycloakifyBuildDirPath:
|
116
|
+
keycloakifyBuildDirPath: buildContext.keycloakifyBuildDirPath
|
116
117
|
});
|
117
118
|
|
118
119
|
const doesImplementAccountTheme = metaInfKeycloakThemes.themes.some(
|
@@ -138,7 +139,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
138
139
|
|
139
140
|
const { keycloakVersion } = await promptKeycloakVersion({
|
140
141
|
startingFromMajor: 17,
|
141
|
-
cacheDirPath:
|
142
|
+
cacheDirPath: buildContext.cacheDirPath
|
142
143
|
});
|
143
144
|
|
144
145
|
console.log(`→ ${keycloakVersion}`);
|
@@ -259,7 +260,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
259
260
|
return pathJoin(dirPath, value);
|
260
261
|
})();
|
261
262
|
|
262
|
-
const jarFilePath = pathJoin(
|
263
|
+
const jarFilePath = pathJoin(buildContext.keycloakifyBuildDirPath, jarFileBasename);
|
263
264
|
|
264
265
|
const { doUseBuiltInAccountV1Theme } = await (async () => {
|
265
266
|
let doUseBuiltInAccountV1Theme = false;
|
@@ -267,7 +268,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
267
268
|
await extractArchive({
|
268
269
|
archiveFilePath: jarFilePath,
|
269
270
|
onArchiveFile: async ({ relativeFilePathInArchive, readFile, earlyExit }) => {
|
270
|
-
for (const themeName of
|
271
|
+
for (const themeName of buildContext.themeNames) {
|
271
272
|
if (
|
272
273
|
relativeFilePathInArchive ===
|
273
274
|
pathJoin("theme", themeName, "account", "theme.properties")
|
@@ -292,9 +293,9 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
292
293
|
const accountThemePropertyPatch = !doUseBuiltInAccountV1Theme
|
293
294
|
? undefined
|
294
295
|
: () => {
|
295
|
-
for (const themeName of
|
296
|
+
for (const themeName of buildContext.themeNames) {
|
296
297
|
const filePath = pathJoin(
|
297
|
-
|
298
|
+
buildContext.keycloakifyBuildDirPath,
|
298
299
|
"src",
|
299
300
|
"main",
|
300
301
|
"resources",
|
@@ -346,12 +347,12 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
346
347
|
? ["-e", "JAVA_OPTS=-Dkeycloak.profile=preview"]
|
347
348
|
: []),
|
348
349
|
...[
|
349
|
-
...
|
350
|
+
...buildContext.themeNames,
|
350
351
|
...(doUseBuiltInAccountV1Theme ? [] : [accountV1ThemeName])
|
351
352
|
]
|
352
353
|
.map(themeName => ({
|
353
354
|
localDirPath: pathJoin(
|
354
|
-
|
355
|
+
buildContext.keycloakifyBuildDirPath,
|
355
356
|
"src",
|
356
357
|
"main",
|
357
358
|
"resources",
|
@@ -365,6 +366,17 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
365
366
|
`${localDirPath}:${containerDirPath}:rw`
|
366
367
|
])
|
367
368
|
.flat(),
|
369
|
+
...buildContext.environmentVariables
|
370
|
+
.map(({ name }) => ({ name, envValue: process.env[name] }))
|
371
|
+
.map(({ name, envValue }) =>
|
372
|
+
envValue === undefined ? undefined : { name, envValue }
|
373
|
+
)
|
374
|
+
.filter(exclude(undefined))
|
375
|
+
.map(({ name, envValue }) => [
|
376
|
+
"--env",
|
377
|
+
`${name}='${envValue.replace(/'/g, "'\\''")}'`
|
378
|
+
])
|
379
|
+
.flat(),
|
368
380
|
`quay.io/keycloak/keycloak:${keycloakVersion}`,
|
369
381
|
"start-dev",
|
370
382
|
...(21 <= keycloakMajorVersionNumber && keycloakMajorVersionNumber < 24
|
@@ -373,7 +385,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
373
385
|
...(realmJsonFilePath === undefined ? [] : ["--import-realm"])
|
374
386
|
],
|
375
387
|
{
|
376
|
-
cwd:
|
388
|
+
cwd: buildContext.keycloakifyBuildDirPath
|
377
389
|
}
|
378
390
|
] as const;
|
379
391
|
|
@@ -385,7 +397,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
385
397
|
|
386
398
|
child.on("exit", process.exit);
|
387
399
|
|
388
|
-
const srcDirPath = pathJoin(
|
400
|
+
const srcDirPath = pathJoin(buildContext.projectDirPath, "src");
|
389
401
|
|
390
402
|
{
|
391
403
|
const handler = async (data: Buffer) => {
|
@@ -417,7 +429,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
417
429
|
`- password: ${chalk.cyan.bold("password123")}`,
|
418
430
|
"",
|
419
431
|
`Watching for changes in ${chalk.bold(
|
420
|
-
`.${pathSep}${pathRelative(process.cwd(),
|
432
|
+
`.${pathSep}${pathRelative(process.cwd(), buildContext.projectDirPath)}`
|
421
433
|
)}`
|
422
434
|
].join("\n")
|
423
435
|
);
|
@@ -431,7 +443,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
431
443
|
console.log(chalk.cyan("Detected changes in the theme. Rebuilding ..."));
|
432
444
|
|
433
445
|
const { isAppBuildSuccess } = await appBuild({
|
434
|
-
|
446
|
+
buildContext
|
435
447
|
});
|
436
448
|
|
437
449
|
if (!isAppBuildSuccess) {
|
@@ -440,7 +452,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
440
452
|
|
441
453
|
const { isKeycloakifyBuildSuccess } = await keycloakifyBuild({
|
442
454
|
doSkipBuildJars: true,
|
443
|
-
|
455
|
+
buildContext
|
444
456
|
});
|
445
457
|
|
446
458
|
if (!isKeycloakifyBuildSuccess) {
|
@@ -458,11 +470,11 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
|
|
458
470
|
.watch(
|
459
471
|
[
|
460
472
|
srcDirPath,
|
461
|
-
|
462
|
-
pathJoin(
|
463
|
-
pathJoin(
|
464
|
-
pathJoin(
|
465
|
-
pathJoin(
|
473
|
+
buildContext.publicDirPath,
|
474
|
+
pathJoin(buildContext.projectDirPath, "package.json"),
|
475
|
+
pathJoin(buildContext.projectDirPath, "vite.config.ts"),
|
476
|
+
pathJoin(buildContext.projectDirPath, "vite.config.js"),
|
477
|
+
pathJoin(buildContext.projectDirPath, "index.html"),
|
466
478
|
pathJoin(getThisCodebaseRootDirPath(), "src")
|
467
479
|
],
|
468
480
|
{
|
@@ -0,0 +1,64 @@
|
|
1
|
+
// Convert a JavaScript string to UTF-16 encoding
|
2
|
+
function toUTF16(codePoint: number): string {
|
3
|
+
if (codePoint <= 0xffff) {
|
4
|
+
// BMP character
|
5
|
+
return "\\u" + codePoint.toString(16).padStart(4, "0");
|
6
|
+
} else {
|
7
|
+
// Non-BMP character
|
8
|
+
codePoint -= 0x10000;
|
9
|
+
let highSurrogate = (codePoint >> 10) + 0xd800;
|
10
|
+
let lowSurrogate = (codePoint % 0x400) + 0xdc00;
|
11
|
+
return (
|
12
|
+
"\\u" +
|
13
|
+
highSurrogate.toString(16).padStart(4, "0") +
|
14
|
+
"\\u" +
|
15
|
+
lowSurrogate.toString(16).padStart(4, "0")
|
16
|
+
);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
|
20
|
+
// Escapes special characters for use in a .properties file
|
21
|
+
export function escapeStringForPropertiesFile(str: string): string {
|
22
|
+
let escapedStr = "";
|
23
|
+
for (const char of [...str]) {
|
24
|
+
const codePoint = char.codePointAt(0);
|
25
|
+
if (!codePoint) continue;
|
26
|
+
|
27
|
+
switch (char) {
|
28
|
+
case "\n":
|
29
|
+
escapedStr += "\\n";
|
30
|
+
break;
|
31
|
+
case "\r":
|
32
|
+
escapedStr += "\\r";
|
33
|
+
break;
|
34
|
+
case "\t":
|
35
|
+
escapedStr += "\\t";
|
36
|
+
break;
|
37
|
+
case "\\":
|
38
|
+
escapedStr += "\\\\";
|
39
|
+
break;
|
40
|
+
case ":":
|
41
|
+
escapedStr += "\\:";
|
42
|
+
break;
|
43
|
+
case "=":
|
44
|
+
escapedStr += "\\=";
|
45
|
+
break;
|
46
|
+
case "#":
|
47
|
+
escapedStr += "\\#";
|
48
|
+
break;
|
49
|
+
case "!":
|
50
|
+
escapedStr += "\\!";
|
51
|
+
break;
|
52
|
+
case "'":
|
53
|
+
escapedStr += "''";
|
54
|
+
break;
|
55
|
+
default:
|
56
|
+
if (codePoint > 0x7f) {
|
57
|
+
escapedStr += toUTF16(codePoint); // Non-ASCII characters
|
58
|
+
} else {
|
59
|
+
escapedStr += char; // ASCII character needs no escape
|
60
|
+
}
|
61
|
+
}
|
62
|
+
}
|
63
|
+
return escapedStr;
|
64
|
+
}
|
@@ -4,14 +4,14 @@ import { assert } from "tsafe/assert";
|
|
4
4
|
import * as fs from "fs";
|
5
5
|
|
6
6
|
export function getNpmWorkspaceRootDirPath(params: {
|
7
|
-
|
7
|
+
projectDirPath: string;
|
8
8
|
dependencyExpected: string;
|
9
9
|
}) {
|
10
|
-
const {
|
10
|
+
const { projectDirPath, dependencyExpected } = params;
|
11
11
|
|
12
12
|
const npmWorkspaceRootDirPath = (function callee(depth: number): string {
|
13
13
|
const cwd = pathResolve(
|
14
|
-
pathJoin(...[
|
14
|
+
pathJoin(...[projectDirPath, ...Array(depth).fill("..")])
|
15
15
|
);
|
16
16
|
|
17
17
|
assert(cwd !== pathSep, "NPM workspace not found");
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import type { CliCommandOptions } from "./main";
|
2
|
+
import { getBuildContext } from "./shared/buildContext";
|
3
|
+
import { generateKcGenTs } from "./shared/generateKcGenTs";
|
4
|
+
|
5
|
+
export async function command(params: { cliCommandOptions: CliCommandOptions }) {
|
6
|
+
const { cliCommandOptions } = params;
|
7
|
+
|
8
|
+
const buildContext = getBuildContext({
|
9
|
+
cliCommandOptions
|
10
|
+
});
|
11
|
+
|
12
|
+
await generateKcGenTs({ buildContext });
|
13
|
+
}
|
@@ -0,0 +1,89 @@
|
|
1
|
+
import type { Param0 } from "tsafe";
|
2
|
+
import { type CxArg, clsx_withTransform } from "../tools/clsx_withTransform";
|
3
|
+
import { clsx } from "../tools/clsx";
|
4
|
+
import { assert } from "tsafe/assert";
|
5
|
+
import { is } from "tsafe/is";
|
6
|
+
|
7
|
+
export function createGetKcClsx<ClassKey extends string>(params: {
|
8
|
+
defaultClasses: Record<ClassKey, string | undefined>;
|
9
|
+
}) {
|
10
|
+
const { defaultClasses } = params;
|
11
|
+
|
12
|
+
function areSameParams(
|
13
|
+
params1: Param0<typeof getKcClsx>,
|
14
|
+
params2: Param0<typeof getKcClsx>
|
15
|
+
): boolean {
|
16
|
+
if (params1.doUseDefaultCss !== params2.doUseDefaultCss) {
|
17
|
+
return false;
|
18
|
+
}
|
19
|
+
|
20
|
+
if (params1.classes === params2.classes) {
|
21
|
+
return true;
|
22
|
+
}
|
23
|
+
|
24
|
+
if (params1.classes === undefined || params2.classes === undefined) {
|
25
|
+
return false;
|
26
|
+
}
|
27
|
+
|
28
|
+
if (Object.keys(params1.classes).length !== Object.keys(params2.classes).length) {
|
29
|
+
return false;
|
30
|
+
}
|
31
|
+
|
32
|
+
for (const key in params1.classes) {
|
33
|
+
if (params1.classes[key] !== params2.classes[key]) {
|
34
|
+
return false;
|
35
|
+
}
|
36
|
+
}
|
37
|
+
|
38
|
+
return true;
|
39
|
+
}
|
40
|
+
|
41
|
+
let cache:
|
42
|
+
| {
|
43
|
+
params: Param0<typeof getKcClsx>;
|
44
|
+
result: ReturnType<typeof getKcClsx>;
|
45
|
+
}
|
46
|
+
| undefined = undefined;
|
47
|
+
|
48
|
+
function getKcClsx(params: {
|
49
|
+
doUseDefaultCss: boolean;
|
50
|
+
classes: Partial<Record<ClassKey, string>> | undefined;
|
51
|
+
}): { kcClsx: (...args: CxArg<ClassKey>[]) => string } {
|
52
|
+
// NOTE: We implement a cache here only so that getClassName can be stable across renders.
|
53
|
+
// We don't want to use useConstCallback because we want this to be useable outside of React.
|
54
|
+
use_cache: {
|
55
|
+
if (cache === undefined) {
|
56
|
+
break use_cache;
|
57
|
+
}
|
58
|
+
|
59
|
+
if (!areSameParams(cache.params, params)) {
|
60
|
+
break use_cache;
|
61
|
+
}
|
62
|
+
|
63
|
+
return cache.result;
|
64
|
+
}
|
65
|
+
|
66
|
+
const { classes, doUseDefaultCss } = params;
|
67
|
+
|
68
|
+
function kcClsx(...args: CxArg<ClassKey>[]): string {
|
69
|
+
return clsx_withTransform({
|
70
|
+
args,
|
71
|
+
transform: classKey => {
|
72
|
+
assert(is<ClassKey>(classKey));
|
73
|
+
|
74
|
+
return clsx(
|
75
|
+
classKey,
|
76
|
+
doUseDefaultCss ? defaultClasses[classKey] : undefined,
|
77
|
+
classes?.[classKey]
|
78
|
+
);
|
79
|
+
}
|
80
|
+
});
|
81
|
+
}
|
82
|
+
|
83
|
+
cache = { params, result: { kcClsx } };
|
84
|
+
|
85
|
+
return { kcClsx };
|
86
|
+
}
|
87
|
+
|
88
|
+
return { getKcClsx };
|
89
|
+
}
|
package/src/login/Fallback.tsx
CHANGED
@@ -3,7 +3,6 @@ import { assert, type Equals } from "tsafe/assert";
|
|
3
3
|
import type { LazyOrNot } from "keycloakify/tools/LazyOrNot";
|
4
4
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
5
5
|
import type { KcContext } from "./KcContext";
|
6
|
-
import type { I18n } from "./i18n";
|
7
6
|
import type { UserProfileFormFieldsProps } from "keycloakify/login/UserProfileFormFields";
|
8
7
|
|
9
8
|
const Login = lazy(() => import("keycloakify/login/pages/Login"));
|
@@ -41,8 +40,9 @@ const LoginResetOtp = lazy(() => import("keycloakify/login/pages/LoginResetOtp")
|
|
41
40
|
const LoginX509Info = lazy(() => import("keycloakify/login/pages/LoginX509Info"));
|
42
41
|
const WebauthnError = lazy(() => import("keycloakify/login/pages/WebauthnError"));
|
43
42
|
|
44
|
-
type FallbackProps = PageProps<KcContext
|
43
|
+
type FallbackProps = PageProps<KcContext> & {
|
45
44
|
UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>;
|
45
|
+
doMakeUserConfirmPassword: boolean;
|
46
46
|
};
|
47
47
|
|
48
48
|
export default function Fallback(props: FallbackProps) {
|
@@ -10,20 +10,20 @@ import type { Equals } from "tsafe";
|
|
10
10
|
import type { MessageKey } from "../i18n/i18n";
|
11
11
|
|
12
12
|
export type ExtendKcContext<
|
13
|
-
|
14
|
-
|
13
|
+
KcContextExtension extends { properties?: Record<string, string | undefined> },
|
14
|
+
KcContextExtensionPerPage extends Record<string, Record<string, unknown>>
|
15
15
|
> = ValueOf<{
|
16
|
-
[PageId in keyof
|
16
|
+
[PageId in keyof KcContextExtensionPerPage | KcContext["pageId"]]: Extract<
|
17
17
|
KcContext,
|
18
18
|
{ pageId: PageId }
|
19
19
|
> extends never
|
20
20
|
? KcContext.Common &
|
21
|
-
|
21
|
+
KcContextExtension & {
|
22
22
|
pageId: PageId;
|
23
|
-
} &
|
23
|
+
} & KcContextExtensionPerPage[PageId]
|
24
24
|
: Extract<KcContext, { pageId: PageId }> &
|
25
|
-
|
26
|
-
|
25
|
+
KcContextExtension &
|
26
|
+
KcContextExtensionPerPage[PageId];
|
27
27
|
}>;
|
28
28
|
|
29
29
|
/** Take theses type definition with a grain of salt.
|
@@ -7,43 +7,32 @@ import { kcContextMocks, kcContextCommonMock } from "./kcContextMocks";
|
|
7
7
|
import { exclude } from "tsafe/exclude";
|
8
8
|
|
9
9
|
export function createGetKcContextMock<
|
10
|
-
|
11
|
-
|
12
|
-
`${string}.ftl`,
|
13
|
-
Record<string, unknown>
|
14
|
-
>
|
10
|
+
KcContextExtension extends { properties?: Record<string, string | undefined> },
|
11
|
+
KcContextExtensionPerPage extends Record<`${string}.ftl`, Record<string, unknown>>
|
15
12
|
>(params: {
|
16
|
-
|
17
|
-
|
18
|
-
overrides?: DeepPartial<
|
13
|
+
kcContextExtension: KcContextExtension;
|
14
|
+
kcContextExtensionPerPage: KcContextExtensionPerPage;
|
15
|
+
overrides?: DeepPartial<KcContextExtension & KcContextBase.Common>;
|
19
16
|
overridesPerPage?: {
|
20
|
-
[PageId in
|
21
|
-
| LoginThemePageId
|
22
|
-
| keyof KcContextExtraPropertiesPerPage]?: DeepPartial<
|
17
|
+
[PageId in LoginThemePageId | keyof KcContextExtensionPerPage]?: DeepPartial<
|
23
18
|
Extract<
|
24
|
-
ExtendKcContext<
|
25
|
-
KcContextExtraProperties,
|
26
|
-
KcContextExtraPropertiesPerPage
|
27
|
-
>,
|
19
|
+
ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>,
|
28
20
|
{ pageId: PageId }
|
29
21
|
>
|
30
22
|
>;
|
31
23
|
};
|
32
24
|
}) {
|
33
25
|
const {
|
34
|
-
|
35
|
-
|
26
|
+
kcContextExtension,
|
27
|
+
kcContextExtensionPerPage,
|
36
28
|
overrides: overrides_global,
|
37
29
|
overridesPerPage: overridesPerPage_global
|
38
30
|
} = params;
|
39
31
|
|
40
|
-
type KcContext = ExtendKcContext<
|
41
|
-
KcContextExtraProperties,
|
42
|
-
KcContextExtraPropertiesPerPage
|
43
|
-
>;
|
32
|
+
type KcContext = ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>;
|
44
33
|
|
45
34
|
function getKcContextMock<
|
46
|
-
PageId extends LoginThemePageId | keyof
|
35
|
+
PageId extends LoginThemePageId | keyof KcContextExtensionPerPage
|
47
36
|
>(params: {
|
48
37
|
pageId: PageId;
|
49
38
|
overrides?: DeepPartial<Extract<KcContext, { pageId: PageId }>>;
|
@@ -58,8 +47,8 @@ export function createGetKcContextMock<
|
|
58
47
|
);
|
59
48
|
|
60
49
|
[
|
61
|
-
|
62
|
-
|
50
|
+
kcContextExtension,
|
51
|
+
kcContextExtensionPerPage[pageId],
|
63
52
|
overrides_global,
|
64
53
|
overridesPerPage_global?.[pageId],
|
65
54
|
overrides
|