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.
Files changed (88) hide show
  1. package/README.md +7 -4
  2. package/account/Template.js +1 -1
  3. package/account/Template.js.map +1 -1
  4. package/account/TemplateProps.d.ts +1 -1
  5. package/account/kcContext/KcContext.d.ts +1 -0
  6. package/account/kcContext/KcContext.js.map +1 -1
  7. package/account/kcContext/kcContextMocks.js +1 -0
  8. package/account/kcContext/kcContextMocks.js.map +1 -1
  9. package/account/lib/useGetClassName.js +1 -0
  10. package/account/lib/useGetClassName.js.map +1 -1
  11. package/account/pages/Account.js +1 -1
  12. package/account/pages/Account.js.map +1 -1
  13. package/bin/getSrcDirPath.js +30 -17
  14. package/bin/getSrcDirPath.js.map +1 -1
  15. package/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +6 -0
  16. package/bin/keycloakify/generateFtl/generateFtl.js +22 -0
  17. package/bin/keycloakify/generateFtl/generateFtl.js.map +1 -1
  18. package/bin/keycloakify/generateFtl/pageId.d.ts +1 -1
  19. package/bin/keycloakify/generateFtl/pageId.js +2 -0
  20. package/bin/keycloakify/generateFtl/pageId.js.map +1 -1
  21. package/bin/keycloakify/generateJavaStackFiles/account-v1-java/services/resources/account/AccountFormService.java +2 -12
  22. package/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.js +1 -1
  23. package/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.js.map +1 -1
  24. package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.js +1 -1
  25. package/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.js.map +1 -1
  26. package/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.d.ts +0 -1
  27. package/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.js +22 -13
  28. package/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.js.map +1 -1
  29. package/bin/keycloakify/generateTheme/readStaticResourcesUsage.d.ts +0 -2
  30. package/bin/keycloakify/generateTheme/readStaticResourcesUsage.js +37 -51
  31. package/bin/keycloakify/generateTheme/readStaticResourcesUsage.js.map +1 -1
  32. package/bin/keycloakify/keycloakify.js +1 -1
  33. package/bin/keycloakify/keycloakify.js.map +1 -1
  34. package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.js +7 -3
  35. package/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.js.map +1 -1
  36. package/lib/usePrepareTemplate.js +7 -8
  37. package/lib/usePrepareTemplate.js.map +1 -1
  38. package/login/Fallback.js +6 -0
  39. package/login/Fallback.js.map +1 -1
  40. package/login/Template.js +1 -1
  41. package/login/Template.js.map +1 -1
  42. package/login/TemplateProps.d.ts +1 -1
  43. package/login/kcContext/KcContext.d.ts +21 -1
  44. package/login/kcContext/KcContext.js.map +1 -1
  45. package/login/kcContext/kcContextMocks.d.ts +1 -1
  46. package/login/kcContext/kcContextMocks.js +12 -1
  47. package/login/kcContext/kcContextMocks.js.map +1 -1
  48. package/login/lib/useGetClassName.js +2 -0
  49. package/login/lib/useGetClassName.js.map +1 -1
  50. package/login/pages/Info.js +1 -1
  51. package/login/pages/Info.js.map +1 -1
  52. package/login/pages/LoginConfigTotp.js +1 -1
  53. package/login/pages/LoginConfigTotp.js.map +1 -1
  54. package/login/pages/LoginDeviceVerifyUserCode.d.ts +7 -0
  55. package/login/pages/LoginDeviceVerifyUserCode.js +15 -0
  56. package/login/pages/LoginDeviceVerifyUserCode.js.map +1 -0
  57. package/login/pages/LoginOauthGrant.d.ts +7 -0
  58. package/login/pages/LoginOauthGrant.js +15 -0
  59. package/login/pages/LoginOauthGrant.js.map +1 -0
  60. package/package.json +11 -1
  61. package/src/account/Template.tsx +1 -1
  62. package/src/account/TemplateProps.ts +1 -1
  63. package/src/account/kcContext/KcContext.ts +1 -0
  64. package/src/account/kcContext/kcContextMocks.ts +1 -0
  65. package/src/account/lib/useGetClassName.ts +1 -0
  66. package/src/account/pages/Account.tsx +4 -4
  67. package/src/bin/getSrcDirPath.ts +8 -8
  68. package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +6 -0
  69. package/src/bin/keycloakify/generateFtl/generateFtl.ts +21 -0
  70. package/src/bin/keycloakify/generateFtl/pageId.ts +2 -0
  71. package/src/bin/keycloakify/generateJavaStackFiles/account-v1-java/services/resources/account/AccountFormService.java +2 -12
  72. package/src/bin/keycloakify/generateJavaStackFiles/bringInAccountV1.ts +1 -1
  73. package/src/bin/keycloakify/generateJavaStackFiles/generateJavaStackFiles.ts +1 -1
  74. package/src/bin/keycloakify/generateTheme/downloadKeycloakStaticResources.ts +29 -15
  75. package/src/bin/keycloakify/generateTheme/readStaticResourcesUsage.ts +21 -28
  76. package/src/bin/keycloakify/keycloakify.ts +1 -2
  77. package/src/bin/keycloakify/replacers/replaceImportsFromStaticInJsCode.ts +14 -7
  78. package/src/lib/usePrepareTemplate.ts +7 -10
  79. package/src/login/Fallback.tsx +6 -0
  80. package/src/login/Template.tsx +1 -1
  81. package/src/login/TemplateProps.ts +3 -1
  82. package/src/login/kcContext/KcContext.ts +24 -0
  83. package/src/login/kcContext/kcContextMocks.ts +23 -1
  84. package/src/login/lib/useGetClassName.ts +2 -0
  85. package/src/login/pages/Info.tsx +4 -1
  86. package/src/login/pages/LoginConfigTotp.tsx +1 -1
  87. package/src/login/pages/LoginDeviceVerifyUserCode.tsx +68 -0
  88. 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,MAAM,CAAC,GAAiB,EAAE,GAAG,CAAC,GAAM,CAC5C,CAAC,IACD,IACJ,EAEJ,IAAI,IAAI,IAAI,IAAI,QAAQ,CAAC,CAAC,CAAC,CACxB,8BACI,yBACI,sBAAI,GAAG,CAAC,sBAAsB,CAAC,GAAK,EACpC,sBACI,6BAAM,EAAE,EAAC,oBAAoB,gBAAE,IAAI,CAAC,iBAAiB,IAAQ,GAC7D,EACJ,sBACI,0BAAG,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAC,cAAc,gBACjC,GAAG,CAAC,sBAAsB,CAAC,IAC5B,GACJ,IACH,EACL,yBACI,sBAAI,GAAG,CAAC,sBAAsB,CAAC,GAAK,EACpC,sBACI,yBACI,4BAAI,EAAE,EAAC,cAAc,iBAChB,GAAG,CAAC,eAAe,CAAC,QAAI,GAAG,CAAC,aAAa,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAC5D,EACL,4BAAI,EAAE,EAAC,mBAAmB,iBACrB,GAAG,CAAC,oBAAoB,CAAC,QAAI,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,mCAAI,IAAI,CAAC,MAAM,CAAC,SAAS,KAC7F,EACL,4BAAI,EAAE,EAAC,gBAAgB,iBAClB,GAAG,CAAC,iBAAiB,CAAC,QAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAC5C,EACJ,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAC3B,4BAAI,EAAE,EAAC,gBAAgB,iBAClB,GAAG,CAAC,mBAAmB,CAAC,QAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAC9C,CACR,CAAC,CAAC,CAAC,CACA,4BAAI,EAAE,EAAC,iBAAiB,iBACnB,GAAG,CAAC,kBAAkB,CAAC,QAAI,IAAI,CAAC,MAAM,CAAC,cAAc,KACrD,CACR,IACA,GACL,IACH,IACN,CACN,CAAC,CAAC,CAAC,CACA,yBACI,sBAAI,GAAG,CAAC,gBAAgB,CAAC,GAAK,EAC9B,cAAK,EAAE,EAAC,wBAAwB,EAAC,GAAG,EAAE,0BAA0B,IAAI,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAC,iBAAiB,GAAG,EACjH,cAAM,EACN,sBACI,0BAAG,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,EAAC,aAAa,gBACpC,GAAG,CAAC,uBAAuB,CAAC,IAC7B,GACJ,IACH,CACR,EACD,yBACI,sBAAI,GAAG,CAAC,gBAAgB,CAAC,GAAK,EAC9B,sBAAI,GAAG,CAAC,0BAA0B,CAAC,GAAK,IACvC,KACJ,EAEL,8BAAM,MAAM,EAAE,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC,aAAa,CAAC,EAAE,EAAE,EAAC,uBAAuB,EAAC,MAAM,EAAC,MAAM,iBAC3G,6BAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,iBAC5C,6BAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,iBAC/C,8BAAO,OAAO,EAAC,MAAM,EAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,gBACxD,GAAG,CAAC,mBAAmB,CAAC,IACrB,EAAC,GAAG,EACZ,6BAAM,SAAS,EAAC,UAAU,uBAAS,KACjC,EACN,6BAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,iBAC/C,gBACI,IAAI,EAAC,MAAM,EACX,EAAE,EAAC,MAAM,EACT,IAAI,EAAC,MAAM,EACX,YAAY,EAAC,KAAK,EAClB,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,kBACzB,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,GACpD,EAED,gBAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CACrC,6BAAM,EAAE,EAAC,sBAAsB,EAAC,SAAS,EAAE,YAAY,CAAC,0BAA0B,CAAC,eAAY,QAAQ,gBAClG,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,IAC1B,CACV,KACC,EACN,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,YAAY,EAAC,IAAI,EAAC,YAAY,EAAC,KAAK,EAAE,IAAI,CAAC,UAAU,GAAI,EAChF,IAAI,IAAI,gBAAO,IAAI,EAAC,QAAQ,EAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAE,IAAI,GAAI,KACrD,EAEN,6BAAK,SAAS,EAAE,YAAY,CAAC,kBAAkB,CAAC,iBAC5C,6BAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,iBAC/C,8BAAO,OAAO,EAAC,WAAW,EAAC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,gBAC7D,GAAG,CAAC,qBAAqB,CAAC,IACvB,EAAC,GAAG,EACX,IAAI,CAAC,cAAc,CAAC,MAAM,IAAI,CAAC,IAAI,6BAAM,SAAS,EAAC,UAAU,uBAAS,KACrE,EACN,6BAAK,SAAS,EAAE,YAAY,CAAC,qBAAqB,CAAC,iBAC/C,gBACI,IAAI,EAAC,MAAM,EACX,EAAE,EAAC,WAAW,EACd,IAAI,EAAC,WAAW,EAChB,YAAY,EAAC,KAAK,EAClB,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC,kBACzB,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,GACzD,EACD,gBAAgB,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,CAC1C,6BAAM,EAAE,EAAC,uBAAuB,EAAC,SAAS,EAAE,YAAY,CAAC,0BAA0B,CAAC,eAAY,QAAQ,gBACnG,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC,IAC/B,CACV,KACC,KACJ,EAEL,oBAAoB,CAAC,CAAC,CAAC,CACpB,8BACI,gBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,EAAE,EAAC,aAAa,EAChB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAC3B,EACF,+BACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CACX,YAAY,CAAC,eAAe,CAAC,EAC7B,YAAY,CAAC,sBAAsB,CAAC,EACpC,YAAY,CAAC,oBAAoB,CAAC,EAClC,YAAY,CAAC,oBAAoB,CAAC,CACrC,EACD,EAAE,EAAC,eAAe,EAClB,IAAI,EAAC,YAAY,EACjB,KAAK,EAAC,MAAM,gBAEX,GAAG,CAAC,UAAU,CAAC,IACX,IACV,CACN,CAAC,CAAC,CAAC,CACA,gBACI,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,EAAE,YAAY,CAAC,oBAAoB,CAAC,CAAC,EACxH,EAAE,EAAC,aAAa,EAChB,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,GAC3B,CACL,KACE,IACR,IACI,CACd,CAAC;AACN,CAAC"}
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.0",
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",
@@ -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": undefined,
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";
@@ -7,6 +7,7 @@ export type KcContext = KcContext.Password | KcContext.Account;
7
7
 
8
8
  export declare namespace KcContext {
9
9
  export type Common = {
10
+ themeVersion: string;
10
11
  keycloakifyVersion: string;
11
12
  themeType: "account";
12
13
  themeName: string;
@@ -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
- value={account.username ?? ""}
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 value={account.email ?? ""} />
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" value={account.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" value={account.lastName ?? ""} />
95
+ <input type="text" className="form-control" id="lastName" name="lastName" defaultValue={account.lastName ?? ""} />
96
96
  </div>
97
97
  </div>
98
98
 
@@ -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 themeSrcDirBasename = "keycloak-theme";
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 split = fileRelativePath.split(themeSrcDirBasename);
18
-
19
- if (split.length !== 2) {
20
- return undefined;
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, UserProfileContext.ACCOUNT_OLD.name());
459
+ .detail(Details.CONTEXT, "ACCOUNT_OLD");
470
460
 
471
461
  UserProfileProvider profileProvider = session.getProvider(UserProfileProvider.class);
472
- UserProfile profile = profileProvider.create(UserProfileContext.ACCOUNT_OLD, formData, user);
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=org.keycloak.services.resources.account.AccountFormService",
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>999.0.0-SNAPSHOT</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, usedResources, buildOptions } = params;
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 (!usedResources.resourcesCommonFilePaths.includes(fileRelativePath)) {
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
- for (const isCommon of [true, false]) {
50
- const set = isCommon ? resourcesCommonFilePaths : resourcesFilePaths;
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
- const matches = [...rawSourceFile.matchAll(regexp)];
48
+ for (const match of matches) {
49
+ const filePath = match[1];
56
50
 
57
- for (const match of matches) {
58
- const filePath = match[1];
59
-
60
- set.add(filePath);
61
- }
51
+ resourcesCommonFilePaths.add(filePath);
62
52
  }
53
+ }
63
54
 
64
- {
65
- const regexp = new RegExp(`resources${isCommon ? "Common" : ""}Path\\s*[+,]\\s*["']([^"'\`]+)["'\`]`, "g");
55
+ {
56
+ const regexp = new RegExp(`resourcesCommonPath\\s*[+,]\\s*["']([^"'\`]+)["'\`]`, "g");
66
57
 
67
- const matches = [...rawSourceFile.matchAll(regexp)];
58
+ const matches = [...rawSourceFile.matchAll(regexp)];
68
59
 
69
- for (const match of matches) {
70
- const filePath = match[1];
60
+ for (const match of matches) {
61
+ const filePath = match[1];
71
62
 
72
- set.add(filePath);
73
- }
63
+ resourcesCommonFilePaths.add(filePath);
74
64
  }
75
65
  }
76
66
 
77
- const removePrefixSlash = (filePath: string) => (filePath.startsWith("/") ? filePath.slice(1) : filePath);
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(removePrefixSlash),
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
- // We want, however, to test in a container running the latest Keycloak version
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-zA-Z]+)\\){return"static\\/${language}\\/"`, "g"),
20
- (...[, n, u, e]) => `
21
- ${n}[(function(){
22
- var pd= Object.getOwnPropertyDescriptor(${n}, "p");
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
- return "${u}";
30
- })()] = function(${e}) { return "${true ? "/build/" : ""}static/${language}/"`
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 prLoadedArray: Promise<void>[] = [];
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
- prLoadedArray.push(prLoaded);
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
- if (isUnmounted) {
43
- return;
38
+ if (isUnmounted) {
39
+ return;
40
+ }
44
41
  }
45
42
 
46
43
  setReady();