keycloakify 10.0.0-rc.99 → 10.0.0

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 (503) hide show
  1. package/PUBLIC_URL.js +2 -2
  2. package/PUBLIC_URL.js.map +1 -1
  3. package/README.md +28 -242
  4. package/account/KcContext/KcContext.d.ts +4 -1
  5. package/account/KcContext/KcContext.js.map +1 -1
  6. package/account/KcContext/kcContextMocks.js +7 -4
  7. package/account/KcContext/kcContextMocks.js.map +1 -1
  8. package/account/Template.js +3 -1
  9. package/account/Template.js.map +1 -1
  10. package/account/i18n/GenericI18n.d.ts +6 -0
  11. package/account/i18n/GenericI18n.js +2 -0
  12. package/account/i18n/GenericI18n.js.map +1 -0
  13. package/account/i18n/i18n.d.ts +24 -30
  14. package/account/i18n/i18n.js +50 -70
  15. package/account/i18n/i18n.js.map +1 -1
  16. package/account/i18n/index.d.ts +4 -3
  17. package/account/i18n/index.js.map +1 -1
  18. package/account/i18n/messages_defaultSet/ar.js.map +1 -0
  19. package/account/i18n/messages_defaultSet/ca.js.map +1 -0
  20. package/account/i18n/messages_defaultSet/cs.js.map +1 -0
  21. package/account/i18n/messages_defaultSet/da.js.map +1 -0
  22. package/account/i18n/messages_defaultSet/de.js.map +1 -0
  23. package/account/i18n/messages_defaultSet/el.js.map +1 -0
  24. package/account/i18n/messages_defaultSet/en.js.map +1 -0
  25. package/account/i18n/messages_defaultSet/es.js.map +1 -0
  26. package/account/i18n/messages_defaultSet/fa.js.map +1 -0
  27. package/account/i18n/messages_defaultSet/fi.js.map +1 -0
  28. package/account/i18n/messages_defaultSet/fr.js.map +1 -0
  29. package/account/i18n/messages_defaultSet/hu.js.map +1 -0
  30. package/account/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  31. package/account/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  32. package/account/i18n/messages_defaultSet/index.js.map +1 -0
  33. package/account/i18n/messages_defaultSet/it.js.map +1 -0
  34. package/account/i18n/messages_defaultSet/ja.js.map +1 -0
  35. package/account/i18n/messages_defaultSet/lt.js.map +1 -0
  36. package/account/i18n/messages_defaultSet/lv.js.map +1 -0
  37. package/account/i18n/messages_defaultSet/nl.js.map +1 -0
  38. package/account/i18n/messages_defaultSet/no.js.map +1 -0
  39. package/account/i18n/messages_defaultSet/pl.js.map +1 -0
  40. package/account/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  41. package/account/i18n/messages_defaultSet/ru.js.map +1 -0
  42. package/account/i18n/messages_defaultSet/sk.js.map +1 -0
  43. package/account/i18n/messages_defaultSet/sv.js.map +1 -0
  44. package/account/i18n/messages_defaultSet/th.js.map +1 -0
  45. package/account/i18n/messages_defaultSet/tr.js.map +1 -0
  46. package/account/i18n/messages_defaultSet/uk.js.map +1 -0
  47. package/account/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  48. package/account/i18n/useI18n.d.ts +6 -5
  49. package/account/i18n/useI18n.js +37 -4
  50. package/account/i18n/useI18n.js.map +1 -1
  51. package/account/pages/FederatedIdentity.js +1 -1
  52. package/account/pages/FederatedIdentity.js.map +1 -1
  53. package/account/pages/Totp.js +5 -1
  54. package/account/pages/Totp.js.map +1 -1
  55. package/bin/193.index.js +5 -5
  56. package/bin/{490.index.js → 246.index.js} +22 -4
  57. package/bin/31.index.js +264 -203
  58. package/bin/440.index.js +178 -106
  59. package/bin/453.index.js +59 -7
  60. package/bin/526.index.js +525 -137
  61. package/bin/599.index.js +567 -0
  62. package/bin/{893.index.js → 622.index.js} +239 -231
  63. package/bin/{36.index.js → 678.index.js} +577 -71
  64. package/bin/{180.index.js → 697.index.js} +611 -526
  65. package/bin/743.index.js +70 -0
  66. package/bin/780.index.js +895 -0
  67. package/bin/786.index.js +185 -0
  68. package/bin/932.index.js +740 -52
  69. package/bin/{966.index.js → 941.index.js} +2 -19
  70. package/bin/97.index.js +29 -7
  71. package/bin/main.js +22 -10
  72. package/bin/shared/KeycloakVersionRange.d.ts +3 -3
  73. package/bin/shared/buildContext.d.ts +52 -16
  74. package/bin/shared/buildContext.js.map +1 -1
  75. package/bin/shared/constants.d.ts +18 -17
  76. package/bin/shared/constants.js +15 -14
  77. package/bin/shared/constants.js.map +1 -1
  78. package/bin/shared/copyKeycloakResourcesToPublic.js.map +1 -1
  79. package/bin/shared/downloadKeycloakDefaultTheme.js.map +1 -1
  80. package/bin/shared/generateKcGenTs.d.ts +3 -0
  81. package/bin/shared/generateKcGenTs.js.map +1 -1
  82. package/bin/shared/getLatestsSemVersionedTag.d.ts +15 -0
  83. package/bin/shared/getLatestsSemVersionedTag.js.map +1 -0
  84. package/bin/shared/promptKeycloakVersion.d.ts +3 -1
  85. package/bin/shared/promptKeycloakVersion.js.map +1 -1
  86. package/lib/getKcClsx.js +2 -1
  87. package/lib/getKcClsx.js.map +1 -1
  88. package/login/KcContext/KcContext.d.ts +10 -11
  89. package/login/KcContext/KcContext.js.map +1 -1
  90. package/login/KcContext/kcContextMocks.js +4 -5
  91. package/login/KcContext/kcContextMocks.js.map +1 -1
  92. package/login/Template.js +13 -7
  93. package/login/Template.js.map +1 -1
  94. package/login/TemplateProps.d.ts +0 -1
  95. package/login/UserProfileFormFields.js +6 -5
  96. package/login/UserProfileFormFields.js.map +1 -1
  97. package/login/i18n/GenericI18n.d.ts +6 -0
  98. package/login/i18n/GenericI18n.js +2 -0
  99. package/login/i18n/GenericI18n.js.map +1 -0
  100. package/login/i18n/i18n.d.ts +22 -32
  101. package/login/i18n/i18n.js +51 -92
  102. package/login/i18n/i18n.js.map +1 -1
  103. package/login/i18n/index.d.ts +4 -3
  104. package/login/i18n/index.js.map +1 -1
  105. package/login/i18n/messages_defaultSet/ar.js.map +1 -0
  106. package/login/i18n/messages_defaultSet/ca.js.map +1 -0
  107. package/login/i18n/messages_defaultSet/cs.js.map +1 -0
  108. package/login/i18n/messages_defaultSet/da.js.map +1 -0
  109. package/login/i18n/messages_defaultSet/de.js.map +1 -0
  110. package/login/i18n/messages_defaultSet/el.js.map +1 -0
  111. package/login/i18n/messages_defaultSet/en.js.map +1 -0
  112. package/login/i18n/messages_defaultSet/es.js.map +1 -0
  113. package/login/i18n/messages_defaultSet/fa.js.map +1 -0
  114. package/login/i18n/messages_defaultSet/fi.js.map +1 -0
  115. package/login/i18n/messages_defaultSet/fr.js.map +1 -0
  116. package/login/i18n/messages_defaultSet/hu.js.map +1 -0
  117. package/login/i18n/{baseMessages → messages_defaultSet}/index.d.ts +1 -1
  118. package/login/i18n/{baseMessages → messages_defaultSet}/index.js +3 -3
  119. package/login/i18n/messages_defaultSet/index.js.map +1 -0
  120. package/login/i18n/messages_defaultSet/it.js.map +1 -0
  121. package/login/i18n/messages_defaultSet/ja.js.map +1 -0
  122. package/login/i18n/messages_defaultSet/lt.js.map +1 -0
  123. package/login/i18n/messages_defaultSet/lv.js.map +1 -0
  124. package/login/i18n/messages_defaultSet/nl.js.map +1 -0
  125. package/login/i18n/messages_defaultSet/no.js.map +1 -0
  126. package/login/i18n/messages_defaultSet/pl.js.map +1 -0
  127. package/login/i18n/messages_defaultSet/pt-BR.js.map +1 -0
  128. package/login/i18n/messages_defaultSet/ru.js.map +1 -0
  129. package/login/i18n/messages_defaultSet/sk.js.map +1 -0
  130. package/login/i18n/messages_defaultSet/sv.js.map +1 -0
  131. package/login/i18n/messages_defaultSet/th.js.map +1 -0
  132. package/login/i18n/messages_defaultSet/tr.js.map +1 -0
  133. package/login/i18n/messages_defaultSet/uk.js.map +1 -0
  134. package/login/i18n/messages_defaultSet/zh-CN.js.map +1 -0
  135. package/login/i18n/useI18n.d.ts +6 -5
  136. package/login/i18n/useI18n.js +37 -4
  137. package/login/i18n/useI18n.js.map +1 -1
  138. package/login/lib/useUserProfileForm.d.ts +2 -0
  139. package/login/lib/useUserProfileForm.js +44 -10
  140. package/login/lib/useUserProfileForm.js.map +1 -1
  141. package/login/pages/Error.js +1 -1
  142. package/login/pages/Error.js.map +1 -1
  143. package/login/pages/Info.js +15 -3
  144. package/login/pages/Info.js.map +1 -1
  145. package/login/pages/Login.js +6 -2
  146. package/login/pages/Login.js.map +1 -1
  147. package/login/pages/LoginConfigTotp.js +5 -1
  148. package/login/pages/LoginConfigTotp.js.map +1 -1
  149. package/login/pages/LoginOtp.js +3 -1
  150. package/login/pages/LoginOtp.js.map +1 -1
  151. package/login/pages/LoginPassword.js +3 -1
  152. package/login/pages/LoginPassword.js.map +1 -1
  153. package/login/pages/LoginRecoveryAuthnCodeInput.js +3 -1
  154. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -1
  155. package/login/pages/LoginResetPassword.js +3 -1
  156. package/login/pages/LoginResetPassword.js.map +1 -1
  157. package/login/pages/LoginUpdatePassword.js +5 -1
  158. package/login/pages/LoginUpdatePassword.js.map +1 -1
  159. package/login/pages/Register.js +3 -1
  160. package/login/pages/Register.js.map +1 -1
  161. package/login/pages/SamlPostForm.js +1 -1
  162. package/login/pages/SamlPostForm.js.map +1 -1
  163. package/login/pages/SelectAuthenticator.js +2 -2
  164. package/login/pages/SelectAuthenticator.js.map +1 -1
  165. package/login/pages/WebauthnAuthenticate.js +3 -3
  166. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  167. package/login/pages/WebauthnRegister.js +2 -2
  168. package/package.json +265 -245
  169. package/src/PUBLIC_URL.ts +2 -2
  170. package/src/account/KcContext/KcContext.ts +4 -1
  171. package/src/account/KcContext/kcContextMocks.ts +7 -4
  172. package/src/account/Template.tsx +6 -1
  173. package/src/account/i18n/GenericI18n.tsx +6 -0
  174. package/src/account/i18n/i18n.tsx +91 -129
  175. package/src/account/i18n/index.ts +4 -3
  176. package/src/account/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  177. package/src/account/i18n/useI18n.tsx +95 -0
  178. package/src/account/pages/FederatedIdentity.tsx +1 -1
  179. package/src/account/pages/Totp.tsx +16 -6
  180. package/src/bin/add-story.ts +42 -10
  181. package/src/bin/eject-page.ts +119 -11
  182. package/src/bin/initialize-account-theme/copyBoilerplate.ts +32 -0
  183. package/src/bin/initialize-account-theme/index.ts +1 -0
  184. package/src/bin/initialize-account-theme/initialize-account-theme.ts +112 -0
  185. package/src/bin/initialize-account-theme/initializeAccountTheme_multiPage.ts +21 -0
  186. package/src/bin/initialize-account-theme/initializeAccountTheme_singlePage.ts +152 -0
  187. package/src/bin/initialize-account-theme/src/multi-page/KcContext.ts +12 -0
  188. package/src/bin/initialize-account-theme/src/multi-page/KcPage.tsx +25 -0
  189. package/src/bin/initialize-account-theme/src/multi-page/KcPageStory.tsx +38 -0
  190. package/src/bin/initialize-account-theme/src/multi-page/i18n.ts +5 -0
  191. package/src/bin/initialize-account-theme/src/single-page/KcContext.ts +7 -0
  192. package/src/bin/initialize-account-theme/src/single-page/KcPage.tsx +11 -0
  193. package/src/bin/initialize-account-theme/updateAccountThemeImplementationInConfig.ts +92 -0
  194. package/src/bin/initialize-email-theme.ts +1 -1
  195. package/src/bin/keycloakify/buildJars/buildJar.ts +38 -24
  196. package/src/bin/keycloakify/buildJars/buildJars.ts +6 -3
  197. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +5 -5
  198. package/src/bin/keycloakify/generateFtl/generateFtl.ts +16 -16
  199. package/src/bin/keycloakify/generateFtl/kcContextDeclarationTemplate.ftl +471 -364
  200. package/src/bin/keycloakify/generateResources/bringInAccountV1.ts +7 -7
  201. package/src/bin/keycloakify/generateResources/generateMessageProperties.ts +3 -3
  202. package/src/bin/keycloakify/generateResources/generateResourcesForMainTheme.ts +125 -59
  203. package/src/bin/keycloakify/generateResources/generateResourcesForThemeVariant.ts +2 -2
  204. package/src/bin/keycloakify/generateResources/readExtraPageNames.ts +5 -8
  205. package/src/bin/keycloakify/keycloakify.ts +8 -6
  206. package/src/bin/keycloakify/replacers/replaceImportsInCssCode.ts +41 -27
  207. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/replaceImportsInJsCode.ts +2 -2
  208. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/vite.ts +6 -6
  209. package/src/bin/keycloakify/replacers/replaceImportsInJsCode/webpack.ts +4 -4
  210. package/src/bin/main.ts +16 -2
  211. package/src/bin/shared/KeycloakVersionRange.ts +4 -4
  212. package/src/bin/shared/buildContext.ts +360 -251
  213. package/src/bin/shared/constants.ts +19 -17
  214. package/src/bin/shared/copyKeycloakResourcesToPublic.ts +6 -6
  215. package/src/bin/shared/downloadKeycloakDefaultTheme.ts +48 -27
  216. package/src/bin/shared/downloadKeycloakStaticResources.ts +2 -2
  217. package/src/bin/shared/generateKcGenTs.ts +110 -3
  218. package/src/bin/shared/getLatestsSemVersionedTag.ts +201 -0
  219. package/src/bin/shared/promptKeycloakVersion.ts +20 -80
  220. package/src/bin/start-keycloak/appBuild.ts +15 -11
  221. package/src/bin/start-keycloak/keycloakifyBuild.ts +3 -3
  222. package/src/bin/start-keycloak/myrealm-realm-18.json +4 -4
  223. package/src/bin/start-keycloak/myrealm-realm-19.json +4 -4
  224. package/src/bin/start-keycloak/myrealm-realm-20.json +4 -4
  225. package/src/bin/start-keycloak/myrealm-realm-21.json +4 -4
  226. package/src/bin/start-keycloak/myrealm-realm-23.json +3 -3
  227. package/src/bin/start-keycloak/myrealm-realm-24.json +4 -4
  228. package/src/bin/start-keycloak/myrealm-realm-25.json +4 -4
  229. package/src/bin/start-keycloak/start-keycloak.ts +256 -102
  230. package/src/bin/tools/assertNoPnpmDlx.ts +4 -2
  231. package/src/bin/tools/downloadAndExtractArchive.ts +10 -9
  232. package/src/bin/tools/fetchProxyOptions.ts +32 -11
  233. package/src/bin/tools/npmInstall.ts +63 -0
  234. package/src/bin/tools/octokit-addons/getLatestsSemVersionedTag.ts +3 -2
  235. package/src/bin/tsconfig.json +3 -1
  236. package/src/lib/getKcClsx.ts +2 -2
  237. package/src/login/KcContext/KcContext.ts +10 -28
  238. package/src/login/KcContext/kcContextMocks.ts +5 -6
  239. package/src/login/Template.tsx +32 -54
  240. package/src/login/TemplateProps.ts +0 -1
  241. package/src/login/UserProfileFormFields.tsx +15 -11
  242. package/src/login/i18n/GenericI18n.tsx +6 -0
  243. package/src/login/i18n/i18n.tsx +91 -166
  244. package/src/login/i18n/index.ts +4 -3
  245. package/src/login/i18n/{baseMessages → messages_defaultSet}/index.ts +3 -3
  246. package/src/login/i18n/useI18n.tsx +95 -0
  247. package/src/login/lib/useUserProfileForm.tsx +68 -20
  248. package/src/login/pages/Error.tsx +1 -1
  249. package/src/login/pages/Info.tsx +26 -6
  250. package/src/login/pages/Login.tsx +20 -9
  251. package/src/login/pages/LoginConfigTotp.tsx +16 -6
  252. package/src/login/pages/LoginOtp.tsx +8 -3
  253. package/src/login/pages/LoginPassword.tsx +8 -3
  254. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +8 -3
  255. package/src/login/pages/LoginResetPassword.tsx +8 -3
  256. package/src/login/pages/LoginUpdatePassword.tsx +55 -47
  257. package/src/login/pages/Register.tsx +8 -3
  258. package/src/login/pages/SamlPostForm.tsx +1 -1
  259. package/src/login/pages/SelectAuthenticator.tsx +4 -4
  260. package/src/login/pages/WebauthnAuthenticate.tsx +5 -5
  261. package/src/login/pages/WebauthnRegister.tsx +2 -2
  262. package/src/tools/useInsertLinkTags.ts +9 -1
  263. package/src/tools/useInsertScriptTags.ts +9 -1
  264. package/src/vite-plugin/vite-plugin.ts +15 -13
  265. package/stories/account/pages/Log.stories.tsx +1 -0
  266. package/stories/account-spa/index.stories.tsx +94 -0
  267. package/stories/intro/intro.stories.tsx +90 -0
  268. package/stories/login/pages/Info.stories.tsx +7 -2
  269. package/stories/login/pages/Login.stories.tsx +25 -13
  270. package/stories/login/pages/Register.stories.tsx +11 -9
  271. package/stories/login/pages/SelectAuthenticator.stories.tsx +41 -0
  272. package/stories/login/pages/Terms.stories.tsx +6 -2
  273. package/tools/useInsertLinkTags.js +7 -1
  274. package/tools/useInsertLinkTags.js.map +1 -1
  275. package/tools/useInsertScriptTags.js +7 -1
  276. package/tools/useInsertScriptTags.js.map +1 -1
  277. package/vite-plugin/index.js +25820 -25686
  278. package/vite-plugin/vite-plugin.d.ts +6 -4
  279. package/account/i18n/baseMessages/ar.js.map +0 -1
  280. package/account/i18n/baseMessages/ca.js.map +0 -1
  281. package/account/i18n/baseMessages/cs.js.map +0 -1
  282. package/account/i18n/baseMessages/da.js.map +0 -1
  283. package/account/i18n/baseMessages/de.js.map +0 -1
  284. package/account/i18n/baseMessages/el.js.map +0 -1
  285. package/account/i18n/baseMessages/en.js.map +0 -1
  286. package/account/i18n/baseMessages/es.js.map +0 -1
  287. package/account/i18n/baseMessages/fa.js.map +0 -1
  288. package/account/i18n/baseMessages/fi.js.map +0 -1
  289. package/account/i18n/baseMessages/fr.js.map +0 -1
  290. package/account/i18n/baseMessages/hu.js.map +0 -1
  291. package/account/i18n/baseMessages/index.js.map +0 -1
  292. package/account/i18n/baseMessages/it.js.map +0 -1
  293. package/account/i18n/baseMessages/ja.js.map +0 -1
  294. package/account/i18n/baseMessages/lt.js.map +0 -1
  295. package/account/i18n/baseMessages/lv.js.map +0 -1
  296. package/account/i18n/baseMessages/nl.js.map +0 -1
  297. package/account/i18n/baseMessages/no.js.map +0 -1
  298. package/account/i18n/baseMessages/pl.js.map +0 -1
  299. package/account/i18n/baseMessages/pt-BR.js.map +0 -1
  300. package/account/i18n/baseMessages/ru.js.map +0 -1
  301. package/account/i18n/baseMessages/sk.js.map +0 -1
  302. package/account/i18n/baseMessages/sv.js.map +0 -1
  303. package/account/i18n/baseMessages/th.js.map +0 -1
  304. package/account/i18n/baseMessages/tr.js.map +0 -1
  305. package/account/i18n/baseMessages/uk.js.map +0 -1
  306. package/account/i18n/baseMessages/zh-CN.js.map +0 -1
  307. package/bin/538.index.js +0 -108
  308. package/login/i18n/baseMessages/ar.js.map +0 -1
  309. package/login/i18n/baseMessages/ca.js.map +0 -1
  310. package/login/i18n/baseMessages/cs.js.map +0 -1
  311. package/login/i18n/baseMessages/da.js.map +0 -1
  312. package/login/i18n/baseMessages/de.js.map +0 -1
  313. package/login/i18n/baseMessages/el.js.map +0 -1
  314. package/login/i18n/baseMessages/en.js.map +0 -1
  315. package/login/i18n/baseMessages/es.js.map +0 -1
  316. package/login/i18n/baseMessages/fa.js.map +0 -1
  317. package/login/i18n/baseMessages/fi.js.map +0 -1
  318. package/login/i18n/baseMessages/fr.js.map +0 -1
  319. package/login/i18n/baseMessages/hu.js.map +0 -1
  320. package/login/i18n/baseMessages/index.js.map +0 -1
  321. package/login/i18n/baseMessages/it.js.map +0 -1
  322. package/login/i18n/baseMessages/ja.js.map +0 -1
  323. package/login/i18n/baseMessages/lt.js.map +0 -1
  324. package/login/i18n/baseMessages/lv.js.map +0 -1
  325. package/login/i18n/baseMessages/nl.js.map +0 -1
  326. package/login/i18n/baseMessages/no.js.map +0 -1
  327. package/login/i18n/baseMessages/pl.js.map +0 -1
  328. package/login/i18n/baseMessages/pt-BR.js.map +0 -1
  329. package/login/i18n/baseMessages/ru.js.map +0 -1
  330. package/login/i18n/baseMessages/sk.js.map +0 -1
  331. package/login/i18n/baseMessages/sv.js.map +0 -1
  332. package/login/i18n/baseMessages/th.js.map +0 -1
  333. package/login/i18n/baseMessages/tr.js.map +0 -1
  334. package/login/i18n/baseMessages/uk.js.map +0 -1
  335. package/login/i18n/baseMessages/zh-CN.js.map +0 -1
  336. package/src/account/i18n/useI18n.ts +0 -44
  337. package/src/login/i18n/useI18n.ts +0 -44
  338. package/src/tools/ExtractAfterStartingWith.ts +0 -4
  339. package/tools/ExtractAfterStartingWith.d.ts +0 -1
  340. package/tools/ExtractAfterStartingWith.js +0 -2
  341. package/tools/ExtractAfterStartingWith.js.map +0 -1
  342. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  343. /package/account/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  344. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  345. /package/account/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  346. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  347. /package/account/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  348. /package/account/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  349. /package/account/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  350. /package/account/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  351. /package/account/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  352. /package/account/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  353. /package/account/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  354. /package/account/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  355. /package/account/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  356. /package/account/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  357. /package/account/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  358. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  359. /package/account/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  360. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  361. /package/account/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  362. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  363. /package/account/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  364. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  365. /package/account/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  366. /package/account/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  367. /package/account/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  368. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  369. /package/account/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  370. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  371. /package/account/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  372. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  373. /package/account/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  374. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  375. /package/account/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  376. /package/account/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  377. /package/account/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  378. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  379. /package/account/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  380. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  381. /package/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  382. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  383. /package/account/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  384. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  385. /package/account/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  386. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  387. /package/account/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  388. /package/account/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  389. /package/account/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  390. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  391. /package/account/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  392. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  393. /package/account/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  394. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  395. /package/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  396. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.d.ts +0 -0
  397. /package/login/i18n/{baseMessages → messages_defaultSet}/ar.js +0 -0
  398. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.d.ts +0 -0
  399. /package/login/i18n/{baseMessages → messages_defaultSet}/ca.js +0 -0
  400. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.d.ts +0 -0
  401. /package/login/i18n/{baseMessages → messages_defaultSet}/cs.js +0 -0
  402. /package/login/i18n/{baseMessages → messages_defaultSet}/da.d.ts +0 -0
  403. /package/login/i18n/{baseMessages → messages_defaultSet}/da.js +0 -0
  404. /package/login/i18n/{baseMessages → messages_defaultSet}/de.d.ts +0 -0
  405. /package/login/i18n/{baseMessages → messages_defaultSet}/de.js +0 -0
  406. /package/login/i18n/{baseMessages → messages_defaultSet}/el.d.ts +0 -0
  407. /package/login/i18n/{baseMessages → messages_defaultSet}/el.js +0 -0
  408. /package/login/i18n/{baseMessages → messages_defaultSet}/en.d.ts +0 -0
  409. /package/login/i18n/{baseMessages → messages_defaultSet}/en.js +0 -0
  410. /package/login/i18n/{baseMessages → messages_defaultSet}/es.d.ts +0 -0
  411. /package/login/i18n/{baseMessages → messages_defaultSet}/es.js +0 -0
  412. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.d.ts +0 -0
  413. /package/login/i18n/{baseMessages → messages_defaultSet}/fa.js +0 -0
  414. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.d.ts +0 -0
  415. /package/login/i18n/{baseMessages → messages_defaultSet}/fi.js +0 -0
  416. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.d.ts +0 -0
  417. /package/login/i18n/{baseMessages → messages_defaultSet}/fr.js +0 -0
  418. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.d.ts +0 -0
  419. /package/login/i18n/{baseMessages → messages_defaultSet}/hu.js +0 -0
  420. /package/login/i18n/{baseMessages → messages_defaultSet}/it.d.ts +0 -0
  421. /package/login/i18n/{baseMessages → messages_defaultSet}/it.js +0 -0
  422. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.d.ts +0 -0
  423. /package/login/i18n/{baseMessages → messages_defaultSet}/ja.js +0 -0
  424. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.d.ts +0 -0
  425. /package/login/i18n/{baseMessages → messages_defaultSet}/lt.js +0 -0
  426. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.d.ts +0 -0
  427. /package/login/i18n/{baseMessages → messages_defaultSet}/lv.js +0 -0
  428. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.d.ts +0 -0
  429. /package/login/i18n/{baseMessages → messages_defaultSet}/nl.js +0 -0
  430. /package/login/i18n/{baseMessages → messages_defaultSet}/no.d.ts +0 -0
  431. /package/login/i18n/{baseMessages → messages_defaultSet}/no.js +0 -0
  432. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.d.ts +0 -0
  433. /package/login/i18n/{baseMessages → messages_defaultSet}/pl.js +0 -0
  434. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.d.ts +0 -0
  435. /package/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.js +0 -0
  436. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.d.ts +0 -0
  437. /package/login/i18n/{baseMessages → messages_defaultSet}/ru.js +0 -0
  438. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.d.ts +0 -0
  439. /package/login/i18n/{baseMessages → messages_defaultSet}/sk.js +0 -0
  440. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.d.ts +0 -0
  441. /package/login/i18n/{baseMessages → messages_defaultSet}/sv.js +0 -0
  442. /package/login/i18n/{baseMessages → messages_defaultSet}/th.d.ts +0 -0
  443. /package/login/i18n/{baseMessages → messages_defaultSet}/th.js +0 -0
  444. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.d.ts +0 -0
  445. /package/login/i18n/{baseMessages → messages_defaultSet}/tr.js +0 -0
  446. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.d.ts +0 -0
  447. /package/login/i18n/{baseMessages → messages_defaultSet}/uk.js +0 -0
  448. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.d.ts +0 -0
  449. /package/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.js +0 -0
  450. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  451. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  452. /package/src/account/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  453. /package/src/account/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  454. /package/src/account/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  455. /package/src/account/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  456. /package/src/account/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  457. /package/src/account/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  458. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  459. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  460. /package/src/account/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  461. /package/src/account/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  462. /package/src/account/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  463. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  464. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  465. /package/src/account/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  466. /package/src/account/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  467. /package/src/account/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  468. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  469. /package/src/account/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  470. /package/src/account/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  471. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  472. /package/src/account/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  473. /package/src/account/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  474. /package/src/account/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  475. /package/src/account/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  476. /package/src/account/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
  477. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ar.ts +0 -0
  478. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ca.ts +0 -0
  479. /package/src/login/i18n/{baseMessages → messages_defaultSet}/cs.ts +0 -0
  480. /package/src/login/i18n/{baseMessages → messages_defaultSet}/da.ts +0 -0
  481. /package/src/login/i18n/{baseMessages → messages_defaultSet}/de.ts +0 -0
  482. /package/src/login/i18n/{baseMessages → messages_defaultSet}/el.ts +0 -0
  483. /package/src/login/i18n/{baseMessages → messages_defaultSet}/en.ts +0 -0
  484. /package/src/login/i18n/{baseMessages → messages_defaultSet}/es.ts +0 -0
  485. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fa.ts +0 -0
  486. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fi.ts +0 -0
  487. /package/src/login/i18n/{baseMessages → messages_defaultSet}/fr.ts +0 -0
  488. /package/src/login/i18n/{baseMessages → messages_defaultSet}/hu.ts +0 -0
  489. /package/src/login/i18n/{baseMessages → messages_defaultSet}/it.ts +0 -0
  490. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ja.ts +0 -0
  491. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lt.ts +0 -0
  492. /package/src/login/i18n/{baseMessages → messages_defaultSet}/lv.ts +0 -0
  493. /package/src/login/i18n/{baseMessages → messages_defaultSet}/nl.ts +0 -0
  494. /package/src/login/i18n/{baseMessages → messages_defaultSet}/no.ts +0 -0
  495. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pl.ts +0 -0
  496. /package/src/login/i18n/{baseMessages → messages_defaultSet}/pt-BR.ts +0 -0
  497. /package/src/login/i18n/{baseMessages → messages_defaultSet}/ru.ts +0 -0
  498. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sk.ts +0 -0
  499. /package/src/login/i18n/{baseMessages → messages_defaultSet}/sv.ts +0 -0
  500. /package/src/login/i18n/{baseMessages → messages_defaultSet}/th.ts +0 -0
  501. /package/src/login/i18n/{baseMessages → messages_defaultSet}/tr.ts +0 -0
  502. /package/src/login/i18n/{baseMessages → messages_defaultSet}/uk.ts +0 -0
  503. /package/src/login/i18n/{baseMessages → messages_defaultSet}/zh-CN.ts +0 -0
@@ -3,16 +3,21 @@
3
3
  import { getThisCodebaseRootDirPath } from "./tools/getThisCodebaseRootDirPath";
4
4
  import cliSelect from "cli-select";
5
5
  import {
6
- loginThemePageIds,
7
- accountThemePageIds,
6
+ LOGIN_THEME_PAGE_IDS,
7
+ ACCOUNT_THEME_PAGE_IDS,
8
8
  type LoginThemePageId,
9
9
  type AccountThemePageId,
10
- themeTypes,
10
+ THEME_TYPES,
11
11
  type ThemeType
12
12
  } from "./shared/constants";
13
13
  import { capitalize } from "tsafe/capitalize";
14
14
  import * as fs from "fs";
15
- import { join as pathJoin, relative as pathRelative, dirname as pathDirname } from "path";
15
+ import {
16
+ join as pathJoin,
17
+ relative as pathRelative,
18
+ dirname as pathDirname,
19
+ basename as pathBasename
20
+ } from "path";
16
21
  import { kebabCaseToCamelCase } from "./tools/kebabCaseToSnakeCase";
17
22
  import { assert, Equals } from "tsafe/assert";
18
23
  import type { CliCommandOptions } from "./main";
@@ -28,11 +33,114 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
28
33
 
29
34
  console.log(chalk.cyan("Theme type:"));
30
35
 
31
- const { value: themeType } = await cliSelect<ThemeType>({
32
- values: [...themeTypes]
33
- }).catch(() => {
34
- process.exit(-1);
35
- });
36
+ const themeType = await (async () => {
37
+ const values = THEME_TYPES.filter(themeType => {
38
+ switch (themeType) {
39
+ case "account":
40
+ return buildContext.implementedThemeTypes.account.isImplemented;
41
+ case "login":
42
+ return buildContext.implementedThemeTypes.login.isImplemented;
43
+ }
44
+ assert<Equals<typeof themeType, never>>(false);
45
+ });
46
+
47
+ assert(values.length > 0, "No theme is implemented in this project");
48
+
49
+ if (values.length === 1) {
50
+ return values[0];
51
+ }
52
+
53
+ const { value } = await cliSelect<ThemeType>({
54
+ values
55
+ }).catch(() => {
56
+ process.exit(-1);
57
+ });
58
+
59
+ return value;
60
+ })();
61
+
62
+ if (
63
+ themeType === "account" &&
64
+ (assert(buildContext.implementedThemeTypes.account.isImplemented),
65
+ buildContext.implementedThemeTypes.account.type === "Single-Page")
66
+ ) {
67
+ const srcDirPath = pathJoin(
68
+ pathDirname(buildContext.packageJsonFilePath),
69
+ "node_modules",
70
+ "@keycloakify",
71
+ "keycloak-account-ui",
72
+ "src"
73
+ );
74
+
75
+ console.log(
76
+ [
77
+ `There isn't an interactive CLI to eject components of the Single-Page Account theme.`,
78
+ `You can however copy paste into your codebase the any file or directory from the following source directory:`,
79
+ ``,
80
+ `${chalk.bold(pathJoin(pathRelative(process.cwd(), srcDirPath)))}`,
81
+ ``
82
+ ].join("\n")
83
+ );
84
+
85
+ eject_entrypoint: {
86
+ const kcAccountUiTsxFileRelativePath = "KcAccountUi.tsx";
87
+
88
+ const accountThemeSrcDirPath = pathJoin(
89
+ buildContext.themeSrcDirPath,
90
+ "account"
91
+ );
92
+
93
+ const targetFilePath = pathJoin(
94
+ accountThemeSrcDirPath,
95
+ kcAccountUiTsxFileRelativePath
96
+ );
97
+
98
+ if (fs.existsSync(targetFilePath)) {
99
+ break eject_entrypoint;
100
+ }
101
+
102
+ fs.cpSync(
103
+ pathJoin(srcDirPath, kcAccountUiTsxFileRelativePath),
104
+ targetFilePath
105
+ );
106
+
107
+ {
108
+ const kcPageTsxFilePath = pathJoin(accountThemeSrcDirPath, "KcPage.tsx");
109
+
110
+ const kcPageTsxCode = fs.readFileSync(kcPageTsxFilePath).toString("utf8");
111
+
112
+ const componentName = pathBasename(
113
+ kcAccountUiTsxFileRelativePath
114
+ ).replace(/.tsx$/, "");
115
+
116
+ const modifiedKcPageTsxCode = kcPageTsxCode.replace(
117
+ `@keycloakify/keycloak-account-ui/${componentName}`,
118
+ `./${componentName}`
119
+ );
120
+
121
+ fs.writeFileSync(
122
+ kcPageTsxFilePath,
123
+ Buffer.from(modifiedKcPageTsxCode, "utf8")
124
+ );
125
+ }
126
+
127
+ const routesTsxFilePath = pathRelative(
128
+ process.cwd(),
129
+ pathJoin(srcDirPath, "routes.tsx")
130
+ );
131
+
132
+ console.log(
133
+ [
134
+ `To help you get started ${chalk.bold(pathRelative(process.cwd(), targetFilePath))} has been copied into your project.`,
135
+ `The next step is usually to eject ${chalk.bold(routesTsxFilePath)}`,
136
+ `with \`cp ${routesTsxFilePath} ${pathRelative(process.cwd(), accountThemeSrcDirPath)}\``,
137
+ `then update the import of routes in ${kcAccountUiTsxFileRelativePath}.`
138
+ ].join("\n")
139
+ );
140
+ }
141
+
142
+ process.exit(0);
143
+ }
36
144
 
37
145
  console.log(`→ ${themeType}`);
38
146
 
@@ -54,10 +162,10 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
54
162
  return [
55
163
  templateValue,
56
164
  userProfileFormFieldsValue,
57
- ...loginThemePageIds
165
+ ...LOGIN_THEME_PAGE_IDS
58
166
  ];
59
167
  case "account":
60
- return [templateValue, ...accountThemePageIds];
168
+ return [templateValue, ...ACCOUNT_THEME_PAGE_IDS];
61
169
  }
62
170
  assert<Equals<typeof themeType, never>>(false);
63
171
  })()
@@ -0,0 +1,32 @@
1
+ import * as fs from "fs";
2
+ import { join as pathJoin } from "path";
3
+ import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath";
4
+ import { assert, type Equals } from "tsafe/assert";
5
+
6
+ export function copyBoilerplate(params: {
7
+ accountThemeType: "Single-Page" | "Multi-Page";
8
+ accountThemeSrcDirPath: string;
9
+ }) {
10
+ const { accountThemeType, accountThemeSrcDirPath } = params;
11
+
12
+ fs.cpSync(
13
+ pathJoin(
14
+ getThisCodebaseRootDirPath(),
15
+ "src",
16
+ "bin",
17
+ "initialize-account-theme",
18
+ "src",
19
+ (() => {
20
+ switch (accountThemeType) {
21
+ case "Single-Page":
22
+ return "single-page";
23
+ case "Multi-Page":
24
+ return "multi-page";
25
+ }
26
+ assert<Equals<typeof accountThemeType, never>>(false);
27
+ })()
28
+ ),
29
+ accountThemeSrcDirPath,
30
+ { recursive: true }
31
+ );
32
+ }
@@ -0,0 +1 @@
1
+ export * from "./initialize-account-theme";
@@ -0,0 +1,112 @@
1
+ import { getBuildContext } from "../shared/buildContext";
2
+ import type { CliCommandOptions } from "../main";
3
+ import cliSelect from "cli-select";
4
+ import child_process from "child_process";
5
+ import chalk from "chalk";
6
+ import { join as pathJoin, relative as pathRelative } from "path";
7
+ import * as fs from "fs";
8
+ import { updateAccountThemeImplementationInConfig } from "./updateAccountThemeImplementationInConfig";
9
+ import { generateKcGenTs } from "../shared/generateKcGenTs";
10
+
11
+ export async function command(params: { cliCommandOptions: CliCommandOptions }) {
12
+ const { cliCommandOptions } = params;
13
+
14
+ const buildContext = getBuildContext({ cliCommandOptions });
15
+
16
+ const accountThemeSrcDirPath = pathJoin(buildContext.themeSrcDirPath, "account");
17
+
18
+ if (
19
+ fs.existsSync(accountThemeSrcDirPath) &&
20
+ fs.readdirSync(accountThemeSrcDirPath).length > 0
21
+ ) {
22
+ console.warn(
23
+ chalk.red(
24
+ `There is already a ${pathRelative(
25
+ process.cwd(),
26
+ accountThemeSrcDirPath
27
+ )} directory in your project. Aborting.`
28
+ )
29
+ );
30
+
31
+ process.exit(-1);
32
+ }
33
+
34
+ exit_if_uncommitted_changes: {
35
+ let hasUncommittedChanges: boolean | undefined = undefined;
36
+
37
+ try {
38
+ hasUncommittedChanges =
39
+ child_process
40
+ .execSync(`git status --porcelain`, {
41
+ cwd: buildContext.projectDirPath
42
+ })
43
+ .toString()
44
+ .trim() !== "";
45
+ } catch {
46
+ // Probably not a git repository
47
+ break exit_if_uncommitted_changes;
48
+ }
49
+
50
+ if (!hasUncommittedChanges) {
51
+ break exit_if_uncommitted_changes;
52
+ }
53
+ console.warn(
54
+ [
55
+ chalk.red(
56
+ "Please commit or stash your changes before running this command.\n"
57
+ ),
58
+ "This command will modify your project's files so it's better to have a clean working directory",
59
+ "so that you can easily see what has been changed and revert if needed."
60
+ ].join(" ")
61
+ );
62
+
63
+ process.exit(-1);
64
+ }
65
+
66
+ const { value: accountThemeType } = await cliSelect({
67
+ values: ["Single-Page" as const, "Multi-Page" as const]
68
+ }).catch(() => {
69
+ process.exit(-1);
70
+ });
71
+
72
+ switch (accountThemeType) {
73
+ case "Multi-Page":
74
+ {
75
+ const { initializeAccountTheme_multiPage } = await import(
76
+ "./initializeAccountTheme_multiPage"
77
+ );
78
+
79
+ await initializeAccountTheme_multiPage({
80
+ accountThemeSrcDirPath
81
+ });
82
+ }
83
+ break;
84
+ case "Single-Page":
85
+ {
86
+ const { initializeAccountTheme_singlePage } = await import(
87
+ "./initializeAccountTheme_singlePage"
88
+ );
89
+
90
+ await initializeAccountTheme_singlePage({
91
+ accountThemeSrcDirPath,
92
+ buildContext
93
+ });
94
+ }
95
+ break;
96
+ }
97
+
98
+ updateAccountThemeImplementationInConfig({ buildContext, accountThemeType });
99
+
100
+ await generateKcGenTs({
101
+ buildContext: {
102
+ ...buildContext,
103
+ implementedThemeTypes: {
104
+ ...buildContext.implementedThemeTypes,
105
+ account: {
106
+ isImplemented: true,
107
+ type: accountThemeType
108
+ }
109
+ }
110
+ }
111
+ });
112
+ }
@@ -0,0 +1,21 @@
1
+ import { relative as pathRelative } from "path";
2
+ import chalk from "chalk";
3
+ import { copyBoilerplate } from "./copyBoilerplate";
4
+
5
+ export async function initializeAccountTheme_multiPage(params: {
6
+ accountThemeSrcDirPath: string;
7
+ }) {
8
+ const { accountThemeSrcDirPath } = params;
9
+
10
+ copyBoilerplate({
11
+ accountThemeType: "Multi-Page",
12
+ accountThemeSrcDirPath
13
+ });
14
+
15
+ console.log(
16
+ [
17
+ chalk.green("The Multi-Page account theme has been initialized."),
18
+ `Directory created: ${chalk.bold(pathRelative(process.cwd(), accountThemeSrcDirPath))}`
19
+ ].join("\n")
20
+ );
21
+ }
@@ -0,0 +1,152 @@
1
+ import { join as pathJoin, relative as pathRelative, dirname as pathDirname } from "path";
2
+ import type { BuildContext } from "../shared/buildContext";
3
+ import * as fs from "fs";
4
+ import chalk from "chalk";
5
+ import {
6
+ getLatestsSemVersionedTag,
7
+ type BuildContextLike as BuildContextLike_getLatestsSemVersionedTag
8
+ } from "../shared/getLatestsSemVersionedTag";
9
+ import fetch from "make-fetch-happen";
10
+ import { z } from "zod";
11
+ import { assert, type Equals } from "tsafe/assert";
12
+ import { is } from "tsafe/is";
13
+ import { id } from "tsafe/id";
14
+ import { npmInstall } from "../tools/npmInstall";
15
+ import { copyBoilerplate } from "./copyBoilerplate";
16
+ import { getThisCodebaseRootDirPath } from "../tools/getThisCodebaseRootDirPath";
17
+
18
+ type BuildContextLike = BuildContextLike_getLatestsSemVersionedTag & {
19
+ fetchOptions: BuildContext["fetchOptions"];
20
+ packageJsonFilePath: string;
21
+ };
22
+
23
+ assert<BuildContext extends BuildContextLike ? true : false>();
24
+
25
+ export async function initializeAccountTheme_singlePage(params: {
26
+ accountThemeSrcDirPath: string;
27
+ buildContext: BuildContextLike;
28
+ }) {
29
+ const { accountThemeSrcDirPath, buildContext } = params;
30
+
31
+ const OWNER = "keycloakify";
32
+ const REPO = "keycloak-account-ui";
33
+
34
+ const [semVersionedTag] = await getLatestsSemVersionedTag({
35
+ owner: OWNER,
36
+ repo: REPO,
37
+ count: 1,
38
+ doIgnoreReleaseCandidates: false,
39
+ buildContext
40
+ });
41
+
42
+ const dependencies = await fetch(
43
+ `https://raw.githubusercontent.com/${OWNER}/${REPO}/${semVersionedTag.tag}/dependencies.gen.json`,
44
+ buildContext.fetchOptions
45
+ )
46
+ .then(r => r.json())
47
+ .then(
48
+ (() => {
49
+ type Dependencies = {
50
+ dependencies: Record<string, string>;
51
+ devDependencies?: Record<string, string>;
52
+ };
53
+
54
+ const zDependencies = (() => {
55
+ type TargetType = Dependencies;
56
+
57
+ const zTargetType = z.object({
58
+ dependencies: z.record(z.string()),
59
+ devDependencies: z.record(z.string()).optional()
60
+ });
61
+
62
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
63
+
64
+ return id<z.ZodType<TargetType>>(zTargetType);
65
+ })();
66
+
67
+ return o => zDependencies.parse(o);
68
+ })()
69
+ );
70
+
71
+ dependencies.dependencies["@keycloakify/keycloak-account-ui"] = semVersionedTag.tag;
72
+
73
+ const parsedPackageJson = (() => {
74
+ type ParsedPackageJson = {
75
+ dependencies?: Record<string, string>;
76
+ devDependencies?: Record<string, string>;
77
+ };
78
+
79
+ const zParsedPackageJson = (() => {
80
+ type TargetType = ParsedPackageJson;
81
+
82
+ const zTargetType = z.object({
83
+ dependencies: z.record(z.string()).optional(),
84
+ devDependencies: z.record(z.string()).optional()
85
+ });
86
+
87
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
88
+
89
+ return id<z.ZodType<TargetType>>(zTargetType);
90
+ })();
91
+ const parsedPackageJson = JSON.parse(
92
+ fs.readFileSync(buildContext.packageJsonFilePath).toString("utf8")
93
+ );
94
+
95
+ zParsedPackageJson.parse(parsedPackageJson);
96
+
97
+ assert(is<ParsedPackageJson>(parsedPackageJson));
98
+
99
+ return parsedPackageJson;
100
+ })();
101
+
102
+ parsedPackageJson.dependencies = {
103
+ ...parsedPackageJson.dependencies,
104
+ ...dependencies.dependencies
105
+ };
106
+
107
+ parsedPackageJson.devDependencies = {
108
+ ...parsedPackageJson.devDependencies,
109
+ ...dependencies.devDependencies
110
+ };
111
+
112
+ if (Object.keys(parsedPackageJson.devDependencies).length === 0) {
113
+ delete parsedPackageJson.devDependencies;
114
+ }
115
+
116
+ fs.writeFileSync(
117
+ buildContext.packageJsonFilePath,
118
+ JSON.stringify(parsedPackageJson, undefined, 4)
119
+ );
120
+
121
+ run_npm_install: {
122
+ if (
123
+ JSON.parse(
124
+ fs
125
+ .readFileSync(pathJoin(getThisCodebaseRootDirPath(), "package.json"))
126
+ .toString("utf8")
127
+ )["version"] === "0.0.0"
128
+ ) {
129
+ //NOTE: Linked version
130
+ break run_npm_install;
131
+ }
132
+
133
+ npmInstall({ packageJsonDirPath: pathDirname(buildContext.packageJsonFilePath) });
134
+ }
135
+
136
+ copyBoilerplate({
137
+ accountThemeType: "Single-Page",
138
+ accountThemeSrcDirPath
139
+ });
140
+
141
+ console.log(
142
+ [
143
+ chalk.green(
144
+ "The Single-Page account theme has been successfully initialized."
145
+ ),
146
+ `Using Account UI of Keycloak version: ${chalk.bold(semVersionedTag.tag.split("-")[0])}`,
147
+ `Directory created: ${chalk.bold(pathRelative(process.cwd(), accountThemeSrcDirPath))}`,
148
+ `Dependencies added to your project's package.json: `,
149
+ chalk.bold(JSON.stringify(dependencies, null, 2))
150
+ ].join("\n")
151
+ );
152
+ }
@@ -0,0 +1,12 @@
1
+ /* eslint-disable @typescript-eslint/ban-types */
2
+ import type { ExtendKcContext } from "keycloakify/account";
3
+ import type { KcEnvName, ThemeName } from "../kc.gen";
4
+
5
+ export type KcContextExtension = {
6
+ themeName: ThemeName;
7
+ properties: Record<KcEnvName, string> & {};
8
+ };
9
+
10
+ export type KcContextExtensionPerPage = {};
11
+
12
+ export type KcContext = ExtendKcContext<KcContextExtension, KcContextExtensionPerPage>;
@@ -0,0 +1,25 @@
1
+ import { Suspense } from "react";
2
+ import type { ClassKey } from "keycloakify/account";
3
+ import type { KcContext } from "./KcContext";
4
+ import { useI18n } from "./i18n";
5
+ import DefaultPage from "keycloakify/account/DefaultPage";
6
+ import Template from "keycloakify/account/Template";
7
+
8
+ export default function KcPage(props: { kcContext: KcContext }) {
9
+ const { kcContext } = props;
10
+
11
+ const { i18n } = useI18n({ kcContext });
12
+
13
+ return (
14
+ <Suspense>
15
+ {(() => {
16
+ switch (kcContext.pageId) {
17
+ default:
18
+ return <DefaultPage kcContext={kcContext} i18n={i18n} classes={classes} Template={Template} doUseDefaultCss={true} />;
19
+ }
20
+ })()}
21
+ </Suspense>
22
+ );
23
+ }
24
+
25
+ const classes = {} satisfies { [key in ClassKey]?: string };
@@ -0,0 +1,38 @@
1
+ import type { DeepPartial } from "keycloakify/tools/DeepPartial";
2
+ import type { KcContext } from "./KcContext";
3
+ import { createGetKcContextMock } from "keycloakify/account/KcContext";
4
+ import type { KcContextExtension, KcContextExtensionPerPage } from "./KcContext";
5
+ import KcPage from "./KcPage";
6
+ import { themeNames, kcEnvDefaults } from "../kc.gen";
7
+
8
+ const kcContextExtension: KcContextExtension = {
9
+ themeName: themeNames[0],
10
+ properties: {
11
+ ...kcEnvDefaults
12
+ }
13
+ };
14
+ const kcContextExtensionPerPage: KcContextExtensionPerPage = {};
15
+
16
+ export const { getKcContextMock } = createGetKcContextMock({
17
+ kcContextExtension,
18
+ kcContextExtensionPerPage,
19
+ overrides: {},
20
+ overridesPerPage: {}
21
+ });
22
+
23
+ export function createKcPageStory<PageId extends KcContext["pageId"]>(params: { pageId: PageId }) {
24
+ const { pageId } = params;
25
+
26
+ function KcPageStory(props: { kcContext?: DeepPartial<Extract<KcContext, { pageId: PageId }>> }) {
27
+ const { kcContext: overrides } = props;
28
+
29
+ const kcContextMock = getKcContextMock({
30
+ pageId,
31
+ overrides
32
+ });
33
+
34
+ return <KcPage kcContext={kcContextMock} />;
35
+ }
36
+
37
+ return { KcPageStory };
38
+ }
@@ -0,0 +1,5 @@
1
+ import { createUseI18n } from "keycloakify/account";
2
+
3
+ export const { useI18n, ofTypeI18n } = createUseI18n({});
4
+
5
+ export type I18n = typeof ofTypeI18n;
@@ -0,0 +1,7 @@
1
+ import type { KcContextLike } from "@keycloakify/keycloak-account-ui";
2
+ import type { KcEnvName } from "../kc.gen";
3
+
4
+ export type KcContext = KcContextLike & {
5
+ themeType: "account";
6
+ properties: Record<KcEnvName, string>;
7
+ };
@@ -0,0 +1,11 @@
1
+ import { lazy } from "react";
2
+ import { KcAccountUiLoader } from "@keycloakify/keycloak-account-ui";
3
+ import type { KcContext } from "./KcContext";
4
+
5
+ const KcAccountUi = lazy(() => import("@keycloakify/keycloak-account-ui/KcAccountUi"));
6
+
7
+ export default function KcPage(props: { kcContext: KcContext }) {
8
+ const { kcContext } = props;
9
+
10
+ return <KcAccountUiLoader kcContext={kcContext} KcAccountUi={KcAccountUi} />;
11
+ }
@@ -0,0 +1,92 @@
1
+ import { join as pathJoin } from "path";
2
+ import { assert, type Equals } from "tsafe/assert";
3
+ import type { BuildContext } from "../shared/buildContext";
4
+ import * as fs from "fs";
5
+ import chalk from "chalk";
6
+ import { z } from "zod";
7
+ import { id } from "tsafe/id";
8
+
9
+ export type BuildContextLike = {
10
+ bundler: BuildContext["bundler"];
11
+ };
12
+
13
+ assert<BuildContext extends BuildContextLike ? true : false>();
14
+
15
+ export function updateAccountThemeImplementationInConfig(params: {
16
+ buildContext: BuildContext;
17
+ accountThemeType: "Single-Page" | "Multi-Page";
18
+ }) {
19
+ const { buildContext, accountThemeType } = params;
20
+
21
+ switch (buildContext.bundler) {
22
+ case "vite":
23
+ {
24
+ const viteConfigPath = pathJoin(
25
+ buildContext.projectDirPath,
26
+ "vite.config.ts"
27
+ );
28
+
29
+ if (!fs.existsSync(viteConfigPath)) {
30
+ console.log(
31
+ chalk.bold(
32
+ `You must manually set the accountThemeImplementation to "${accountThemeType}" in your vite config`
33
+ )
34
+ );
35
+ break;
36
+ }
37
+
38
+ const viteConfigContent = fs
39
+ .readFileSync(viteConfigPath)
40
+ .toString("utf8");
41
+
42
+ const modifiedViteConfigContent = viteConfigContent.replace(
43
+ /accountThemeImplementation\s*:\s*"none"/,
44
+ `accountThemeImplementation: "${accountThemeType}"`
45
+ );
46
+
47
+ if (modifiedViteConfigContent === viteConfigContent) {
48
+ console.log(
49
+ chalk.bold(
50
+ `You must manually set the accountThemeImplementation to "${accountThemeType}" in your vite.config.ts`
51
+ )
52
+ );
53
+ break;
54
+ }
55
+
56
+ fs.writeFileSync(viteConfigPath, modifiedViteConfigContent);
57
+ }
58
+ break;
59
+ case "webpack":
60
+ {
61
+ const parsedPackageJson = (() => {
62
+ type ParsedPackageJson = {
63
+ keycloakify: Record<string, string>;
64
+ };
65
+
66
+ const zParsedPackageJson = (() => {
67
+ type TargetType = ParsedPackageJson;
68
+
69
+ const zTargetType = z.object({
70
+ keycloakify: z.record(z.string())
71
+ });
72
+
73
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
74
+
75
+ return id<z.ZodType<TargetType>>(zTargetType);
76
+ })();
77
+
78
+ return zParsedPackageJson.parse(
79
+ JSON.parse(
80
+ fs
81
+ .readFileSync(buildContext.packageJsonFilePath)
82
+ .toString("utf8")
83
+ )
84
+ );
85
+ })();
86
+
87
+ parsedPackageJson.keycloakify.accountThemeImplementation =
88
+ accountThemeType;
89
+ }
90
+ break;
91
+ }
92
+ }
@@ -30,7 +30,7 @@ export async function command(params: { cliCommandOptions: CliCommandOptions })
30
30
  // NOTE: This is arbitrary
31
31
  startingFromMajor: 17,
32
32
  excludeMajorVersions: [],
33
- cacheDirPath: buildContext.cacheDirPath
33
+ buildContext
34
34
  });
35
35
 
36
36
  const { defaultThemeDirPath } = await downloadKeycloakDefaultTheme({