keycloakify 10.0.0-rc.37 → 10.0.0-rc.38
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/{314.index.js → 21.index.js} +162 -4
- package/bin/{430.index.js → 214.index.js} +161 -2
- package/bin/3.index.js +81 -65
- package/bin/526.index.js +3 -2
- package/bin/538.index.js +552 -0
- package/bin/795.index.js +3 -2
- package/bin/{890.index.js → 941.index.js} +2 -159
- package/bin/main.js +19 -7
- package/lib/getKcClsx.d.ts +11 -0
- package/lib/getKcClsx.js +44 -0
- package/lib/getKcClsx.js.map +1 -0
- package/login/Fallback.d.ts +1 -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 +5 -5
- package/login/UserProfileFormFields.js +35 -34
- 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 +1 -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 +1 -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 +1 -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 +1 -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 +24 -16
- 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/keycloakify/generateSrcMainResources/generateMessageProperties.ts +2 -66
- package/src/bin/keycloakify/generateSrcMainResources/generateSrcMainResourcesForMainTheme.ts +7 -1
- package/src/bin/main.ts +15 -0
- package/src/bin/shared/buildOptions.ts +5 -2
- package/src/bin/shared/generateKcGenTs.ts +61 -0
- package/src/bin/tools/escapeStringForPropertiesFile.ts +64 -0
- package/src/bin/update-kc-gen.ts +13 -0
- package/src/lib/getKcClsx.ts +75 -0
- package/src/login/Fallback.tsx +1 -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 +66 -81
- 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 +16 -25
- 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 +26 -33
- 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 +24 -49
- 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 +26 -36
- 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 +14 -6
- 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 +167 -37
- package/account/lib/useGetClassName.d.ts +0 -7
- package/account/lib/useGetClassName.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/useGetClassName.ts +0 -27
@@ -1,20 +1,19 @@
|
|
1
|
-
import { clsx } from "keycloakify/tools/clsx";
|
2
1
|
import { Markdown } from "keycloakify/tools/Markdown";
|
3
|
-
import {
|
2
|
+
import { getKcClsx } from "keycloakify/login/lib/kcClsx";
|
4
3
|
import { useTermsMarkdown } from "keycloakify/login/lib/useDownloadTerms";
|
5
4
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
6
5
|
import type { KcContext } from "../KcContext";
|
7
|
-
import
|
6
|
+
import { useI18n } from "../i18n";
|
8
7
|
|
9
|
-
export default function Terms(props: PageProps<Extract<KcContext, { pageId: "terms.ftl" }
|
10
|
-
const { kcContext,
|
8
|
+
export default function Terms(props: PageProps<Extract<KcContext, { pageId: "terms.ftl" }>>) {
|
9
|
+
const { kcContext, doUseDefaultCss, Template, classes } = props;
|
11
10
|
|
12
|
-
const {
|
11
|
+
const { kcClsx } = getKcClsx({
|
13
12
|
doUseDefaultCss,
|
14
13
|
classes
|
15
14
|
});
|
16
15
|
|
17
|
-
const { msg, msgStr } =
|
16
|
+
const { msg, msgStr } = useI18n({ kcContext });
|
18
17
|
|
19
18
|
const { locale, url } = kcContext;
|
20
19
|
|
@@ -25,26 +24,20 @@ export default function Terms(props: PageProps<Extract<KcContext, { pageId: "ter
|
|
25
24
|
}
|
26
25
|
|
27
26
|
return (
|
28
|
-
<Template {
|
27
|
+
<Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} displayMessage={false} headerNode={msg("termsTitle")}>
|
29
28
|
<div id="kc-terms-text" lang={termsLanguageTag !== locale?.currentLanguageTag ? termsLanguageTag : undefined}>
|
30
29
|
<Markdown>{termsMarkdown}</Markdown>
|
31
30
|
</div>
|
32
31
|
<form className="form-actions" action={url.loginAction} method="POST">
|
33
32
|
<input
|
34
|
-
className={
|
35
|
-
getClassName("kcButtonClass"),
|
36
|
-
getClassName("kcButtonClass"),
|
37
|
-
getClassName("kcButtonClass"),
|
38
|
-
getClassName("kcButtonPrimaryClass"),
|
39
|
-
getClassName("kcButtonLargeClass")
|
40
|
-
)}
|
33
|
+
className={kcClsx("kcButtonClass", "kcButtonClass", "kcButtonClass", "kcButtonPrimaryClass", "kcButtonLargeClass")}
|
41
34
|
name="accept"
|
42
35
|
id="kc-accept"
|
43
36
|
type="submit"
|
44
37
|
value={msgStr("doAccept")}
|
45
38
|
/>
|
46
39
|
<input
|
47
|
-
className={
|
40
|
+
className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
|
48
41
|
name="cancel"
|
49
42
|
id="kc-decline"
|
50
43
|
type="submit"
|
@@ -1,24 +1,24 @@
|
|
1
1
|
import { useState } from "react";
|
2
|
-
import { clsx } from "keycloakify/tools/clsx";
|
3
2
|
import type { LazyOrNot } from "keycloakify/tools/LazyOrNot";
|
4
|
-
import {
|
3
|
+
import { getKcClsx, type KcClsx } from "keycloakify/login/lib/kcClsx";
|
5
4
|
import type { UserProfileFormFieldsProps } from "keycloakify/login/UserProfileFormFields";
|
6
5
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
7
6
|
import type { KcContext } from "../KcContext";
|
8
|
-
import type
|
7
|
+
import { useI18n, type I18n } from "../i18n";
|
9
8
|
|
10
|
-
type UpdateEmailProps = PageProps<Extract<KcContext, { pageId: "update-email.ftl" }
|
9
|
+
type UpdateEmailProps = PageProps<Extract<KcContext, { pageId: "update-email.ftl" }>> & {
|
11
10
|
UserProfileFormFields: LazyOrNot<(props: UserProfileFormFieldsProps) => JSX.Element>;
|
12
11
|
};
|
13
12
|
|
14
13
|
export default function UpdateEmail(props: UpdateEmailProps) {
|
15
|
-
const { kcContext,
|
14
|
+
const { kcContext, doUseDefaultCss, Template, classes, UserProfileFormFields } = props;
|
16
15
|
|
17
|
-
const {
|
16
|
+
const { kcClsx } = getKcClsx({
|
18
17
|
doUseDefaultCss,
|
19
18
|
classes
|
20
19
|
});
|
21
20
|
|
21
|
+
const i18n = useI18n({ kcContext });
|
22
22
|
const { msg, msgStr } = i18n;
|
23
23
|
|
24
24
|
const [isFormSubmittable, setIsFormSubmittable] = useState(false);
|
@@ -27,48 +27,38 @@ export default function UpdateEmail(props: UpdateEmailProps) {
|
|
27
27
|
|
28
28
|
return (
|
29
29
|
<Template
|
30
|
-
{
|
30
|
+
kcContext={kcContext}
|
31
|
+
doUseDefaultCss={doUseDefaultCss}
|
32
|
+
classes={classes}
|
31
33
|
displayMessage={messagesPerField.exists("global")}
|
32
34
|
displayRequiredFields
|
33
35
|
headerNode={msg("updateEmailTitle")}
|
34
36
|
>
|
35
|
-
<form id="kc-update-email-form" className={
|
36
|
-
<UserProfileFormFields
|
37
|
-
{...{
|
38
|
-
kcContext,
|
39
|
-
i18n,
|
40
|
-
getClassName,
|
41
|
-
messagesPerField
|
42
|
-
}}
|
43
|
-
onIsFormSubmittableValueChange={setIsFormSubmittable}
|
44
|
-
/>
|
37
|
+
<form id="kc-update-email-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
|
38
|
+
<UserProfileFormFields kcContext={kcContext} kcClsx={kcClsx} onIsFormSubmittableValueChange={setIsFormSubmittable} />
|
45
39
|
|
46
|
-
<div className={
|
47
|
-
<div id="kc-form-options" className={
|
48
|
-
<div className={
|
40
|
+
<div className={kcClsx("kcFormGroupClass")}>
|
41
|
+
<div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
|
42
|
+
<div className={kcClsx("kcFormOptionsWrapperClass")} />
|
49
43
|
</div>
|
50
44
|
|
51
|
-
<LogoutOtherSessions {
|
45
|
+
<LogoutOtherSessions kcClsx={kcClsx} i18n={i18n} />
|
52
46
|
|
53
|
-
<div id="kc-form-buttons" className={
|
47
|
+
<div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
|
54
48
|
<input
|
55
49
|
disabled={!isFormSubmittable}
|
56
|
-
className={
|
57
|
-
|
58
|
-
|
59
|
-
isAppInitiatedAction &&
|
60
|
-
|
50
|
+
className={kcClsx(
|
51
|
+
"kcButtonClass",
|
52
|
+
"kcButtonPrimaryClass",
|
53
|
+
isAppInitiatedAction && "kcButtonBlockClass",
|
54
|
+
"kcButtonLargeClass"
|
61
55
|
)}
|
62
56
|
type="submit"
|
63
57
|
value={msgStr("doSubmit")}
|
64
58
|
/>
|
65
59
|
{isAppInitiatedAction && (
|
66
60
|
<button
|
67
|
-
className={
|
68
|
-
getClassName("kcButtonClass"),
|
69
|
-
getClassName("kcButtonDefaultClass"),
|
70
|
-
getClassName("kcButtonLargeClass")
|
71
|
-
)}
|
61
|
+
className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonLargeClass")}
|
72
62
|
type="submit"
|
73
63
|
name="cancel-aia"
|
74
64
|
value="true"
|
@@ -83,14 +73,14 @@ export default function UpdateEmail(props: UpdateEmailProps) {
|
|
83
73
|
);
|
84
74
|
}
|
85
75
|
|
86
|
-
function LogoutOtherSessions(props: {
|
87
|
-
const {
|
76
|
+
function LogoutOtherSessions(props: { kcClsx: KcClsx; i18n: I18n }) {
|
77
|
+
const { kcClsx, i18n } = props;
|
88
78
|
|
89
79
|
const { msg } = i18n;
|
90
80
|
|
91
81
|
return (
|
92
|
-
<div id="kc-form-options" className={
|
93
|
-
<div className={
|
82
|
+
<div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
|
83
|
+
<div className={kcClsx("kcFormOptionsWrapperClass")}>
|
94
84
|
<div className="checkbox">
|
95
85
|
<label>
|
96
86
|
<input type="checkbox" id="logout-sessions" name="logout-sessions" value="on" defaultChecked={true} />
|
@@ -2,15 +2,15 @@ import { useEffect, Fragment } from "react";
|
|
2
2
|
import { assert } from "tsafe/assert";
|
3
3
|
import { clsx } from "keycloakify/tools/clsx";
|
4
4
|
import { useInsertScriptTags } from "keycloakify/tools/useInsertScriptTags";
|
5
|
-
import {
|
5
|
+
import { getKcClsx } from "keycloakify/login/lib/kcClsx";
|
6
6
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
7
7
|
import type { KcContext } from "../KcContext";
|
8
|
-
import
|
8
|
+
import { useI18n } from "../i18n";
|
9
9
|
|
10
|
-
export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext, { pageId: "webauthn-authenticate.ftl" }
|
11
|
-
const { kcContext,
|
10
|
+
export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext, { pageId: "webauthn-authenticate.ftl" }>>) {
|
11
|
+
const { kcContext, doUseDefaultCss, Template, classes } = props;
|
12
12
|
|
13
|
-
const {
|
13
|
+
const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
|
14
14
|
|
15
15
|
const {
|
16
16
|
url,
|
@@ -26,7 +26,7 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
26
26
|
shouldDisplayAuthenticators
|
27
27
|
} = kcContext;
|
28
28
|
|
29
|
-
const { msg, msgStr, advancedMsg } =
|
29
|
+
const { msg, msgStr, advancedMsg } = useI18n({ kcContext });
|
30
30
|
|
31
31
|
const { insertScriptTags } = useInsertScriptTags({
|
32
32
|
componentOrHookName: "WebauthnAuthenticate",
|
@@ -136,7 +136,9 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
136
136
|
|
137
137
|
return (
|
138
138
|
<Template
|
139
|
-
{
|
139
|
+
kcContext={kcContext}
|
140
|
+
doUseDefaultCss={doUseDefaultCss}
|
141
|
+
classes={classes}
|
140
142
|
displayMessage={!messagesPerField.existsError("username")}
|
141
143
|
displayInfo={realm.password && realm.registrationAllowed && !registrationDisabled}
|
142
144
|
infoNode={
|
@@ -151,7 +153,7 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
151
153
|
}
|
152
154
|
headerNode={msg("webauthn-login-title")}
|
153
155
|
>
|
154
|
-
<div id="kc-form-webauthn" className={
|
156
|
+
<div id="kc-form-webauthn" className={kcClsx("kcFormClass")}>
|
155
157
|
<form id="webauth" action={url.loginAction} method="post">
|
156
158
|
<input type="hidden" id="clientDataJSON" name="clientDataJSON" />
|
157
159
|
<input type="hidden" id="authenticatorData" name="authenticatorData" />
|
@@ -160,10 +162,10 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
160
162
|
<input type="hidden" id="userHandle" name="userHandle" />
|
161
163
|
<input type="hidden" id="error" name="error" />
|
162
164
|
</form>
|
163
|
-
<div className={clsx(
|
165
|
+
<div className={clsx(kcClsx("kcFormGroupClass"), "no-bottom-margin")}>
|
164
166
|
{authenticators && (
|
165
167
|
<>
|
166
|
-
<form id="authn_select" className={
|
168
|
+
<form id="authn_select" className={kcClsx("kcFormClass")}>
|
167
169
|
{authenticators.authenticators.map(authenticator => (
|
168
170
|
<input type="hidden" name="authn_use_chk" value={authenticator.credentialId} />
|
169
171
|
))}
|
@@ -172,36 +174,33 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
172
174
|
{shouldDisplayAuthenticators && (
|
173
175
|
<>
|
174
176
|
{authenticators.authenticators.length > 1 && (
|
175
|
-
<p className={
|
177
|
+
<p className={kcClsx("kcSelectAuthListItemTitle")}>{msg("webauthn-available-authenticators")}</p>
|
176
178
|
)}
|
177
|
-
<div className={
|
179
|
+
<div className={kcClsx("kcFormOptionsClass")}>
|
178
180
|
{authenticators.authenticators.map((authenticator, i) => (
|
179
|
-
<div key={i} id="kc-webauthn-authenticator" className={
|
180
|
-
<div className={
|
181
|
+
<div key={i} id="kc-webauthn-authenticator" className={kcClsx("kcSelectAuthListItemClass")}>
|
182
|
+
<div className={kcClsx("kcSelectAuthListItemIconClass")}>
|
181
183
|
<i
|
182
184
|
className={clsx(
|
183
185
|
(() => {
|
184
|
-
const className =
|
186
|
+
const className = kcClsx(authenticator.transports.iconClass as any);
|
185
187
|
if (className === authenticator.transports.iconClass) {
|
186
|
-
return
|
188
|
+
return kcClsx("kcWebAuthnDefaultIcon");
|
187
189
|
}
|
188
190
|
return className;
|
189
191
|
})(),
|
190
|
-
|
192
|
+
kcClsx("kcSelectAuthListItemIconPropertyClass")
|
191
193
|
)}
|
192
194
|
/>
|
193
195
|
</div>
|
194
|
-
<div className={
|
195
|
-
<div
|
196
|
-
id="kc-webauthn-authenticator-label"
|
197
|
-
className={getClassName("kcSelectAuthListItemHeadingClass")}
|
198
|
-
>
|
196
|
+
<div className={kcClsx("kcSelectAuthListItemArrowIconClass")}>
|
197
|
+
<div id="kc-webauthn-authenticator-label" className={kcClsx("kcSelectAuthListItemHeadingClass")}>
|
199
198
|
{advancedMsg(authenticator.label)}
|
200
199
|
</div>
|
201
200
|
{authenticator.transports.displayNameProperties?.length && (
|
202
201
|
<div
|
203
202
|
id="kc-webauthn-authenticator-transport"
|
204
|
-
className={
|
203
|
+
className={kcClsx("kcSelectAuthListItemDescriptionClass")}
|
205
204
|
>
|
206
205
|
{authenticator.transports.displayNameProperties
|
207
206
|
.map((nameProperty, i, arr) => ({
|
@@ -216,11 +215,11 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
216
215
|
))}
|
217
216
|
</div>
|
218
217
|
)}
|
219
|
-
<div className={
|
218
|
+
<div className={kcClsx("kcSelectAuthListItemDescriptionClass")}>
|
220
219
|
<span id="kc-webauthn-authenticator-created-label">{msg("webauthn-createdAt-label")}</span>
|
221
220
|
<span id="kc-webauthn-authenticator-created">{authenticator.createdAt}</span>
|
222
221
|
</div>
|
223
|
-
<div className={
|
222
|
+
<div className={kcClsx("kcSelectAuthListItemFillClass")} />
|
224
223
|
</div>
|
225
224
|
</div>
|
226
225
|
))}
|
@@ -230,7 +229,7 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
230
229
|
</>
|
231
230
|
)}
|
232
231
|
|
233
|
-
<div id="kc-form-buttons" className={
|
232
|
+
<div id="kc-form-buttons" className={kcClsx("kcFormButtonsClass")}>
|
234
233
|
<input
|
235
234
|
id="authenticateWebAuthnButton"
|
236
235
|
type="button"
|
@@ -241,12 +240,7 @@ export default function WebauthnAuthenticate(props: PageProps<Extract<KcContext,
|
|
241
240
|
}}
|
242
241
|
autoFocus
|
243
242
|
value={msgStr("webauthn-doAuthenticate")}
|
244
|
-
className={
|
245
|
-
getClassName("kcButtonClass"),
|
246
|
-
getClassName("kcButtonPrimaryClass"),
|
247
|
-
getClassName("kcButtonBlockClass"),
|
248
|
-
getClassName("kcButtonLargeClass")
|
249
|
-
)}
|
243
|
+
className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
|
250
244
|
/>
|
251
245
|
</div>
|
252
246
|
</div>
|
@@ -1,24 +1,23 @@
|
|
1
|
-
import {
|
2
|
-
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
1
|
+
import { getKcClsx } from "keycloakify/login/lib/kcClsx";
|
3
2
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
4
3
|
import type { KcContext } from "../KcContext";
|
5
|
-
import
|
4
|
+
import { useI18n } from "../i18n";
|
6
5
|
|
7
|
-
export default function WebauthnError(props: PageProps<Extract<KcContext, { pageId: "webauthn-error.ftl" }
|
8
|
-
const { kcContext,
|
6
|
+
export default function WebauthnError(props: PageProps<Extract<KcContext, { pageId: "webauthn-error.ftl" }>>) {
|
7
|
+
const { kcContext, doUseDefaultCss, Template, classes } = props;
|
9
8
|
|
10
9
|
const { url, isAppInitiatedAction } = kcContext;
|
11
10
|
|
12
|
-
const { msg, msgStr } =
|
11
|
+
const { msg, msgStr } = useI18n({ kcContext });
|
13
12
|
|
14
|
-
const {
|
13
|
+
const { kcClsx } = getKcClsx({
|
15
14
|
doUseDefaultCss,
|
16
15
|
classes
|
17
16
|
});
|
18
17
|
|
19
18
|
return (
|
20
|
-
<Template {
|
21
|
-
<form id="kc-error-credential-form" className={
|
19
|
+
<Template kcContext={kcContext} doUseDefaultCss={doUseDefaultCss} classes={classes} displayMessage headerNode={msg("webauthn-error-title")}>
|
20
|
+
<form id="kc-error-credential-form" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
|
22
21
|
<input type="hidden" id="executionValue" name="authenticationExecution" />
|
23
22
|
<input type="hidden" id="isSetRetry" name="isSetRetry" />
|
24
23
|
</form>
|
@@ -33,26 +32,16 @@ export default function WebauthnError(props: PageProps<Extract<KcContext, { page
|
|
33
32
|
document.getElementById("kc-error-credential-form").submit();
|
34
33
|
}}
|
35
34
|
type="button"
|
36
|
-
className={
|
37
|
-
getClassName("kcButtonClass"),
|
38
|
-
getClassName("kcButtonPrimaryClass"),
|
39
|
-
getClassName("kcButtonBlockClass"),
|
40
|
-
getClassName("kcButtonLargeClass")
|
41
|
-
)}
|
35
|
+
className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
|
42
36
|
name="try-again"
|
43
37
|
id="kc-try-again"
|
44
38
|
value={msgStr("doTryAgain")}
|
45
39
|
/>
|
46
40
|
{isAppInitiatedAction && (
|
47
|
-
<form action={url.loginAction} className={
|
41
|
+
<form action={url.loginAction} className={kcClsx("kcFormClass")} id="kc-webauthn-settings-form" method="post">
|
48
42
|
<button
|
49
43
|
type="submit"
|
50
|
-
className={
|
51
|
-
getClassName("kcButtonClass"),
|
52
|
-
getClassName("kcButtonDefaultClass"),
|
53
|
-
getClassName("kcButtonBlockClass"),
|
54
|
-
getClassName("kcButtonLargeClass")
|
55
|
-
)}
|
44
|
+
className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonBlockClass", "kcButtonLargeClass")}
|
56
45
|
id="cancelWebAuthnAIA"
|
57
46
|
name="cancel-aia"
|
58
47
|
value="true"
|
@@ -1,16 +1,15 @@
|
|
1
1
|
import { useEffect } from "react";
|
2
2
|
import { assert } from "tsafe/assert";
|
3
|
-
import {
|
4
|
-
import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
|
3
|
+
import { getKcClsx, type KcClsx } from "keycloakify/login/lib/kcClsx";
|
5
4
|
import { useInsertScriptTags } from "keycloakify/tools/useInsertScriptTags";
|
6
5
|
import type { PageProps } from "keycloakify/login/pages/PageProps";
|
7
6
|
import type { KcContext } from "../KcContext";
|
8
|
-
import type
|
7
|
+
import { useI18n, type I18n } from "../i18n";
|
9
8
|
|
10
|
-
export default function WebauthnRegister(props: PageProps<Extract<KcContext, { pageId: "webauthn-register.ftl" }
|
11
|
-
const { kcContext,
|
9
|
+
export default function WebauthnRegister(props: PageProps<Extract<KcContext, { pageId: "webauthn-register.ftl" }>>) {
|
10
|
+
const { kcContext, doUseDefaultCss, Template, classes } = props;
|
12
11
|
|
13
|
-
const {
|
12
|
+
const { kcClsx } = getKcClsx({ doUseDefaultCss, classes });
|
14
13
|
|
15
14
|
const {
|
16
15
|
url,
|
@@ -30,6 +29,7 @@ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { p
|
|
30
29
|
isAppInitiatedAction
|
31
30
|
} = kcContext;
|
32
31
|
|
32
|
+
const i18n = useI18n({ kcContext });
|
33
33
|
const { msg, msgStr } = i18n;
|
34
34
|
|
35
35
|
const { insertScriptTags } = useInsertScriptTags({
|
@@ -206,33 +206,30 @@ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { p
|
|
206
206
|
|
207
207
|
return (
|
208
208
|
<Template
|
209
|
-
{
|
209
|
+
kcContext={kcContext}
|
210
|
+
doUseDefaultCss={doUseDefaultCss}
|
211
|
+
classes={classes}
|
210
212
|
headerNode={
|
211
213
|
<>
|
212
|
-
<span className={
|
214
|
+
<span className={kcClsx("kcWebAuthnKeyIcon")} />
|
213
215
|
{msg("webauthn-registration-title")}
|
214
216
|
</>
|
215
217
|
}
|
216
218
|
>
|
217
|
-
<form id="register" className={
|
218
|
-
<div className={
|
219
|
+
<form id="register" className={kcClsx("kcFormClass")} action={url.loginAction} method="post">
|
220
|
+
<div className={kcClsx("kcFormGroupClass")}>
|
219
221
|
<input type="hidden" id="clientDataJSON" name="clientDataJSON" />
|
220
222
|
<input type="hidden" id="attestationObject" name="attestationObject" />
|
221
223
|
<input type="hidden" id="publicKeyCredentialId" name="publicKeyCredentialId" />
|
222
224
|
<input type="hidden" id="authenticatorLabel" name="authenticatorLabel" />
|
223
225
|
<input type="hidden" id="transports" name="transports" />
|
224
226
|
<input type="hidden" id="error" name="error" />
|
225
|
-
<LogoutOtherSessions {
|
227
|
+
<LogoutOtherSessions kcClsx={kcClsx} i18n={i18n} />
|
226
228
|
</div>
|
227
229
|
</form>
|
228
230
|
<input
|
229
231
|
type="submit"
|
230
|
-
className={
|
231
|
-
getClassName("kcButtonClass"),
|
232
|
-
getClassName("kcButtonPrimaryClass"),
|
233
|
-
getClassName("kcButtonBlockClass"),
|
234
|
-
getClassName("kcButtonLargeClass")
|
235
|
-
)}
|
232
|
+
className={kcClsx("kcButtonClass", "kcButtonPrimaryClass", "kcButtonBlockClass", "kcButtonLargeClass")}
|
236
233
|
id="registerWebAuthn"
|
237
234
|
value={msgStr("doRegisterSecurityKey")}
|
238
235
|
onClick={() => {
|
@@ -243,15 +240,10 @@ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { p
|
|
243
240
|
/>
|
244
241
|
|
245
242
|
{!isSetRetry && isAppInitiatedAction && (
|
246
|
-
<form action={url.loginAction} className={
|
243
|
+
<form action={url.loginAction} className={kcClsx("kcFormClass")} id="kc-webauthn-settings-form" method="post">
|
247
244
|
<button
|
248
245
|
type="submit"
|
249
|
-
className={
|
250
|
-
getClassName("kcButtonClass"),
|
251
|
-
getClassName("kcButtonDefaultClass"),
|
252
|
-
getClassName("kcButtonBlockClass"),
|
253
|
-
getClassName("kcButtonLargeClass")
|
254
|
-
)}
|
246
|
+
className={kcClsx("kcButtonClass", "kcButtonDefaultClass", "kcButtonBlockClass", "kcButtonLargeClass")}
|
255
247
|
id="cancelWebAuthnAIA"
|
256
248
|
name="cancel-aia"
|
257
249
|
value="true"
|
@@ -264,14 +256,14 @@ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { p
|
|
264
256
|
);
|
265
257
|
}
|
266
258
|
|
267
|
-
function LogoutOtherSessions(props: {
|
268
|
-
const {
|
259
|
+
function LogoutOtherSessions(props: { kcClsx: KcClsx; i18n: I18n }) {
|
260
|
+
const { kcClsx, i18n } = props;
|
269
261
|
|
270
262
|
const { msg } = i18n;
|
271
263
|
|
272
264
|
return (
|
273
|
-
<div id="kc-form-options" className={
|
274
|
-
<div className={
|
265
|
+
<div id="kc-form-options" className={kcClsx("kcFormOptionsClass")}>
|
266
|
+
<div className={kcClsx("kcFormOptionsWrapperClass")}>
|
275
267
|
<div className="checkbox">
|
276
268
|
<label>
|
277
269
|
<input type="checkbox" id="logout-sessions" name="logout-sessions" value="on" defaultChecked={true} />
|
package/src/tools/clsx.ts
CHANGED
@@ -1,50 +1,8 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
1
|
+
import { id } from "tsafe";
|
2
|
+
import { clsx_withTransform, type CxArg as CxArg_generic } from "./clsx_withTransform";
|
3
3
|
|
4
|
-
export type CxArg =
|
5
|
-
| undefined
|
6
|
-
| null
|
7
|
-
| string
|
8
|
-
| boolean
|
9
|
-
| Partial<Record<string, boolean | null | undefined>>
|
10
|
-
| readonly CxArg[];
|
4
|
+
export type CxArg = CxArg_generic<string>;
|
11
5
|
|
12
|
-
export
|
13
|
-
|
14
|
-
|
15
|
-
let cls = "";
|
16
|
-
for (; i < len; i++) {
|
17
|
-
const arg = args[i];
|
18
|
-
if (arg == null) continue;
|
19
|
-
|
20
|
-
let toAdd;
|
21
|
-
switch (typeof arg) {
|
22
|
-
case "boolean":
|
23
|
-
break;
|
24
|
-
case "object": {
|
25
|
-
if (Array.isArray(arg)) {
|
26
|
-
toAdd = clsx(...arg);
|
27
|
-
} else {
|
28
|
-
assert(!typeGuard<{ length: number }>(arg, false));
|
29
|
-
|
30
|
-
toAdd = "";
|
31
|
-
for (const k in arg) {
|
32
|
-
if (arg[k as string] && k) {
|
33
|
-
toAdd && (toAdd += " ");
|
34
|
-
toAdd += k;
|
35
|
-
}
|
36
|
-
}
|
37
|
-
}
|
38
|
-
break;
|
39
|
-
}
|
40
|
-
default: {
|
41
|
-
toAdd = arg;
|
42
|
-
}
|
43
|
-
}
|
44
|
-
if (toAdd) {
|
45
|
-
cls && (cls += " ");
|
46
|
-
cls += toAdd;
|
47
|
-
}
|
48
|
-
}
|
49
|
-
return cls;
|
50
|
-
};
|
6
|
+
export function clsx(...args: CxArg[]): string {
|
7
|
+
return clsx_withTransform({ args, transform: id });
|
8
|
+
}
|
@@ -0,0 +1,55 @@
|
|
1
|
+
import { assert } from "tsafe/assert";
|
2
|
+
import { typeGuard } from "tsafe/typeGuard";
|
3
|
+
|
4
|
+
export type CxArg<ClassName extends string = string> =
|
5
|
+
| undefined
|
6
|
+
| null
|
7
|
+
| ClassName
|
8
|
+
| boolean
|
9
|
+
| Partial<Record<ClassName, boolean | null | undefined>>
|
10
|
+
| readonly CxArg<ClassName>[];
|
11
|
+
|
12
|
+
export function clsx_withTransform(params: {
|
13
|
+
args: CxArg[];
|
14
|
+
transform: (arg: string) => string;
|
15
|
+
}): string {
|
16
|
+
const { args, transform } = params;
|
17
|
+
|
18
|
+
const len = args.length;
|
19
|
+
let i = 0;
|
20
|
+
let cls = "";
|
21
|
+
for (; i < len; i++) {
|
22
|
+
const arg = args[i];
|
23
|
+
if (arg == null) continue;
|
24
|
+
|
25
|
+
let toAdd;
|
26
|
+
switch (typeof arg) {
|
27
|
+
case "boolean":
|
28
|
+
break;
|
29
|
+
case "object": {
|
30
|
+
if (Array.isArray(arg)) {
|
31
|
+
toAdd = clsx_withTransform({ args: arg, transform });
|
32
|
+
} else {
|
33
|
+
assert(!typeGuard<{ length: number }>(arg, false));
|
34
|
+
|
35
|
+
toAdd = "";
|
36
|
+
for (const k in arg) {
|
37
|
+
if (arg[k] && k) {
|
38
|
+
toAdd && (toAdd += " ");
|
39
|
+
toAdd += transform(k);
|
40
|
+
}
|
41
|
+
}
|
42
|
+
}
|
43
|
+
break;
|
44
|
+
}
|
45
|
+
default: {
|
46
|
+
toAdd = transform(arg);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
if (toAdd) {
|
50
|
+
cls && (cls += " ");
|
51
|
+
cls += toAdd;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
return cls;
|
55
|
+
}
|
@@ -17,6 +17,7 @@ import {
|
|
17
17
|
type ResolvedViteConfig
|
18
18
|
} from "../bin/shared/buildOptions";
|
19
19
|
import MagicString from "magic-string";
|
20
|
+
import { generateKcGenTs } from "../bin/shared/generateKcGenTs";
|
20
21
|
|
21
22
|
export type Params = UserProvidedBuildOptions & {
|
22
23
|
postBuild?: (buildOptions: Omit<BuildOptions, "bundler">) => Promise<void>;
|
@@ -115,13 +116,20 @@ export function keycloakify(params?: Params) {
|
|
115
116
|
process.exit(0);
|
116
117
|
}
|
117
118
|
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
}
|
123
|
-
})
|
119
|
+
const buildOptions = readBuildOptions({
|
120
|
+
cliCommandOptions: {
|
121
|
+
reactAppRootDirPath
|
122
|
+
}
|
124
123
|
});
|
124
|
+
|
125
|
+
await Promise.all([
|
126
|
+
copyKeycloakResourcesToPublic({
|
127
|
+
buildOptions
|
128
|
+
}),
|
129
|
+
generateKcGenTs({
|
130
|
+
buildOptions
|
131
|
+
})
|
132
|
+
]);
|
125
133
|
},
|
126
134
|
transform: (code, id) => {
|
127
135
|
assert(command !== undefined);
|