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
@@ -13,18 +13,17 @@ import * as fs from "fs";
13
13
  import { assert, type Equals } from "tsafe/assert";
14
14
  import * as child_process from "child_process";
15
15
  import {
16
- vitePluginSubScriptEnvNames,
17
- buildForKeycloakMajorVersionEnvName
16
+ VITE_PLUGIN_SUB_SCRIPTS_ENV_NAMES,
17
+ BUILD_FOR_KEYCLOAK_MAJOR_VERSION_ENV_NAME,
18
+ LOGIN_THEME_RESOURCES_FROMkEYCLOAK_VERSION_DEFAULT
18
19
  } from "./constants";
19
20
  import type { KeycloakVersionRange } from "./KeycloakVersionRange";
20
21
  import { exclude } from "tsafe";
21
22
  import { crawl } from "../tools/crawl";
22
- import { themeTypes } from "./constants";
23
- import { objectFromEntries } from "tsafe/objectFromEntries";
23
+ import { THEME_TYPES } from "./constants";
24
24
  import { objectEntries } from "tsafe/objectEntries";
25
25
  import { type ThemeType } from "./constants";
26
26
  import { id } from "tsafe/id";
27
- import { symToStr } from "tsafe/symToStr";
28
27
  import chalk from "chalk";
29
28
  import { getProxyFetchOptions, type ProxyFetchOptions } from "../tools/fetchProxyOptions";
30
29
 
@@ -49,22 +48,36 @@ export type BuildContext = {
49
48
  kcContextExclusionsFtlCode: string | undefined;
50
49
  environmentVariables: { name: string; default: string }[];
51
50
  themeSrcDirPath: string;
52
- recordIsImplementedByThemeType: Readonly<Record<ThemeType | "email", boolean>>;
51
+ implementedThemeTypes: {
52
+ login: { isImplemented: boolean };
53
+ email: { isImplemented: boolean };
54
+ account:
55
+ | { isImplemented: false }
56
+ | { isImplemented: true; type: "Single-Page" | "Multi-Page" };
57
+ };
58
+ packageJsonFilePath: string;
59
+ bundler: "vite" | "webpack";
53
60
  jarTargets: {
54
61
  keycloakVersionRange: KeycloakVersionRange;
55
62
  jarFileBasename: string;
56
63
  }[];
57
- bundler:
58
- | {
59
- type: "vite";
60
- }
61
- | {
62
- type: "webpack";
63
- packageJsonDirPath: string;
64
- packageJsonScripts: Record<string, string>;
65
- };
64
+ startKeycloakOptions: {
65
+ dockerImage:
66
+ | {
67
+ reference: string;
68
+ tag: string;
69
+ }
70
+ | undefined;
71
+ dockerExtraArgs: string[];
72
+ keycloakExtraArgs: string[];
73
+ extensionJars: ({ type: "path"; path: string } | { type: "url"; url: string })[];
74
+ realmJsonFilePath: string | undefined;
75
+ port: number | undefined;
76
+ };
66
77
  };
67
78
 
79
+ assert<Equals<keyof BuildContext["implementedThemeTypes"], ThemeType | "email">>();
80
+
68
81
  export type BuildOptions = {
69
82
  themeName?: string | string[];
70
83
  themeVersion?: string;
@@ -75,20 +88,38 @@ export type BuildOptions = {
75
88
  loginThemeResourcesFromKeycloakVersion?: string;
76
89
  keycloakifyBuildDirPath?: string;
77
90
  kcContextExclusionsFtl?: string;
78
- /** https://docs.keycloakify.dev/v/v10/targetting-specific-keycloak-versions */
79
- keycloakVersionTargets?: BuildOptions.KeycloakVersionTargets;
80
- };
91
+ startKeycloakOptions?: {
92
+ dockerImage?: string;
93
+ dockerExtraArgs?: string[];
94
+ keycloakExtraArgs?: string[];
95
+ extensionJars?: string[];
96
+ realmJsonFilePath?: string;
97
+ port?: number;
98
+ };
99
+ } & BuildOptions.AccountThemeImplAndKeycloakVersionTargets;
81
100
 
82
101
  export namespace BuildOptions {
83
- export type KeycloakVersionTargets =
84
- | ({ hasAccountTheme: true } & Record<
85
- KeycloakVersionRange.WithAccountTheme,
86
- string | boolean
87
- >)
88
- | ({ hasAccountTheme: false } & Record<
89
- KeycloakVersionRange.WithoutAccountTheme,
90
- string | boolean
91
- >);
102
+ export type AccountThemeImplAndKeycloakVersionTargets =
103
+ | AccountThemeImplAndKeycloakVersionTargets.MultiPageApp
104
+ | AccountThemeImplAndKeycloakVersionTargets.SinglePageAppOrNone;
105
+
106
+ export namespace AccountThemeImplAndKeycloakVersionTargets {
107
+ export type MultiPageApp = {
108
+ accountThemeImplementation: "Multi-Page";
109
+ keycloakVersionTargets?: Record<
110
+ KeycloakVersionRange.WithAccountV1Theme,
111
+ string | boolean
112
+ >;
113
+ };
114
+
115
+ export type SinglePageAppOrNone = {
116
+ accountThemeImplementation: "Single-Page" | "none";
117
+ keycloakVersionTargets?: Record<
118
+ KeycloakVersionRange.WithoutAccountV1Theme,
119
+ string | boolean
120
+ >;
121
+ };
122
+ }
92
123
  }
93
124
 
94
125
  export type ResolvedViteConfig = {
@@ -134,7 +165,7 @@ export function getBuildContext(params: {
134
165
  return { themeSrcDirPath };
135
166
  }
136
167
 
137
- for (const themeType of [...themeTypes, "email"]) {
168
+ for (const themeType of [...THEME_TYPES, "email"]) {
138
169
  if (!fs.existsSync(pathJoin(srcDirPath, themeType))) {
139
170
  continue;
140
171
  }
@@ -169,18 +200,18 @@ export function getBuildContext(params: {
169
200
  cwd: projectDirPath,
170
201
  env: {
171
202
  ...process.env,
172
- [vitePluginSubScriptEnvNames.resolveViteConfig]: "true"
203
+ [VITE_PLUGIN_SUB_SCRIPTS_ENV_NAMES.RESOLVE_VITE_CONFIG]: "true"
173
204
  }
174
205
  })
175
206
  .toString("utf8");
176
207
 
177
208
  assert(
178
- output.includes(vitePluginSubScriptEnvNames.resolveViteConfig),
209
+ output.includes(VITE_PLUGIN_SUB_SCRIPTS_ENV_NAMES.RESOLVE_VITE_CONFIG),
179
210
  "Seems like the Keycloakify's Vite plugin is not installed."
180
211
  );
181
212
 
182
213
  const resolvedViteConfigStr = output
183
- .split(vitePluginSubScriptEnvNames.resolveViteConfig)
214
+ .split(VITE_PLUGIN_SUB_SCRIPTS_ENV_NAMES.RESOLVE_VITE_CONFIG)
184
215
  .reverse()[0];
185
216
 
186
217
  const resolvedViteConfig: ResolvedViteConfig = JSON.parse(resolvedViteConfigStr);
@@ -238,84 +269,138 @@ export function getBuildContext(params: {
238
269
  keycloakify?: BuildOptions_packageJson;
239
270
  };
240
271
 
241
- const zParsedPackageJson = z.object({
242
- name: z.string().optional(),
243
- version: z.string().optional(),
244
- homepage: z.string().optional(),
245
- keycloakify: id<z.ZodType<BuildOptions_packageJson>>(
246
- (() => {
247
- const zBuildOptions_packageJson = z.object({
248
- extraThemeProperties: z.array(z.string()).optional(),
249
- artifactId: z.string().optional(),
250
- groupId: z.string().optional(),
251
- loginThemeResourcesFromKeycloakVersion: z.string().optional(),
252
- projectBuildDirPath: z.string().optional(),
253
- keycloakifyBuildDirPath: z.string().optional(),
254
- kcContextExclusionsFtl: z.string().optional(),
255
- environmentVariables: z
256
- .array(
257
- z.object({
258
- name: z.string(),
259
- default: z.string()
260
- })
261
- )
262
- .optional(),
263
- themeName: z.union([z.string(), z.array(z.string())]).optional(),
264
- themeVersion: z.string().optional(),
265
- staticDirPathInProjectBuildDirPath: z.string().optional(),
266
- publicDirPath: z.string().optional(),
267
- keycloakVersionTargets: id<
268
- z.ZodType<BuildOptions.KeycloakVersionTargets>
269
- >(
270
- (() => {
271
- const zKeycloakVersionTargets = z.union([
272
- z.object({
273
- hasAccountTheme: z.literal(true),
274
- "21-and-below": z.union([
275
- z.boolean(),
276
- z.string()
277
- ]),
278
- "23": z.union([z.boolean(), z.string()]),
279
- "24": z.union([z.boolean(), z.string()]),
280
- "25-and-above": z.union([z.boolean(), z.string()])
281
- }),
282
- z.object({
283
- hasAccountTheme: z.literal(false),
284
- "21-and-below": z.union([
285
- z.boolean(),
286
- z.string()
287
- ]),
288
- "22-and-above": z.union([z.boolean(), z.string()])
289
- })
290
- ]);
291
-
292
- {
293
- type Got = z.infer<typeof zKeycloakVersionTargets>;
294
- type Expected = BuildOptions.KeycloakVersionTargets;
295
- assert<Equals<Got, Expected>>();
296
- }
297
-
298
- return zKeycloakVersionTargets;
299
- })()
300
- ).optional()
301
- });
272
+ const zMultiPageApp = (() => {
273
+ type TargetType =
274
+ BuildOptions.AccountThemeImplAndKeycloakVersionTargets.MultiPageApp;
275
+
276
+ const zTargetType = z.object({
277
+ accountThemeImplementation: z.literal("Multi-Page"),
278
+ keycloakVersionTargets: z
279
+ .object({
280
+ "21-and-below": z.union([z.boolean(), z.string()]),
281
+ "23": z.union([z.boolean(), z.string()]),
282
+ "24": z.union([z.boolean(), z.string()]),
283
+ "25-and-above": z.union([z.boolean(), z.string()])
284
+ })
285
+ .optional()
286
+ });
287
+
288
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
289
+
290
+ return id<z.ZodType<TargetType>>(zTargetType);
291
+ })();
302
292
 
303
- {
304
- type Got = z.infer<typeof zBuildOptions_packageJson>;
305
- type Expected = BuildOptions_packageJson;
306
- assert<Equals<Got, Expected>>();
307
- }
293
+ const zSinglePageApp = (() => {
294
+ type TargetType =
295
+ BuildOptions.AccountThemeImplAndKeycloakVersionTargets.SinglePageAppOrNone;
296
+
297
+ const zTargetType = z.object({
298
+ accountThemeImplementation: z.union([
299
+ z.literal("Single-Page"),
300
+ z.literal("none")
301
+ ]),
302
+ keycloakVersionTargets: z
303
+ .object({
304
+ "21-and-below": z.union([z.boolean(), z.string()]),
305
+ "22-and-above": z.union([z.boolean(), z.string()])
306
+ })
307
+ .optional()
308
+ });
309
+
310
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
311
+
312
+ return id<z.ZodType<TargetType>>(zTargetType);
313
+ })();
308
314
 
309
- return zBuildOptions_packageJson;
310
- })()
311
- ).optional()
312
- });
315
+ const zAccountThemeImplAndKeycloakVersionTargets = (() => {
316
+ type TargetType = BuildOptions.AccountThemeImplAndKeycloakVersionTargets;
313
317
 
314
- {
315
- type Got = z.infer<typeof zParsedPackageJson>;
316
- type Expected = ParsedPackageJson;
317
- assert<Equals<Got, Expected>>();
318
- }
318
+ const zTargetType = z.union([zMultiPageApp, zSinglePageApp]);
319
+
320
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
321
+
322
+ return id<z.ZodType<TargetType>>(zTargetType);
323
+ })();
324
+
325
+ const zStartKeycloakOptions = (() => {
326
+ type TargetType = NonNullable<BuildOptions["startKeycloakOptions"]>;
327
+
328
+ const zTargetType = z.object({
329
+ dockerImage: z.string().optional(),
330
+ extensionJars: z.array(z.string()).optional(),
331
+ realmJsonFilePath: z.string().optional(),
332
+ dockerExtraArgs: z.array(z.string()).optional(),
333
+ keycloakExtraArgs: z.array(z.string()).optional(),
334
+ port: z.number().optional()
335
+ });
336
+
337
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
338
+
339
+ return id<z.ZodType<TargetType>>(zTargetType);
340
+ })();
341
+
342
+ const zBuildOptions = (() => {
343
+ type TargetType = BuildOptions;
344
+
345
+ const zTargetType = z.intersection(
346
+ z.object({
347
+ themeName: z.union([z.string(), z.array(z.string())]).optional(),
348
+ themeVersion: z.string().optional(),
349
+ environmentVariables: z
350
+ .array(
351
+ z.object({
352
+ name: z.string(),
353
+ default: z.string()
354
+ })
355
+ )
356
+ .optional(),
357
+ extraThemeProperties: z.array(z.string()).optional(),
358
+ artifactId: z.string().optional(),
359
+ groupId: z.string().optional(),
360
+ loginThemeResourcesFromKeycloakVersion: z.string().optional(),
361
+ keycloakifyBuildDirPath: z.string().optional(),
362
+ kcContextExclusionsFtl: z.string().optional(),
363
+ startKeycloakOptions: zStartKeycloakOptions.optional()
364
+ }),
365
+ zAccountThemeImplAndKeycloakVersionTargets
366
+ );
367
+
368
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
369
+
370
+ return id<z.ZodType<TargetType>>(zTargetType);
371
+ })();
372
+
373
+ const zBuildOptions_packageJson = (() => {
374
+ type TargetType = BuildOptions_packageJson;
375
+
376
+ const zTargetType = z.intersection(
377
+ zBuildOptions,
378
+ z.object({
379
+ projectBuildDirPath: z.string().optional(),
380
+ staticDirPathInProjectBuildDirPath: z.string().optional(),
381
+ publicDirPath: z.string().optional()
382
+ })
383
+ );
384
+
385
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
386
+
387
+ return id<z.ZodType<TargetType>>(zTargetType);
388
+ })();
389
+
390
+ const zParsedPackageJson = (() => {
391
+ type TargetType = ParsedPackageJson;
392
+
393
+ const zTargetType = z.object({
394
+ name: z.string().optional(),
395
+ version: z.string().optional(),
396
+ homepage: z.string().optional(),
397
+ keycloakify: zBuildOptions_packageJson.optional()
398
+ });
399
+
400
+ assert<Equals<z.infer<typeof zTargetType>, TargetType>>();
401
+
402
+ return id<z.ZodType<TargetType>>(zTargetType);
403
+ })();
319
404
 
320
405
  const configurationPackageJsonFilePath = (() => {
321
406
  const rootPackageJsonFilePath = pathJoin(projectDirPath, "package.json");
@@ -330,17 +415,63 @@ export function getBuildContext(params: {
330
415
  );
331
416
  })();
332
417
 
333
- const buildOptions = {
334
- ...parsedPackageJson.keycloakify,
335
- ...resolvedViteConfig?.buildOptions
418
+ const bundler = resolvedViteConfig !== undefined ? "vite" : "webpack";
419
+
420
+ if (bundler === "vite" && parsedPackageJson.keycloakify !== undefined) {
421
+ console.error(
422
+ chalk.red(
423
+ `In vite projects, provide your Keycloakify options in vite.config.ts, not in package.json`
424
+ )
425
+ );
426
+ process.exit(-1);
427
+ }
428
+
429
+ const buildOptions: BuildOptions = (() => {
430
+ switch (bundler) {
431
+ case "vite":
432
+ assert(resolvedViteConfig !== undefined);
433
+ return resolvedViteConfig.buildOptions;
434
+ case "webpack":
435
+ assert(parsedPackageJson.keycloakify !== undefined);
436
+ return parsedPackageJson.keycloakify;
437
+ }
438
+ assert<Equals<typeof bundler, never>>(false);
439
+ })();
440
+
441
+ const implementedThemeTypes: BuildContext["implementedThemeTypes"] = {
442
+ login: {
443
+ isImplemented: fs.existsSync(pathJoin(themeSrcDirPath, "login"))
444
+ },
445
+ email: {
446
+ isImplemented: fs.existsSync(pathJoin(themeSrcDirPath, "email"))
447
+ },
448
+ account: (() => {
449
+ if (buildOptions.accountThemeImplementation === "none") {
450
+ return { isImplemented: false };
451
+ }
452
+
453
+ return {
454
+ isImplemented: true,
455
+ type: buildOptions.accountThemeImplementation
456
+ };
457
+ })()
336
458
  };
337
459
 
338
- const recordIsImplementedByThemeType = objectFromEntries(
339
- (["login", "account", "email"] as const).map(themeType => [
340
- themeType,
341
- fs.existsSync(pathJoin(themeSrcDirPath, themeType))
342
- ])
343
- );
460
+ if (
461
+ implementedThemeTypes.account.isImplemented &&
462
+ !fs.existsSync(pathJoin(themeSrcDirPath, "account"))
463
+ ) {
464
+ console.error(
465
+ chalk.red(
466
+ [
467
+ `You have set 'accountThemeImplementation' to '${implementedThemeTypes.account.type}'`,
468
+ `but the 'account' directory is missing in your theme source directory`,
469
+ "Use the `npx keycloakify initialize-account-theme` command to create it"
470
+ ].join(" ")
471
+ )
472
+ );
473
+ process.exit(-1);
474
+ }
344
475
 
345
476
  const themeNames = ((): [string, ...string[]] => {
346
477
  if (buildOptions.themeName === undefined) {
@@ -367,13 +498,15 @@ export function getBuildContext(params: {
367
498
 
368
499
  const projectBuildDirPath = (() => {
369
500
  webpack: {
370
- if (resolvedViteConfig !== undefined) {
501
+ if (bundler !== "webpack") {
371
502
  break webpack;
372
503
  }
373
504
 
374
- if (buildOptions.projectBuildDirPath !== undefined) {
505
+ assert(parsedPackageJson.keycloakify !== undefined);
506
+
507
+ if (parsedPackageJson.keycloakify.projectBuildDirPath !== undefined) {
375
508
  return getAbsoluteAndInOsFormatPath({
376
- pathIsh: buildOptions.projectBuildDirPath,
509
+ pathIsh: parsedPackageJson.keycloakify.projectBuildDirPath,
377
510
  cwd: projectDirPath
378
511
  });
379
512
  }
@@ -381,32 +514,15 @@ export function getBuildContext(params: {
381
514
  return pathJoin(projectDirPath, "build");
382
515
  }
383
516
 
517
+ assert(bundler === "vite");
518
+ assert(resolvedViteConfig !== undefined);
519
+
384
520
  return pathJoin(projectDirPath, resolvedViteConfig.buildDir);
385
521
  })();
386
522
 
387
- const bundler = resolvedViteConfig !== undefined ? "vite" : "webpack";
388
-
389
523
  return {
390
- bundler:
391
- resolvedViteConfig !== undefined
392
- ? { type: "vite" }
393
- : (() => {
394
- const { scripts } = z
395
- .object({
396
- scripts: z.record(z.string()).optional()
397
- })
398
- .parse(
399
- JSON.parse(
400
- fs.readFileSync(packageJsonFilePath).toString("utf8")
401
- )
402
- );
403
-
404
- return {
405
- type: "webpack",
406
- packageJsonDirPath: pathDirname(packageJsonFilePath),
407
- packageJsonScripts: scripts ?? {}
408
- };
409
- })(),
524
+ bundler,
525
+ packageJsonFilePath,
410
526
  themeVersion: buildOptions.themeVersion ?? parsedPackageJson.version ?? "0.0.0",
411
527
  themeNames,
412
528
  extraThemeProperties: buildOptions.extraThemeProperties,
@@ -430,7 +546,8 @@ export function getBuildContext(params: {
430
546
  buildOptions.artifactId ??
431
547
  `${themeNames[0]}-keycloak-theme`,
432
548
  loginThemeResourcesFromKeycloakVersion:
433
- buildOptions.loginThemeResourcesFromKeycloakVersion ?? "24.0.4",
549
+ buildOptions.loginThemeResourcesFromKeycloakVersion ??
550
+ LOGIN_THEME_RESOURCES_FROMkEYCLOAK_VERSION_DEFAULT,
434
551
  projectDirPath,
435
552
  projectBuildDirPath,
436
553
  keycloakifyBuildDirPath: (() => {
@@ -457,13 +574,15 @@ export function getBuildContext(params: {
457
574
  }
458
575
 
459
576
  webpack: {
460
- if (resolvedViteConfig !== undefined) {
577
+ if (bundler !== "webpack") {
461
578
  break webpack;
462
579
  }
463
580
 
464
- if (buildOptions.publicDirPath !== undefined) {
581
+ assert(parsedPackageJson.keycloakify !== undefined);
582
+
583
+ if (parsedPackageJson.keycloakify.publicDirPath !== undefined) {
465
584
  return getAbsoluteAndInOsFormatPath({
466
- pathIsh: buildOptions.publicDirPath,
585
+ pathIsh: parsedPackageJson.keycloakify.publicDirPath,
467
586
  cwd: projectDirPath
468
587
  });
469
588
  }
@@ -471,32 +590,31 @@ export function getBuildContext(params: {
471
590
  return pathJoin(projectDirPath, "public");
472
591
  }
473
592
 
593
+ assert(bundler === "vite");
594
+ assert(resolvedViteConfig !== undefined);
595
+
474
596
  return pathJoin(projectDirPath, resolvedViteConfig.publicDir);
475
597
  })(),
476
- cacheDirPath: (() => {
477
- const cacheDirPath = pathJoin(
478
- (() => {
479
- if (process.env.XDG_CACHE_HOME !== undefined) {
480
- return getAbsoluteAndInOsFormatPath({
481
- pathIsh: process.env.XDG_CACHE_HOME,
482
- cwd: process.cwd()
483
- });
484
- }
485
-
486
- return pathJoin(
487
- pathDirname(packageJsonFilePath),
488
- "node_modules",
489
- ".cache"
490
- );
491
- })(),
492
- "keycloakify"
493
- );
598
+ cacheDirPath: pathJoin(
599
+ (() => {
600
+ if (process.env.XDG_CACHE_HOME !== undefined) {
601
+ return getAbsoluteAndInOsFormatPath({
602
+ pathIsh: process.env.XDG_CACHE_HOME,
603
+ cwd: process.cwd()
604
+ });
605
+ }
494
606
 
495
- return cacheDirPath;
496
- })(),
607
+ return pathJoin(
608
+ pathDirname(packageJsonFilePath),
609
+ "node_modules",
610
+ ".cache"
611
+ );
612
+ })(),
613
+ "keycloakify"
614
+ ),
497
615
  urlPathname: (() => {
498
616
  webpack: {
499
- if (resolvedViteConfig !== undefined) {
617
+ if (bundler !== "webpack") {
500
618
  break webpack;
501
619
  }
502
620
 
@@ -516,23 +634,35 @@ export function getBuildContext(params: {
516
634
  return out === "/" ? undefined : out;
517
635
  }
518
636
 
637
+ assert(bundler === "vite");
638
+ assert(resolvedViteConfig !== undefined);
639
+
519
640
  return resolvedViteConfig.urlPathname;
520
641
  })(),
521
642
  assetsDirPath: (() => {
522
643
  webpack: {
523
- if (resolvedViteConfig !== undefined) {
644
+ if (bundler !== "webpack") {
524
645
  break webpack;
525
646
  }
526
647
 
527
- if (buildOptions.staticDirPathInProjectBuildDirPath !== undefined) {
648
+ assert(parsedPackageJson.keycloakify !== undefined);
649
+
650
+ if (
651
+ parsedPackageJson.keycloakify.staticDirPathInProjectBuildDirPath !==
652
+ undefined
653
+ ) {
528
654
  getAbsoluteAndInOsFormatPath({
529
- pathIsh: buildOptions.staticDirPathInProjectBuildDirPath,
655
+ pathIsh:
656
+ parsedPackageJson.keycloakify
657
+ .staticDirPathInProjectBuildDirPath,
530
658
  cwd: projectBuildDirPath
531
659
  });
532
660
  }
533
661
 
534
662
  return pathJoin(projectBuildDirPath, "static");
535
663
  }
664
+ assert(bundler === "vite");
665
+ assert(resolvedViteConfig !== undefined);
536
666
 
537
667
  return pathJoin(projectBuildDirPath, resolvedViteConfig.assetsDir);
538
668
  })(),
@@ -553,7 +683,7 @@ export function getBuildContext(params: {
553
683
  return buildOptions.kcContextExclusionsFtl;
554
684
  })(),
555
685
  environmentVariables: buildOptions.environmentVariables ?? [],
556
- recordIsImplementedByThemeType,
686
+ implementedThemeTypes,
557
687
  themeSrcDirPath,
558
688
  fetchOptions: getProxyFetchOptions({
559
689
  npmConfigGetCwd: (function callee(upCount: number): string {
@@ -569,7 +699,7 @@ export function getBuildContext(params: {
569
699
  try {
570
700
  child_process.execSync("npm config get", {
571
701
  cwd: dirPath,
572
- stdio: "ignore"
702
+ stdio: "pipe"
573
703
  });
574
704
  } catch (error) {
575
705
  if (String(error).includes("ENOWORKSPACES")) {
@@ -588,7 +718,8 @@ export function getBuildContext(params: {
588
718
 
589
719
  build_for_specific_keycloak_major_version: {
590
720
  const buildForKeycloakMajorVersionNumber = (() => {
591
- const envValue = process.env[buildForKeycloakMajorVersionEnvName];
721
+ const envValue =
722
+ process.env[BUILD_FOR_KEYCLOAK_MAJOR_VERSION_ENV_NAME];
592
723
 
593
724
  if (envValue === undefined) {
594
725
  return undefined;
@@ -606,10 +737,10 @@ export function getBuildContext(params: {
606
737
  }
607
738
 
608
739
  const keycloakVersionRange: KeycloakVersionRange = (() => {
609
- const doesImplementAccountTheme =
610
- recordIsImplementedByThemeType.account;
611
-
612
- if (doesImplementAccountTheme) {
740
+ if (
741
+ implementedThemeTypes.account.isImplemented &&
742
+ implementedThemeTypes.account.type === "Multi-Page"
743
+ ) {
613
744
  const keycloakVersionRange = (() => {
614
745
  if (buildForKeycloakMajorVersionNumber <= 21) {
615
746
  return "21-and-below" as const;
@@ -631,7 +762,7 @@ export function getBuildContext(params: {
631
762
  assert<
632
763
  Equals<
633
764
  typeof keycloakVersionRange,
634
- KeycloakVersionRange.WithAccountTheme
765
+ KeycloakVersionRange.WithAccountV1Theme
635
766
  >
636
767
  >();
637
768
 
@@ -648,7 +779,7 @@ export function getBuildContext(params: {
648
779
  assert<
649
780
  Equals<
650
781
  typeof keycloakVersionRange,
651
- KeycloakVersionRange.WithoutAccountTheme
782
+ KeycloakVersionRange.WithoutAccountV1Theme
652
783
  >
653
784
  >();
654
785
 
@@ -696,7 +827,10 @@ export function getBuildContext(params: {
696
827
  const jarTargets_default = (() => {
697
828
  const jarTargets: BuildContext["jarTargets"] = [];
698
829
 
699
- if (recordIsImplementedByThemeType.account) {
830
+ if (
831
+ implementedThemeTypes.account.isImplemented &&
832
+ implementedThemeTypes.account.type === "Multi-Page"
833
+ ) {
700
834
  for (const keycloakVersionRange of [
701
835
  "21-and-below",
702
836
  "23",
@@ -706,7 +840,7 @@ export function getBuildContext(params: {
706
840
  assert<
707
841
  Equals<
708
842
  typeof keycloakVersionRange,
709
- KeycloakVersionRange.WithAccountTheme
843
+ KeycloakVersionRange.WithAccountV1Theme
710
844
  >
711
845
  >(true);
712
846
  jarTargets.push({
@@ -723,7 +857,7 @@ export function getBuildContext(params: {
723
857
  assert<
724
858
  Equals<
725
859
  typeof keycloakVersionRange,
726
- KeycloakVersionRange.WithoutAccountTheme
860
+ KeycloakVersionRange.WithoutAccountV1Theme
727
861
  >
728
862
  >(true);
729
863
  jarTargets.push({
@@ -741,78 +875,11 @@ export function getBuildContext(params: {
741
875
  return jarTargets_default;
742
876
  }
743
877
 
744
- if (
745
- buildOptions.keycloakVersionTargets.hasAccountTheme !==
746
- recordIsImplementedByThemeType.account
747
- ) {
748
- console.log(
749
- chalk.red(
750
- (() => {
751
- const { keycloakVersionTargets } = buildOptions;
752
-
753
- let message = `Bad ${symToStr({ keycloakVersionTargets })} configuration.\n`;
754
-
755
- if (keycloakVersionTargets.hasAccountTheme) {
756
- message +=
757
- "Your codebase does not seem to implement an account theme ";
758
- } else {
759
- message += "Your codebase implements an account theme ";
760
- }
761
-
762
- const { hasAccountTheme } = keycloakVersionTargets;
763
-
764
- message += `but you have set ${symToStr({ keycloakVersionTargets })}.${symToStr({ hasAccountTheme })}`;
765
- message += ` to ${hasAccountTheme} in your `;
766
- message += (() => {
767
- switch (bundler) {
768
- case "vite":
769
- return "vite.config.ts";
770
- case "webpack":
771
- return "package.json";
772
- }
773
- assert<Equals<typeof bundler, never>>(false);
774
- })();
775
- message += `. Please set it to ${!hasAccountTheme} `;
776
- message +=
777
- "and fill up the relevant keycloak version ranges.\n";
778
- message += "Example:\n";
779
- message += JSON.stringify(
780
- id<Pick<BuildOptions, "keycloakVersionTargets">>({
781
- keycloakVersionTargets: {
782
- hasAccountTheme:
783
- recordIsImplementedByThemeType.account,
784
- ...objectFromEntries(
785
- jarTargets_default.map(
786
- ({
787
- keycloakVersionRange,
788
- jarFileBasename
789
- }) => [
790
- keycloakVersionRange,
791
- jarFileBasename
792
- ]
793
- )
794
- )
795
- }
796
- }),
797
- null,
798
- 2
799
- );
800
- message +=
801
- "\nSee: https://docs.keycloakify.dev/v/v10/targetting-specific-keycloak-versions";
802
-
803
- return message;
804
- })()
805
- )
806
- );
807
-
808
- process.exit(1);
809
- }
810
-
811
878
  const jarTargets: BuildContext["jarTargets"] = [];
812
879
 
813
- const { hasAccountTheme, ...rest } = buildOptions.keycloakVersionTargets;
814
-
815
- for (const [keycloakVersionRange, jarNameOrBoolean] of objectEntries(rest)) {
880
+ for (const [keycloakVersionRange, jarNameOrBoolean] of objectEntries(
881
+ buildOptions.keycloakVersionTargets
882
+ )) {
816
883
  if (jarNameOrBoolean === false) {
817
884
  continue;
818
885
  }
@@ -863,6 +930,48 @@ export function getBuildContext(params: {
863
930
  }
864
931
 
865
932
  return jarTargets;
866
- })()
933
+ })(),
934
+ startKeycloakOptions: {
935
+ dockerImage: (() => {
936
+ if (buildOptions.startKeycloakOptions?.dockerImage === undefined) {
937
+ return undefined;
938
+ }
939
+
940
+ const [reference, tag, ...rest] =
941
+ buildOptions.startKeycloakOptions.dockerImage.split(":");
942
+
943
+ assert(
944
+ reference !== undefined && tag !== undefined && rest.length === 0,
945
+ `Invalid docker image: ${buildOptions.startKeycloakOptions.dockerImage}`
946
+ );
947
+
948
+ return { reference, tag };
949
+ })(),
950
+ dockerExtraArgs: buildOptions.startKeycloakOptions?.dockerExtraArgs ?? [],
951
+ keycloakExtraArgs: buildOptions.startKeycloakOptions?.keycloakExtraArgs ?? [],
952
+ extensionJars: (buildOptions.startKeycloakOptions?.extensionJars ?? []).map(
953
+ urlOrPath => {
954
+ if (/^https?:\/\//.test(urlOrPath)) {
955
+ return { type: "url", url: urlOrPath };
956
+ }
957
+
958
+ return {
959
+ type: "path",
960
+ path: getAbsoluteAndInOsFormatPath({
961
+ pathIsh: urlOrPath,
962
+ cwd: projectDirPath
963
+ })
964
+ };
965
+ }
966
+ ),
967
+ realmJsonFilePath:
968
+ buildOptions.startKeycloakOptions?.realmJsonFilePath === undefined
969
+ ? undefined
970
+ : getAbsoluteAndInOsFormatPath({
971
+ pathIsh: buildOptions.startKeycloakOptions.realmJsonFilePath,
972
+ cwd: projectDirPath
973
+ }),
974
+ port: buildOptions.startKeycloakOptions?.port
975
+ }
867
976
  };
868
977
  }