keycloakify 9.6.6 → 10.0.0-rc.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 (424) hide show
  1. package/README.md +1 -1
  2. package/account/Template.js +34 -14
  3. package/account/Template.js.map +1 -1
  4. package/account/i18n/baseMessages/de.d.ts +1 -1
  5. package/account/i18n/baseMessages/de.js +1 -1
  6. package/account/i18n/baseMessages/de.js.map +1 -1
  7. package/account/i18n/baseMessages/en.d.ts +2 -0
  8. package/account/i18n/baseMessages/en.js +2 -0
  9. package/account/i18n/baseMessages/en.js.map +1 -1
  10. package/account/i18n/baseMessages/es.d.ts +230 -0
  11. package/account/i18n/baseMessages/es.js +231 -1
  12. package/account/i18n/baseMessages/es.js.map +1 -1
  13. package/account/i18n/baseMessages/index.d.ts +353 -407
  14. package/account/i18n/baseMessages/index.js +1 -0
  15. package/account/i18n/baseMessages/index.js.map +1 -1
  16. package/account/i18n/baseMessages/pl.d.ts +115 -1
  17. package/account/i18n/baseMessages/pl.js +115 -1
  18. package/account/i18n/baseMessages/pl.js.map +1 -1
  19. package/account/i18n/baseMessages/tr.d.ts +1 -1
  20. package/account/i18n/baseMessages/tr.js +1 -1
  21. package/account/i18n/baseMessages/tr.js.map +1 -1
  22. package/account/i18n/baseMessages/uk.d.ts +337 -0
  23. package/account/i18n/baseMessages/uk.js +342 -0
  24. package/account/i18n/baseMessages/uk.js.map +1 -0
  25. package/account/i18n/baseMessages/zh-CN.d.ts +10 -0
  26. package/account/i18n/baseMessages/zh-CN.js +10 -0
  27. package/account/i18n/baseMessages/zh-CN.js.map +1 -1
  28. package/bin/constants.d.ts +0 -1
  29. package/bin/constants.js +1 -2
  30. package/bin/constants.js.map +1 -1
  31. package/bin/download-builtin-keycloak-theme.js +12 -2
  32. package/bin/download-builtin-keycloak-theme.js.map +1 -1
  33. package/bin/keycloakify/buildJars/buildJar.d.ts +14 -0
  34. package/bin/keycloakify/buildJars/buildJar.js +216 -0
  35. package/bin/keycloakify/buildJars/buildJar.js.map +1 -0
  36. package/bin/keycloakify/buildJars/buildJars.d.ts +10 -0
  37. package/bin/keycloakify/buildJars/buildJars.js +95 -0
  38. package/bin/keycloakify/buildJars/buildJars.js.map +1 -0
  39. package/bin/keycloakify/buildJars/extensionVersions.d.ts +12 -0
  40. package/bin/keycloakify/buildJars/extensionVersions.js +7 -0
  41. package/bin/keycloakify/buildJars/extensionVersions.js.map +1 -0
  42. package/bin/keycloakify/buildJars/generatePom.d.ts +13 -0
  43. package/bin/keycloakify/buildJars/generatePom.js +94 -0
  44. package/bin/keycloakify/buildJars/generatePom.js.map +1 -0
  45. package/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.d.ts +6 -0
  46. package/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.js +35 -0
  47. package/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.js.map +1 -0
  48. package/bin/keycloakify/buildJars/index.d.ts +1 -0
  49. package/bin/keycloakify/buildJars/index.js +18 -0
  50. package/bin/keycloakify/buildJars/index.js.map +1 -0
  51. package/bin/keycloakify/buildOptions/UserProvidedBuildOptions.d.ts +0 -8
  52. package/bin/keycloakify/buildOptions/UserProvidedBuildOptions.js +1 -3
  53. package/bin/keycloakify/buildOptions/UserProvidedBuildOptions.js.map +1 -1
  54. package/bin/keycloakify/buildOptions/buildOptions.d.ts +0 -2
  55. package/bin/keycloakify/buildOptions/buildOptions.js +3 -5
  56. package/bin/keycloakify/buildOptions/buildOptions.js.map +1 -1
  57. package/bin/keycloakify/buildOptions/getNpmWorkspaceRootDirPath.js +1 -1
  58. package/bin/keycloakify/buildOptions/getNpmWorkspaceRootDirPath.js.map +1 -1
  59. package/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +103 -232
  60. package/bin/keycloakify/generateFtl/generateFtl.js +17 -39
  61. package/bin/keycloakify/generateFtl/generateFtl.js.map +1 -1
  62. package/bin/keycloakify/generateFtl/pageId.d.ts +1 -1
  63. package/bin/keycloakify/generateFtl/pageId.js +11 -3
  64. package/bin/keycloakify/generateFtl/pageId.js.map +1 -1
  65. package/bin/keycloakify/generateStartKeycloakTestingContainer.d.ts +0 -1
  66. package/bin/keycloakify/generateStartKeycloakTestingContainer.js +3 -6
  67. package/bin/keycloakify/generateStartKeycloakTestingContainer.js.map +1 -1
  68. package/bin/keycloakify/generateTheme/bringInAccountV1.d.ts +1 -1
  69. package/bin/keycloakify/generateTheme/bringInAccountV1.js +5 -9
  70. package/bin/keycloakify/generateTheme/bringInAccountV1.js.map +1 -1
  71. package/bin/keycloakify/generateTheme/generateSrcMainResources.d.ts +21 -0
  72. package/bin/keycloakify/generateTheme/generateSrcMainResources.js +340 -0
  73. package/bin/keycloakify/generateTheme/generateSrcMainResources.js.map +1 -0
  74. package/bin/keycloakify/generateTheme/generateTheme.d.ts +5 -13
  75. package/bin/keycloakify/generateTheme/generateTheme.js +30 -293
  76. package/bin/keycloakify/generateTheme/generateTheme.js.map +1 -1
  77. package/bin/keycloakify/generateTheme/generateThemeVariants.d.ts +5 -0
  78. package/bin/keycloakify/generateTheme/generateThemeVariants.js +67 -0
  79. package/bin/keycloakify/generateTheme/generateThemeVariants.js.map +1 -0
  80. package/bin/keycloakify/generateTheme/readFieldNameUsage.js +54 -18
  81. package/bin/keycloakify/generateTheme/readFieldNameUsage.js.map +1 -1
  82. package/bin/keycloakify/keycloakify.js +28 -104
  83. package/bin/keycloakify/keycloakify.js.map +1 -1
  84. package/lib/useGetClassName.js +2 -2
  85. package/lib/useGetClassName.js.map +1 -1
  86. package/login/Fallback.d.ts +7 -1
  87. package/login/Fallback.js +32 -8
  88. package/login/Fallback.js.map +1 -1
  89. package/login/Template.js +76 -20
  90. package/login/Template.js.map +1 -1
  91. package/login/TemplateProps.d.ts +4 -2
  92. package/login/UserProfileFormFields.d.ts +22 -0
  93. package/login/UserProfileFormFields.js +327 -0
  94. package/login/UserProfileFormFields.js.map +1 -0
  95. package/login/i18n/baseMessages/ar.d.ts +3 -0
  96. package/login/i18n/baseMessages/ar.js +3 -0
  97. package/login/i18n/baseMessages/ar.js.map +1 -1
  98. package/login/i18n/baseMessages/ca.d.ts +1 -0
  99. package/login/i18n/baseMessages/ca.js +1 -0
  100. package/login/i18n/baseMessages/ca.js.map +1 -1
  101. package/login/i18n/baseMessages/cs.d.ts +3 -0
  102. package/login/i18n/baseMessages/cs.js +3 -0
  103. package/login/i18n/baseMessages/cs.js.map +1 -1
  104. package/login/i18n/baseMessages/da.d.ts +1 -0
  105. package/login/i18n/baseMessages/da.js +1 -0
  106. package/login/i18n/baseMessages/da.js.map +1 -1
  107. package/login/i18n/baseMessages/de.d.ts +1 -0
  108. package/login/i18n/baseMessages/de.js +1 -0
  109. package/login/i18n/baseMessages/de.js.map +1 -1
  110. package/login/i18n/baseMessages/el.d.ts +1 -0
  111. package/login/i18n/baseMessages/el.js +1 -0
  112. package/login/i18n/baseMessages/el.js.map +1 -1
  113. package/login/i18n/baseMessages/en.d.ts +7 -0
  114. package/login/i18n/baseMessages/en.js +23 -16
  115. package/login/i18n/baseMessages/en.js.map +1 -1
  116. package/login/i18n/baseMessages/es.d.ts +239 -0
  117. package/login/i18n/baseMessages/es.js +240 -1
  118. package/login/i18n/baseMessages/es.js.map +1 -1
  119. package/login/i18n/baseMessages/fa.d.ts +1 -0
  120. package/login/i18n/baseMessages/fa.js +1 -0
  121. package/login/i18n/baseMessages/fa.js.map +1 -1
  122. package/login/i18n/baseMessages/fi.d.ts +1 -0
  123. package/login/i18n/baseMessages/fi.js +1 -0
  124. package/login/i18n/baseMessages/fi.js.map +1 -1
  125. package/login/i18n/baseMessages/fr.d.ts +1 -0
  126. package/login/i18n/baseMessages/fr.js +2 -1
  127. package/login/i18n/baseMessages/fr.js.map +1 -1
  128. package/login/i18n/baseMessages/hu.d.ts +1 -0
  129. package/login/i18n/baseMessages/hu.js +1 -0
  130. package/login/i18n/baseMessages/hu.js.map +1 -1
  131. package/login/i18n/baseMessages/index.d.ts +211 -416
  132. package/login/i18n/baseMessages/index.js +1 -0
  133. package/login/i18n/baseMessages/index.js.map +1 -1
  134. package/login/i18n/baseMessages/it.d.ts +1 -0
  135. package/login/i18n/baseMessages/it.js +1 -0
  136. package/login/i18n/baseMessages/it.js.map +1 -1
  137. package/login/i18n/baseMessages/ja.d.ts +1 -0
  138. package/login/i18n/baseMessages/ja.js +1 -0
  139. package/login/i18n/baseMessages/ja.js.map +1 -1
  140. package/login/i18n/baseMessages/lt.d.ts +1 -0
  141. package/login/i18n/baseMessages/lt.js +1 -0
  142. package/login/i18n/baseMessages/lt.js.map +1 -1
  143. package/login/i18n/baseMessages/lv.d.ts +1 -0
  144. package/login/i18n/baseMessages/lv.js +1 -0
  145. package/login/i18n/baseMessages/lv.js.map +1 -1
  146. package/login/i18n/baseMessages/nl.d.ts +1 -0
  147. package/login/i18n/baseMessages/nl.js +1 -0
  148. package/login/i18n/baseMessages/nl.js.map +1 -1
  149. package/login/i18n/baseMessages/no.d.ts +1 -0
  150. package/login/i18n/baseMessages/no.js +1 -0
  151. package/login/i18n/baseMessages/no.js.map +1 -1
  152. package/login/i18n/baseMessages/pl.d.ts +1 -0
  153. package/login/i18n/baseMessages/pl.js +1 -0
  154. package/login/i18n/baseMessages/pl.js.map +1 -1
  155. package/login/i18n/baseMessages/pt-BR.d.ts +1 -0
  156. package/login/i18n/baseMessages/pt-BR.js +1 -0
  157. package/login/i18n/baseMessages/pt-BR.js.map +1 -1
  158. package/login/i18n/baseMessages/ru.d.ts +1 -0
  159. package/login/i18n/baseMessages/ru.js +1 -0
  160. package/login/i18n/baseMessages/ru.js.map +1 -1
  161. package/login/i18n/baseMessages/sk.d.ts +2 -0
  162. package/login/i18n/baseMessages/sk.js +3 -1
  163. package/login/i18n/baseMessages/sk.js.map +1 -1
  164. package/login/i18n/baseMessages/sv.d.ts +1 -0
  165. package/login/i18n/baseMessages/sv.js +1 -0
  166. package/login/i18n/baseMessages/sv.js.map +1 -1
  167. package/login/i18n/baseMessages/th.d.ts +1 -0
  168. package/login/i18n/baseMessages/th.js +1 -0
  169. package/login/i18n/baseMessages/th.js.map +1 -1
  170. package/login/i18n/baseMessages/tr.d.ts +1 -0
  171. package/login/i18n/baseMessages/tr.js +1 -0
  172. package/login/i18n/baseMessages/tr.js.map +1 -1
  173. package/login/i18n/baseMessages/uk.d.ts +433 -0
  174. package/login/i18n/baseMessages/uk.js +438 -0
  175. package/login/i18n/baseMessages/uk.js.map +1 -0
  176. package/login/i18n/baseMessages/zh-CN.d.ts +273 -3
  177. package/login/i18n/baseMessages/zh-CN.js +325 -55
  178. package/login/i18n/baseMessages/zh-CN.js.map +1 -1
  179. package/login/i18n/i18n.d.ts +4 -0
  180. package/login/i18n/i18n.js +6 -2
  181. package/login/i18n/i18n.js.map +1 -1
  182. package/login/kcContext/KcContext.d.ts +181 -105
  183. package/login/kcContext/KcContext.js +1 -1
  184. package/login/kcContext/KcContext.js.map +1 -1
  185. package/login/kcContext/createGetKcContext.js +3 -9
  186. package/login/kcContext/createGetKcContext.js.map +1 -1
  187. package/login/kcContext/kcContextMocks.d.ts +1 -1
  188. package/login/kcContext/kcContextMocks.js +92 -198
  189. package/login/kcContext/kcContextMocks.js.map +1 -1
  190. package/login/lib/useDownloadTerms.d.ts +4 -1
  191. package/login/lib/useDownloadTerms.js +9 -4
  192. package/login/lib/useDownloadTerms.js.map +1 -1
  193. package/login/lib/useGetClassName.js +112 -73
  194. package/login/lib/useGetClassName.js.map +1 -1
  195. package/login/lib/useUserProfileForm.d.ts +74 -0
  196. package/login/lib/useUserProfileForm.js +868 -0
  197. package/login/lib/useUserProfileForm.js.map +1 -0
  198. package/login/pages/{UpdateUserProfile.d.ts → Code.d.ts} +2 -2
  199. package/login/pages/Code.js +13 -0
  200. package/login/pages/Code.js.map +1 -0
  201. package/login/pages/DeleteAccountConfirm.d.ts +7 -0
  202. package/login/pages/DeleteAccountConfirm.js +14 -0
  203. package/login/pages/DeleteAccountConfirm.js.map +1 -0
  204. package/login/pages/{RegisterUserProfile.d.ts → DeleteCredential.d.ts} +2 -2
  205. package/login/pages/DeleteCredential.js +14 -0
  206. package/login/pages/DeleteCredential.js.map +1 -0
  207. package/login/pages/Error.js +2 -2
  208. package/login/pages/Error.js.map +1 -1
  209. package/login/pages/FrontchannelLogout.d.ts +7 -0
  210. package/login/pages/FrontchannelLogout.js +14 -0
  211. package/login/pages/FrontchannelLogout.js.map +1 -0
  212. package/login/pages/IdpReviewUserProfile.d.ts +8 -2
  213. package/login/pages/IdpReviewUserProfile.js +3 -4
  214. package/login/pages/IdpReviewUserProfile.js.map +1 -1
  215. package/login/pages/Info.js +14 -1
  216. package/login/pages/Info.js.map +1 -1
  217. package/login/pages/Login.js +24 -38
  218. package/login/pages/Login.js.map +1 -1
  219. package/login/pages/LoginConfigTotp.js +8 -1
  220. package/login/pages/LoginConfigTotp.js.map +1 -1
  221. package/login/pages/{LoginDeviceVerifyUserCode.d.ts → LoginOauth2DeviceVerifyUserCode.d.ts} +1 -1
  222. package/login/pages/{LoginDeviceVerifyUserCode.js → LoginOauth2DeviceVerifyUserCode.js} +2 -2
  223. package/login/pages/LoginOauth2DeviceVerifyUserCode.js.map +1 -0
  224. package/login/pages/LoginOauthGrant.js +3 -2
  225. package/login/pages/LoginOauthGrant.js.map +1 -1
  226. package/login/pages/LoginOtp.js +4 -6
  227. package/login/pages/LoginOtp.js.map +1 -1
  228. package/login/pages/LoginPageExpired.js +1 -1
  229. package/login/pages/LoginPageExpired.js.map +1 -1
  230. package/login/pages/LoginPassword.d.ts +1 -1
  231. package/login/pages/LoginPassword.js +18 -11
  232. package/login/pages/LoginPassword.js.map +1 -1
  233. package/login/pages/LoginRecoveryAuthnCodeConfig.d.ts +7 -0
  234. package/login/pages/LoginRecoveryAuthnCodeConfig.js +147 -0
  235. package/login/pages/LoginRecoveryAuthnCodeConfig.js.map +1 -0
  236. package/login/pages/LoginRecoveryAuthnCodeInput.d.ts +7 -0
  237. package/login/pages/LoginRecoveryAuthnCodeInput.js +14 -0
  238. package/login/pages/LoginRecoveryAuthnCodeInput.js.map +1 -0
  239. package/login/pages/LoginResetOtp.d.ts +7 -0
  240. package/login/pages/LoginResetOtp.js +15 -0
  241. package/login/pages/LoginResetOtp.js.map +1 -0
  242. package/login/pages/LoginResetPassword.js +4 -3
  243. package/login/pages/LoginResetPassword.js.map +1 -1
  244. package/login/pages/LoginUpdatePassword.js +21 -3
  245. package/login/pages/LoginUpdatePassword.js.map +1 -1
  246. package/login/pages/LoginUpdateProfile.d.ts +8 -2
  247. package/login/pages/LoginUpdateProfile.js +11 -5
  248. package/login/pages/LoginUpdateProfile.js.map +1 -1
  249. package/login/pages/LoginUsername.js +11 -35
  250. package/login/pages/LoginUsername.js.map +1 -1
  251. package/login/pages/LoginVerifyEmail.js +1 -1
  252. package/login/pages/LoginVerifyEmail.js.map +1 -1
  253. package/login/pages/LoginX509Info.d.ts +7 -0
  254. package/login/pages/LoginX509Info.js +14 -0
  255. package/login/pages/LoginX509Info.js.map +1 -0
  256. package/login/pages/LogoutConfirm.js +1 -1
  257. package/login/pages/LogoutConfirm.js.map +1 -1
  258. package/login/pages/Register.d.ts +8 -2
  259. package/login/pages/Register.js +26 -4
  260. package/login/pages/Register.js.map +1 -1
  261. package/login/pages/SamlPostForm.js +1 -1
  262. package/login/pages/SamlPostForm.js.map +1 -1
  263. package/login/pages/SelectAuthenticator.js +5 -21
  264. package/login/pages/SelectAuthenticator.js.map +1 -1
  265. package/login/pages/Terms.js +4 -6
  266. package/login/pages/Terms.js.map +1 -1
  267. package/login/pages/UpdateEmail.d.ts +8 -2
  268. package/login/pages/UpdateEmail.js +16 -5
  269. package/login/pages/UpdateEmail.js.map +1 -1
  270. package/login/pages/WebauthnAuthenticate.js +121 -83
  271. package/login/pages/WebauthnAuthenticate.js.map +1 -1
  272. package/login/pages/WebauthnError.d.ts +7 -0
  273. package/login/pages/WebauthnError.js +21 -0
  274. package/login/pages/WebauthnError.js.map +1 -0
  275. package/login/pages/WebauthnRegister.d.ts +7 -0
  276. package/login/pages/WebauthnRegister.js +193 -0
  277. package/login/pages/WebauthnRegister.js.map +1 -0
  278. package/package.json +138 -43
  279. package/src/account/Template.tsx +41 -14
  280. package/src/account/i18n/baseMessages/de.ts +1 -1
  281. package/src/account/i18n/baseMessages/en.ts +2 -0
  282. package/src/account/i18n/baseMessages/es.ts +231 -1
  283. package/src/account/i18n/baseMessages/index.ts +1 -0
  284. package/src/account/i18n/baseMessages/pl.ts +115 -1
  285. package/src/account/i18n/baseMessages/tr.ts +1 -1
  286. package/src/account/i18n/baseMessages/uk.ts +343 -0
  287. package/src/account/i18n/baseMessages/zh-CN.ts +10 -0
  288. package/src/bin/constants.ts +0 -1
  289. package/src/bin/download-builtin-keycloak-theme.ts +14 -1
  290. package/src/bin/keycloakify/buildJars/buildJar.ts +163 -0
  291. package/src/bin/keycloakify/buildJars/buildJars.ts +62 -0
  292. package/src/bin/keycloakify/buildJars/extensionVersions.ts +16 -0
  293. package/src/bin/keycloakify/buildJars/generatePom.ts +86 -0
  294. package/src/bin/keycloakify/buildJars/getKeycloakVersionRangeForJar.ts +37 -0
  295. package/src/bin/keycloakify/buildJars/index.ts +1 -0
  296. package/src/bin/keycloakify/buildOptions/UserProvidedBuildOptions.ts +1 -5
  297. package/src/bin/keycloakify/buildOptions/buildOptions.ts +1 -5
  298. package/src/bin/keycloakify/buildOptions/getNpmWorkspaceRootDirPath.ts +1 -1
  299. package/src/bin/keycloakify/generateFtl/ftl_object_to_js_code_declaring_an_object.ftl +103 -232
  300. package/src/bin/keycloakify/generateFtl/generateFtl.ts +15 -31
  301. package/src/bin/keycloakify/generateFtl/pageId.ts +11 -3
  302. package/src/bin/keycloakify/generateStartKeycloakTestingContainer.ts +4 -8
  303. package/src/bin/keycloakify/generateTheme/bringInAccountV1.ts +5 -11
  304. package/src/bin/keycloakify/generateTheme/generateSrcMainResources.ts +267 -0
  305. package/src/bin/keycloakify/generateTheme/generateTheme.ts +22 -309
  306. package/src/bin/keycloakify/generateTheme/generateThemeVariants.ts +50 -0
  307. package/src/bin/keycloakify/generateTheme/readFieldNameUsage.ts +33 -8
  308. package/src/bin/keycloakify/keycloakify.ts +23 -56
  309. package/src/lib/useGetClassName.ts +2 -2
  310. package/src/login/Fallback.tsx +39 -9
  311. package/src/login/Template.tsx +160 -61
  312. package/src/login/TemplateProps.ts +113 -63
  313. package/src/login/UserProfileFormFields.tsx +750 -0
  314. package/src/login/i18n/baseMessages/ar.ts +3 -0
  315. package/src/login/i18n/baseMessages/ca.ts +1 -0
  316. package/src/login/i18n/baseMessages/cs.ts +3 -0
  317. package/src/login/i18n/baseMessages/da.ts +1 -0
  318. package/src/login/i18n/baseMessages/de.ts +1 -0
  319. package/src/login/i18n/baseMessages/el.ts +1 -0
  320. package/src/login/i18n/baseMessages/en.ts +23 -16
  321. package/src/login/i18n/baseMessages/es.ts +240 -1
  322. package/src/login/i18n/baseMessages/fa.ts +1 -0
  323. package/src/login/i18n/baseMessages/fi.ts +1 -0
  324. package/src/login/i18n/baseMessages/fr.ts +2 -1
  325. package/src/login/i18n/baseMessages/hu.ts +1 -0
  326. package/src/login/i18n/baseMessages/index.ts +1 -0
  327. package/src/login/i18n/baseMessages/it.ts +1 -0
  328. package/src/login/i18n/baseMessages/ja.ts +1 -0
  329. package/src/login/i18n/baseMessages/lt.ts +1 -0
  330. package/src/login/i18n/baseMessages/lv.ts +1 -0
  331. package/src/login/i18n/baseMessages/nl.ts +1 -0
  332. package/src/login/i18n/baseMessages/no.ts +1 -0
  333. package/src/login/i18n/baseMessages/pl.ts +1 -0
  334. package/src/login/i18n/baseMessages/pt-BR.ts +1 -0
  335. package/src/login/i18n/baseMessages/ru.ts +1 -0
  336. package/src/login/i18n/baseMessages/sk.ts +3 -1
  337. package/src/login/i18n/baseMessages/sv.ts +1 -0
  338. package/src/login/i18n/baseMessages/th.ts +1 -0
  339. package/src/login/i18n/baseMessages/tr.ts +1 -0
  340. package/src/login/i18n/baseMessages/uk.ts +439 -0
  341. package/src/login/i18n/baseMessages/zh-CN.ts +325 -55
  342. package/src/login/i18n/i18n.tsx +6 -2
  343. package/src/login/kcContext/KcContext.ts +216 -103
  344. package/src/login/kcContext/createGetKcContext.ts +11 -19
  345. package/src/login/kcContext/kcContextMocks.ts +165 -226
  346. package/src/login/lib/useDownloadTerms.ts +15 -7
  347. package/src/login/lib/useGetClassName.ts +112 -83
  348. package/src/login/lib/useUserProfileForm.tsx +1227 -0
  349. package/src/login/pages/Code.tsx +35 -0
  350. package/src/login/pages/DeleteAccountConfirm.tsx +53 -0
  351. package/src/login/pages/DeleteCredential.tsx +45 -0
  352. package/src/login/pages/Error.tsx +2 -2
  353. package/src/login/pages/FrontchannelLogout.tsx +41 -0
  354. package/src/login/pages/IdpReviewUserProfile.tsx +15 -5
  355. package/src/login/pages/Info.tsx +29 -19
  356. package/src/login/pages/Login.tsx +156 -117
  357. package/src/login/pages/LoginConfigTotp.tsx +26 -1
  358. package/src/login/pages/{LoginDeviceVerifyUserCode.tsx → LoginOauth2DeviceVerifyUserCode.tsx} +3 -1
  359. package/src/login/pages/LoginOauthGrant.tsx +38 -2
  360. package/src/login/pages/LoginOtp.tsx +73 -65
  361. package/src/login/pages/LoginPageExpired.tsx +1 -1
  362. package/src/login/pages/LoginPassword.tsx +77 -28
  363. package/src/login/pages/LoginRecoveryAuthnCodeConfig.tsx +260 -0
  364. package/src/login/pages/LoginRecoveryAuthnCodeInput.tsx +73 -0
  365. package/src/login/pages/LoginResetOtp.tsx +70 -0
  366. package/src/login/pages/LoginResetPassword.tsx +11 -4
  367. package/src/login/pages/LoginUpdatePassword.tsx +120 -81
  368. package/src/login/pages/LoginUpdateProfile.tsx +41 -115
  369. package/src/login/pages/LoginUsername.tsx +93 -101
  370. package/src/login/pages/LoginVerifyEmail.tsx +14 -8
  371. package/src/login/pages/LoginX509Info.tsx +94 -0
  372. package/src/login/pages/LogoutConfirm.tsx +2 -2
  373. package/src/login/pages/Register.tsx +83 -131
  374. package/src/login/pages/SamlPostForm.tsx +1 -1
  375. package/src/login/pages/SelectAuthenticator.tsx +29 -52
  376. package/src/login/pages/Terms.tsx +4 -7
  377. package/src/login/pages/UpdateEmail.tsx +69 -54
  378. package/src/login/pages/WebauthnAuthenticate.tsx +205 -165
  379. package/src/login/pages/WebauthnError.tsx +66 -0
  380. package/src/login/pages/WebauthnRegister.tsx +285 -0
  381. package/src/tools/formatNumber.ts +48 -0
  382. package/src/tools/useInsertLinkTags.ts +82 -0
  383. package/src/tools/useInsertScriptTags.ts +106 -0
  384. package/src/tools/useSetClassName.ts +21 -0
  385. package/tools/formatNumber.d.ts +1 -0
  386. package/tools/formatNumber.js +37 -0
  387. package/tools/formatNumber.js.map +1 -0
  388. package/tools/useInsertLinkTags.d.ts +7 -0
  389. package/tools/useInsertLinkTags.js +57 -0
  390. package/tools/useInsertLinkTags.js.map +1 -0
  391. package/tools/useInsertScriptTags.d.ts +20 -0
  392. package/tools/useInsertScriptTags.js +75 -0
  393. package/tools/useInsertScriptTags.js.map +1 -0
  394. package/tools/useSetClassName.d.ts +4 -0
  395. package/tools/useSetClassName.js +16 -0
  396. package/tools/useSetClassName.js.map +1 -0
  397. package/vite-plugin/tsconfig.tsbuildinfo +1 -1
  398. package/bin/keycloakify/generatePom.d.ts +0 -12
  399. package/bin/keycloakify/generatePom.js +0 -59
  400. package/bin/keycloakify/generatePom.js.map +0 -1
  401. package/lib/usePrepareTemplate.d.ts +0 -11
  402. package/lib/usePrepareTemplate.js +0 -80
  403. package/lib/usePrepareTemplate.js.map +0 -1
  404. package/login/lib/useFormValidation.d.ts +0 -47
  405. package/login/lib/useFormValidation.js +0 -316
  406. package/login/lib/useFormValidation.js.map +0 -1
  407. package/login/pages/LoginDeviceVerifyUserCode.js.map +0 -1
  408. package/login/pages/RegisterUserProfile.js +0 -18
  409. package/login/pages/RegisterUserProfile.js.map +0 -1
  410. package/login/pages/UpdateUserProfile.js +0 -17
  411. package/login/pages/UpdateUserProfile.js.map +0 -1
  412. package/login/pages/shared/UserProfileFormFields.d.ts +0 -18
  413. package/login/pages/shared/UserProfileFormFields.js +0 -58
  414. package/login/pages/shared/UserProfileFormFields.js.map +0 -1
  415. package/src/bin/keycloakify/generatePom.ts +0 -70
  416. package/src/lib/usePrepareTemplate.ts +0 -113
  417. package/src/login/lib/useFormValidation.tsx +0 -474
  418. package/src/login/pages/RegisterUserProfile.tsx +0 -72
  419. package/src/login/pages/UpdateUserProfile.tsx +0 -82
  420. package/src/login/pages/shared/UserProfileFormFields.tsx +0 -177
  421. package/src/tools/headInsert.ts +0 -73
  422. package/tools/headInsert.d.ts +0 -12
  423. package/tools/headInsert.js +0 -50
  424. package/tools/headInsert.js.map +0 -1
@@ -0,0 +1,285 @@
1
+ import { useEffect } from "react";
2
+ import { clsx } from "keycloakify/tools/clsx";
3
+ import type { PageProps } from "keycloakify/login/pages/PageProps";
4
+ import { useGetClassName } from "keycloakify/login/lib/useGetClassName";
5
+ import { assert } from "tsafe/assert";
6
+ import { createUseInsertScriptTags } from "keycloakify/tools/useInsertScriptTags";
7
+ import type { KcContext } from "../kcContext";
8
+ import type { I18n } from "../i18n";
9
+
10
+ const { useInsertScriptTags } = createUseInsertScriptTags();
11
+
12
+ export default function WebauthnRegister(props: PageProps<Extract<KcContext, { pageId: "webauthn-register.ftl" }>, I18n>) {
13
+ const { kcContext, i18n, doUseDefaultCss, Template, classes } = props;
14
+
15
+ const { getClassName } = useGetClassName({ doUseDefaultCss, classes });
16
+
17
+ const {
18
+ url,
19
+ challenge,
20
+ userid,
21
+ username,
22
+ signatureAlgorithms,
23
+ rpEntityName,
24
+ rpId,
25
+ attestationConveyancePreference,
26
+ authenticatorAttachment,
27
+ requireResidentKey,
28
+ userVerificationRequirement,
29
+ createTimeout,
30
+ excludeCredentialIds,
31
+ isSetRetry,
32
+ isAppInitiatedAction
33
+ } = kcContext;
34
+
35
+ const { msg, msgStr } = i18n;
36
+
37
+ const { insertScriptTags } = useInsertScriptTags({
38
+ "scriptTags": [
39
+ {
40
+ "type": "text/javascript",
41
+ "src": `${url.resourcesCommonPath}/node_modules/jquery/dist/jquery.min.js`
42
+ },
43
+ {
44
+ "type": "text/javascript",
45
+ "src": `${url.resourcesPath}/js/base64url.js`
46
+ },
47
+ {
48
+ "type": "text/javascript",
49
+ "textContent": `
50
+ function registerSecurityKey() {
51
+
52
+ // Check if WebAuthn is supported by this browser
53
+ if (!window.PublicKeyCredential) {
54
+ $("#error").val("${msgStr("webauthn-unsupported-browser-text")}");
55
+ $("#register").submit();
56
+ return;
57
+ }
58
+
59
+ // mandatory parameters
60
+ let challenge = "${challenge}";
61
+ let userid = "${userid}";
62
+ let username = "${username}";
63
+
64
+ let signatureAlgorithms =${JSON.stringify(signatureAlgorithms)};
65
+ let pubKeyCredParams = getPubKeyCredParams(signatureAlgorithms);
66
+
67
+ let rpEntityName = "${rpEntityName}";
68
+ let rp = {name: rpEntityName};
69
+
70
+ let publicKey = {
71
+ challenge: base64url.decode(challenge, {loose: true}),
72
+ rp: rp,
73
+ user: {
74
+ id: base64url.decode(userid, {loose: true}),
75
+ name: username,
76
+ displayName: username
77
+ },
78
+ pubKeyCredParams: pubKeyCredParams,
79
+ };
80
+
81
+ // optional parameters
82
+ let rpId = "${rpId}";
83
+ publicKey.rp.id = rpId;
84
+
85
+ let attestationConveyancePreference = "${attestationConveyancePreference}";
86
+ if (attestationConveyancePreference !== 'not specified') publicKey.attestation = attestationConveyancePreference;
87
+
88
+ let authenticatorSelection = {};
89
+ let isAuthenticatorSelectionSpecified = false;
90
+
91
+ let authenticatorAttachment = "${authenticatorAttachment}";
92
+ if (authenticatorAttachment !== 'not specified') {
93
+ authenticatorSelection.authenticatorAttachment = authenticatorAttachment;
94
+ isAuthenticatorSelectionSpecified = true;
95
+ }
96
+
97
+ let requireResidentKey = "${requireResidentKey}";
98
+ if (requireResidentKey !== 'not specified') {
99
+ if (requireResidentKey === 'Yes')
100
+ authenticatorSelection.requireResidentKey = true;
101
+ else
102
+ authenticatorSelection.requireResidentKey = false;
103
+ isAuthenticatorSelectionSpecified = true;
104
+ }
105
+
106
+ let userVerificationRequirement = "${userVerificationRequirement}";
107
+ if (userVerificationRequirement !== 'not specified') {
108
+ authenticatorSelection.userVerification = userVerificationRequirement;
109
+ isAuthenticatorSelectionSpecified = true;
110
+ }
111
+
112
+ if (isAuthenticatorSelectionSpecified) publicKey.authenticatorSelection = authenticatorSelection;
113
+
114
+ let createTimeout = ${createTimeout};
115
+ if (createTimeout !== 0) publicKey.timeout = createTimeout * 1000;
116
+
117
+ let excludeCredentialIds = "${excludeCredentialIds}";
118
+ let excludeCredentials = getExcludeCredentials(excludeCredentialIds);
119
+ if (excludeCredentials.length > 0) publicKey.excludeCredentials = excludeCredentials;
120
+
121
+ navigator.credentials.create({publicKey})
122
+ .then(function (result) {
123
+ window.result = result;
124
+ let clientDataJSON = result.response.clientDataJSON;
125
+ let attestationObject = result.response.attestationObject;
126
+ let publicKeyCredentialId = result.rawId;
127
+
128
+ $("#clientDataJSON").val(base64url.encode(new Uint8Array(clientDataJSON), {pad: false}));
129
+ $("#attestationObject").val(base64url.encode(new Uint8Array(attestationObject), {pad: false}));
130
+ $("#publicKeyCredentialId").val(base64url.encode(new Uint8Array(publicKeyCredentialId), {pad: false}));
131
+
132
+ if (typeof result.response.getTransports === "function") {
133
+ let transports = result.response.getTransports();
134
+ if (transports) {
135
+ $("#transports").val(getTransportsAsString(transports));
136
+ }
137
+ } else {
138
+ console.log("Your browser is not able to recognize supported transport media for the authenticator.");
139
+ }
140
+
141
+ let initLabel = "WebAuthn Authenticator (Default Label)";
142
+ let labelResult = window.prompt("Please input your registered authenticator's label", initLabel);
143
+ if (labelResult === null) labelResult = initLabel;
144
+ $("#authenticatorLabel").val(labelResult);
145
+
146
+ $("#register").submit();
147
+
148
+ })
149
+ .catch(function (err) {
150
+ $("#error").val(err);
151
+ $("#register").submit();
152
+
153
+ });
154
+ }
155
+
156
+ function getPubKeyCredParams(signatureAlgorithmsList) {
157
+ let pubKeyCredParams = [];
158
+ if (signatureAlgorithmsList === []) {
159
+ pubKeyCredParams.push({type: "public-key", alg: -7});
160
+ return pubKeyCredParams;
161
+ }
162
+
163
+ for (let i = 0; i < signatureAlgorithmsList.length; i++) {
164
+ pubKeyCredParams.push({
165
+ type: "public-key",
166
+ alg: signatureAlgorithmsList[i]
167
+ });
168
+ }
169
+ return pubKeyCredParams;
170
+ }
171
+
172
+ function getExcludeCredentials(excludeCredentialIds) {
173
+ let excludeCredentials = [];
174
+ if (excludeCredentialIds === "") return excludeCredentials;
175
+
176
+ let excludeCredentialIdsList = excludeCredentialIds.split(',');
177
+
178
+ for (let i = 0; i < excludeCredentialIdsList.length; i++) {
179
+ excludeCredentials.push({
180
+ type: "public-key",
181
+ id: base64url.decode(excludeCredentialIdsList[i],
182
+ {loose: true})
183
+ });
184
+ }
185
+ return excludeCredentials;
186
+ }
187
+
188
+ function getTransportsAsString(transportsList) {
189
+ if (transportsList === '' || transportsList.constructor !== Array) return "";
190
+
191
+ let transportsString = "";
192
+
193
+ for (let i = 0; i < transportsList.length; i++) {
194
+ transportsString += transportsList[i] + ",";
195
+ }
196
+
197
+ return transportsString.slice(0, -1);
198
+ }
199
+ `
200
+ }
201
+ ]
202
+ });
203
+
204
+ useEffect(() => {
205
+ insertScriptTags();
206
+ }, []);
207
+
208
+ return (
209
+ <Template
210
+ {...{ kcContext, i18n, doUseDefaultCss, classes }}
211
+ headerNode={
212
+ <>
213
+ <span className={getClassName("kcWebAuthnKeyIcon")} />
214
+ {msg("webauthn-registration-title")}
215
+ </>
216
+ }
217
+ >
218
+ <form id="register" className={getClassName("kcFormClass")} action={url.loginAction} method="post">
219
+ <div className={getClassName("kcFormGroupClass")}>
220
+ <input type="hidden" id="clientDataJSON" name="clientDataJSON" />
221
+ <input type="hidden" id="attestationObject" name="attestationObject" />
222
+ <input type="hidden" id="publicKeyCredentialId" name="publicKeyCredentialId" />
223
+ <input type="hidden" id="authenticatorLabel" name="authenticatorLabel" />
224
+ <input type="hidden" id="transports" name="transports" />
225
+ <input type="hidden" id="error" name="error" />
226
+ <LogoutOtherSessions {...{ i18n, getClassName }} />
227
+ </div>
228
+ </form>
229
+ <input
230
+ type="submit"
231
+ className={clsx(
232
+ getClassName("kcButtonClass"),
233
+ getClassName("kcButtonPrimaryClass"),
234
+ getClassName("kcButtonBlockClass"),
235
+ getClassName("kcButtonLargeClass")
236
+ )}
237
+ id="registerWebAuthn"
238
+ value={msgStr("doRegisterSecurityKey")}
239
+ onClick={() => {
240
+ assert("registerSecurityKey" in window);
241
+ assert(typeof window.registerSecurityKey === "function");
242
+ window.registerSecurityKey();
243
+ }}
244
+ />
245
+
246
+ {!isSetRetry && isAppInitiatedAction && (
247
+ <form action={url.loginAction} className={getClassName("kcFormClass")} id="kc-webauthn-settings-form" method="post">
248
+ <button
249
+ type="submit"
250
+ className={clsx(
251
+ getClassName("kcButtonClass"),
252
+ getClassName("kcButtonDefaultClass"),
253
+ getClassName("kcButtonBlockClass"),
254
+ getClassName("kcButtonLargeClass")
255
+ )}
256
+ id="cancelWebAuthnAIA"
257
+ name="cancel-aia"
258
+ value="true"
259
+ >
260
+ {msg("doCancel")}
261
+ </button>
262
+ </form>
263
+ )}
264
+ </Template>
265
+ );
266
+ }
267
+
268
+ function LogoutOtherSessions(props: { i18n: I18n; getClassName: ReturnType<typeof useGetClassName>["getClassName"] }) {
269
+ const { getClassName, i18n } = props;
270
+
271
+ const { msg } = i18n;
272
+
273
+ return (
274
+ <div id="kc-form-options" className={getClassName("kcFormOptionsClass")}>
275
+ <div className={getClassName("kcFormOptionsWrapperClass")}>
276
+ <div className="checkbox">
277
+ <label>
278
+ <input type="checkbox" id="logout-sessions" name="logout-sessions" value="on" checked />
279
+ {msg("logoutOtherSessions")}
280
+ </label>
281
+ </div>
282
+ </div>
283
+ </div>
284
+ );
285
+ }
@@ -0,0 +1,48 @@
1
+ export const formatNumber = (input: string, format: string): string => {
2
+ if (!input) {
3
+ return "";
4
+ }
5
+
6
+ // array holding the patterns for the number of expected digits in each part
7
+ const digitPattern = format.match(/{\d+}/g);
8
+
9
+ if (!digitPattern) {
10
+ return "";
11
+ }
12
+
13
+ // calculate the maximum size of the given pattern based on the sum of the expected digits
14
+ const maxSize = digitPattern.reduce((total, p) => total + parseInt(p.replace("{", "").replace("}", "")), 0);
15
+
16
+ // keep only digits
17
+ let rawValue = input.replace(/\D+/g, "");
18
+
19
+ // make sure the value is a number
20
+ if (`${parseInt(rawValue)}` !== rawValue) {
21
+ return "";
22
+ }
23
+
24
+ // make sure the number of digits does not exceed the maximum size
25
+ if (rawValue.length > maxSize) {
26
+ rawValue = rawValue.substring(0, maxSize);
27
+ }
28
+
29
+ // build the regex based based on the expected digits in each part
30
+ const formatter = digitPattern.reduce((result, p) => result + `(\\d${p})`, "^");
31
+
32
+ // if the current digits match the pattern we have each group of digits in an array
33
+ let digits = new RegExp(formatter).exec(rawValue);
34
+
35
+ // no match, return the raw value without any format
36
+ if (!digits) {
37
+ return input;
38
+ }
39
+
40
+ let result = format;
41
+
42
+ // finally format the current digits accordingly to the given format
43
+ for (let i = 0; i < digitPattern.length; i++) {
44
+ result = result.replace(digitPattern[i], digits[i + 1]);
45
+ }
46
+
47
+ return result;
48
+ };
@@ -0,0 +1,82 @@
1
+ import { useReducer, useEffect } from "react";
2
+
3
+ export function createUseInsertLinkTags() {
4
+ let linkTagsContext:
5
+ | {
6
+ styleSheetHrefs: string[];
7
+ prAreAllStyleSheetsLoaded: Promise<void>;
8
+ remove: () => void;
9
+ }
10
+ | undefined = undefined;
11
+
12
+ /** NOTE: The hrefs can't changes. There should be only one one call on this. */
13
+ function useInsertLinkTags(params: { hrefs: string[] }) {
14
+ const { hrefs } = params;
15
+
16
+ const [areAllStyleSheetsLoaded, setAllStyleSheetLoaded] = useReducer(() => true, hrefs.length === 0);
17
+
18
+ useEffect(() => {
19
+ let isActive = true;
20
+
21
+ mount_link_tags: {
22
+ if (linkTagsContext !== undefined) {
23
+ if (JSON.stringify(linkTagsContext.styleSheetHrefs) === JSON.stringify(hrefs)) {
24
+ break mount_link_tags;
25
+ }
26
+
27
+ linkTagsContext.remove();
28
+
29
+ linkTagsContext = undefined;
30
+ }
31
+
32
+ let lastMountedHtmlElement: HTMLLinkElement | undefined = undefined;
33
+
34
+ const prs: Promise<void>[] = [];
35
+ const removeFns: (() => void)[] = [];
36
+
37
+ for (const href of hrefs) {
38
+ const htmlElement = document.createElement("link");
39
+
40
+ prs.push(new Promise<void>(resolve => htmlElement.addEventListener("load", () => resolve())));
41
+
42
+ htmlElement.rel = "stylesheet";
43
+
44
+ htmlElement.href = href;
45
+
46
+ if (lastMountedHtmlElement !== undefined) {
47
+ lastMountedHtmlElement.insertAdjacentElement("afterend", htmlElement);
48
+ } else {
49
+ document.head.prepend(htmlElement);
50
+ }
51
+
52
+ removeFns.push(() => {
53
+ htmlElement.remove();
54
+ });
55
+
56
+ lastMountedHtmlElement = htmlElement;
57
+ }
58
+
59
+ linkTagsContext = {
60
+ "styleSheetHrefs": hrefs,
61
+ "prAreAllStyleSheetsLoaded": Promise.all(prs).then(() => undefined),
62
+ "remove": () => removeFns.forEach(fn => fn())
63
+ };
64
+ }
65
+
66
+ linkTagsContext.prAreAllStyleSheetsLoaded.then(() => {
67
+ if (!isActive) {
68
+ return;
69
+ }
70
+ setAllStyleSheetLoaded();
71
+ });
72
+
73
+ return () => {
74
+ isActive = false;
75
+ };
76
+ }, []);
77
+
78
+ return { areAllStyleSheetsLoaded };
79
+ }
80
+
81
+ return { useInsertLinkTags };
82
+ }
@@ -0,0 +1,106 @@
1
+ import { useCallback } from "react";
2
+ import { useConst } from "keycloakify/tools/useConst";
3
+ import { assert } from "tsafe/assert";
4
+
5
+ export type ScriptTag = ScriptTag.TextContent | ScriptTag.Src;
6
+
7
+ export namespace ScriptTag {
8
+ type Common = {
9
+ type: "text/javascript" | "module";
10
+ };
11
+
12
+ export type TextContent = Common & {
13
+ textContent: string;
14
+ };
15
+ export type Src = Common & {
16
+ src: string;
17
+ };
18
+ }
19
+
20
+ export function createUseInsertScriptTags() {
21
+ let areScriptsInserted = false;
22
+
23
+ function useInsertScriptTags(params: { scriptTags: ScriptTag[] }) {
24
+ const { scriptTags } = params;
25
+
26
+ const currentScriptTagsRef = useConst(() => ({ "current": scriptTags }));
27
+
28
+ currentScriptTagsRef.current = scriptTags;
29
+
30
+ const insertScriptTags = useCallback(() => {
31
+ {
32
+ const getFingerprint = (scriptTags: ScriptTag[]) =>
33
+ scriptTags
34
+ .map((scriptTag): string => {
35
+ if ("textContent" in scriptTag) {
36
+ return scriptTag.textContent;
37
+ }
38
+ if ("src" in scriptTag) {
39
+ return scriptTag.src;
40
+ }
41
+ assert(false);
42
+ })
43
+ .join("---");
44
+
45
+ if (getFingerprint(scriptTags) !== getFingerprint(currentScriptTagsRef.current)) {
46
+ // NOTE: This is for when the scripts imported in the Template have changed switching
47
+ // from one page to another in storybook.
48
+ window.location.reload();
49
+
50
+ return;
51
+ }
52
+ }
53
+
54
+ if (areScriptsInserted) {
55
+ return;
56
+ }
57
+
58
+ scriptTags.forEach(scriptTag => {
59
+ // NOTE: Avoid loading same script twice. (Like jQuery for example)
60
+ {
61
+ const scripts = document.getElementsByTagName("script");
62
+ for (let i = 0; i < scripts.length; i++) {
63
+ const script = scripts[i];
64
+ if ("textContent" in scriptTag) {
65
+ if (script.textContent === scriptTag.textContent) {
66
+ return;
67
+ }
68
+ continue;
69
+ }
70
+ if ("src" in scriptTag) {
71
+ if (script.getAttribute("src") === scriptTag.src) {
72
+ return;
73
+ }
74
+ continue;
75
+ }
76
+ assert(false);
77
+ }
78
+ }
79
+
80
+ const htmlElement = document.createElement("script");
81
+
82
+ htmlElement.type = scriptTag.type;
83
+
84
+ (() => {
85
+ if ("textContent" in scriptTag) {
86
+ htmlElement.textContent = scriptTag.textContent;
87
+ return;
88
+ }
89
+ if ("src" in scriptTag) {
90
+ htmlElement.src = scriptTag.src;
91
+ return;
92
+ }
93
+ assert(false);
94
+ })();
95
+
96
+ document.head.appendChild(htmlElement);
97
+ });
98
+
99
+ areScriptsInserted = true;
100
+ }, []);
101
+
102
+ return { insertScriptTags };
103
+ }
104
+
105
+ return { useInsertScriptTags };
106
+ }
@@ -0,0 +1,21 @@
1
+ import { useEffect } from "react";
2
+
3
+ export function useSetClassName(params: { qualifiedName: "html" | "body"; className: string | undefined }) {
4
+ const { qualifiedName, className } = params;
5
+
6
+ useEffect(() => {
7
+ if (className === undefined || className === "") {
8
+ return;
9
+ }
10
+
11
+ const htmlClassList = document.getElementsByTagName(qualifiedName)[0].classList;
12
+
13
+ const tokens = className.split(" ");
14
+
15
+ htmlClassList.add(...tokens);
16
+
17
+ return () => {
18
+ htmlClassList.remove(...tokens);
19
+ };
20
+ }, [className]);
21
+ }
@@ -0,0 +1 @@
1
+ export declare const formatNumber: (input: string, format: string) => string;
@@ -0,0 +1,37 @@
1
+ export const formatNumber = (input, format) => {
2
+ if (!input) {
3
+ return "";
4
+ }
5
+ // array holding the patterns for the number of expected digits in each part
6
+ const digitPattern = format.match(/{\d+}/g);
7
+ if (!digitPattern) {
8
+ return "";
9
+ }
10
+ // calculate the maximum size of the given pattern based on the sum of the expected digits
11
+ const maxSize = digitPattern.reduce((total, p) => total + parseInt(p.replace("{", "").replace("}", "")), 0);
12
+ // keep only digits
13
+ let rawValue = input.replace(/\D+/g, "");
14
+ // make sure the value is a number
15
+ if (`${parseInt(rawValue)}` !== rawValue) {
16
+ return "";
17
+ }
18
+ // make sure the number of digits does not exceed the maximum size
19
+ if (rawValue.length > maxSize) {
20
+ rawValue = rawValue.substring(0, maxSize);
21
+ }
22
+ // build the regex based based on the expected digits in each part
23
+ const formatter = digitPattern.reduce((result, p) => result + `(\\d${p})`, "^");
24
+ // if the current digits match the pattern we have each group of digits in an array
25
+ let digits = new RegExp(formatter).exec(rawValue);
26
+ // no match, return the raw value without any format
27
+ if (!digits) {
28
+ return input;
29
+ }
30
+ let result = format;
31
+ // finally format the current digits accordingly to the given format
32
+ for (let i = 0; i < digitPattern.length; i++) {
33
+ result = result.replace(digitPattern[i], digits[i + 1]);
34
+ }
35
+ return result;
36
+ };
37
+ //# sourceMappingURL=formatNumber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatNumber.js","sourceRoot":"","sources":["../src/tools/formatNumber.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAE,MAAc,EAAU,EAAE;IAClE,IAAI,CAAC,KAAK,EAAE;QACR,OAAO,EAAE,CAAC;KACb;IAED,4EAA4E;IAC5E,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE;QACf,OAAO,EAAE,CAAC;KACb;IAED,0FAA0F;IAC1F,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5G,mBAAmB;IACnB,IAAI,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEzC,kCAAkC;IAClC,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,QAAQ,EAAE;QACtC,OAAO,EAAE,CAAC;KACb;IAED,kEAAkE;IAClE,IAAI,QAAQ,CAAC,MAAM,GAAG,OAAO,EAAE;QAC3B,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;KAC7C;IAED,kEAAkE;IAClE,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEhF,mFAAmF;IACnF,IAAI,MAAM,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAElD,oDAAoD;IACpD,IAAI,CAAC,MAAM,EAAE;QACT,OAAO,KAAK,CAAC;KAChB;IAED,IAAI,MAAM,GAAG,MAAM,CAAC;IAEpB,oEAAoE;IACpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;KAC3D;IAED,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare function createUseInsertLinkTags(): {
2
+ useInsertLinkTags: (params: {
3
+ hrefs: string[];
4
+ }) => {
5
+ areAllStyleSheetsLoaded: boolean;
6
+ };
7
+ };
@@ -0,0 +1,57 @@
1
+ import { useReducer, useEffect } from "react";
2
+ export function createUseInsertLinkTags() {
3
+ let linkTagsContext = undefined;
4
+ /** NOTE: The hrefs can't changes. There should be only one one call on this. */
5
+ function useInsertLinkTags(params) {
6
+ const { hrefs } = params;
7
+ const [areAllStyleSheetsLoaded, setAllStyleSheetLoaded] = useReducer(() => true, hrefs.length === 0);
8
+ useEffect(() => {
9
+ let isActive = true;
10
+ mount_link_tags: {
11
+ if (linkTagsContext !== undefined) {
12
+ if (JSON.stringify(linkTagsContext.styleSheetHrefs) === JSON.stringify(hrefs)) {
13
+ break mount_link_tags;
14
+ }
15
+ linkTagsContext.remove();
16
+ linkTagsContext = undefined;
17
+ }
18
+ let lastMountedHtmlElement = undefined;
19
+ const prs = [];
20
+ const removeFns = [];
21
+ for (const href of hrefs) {
22
+ const htmlElement = document.createElement("link");
23
+ prs.push(new Promise(resolve => htmlElement.addEventListener("load", () => resolve())));
24
+ htmlElement.rel = "stylesheet";
25
+ htmlElement.href = href;
26
+ if (lastMountedHtmlElement !== undefined) {
27
+ lastMountedHtmlElement.insertAdjacentElement("afterend", htmlElement);
28
+ }
29
+ else {
30
+ document.head.prepend(htmlElement);
31
+ }
32
+ removeFns.push(() => {
33
+ htmlElement.remove();
34
+ });
35
+ lastMountedHtmlElement = htmlElement;
36
+ }
37
+ linkTagsContext = {
38
+ "styleSheetHrefs": hrefs,
39
+ "prAreAllStyleSheetsLoaded": Promise.all(prs).then(() => undefined),
40
+ "remove": () => removeFns.forEach(fn => fn())
41
+ };
42
+ }
43
+ linkTagsContext.prAreAllStyleSheetsLoaded.then(() => {
44
+ if (!isActive) {
45
+ return;
46
+ }
47
+ setAllStyleSheetLoaded();
48
+ });
49
+ return () => {
50
+ isActive = false;
51
+ };
52
+ }, []);
53
+ return { areAllStyleSheetsLoaded };
54
+ }
55
+ return { useInsertLinkTags };
56
+ }
57
+ //# sourceMappingURL=useInsertLinkTags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useInsertLinkTags.js","sourceRoot":"","sources":["../src/tools/useInsertLinkTags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,UAAU,uBAAuB;IACnC,IAAI,eAAe,GAMD,SAAS,CAAC;IAE5B,gFAAgF;IAChF,SAAS,iBAAiB,CAAC,MAA2B;QAClD,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;QAEzB,MAAM,CAAC,uBAAuB,EAAE,sBAAsB,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAErG,SAAS,CAAC,GAAG,EAAE;YACX,IAAI,QAAQ,GAAG,IAAI,CAAC;YAEpB,eAAe,EAAE;gBACb,IAAI,eAAe,KAAK,SAAS,EAAE;oBAC/B,IAAI,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE;wBAC3E,MAAM,eAAe,CAAC;qBACzB;oBAED,eAAe,CAAC,MAAM,EAAE,CAAC;oBAEzB,eAAe,GAAG,SAAS,CAAC;iBAC/B;gBAED,IAAI,sBAAsB,GAAgC,SAAS,CAAC;gBAEpE,MAAM,GAAG,GAAoB,EAAE,CAAC;gBAChC,MAAM,SAAS,GAAmB,EAAE,CAAC;gBAErC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;oBACtB,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;oBAEnD,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,WAAW,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;oBAE9F,WAAW,CAAC,GAAG,GAAG,YAAY,CAAC;oBAE/B,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC;oBAExB,IAAI,sBAAsB,KAAK,SAAS,EAAE;wBACtC,sBAAsB,CAAC,qBAAqB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;qBACzE;yBAAM;wBACH,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;qBACtC;oBAED,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE;wBAChB,WAAW,CAAC,MAAM,EAAE,CAAC;oBACzB,CAAC,CAAC,CAAC;oBAEH,sBAAsB,GAAG,WAAW,CAAC;iBACxC;gBAED,eAAe,GAAG;oBACd,iBAAiB,EAAE,KAAK;oBACxB,2BAA2B,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;oBACnE,QAAQ,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;iBAChD,CAAC;aACL;YAED,eAAe,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,EAAE;gBAChD,IAAI,CAAC,QAAQ,EAAE;oBACX,OAAO;iBACV;gBACD,sBAAsB,EAAE,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,OAAO,GAAG,EAAE;gBACR,QAAQ,GAAG,KAAK,CAAC;YACrB,CAAC,CAAC;QACN,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,EAAE,uBAAuB,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,EAAE,iBAAiB,EAAE,CAAC;AACjC,CAAC"}