keycloakify 9.0.0-rc.0 → 9.0.0-rc.1
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/README.md +7 -4
- package/account/Template.js +1 -1
- package/account/Template.js.map +1 -1
- package/account/TemplateProps.d.ts +1 -1
- package/account/kcContext/KcContext.d.ts +1 -0
- package/account/kcContext/KcContext.js.map +1 -1
- package/account/kcContext/kcContextMocks.js +1 -0
- package/account/kcContext/kcContextMocks.js.map +1 -1
- package/account/lib/useGetClassName.js +1 -0
- package/account/lib/useGetClassName.js.map +1 -1
- package/account/pages/Account.js +1 -1
- package/account/pages/Account.js.map +1 -1
- package/bin/getSrcDirPath.js +30 -17
- package/bin/getSrcDirPath.js.map +1 -1
- package/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +6 -0
- package/bin/keycloakify/generateFtl/generateFtl.js +22 -0
- package/bin/keycloakify/generateFtl/generateFtl.js.map +1 -1
- package/bin/keycloakify/generateFtl/pageId.d.ts +1 -1
- package/bin/keycloakify/generateFtl/pageId.js +2 -0
- package/bin/keycloakify/generateFtl/pageId.js.map +1 -1
- package/bin/keycloakify/generateJavaStackFiles/account-v1-java/services/resources/account/AccountFormService.java +2 -12
- package/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.js +1 -1
- package/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.js.map +1 -1
- package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.js +1 -1
- package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.js.map +1 -1
- package/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.d.ts +0 -1
- package/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.js +22 -13
- package/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.js.map +1 -1
- package/bin/keycloakify/generateTheme/readStaticResourcesUsage.d.ts +0 -2
- package/bin/keycloakify/generateTheme/readStaticResourcesUsage.js +37 -51
- package/bin/keycloakify/generateTheme/readStaticResourcesUsage.js.map +1 -1
- package/bin/keycloakify/keycloakify.js +1 -1
- package/bin/keycloakify/keycloakify.js.map +1 -1
- package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.js +7 -3
- package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.js.map +1 -1
- package/lib/usePrepareTemplate.js +7 -8
- package/lib/usePrepareTemplate.js.map +1 -1
- package/login/Fallback.js +6 -0
- package/login/Fallback.js.map +1 -1
- package/login/Template.js +1 -1
- package/login/Template.js.map +1 -1
- package/login/TemplateProps.d.ts +1 -1
- package/login/kcContext/KcContext.d.ts +21 -1
- package/login/kcContext/KcContext.js.map +1 -1
- package/login/kcContext/kcContextMocks.d.ts +1 -1
- package/login/kcContext/kcContextMocks.js +12 -1
- package/login/kcContext/kcContextMocks.js.map +1 -1
- package/login/lib/useGetClassName.js +2 -0
- package/login/lib/useGetClassName.js.map +1 -1
- package/login/pages/Info.js +1 -1
- package/login/pages/Info.js.map +1 -1
- package/login/pages/LoginConfigTotp.js +1 -1
- package/login/pages/LoginConfigTotp.js.map +1 -1
- package/login/pages/LoginDeviceVerifyUserCode.d.ts +7 -0
- package/login/pages/LoginDeviceVerifyUserCode.js +15 -0
- package/login/pages/LoginDeviceVerifyUserCode.js.map +1 -0
- package/login/pages/LoginOauthGrant.d.ts +7 -0
- package/login/pages/LoginOauthGrant.js +15 -0
- package/login/pages/LoginOauthGrant.js.map +1 -0
- package/package.json +11 -1
- package/src/account/Template.tsx +1 -1
- package/src/account/TemplateProps.ts +1 -1
- package/src/account/kcContext/KcContext.ts +1 -0
- package/src/account/kcContext/kcContextMocks.ts +1 -0
- package/src/account/lib/useGetClassName.ts +1 -0
- package/src/account/pages/Account.tsx +4 -4
- package/src/bin/getSrcDirPath.ts +8 -8
- package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +6 -0
- package/src/bin/keycloakify/generateFtl/generateFtl.ts +21 -0
- package/src/bin/keycloakify/generateFtl/pageId.ts +2 -0
- package/src/bin/keycloakify/generateJavaStackFiles/account-v1-java/services/resources/account/AccountFormService.java +2 -12
- package/src/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.ts +1 -1
- package/src/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.ts +1 -1
- package/src/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.ts +29 -15
- package/src/bin/keycloakify/generateTheme/readStaticResourcesUsage.ts +21 -28
- package/src/bin/keycloakify/keycloakify.ts +1 -2
- package/src/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.ts +14 -7
- package/src/lib/usePrepareTemplate.ts +7 -10
- package/src/login/Fallback.tsx +6 -0
- package/src/login/Template.tsx +1 -1
- package/src/login/TemplateProps.ts +3 -1
- package/src/login/kcContext/KcContext.ts +24 -0
- package/src/login/kcContext/kcContextMocks.ts +23 -1
- package/src/login/lib/useGetClassName.ts +2 -0
- package/src/login/pages/Info.tsx +4 -1
- package/src/login/pages/LoginConfigTotp.tsx +1 -1
- package/src/login/pages/LoginDeviceVerifyUserCode.tsx +68 -0
- package/src/login/pages/LoginOauthGrant.tsx +73 -0
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"LoginConfigTotp.js","sourceRoot":"","sources":["../../src/login/pages/LoginConfigTotp.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAKxE,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAA+E;;IACnH,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAEtE,MAAM,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC;QACrC,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,MAAM,EAAE,GAAG,EAAE,oBAAoB,EAAE,IAAI,EAAE,IAAI,EAAE,gBAAgB,EAAE,GAAG,SAAS,CAAC;IAE9E,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,cAAc,GAAsE;QACtF,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,QAAQ;QACtB,YAAY,EAAE,QAAQ;KACzB,CAAC;IAEF,OAAO,CACH,KAAC,QAAQ,oBAAK,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,IAAE,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,gBAC1F,8BACI,4BAAI,EAAE,EAAC,kBAAkB,iBACrB,yBACI,sBAAI,GAAG,CAAC,gBAAgB,CAAC,GAAK,EAE9B,2BAAI,EAAE,EAAC,wBAAwB,gBAC1B,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CACnC,uBAAK,
|
1
|
+
{"version":3,"file":"LoginConfigTotp.js","sourceRoot":"","sources":["../../src/login/pages/LoginConfigTotp.tsx"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
import { I18n } from "../i18n";
|
3
|
+
import { KcContext } from "../kcContext";
|
4
|
+
import { PageProps } from "./PageProps";
|
5
|
+
export default function LoginOauthGrant(props: PageProps<Extract<KcContext, {
|
6
|
+
pageId: "login-oauth2-device-verify-user-code.ftl";
|
7
|
+
}>, I18n>): JSX.Element;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
import { clsx } from "../../tools/clsx";
|
3
|
+
import Template from "../Template";
|
4
|
+
import { useGetClassName } from "../lib/useGetClassName";
|
5
|
+
export default function LoginOauthGrant(props) {
|
6
|
+
const { kcContext, i18n, doUseDefaultCss, classes } = props;
|
7
|
+
const { url } = kcContext;
|
8
|
+
const { msg, msgStr } = i18n;
|
9
|
+
const { getClassName } = useGetClassName({
|
10
|
+
doUseDefaultCss,
|
11
|
+
classes
|
12
|
+
});
|
13
|
+
return (_jsx(Template, Object.assign({}, { kcContext, i18n, doUseDefaultCss, classes }, { headerNode: msg("oauth2DeviceVerificationTitle") }, { children: _jsxs("form", Object.assign({ id: "kc-user-verify-device-user-code-form", className: getClassName("kcFormClass"), action: url.oauth2DeviceVerificationAction, method: "post" }, { children: [_jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ className: getClassName("kcLabelWrapperClass") }, { children: _jsx("label", Object.assign({ htmlFor: "device-user-code", className: getClassName("kcLabelClass") }, { children: msg("verifyOAuth2DeviceUserCode") })) })), _jsx("div", Object.assign({ className: getClassName("kcInputWrapperClass") }, { children: _jsx("input", { id: "device-user-code", name: "device_user_code", autoComplete: "off", type: "text", className: getClassName("kcInputClass"), autoFocus: true }) }))] })), _jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ id: "kc-form-options", className: getClassName("kcFormOptionsClass") }, { children: _jsx("div", { className: getClassName("kcFormOptionsWrapperClass") }) })), _jsx("div", Object.assign({ id: "kc-form-buttons", className: getClassName("kcFormButtonsClass") }, { children: _jsx("div", Object.assign({ className: getClassName("kcFormButtonsWrapperClass") }, { children: _jsx("input", { className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass")), type: "submit", value: msgStr("doSubmit") }) })) }))] }))] })) })));
|
14
|
+
}
|
15
|
+
//# sourceMappingURL=LoginDeviceVerifyUserCode.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LoginDeviceVerifyUserCode.js","sourceRoot":"","sources":["../../src/login/pages/LoginDeviceVerifyUserCode.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,QAAQ,MAAM,aAAa,CAAC;AAGnC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAAkG;IACtI,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC5D,MAAM,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAE1B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE7B,MAAM,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC;QACrC,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,OAAO,CACH,KAAC,QAAQ,oBAAK,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,IAAE,UAAU,EAAE,GAAG,CAAC,+BAA+B,CAAC,gBACzG,8BACI,EAAE,EAAC,sCAAsC,EACzC,SAAS,EAAE,YAAY,CAAC,aAAa,CAAC,EACtC,MAAM,EAAE,GAAG,CAAC,8BAA8B,EAC1C,MAAM,EAAC,MAAM,iBAEb,6BAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,iBAC5C,4BAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,gBAC/C,8BAAO,OAAO,EAAC,kBAAkB,EAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,gBACpE,GAAG,CAAC,4BAA4B,CAAC,IAC9B,IACN,EAEN,4BAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,gBAC/C,gBACI,EAAE,EAAC,kBAAkB,EACrB,IAAI,EAAC,kBAAkB,EACvB,YAAY,EAAC,KAAK,EAClB,IAAI,EAAC,MAAM,EACX,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,EACvC,SAAS,SACX,IACA,KACJ,EAEN,6BAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,iBAC5C,4BAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,YAAY,CAAC,oBAAoB,CAAC,gBACnE,cAAK,SAAS,EAAE,YAAY,CAAC,2BAA2B,CAAC,GAAQ,IAC/D,EAEN,4BAAK,EAAE,EAAC,iBAAiB,EAAC,SAAS,EAAE,YAAY,CAAC,oBAAoB,CAAC,gBACnE,4BAAK,SAAS,EAAE,YAAY,CAAC,2BAA2B,CAAC,gBACrD,gBACI,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAC3B,IACA,IACJ,KACJ,KACH,IACA,CACd,CAAC;AACN,CAAC"}
|
@@ -0,0 +1,7 @@
|
|
1
|
+
/// <reference types="react" />
|
2
|
+
import { PageProps } from "./PageProps";
|
3
|
+
import { KcContext } from "../kcContext";
|
4
|
+
import { I18n } from "../i18n";
|
5
|
+
export default function LoginOauthGrant(props: PageProps<Extract<KcContext, {
|
6
|
+
pageId: "login-oauth-grant.ftl";
|
7
|
+
}>, I18n>): JSX.Element;
|
@@ -0,0 +1,15 @@
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
2
|
+
import { clsx } from "../../tools/clsx";
|
3
|
+
import Template from "../Template";
|
4
|
+
import { useGetClassName } from "../../login/lib/useGetClassName";
|
5
|
+
export default function LoginOauthGrant(props) {
|
6
|
+
const { kcContext, i18n, doUseDefaultCss, classes } = props;
|
7
|
+
const { url, oauth, client } = kcContext;
|
8
|
+
const { msg, msgStr, advancedMsg, advancedMsgStr } = i18n;
|
9
|
+
const { getClassName } = useGetClassName({
|
10
|
+
doUseDefaultCss,
|
11
|
+
classes
|
12
|
+
});
|
13
|
+
return (_jsx(Template, Object.assign({}, { kcContext, i18n, doUseDefaultCss, classes }, { headerNode: msg("oauthGrantTitle", client.name ? advancedMsgStr(client.name) : client.clientId) }, { children: _jsxs("div", Object.assign({ id: "kc-oauth", className: "content-area" }, { children: [_jsx("h3", { children: msg("oauthGrantRequest") }), _jsx("ul", { children: oauth.clientScopesRequested.map(clientScope => (_jsx("li", { children: _jsx("span", { children: advancedMsg(clientScope.consentScreenText) }) }, clientScope.consentScreenText))) }), _jsxs("form", Object.assign({ className: "form-actions", action: url.oauthAction, method: "POST" }, { children: [_jsx("input", { type: "hidden", name: "code", value: oauth.code }), _jsxs("div", Object.assign({ className: getClassName("kcFormGroupClass") }, { children: [_jsx("div", Object.assign({ id: "kc-form-options" }, { children: _jsx("div", { className: getClassName("kcFormOptionsWrapperClass") }) })), _jsx("div", Object.assign({ id: "kc-form-buttons" }, { children: _jsxs("div", Object.assign({ className: getClassName("kcFormButtonsWrapperClass") }, { children: [_jsx("input", { className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonPrimaryClass"), getClassName("kcButtonLargeClass")), name: "accept", id: "kc-login", type: "submit", value: msgStr("doYes") }), _jsx("input", { className: clsx(getClassName("kcButtonClass"), getClassName("kcButtonDefaultClass"), getClassName("kcButtonLargeClass")), name: "cancel", id: "kc-cancel", type: "submit", value: msgStr("doNo") })] })) }))] }))] })), _jsx("div", { className: "clearfix" })] })) })));
|
14
|
+
}
|
15
|
+
//# sourceMappingURL=LoginOauthGrant.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LoginOauthGrant.js","sourceRoot":"","sources":["../../src/login/pages/LoginOauthGrant.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAI9C,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AAExE,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,KAA+E;IACnH,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAC5D,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAEzC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC;IAE1D,MAAM,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC;QACrC,eAAe;QACf,OAAO;KACV,CAAC,CAAC;IAEH,OAAO,CACH,KAAC,QAAQ,oBACD,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,IACjD,UAAU,EAAE,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAE/F,6BAAK,EAAE,EAAC,UAAU,EAAC,SAAS,EAAC,cAAc,iBACvC,uBAAK,GAAG,CAAC,mBAAmB,CAAC,GAAM,EACnC,uBACK,KAAK,CAAC,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC,CAC5C,uBACI,yBAAO,WAAW,CAAC,WAAW,CAAC,iBAAiB,CAAC,GAAQ,IADpD,WAAW,CAAC,iBAAiB,CAEjC,CACR,CAAC,GACD,EAEL,8BAAM,SAAS,EAAC,cAAc,EAAC,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,MAAM,EAAC,MAAM,iBACjE,gBAAO,IAAI,EAAC,QAAQ,EAAC,IAAI,EAAC,MAAM,EAAC,KAAK,EAAE,KAAK,CAAC,IAAI,GAAI,EACtD,6BAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,iBAC5C,4BAAK,EAAE,EAAC,iBAAiB,gBACrB,cAAK,SAAS,EAAE,YAAY,CAAC,2BAA2B,CAAC,GAAQ,IAC/D,EAEN,4BAAK,EAAE,EAAC,iBAAiB,gBACrB,6BAAK,SAAS,EAAE,YAAY,CAAC,2BAA2B,CAAC,iBACrD,gBACI,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,UAAU,EACb,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,GACxB,EACF,gBACI,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,IAAI,EAAC,QAAQ,EACb,EAAE,EAAC,WAAW,EACd,IAAI,EAAC,QAAQ,EACb,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,GACvB,KACA,IACJ,KACJ,KACH,EACP,cAAK,SAAS,EAAC,UAAU,GAAO,KAC9B,IACC,CACd,CAAC;AACN,CAAC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "keycloakify",
|
3
|
-
"version": "9.0.0-rc.
|
3
|
+
"version": "9.0.0-rc.1",
|
4
4
|
"description": "Create Keycloak themes using React",
|
5
5
|
"repository": {
|
6
6
|
"type": "git",
|
@@ -188,8 +188,10 @@
|
|
188
188
|
"src/login/pages/Info.tsx",
|
189
189
|
"src/login/pages/Login.tsx",
|
190
190
|
"src/login/pages/LoginConfigTotp.tsx",
|
191
|
+
"src/login/pages/LoginDeviceVerifyUserCode.tsx",
|
191
192
|
"src/login/pages/LoginIdpLinkConfirm.tsx",
|
192
193
|
"src/login/pages/LoginIdpLinkEmail.tsx",
|
194
|
+
"src/login/pages/LoginOauthGrant.tsx",
|
193
195
|
"src/login/pages/LoginOtp.tsx",
|
194
196
|
"src/login/pages/LoginPageExpired.tsx",
|
195
197
|
"src/login/pages/LoginPassword.tsx",
|
@@ -656,12 +658,18 @@
|
|
656
658
|
"login/pages/LoginConfigTotp.d.ts",
|
657
659
|
"login/pages/LoginConfigTotp.js",
|
658
660
|
"login/pages/LoginConfigTotp.js.map",
|
661
|
+
"login/pages/LoginDeviceVerifyUserCode.d.ts",
|
662
|
+
"login/pages/LoginDeviceVerifyUserCode.js",
|
663
|
+
"login/pages/LoginDeviceVerifyUserCode.js.map",
|
659
664
|
"login/pages/LoginIdpLinkConfirm.d.ts",
|
660
665
|
"login/pages/LoginIdpLinkConfirm.js",
|
661
666
|
"login/pages/LoginIdpLinkConfirm.js.map",
|
662
667
|
"login/pages/LoginIdpLinkEmail.d.ts",
|
663
668
|
"login/pages/LoginIdpLinkEmail.js",
|
664
669
|
"login/pages/LoginIdpLinkEmail.js.map",
|
670
|
+
"login/pages/LoginOauthGrant.d.ts",
|
671
|
+
"login/pages/LoginOauthGrant.js",
|
672
|
+
"login/pages/LoginOauthGrant.js.map",
|
665
673
|
"login/pages/LoginOtp.d.ts",
|
666
674
|
"login/pages/LoginOtp.js",
|
667
675
|
"login/pages/LoginOtp.js.map",
|
@@ -879,8 +887,10 @@
|
|
879
887
|
"src/login/pages/Info.tsx",
|
880
888
|
"src/login/pages/Login.tsx",
|
881
889
|
"src/login/pages/LoginConfigTotp.tsx",
|
890
|
+
"src/login/pages/LoginDeviceVerifyUserCode.tsx",
|
882
891
|
"src/login/pages/LoginIdpLinkConfirm.tsx",
|
883
892
|
"src/login/pages/LoginIdpLinkEmail.tsx",
|
893
|
+
"src/login/pages/LoginOauthGrant.tsx",
|
884
894
|
"src/login/pages/LoginOtp.tsx",
|
885
895
|
"src/login/pages/LoginPageExpired.tsx",
|
886
896
|
"src/login/pages/LoginPassword.tsx",
|
package/src/account/Template.tsx
CHANGED
@@ -22,7 +22,7 @@ export default function Template(props: TemplateProps<KcContext, I18n>) {
|
|
22
22
|
`${url.resourcesCommonPath}/node_modules/patternfly/dist/css/patternfly-additions.min.css`,
|
23
23
|
`${url.resourcesPath}/css/account.css`
|
24
24
|
],
|
25
|
-
"htmlClassName":
|
25
|
+
"htmlClassName": getClassName("kcHtmlClass"),
|
26
26
|
"bodyClassName": clsx("admin-console", "user", getClassName("kcBodyClass"))
|
27
27
|
});
|
28
28
|
|
@@ -11,4 +11,4 @@ export type TemplateProps<KcContext extends KcContext.Common, I18nExtended exten
|
|
11
11
|
children: ReactNode;
|
12
12
|
};
|
13
13
|
|
14
|
-
export type ClassKey = "kcBodyClass" | "kcButtonClass" | "kcButtonPrimaryClass" | "kcButtonLargeClass" | "kcButtonDefaultClass";
|
14
|
+
export type ClassKey = "kcHtmlClass" | "kcBodyClass" | "kcButtonClass" | "kcButtonPrimaryClass" | "kcButtonLargeClass" | "kcButtonDefaultClass";
|
@@ -9,6 +9,7 @@ const PUBLIC_URL = (typeof process !== "object" ? undefined : process.env?.["PUB
|
|
9
9
|
const resourcesPath = pathJoin(PUBLIC_URL, keycloak_resources, "account", "resources");
|
10
10
|
|
11
11
|
export const kcContextCommonMock: KcContext.Common = {
|
12
|
+
"themeVersion": "0.0.0",
|
12
13
|
"keycloakifyVersion": "0.0.0",
|
13
14
|
"themeType": "account",
|
14
15
|
"themeName": "my-theme-name",
|
@@ -3,6 +3,7 @@ import type { ClassKey } from "keycloakify/account/TemplateProps";
|
|
3
3
|
|
4
4
|
export const { useGetClassName } = createUseClassName<ClassKey>({
|
5
5
|
"defaultClasses": {
|
6
|
+
"kcHtmlClass": undefined,
|
6
7
|
"kcBodyClass": undefined,
|
7
8
|
"kcButtonClass": "btn",
|
8
9
|
"kcButtonPrimaryClass": "btn-primary",
|
@@ -51,7 +51,7 @@ export default function Account(props: PageProps<Extract<KcContext, { pageId: "a
|
|
51
51
|
id="username"
|
52
52
|
name="username"
|
53
53
|
disabled={!realm.editUsernameAllowed}
|
54
|
-
|
54
|
+
defaultValue={account.username ?? ""}
|
55
55
|
/>
|
56
56
|
</div>
|
57
57
|
</div>
|
@@ -66,7 +66,7 @@ export default function Account(props: PageProps<Extract<KcContext, { pageId: "a
|
|
66
66
|
</div>
|
67
67
|
|
68
68
|
<div className="col-sm-10 col-md-10">
|
69
|
-
<input type="text" className="form-control" id="email" name="email" autoFocus
|
69
|
+
<input type="text" className="form-control" id="email" name="email" autoFocus defaultValue={account.email ?? ""} />
|
70
70
|
</div>
|
71
71
|
</div>
|
72
72
|
|
@@ -79,7 +79,7 @@ export default function Account(props: PageProps<Extract<KcContext, { pageId: "a
|
|
79
79
|
</div>
|
80
80
|
|
81
81
|
<div className="col-sm-10 col-md-10">
|
82
|
-
<input type="text" className="form-control" id="firstName" name="firstName"
|
82
|
+
<input type="text" className="form-control" id="firstName" name="firstName" defaultValue={account.firstName ?? ""} />
|
83
83
|
</div>
|
84
84
|
</div>
|
85
85
|
|
@@ -92,7 +92,7 @@ export default function Account(props: PageProps<Extract<KcContext, { pageId: "a
|
|
92
92
|
</div>
|
93
93
|
|
94
94
|
<div className="col-sm-10 col-md-10">
|
95
|
-
<input type="text" className="form-control" id="lastName" name="lastName"
|
95
|
+
<input type="text" className="form-control" id="lastName" name="lastName" defaultValue={account.lastName ?? ""} />
|
96
96
|
</div>
|
97
97
|
</div>
|
98
98
|
|
package/src/bin/getSrcDirPath.ts
CHANGED
@@ -4,7 +4,7 @@ import { crawl } from "./tools/crawl";
|
|
4
4
|
import { join as pathJoin } from "path";
|
5
5
|
import { themeTypes } from "./constants";
|
6
6
|
|
7
|
-
const
|
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
10
|
export function getThemeSrcDirPath(params: { reactAppRootDirPath: string }) {
|
@@ -14,13 +14,13 @@ export function getThemeSrcDirPath(params: { reactAppRootDirPath: string }) {
|
|
14
14
|
|
15
15
|
const themeSrcDirPath: string | undefined = crawl({ "dirPath": srcDirPath, "returnedPathsType": "relative to dirPath" })
|
16
16
|
.map(fileRelativePath => {
|
17
|
-
const
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
for (const themeSrcDirBasename of themeSrcDirBasenames) {
|
18
|
+
const split = fileRelativePath.split(themeSrcDirBasename);
|
19
|
+
if (split.length === 2) {
|
20
|
+
return pathJoin(srcDirPath, split[0] + themeSrcDirBasename);
|
21
|
+
}
|
21
22
|
}
|
22
|
-
|
23
|
-
return pathJoin(srcDirPath, split[0] + themeSrcDirBasename);
|
23
|
+
return undefined;
|
24
24
|
})
|
25
25
|
.filter(exclude(undefined))[0];
|
26
26
|
|
@@ -38,7 +38,7 @@ export function getThemeSrcDirPath(params: { reactAppRootDirPath: string }) {
|
|
38
38
|
console.error(
|
39
39
|
[
|
40
40
|
"Can't locate your theme source directory. It should be either: ",
|
41
|
-
"src/ or src/keycloak-theme.",
|
41
|
+
"src/ or src/keycloak-theme or src/keycloak_theme.",
|
42
42
|
"Example in the starter: https://github.com/keycloakify/keycloakify-starter/tree/main/src/keycloak-theme"
|
43
43
|
].join("\n")
|
44
44
|
);
|
@@ -478,6 +478,12 @@
|
|
478
478
|
"error.ftl" == pageId &&
|
479
479
|
are_same_path(path, ["realm"]) &&
|
480
480
|
!["name", "displayName", "displayNameHtml", "internationalizationEnabled", "registrationEmailAsUsername" ]?seq_contains(key)
|
481
|
+
) || (
|
482
|
+
"applications.ftl" == pageId &&
|
483
|
+
are_same_path(path, ["applications", "applications", "*", "client", "realm"])
|
484
|
+
) || (
|
485
|
+
"applications.ftl" == pageId &&
|
486
|
+
"masterAdminClient" == key
|
481
487
|
)
|
482
488
|
>
|
483
489
|
<#local out_seq += ["/*If you need '" + key + "' on " + pageId + ", please submit an issue to the Keycloakify repo*/"]>
|
@@ -121,6 +121,27 @@ export function generateFtlFilesCodeFactory(params: {
|
|
121
121
|
].join("\n")
|
122
122
|
);
|
123
123
|
|
124
|
+
// Remove part of the document marked as ignored.
|
125
|
+
{
|
126
|
+
const startTags = $('meta[name="keycloakify-ignore-start"]');
|
127
|
+
|
128
|
+
startTags.each((...[, startTag]) => {
|
129
|
+
const $startTag = $(startTag);
|
130
|
+
const $endTag = $startTag.nextAll('meta[name="keycloakify-ignore-end"]').first();
|
131
|
+
|
132
|
+
if ($endTag.length) {
|
133
|
+
let currentNode = $startTag.next();
|
134
|
+
while (currentNode.length && !currentNode.is($endTag)) {
|
135
|
+
currentNode.remove();
|
136
|
+
currentNode = $startTag.next();
|
137
|
+
}
|
138
|
+
|
139
|
+
$startTag.remove();
|
140
|
+
$endTag.remove();
|
141
|
+
}
|
142
|
+
});
|
143
|
+
}
|
144
|
+
|
124
145
|
const partiallyFixedIndexHtmlCode = $.html();
|
125
146
|
|
126
147
|
function generateFtlFilesCode(params: { pageId: string }): {
|
@@ -10,6 +10,8 @@ export const loginThemePageIds = [
|
|
10
10
|
"login-reset-password.ftl",
|
11
11
|
"login-verify-email.ftl",
|
12
12
|
"terms.ftl",
|
13
|
+
"login-oauth2-device-verify-user-code.ftl",
|
14
|
+
"login-oauth-grant.ftl",
|
13
15
|
"login-otp.ftl",
|
14
16
|
"login-update-profile.ftl",
|
15
17
|
"login-update-password.ftl",
|
@@ -127,16 +127,6 @@ import org.keycloak.utils.CredentialHelper;
|
|
127
127
|
public class AccountFormService extends AbstractSecuredLocalService
|
128
128
|
implements AccountResourceProvider {
|
129
129
|
|
130
|
-
public static final String THEME_NAME = "account-v1";
|
131
|
-
|
132
|
-
@Override
|
133
|
-
public boolean useWithTheme(Theme theme) {
|
134
|
-
log.infof("Attempt to use with theme %s", theme.getName());
|
135
|
-
return ((!Strings.isNullOrEmpty(theme.getName()) && THEME_NAME.equals(theme.getName()))
|
136
|
-
|| (!Strings.isNullOrEmpty(theme.getParentName())
|
137
|
-
&& THEME_NAME.equals(theme.getParentName())));
|
138
|
-
}
|
139
|
-
|
140
130
|
@Override
|
141
131
|
public Object getResource() {
|
142
132
|
return this;
|
@@ -466,10 +456,10 @@ public class AccountFormService extends AbstractSecuredLocalService
|
|
466
456
|
.event(EventType.UPDATE_PROFILE)
|
467
457
|
.client(auth.getClient())
|
468
458
|
.user(auth.getUser())
|
469
|
-
.detail(Details.CONTEXT,
|
459
|
+
.detail(Details.CONTEXT, "ACCOUNT_OLD");
|
470
460
|
|
471
461
|
UserProfileProvider profileProvider = session.getProvider(UserProfileProvider.class);
|
472
|
-
UserProfile profile = profileProvider.create(UserProfileContext.
|
462
|
+
UserProfile profile = profileProvider.create(UserProfileContext.ACCOUNT, formData, user);
|
473
463
|
|
474
464
|
try {
|
475
465
|
// backward compatibility with old account console where attributes are not removed if missing
|
@@ -65,7 +65,7 @@ export async function bringInAccountV1(params: { buildOptions: BuildOptionsLike
|
|
65
65
|
pathJoin(accountV1DirPath, "theme.properties"),
|
66
66
|
Buffer.from(
|
67
67
|
[
|
68
|
-
"accountResourceProvider=
|
68
|
+
"accountResourceProvider=account-v1",
|
69
69
|
"",
|
70
70
|
"locales=ar,ca,cs,da,de,en,es,fr,fi,hu,it,ja,lt,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN",
|
71
71
|
"",
|
@@ -48,7 +48,7 @@ export async function generateJavaStackFiles(params: {
|
|
48
48
|
` <properties>`,
|
49
49
|
` <java.version>17</java.version>`,
|
50
50
|
` <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>`,
|
51
|
-
` <keycloak.version>
|
51
|
+
` <keycloak.version>23.0.0</keycloak.version>`,
|
52
52
|
` <guava.version>32.0.0-jre</guava.version>`,
|
53
53
|
` <lombok.version>1.18.28</lombok.version>`,
|
54
54
|
` <auto-service.version>1.1.1</auto-service.version>`,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
import { transformCodebase } from "../../tools/transformCodebase";
|
2
2
|
import * as fs from "fs";
|
3
|
-
import { join as pathJoin } from "path";
|
3
|
+
import { join as pathJoin, dirname as pathDirname } from "path";
|
4
4
|
import { downloadBuiltinKeycloakTheme } from "../../download-builtin-keycloak-theme";
|
5
5
|
import { resources_common, type ThemeType } from "../../constants";
|
6
6
|
import { BuildOptions } from "../BuildOptions";
|
@@ -21,12 +21,36 @@ export async function downloadKeycloakStaticResources(
|
|
21
21
|
keycloakVersion: string;
|
22
22
|
usedResources: {
|
23
23
|
resourcesCommonFilePaths: string[];
|
24
|
-
resourcesFilePaths: string[];
|
25
24
|
} | undefined;
|
26
25
|
buildOptions: BuildOptionsLike;
|
27
26
|
}
|
28
27
|
) {
|
29
|
-
const { themeType, themeDirPath, keycloakVersion,
|
28
|
+
const { themeType, themeDirPath, keycloakVersion, buildOptions } = params;
|
29
|
+
|
30
|
+
// NOTE: Hack for 427
|
31
|
+
const usedResources = (() => {
|
32
|
+
const { usedResources } = params;
|
33
|
+
|
34
|
+
if (usedResources === undefined) {
|
35
|
+
return undefined;
|
36
|
+
}
|
37
|
+
|
38
|
+
assert(usedResources !== undefined);
|
39
|
+
|
40
|
+
return {
|
41
|
+
"resourcesCommonDirPaths": usedResources.resourcesCommonFilePaths.map(filePath => {
|
42
|
+
{
|
43
|
+
const splitArg = "/dist/";
|
44
|
+
|
45
|
+
if (filePath.includes(splitArg)) {
|
46
|
+
return filePath.split(splitArg)[0] + splitArg;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
return pathDirname(filePath);
|
51
|
+
})
|
52
|
+
};
|
53
|
+
})();
|
30
54
|
|
31
55
|
const tmpDirPath = pathJoin(
|
32
56
|
themeDirPath,
|
@@ -43,17 +67,7 @@ export async function downloadKeycloakStaticResources(
|
|
43
67
|
|
44
68
|
transformCodebase({
|
45
69
|
"srcDirPath": pathJoin(tmpDirPath, "keycloak", themeType, "resources"),
|
46
|
-
"destDirPath": resourcesPath
|
47
|
-
"transformSourceCode":
|
48
|
-
usedResources === undefined
|
49
|
-
? undefined
|
50
|
-
: ({ fileRelativePath, sourceCode }) => {
|
51
|
-
if (!usedResources.resourcesFilePaths.includes(fileRelativePath)) {
|
52
|
-
return undefined;
|
53
|
-
}
|
54
|
-
|
55
|
-
return { "modifiedSourceCode": sourceCode };
|
56
|
-
}
|
70
|
+
"destDirPath": resourcesPath
|
57
71
|
});
|
58
72
|
|
59
73
|
transformCodebase({
|
@@ -63,7 +77,7 @@ export async function downloadKeycloakStaticResources(
|
|
63
77
|
usedResources === undefined
|
64
78
|
? undefined
|
65
79
|
: ({ fileRelativePath, sourceCode }) => {
|
66
|
-
if (
|
80
|
+
if (usedResources.resourcesCommonDirPaths.find(dirPath => fileRelativePath.startsWith(dirPath)) === undefined) {
|
67
81
|
return undefined;
|
68
82
|
}
|
69
83
|
|
@@ -1,17 +1,15 @@
|
|
1
1
|
import { crawl } from "../../tools/crawl";
|
2
|
-
import { join as pathJoin } from "path";
|
2
|
+
import { join as pathJoin, sep as pathSep } from "path";
|
3
3
|
import * as fs from "fs";
|
4
4
|
import type { ThemeType } from "../../constants";
|
5
5
|
|
6
6
|
/** Assumes the theme type exists */
|
7
7
|
export function readStaticResourcesUsage(params: { keycloakifySrcDirPath: string; themeSrcDirPath: string; themeType: ThemeType }): {
|
8
8
|
resourcesCommonFilePaths: string[];
|
9
|
-
resourcesFilePaths: string[];
|
10
9
|
} {
|
11
10
|
const { keycloakifySrcDirPath, themeSrcDirPath, themeType } = params;
|
12
11
|
|
13
12
|
const resourcesCommonFilePaths = new Set<string>();
|
14
|
-
const resourcesFilePaths = new Set<string>();
|
15
13
|
|
16
14
|
for (const srcDirPath of [pathJoin(keycloakifySrcDirPath, themeType), pathJoin(themeSrcDirPath, themeType)]) {
|
17
15
|
const filePaths = crawl({ "dirPath": srcDirPath, "returnedPathsType": "absolute" }).filter(filePath => /\.(ts|tsx|js|jsx)$/.test(filePath));
|
@@ -26,58 +24,53 @@ export function readStaticResourcesUsage(params: { keycloakifySrcDirPath: string
|
|
26
24
|
const wrap = readPaths({ rawSourceFile });
|
27
25
|
|
28
26
|
wrap.resourcesCommonFilePaths.forEach(filePath => resourcesCommonFilePaths.add(filePath));
|
29
|
-
wrap.resourcesFilePaths.forEach(filePath => resourcesFilePaths.add(filePath));
|
30
27
|
}
|
31
28
|
}
|
32
29
|
|
33
30
|
return {
|
34
|
-
"resourcesCommonFilePaths": Array.from(resourcesCommonFilePaths)
|
35
|
-
"resourcesFilePaths": Array.from(resourcesFilePaths)
|
31
|
+
"resourcesCommonFilePaths": Array.from(resourcesCommonFilePaths)
|
36
32
|
};
|
37
33
|
}
|
38
34
|
|
39
35
|
/** Exported for testing purpose */
|
40
36
|
export function readPaths(params: { rawSourceFile: string }): {
|
41
37
|
resourcesCommonFilePaths: string[];
|
42
|
-
resourcesFilePaths: string[];
|
43
38
|
} {
|
44
39
|
const { rawSourceFile } = params;
|
45
40
|
|
46
41
|
const resourcesCommonFilePaths = new Set<string>();
|
47
|
-
const resourcesFilePaths = new Set<string>();
|
48
42
|
|
49
|
-
|
50
|
-
const
|
43
|
+
{
|
44
|
+
const regexp = new RegExp(`resourcesCommonPath\\s*}([^\`]+)\``, "g");
|
51
45
|
|
52
|
-
|
53
|
-
const regexp = new RegExp(`resources${isCommon ? "Common" : ""}Path\\s*}([^\`]+)\``, "g");
|
46
|
+
const matches = [...rawSourceFile.matchAll(regexp)];
|
54
47
|
|
55
|
-
|
48
|
+
for (const match of matches) {
|
49
|
+
const filePath = match[1];
|
56
50
|
|
57
|
-
|
58
|
-
const filePath = match[1];
|
59
|
-
|
60
|
-
set.add(filePath);
|
61
|
-
}
|
51
|
+
resourcesCommonFilePaths.add(filePath);
|
62
52
|
}
|
53
|
+
}
|
63
54
|
|
64
|
-
|
65
|
-
|
55
|
+
{
|
56
|
+
const regexp = new RegExp(`resourcesCommonPath\\s*[+,]\\s*["']([^"'\`]+)["'\`]`, "g");
|
66
57
|
|
67
|
-
|
58
|
+
const matches = [...rawSourceFile.matchAll(regexp)];
|
68
59
|
|
69
|
-
|
70
|
-
|
60
|
+
for (const match of matches) {
|
61
|
+
const filePath = match[1];
|
71
62
|
|
72
|
-
|
73
|
-
}
|
63
|
+
resourcesCommonFilePaths.add(filePath);
|
74
64
|
}
|
75
65
|
}
|
76
66
|
|
77
|
-
const
|
67
|
+
const normalizePath = (filePath: string) => {
|
68
|
+
filePath = filePath.startsWith("/") ? filePath.slice(1) : filePath;
|
69
|
+
filePath = filePath.replace(/\//g, pathSep);
|
70
|
+
return filePath;
|
71
|
+
};
|
78
72
|
|
79
73
|
return {
|
80
|
-
"resourcesCommonFilePaths": Array.from(resourcesCommonFilePaths).map(
|
81
|
-
"resourcesFilePaths": Array.from(resourcesFilePaths).map(removePrefixSlash)
|
74
|
+
"resourcesCommonFilePaths": Array.from(resourcesCommonFilePaths).map(normalizePath)
|
82
75
|
};
|
83
76
|
}
|
@@ -66,8 +66,7 @@ export async function main() {
|
|
66
66
|
child_process.execSync("mvn package", { "cwd": buildOptions.keycloakifyBuildDirPath });
|
67
67
|
}
|
68
68
|
|
69
|
-
|
70
|
-
const containerKeycloakVersion = "21.1.2";
|
69
|
+
const containerKeycloakVersion = "23.0.0";
|
71
70
|
|
72
71
|
generateStartKeycloakTestingContainer({
|
73
72
|
"keycloakVersion": containerKeycloakVersion,
|
@@ -16,18 +16,25 @@ export function replaceImportsFromStaticInJsCode(params: { jsCode: string }): {
|
|
16
16
|
const { jsCode } = params;
|
17
17
|
|
18
18
|
const getReplaceArgs = (language: "js" | "css"): Parameters<typeof String.prototype.replace> => [
|
19
|
-
new RegExp(`([a-zA-Z_]+)\\.([a-zA-Z]+)=function\\(([a-
|
20
|
-
(...[, n, u,
|
21
|
-
|
22
|
-
|
19
|
+
new RegExp(`([a-zA-Z_]+)\\.([a-zA-Z]+)=(function\\(([a-z]+)\\){return|([a-z]+)=>)"static\\/${language}\\/"`, "g"),
|
20
|
+
(...[, n, u, matchedFunction, eForFunction]) => {
|
21
|
+
const isArrowFunction = matchedFunction.includes("=>");
|
22
|
+
const e = isArrowFunction ? matchedFunction.replace("=>", "").trim() : eForFunction;
|
23
|
+
|
24
|
+
return `
|
25
|
+
${n}[(function(){
|
26
|
+
var pd = Object.getOwnPropertyDescriptor(${n}, "p");
|
23
27
|
if( pd === undefined || pd.configurable ){
|
24
28
|
Object.defineProperty(${n}, "p", {
|
25
29
|
get: function() { return window.${ftlValuesGlobalName}.url.resourcesPath; },
|
26
|
-
set: function
|
30
|
+
set: function() {}
|
27
31
|
});
|
28
32
|
}
|
29
|
-
|
30
|
-
|
33
|
+
return "${u}";
|
34
|
+
})()] = ${isArrowFunction ? `${e} =>` : `function(${e}) { return `} "/build/static/${language}/"`
|
35
|
+
.replace(/\s+/g, " ")
|
36
|
+
.trim();
|
37
|
+
}
|
31
38
|
];
|
32
39
|
|
33
40
|
const fixedJsCode = jsCode
|
@@ -23,24 +23,21 @@ export function usePrepareTemplate(params: {
|
|
23
23
|
const removeArray: (() => void)[] = [];
|
24
24
|
|
25
25
|
(async () => {
|
26
|
-
const
|
27
|
-
|
28
|
-
styles.reverse().forEach(href => {
|
26
|
+
for (const style of [...styles].reverse()) {
|
29
27
|
const { prLoaded, remove } = headInsert({
|
30
28
|
"type": "css",
|
31
29
|
"position": "prepend",
|
32
|
-
href
|
30
|
+
"href": style
|
33
31
|
});
|
34
32
|
|
35
33
|
removeArray.push(remove);
|
36
34
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
await Promise.all(prLoadedArray);
|
35
|
+
// TODO: Find a way to do that in parallel (without breaking the order)
|
36
|
+
await prLoaded;
|
41
37
|
|
42
|
-
|
43
|
-
|
38
|
+
if (isUnmounted) {
|
39
|
+
return;
|
40
|
+
}
|
44
41
|
}
|
45
42
|
|
46
43
|
setReady();
|