@keycloakify/keycloak-account-ui 25.0.1-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 (349) hide show
  1. package/KeycloakAccountUi.d.ts +3 -0
  2. package/KeycloakAccountUi.js +29 -0
  3. package/KeycloakAccountUi.js.map +1 -0
  4. package/LICENSE +2 -0
  5. package/README.md +39 -0
  6. package/account-security/AccountRow.d.ts +8 -0
  7. package/account-security/AccountRow.js +36 -0
  8. package/account-security/AccountRow.js.map +1 -0
  9. package/account-security/DeviceActivity.d.ts +2 -0
  10. package/account-security/DeviceActivity.js +70 -0
  11. package/account-security/DeviceActivity.js.map +1 -0
  12. package/account-security/LinkedAccounts.d.ts +2 -0
  13. package/account-security/LinkedAccounts.js +25 -0
  14. package/account-security/LinkedAccounts.js.map +1 -0
  15. package/account-security/SigningIn.d.ts +2 -0
  16. package/account-security/SigningIn.js +65 -0
  17. package/account-security/SigningIn.js.map +1 -0
  18. package/api/constants.d.ts +2 -0
  19. package/api/constants.js +3 -0
  20. package/api/constants.js.map +1 -0
  21. package/api/methods.d.ts +25 -0
  22. package/api/methods.js +73 -0
  23. package/api/methods.js.map +1 -0
  24. package/api/parse-links.d.ts +5 -0
  25. package/api/parse-links.js +23 -0
  26. package/api/parse-links.js.map +1 -0
  27. package/api/parse-response.d.ts +3 -0
  28. package/api/parse-response.js +40 -0
  29. package/api/parse-response.js.map +1 -0
  30. package/api/representations.d.ts +202 -0
  31. package/api/representations.js +3 -0
  32. package/api/representations.js.map +1 -0
  33. package/api/request.d.ts +12 -0
  34. package/api/request.js +33 -0
  35. package/api/request.js.map +1 -0
  36. package/api.d.ts +13 -0
  37. package/api.js +52 -0
  38. package/api.js.map +1 -0
  39. package/applications/Applications.d.ts +2 -0
  40. package/applications/Applications.js +52 -0
  41. package/applications/Applications.js.map +1 -0
  42. package/components/datalist/EmptyRow.d.ts +5 -0
  43. package/components/datalist/EmptyRow.js +20 -0
  44. package/components/datalist/EmptyRow.js.map +1 -0
  45. package/components/page/Page.d.ts +7 -0
  46. package/components/page/Page.js +6 -0
  47. package/components/page/Page.js.map +1 -0
  48. package/content/ContentComponent.d.ts +2 -0
  49. package/content/ContentComponent.js +36 -0
  50. package/content/ContentComponent.js.map +1 -0
  51. package/content/fetchContent.d.ts +3 -0
  52. package/content/fetchContent.js +6 -0
  53. package/content/fetchContent.js.map +1 -0
  54. package/environment.d.ts +25 -0
  55. package/environment.js +3 -0
  56. package/environment.js.map +1 -0
  57. package/groups/Groups.d.ts +2 -0
  58. package/groups/Groups.js +45 -0
  59. package/groups/Groups.js.map +1 -0
  60. package/i18n.d.ts +4 -0
  61. package/i18n.js +31 -0
  62. package/i18n.js.map +1 -0
  63. package/oid4vci/Oid4Vci.d.ts +2 -0
  64. package/oid4vci/Oid4Vci.js +54 -0
  65. package/oid4vci/Oid4Vci.js.map +1 -0
  66. package/package.json +428 -0
  67. package/personal-info/PersonalInfo.d.ts +2 -0
  68. package/personal-info/PersonalInfo.js +63 -0
  69. package/personal-info/PersonalInfo.js.map +1 -0
  70. package/resources/EditTheResource.d.ts +8 -0
  71. package/resources/EditTheResource.js +36 -0
  72. package/resources/EditTheResource.js.map +1 -0
  73. package/resources/PermissionRequest.d.ts +7 -0
  74. package/resources/PermissionRequest.js +39 -0
  75. package/resources/PermissionRequest.js.map +1 -0
  76. package/resources/ResourceToolbar.d.ts +12 -0
  77. package/resources/ResourceToolbar.js +24 -0
  78. package/resources/ResourceToolbar.js.map +1 -0
  79. package/resources/Resources.d.ts +2 -0
  80. package/resources/Resources.js +13 -0
  81. package/resources/Resources.js.map +1 -0
  82. package/resources/ResourcesTab.d.ts +5 -0
  83. package/resources/ResourcesTab.js +103 -0
  84. package/resources/ResourcesTab.js.map +1 -0
  85. package/resources/ShareTheResource.d.ts +9 -0
  86. package/resources/ShareTheResource.js +70 -0
  87. package/resources/ShareTheResource.js.map +1 -0
  88. package/resources/SharedWith.d.ts +6 -0
  89. package/resources/SharedWith.js +8 -0
  90. package/resources/SharedWith.js.map +1 -0
  91. package/root/ErrorPage.d.ts +5 -0
  92. package/root/ErrorPage.js +29 -0
  93. package/root/ErrorPage.js.map +1 -0
  94. package/root/Header.d.ts +1 -0
  95. package/root/Header.js +31 -0
  96. package/root/Header.js.map +1 -0
  97. package/root/PageNav.d.ts +23 -0
  98. package/root/PageNav.js +44 -0
  99. package/root/PageNav.js.map +1 -0
  100. package/root/Root.d.ts +1 -0
  101. package/root/Root.js +12 -0
  102. package/root/Root.js.map +1 -0
  103. package/root/header.module.css +3 -0
  104. package/routes.d.ts +15 -0
  105. package/routes.js +69 -0
  106. package/routes.js.map +1 -0
  107. package/src/KeycloakAccountUi.tsx +36 -0
  108. package/src/account-security/AccountRow.tsx +136 -0
  109. package/src/account-security/DeviceActivity.tsx +253 -0
  110. package/src/account-security/LinkedAccounts.tsx +86 -0
  111. package/src/account-security/SigningIn.tsx +251 -0
  112. package/src/api/constants.ts +2 -0
  113. package/src/api/methods.ts +158 -0
  114. package/src/api/parse-links.ts +28 -0
  115. package/src/api/parse-response.ts +53 -0
  116. package/src/api/representations.ts +219 -0
  117. package/src/api/request.ts +74 -0
  118. package/src/api.ts +127 -0
  119. package/src/applications/Applications.tsx +282 -0
  120. package/src/components/datalist/EmptyRow.tsx +26 -0
  121. package/src/components/page/Page.tsx +27 -0
  122. package/src/content/ContentComponent.tsx +62 -0
  123. package/src/content/fetchContent.ts +13 -0
  124. package/src/environment.ts +31 -0
  125. package/src/global.d.ts +4 -0
  126. package/src/groups/Groups.tsx +142 -0
  127. package/src/i18n.ts +47 -0
  128. package/src/i18next.d.ts +10 -0
  129. package/src/oid4vci/Oid4Vci.tsx +136 -0
  130. package/src/personal-info/PersonalInfo.tsx +184 -0
  131. package/src/resources/EditTheResource.tsx +101 -0
  132. package/src/resources/PermissionRequest.tsx +129 -0
  133. package/src/resources/ResourceToolbar.tsx +87 -0
  134. package/src/resources/Resources.tsx +39 -0
  135. package/src/resources/ResourcesTab.tsx +410 -0
  136. package/src/resources/ShareTheResource.tsx +217 -0
  137. package/src/resources/SharedWith.tsx +26 -0
  138. package/src/root/ErrorPage.tsx +65 -0
  139. package/src/root/Header.tsx +62 -0
  140. package/src/root/PageNav.tsx +154 -0
  141. package/src/root/Root.tsx +20 -0
  142. package/src/root/header.module.css +3 -0
  143. package/src/routes.tsx +85 -0
  144. package/src/ui-shared/alerts/Alerts.tsx +86 -0
  145. package/src/ui-shared/buttons/FormSubmitButton.tsx +47 -0
  146. package/src/ui-shared/context/ErrorPage.tsx +60 -0
  147. package/src/ui-shared/context/HelpContext.tsx +30 -0
  148. package/src/ui-shared/context/KeycloakContext.tsx +97 -0
  149. package/src/ui-shared/context/environment.ts +50 -0
  150. package/src/ui-shared/continue-cancel/ContinueCancelModal.tsx +75 -0
  151. package/src/ui-shared/controls/FormErrorText.tsx +23 -0
  152. package/src/ui-shared/controls/FormLabel.tsx +40 -0
  153. package/src/ui-shared/controls/HelpItem.tsx +43 -0
  154. package/src/ui-shared/controls/NumberControl.tsx +89 -0
  155. package/src/ui-shared/controls/PasswordControl.tsx +71 -0
  156. package/src/ui-shared/controls/PasswordInput.tsx +50 -0
  157. package/src/ui-shared/controls/SwitchControl.tsx +67 -0
  158. package/src/ui-shared/controls/TextAreaControl.tsx +60 -0
  159. package/src/ui-shared/controls/TextControl.tsx +74 -0
  160. package/src/ui-shared/controls/keycloak-text-area/KeycloakTextArea.tsx +23 -0
  161. package/src/ui-shared/controls/select-control/SelectControl.tsx +75 -0
  162. package/src/ui-shared/controls/select-control/SingleSelectControl.tsx +107 -0
  163. package/src/ui-shared/controls/select-control/TypeaheadSelectControl.tsx +283 -0
  164. package/src/ui-shared/icons/IconMapper.tsx +63 -0
  165. package/src/ui-shared/index.ts +1 -0
  166. package/src/ui-shared/main.ts +62 -0
  167. package/src/ui-shared/masthead/DefaultAvatar.tsx +109 -0
  168. package/src/ui-shared/masthead/KeycloakDropdown.tsx +47 -0
  169. package/src/ui-shared/masthead/Masthead.tsx +145 -0
  170. package/src/ui-shared/scroll-form/FormPanel.tsx +29 -0
  171. package/src/ui-shared/scroll-form/FormTitle.tsx +28 -0
  172. package/src/ui-shared/scroll-form/ScrollForm.tsx +98 -0
  173. package/src/ui-shared/scroll-form/ScrollPanel.tsx +21 -0
  174. package/src/ui-shared/scroll-form/form-title.module.css +4 -0
  175. package/src/ui-shared/scroll-form/scroll-form.module.css +8 -0
  176. package/src/ui-shared/select/KeycloakSelect.tsx +49 -0
  177. package/src/ui-shared/select/SingleSelect.tsx +85 -0
  178. package/src/ui-shared/select/TypeaheadSelect.tsx +196 -0
  179. package/src/ui-shared/user-profile/LocaleSelector.tsx +51 -0
  180. package/src/ui-shared/user-profile/MultiInputComponent.tsx +146 -0
  181. package/src/ui-shared/user-profile/OptionsComponent.tsx +60 -0
  182. package/src/ui-shared/user-profile/SelectComponent.tsx +106 -0
  183. package/src/ui-shared/user-profile/TextAreaComponent.tsx +23 -0
  184. package/src/ui-shared/user-profile/TextComponent.tsx +30 -0
  185. package/src/ui-shared/user-profile/UserProfileFields.tsx +246 -0
  186. package/src/ui-shared/user-profile/UserProfileGroup.tsx +70 -0
  187. package/src/ui-shared/user-profile/utils.ts +161 -0
  188. package/src/ui-shared/utils/createNamedContext.ts +11 -0
  189. package/src/ui-shared/utils/isDefined.ts +3 -0
  190. package/src/ui-shared/utils/useRequiredContext.ts +24 -0
  191. package/src/ui-shared/utils/useStorageItem.ts +51 -0
  192. package/src/ui-shared/utils/useStoredState.ts +38 -0
  193. package/src/utils/formatDate.ts +18 -0
  194. package/src/utils/isRecord.ts +2 -0
  195. package/src/utils/joinPath.ts +22 -0
  196. package/src/utils/usePromise.ts +74 -0
  197. package/ui-shared/alerts/Alerts.d.ts +17 -0
  198. package/ui-shared/alerts/Alerts.js +27 -0
  199. package/ui-shared/alerts/Alerts.js.map +1 -0
  200. package/ui-shared/buttons/FormSubmitButton.d.ts +10 -0
  201. package/ui-shared/buttons/FormSubmitButton.js +26 -0
  202. package/ui-shared/buttons/FormSubmitButton.js.map +1 -0
  203. package/ui-shared/context/ErrorPage.d.ts +5 -0
  204. package/ui-shared/context/ErrorPage.js +24 -0
  205. package/ui-shared/context/ErrorPage.js.map +1 -0
  206. package/ui-shared/context/HelpContext.d.ts +9 -0
  207. package/ui-shared/context/HelpContext.js +14 -0
  208. package/ui-shared/context/HelpContext.js.map +1 -0
  209. package/ui-shared/context/KeycloakContext.d.ts +12 -0
  210. package/ui-shared/context/KeycloakContext.js +53 -0
  211. package/ui-shared/context/KeycloakContext.js.map +1 -0
  212. package/ui-shared/context/environment.d.ts +36 -0
  213. package/ui-shared/context/environment.js +27 -0
  214. package/ui-shared/context/environment.js.map +1 -0
  215. package/ui-shared/continue-cancel/ContinueCancelModal.d.ts +15 -0
  216. package/ui-shared/continue-cancel/ContinueCancelModal.js +27 -0
  217. package/ui-shared/continue-cancel/ContinueCancelModal.js.map +1 -0
  218. package/ui-shared/controls/FormErrorText.d.ts +5 -0
  219. package/ui-shared/controls/FormErrorText.js +19 -0
  220. package/ui-shared/controls/FormErrorText.js.map +1 -0
  221. package/ui-shared/controls/FormLabel.d.ts +13 -0
  222. package/ui-shared/controls/FormLabel.js +20 -0
  223. package/ui-shared/controls/FormLabel.js.map +1 -0
  224. package/ui-shared/controls/HelpItem.d.ts +9 -0
  225. package/ui-shared/controls/HelpItem.js +9 -0
  226. package/ui-shared/controls/HelpItem.js.map +1 -0
  227. package/ui-shared/controls/NumberControl.d.ts +13 -0
  228. package/ui-shared/controls/NumberControl.js +32 -0
  229. package/ui-shared/controls/NumberControl.js.map +1 -0
  230. package/ui-shared/controls/PasswordControl.d.ts +9 -0
  231. package/ui-shared/controls/PasswordControl.js +25 -0
  232. package/ui-shared/controls/PasswordControl.js.map +1 -0
  233. package/ui-shared/controls/PasswordInput.d.ts +7 -0
  234. package/ui-shared/controls/PasswordInput.js +25 -0
  235. package/ui-shared/controls/PasswordInput.js.map +1 -0
  236. package/ui-shared/controls/SwitchControl.d.ts +11 -0
  237. package/ui-shared/controls/SwitchControl.js +29 -0
  238. package/ui-shared/controls/SwitchControl.js.map +1 -0
  239. package/ui-shared/controls/TextAreaControl.d.ts +8 -0
  240. package/ui-shared/controls/TextAreaControl.js +12 -0
  241. package/ui-shared/controls/TextAreaControl.js.map +1 -0
  242. package/ui-shared/controls/TextControl.d.ts +10 -0
  243. package/ui-shared/controls/TextControl.js +24 -0
  244. package/ui-shared/controls/TextControl.js.map +1 -0
  245. package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.d.ts +4 -0
  246. package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.js +5 -0
  247. package/ui-shared/controls/keycloak-text-area/KeycloakTextArea.js.map +1 -0
  248. package/ui-shared/controls/select-control/SelectControl.d.ts +31 -0
  249. package/ui-shared/controls/select-control/SelectControl.js +28 -0
  250. package/ui-shared/controls/select-control/SelectControl.js.map +1 -0
  251. package/ui-shared/controls/select-control/SingleSelectControl.d.ts +3 -0
  252. package/ui-shared/controls/select-control/SingleSelectControl.js +41 -0
  253. package/ui-shared/controls/select-control/SingleSelectControl.js.map +1 -0
  254. package/ui-shared/controls/select-control/TypeaheadSelectControl.d.ts +3 -0
  255. package/ui-shared/controls/select-control/TypeaheadSelectControl.js +138 -0
  256. package/ui-shared/controls/select-control/TypeaheadSelectControl.js.map +1 -0
  257. package/ui-shared/icons/IconMapper.d.ts +5 -0
  258. package/ui-shared/icons/IconMapper.js +40 -0
  259. package/ui-shared/icons/IconMapper.js.map +1 -0
  260. package/ui-shared/index.d.ts +1 -0
  261. package/ui-shared/index.js +2 -0
  262. package/ui-shared/index.js.map +1 -0
  263. package/ui-shared/main.d.ts +31 -0
  264. package/ui-shared/main.js +29 -0
  265. package/ui-shared/main.js.map +1 -0
  266. package/ui-shared/masthead/DefaultAvatar.d.ts +7 -0
  267. package/ui-shared/masthead/DefaultAvatar.js +26 -0
  268. package/ui-shared/masthead/DefaultAvatar.js.map +1 -0
  269. package/ui-shared/masthead/KeycloakDropdown.d.ts +10 -0
  270. package/ui-shared/masthead/KeycloakDropdown.js +23 -0
  271. package/ui-shared/masthead/KeycloakDropdown.js.map +1 -0
  272. package/ui-shared/masthead/Masthead.d.ts +22 -0
  273. package/ui-shared/masthead/Masthead.js +55 -0
  274. package/ui-shared/masthead/Masthead.js.map +1 -0
  275. package/ui-shared/scroll-form/FormPanel.d.ts +8 -0
  276. package/ui-shared/scroll-form/FormPanel.js +9 -0
  277. package/ui-shared/scroll-form/FormPanel.js.map +1 -0
  278. package/ui-shared/scroll-form/FormTitle.d.ts +8 -0
  279. package/ui-shared/scroll-form/FormTitle.js +19 -0
  280. package/ui-shared/scroll-form/FormTitle.js.map +1 -0
  281. package/ui-shared/scroll-form/ScrollForm.d.ts +15 -0
  282. package/ui-shared/scroll-form/ScrollForm.js +38 -0
  283. package/ui-shared/scroll-form/ScrollForm.js.map +1 -0
  284. package/ui-shared/scroll-form/ScrollPanel.d.ts +7 -0
  285. package/ui-shared/scroll-form/ScrollPanel.js +18 -0
  286. package/ui-shared/scroll-form/ScrollPanel.js.map +1 -0
  287. package/ui-shared/select/KeycloakSelect.d.ts +30 -0
  288. package/ui-shared/select/KeycloakSelect.js +31 -0
  289. package/ui-shared/select/KeycloakSelect.js.map +1 -0
  290. package/ui-shared/select/SingleSelect.d.ts +4 -0
  291. package/ui-shared/select/SingleSelect.js +46 -0
  292. package/ui-shared/select/SingleSelect.js.map +1 -0
  293. package/ui-shared/select/TypeaheadSelect.d.ts +2 -0
  294. package/ui-shared/select/TypeaheadSelect.js +96 -0
  295. package/ui-shared/select/TypeaheadSelect.js.map +1 -0
  296. package/ui-shared/user-profile/LocaleSelector.d.ts +7 -0
  297. package/ui-shared/user-profile/LocaleSelector.js +28 -0
  298. package/ui-shared/user-profile/LocaleSelector.js.map +1 -0
  299. package/ui-shared/user-profile/MultiInputComponent.d.ts +15 -0
  300. package/ui-shared/user-profile/MultiInputComponent.js +61 -0
  301. package/ui-shared/user-profile/MultiInputComponent.js.map +1 -0
  302. package/ui-shared/user-profile/OptionsComponent.d.ts +2 -0
  303. package/ui-shared/user-profile/OptionsComponent.js +28 -0
  304. package/ui-shared/user-profile/OptionsComponent.js.map +1 -0
  305. package/ui-shared/user-profile/SelectComponent.d.ts +2 -0
  306. package/ui-shared/user-profile/SelectComponent.js +55 -0
  307. package/ui-shared/user-profile/SelectComponent.js.map +1 -0
  308. package/ui-shared/user-profile/TextAreaComponent.d.ts +2 -0
  309. package/ui-shared/user-profile/TextAreaComponent.js +11 -0
  310. package/ui-shared/user-profile/TextAreaComponent.js.map +1 -0
  311. package/ui-shared/user-profile/TextComponent.d.ts +2 -0
  312. package/ui-shared/user-profile/TextComponent.js +14 -0
  313. package/ui-shared/user-profile/TextComponent.js.map +1 -0
  314. package/ui-shared/user-profile/UserProfileFields.d.ts +39 -0
  315. package/ui-shared/user-profile/UserProfileFields.js +112 -0
  316. package/ui-shared/user-profile/UserProfileFields.js.map +1 -0
  317. package/ui-shared/user-profile/UserProfileGroup.d.ts +12 -0
  318. package/ui-shared/user-profile/UserProfileGroup.js +15 -0
  319. package/ui-shared/user-profile/UserProfileGroup.js.map +1 -0
  320. package/ui-shared/user-profile/utils.d.ts +32 -0
  321. package/ui-shared/user-profile/utils.js +79 -0
  322. package/ui-shared/user-profile/utils.js.map +1 -0
  323. package/ui-shared/utils/createNamedContext.d.ts +3 -0
  324. package/ui-shared/utils/createNamedContext.js +7 -0
  325. package/ui-shared/utils/createNamedContext.js.map +1 -0
  326. package/ui-shared/utils/isDefined.d.ts +1 -0
  327. package/ui-shared/utils/isDefined.js +4 -0
  328. package/ui-shared/utils/isDefined.js.map +1 -0
  329. package/ui-shared/utils/useRequiredContext.d.ts +9 -0
  330. package/ui-shared/utils/useRequiredContext.js +17 -0
  331. package/ui-shared/utils/useRequiredContext.js.map +1 -0
  332. package/ui-shared/utils/useStorageItem.d.ts +10 -0
  333. package/ui-shared/utils/useStorageItem.js +40 -0
  334. package/ui-shared/utils/useStorageItem.js.map +1 -0
  335. package/ui-shared/utils/useStoredState.d.ts +13 -0
  336. package/ui-shared/utils/useStoredState.js +21 -0
  337. package/ui-shared/utils/useStoredState.js.map +1 -0
  338. package/utils/formatDate.d.ts +4 -0
  339. package/utils/formatDate.js +12 -0
  340. package/utils/formatDate.js.map +1 -0
  341. package/utils/isRecord.d.ts +1 -0
  342. package/utils/isRecord.js +2 -0
  343. package/utils/isRecord.js.map +1 -0
  344. package/utils/joinPath.d.ts +1 -0
  345. package/utils/joinPath.js +18 -0
  346. package/utils/joinPath.js.map +1 -0
  347. package/utils/usePromise.d.ts +41 -0
  348. package/utils/usePromise.js +55 -0
  349. package/utils/usePromise.js.map +1 -0
@@ -0,0 +1,3 @@
1
+ import "@patternfly/react-core/dist/styles/base.css";
2
+ import "@patternfly/patternfly/patternfly-addons.css";
3
+ export default function KeycloakAccountUi(): import("react/jsx-runtime").JSX.Element | null;
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { useEffect, useReducer } from "react";
3
+ import "@patternfly/react-core/dist/styles/base.css";
4
+ import "@patternfly/patternfly/patternfly-addons.css";
5
+ import { createBrowserRouter, RouterProvider } from "react-router-dom";
6
+ import { i18n } from "./i18n";
7
+ import { routes } from "./routes";
8
+ const router = createBrowserRouter(routes);
9
+ const prI18nInitialized = i18n.init();
10
+ export default function KeycloakAccountUi() {
11
+ const [isI18nInitialized, setI18nInitialized] = useReducer(() => true, false);
12
+ useEffect(() => {
13
+ let isActive = true;
14
+ prI18nInitialized.then(() => {
15
+ if (!isActive) {
16
+ return;
17
+ }
18
+ setI18nInitialized();
19
+ });
20
+ return () => {
21
+ isActive = false;
22
+ };
23
+ }, []);
24
+ if (!isI18nInitialized) {
25
+ return null;
26
+ }
27
+ return _jsx(RouterProvider, { router: router });
28
+ }
29
+ //# sourceMappingURL=KeycloakAccountUi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KeycloakAccountUi.js","sourceRoot":"","sources":["src/KeycloakAccountUi.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC9C,OAAO,6CAA6C,CAAC;AACrD,OAAO,8CAA8C,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvE,OAAO,EAAE,IAAI,EAAE,MAAM,uCAAuC,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,yCAAyC,CAAC;AAEjE,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;AAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AAEtC,MAAM,CAAC,OAAO,UAAU,iBAAiB;IACvC,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAE9E,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,QAAQ,GAAG,IAAI,CAAC;QAEpB,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE;YAC1B,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO;YACT,CAAC;YACD,kBAAkB,EAAE,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,KAAC,cAAc,IAAC,MAAM,EAAE,MAAM,GAAI,CAAC;AAC5C,CAAC"}
package/LICENSE ADDED
@@ -0,0 +1,2 @@
1
+ This is a re-package of https://github.com/keycloak/keycloak/tree/25.0.1/js/apps/account-ui
2
+ The license of the original project is Apache-2.0
package/README.md ADDED
@@ -0,0 +1,39 @@
1
+ # @keycloakify/keycloak-account-ui
2
+
3
+ This project is a re-packaged version of the [`@keycloak/keycloak-account-ui`](https://www.npmjs.com/package/@keycloak/keycloak-account-ui) package.
4
+ The version of [`@keycloakify/keycloak-account-ui`](https://www.npmjs.com/package/@keycloakify/keycloak-account-ui) matches that of the original package.
5
+ The purpose of this package is to allow cherry-picking imports and taking ownership of specific portions of the package.
6
+ For more details on integrating this package into your project, refer to the [Keycloakify documentation](https://keycloakify.dev).
7
+
8
+ > **Note:** This package's GitHub repository does not contain any code as it is automatically generated at build time by [scripts/prepare.ts](/scripts/prepare.ts).
9
+
10
+ ## Installation
11
+
12
+ > You are currently viewing the version of `@keycloakify/keycloak-account-ui` that mirrors `@keycloak/keycloak-account-ui` version **25.0.1**.
13
+ > It is the version of the Account UI that ships with Keycloak **25.0.1**.
14
+
15
+ To install this package, you must also install all the required peer dependencies. It is important to copy and paste the version ranges exactly to avoid any compatibility issues. Add this to your `package.json`:
16
+
17
+ ```json
18
+ {
19
+ "dependencies": {
20
+ "@keycloakify/keycloak-account-ui": "25.0.1-rc.0",
21
+ "@patternfly/patternfly": "^5.3.1",
22
+ "@patternfly/react-core": "^5.3.3",
23
+ "@patternfly/react-icons": "^5.3.2",
24
+ "@patternfly/react-table": "^5.3.3",
25
+ "i18next": "^23.11.5",
26
+ "i18next-http-backend": "^2.5.2",
27
+ "lodash-es": "^4.17.21",
28
+ "react-hook-form": "7.51.5",
29
+ "react-i18next": "^14.1.2",
30
+ "react-router-dom": "^6.23.1",
31
+ "keycloak-js": "25.0.1",
32
+ "@patternfly/react-styles": "^5.3.1",
33
+ "@keycloak/keycloak-admin-client": "25.0.1"
34
+ },
35
+ "devDependencies": {
36
+ "@types/lodash-es": "^4.17.12"
37
+ }
38
+ }
39
+ ```
@@ -0,0 +1,8 @@
1
+ import { LinkedAccountRepresentation } from "../api/representations";
2
+ type AccountRowProps = {
3
+ account: LinkedAccountRepresentation;
4
+ isLinked?: boolean;
5
+ refresh: () => void;
6
+ };
7
+ export declare const AccountRow: ({ account, isLinked, refresh, }: AccountRowProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,36 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, DataListAction, DataListCell, DataListItem, DataListItemCells, DataListItemRow, Icon, Label, Split, SplitItem, } from "@patternfly/react-core";
3
+ import { LinkIcon, UnlinkIcon } from "@patternfly/react-icons";
4
+ import { useTranslation } from "react-i18next";
5
+ import { IconMapper, useAlerts, useEnvironment, } from "../ui-shared";
6
+ import { linkAccount, unLinkAccount } from "../api/methods";
7
+ export const AccountRow = ({ account, isLinked = false, refresh, }) => {
8
+ const { t } = useTranslation();
9
+ const context = useEnvironment();
10
+ const { addAlert, addError } = useAlerts();
11
+ const unLink = async (account) => {
12
+ try {
13
+ await unLinkAccount(context, account);
14
+ addAlert(t("unLinkSuccess"));
15
+ refresh();
16
+ }
17
+ catch (error) {
18
+ addError(t("unLinkError", { error }).toString());
19
+ }
20
+ };
21
+ const link = async (account) => {
22
+ try {
23
+ const { accountLinkUri } = await linkAccount(context, account);
24
+ location.href = accountLinkUri;
25
+ }
26
+ catch (error) {
27
+ addError(t("linkError", { error }).toString());
28
+ }
29
+ };
30
+ return (_jsx(DataListItem, { id: `${account.providerAlias}-idp`, "aria-label": t("linkedAccounts"), children: _jsxs(DataListItemRow, { "data-testid": `linked-accounts/${account.providerName}`, children: [_jsx(DataListItemCells, { dataListCells: [
31
+ _jsx(DataListCell, { children: _jsxs(Split, { children: [_jsx(SplitItem, { className: "pf-v5-u-mr-sm", children: _jsx(IconMapper, { icon: account.providerName }) }), _jsx(SplitItem, { className: "pf-v5-u-my-xs", isFilled: true, children: _jsx("span", { id: `${account.providerAlias}-idp-name`, children: account.displayName }) })] }) }, "idp"),
32
+ _jsx(DataListCell, { children: _jsx(Split, { children: _jsx(SplitItem, { className: "pf-v5-u-my-xs", isFilled: true, children: _jsx("span", { id: `${account.providerAlias}-idp-label`, children: _jsx(Label, { color: account.social ? "blue" : "green", children: t(account.social ? "socialLogin" : "systemDefined") }) }) }) }) }, "label"),
33
+ _jsx(DataListCell, { width: 5, children: _jsx(Split, { children: _jsx(SplitItem, { className: "pf-v5-u-my-xs", isFilled: true, children: _jsx("span", { id: `${account.providerAlias}-idp-username`, children: account.linkedUsername }) }) }) }, "username"),
34
+ ] }), _jsxs(DataListAction, { "aria-labelledby": t("link"), "aria-label": t("unLink"), id: "setPasswordAction", children: [isLinked && (_jsxs(Button, { id: `${account.providerAlias}-idp-unlink`, variant: "link", onClick: () => unLink(account), children: [_jsx(Icon, { size: "sm", children: _jsx(UnlinkIcon, {}) }), " ", t("unLink")] })), !isLinked && (_jsxs(Button, { id: `${account.providerAlias}-idp-link`, variant: "link", onClick: () => link(account), children: [_jsx(Icon, { size: "sm", children: _jsx(LinkIcon, {}) }), " ", t("link")] }))] })] }, account.providerName) }, account.providerName));
35
+ };
36
+ //# sourceMappingURL=AccountRow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AccountRow.js","sourceRoot":"","sources":["../src/account-security/AccountRow.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const DeviceActivity: () => import("react/jsx-runtime").JSX.Element;
2
+ export default DeviceActivity;
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, DataList, DataListContent, DataListItem, DataListItemRow, DescriptionList, DescriptionListDescription, DescriptionListGroup, DescriptionListTerm, Grid, GridItem, Label, Spinner, Split, SplitItem, Title, } from "@patternfly/react-core";
3
+ import { DesktopIcon, MobileAltIcon, SyncAltIcon, } from "@patternfly/react-icons";
4
+ import { useState } from "react";
5
+ import { useTranslation } from "react-i18next";
6
+ import { ContinueCancelModal, useAlerts, useEnvironment, } from "../ui-shared";
7
+ import { deleteSession, getDevices } from "../api/methods";
8
+ import { Page } from "../components/page/Page";
9
+ import { formatDate } from "../utils/formatDate";
10
+ import { usePromise } from "../utils/usePromise";
11
+ export const DeviceActivity = () => {
12
+ const { t } = useTranslation();
13
+ const context = useEnvironment();
14
+ const { addAlert, addError } = useAlerts();
15
+ const [devices, setDevices] = useState();
16
+ const [key, setKey] = useState(0);
17
+ const refresh = () => setKey(key + 1);
18
+ const moveCurrentToTop = (devices) => {
19
+ let currentDevice = devices[0];
20
+ const index = devices.findIndex((d) => d.current);
21
+ currentDevice = devices.splice(index, 1)[0];
22
+ devices.unshift(currentDevice);
23
+ const sessionIndex = currentDevice.sessions.findIndex((s) => s.current);
24
+ const currentSession = currentDevice.sessions.splice(sessionIndex, 1)[0];
25
+ currentDevice.sessions.unshift(currentSession);
26
+ setDevices(devices);
27
+ };
28
+ usePromise((signal) => getDevices({ signal, context }), moveCurrentToTop, [
29
+ key,
30
+ ]);
31
+ const signOutAll = async () => {
32
+ await deleteSession(context);
33
+ context.keycloak.logout();
34
+ };
35
+ const signOutSession = async (session, device) => {
36
+ try {
37
+ await deleteSession(context, session.id);
38
+ addAlert(t("signedOutSession", { browser: session.browser, os: device.os }));
39
+ refresh();
40
+ }
41
+ catch (error) {
42
+ addError(t("errorSignOutMessage", { error }).toString());
43
+ }
44
+ };
45
+ const makeClientsString = (clients) => {
46
+ let clientsString = "";
47
+ clients.forEach((client, index) => {
48
+ let clientName;
49
+ if (client.clientName !== "") {
50
+ clientName = t(client.clientName);
51
+ }
52
+ else {
53
+ clientName = client.clientId;
54
+ }
55
+ clientsString += clientName;
56
+ if (clients.length > index + 1)
57
+ clientsString += ", ";
58
+ });
59
+ return clientsString;
60
+ };
61
+ if (!devices) {
62
+ return _jsx(Spinner, {});
63
+ }
64
+ return (_jsxs(Page, { title: t("deviceActivity"), description: t("signedInDevicesExplanation"), children: [_jsxs(Split, { hasGutter: true, className: "pf-v5-u-mb-lg", children: [_jsx(SplitItem, { isFilled: true, children: _jsx(Title, { headingLevel: "h2", size: "xl", children: t("signedInDevices") }) }), _jsxs(SplitItem, { children: [_jsx(Button, { id: "refresh-page", variant: "link", onClick: () => refresh(), icon: _jsx(SyncAltIcon, {}), children: t("refreshPage") }), (devices.length > 1 || devices[0].sessions.length > 1) && (_jsx(ContinueCancelModal, { buttonTitle: t("signOutAllDevices"), modalTitle: t("signOutAllDevices"), continueLabel: t("confirm"), cancelLabel: t("cancel"), onContinue: () => signOutAll(), children: t("signOutAllDevicesWarning") }))] })] }), _jsx(DataList, { className: "signed-in-device-list", "aria-label": t("signedInDevices"), children: _jsx(DataListItem, { "aria-labelledby": `sessions-${key}`, children: devices.map((device) => device.sessions.map((session, index) => (_jsx(DataListItemRow, { "data-testid": `row-${index}`, children: _jsx(DataListContent, { "aria-label": "device-sessions-content", className: "pf-v5-u-flex-grow-1", children: _jsxs(Grid, { hasGutter: true, children: [_jsx(GridItem, { span: 1, rowSpan: 2, children: device.mobile ? _jsx(MobileAltIcon, {}) : _jsx(DesktopIcon, {}) }), _jsxs(GridItem, { sm: 8, md: 9, span: 10, children: [_jsxs("span", { className: "pf-v5-u-mr-md session-title", children: [device.os.toLowerCase().includes("unknown")
65
+ ? t("unknownOperatingSystem")
66
+ : device.os, " ", !device.osVersion.toLowerCase().includes("unknown") &&
67
+ device.osVersion, " ", "/ ", session.browser] }), session.current && (_jsx(Label, { color: "green", children: t("currentSession") }))] }), _jsx(GridItem, { className: "pf-v5-u-text-align-right", sm: 3, md: 2, span: 1, children: !session.current && (_jsx(ContinueCancelModal, { buttonTitle: t("signOut"), modalTitle: t("signOut"), continueLabel: t("confirm"), cancelLabel: t("cancel"), buttonVariant: "secondary", onContinue: () => signOutSession(session, device), children: t("signOutWarning") })) }), _jsx(GridItem, { span: 11, children: _jsxs(DescriptionList, { className: "signed-in-device-grid", columnModifier: { sm: "2Col", lg: "3Col" }, cols: 5, rows: 1, children: [_jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("ipAddress") }), _jsx(DescriptionListDescription, { children: session.ipAddress })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("lastAccessedOn") }), _jsx(DescriptionListDescription, { children: formatDate(new Date(session.lastAccess * 1000)) })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("clients") }), _jsx(DescriptionListDescription, { children: makeClientsString(session.clients) })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("started") }), _jsx(DescriptionListDescription, { children: formatDate(new Date(session.started * 1000)) })] }), _jsxs(DescriptionListGroup, { children: [_jsx(DescriptionListTerm, { children: t("expires") }), _jsx(DescriptionListDescription, { children: formatDate(new Date(session.expires * 1000)) })] })] }) })] }) }) }, device.id)))) }) })] }));
68
+ };
69
+ export default DeviceActivity;
70
+ //# sourceMappingURL=DeviceActivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DeviceActivity.js","sourceRoot":"","sources":["../src/account-security/DeviceActivity.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const LinkedAccounts: () => import("react/jsx-runtime").JSX.Element;
2
+ export default LinkedAccounts;
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { DataList, Stack, StackItem, Title } from "@patternfly/react-core";
3
+ import { useMemo, useState } from "react";
4
+ import { useTranslation } from "react-i18next";
5
+ import { getLinkedAccounts } from "../api/methods";
6
+ import { EmptyRow } from "../components/datalist/EmptyRow";
7
+ import { Page } from "../components/page/Page";
8
+ import { usePromise } from "../utils/usePromise";
9
+ import { AccountRow } from "../account-security/AccountRow";
10
+ import { useEnvironment } from "../ui-shared";
11
+ export const LinkedAccounts = () => {
12
+ const { t } = useTranslation();
13
+ const context = useEnvironment();
14
+ const [accounts, setAccounts] = useState([]);
15
+ const [key, setKey] = useState(1);
16
+ const refresh = () => setKey(key + 1);
17
+ usePromise((signal) => getLinkedAccounts({ signal, context }), setAccounts, [
18
+ key,
19
+ ]);
20
+ const linkedAccounts = useMemo(() => accounts.filter((account) => account.connected), [accounts]);
21
+ const unLinkedAccounts = useMemo(() => accounts.filter((account) => !account.connected), [accounts]);
22
+ return (_jsx(Page, { title: t("linkedAccounts"), description: t("linkedAccountsIntroMessage"), children: _jsxs(Stack, { hasGutter: true, children: [_jsxs(StackItem, { children: [_jsx(Title, { headingLevel: "h2", className: "pf-v5-u-mb-lg", size: "xl", children: t("linkedLoginProviders") }), _jsx(DataList, { id: "linked-idps", "aria-label": t("linkedLoginProviders"), children: linkedAccounts.length > 0 ? (linkedAccounts.map((account) => (_jsx(AccountRow, { account: account, isLinked: true, refresh: refresh }, account.providerName)))) : (_jsx(EmptyRow, { message: t("linkedEmpty") })) })] }), _jsxs(StackItem, { children: [_jsx(Title, { headingLevel: "h2", className: "pf-v5-u-mt-xl pf-v5-u-mb-lg", size: "xl", children: t("unlinkedLoginProviders") }), _jsx(DataList, { id: "unlinked-idps", "aria-label": t("unlinkedLoginProviders"), children: unLinkedAccounts.length > 0 ? (unLinkedAccounts.map((account) => (_jsx(AccountRow, { account: account, refresh: refresh }, account.providerName)))) : (_jsx(EmptyRow, { message: t("unlinkedEmpty") })) })] })] }) }));
23
+ };
24
+ export default LinkedAccounts;
25
+ //# sourceMappingURL=LinkedAccounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkedAccounts.js","sourceRoot":"","sources":["../src/account-security/LinkedAccounts.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const SigningIn: () => import("react/jsx-runtime").JSX.Element;
2
+ export default SigningIn;
@@ -0,0 +1,65 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, DataList, DataListAction, DataListCell, DataListItem, DataListItemCells, DataListItemRow, Dropdown, DropdownItem, MenuToggle, PageSection, Spinner, Split, SplitItem, Title, } from "@patternfly/react-core";
3
+ import { EllipsisVIcon } from "@patternfly/react-icons";
4
+ import { useState } from "react";
5
+ import { Trans, useTranslation } from "react-i18next";
6
+ import { useEnvironment } from "../ui-shared";
7
+ import { getCredentials } from "../api/methods";
8
+ import { EmptyRow } from "../components/datalist/EmptyRow";
9
+ import { Page } from "../components/page/Page";
10
+ import { formatDate } from "../utils/formatDate";
11
+ import { usePromise } from "../utils/usePromise";
12
+ const MobileLink = ({ title, onClick, testid }) => {
13
+ const [open, setOpen] = useState(false);
14
+ return (_jsxs(_Fragment, { children: [_jsx(Dropdown, { popperProps: {
15
+ position: "right",
16
+ }, onOpenChange: (isOpen) => setOpen(isOpen), toggle: (toggleRef) => (_jsx(MenuToggle, { className: "pf-v5-u-display-none-on-lg", ref: toggleRef, variant: "plain", onClick: () => setOpen(!open), isExpanded: open, children: _jsx(EllipsisVIcon, {}) })), isOpen: open, children: _jsx(DropdownItem, { onClick: onClick, children: title }, "1") }), _jsx(Button, { variant: "link", onClick: onClick, className: "pf-v5-u-display-none pf-v5-u-display-inline-flex-on-lg", "data-testid": testid, children: title })] }));
17
+ };
18
+ export const SigningIn = () => {
19
+ const { t } = useTranslation();
20
+ const context = useEnvironment();
21
+ const { login } = context.keycloak;
22
+ const [credentials, setCredentials] = useState();
23
+ usePromise((signal) => getCredentials({ signal, context }), setCredentials, []);
24
+ const credentialRowCells = (credMetadata) => {
25
+ const credential = credMetadata.credential;
26
+ const maxWidth = {
27
+ "--pf-v5-u-max-width--MaxWidth": "300px",
28
+ };
29
+ const items = [
30
+ _jsx(DataListCell, { "data-testrole": "label", className: "pf-v5-u-max-width", style: maxWidth, children: credential.userLabel || t(credential.type) }, "title"),
31
+ ];
32
+ if (credential.createdDate) {
33
+ items.push(_jsx(DataListCell, { "data-testrole": "created-at", children: _jsxs(Trans, { i18nKey: "credentialCreatedAt", children: [_jsx("strong", { className: "pf-v5-u-mr-md" }), { date: formatDate(new Date(credential.createdDate)) }] }) }, "created" + credential.id));
34
+ }
35
+ return items;
36
+ };
37
+ if (!credentials) {
38
+ return _jsx(Spinner, {});
39
+ }
40
+ const credentialUniqueCategories = [
41
+ ...new Set(credentials.map((c) => c.category)),
42
+ ];
43
+ return (_jsx(Page, { title: t("signingIn"), description: t("signingInDescription"), children: credentialUniqueCategories.map((category) => (_jsxs(PageSection, { variant: "light", className: "pf-v5-u-px-0", children: [_jsx(Title, { headingLevel: "h2", size: "xl", id: `${category}-categ-title`, children: t(category) }), credentials
44
+ .filter((cred) => cred.category == category)
45
+ .map((container) => (_jsxs(_Fragment, { children: [_jsxs(Split, { className: "pf-v5-u-mt-lg pf-v5-u-mb-lg", children: [_jsxs(SplitItem, { children: [_jsx(Title, { headingLevel: "h3", size: "md", className: "pf-v5-u-mb-md", "data-testid": `${container.type}/help`, children: _jsx("span", { className: "cred-title pf-v5-u-display-block", "data-testid": `${container.type}/title`, children: t(container.displayName) }) }), _jsx("span", { "data-testid": `${container.type}/help-text`, children: t(container.helptext) })] }), container.createAction && (_jsx(SplitItem, { isFilled: true, children: _jsx("div", { className: "pf-v5-u-float-right", children: _jsx(MobileLink, { onClick: () => login({
46
+ action: container.createAction,
47
+ }), title: t("setUpNew", {
48
+ name: t(`${container.type}-display-name`),
49
+ }), testid: `${container.type}/create` }) }) }))] }), _jsxs(DataList, { "aria-label": "credential list", className: "pf-v5-u-mb-xl", "data-testid": `${container.type}/credential-list`, children: [container.userCredentialMetadatas.length === 0 && (_jsx(EmptyRow, { message: t("notSetUp", {
50
+ name: t(container.displayName),
51
+ }), "data-testid": `${container.type}/not-set-up` })), container.userCredentialMetadatas.map((meta) => (_jsx(DataListItem, { children: _jsx(DataListItemRow, { id: `cred-${meta.credential.id}`, children: _jsx(DataListItemCells, { className: "pf-v5-u-py-0", dataListCells: [
52
+ ...credentialRowCells(meta),
53
+ _jsx(DataListAction, { id: `action-${meta.credential.id}`, "aria-label": t("updateCredAriaLabel"), "aria-labelledby": `cred-${meta.credential.id}`, children: container.removeable ? (_jsx(Button, { variant: "danger", "data-testrole": "remove", onClick: () => {
54
+ login({
55
+ action: "delete_credential:" +
56
+ meta.credential.id,
57
+ });
58
+ }, children: t("delete") })) : (_jsx(Button, { variant: "secondary", onClick: () => {
59
+ if (container.updateAction)
60
+ login({ action: container.updateAction });
61
+ }, "data-testrole": "update", children: t("update") })) }, "action"),
62
+ ] }) }) }, meta.credential.id)))] })] })))] }, category))) }));
63
+ };
64
+ export default SigningIn;
65
+ //# sourceMappingURL=SigningIn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SigningIn.js","sourceRoot":"","sources":["../src/account-security/SigningIn.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const CONTENT_TYPE_HEADER = "content-type";
2
+ export declare const CONTENT_TYPE_JSON = "application/json";
@@ -0,0 +1,3 @@
1
+ export const CONTENT_TYPE_HEADER = "content-type";
2
+ export const CONTENT_TYPE_JSON = "application/json";
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/api/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { BaseEnvironment, type KeycloakContext } from "../ui-shared";
2
+ import { ClientRepresentation, CredentialContainer, DeviceRepresentation, Group, LinkedAccountRepresentation, Permission, UserRepresentation } from "../api/representations";
3
+ export type CallOptions = {
4
+ context: KeycloakContext<BaseEnvironment>;
5
+ signal?: AbortSignal;
6
+ };
7
+ export type PaginationParams = {
8
+ first: number;
9
+ max: number;
10
+ };
11
+ export declare function getPersonalInfo({ signal, context, }: CallOptions): Promise<UserRepresentation>;
12
+ export declare function getSupportedLocales({ signal, context, }: CallOptions): Promise<string[]>;
13
+ export declare function savePersonalInfo(context: KeycloakContext<BaseEnvironment>, info: UserRepresentation): Promise<void>;
14
+ export declare function getPermissionRequests(resourceId: string, { signal, context }: CallOptions): Promise<Permission[]>;
15
+ export declare function getDevices({ signal, context, }: CallOptions): Promise<DeviceRepresentation[]>;
16
+ export declare function getApplications({ signal, context, }: CallOptions): Promise<ClientRepresentation[]>;
17
+ export declare function deleteConsent(context: KeycloakContext<BaseEnvironment>, id: string): Promise<Response>;
18
+ export declare function deleteSession(context: KeycloakContext<BaseEnvironment>, id?: string): Promise<Response>;
19
+ export declare function getCredentials({ signal, context }: CallOptions): Promise<CredentialContainer[]>;
20
+ export declare function getLinkedAccounts({ signal, context }: CallOptions): Promise<LinkedAccountRepresentation[]>;
21
+ export declare function unLinkAccount(context: KeycloakContext<BaseEnvironment>, account: LinkedAccountRepresentation): Promise<unknown>;
22
+ export declare function linkAccount(context: KeycloakContext<BaseEnvironment>, account: LinkedAccountRepresentation): Promise<{
23
+ accountLinkUri: string;
24
+ }>;
25
+ export declare function getGroups({ signal, context }: CallOptions): Promise<Group[]>;
package/api/methods.js ADDED
@@ -0,0 +1,73 @@
1
+ import { joinPath } from "../utils/joinPath";
2
+ import { parseResponse } from "../api/parse-response";
3
+ import { request } from "../api/request";
4
+ export async function getPersonalInfo({ signal, context, }) {
5
+ const response = await request("/?userProfileMetadata=true", context, {
6
+ signal,
7
+ });
8
+ return parseResponse(response);
9
+ }
10
+ export async function getSupportedLocales({ signal, context, }) {
11
+ const response = await request("/supportedLocales", context, { signal });
12
+ return parseResponse(response);
13
+ }
14
+ export async function savePersonalInfo(context, info) {
15
+ const response = await request("/", context, { body: info, method: "POST" });
16
+ if (!response.ok) {
17
+ const { errors } = await response.json();
18
+ throw errors;
19
+ }
20
+ return undefined;
21
+ }
22
+ export async function getPermissionRequests(resourceId, { signal, context }) {
23
+ const response = await request(`/resources/${resourceId}/permissions/requests`, context, { signal });
24
+ return parseResponse(response);
25
+ }
26
+ export async function getDevices({ signal, context, }) {
27
+ const response = await request("/sessions/devices", context, { signal });
28
+ return parseResponse(response);
29
+ }
30
+ export async function getApplications({ signal, context, }) {
31
+ const response = await request("/applications", context, { signal });
32
+ return parseResponse(response);
33
+ }
34
+ export async function deleteConsent(context, id) {
35
+ return request(`/applications/${id}/consent`, context, { method: "DELETE" });
36
+ }
37
+ export async function deleteSession(context, id) {
38
+ return request(`/sessions${id ? `/${id}` : ""}`, context, {
39
+ method: "DELETE",
40
+ });
41
+ }
42
+ export async function getCredentials({ signal, context }) {
43
+ const response = await request("/credentials", context, {
44
+ signal,
45
+ });
46
+ return parseResponse(response);
47
+ }
48
+ export async function getLinkedAccounts({ signal, context }) {
49
+ const response = await request("/linked-accounts", context, { signal });
50
+ return parseResponse(response);
51
+ }
52
+ export async function unLinkAccount(context, account) {
53
+ const response = await request("/linked-accounts/" + account.providerName, context, {
54
+ method: "DELETE",
55
+ });
56
+ if (response.ok)
57
+ return;
58
+ return parseResponse(response);
59
+ }
60
+ export async function linkAccount(context, account) {
61
+ const redirectUri = encodeURIComponent(joinPath(context.environment.serverBaseUrl, "realms", context.environment.realm, "account"));
62
+ const response = await request("/linked-accounts/" + account.providerName, context, {
63
+ searchParams: { providerId: account.providerName, redirectUri },
64
+ });
65
+ return parseResponse(response);
66
+ }
67
+ export async function getGroups({ signal, context }) {
68
+ const response = await request("/groups", context, {
69
+ signal,
70
+ });
71
+ return parseResponse(response);
72
+ }
73
+ //# sourceMappingURL=methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"methods.js","sourceRoot":"","sources":["../src/api/methods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type Links = {
2
+ prev?: Record<string, string>;
3
+ next?: Record<string, string>;
4
+ };
5
+ export declare function parseLinks(response: Response): Links;
@@ -0,0 +1,23 @@
1
+ export function parseLinks(response) {
2
+ const linkHeader = response.headers.get("link");
3
+ if (!linkHeader) {
4
+ throw new Error("Attempted to parse links, but no header was found.");
5
+ }
6
+ const links = linkHeader.split(/,\s*</);
7
+ return links.reduce((acc, link) => {
8
+ const matcher = link.match(/<?([^>]*)>(.*)/);
9
+ if (!matcher)
10
+ return {};
11
+ const linkUrl = matcher[1];
12
+ const rel = matcher[2].match(/\s*(.+)\s*=\s*"?([^"]+)"?/);
13
+ if (rel) {
14
+ const link = {};
15
+ for (const [key, value] of new URL(linkUrl).searchParams.entries()) {
16
+ link[key] = value;
17
+ }
18
+ acc[rel[2]] = link;
19
+ }
20
+ return acc;
21
+ }, {});
22
+ }
23
+ //# sourceMappingURL=parse-links.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-links.js","sourceRoot":"","sources":["../src/api/parse-links.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,UAAU,CAAC,QAAkB;IAC3C,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEhD,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC,MAAM,CAAQ,CAAC,GAAU,EAAE,IAAY,EAAE,EAAE;QACtD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC1D,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,GAA2B,EAAE,CAAC;YACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,CAAC,CAAgB,CAAC,GAAG,IAAI,CAAC;QACpC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;AACT,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare class ApiError extends Error {
2
+ }
3
+ export declare function parseResponse<T>(response: Response): Promise<T>;
@@ -0,0 +1,40 @@
1
+ import { isRecord } from "../utils/isRecord";
2
+ import { CONTENT_TYPE_HEADER, CONTENT_TYPE_JSON } from "../api/constants";
3
+ export class ApiError extends Error {
4
+ }
5
+ export async function parseResponse(response) {
6
+ const contentType = response.headers.get(CONTENT_TYPE_HEADER);
7
+ const isJSON = contentType ? contentType.includes(CONTENT_TYPE_JSON) : false;
8
+ if (!isJSON) {
9
+ throw new Error(`Expected response to have a JSON content type, got '${contentType}' instead.`);
10
+ }
11
+ const data = await parseJSON(response);
12
+ if (!response.ok) {
13
+ throw new ApiError(getErrorMessage(data));
14
+ }
15
+ return data;
16
+ }
17
+ async function parseJSON(response) {
18
+ try {
19
+ return await response.json();
20
+ }
21
+ catch (error) {
22
+ throw new Error("Unable to parse response as valid JSON.", {
23
+ cause: error,
24
+ });
25
+ }
26
+ }
27
+ function getErrorMessage(data) {
28
+ if (!isRecord(data)) {
29
+ throw new Error("Unable to retrieve error message from response.");
30
+ }
31
+ const errorKeys = ["error_description", "errorMessage", "error"];
32
+ for (const key of errorKeys) {
33
+ const value = data[key];
34
+ if (typeof value === "string") {
35
+ return value;
36
+ }
37
+ }
38
+ throw new Error("Unable to retrieve error message from response, no matching key found.");
39
+ }
40
+ //# sourceMappingURL=parse-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-response.js","sourceRoot":"","sources":["../src/api/parse-response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,iDAAiD,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAExG,MAAM,OAAO,QAAS,SAAQ,KAAK;CAAG;AAEtC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAI,QAAkB;IACvD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAE7E,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,uDAAuD,WAAW,YAAY,CAC/E,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,IAAS,CAAC;AACnB,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,QAAkB;IACzC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,yCAAyC,EAAE;YACzD,KAAK,EAAE,KAAK;SACb,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,eAAe,CAAC,IAAa;IACpC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,SAAS,GAAG,CAAC,mBAAmB,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAEjE,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAExB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;AACJ,CAAC"}