@burdenoff/microfe-auth 2026.510.127

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 (301) hide show
  1. package/README.md +12 -0
  2. package/dist/_virtual/_rolldown/runtime.js +13 -0
  3. package/dist/auth/AuthRoot.d.ts +30 -0
  4. package/dist/auth/AuthRoot.d.ts.map +1 -0
  5. package/dist/auth/AuthRoot.js +82 -0
  6. package/dist/auth/AuthRoot.js.map +1 -0
  7. package/dist/auth/AuthRoutes.d.ts +29 -0
  8. package/dist/auth/AuthRoutes.d.ts.map +1 -0
  9. package/dist/auth/AuthRoutes.js +271 -0
  10. package/dist/auth/AuthRoutes.js.map +1 -0
  11. package/dist/auth/components/AuthIcons.d.ts +17 -0
  12. package/dist/auth/components/AuthIcons.d.ts.map +1 -0
  13. package/dist/auth/components/AuthIcons.js +197 -0
  14. package/dist/auth/components/AuthIcons.js.map +1 -0
  15. package/dist/auth/components/AuthLayout.d.ts +17 -0
  16. package/dist/auth/components/AuthLayout.d.ts.map +1 -0
  17. package/dist/auth/components/AuthLayout.js +237 -0
  18. package/dist/auth/components/AuthLayout.js.map +1 -0
  19. package/dist/auth/components/CaptchaV2.d.ts +16 -0
  20. package/dist/auth/components/CaptchaV2.d.ts.map +1 -0
  21. package/dist/auth/components/CaptchaV2.js +47 -0
  22. package/dist/auth/components/CaptchaV2.js.map +1 -0
  23. package/dist/auth/components/ConfirmActionDialog.d.ts +16 -0
  24. package/dist/auth/components/ConfirmActionDialog.d.ts.map +1 -0
  25. package/dist/auth/components/ConfirmActionDialog.js +68 -0
  26. package/dist/auth/components/ConfirmActionDialog.js.map +1 -0
  27. package/dist/auth/components/index.d.ts +4 -0
  28. package/dist/auth/components/index.d.ts.map +1 -0
  29. package/dist/auth/components/profile/UserProfileMenu.d.ts +42 -0
  30. package/dist/auth/components/profile/UserProfileMenu.d.ts.map +1 -0
  31. package/dist/auth/components/profile/UserProfileMenu.js +91 -0
  32. package/dist/auth/components/profile/UserProfileMenu.js.map +1 -0
  33. package/dist/auth/components/workspace/WorkspaceSelector.d.ts +76 -0
  34. package/dist/auth/components/workspace/WorkspaceSelector.d.ts.map +1 -0
  35. package/dist/auth/components/workspace/WorkspaceSelector.js +240 -0
  36. package/dist/auth/components/workspace/WorkspaceSelector.js.map +1 -0
  37. package/dist/auth/constants/permissions.d.ts +30 -0
  38. package/dist/auth/constants/permissions.d.ts.map +1 -0
  39. package/dist/auth/constants/permissions.js +18 -0
  40. package/dist/auth/constants/permissions.js.map +1 -0
  41. package/dist/auth/constants/sessionKeys.d.ts +18 -0
  42. package/dist/auth/constants/sessionKeys.d.ts.map +1 -0
  43. package/dist/auth/constants/sessionKeys.js +6 -0
  44. package/dist/auth/constants/sessionKeys.js.map +1 -0
  45. package/dist/auth/hooks/index.d.ts +18 -0
  46. package/dist/auth/hooks/index.d.ts.map +1 -0
  47. package/dist/auth/hooks/index.js +16 -0
  48. package/dist/auth/hooks/useAccountOperations.d.ts +19 -0
  49. package/dist/auth/hooks/useAccountOperations.d.ts.map +1 -0
  50. package/dist/auth/hooks/useAccountOperations.js +52 -0
  51. package/dist/auth/hooks/useAccountOperations.js.map +1 -0
  52. package/dist/auth/hooks/useApiKeyOperations.d.ts +22 -0
  53. package/dist/auth/hooks/useApiKeyOperations.d.ts.map +1 -0
  54. package/dist/auth/hooks/useApiKeyOperations.js +4 -0
  55. package/dist/auth/hooks/useAppOperations.d.ts +26 -0
  56. package/dist/auth/hooks/useAppOperations.d.ts.map +1 -0
  57. package/dist/auth/hooks/useAppOperations.js +4 -0
  58. package/dist/auth/hooks/useAuthOperations.d.ts +57 -0
  59. package/dist/auth/hooks/useAuthOperations.d.ts.map +1 -0
  60. package/dist/auth/hooks/useAuthOperations.js +236 -0
  61. package/dist/auth/hooks/useAuthOperations.js.map +1 -0
  62. package/dist/auth/hooks/useAuthPermissions.d.ts +20 -0
  63. package/dist/auth/hooks/useAuthPermissions.d.ts.map +1 -0
  64. package/dist/auth/hooks/useAuthPermissions.js +22 -0
  65. package/dist/auth/hooks/useAuthPermissions.js.map +1 -0
  66. package/dist/auth/hooks/useCaptchaV3.d.ts +13 -0
  67. package/dist/auth/hooks/useCaptchaV3.d.ts.map +1 -0
  68. package/dist/auth/hooks/useCaptchaV3.js +19 -0
  69. package/dist/auth/hooks/useCaptchaV3.js.map +1 -0
  70. package/dist/auth/hooks/useContextSwitcherData.d.ts +106 -0
  71. package/dist/auth/hooks/useContextSwitcherData.d.ts.map +1 -0
  72. package/dist/auth/hooks/useContextSwitcherData.js +466 -0
  73. package/dist/auth/hooks/useContextSwitcherData.js.map +1 -0
  74. package/dist/auth/hooks/useDelegationOperations.d.ts +25 -0
  75. package/dist/auth/hooks/useDelegationOperations.d.ts.map +1 -0
  76. package/dist/auth/hooks/useDelegationOperations.js +4 -0
  77. package/dist/auth/hooks/useMfaOperations.d.ts +18 -0
  78. package/dist/auth/hooks/useMfaOperations.d.ts.map +1 -0
  79. package/dist/auth/hooks/useMfaOperations.js +103 -0
  80. package/dist/auth/hooks/useMfaOperations.js.map +1 -0
  81. package/dist/auth/hooks/useMyWorkspaces.d.ts +45 -0
  82. package/dist/auth/hooks/useMyWorkspaces.d.ts.map +1 -0
  83. package/dist/auth/hooks/useMyWorkspaces.js +140 -0
  84. package/dist/auth/hooks/useMyWorkspaces.js.map +1 -0
  85. package/dist/auth/hooks/useOAuthOperations.d.ts +19 -0
  86. package/dist/auth/hooks/useOAuthOperations.d.ts.map +1 -0
  87. package/dist/auth/hooks/useOAuthOperations.js +103 -0
  88. package/dist/auth/hooks/useOAuthOperations.js.map +1 -0
  89. package/dist/auth/hooks/usePasswordOperations.d.ts +13 -0
  90. package/dist/auth/hooks/usePasswordOperations.d.ts.map +1 -0
  91. package/dist/auth/hooks/usePasswordOperations.js +56 -0
  92. package/dist/auth/hooks/usePasswordOperations.js.map +1 -0
  93. package/dist/auth/hooks/useSessionOperations.d.ts +41 -0
  94. package/dist/auth/hooks/useSessionOperations.d.ts.map +1 -0
  95. package/dist/auth/hooks/useSessionOperations.js +59 -0
  96. package/dist/auth/hooks/useSessionOperations.js.map +1 -0
  97. package/dist/auth/hooks/useSsoOperations.d.ts +65 -0
  98. package/dist/auth/hooks/useSsoOperations.d.ts.map +1 -0
  99. package/dist/auth/hooks/useSsoOperations.js +236 -0
  100. package/dist/auth/hooks/useSsoOperations.js.map +1 -0
  101. package/dist/auth/hooks/useTokenRefresh.d.ts +56 -0
  102. package/dist/auth/hooks/useTokenRefresh.d.ts.map +1 -0
  103. package/dist/auth/hooks/useTokenRefresh.js +53 -0
  104. package/dist/auth/hooks/useTokenRefresh.js.map +1 -0
  105. package/dist/auth/hooks/useUserOperations.d.ts +32 -0
  106. package/dist/auth/hooks/useUserOperations.d.ts.map +1 -0
  107. package/dist/auth/hooks/useUserOperations.js +100 -0
  108. package/dist/auth/hooks/useUserOperations.js.map +1 -0
  109. package/dist/auth/hooks/useWorkspaceOperations.d.ts +35 -0
  110. package/dist/auth/hooks/useWorkspaceOperations.d.ts.map +1 -0
  111. package/dist/auth/hooks/useWorkspaceOperations.js +35 -0
  112. package/dist/auth/hooks/useWorkspaceOperations.js.map +1 -0
  113. package/dist/auth/hooks/useWorkspaceToken.d.ts +56 -0
  114. package/dist/auth/hooks/useWorkspaceToken.d.ts.map +1 -0
  115. package/dist/auth/hooks/useWorkspaceToken.js +94 -0
  116. package/dist/auth/hooks/useWorkspaceToken.js.map +1 -0
  117. package/dist/auth/index.d.ts +63 -0
  118. package/dist/auth/index.d.ts.map +1 -0
  119. package/dist/auth/index.js +18 -0
  120. package/dist/auth/pages/ApiKeysPage.d.ts +5 -0
  121. package/dist/auth/pages/ApiKeysPage.d.ts.map +1 -0
  122. package/dist/auth/pages/AppsPage.d.ts +5 -0
  123. package/dist/auth/pages/AppsPage.d.ts.map +1 -0
  124. package/dist/auth/pages/AuditLogPage.d.ts +5 -0
  125. package/dist/auth/pages/AuditLogPage.d.ts.map +1 -0
  126. package/dist/auth/pages/AuditLogPage.js +129 -0
  127. package/dist/auth/pages/AuditLogPage.js.map +1 -0
  128. package/dist/auth/pages/DelegationsPage.d.ts +5 -0
  129. package/dist/auth/pages/DelegationsPage.d.ts.map +1 -0
  130. package/dist/auth/pages/EmailVerifyPage.d.ts +5 -0
  131. package/dist/auth/pages/EmailVerifyPage.d.ts.map +1 -0
  132. package/dist/auth/pages/EmailVerifyPage.js +166 -0
  133. package/dist/auth/pages/EmailVerifyPage.js.map +1 -0
  134. package/dist/auth/pages/LoginPage.d.ts +6 -0
  135. package/dist/auth/pages/LoginPage.d.ts.map +1 -0
  136. package/dist/auth/pages/LoginPage.js +575 -0
  137. package/dist/auth/pages/LoginPage.js.map +1 -0
  138. package/dist/auth/pages/MagicLinkPage.d.ts +6 -0
  139. package/dist/auth/pages/MagicLinkPage.d.ts.map +1 -0
  140. package/dist/auth/pages/MagicLinkPage.js +219 -0
  141. package/dist/auth/pages/MagicLinkPage.js.map +1 -0
  142. package/dist/auth/pages/MfaSetupPage.d.ts +5 -0
  143. package/dist/auth/pages/MfaSetupPage.d.ts.map +1 -0
  144. package/dist/auth/pages/MfaSetupPage.js +341 -0
  145. package/dist/auth/pages/MfaSetupPage.js.map +1 -0
  146. package/dist/auth/pages/MfaVerifyPage.d.ts +7 -0
  147. package/dist/auth/pages/MfaVerifyPage.d.ts.map +1 -0
  148. package/dist/auth/pages/MfaVerifyPage.js +189 -0
  149. package/dist/auth/pages/MfaVerifyPage.js.map +1 -0
  150. package/dist/auth/pages/OAuthCallbackPage.d.ts +7 -0
  151. package/dist/auth/pages/OAuthCallbackPage.d.ts.map +1 -0
  152. package/dist/auth/pages/OAuthCallbackPage.js +100 -0
  153. package/dist/auth/pages/OAuthCallbackPage.js.map +1 -0
  154. package/dist/auth/pages/PasswordResetPage.d.ts +6 -0
  155. package/dist/auth/pages/PasswordResetPage.d.ts.map +1 -0
  156. package/dist/auth/pages/PasswordResetPage.js +352 -0
  157. package/dist/auth/pages/PasswordResetPage.js.map +1 -0
  158. package/dist/auth/pages/ReactivatePage.d.ts +6 -0
  159. package/dist/auth/pages/ReactivatePage.d.ts.map +1 -0
  160. package/dist/auth/pages/ReactivatePage.js +217 -0
  161. package/dist/auth/pages/ReactivatePage.js.map +1 -0
  162. package/dist/auth/pages/RegisterPage.d.ts +5 -0
  163. package/dist/auth/pages/RegisterPage.d.ts.map +1 -0
  164. package/dist/auth/pages/RegisterPage.js +439 -0
  165. package/dist/auth/pages/RegisterPage.js.map +1 -0
  166. package/dist/auth/pages/SSORelayCallbackPage.d.ts +8 -0
  167. package/dist/auth/pages/SSORelayCallbackPage.d.ts.map +1 -0
  168. package/dist/auth/pages/SSORelayCallbackPage.js +48 -0
  169. package/dist/auth/pages/SSORelayCallbackPage.js.map +1 -0
  170. package/dist/auth/pages/SSORelayPage.d.ts +18 -0
  171. package/dist/auth/pages/SSORelayPage.d.ts.map +1 -0
  172. package/dist/auth/pages/SSORelayPage.js +134 -0
  173. package/dist/auth/pages/SSORelayPage.js.map +1 -0
  174. package/dist/auth/pages/SecurityPage.d.ts +5 -0
  175. package/dist/auth/pages/SecurityPage.d.ts.map +1 -0
  176. package/dist/auth/pages/SecurityPage.js +587 -0
  177. package/dist/auth/pages/SecurityPage.js.map +1 -0
  178. package/dist/auth/pages/SessionBridgePage.d.ts +14 -0
  179. package/dist/auth/pages/SessionBridgePage.d.ts.map +1 -0
  180. package/dist/auth/pages/SessionBridgePage.js +231 -0
  181. package/dist/auth/pages/SessionBridgePage.js.map +1 -0
  182. package/dist/auth/pages/SessionsPage.d.ts +5 -0
  183. package/dist/auth/pages/SessionsPage.d.ts.map +1 -0
  184. package/dist/auth/pages/SessionsPage.js +258 -0
  185. package/dist/auth/pages/SessionsPage.js.map +1 -0
  186. package/dist/auth/pages/SsoCallbackPage.d.ts +8 -0
  187. package/dist/auth/pages/SsoCallbackPage.d.ts.map +1 -0
  188. package/dist/auth/pages/SsoCallbackPage.js +188 -0
  189. package/dist/auth/pages/SsoCallbackPage.js.map +1 -0
  190. package/dist/auth/pages/SsoConfigPage.d.ts +6 -0
  191. package/dist/auth/pages/SsoConfigPage.d.ts.map +1 -0
  192. package/dist/auth/pages/SsoConfigPage.js +1144 -0
  193. package/dist/auth/pages/SsoConfigPage.js.map +1 -0
  194. package/dist/auth/pages/SsoLoginPage.d.ts +7 -0
  195. package/dist/auth/pages/SsoLoginPage.d.ts.map +1 -0
  196. package/dist/auth/pages/SsoLoginPage.js +236 -0
  197. package/dist/auth/pages/SsoLoginPage.js.map +1 -0
  198. package/dist/auth/pages/UserDetailsPage.d.ts +11 -0
  199. package/dist/auth/pages/UserDetailsPage.d.ts.map +1 -0
  200. package/dist/auth/pages/UserDetailsPage.js +338 -0
  201. package/dist/auth/pages/UserDetailsPage.js.map +1 -0
  202. package/dist/auth/pages/UserProfilePage.d.ts +5 -0
  203. package/dist/auth/pages/UserProfilePage.d.ts.map +1 -0
  204. package/dist/auth/pages/UserProfilePage.js +445 -0
  205. package/dist/auth/pages/UserProfilePage.js.map +1 -0
  206. package/dist/auth/pages/UsersPage.d.ts +5 -0
  207. package/dist/auth/pages/UsersPage.d.ts.map +1 -0
  208. package/dist/auth/pages/UsersPage.js +899 -0
  209. package/dist/auth/pages/UsersPage.js.map +1 -0
  210. package/dist/auth/providers/AuthProvider.d.ts +18 -0
  211. package/dist/auth/providers/AuthProvider.d.ts.map +1 -0
  212. package/dist/auth/providers/AuthProvider.js +36 -0
  213. package/dist/auth/providers/AuthProvider.js.map +1 -0
  214. package/dist/auth/providers/CaptchaProvider.d.ts +13 -0
  215. package/dist/auth/providers/CaptchaProvider.d.ts.map +1 -0
  216. package/dist/auth/providers/CaptchaProvider.js +21 -0
  217. package/dist/auth/providers/CaptchaProvider.js.map +1 -0
  218. package/dist/auth/store/authStore.d.ts +91 -0
  219. package/dist/auth/store/authStore.d.ts.map +1 -0
  220. package/dist/auth/store/authStore.js +314 -0
  221. package/dist/auth/store/authStore.js.map +1 -0
  222. package/dist/auth/types/index.d.ts +636 -0
  223. package/dist/auth/types/index.d.ts.map +1 -0
  224. package/dist/auth/utils/captchaConfig.d.ts +4 -0
  225. package/dist/auth/utils/captchaConfig.d.ts.map +1 -0
  226. package/dist/auth/utils/captchaConfig.js +13 -0
  227. package/dist/auth/utils/captchaConfig.js.map +1 -0
  228. package/dist/auth/utils/formatters.d.ts +37 -0
  229. package/dist/auth/utils/formatters.d.ts.map +1 -0
  230. package/dist/auth/utils/formatters.js +48 -0
  231. package/dist/auth/utils/formatters.js.map +1 -0
  232. package/dist/auth/utils/gatewayBaseUrls.d.ts +6 -0
  233. package/dist/auth/utils/gatewayBaseUrls.d.ts.map +1 -0
  234. package/dist/auth/utils/gatewayBaseUrls.js +18 -0
  235. package/dist/auth/utils/gatewayBaseUrls.js.map +1 -0
  236. package/dist/auth/utils/index.d.ts +3 -0
  237. package/dist/auth/utils/index.d.ts.map +1 -0
  238. package/dist/auth/utils/validation.d.ts +30 -0
  239. package/dist/auth/utils/validation.d.ts.map +1 -0
  240. package/dist/auth/utils/validation.js +15 -0
  241. package/dist/auth/utils/validation.js.map +1 -0
  242. package/dist/dev/main.d.ts +2 -0
  243. package/dist/dev/main.d.ts.map +1 -0
  244. package/dist/generated/global-operations.d.ts +2978 -0
  245. package/dist/generated/global-operations.d.ts.map +1 -0
  246. package/dist/generated/global-operations.js +944 -0
  247. package/dist/generated/global-operations.js.map +1 -0
  248. package/dist/generated/global-types.d.ts +21253 -0
  249. package/dist/generated/global-types.d.ts.map +1 -0
  250. package/dist/generated/wspace-operations.d.ts +2 -0
  251. package/dist/generated/wspace-operations.d.ts.map +1 -0
  252. package/dist/generated/wspace-types.d.ts +55214 -0
  253. package/dist/generated/wspace-types.d.ts.map +1 -0
  254. package/dist/index.d.ts +4 -0
  255. package/dist/index.d.ts.map +1 -0
  256. package/dist/index.js +20 -0
  257. package/dist/microfe-auth.css +3 -0
  258. package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js +70 -0
  259. package/dist/node_modules/hoist-non-react-statics/dist/hoist-non-react-statics.cjs.js.map +1 -0
  260. package/dist/node_modules/object-assign/index.js +41 -0
  261. package/dist/node_modules/object-assign/index.js.map +1 -0
  262. package/dist/node_modules/prop-types/checkPropTypes.js +46 -0
  263. package/dist/node_modules/prop-types/checkPropTypes.js.map +1 -0
  264. package/dist/node_modules/prop-types/factoryWithThrowingShims.js +49 -0
  265. package/dist/node_modules/prop-types/factoryWithThrowingShims.js.map +1 -0
  266. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js +272 -0
  267. package/dist/node_modules/prop-types/factoryWithTypeCheckers.js.map +1 -0
  268. package/dist/node_modules/prop-types/index.js +16 -0
  269. package/dist/node_modules/prop-types/index.js.map +1 -0
  270. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js +10 -0
  271. package/dist/node_modules/prop-types/lib/ReactPropTypesSecret.js.map +1 -0
  272. package/dist/node_modules/prop-types/lib/has.js +10 -0
  273. package/dist/node_modules/prop-types/lib/has.js.map +1 -0
  274. package/dist/node_modules/qrcode.react/lib/esm/index.js +959 -0
  275. package/dist/node_modules/qrcode.react/lib/esm/index.js.map +1 -0
  276. package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js +114 -0
  277. package/dist/node_modules/react-async-script/lib/esm/async-script-loader.js.map +1 -0
  278. package/dist/node_modules/react-google-recaptcha/lib/esm/index.js +8 -0
  279. package/dist/node_modules/react-google-recaptcha/lib/esm/index.js.map +1 -0
  280. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js +20 -0
  281. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha-wrapper.js.map +1 -0
  282. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js +148 -0
  283. package/dist/node_modules/react-google-recaptcha/lib/esm/recaptcha.js.map +1 -0
  284. package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js +445 -0
  285. package/dist/node_modules/react-google-recaptcha-v3/dist/react-google-recaptcha-v3.esm.js.map +1 -0
  286. package/dist/node_modules/react-is/cjs/react-is.development.js +84 -0
  287. package/dist/node_modules/react-is/cjs/react-is.development.js.map +1 -0
  288. package/dist/node_modules/react-is/cjs/react-is.production.min.js +64 -0
  289. package/dist/node_modules/react-is/cjs/react-is.production.min.js.map +1 -0
  290. package/dist/node_modules/react-is/index.js +12 -0
  291. package/dist/node_modules/react-is/index.js.map +1 -0
  292. package/dist/shared/hooks/index.d.ts +7 -0
  293. package/dist/shared/hooks/index.d.ts.map +1 -0
  294. package/dist/shared/index.d.ts +6 -0
  295. package/dist/shared/index.d.ts.map +1 -0
  296. package/dist/shared/types/index.d.ts +109 -0
  297. package/dist/shared/types/index.d.ts.map +1 -0
  298. package/dist/utils/nativeBridge.d.ts +3 -0
  299. package/dist/utils/nativeBridge.d.ts.map +1 -0
  300. package/dist/utils/nativeBridge.js +2 -0
  301. package/package.json +114 -0
@@ -0,0 +1,314 @@
1
+ import { create as e } from "zustand";
2
+ import { persist as t } from "zustand/middleware";
3
+ import { createProfileScopedStorage as n } from "@burdenoff/fe-libs/shared/utils";
4
+ //#region src/auth/store/authStore.ts
5
+ var r = "bf-p", i = "bf-profiles", a = "bf-active-profile", o = "auth-storage", s = "bf-auth-state-cleared";
6
+ function c() {
7
+ return sessionStorage.getItem(a);
8
+ }
9
+ function l(e, t) {
10
+ return `${r}-${e}-${t}`;
11
+ }
12
+ function u(e) {
13
+ localStorage.removeItem(o), e && localStorage.removeItem(l(e, o));
14
+ for (let e of Object.keys(localStorage)) e.startsWith(`${r}-`) && e.endsWith(`-${o}`) && localStorage.removeItem(e);
15
+ }
16
+ function d() {
17
+ typeof window < "u" && window.dispatchEvent(new Event("bf-profile-storage-change"));
18
+ }
19
+ function f(e) {
20
+ if (typeof window > "u") return;
21
+ let t = c();
22
+ if (!t && !e.user && !e.clear) return;
23
+ let n = e.user?.id ?? t;
24
+ if (!(!n && !e.clear)) {
25
+ if (e.clear) {
26
+ if (u(n), !n) {
27
+ localStorage.removeItem(i), sessionStorage.removeItem(a);
28
+ return;
29
+ }
30
+ localStorage.removeItem(l(n, "user")), localStorage.removeItem(l(n, "tokens")), localStorage.removeItem(l(n, "workspace-token"));
31
+ try {
32
+ let e = localStorage.getItem(i), t = (e ? JSON.parse(e) : []).filter((e) => e.id !== n);
33
+ localStorage.setItem(i, JSON.stringify(t));
34
+ } catch {}
35
+ sessionStorage.removeItem(a);
36
+ return;
37
+ }
38
+ if (n) {
39
+ if (e.user) {
40
+ localStorage.setItem(l(n, "user"), JSON.stringify(e.user));
41
+ try {
42
+ let t = localStorage.getItem(i), r = (t ? JSON.parse(t) : []).filter((e) => e.id !== n);
43
+ r.push({
44
+ id: n,
45
+ email: e.user.email ?? "",
46
+ name: e.user.name ?? `${e.user.firstName ?? ""} ${e.user.lastName ?? ""}`.trim(),
47
+ avatar: e.user.avatar,
48
+ lastLogin: (/* @__PURE__ */ new Date()).toISOString()
49
+ }), localStorage.setItem(i, JSON.stringify(r));
50
+ } catch {}
51
+ sessionStorage.setItem(a, n);
52
+ }
53
+ if (e.accessToken !== void 0 || e.refreshToken !== void 0) {
54
+ let t = localStorage.getItem(l(n, "tokens")), r = t ? JSON.parse(t) : {}, i = r.expiresAt ?? Date.now() + 3600 * 1e3, a = e.accessToken ?? r.accessToken;
55
+ if (a) try {
56
+ let e = a.split(".")[1].replace(/-/g, "+").replace(/_/g, "/"), t = e.padEnd(Math.ceil(e.length / 4) * 4, "="), n = JSON.parse(atob(t));
57
+ typeof n.exp == "number" && (i = n.exp * 1e3);
58
+ } catch {}
59
+ let o = {
60
+ ...r,
61
+ ...e.accessToken === void 0 ? {} : { accessToken: e.accessToken },
62
+ ...e.refreshToken === void 0 ? {} : { refreshToken: e.refreshToken },
63
+ expiresAt: i
64
+ };
65
+ o.accessToken ? localStorage.setItem(l(n, "tokens"), JSON.stringify(o)) : localStorage.removeItem(l(n, "tokens"));
66
+ }
67
+ e.workspaceToken !== void 0 && (e.workspaceToken ? localStorage.setItem(l(n, "workspace-token"), e.workspaceToken) : localStorage.removeItem(l(n, "workspace-token"))), d();
68
+ try {
69
+ let t = window.location.hostname, r = t.endsWith(".local.burdenoff.com") ? ".local.burdenoff.com" : void 0, i = `${r ? `; domain=${r}` : ""}; path=/; samesite=lax${window.location.protocol === "https:" ? "; secure" : ""}`;
70
+ if (e.accessToken && n) {
71
+ let e = JSON.stringify({
72
+ id: n,
73
+ origin: window.location.origin
74
+ });
75
+ document.cookie = `bf-sso=${encodeURIComponent(e)}${i}; max-age=86400`, document.cookie = `bf-sso-profile=${encodeURIComponent(e)}${i}; max-age=86400`;
76
+ }
77
+ e.clear && (document.cookie = "bf-sso=; path=/; max-age=0", document.cookie = "bf-sso-profile=; path=/; max-age=0", r && (document.cookie = `bf-sso=; path=/; domain=${r}; max-age=0`, document.cookie = `bf-sso-profile=; path=/; domain=${r}; max-age=0`), t && !["localhost", "127.0.0.1"].includes(t) && (document.cookie = `bf-sso=; path=/; domain=${t}; max-age=0`, document.cookie = `bf-sso-profile=; path=/; domain=${t}; max-age=0`));
78
+ } catch {}
79
+ }
80
+ }
81
+ }
82
+ var p = e()(t((e) => ({
83
+ user: null,
84
+ accessToken: null,
85
+ refreshToken: null,
86
+ isAuthenticated: !1,
87
+ organizations: [],
88
+ currentOrganizationId: null,
89
+ isLoadingOrganizations: !1,
90
+ workspaces: [],
91
+ currentWorkspaceId: null,
92
+ workspaceToken: null,
93
+ isLoadingWorkspaces: !1,
94
+ projects: [],
95
+ currentProjectId: null,
96
+ isLoadingProjects: !1,
97
+ mfaRequired: !1,
98
+ mfaChallengeId: null,
99
+ mfaDevices: [],
100
+ activeSessions: [],
101
+ currentSessionId: null,
102
+ linkedAccounts: [],
103
+ trustedDevices: [],
104
+ securityEvents: [],
105
+ apiKeys: [],
106
+ apps: [],
107
+ currentApp: null,
108
+ delegations: [],
109
+ grantedDelegations: [],
110
+ isLoading: !1,
111
+ error: null,
112
+ errorCode: null,
113
+ setUser: (t) => {
114
+ e({ user: t }), f({ user: t });
115
+ },
116
+ setAccessToken: (t) => {
117
+ e({ accessToken: t }), f({ accessToken: t });
118
+ },
119
+ setAuthTokens: (t, n) => {
120
+ if (p.getState().user) e({
121
+ accessToken: t,
122
+ refreshToken: n
123
+ }), f({
124
+ accessToken: t,
125
+ refreshToken: n
126
+ });
127
+ else try {
128
+ let r = t.split(".")[1].replace(/-/g, "+").replace(/_/g, "/"), i = r.padEnd(Math.ceil(r.length / 4) * 4, "="), a = JSON.parse(atob(i)), o = {
129
+ id: a.sub,
130
+ email: a.email,
131
+ username: a.username,
132
+ role: a.role,
133
+ status: "ACTIVE",
134
+ emailVerified: !0,
135
+ mfaEnabled: !1,
136
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
137
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
138
+ };
139
+ e({
140
+ accessToken: t,
141
+ refreshToken: n,
142
+ user: o
143
+ }), f({
144
+ accessToken: t,
145
+ refreshToken: n,
146
+ user: o
147
+ });
148
+ } catch (r) {
149
+ console.error("[AuthStore] Failed to decode JWT:", r), e({
150
+ accessToken: t,
151
+ refreshToken: n
152
+ }), f({
153
+ accessToken: t,
154
+ refreshToken: n
155
+ });
156
+ }
157
+ },
158
+ setAuthenticated: (t) => e({ isAuthenticated: t }),
159
+ clearAuth: () => {
160
+ e({
161
+ user: null,
162
+ accessToken: null,
163
+ refreshToken: null,
164
+ isAuthenticated: !1,
165
+ mfaRequired: !1,
166
+ mfaChallengeId: null,
167
+ activeSessions: [],
168
+ currentSessionId: null,
169
+ organizations: [],
170
+ currentOrganizationId: null,
171
+ isLoadingOrganizations: !1,
172
+ workspaces: [],
173
+ workspaceToken: null,
174
+ currentWorkspaceId: null,
175
+ isLoadingWorkspaces: !1,
176
+ projects: [],
177
+ currentProjectId: null,
178
+ isLoadingProjects: !1
179
+ }), f({ clear: !0 });
180
+ },
181
+ setOrganizations: (t) => e({ organizations: t }),
182
+ setCurrentOrganizationId: (t) => e((e) => e.currentOrganizationId === t ? e : { currentOrganizationId: t }),
183
+ setLoadingOrganizations: (t) => e({ isLoadingOrganizations: t }),
184
+ setWorkspaces: (t) => e({ workspaces: t }),
185
+ setCurrentWorkspaceId: (t) => e((e) => e.currentWorkspaceId === t ? e : { currentWorkspaceId: t }),
186
+ setWorkspaceToken: (t) => {
187
+ e({ workspaceToken: t }), f({ workspaceToken: t });
188
+ },
189
+ setLoadingWorkspaces: (t) => e({ isLoadingWorkspaces: t }),
190
+ clearWorkspace: () => e({
191
+ currentWorkspaceId: null,
192
+ workspaceToken: null,
193
+ workspaces: []
194
+ }),
195
+ setProjects: (t) => e({ projects: t }),
196
+ setCurrentProjectId: (t) => e((e) => e.currentProjectId === t ? e : { currentProjectId: t }),
197
+ setLoadingProjects: (t) => e({ isLoadingProjects: t }),
198
+ clearProject: () => e({
199
+ currentProjectId: null,
200
+ projects: []
201
+ }),
202
+ clearContext: () => e({
203
+ organizations: [],
204
+ currentOrganizationId: null,
205
+ isLoadingOrganizations: !1,
206
+ workspaces: [],
207
+ currentWorkspaceId: null,
208
+ workspaceToken: null,
209
+ isLoadingWorkspaces: !1,
210
+ projects: [],
211
+ currentProjectId: null,
212
+ isLoadingProjects: !1
213
+ }),
214
+ loadFromProfile: (t) => {
215
+ let n = null, r = null, i = null, a = null;
216
+ try {
217
+ let e = localStorage.getItem(l(t, "user"));
218
+ e && (n = JSON.parse(e));
219
+ } catch {}
220
+ try {
221
+ let e = localStorage.getItem(l(t, "tokens"));
222
+ if (e) {
223
+ let t = JSON.parse(e);
224
+ r = t.accessToken ?? null, i = t.refreshToken ?? null;
225
+ }
226
+ } catch {}
227
+ a = localStorage.getItem(l(t, "workspace-token")), e({
228
+ user: n,
229
+ accessToken: r,
230
+ refreshToken: i,
231
+ isAuthenticated: !!r && !!n,
232
+ workspaceToken: a,
233
+ organizations: [],
234
+ currentOrganizationId: null,
235
+ isLoadingOrganizations: !1,
236
+ workspaces: [],
237
+ currentWorkspaceId: null,
238
+ isLoadingWorkspaces: !1,
239
+ projects: [],
240
+ currentProjectId: null,
241
+ isLoadingProjects: !1,
242
+ mfaRequired: !1,
243
+ mfaChallengeId: null
244
+ }), d();
245
+ },
246
+ setMfaRequired: (t, n) => e({
247
+ mfaRequired: t,
248
+ mfaChallengeId: n || null
249
+ }),
250
+ setMfaDevices: (t) => e({ mfaDevices: t }),
251
+ removeMfaDevice: (t) => e((e) => ({ mfaDevices: e.mfaDevices.filter((e) => e.id !== t) })),
252
+ setActiveSessions: (t) => e({ activeSessions: t }),
253
+ removeSession: (t) => e((e) => ({ activeSessions: e.activeSessions.filter((e) => e.id !== t) })),
254
+ setLinkedAccounts: (t) => e({ linkedAccounts: t }),
255
+ removeLinkedAccount: (t) => e((e) => ({ linkedAccounts: e.linkedAccounts.filter((e) => e.id !== t) })),
256
+ setTrustedDevices: (t) => e({ trustedDevices: t }),
257
+ removeTrustedDevice: (t) => e((e) => ({ trustedDevices: e.trustedDevices.filter((e) => e.id !== t) })),
258
+ setSecurityEvents: (t) => e({ securityEvents: t }),
259
+ setApiKeys: (t) => e({ apiKeys: t }),
260
+ removeApiKey: (t) => e((e) => ({ apiKeys: e.apiKeys.filter((e) => e.id !== t) })),
261
+ setApps: (t) => e({ apps: t }),
262
+ setCurrentApp: (t) => e({ currentApp: t }),
263
+ addApp: (t) => e((e) => ({ apps: [...e.apps, t] })),
264
+ updateApp: (t) => e((e) => ({
265
+ apps: e.apps.map((e) => e.id === t.id ? t : e),
266
+ currentApp: e.currentApp?.id === t.id ? t : e.currentApp
267
+ })),
268
+ removeApp: (t) => e((e) => ({
269
+ apps: e.apps.filter((e) => e.id !== t),
270
+ currentApp: e.currentApp?.id === t ? null : e.currentApp
271
+ })),
272
+ setDelegations: (t) => e({ delegations: t }),
273
+ setGrantedDelegations: (t) => e({ grantedDelegations: t }),
274
+ addDelegation: (t) => e((e) => ({ delegations: [...e.delegations, t] })),
275
+ removeDelegation: (t) => e((e) => ({
276
+ delegations: e.delegations.filter((e) => e.id !== t),
277
+ grantedDelegations: e.grantedDelegations.filter((e) => e.id !== t)
278
+ })),
279
+ setLoading: (t) => e({ isLoading: t }),
280
+ setError: (t, n) => e({
281
+ error: t,
282
+ errorCode: n ?? null
283
+ })
284
+ }), {
285
+ name: "auth-storage",
286
+ storage: n(),
287
+ partialize: (e) => ({
288
+ accessToken: e.accessToken,
289
+ refreshToken: e.refreshToken,
290
+ user: e.user,
291
+ isAuthenticated: e.isAuthenticated,
292
+ currentOrganizationId: e.currentOrganizationId,
293
+ currentWorkspaceId: e.currentWorkspaceId,
294
+ currentProjectId: e.currentProjectId,
295
+ workspaceToken: e.workspaceToken,
296
+ mfaRequired: e.mfaRequired,
297
+ mfaChallengeId: e.mfaChallengeId
298
+ })
299
+ }));
300
+ if (typeof window < "u") {
301
+ let e = window;
302
+ e.__bfAuthClearListenerInstalled || (e.__bfAuthClearListenerInstalled = !0, window.addEventListener(s, () => {
303
+ let e = p.getState();
304
+ if (e.isAuthenticated || e.accessToken || e.refreshToken || e.user) {
305
+ e.clearAuth();
306
+ return;
307
+ }
308
+ u(sessionStorage.getItem(a));
309
+ }));
310
+ }
311
+ //#endregion
312
+ export { p as useAuthStore };
313
+
314
+ //# sourceMappingURL=authStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authStore.js","names":[],"sources":["../../../src/auth/store/authStore.ts"],"sourcesContent":["import { create } from \"zustand\";\nimport { persist } from \"zustand/middleware\";\nimport { createProfileScopedStorage } from \"@burdenoff/fe-libs/shared/utils\";\nimport type {\n User,\n Session,\n MfaDevice,\n OAuthAccount,\n TrustedDevice,\n SecurityAudit,\n ApiKey,\n App,\n AppUserDelegation,\n Workspace,\n Organization,\n Project,\n} from \"../types\";\n\n/**\n * Sync auth state to profile-scoped storage (ProfileStorageManager keys).\n * The active profile ID comes from sessionStorage (\"bf-active-profile\").\n * Data is stored under localStorage keys: bf-p-{profileId}-user, bf-p-{profileId}-tokens, etc.\n */\nconst BF_PREFIX = \"bf-p\";\nconst BF_PROFILES = \"bf-profiles\";\nconst BF_ACTIVE = \"bf-active-profile\";\nconst AUTH_STORAGE_KEY = \"auth-storage\";\nconst AUTH_STATE_CLEARED_EVENT = \"bf-auth-state-cleared\";\n\nfunction getActiveProfileForSync(): string | null {\n return sessionStorage.getItem(BF_ACTIVE);\n}\n\nfunction pfKey(profileId: string, suffix: string): string {\n return `${BF_PREFIX}-${profileId}-${suffix}`;\n}\n\nfunction clearPersistedAuthStorage(profileId?: string | null): void {\n localStorage.removeItem(AUTH_STORAGE_KEY);\n if (profileId) {\n localStorage.removeItem(pfKey(profileId, AUTH_STORAGE_KEY));\n }\n for (const key of Object.keys(localStorage)) {\n if (\n key.startsWith(`${BF_PREFIX}-`) &&\n key.endsWith(`-${AUTH_STORAGE_KEY}`)\n ) {\n localStorage.removeItem(key);\n }\n }\n}\n\ninterface ProfileMeta {\n id: string;\n email: string;\n name: string;\n avatar?: string;\n lastLogin: string;\n}\n\n/** Dispatch custom event to notify fe-libs AuthProvider of storage changes (same-tab). */\nfunction notifyProfileStorageChange(): void {\n if (typeof window !== \"undefined\") {\n window.dispatchEvent(new Event(\"bf-profile-storage-change\"));\n }\n}\n\nfunction syncToProfileStorage(data: {\n user?: User | null;\n accessToken?: string | null;\n refreshToken?: string | null;\n workspaceToken?: string | null;\n clear?: boolean;\n}) {\n if (typeof window === \"undefined\") return;\n\n const profileId = getActiveProfileForSync();\n if (!profileId && !data.user && !data.clear) return;\n\n // For login/signup: prefer the user's own ID as the target profile.\n // This prevents overwriting an existing active profile when a NEW user\n // signs up or logs in (multi-account scenario).\n const targetId = data.user?.id ?? profileId;\n if (!targetId && !data.clear) return;\n\n if (data.clear) {\n clearPersistedAuthStorage(targetId);\n if (!targetId) {\n localStorage.removeItem(BF_PROFILES);\n sessionStorage.removeItem(BF_ACTIVE);\n return;\n }\n // Remove profile data keys\n localStorage.removeItem(pfKey(targetId, \"user\"));\n localStorage.removeItem(pfKey(targetId, \"tokens\"));\n localStorage.removeItem(pfKey(targetId, \"workspace-token\"));\n // Remove from profiles list\n try {\n const profilesRaw = localStorage.getItem(BF_PROFILES);\n const profiles: ProfileMeta[] = profilesRaw\n ? JSON.parse(profilesRaw)\n : [];\n const filtered = profiles.filter((p) => p.id !== targetId);\n localStorage.setItem(BF_PROFILES, JSON.stringify(filtered));\n } catch {\n /* ignore */\n }\n sessionStorage.removeItem(BF_ACTIVE);\n return;\n }\n\n if (!targetId) return;\n\n if (data.user) {\n localStorage.setItem(pfKey(targetId, \"user\"), JSON.stringify(data.user));\n // Update profiles list\n try {\n const profilesRaw = localStorage.getItem(BF_PROFILES);\n const profiles: ProfileMeta[] = profilesRaw\n ? JSON.parse(profilesRaw)\n : [];\n const existing = profiles.filter((p) => p.id !== targetId);\n existing.push({\n id: targetId,\n email: data.user.email ?? \"\",\n name:\n data.user.name ??\n `${data.user.firstName ?? \"\"} ${data.user.lastName ?? \"\"}`.trim(),\n avatar: data.user.avatar,\n lastLogin: new Date().toISOString(),\n });\n localStorage.setItem(BF_PROFILES, JSON.stringify(existing));\n } catch {\n /* ignore */\n }\n // Set as active profile in this tab\n sessionStorage.setItem(BF_ACTIVE, targetId);\n }\n\n if (data.accessToken !== undefined || data.refreshToken !== undefined) {\n const existingRaw = localStorage.getItem(pfKey(targetId, \"tokens\"));\n const existing = existingRaw ? JSON.parse(existingRaw) : {};\n // Compute expiresAt from the actual JWT exp claim if a new access token is provided\n let expiresAt = existing.expiresAt ?? Date.now() + 60 * 60 * 1000;\n const tokenToCheck = data.accessToken ?? existing.accessToken;\n if (tokenToCheck) {\n try {\n const raw = tokenToCheck\n .split(\".\")[1]\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\");\n const padded = raw.padEnd(Math.ceil(raw.length / 4) * 4, \"=\");\n const payload = JSON.parse(atob(padded));\n if (typeof payload.exp === \"number\") {\n expiresAt = payload.exp * 1000; // JWT exp is in seconds → ms\n }\n } catch {\n // Fallback: keep existing or default 1h\n }\n }\n const merged = {\n ...existing,\n ...(data.accessToken !== undefined\n ? { accessToken: data.accessToken }\n : {}),\n ...(data.refreshToken !== undefined\n ? { refreshToken: data.refreshToken }\n : {}),\n expiresAt,\n };\n if (merged.accessToken) {\n localStorage.setItem(pfKey(targetId, \"tokens\"), JSON.stringify(merged));\n } else {\n localStorage.removeItem(pfKey(targetId, \"tokens\"));\n }\n }\n\n if (data.workspaceToken !== undefined) {\n if (data.workspaceToken) {\n localStorage.setItem(\n pfKey(targetId, \"workspace-token\"),\n data.workspaceToken,\n );\n } else {\n localStorage.removeItem(pfKey(targetId, \"workspace-token\"));\n }\n }\n\n // Notify fe-libs AuthProvider of the change (same-tab custom event)\n notifyProfileStorageChange();\n\n // Set SSO cookie for cross-domain session sharing (works in all envs)\n // Stores profile ID + the origin where the user logged in.\n // Other shells use the origin to redirect to /auth/sso-relay for token relay.\n try {\n const hostname = window.location.hostname;\n // For local dev, set cookie on shared .local.burdenoff.com domain\n // For production, set cookie on current domain only (relay handles cross-domain)\n const isSharedDomain = hostname.endsWith(\".local.burdenoff.com\");\n const domain = isSharedDomain ? \".local.burdenoff.com\" : undefined;\n const domainPart = domain ? `; domain=${domain}` : \"\";\n const securePart = window.location.protocol === \"https:\" ? \"; secure\" : \"\";\n const cookieOpts = `${domainPart}; path=/; samesite=lax${securePart}`;\n\n if (data.accessToken && targetId) {\n // Store profile ID + login origin for SSO relay\n const ssoValue = JSON.stringify({\n id: targetId,\n origin: window.location.origin,\n });\n document.cookie = `bf-sso=${encodeURIComponent(ssoValue)}${cookieOpts}; max-age=86400`;\n document.cookie = `bf-sso-profile=${encodeURIComponent(ssoValue)}${cookieOpts}; max-age=86400`;\n }\n\n if (data.clear) {\n document.cookie = \"bf-sso=; path=/; max-age=0\";\n document.cookie = \"bf-sso-profile=; path=/; max-age=0\";\n if (domain) {\n document.cookie = `bf-sso=; path=/; domain=${domain}; max-age=0`;\n document.cookie = `bf-sso-profile=; path=/; domain=${domain}; max-age=0`;\n }\n if (hostname && ![\"localhost\", \"127.0.0.1\"].includes(hostname)) {\n document.cookie = `bf-sso=; path=/; domain=${hostname}; max-age=0`;\n document.cookie = `bf-sso-profile=; path=/; domain=${hostname}; max-age=0`;\n }\n }\n } catch {\n /* ignore */\n }\n}\n\ninterface AuthState {\n // Auth state\n user: User | null;\n accessToken: string | null;\n refreshToken: string | null;\n isAuthenticated: boolean;\n\n // Organization state\n organizations: Organization[];\n currentOrganizationId: string | null;\n isLoadingOrganizations: boolean;\n\n // Workspace state\n workspaces: Workspace[];\n currentWorkspaceId: string | null;\n workspaceToken: string | null;\n isLoadingWorkspaces: boolean;\n\n // Project state\n projects: Project[];\n currentProjectId: string | null;\n isLoadingProjects: boolean;\n\n // MFA state\n mfaRequired: boolean;\n mfaChallengeId: string | null;\n mfaDevices: MfaDevice[];\n\n // Session state\n activeSessions: Session[];\n currentSessionId: string | null;\n\n // OAuth state\n linkedAccounts: OAuthAccount[];\n\n // Security state\n trustedDevices: TrustedDevice[];\n securityEvents: SecurityAudit[];\n\n // API Keys state\n apiKeys: ApiKey[];\n\n // Apps state\n apps: App[];\n currentApp: App | null;\n\n // Delegations state\n delegations: AppUserDelegation[];\n grantedDelegations: AppUserDelegation[];\n\n // UI state\n isLoading: boolean;\n error: string | null;\n errorCode: string | null;\n\n // Actions - Auth\n setUser: (user: User | null) => void;\n setAccessToken: (token: string | null) => void;\n setAuthTokens: (accessToken: string, refreshToken: string) => void;\n setAuthenticated: (isAuthenticated: boolean) => void;\n clearAuth: () => void;\n\n // Actions - Organization\n setOrganizations: (organizations: Organization[]) => void;\n setCurrentOrganizationId: (orgId: string | null) => void;\n setLoadingOrganizations: (loading: boolean) => void;\n\n // Actions - Workspace\n setWorkspaces: (workspaces: Workspace[]) => void;\n setCurrentWorkspaceId: (workspaceId: string | null) => void;\n setWorkspaceToken: (token: string | null) => void;\n setLoadingWorkspaces: (loading: boolean) => void;\n clearWorkspace: () => void;\n\n // Actions - Project\n setProjects: (projects: Project[]) => void;\n setCurrentProjectId: (projectId: string | null) => void;\n setLoadingProjects: (loading: boolean) => void;\n clearProject: () => void;\n\n // Actions - Context (clears org, workspace, project)\n clearContext: () => void;\n\n // Actions - Profile Switch (load from profile storage without syncing back)\n loadFromProfile: (profileId: string) => void;\n\n // Actions - MFA\n setMfaRequired: (required: boolean, challengeId?: string) => void;\n setMfaDevices: (devices: MfaDevice[]) => void;\n removeMfaDevice: (deviceId: string) => void;\n\n // Actions - Sessions\n setActiveSessions: (sessions: Session[]) => void;\n removeSession: (sessionId: string) => void;\n\n // Actions - OAuth\n setLinkedAccounts: (accounts: OAuthAccount[]) => void;\n removeLinkedAccount: (accountId: string) => void;\n\n // Actions - Security\n setTrustedDevices: (devices: TrustedDevice[]) => void;\n removeTrustedDevice: (deviceId: string) => void;\n setSecurityEvents: (events: SecurityAudit[]) => void;\n\n // Actions - API Keys\n setApiKeys: (keys: ApiKey[]) => void;\n removeApiKey: (keyId: string) => void;\n\n // Actions - Apps\n setApps: (apps: App[]) => void;\n setCurrentApp: (app: App | null) => void;\n addApp: (app: App) => void;\n updateApp: (app: App) => void;\n removeApp: (appId: string) => void;\n\n // Actions - Delegations\n setDelegations: (delegations: AppUserDelegation[]) => void;\n setGrantedDelegations: (delegations: AppUserDelegation[]) => void;\n addDelegation: (delegation: AppUserDelegation) => void;\n removeDelegation: (delegationId: string) => void;\n\n // Actions - UI\n setLoading: (loading: boolean) => void;\n setError: (error: string | null, errorCode?: string | null) => void;\n}\n\nexport const useAuthStore = create<AuthState>()(\n persist(\n (set) => ({\n // Initial state\n user: null,\n accessToken: null,\n refreshToken: null,\n isAuthenticated: false,\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n currentWorkspaceId: null,\n workspaceToken: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n mfaRequired: false,\n mfaChallengeId: null,\n mfaDevices: [],\n activeSessions: [],\n currentSessionId: null,\n linkedAccounts: [],\n trustedDevices: [],\n securityEvents: [],\n apiKeys: [],\n apps: [],\n currentApp: null,\n delegations: [],\n grantedDelegations: [],\n isLoading: false,\n error: null,\n errorCode: null,\n\n // Actions - Auth (with profile storage sync)\n setUser: (user) => {\n set({ user });\n syncToProfileStorage({ user });\n },\n\n setAccessToken: (token) => {\n set({ accessToken: token });\n syncToProfileStorage({ accessToken: token });\n },\n\n setAuthTokens: (accessToken, refreshToken) => {\n // Only set tokens here. Do NOT overwrite user — setUser() handles that\n // with the full user object from the GraphQL response (firstName, lastName, etc.).\n // Fall back to JWT-decoded user ONLY if no user is currently in the store.\n const currentState = useAuthStore.getState();\n if (currentState.user) {\n // User already set (from setUser call) — just update tokens\n set({ accessToken, refreshToken });\n syncToProfileStorage({ accessToken, refreshToken });\n } else {\n // No user yet — decode JWT as fallback\n try {\n const b64 = accessToken\n .split(\".\")[1]\n .replace(/-/g, \"+\")\n .replace(/_/g, \"/\");\n const padded = b64.padEnd(Math.ceil(b64.length / 4) * 4, \"=\");\n const payload = JSON.parse(atob(padded));\n const user: User = {\n id: payload.sub,\n email: payload.email,\n username: payload.username,\n role: payload.role,\n status: \"ACTIVE\",\n emailVerified: true,\n mfaEnabled: false,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n set({ accessToken, refreshToken, user });\n syncToProfileStorage({ accessToken, refreshToken, user });\n } catch (error) {\n console.error(\"[AuthStore] Failed to decode JWT:\", error);\n set({ accessToken, refreshToken });\n syncToProfileStorage({ accessToken, refreshToken });\n }\n }\n },\n\n setAuthenticated: (isAuthenticated) => set({ isAuthenticated }),\n\n clearAuth: () => {\n set({\n user: null,\n accessToken: null,\n refreshToken: null,\n isAuthenticated: false,\n mfaRequired: false,\n mfaChallengeId: null,\n activeSessions: [],\n currentSessionId: null,\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n workspaceToken: null,\n currentWorkspaceId: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n });\n syncToProfileStorage({ clear: true });\n },\n\n // Actions - Organization\n setOrganizations: (organizations) => set({ organizations }),\n\n setCurrentOrganizationId: (orgId) =>\n set((state) =>\n state.currentOrganizationId === orgId\n ? state\n : { currentOrganizationId: orgId },\n ),\n\n setLoadingOrganizations: (loading) =>\n set({ isLoadingOrganizations: loading }),\n\n // Actions - Workspace\n setWorkspaces: (workspaces) => set({ workspaces }),\n\n setCurrentWorkspaceId: (workspaceId) =>\n set((state) =>\n state.currentWorkspaceId === workspaceId\n ? state\n : { currentWorkspaceId: workspaceId },\n ),\n\n setWorkspaceToken: (token) => {\n set({ workspaceToken: token });\n syncToProfileStorage({ workspaceToken: token });\n },\n\n setLoadingWorkspaces: (loading) => set({ isLoadingWorkspaces: loading }),\n\n clearWorkspace: () =>\n set({ currentWorkspaceId: null, workspaceToken: null, workspaces: [] }),\n\n // Actions - Project\n setProjects: (projects) => set({ projects }),\n\n setCurrentProjectId: (projectId) =>\n set((state) =>\n state.currentProjectId === projectId\n ? state\n : { currentProjectId: projectId },\n ),\n\n setLoadingProjects: (loading) => set({ isLoadingProjects: loading }),\n\n clearProject: () => set({ currentProjectId: null, projects: [] }),\n\n // Actions - Context (clears org, workspace, project)\n clearContext: () =>\n set({\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n currentWorkspaceId: null,\n workspaceToken: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n }),\n\n // Actions - Profile Switch\n // Loads user/tokens from profile-scoped localStorage WITHOUT syncing back.\n // Used during account switching to align zustand with the new active profile.\n loadFromProfile: (profileId: string) => {\n let user: User | null = null;\n let accessToken: string | null = null;\n let refreshToken: string | null = null;\n let workspaceToken: string | null = null;\n\n try {\n const userRaw = localStorage.getItem(pfKey(profileId, \"user\"));\n if (userRaw) user = JSON.parse(userRaw);\n } catch {\n /* ignore */\n }\n\n try {\n const tokensRaw = localStorage.getItem(pfKey(profileId, \"tokens\"));\n if (tokensRaw) {\n const tokens = JSON.parse(tokensRaw);\n accessToken = tokens.accessToken ?? null;\n refreshToken = tokens.refreshToken ?? null;\n }\n } catch {\n /* ignore */\n }\n\n workspaceToken = localStorage.getItem(\n pfKey(profileId, \"workspace-token\"),\n );\n\n // Set everything in one batch — clears context data so it will be re-fetched\n set({\n user,\n accessToken,\n refreshToken,\n isAuthenticated: !!accessToken && !!user,\n workspaceToken,\n // Clear all context — will be re-fetched for the new user\n organizations: [],\n currentOrganizationId: null,\n isLoadingOrganizations: false,\n workspaces: [],\n currentWorkspaceId: null,\n isLoadingWorkspaces: false,\n projects: [],\n currentProjectId: null,\n isLoadingProjects: false,\n // Clear MFA state\n mfaRequired: false,\n mfaChallengeId: null,\n });\n\n // Notify listeners (e.g., AuthTokenProvider) without writing back to storage\n notifyProfileStorageChange();\n },\n\n // Actions - MFA\n setMfaRequired: (required, challengeId) =>\n set({ mfaRequired: required, mfaChallengeId: challengeId || null }),\n\n setMfaDevices: (devices) => set({ mfaDevices: devices }),\n\n removeMfaDevice: (deviceId) =>\n set((state) => ({\n mfaDevices: state.mfaDevices.filter((d) => d.id !== deviceId),\n })),\n\n // Actions - Sessions\n setActiveSessions: (sessions) => set({ activeSessions: sessions }),\n\n removeSession: (sessionId) =>\n set((state) => ({\n activeSessions: state.activeSessions.filter(\n (s) => s.id !== sessionId,\n ),\n })),\n\n // Actions - OAuth\n setLinkedAccounts: (accounts) => set({ linkedAccounts: accounts }),\n\n removeLinkedAccount: (accountId) =>\n set((state) => ({\n linkedAccounts: state.linkedAccounts.filter(\n (a) => a.id !== accountId,\n ),\n })),\n\n // Actions - Security\n setTrustedDevices: (devices) => set({ trustedDevices: devices }),\n\n removeTrustedDevice: (deviceId) =>\n set((state) => ({\n trustedDevices: state.trustedDevices.filter((d) => d.id !== deviceId),\n })),\n\n setSecurityEvents: (events) => set({ securityEvents: events }),\n\n // Actions - API Keys\n setApiKeys: (keys) => set({ apiKeys: keys }),\n\n removeApiKey: (keyId) =>\n set((state) => ({\n apiKeys: state.apiKeys.filter((k) => k.id !== keyId),\n })),\n\n // Actions - Apps\n setApps: (apps) => set({ apps }),\n\n setCurrentApp: (app) => set({ currentApp: app }),\n\n addApp: (app) =>\n set((state) => ({\n apps: [...state.apps, app],\n })),\n\n updateApp: (app) =>\n set((state) => ({\n apps: state.apps.map((a) => (a.id === app.id ? app : a)),\n currentApp: state.currentApp?.id === app.id ? app : state.currentApp,\n })),\n\n removeApp: (appId) =>\n set((state) => ({\n apps: state.apps.filter((a) => a.id !== appId),\n currentApp: state.currentApp?.id === appId ? null : state.currentApp,\n })),\n\n // Actions - Delegations\n setDelegations: (delegations) => set({ delegations }),\n\n setGrantedDelegations: (delegations) =>\n set({ grantedDelegations: delegations }),\n\n addDelegation: (delegation) =>\n set((state) => ({\n delegations: [...state.delegations, delegation],\n })),\n\n removeDelegation: (delegationId) =>\n set((state) => ({\n delegations: state.delegations.filter((d) => d.id !== delegationId),\n grantedDelegations: state.grantedDelegations.filter(\n (d) => d.id !== delegationId,\n ),\n })),\n\n // Actions - UI\n setLoading: (loading) => set({ isLoading: loading }),\n\n setError: (error, errorCode) =>\n set({ error, errorCode: errorCode ?? null }),\n }),\n {\n name: \"auth-storage\",\n storage: createProfileScopedStorage(),\n partialize: (state) => ({\n accessToken: state.accessToken,\n refreshToken: state.refreshToken,\n user: state.user,\n isAuthenticated: state.isAuthenticated,\n // Context state\n currentOrganizationId: state.currentOrganizationId,\n currentWorkspaceId: state.currentWorkspaceId,\n currentProjectId: state.currentProjectId,\n workspaceToken: state.workspaceToken,\n // MFA state must be persisted for login verification flow\n mfaRequired: state.mfaRequired,\n mfaChallengeId: state.mfaChallengeId,\n }),\n },\n ),\n);\n\ntype AuthClearWindow = Window & { __bfAuthClearListenerInstalled?: boolean };\n\nif (typeof window !== \"undefined\") {\n const authWindow = window as AuthClearWindow;\n if (!authWindow.__bfAuthClearListenerInstalled) {\n authWindow.__bfAuthClearListenerInstalled = true;\n window.addEventListener(AUTH_STATE_CLEARED_EVENT, () => {\n const state = useAuthStore.getState();\n if (\n state.isAuthenticated ||\n state.accessToken ||\n state.refreshToken ||\n state.user\n ) {\n state.clearAuth();\n return;\n }\n clearPersistedAuthStorage(sessionStorage.getItem(BF_ACTIVE));\n });\n }\n}\n"],"mappings":"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"}