@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 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/auth/constants/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;CAqBnB,CAAC;AAEX,MAAM,MAAM,cAAc,GACxB,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,18 @@
1
+ //#region src/auth/constants/permissions.ts
2
+ var e = {
3
+ USER_READ: "user:read",
4
+ USER_UPDATE: "user:update",
5
+ USER_DELETE: "user:delete",
6
+ APP_READ: "app:read",
7
+ APP_CREATE: "app:create",
8
+ APP_UPDATE: "app:update",
9
+ SSO_CONFIG_MANAGE: "sso-config:manage",
10
+ SSO_CONFIG_DELETE: "sso-config:delete",
11
+ OIDC_CONFIG_MANAGE: "oidc-config:manage",
12
+ OIDC_CONFIG_DELETE: "oidc-config:delete",
13
+ AUTH_METHOD_UPDATE: "auth-method:update"
14
+ };
15
+ //#endregion
16
+ export { e as AUTH_PERMISSIONS };
17
+
18
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","names":[],"sources":["../../../src/auth/constants/permissions.ts"],"sourcesContent":["/**\n * Auth Permission Constants\n *\n * Permission strings matching the @rbac directives on global-auth-svc.\n * Only covers admin-facing operations — public auth flows (login, signup,\n * password reset, MFA verify, OAuth, SSO) don't need RBAC.\n * Self-service operations (own profile, sessions, API keys) are identity-scoped.\n *\n * Resource types and actions from global-rbac-svc seed:\n * user: read, update, delete\n * app: read, create, update\n * sso-config: manage, delete\n * oidc-config: manage, delete\n * auth-method: update\n */\n\nexport const AUTH_PERMISSIONS = {\n // User management (admin)\n USER_READ: \"user:read\",\n USER_UPDATE: \"user:update\",\n USER_DELETE: \"user:delete\",\n\n // OAuth app management\n APP_READ: \"app:read\",\n APP_CREATE: \"app:create\",\n APP_UPDATE: \"app:update\",\n\n // SSO configuration (admin)\n SSO_CONFIG_MANAGE: \"sso-config:manage\",\n SSO_CONFIG_DELETE: \"sso-config:delete\",\n\n // OIDC configuration (admin)\n OIDC_CONFIG_MANAGE: \"oidc-config:manage\",\n OIDC_CONFIG_DELETE: \"oidc-config:delete\",\n\n // Auth method configuration (admin)\n AUTH_METHOD_UPDATE: \"auth-method:update\",\n} as const;\n\nexport type AuthPermission =\n (typeof AUTH_PERMISSIONS)[keyof typeof AUTH_PERMISSIONS];\n"],"mappings":";AAgBA,IAAa,IAAmB;CAE9B,WAAW;CACX,aAAa;CACb,aAAa;CAGb,UAAU;CACV,YAAY;CACZ,YAAY;CAGZ,mBAAmB;CACnB,mBAAmB;CAGnB,oBAAoB;CACpB,oBAAoB;CAGpB,oBAAoB;CACrB"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * sessionStorage key constants for auth flows.
3
+ * Centralizing these avoids silent key mismatches across files.
4
+ */
5
+ export declare const MFA_CHALLENGE_ID = "mfa_challenge_id";
6
+ export declare const MFA_PENDING_TOKEN = "mfa_pending_token";
7
+ export declare const MFA_PENDING_REFRESH = "mfa_pending_refresh";
8
+ export declare const MFA_REDIRECT = "mfa_redirect";
9
+ export declare const OIDC_CODE_VERIFIER = "oidc_code_verifier";
10
+ export declare const OIDC_STATE = "oidc_state";
11
+ export declare const OIDC_NONCE = "oidc_nonce";
12
+ export declare const OIDC_TENANT_ID = "oidc_tenant_id";
13
+ export declare const OIDC_FLOW = "oidc_flow";
14
+ export declare const OIDC_REDIRECT = "oidc_redirect";
15
+ export declare const OIDC_CLIENT_ID = "oidc_client_id";
16
+ export declare const MFA_SESSION_KEYS: readonly ["mfa_challenge_id", "mfa_pending_token", "mfa_pending_refresh", "mfa_redirect"];
17
+ export declare const OIDC_SESSION_KEYS: readonly ["oidc_code_verifier", "oidc_state", "oidc_nonce", "oidc_tenant_id", "oidc_flow", "oidc_redirect"];
18
+ //# sourceMappingURL=sessionKeys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionKeys.d.ts","sourceRoot":"","sources":["../../../src/auth/constants/sessionKeys.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AACnD,eAAO,MAAM,iBAAiB,sBAAsB,CAAC;AACrD,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAG3C,eAAO,MAAM,kBAAkB,uBAAuB,CAAC;AACvD,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,UAAU,eAAe,CAAC;AACvC,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,SAAS,cAAc,CAAC;AACrC,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAG/C,eAAO,MAAM,gBAAgB,2FAKnB,CAAC;AAEX,eAAO,MAAM,iBAAiB,6GAOpB,CAAC"}
@@ -0,0 +1,6 @@
1
+ //#region src/auth/constants/sessionKeys.ts
2
+ var e = "mfa_challenge_id", t = "mfa_pending_token", n = "mfa_pending_refresh", r = "mfa_redirect", i = "oidc_code_verifier", a = "oidc_state", o = "oidc_nonce", s = "oidc_tenant_id", c = "oidc_flow", l = "oidc_redirect";
3
+ //#endregion
4
+ export { e as MFA_CHALLENGE_ID, n as MFA_PENDING_REFRESH, t as MFA_PENDING_TOKEN, r as MFA_REDIRECT, i as OIDC_CODE_VERIFIER, c as OIDC_FLOW, o as OIDC_NONCE, l as OIDC_REDIRECT, a as OIDC_STATE, s as OIDC_TENANT_ID };
5
+
6
+ //# sourceMappingURL=sessionKeys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessionKeys.js","names":[],"sources":["../../../src/auth/constants/sessionKeys.ts"],"sourcesContent":["/**\n * sessionStorage key constants for auth flows.\n * Centralizing these avoids silent key mismatches across files.\n */\n\n// MFA verification flow\nexport const MFA_CHALLENGE_ID = \"mfa_challenge_id\";\nexport const MFA_PENDING_TOKEN = \"mfa_pending_token\";\nexport const MFA_PENDING_REFRESH = \"mfa_pending_refresh\";\nexport const MFA_REDIRECT = \"mfa_redirect\";\n\n// OIDC / SSO flow\nexport const OIDC_CODE_VERIFIER = \"oidc_code_verifier\";\nexport const OIDC_STATE = \"oidc_state\";\nexport const OIDC_NONCE = \"oidc_nonce\";\nexport const OIDC_TENANT_ID = \"oidc_tenant_id\";\nexport const OIDC_FLOW = \"oidc_flow\";\nexport const OIDC_REDIRECT = \"oidc_redirect\";\nexport const OIDC_CLIENT_ID = \"oidc_client_id\";\n\n// MFA key sets for bulk operations\nexport const MFA_SESSION_KEYS = [\n MFA_CHALLENGE_ID,\n MFA_PENDING_TOKEN,\n MFA_PENDING_REFRESH,\n MFA_REDIRECT,\n] as const;\n\nexport const OIDC_SESSION_KEYS = [\n OIDC_CODE_VERIFIER,\n OIDC_STATE,\n OIDC_NONCE,\n OIDC_TENANT_ID,\n OIDC_FLOW,\n OIDC_REDIRECT,\n] as const;\n"],"mappings":";AAMA,IAAa,IAAmB,oBACnB,IAAoB,qBACpB,IAAsB,uBACtB,IAAe,gBAGf,IAAqB,sBACrB,IAAa,cACb,IAAa,cACb,IAAiB,kBACjB,IAAY,aACZ,IAAgB"}
@@ -0,0 +1,18 @@
1
+ export { useAuthOperations } from './useAuthOperations';
2
+ export { useMfaOperations } from './useMfaOperations';
3
+ export { usePasswordOperations } from './usePasswordOperations';
4
+ export { useSessionOperations } from './useSessionOperations';
5
+ export { useApiKeyOperations } from './useApiKeyOperations';
6
+ export { useAppOperations } from './useAppOperations';
7
+ export { useWorkspaceOperations } from './useWorkspaceOperations';
8
+ export { useMyWorkspaces } from './useMyWorkspaces';
9
+ export { useContextSwitcherData, useWorkspaceSyncEffect, useProjectSyncEffect, } from './useContextSwitcherData';
10
+ export type { UseContextSwitcherDataOptions } from './useContextSwitcherData';
11
+ export { useDelegationOperations } from './useDelegationOperations';
12
+ export { useUserOperations } from './useUserOperations';
13
+ export { useSsoOperations } from './useSsoOperations';
14
+ export { useOAuthOperations } from './useOAuthOperations';
15
+ export { useAccountOperations } from './useAccountOperations';
16
+ export { useAuthPermissions } from './useAuthPermissions';
17
+ export { useAuthStore } from '../store/authStore';
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAG5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,OAAO,EACL,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,6BAA6B,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAGpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAGtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import "../store/authStore.js";
2
+ import "./useAuthOperations.js";
3
+ import "./useMfaOperations.js";
4
+ import "./usePasswordOperations.js";
5
+ import "./useSessionOperations.js";
6
+ import "./useApiKeyOperations.js";
7
+ import "./useAppOperations.js";
8
+ import "./useWorkspaceOperations.js";
9
+ import "./useMyWorkspaces.js";
10
+ import "./useContextSwitcherData.js";
11
+ import "./useDelegationOperations.js";
12
+ import "./useUserOperations.js";
13
+ import "./useSsoOperations.js";
14
+ import "./useOAuthOperations.js";
15
+ import "./useAccountOperations.js";
16
+ import "./useAuthPermissions.js";
@@ -0,0 +1,19 @@
1
+ import { AuthResult } from '../types';
2
+
3
+ export interface AccountActionResult {
4
+ success: boolean;
5
+ message: string;
6
+ }
7
+ /**
8
+ * Hook for account management operations (deactivate, delete, reactivate)
9
+ */
10
+ export declare function useAccountOperations(): {
11
+ deactivateAccount: (password: string) => Promise<AccountActionResult>;
12
+ deleteAccount: (password: string, confirmPhrase: string) => Promise<AccountActionResult>;
13
+ reactivateAccount: (email: string, password: string) => Promise<AuthResult>;
14
+ isDeactivating: boolean;
15
+ isDeleting: boolean;
16
+ isReactivating: boolean;
17
+ isLoading: boolean;
18
+ };
19
+ //# sourceMappingURL=useAccountOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccountOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/useAccountOperations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAqC3C,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;GAEG;AACH,wBAAgB,oBAAoB;kCAqBtB,MAAM,KACf,OAAO,CAAC,mBAAmB,CAAC;8BAyBnB,MAAM,iBACD,MAAM,KACpB,OAAO,CAAC,mBAAmB,CAAC;+BA8BtB,MAAM,YACH,MAAM,KACf,OAAO,CAAC,UAAU,CAAC;;;;;EAuCvB"}
@@ -0,0 +1,52 @@
1
+ import { useAuthStore as e } from "../store/authStore.js";
2
+ import { DeactivateAccountDocument as t, DeleteAccountDocument as n, ReactivateAccountDocument as r } from "../../generated/global-operations.js";
3
+ import { useMutation as i } from "@apollo/client/react";
4
+ //#region src/auth/hooks/useAccountOperations.ts
5
+ function a() {
6
+ let [a, { loading: o }] = i(t), [s, { loading: c }] = i(n), [l, { loading: u }] = i(r), d = e.getState();
7
+ return {
8
+ deactivateAccount: async (e) => {
9
+ try {
10
+ let { data: t } = await a({ variables: { password: e } }), n = t.deactivateAccount;
11
+ return n.success && d.clearAuth(), n;
12
+ } catch (e) {
13
+ throw console.error("Failed to deactivate account:", e), e;
14
+ }
15
+ },
16
+ deleteAccount: async (e, t) => {
17
+ if (t !== "DELETE MY ACCOUNT") throw Error("Please type \"DELETE MY ACCOUNT\" to confirm deletion");
18
+ try {
19
+ let { data: n } = await s({ variables: {
20
+ password: e,
21
+ confirmPhrase: t
22
+ } }), r = n.deleteAccount;
23
+ return r.success && d.clearAuth(), r;
24
+ } catch (e) {
25
+ throw console.error("Failed to delete account:", e), e;
26
+ }
27
+ },
28
+ reactivateAccount: async (e, t) => {
29
+ try {
30
+ d.setLoading(!0), d.setError(null);
31
+ let { data: n } = await l({ variables: {
32
+ email: e,
33
+ password: t
34
+ } }), r = n.reactivateAccount;
35
+ return r.success && r.user && r.token ? (d.setUser(r.user), d.setAuthTokens(r.token, r.refreshToken || ""), d.setAuthenticated(!0)) : r.error && d.setError(r.error), r;
36
+ } catch (e) {
37
+ let t = e instanceof Error ? e.message : "Failed to reactivate account";
38
+ throw d.setError(t), e;
39
+ } finally {
40
+ d.setLoading(!1);
41
+ }
42
+ },
43
+ isDeactivating: o,
44
+ isDeleting: c,
45
+ isReactivating: u,
46
+ isLoading: o || c || u
47
+ };
48
+ }
49
+ //#endregion
50
+ export { a as useAccountOperations };
51
+
52
+ //# sourceMappingURL=useAccountOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAccountOperations.js","names":[],"sources":["../../../src/auth/hooks/useAccountOperations.ts"],"sourcesContent":["import { useMutation } from \"@apollo/client/react\";\nimport { useAuthStore } from \"../store/authStore\";\nimport type { AuthResult } from \"../types\";\n\nimport {\n DeactivateAccountDocument,\n DeleteAccountDocument,\n ReactivateAccountDocument,\n} from \"../../generated/global-operations\";\n// =============================================================================\n// Response Types (Apollo Client 4.x)\n// =============================================================================\n\ninterface DeactivateAccountResponse {\n deactivateAccount: {\n success: boolean;\n message: string;\n };\n}\n\ninterface DeleteAccountResponse {\n deleteAccount: {\n success: boolean;\n message: string;\n };\n}\n\ninterface ReactivateAccountResponse {\n reactivateAccount: AuthResult;\n}\n\n// =============================================================================\n// GraphQL Operations\n// =============================================================================\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface AccountActionResult {\n success: boolean;\n message: string;\n}\n\n// =============================================================================\n// Hook\n// =============================================================================\n\n/**\n * Hook for account management operations (deactivate, delete, reactivate)\n */\nexport function useAccountOperations() {\n const [deactivateAccountMutation, { loading: deactivating }] = useMutation<\n DeactivateAccountResponse,\n { password: string }\n >(DeactivateAccountDocument);\n const [deleteAccountMutation, { loading: deleting }] = useMutation<\n DeleteAccountResponse,\n { password: string; confirmPhrase: string }\n >(DeleteAccountDocument);\n const [reactivateAccountMutation, { loading: reactivating }] = useMutation<\n ReactivateAccountResponse,\n { email: string; password: string }\n >(ReactivateAccountDocument);\n\n const store = useAuthStore.getState();\n\n /**\n * Deactivate account (soft disable - can be reactivated)\n * Requires password confirmation\n */\n const deactivateAccount = async (\n password: string,\n ): Promise<AccountActionResult> => {\n try {\n const { data } = await deactivateAccountMutation({\n variables: { password },\n });\n\n const result = data!.deactivateAccount;\n\n if (result.success) {\n // Clear auth state after deactivation\n store.clearAuth();\n }\n\n return result;\n } catch (error) {\n console.error(\"Failed to deactivate account:\", error);\n throw error;\n }\n };\n\n /**\n * Delete account permanently\n * Requires password AND confirmation phrase \"DELETE MY ACCOUNT\"\n */\n const deleteAccount = async (\n password: string,\n confirmPhrase: string,\n ): Promise<AccountActionResult> => {\n // Validate confirmation phrase\n if (confirmPhrase !== \"DELETE MY ACCOUNT\") {\n throw new Error('Please type \"DELETE MY ACCOUNT\" to confirm deletion');\n }\n\n try {\n const { data } = await deleteAccountMutation({\n variables: { password, confirmPhrase },\n });\n\n const result = data!.deleteAccount;\n\n if (result.success) {\n // Clear auth state after deletion\n store.clearAuth();\n }\n\n return result;\n } catch (error) {\n console.error(\"Failed to delete account:\", error);\n throw error;\n }\n };\n\n /**\n * Reactivate a deactivated account\n * Returns new auth tokens\n */\n const reactivateAccount = async (\n email: string,\n password: string,\n ): Promise<AuthResult> => {\n try {\n store.setLoading(true);\n store.setError(null);\n\n const { data } = await reactivateAccountMutation({\n variables: { email, password },\n });\n\n const result = data!.reactivateAccount;\n\n if (result.success && result.user && result.token) {\n store.setUser(result.user);\n store.setAuthTokens(result.token, result.refreshToken || \"\");\n store.setAuthenticated(true);\n } else if (result.error) {\n store.setError(result.error);\n }\n\n return result;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Failed to reactivate account\";\n store.setError(message);\n throw error;\n } finally {\n store.setLoading(false);\n }\n };\n\n return {\n deactivateAccount,\n deleteAccount,\n reactivateAccount,\n isDeactivating: deactivating,\n isDeleting: deleting,\n isReactivating: reactivating,\n isLoading: deactivating || deleting || reactivating,\n };\n}\n"],"mappings":";;;;AAmDA,SAAgB,IAAuB;CACrC,IAAM,CAAC,GAA2B,EAAE,SAAS,OAAkB,EAG7D,EAA0B,EACtB,CAAC,GAAuB,EAAE,SAAS,OAAc,EAGrD,EAAsB,EAClB,CAAC,GAA2B,EAAE,SAAS,OAAkB,EAG7D,EAA0B,EAEtB,IAAQ,EAAa,UAAU;AAiGrC,QAAO;EACL,mBA5FwB,OACxB,MACiC;AACjC,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,EAA0B,EAC/C,WAAW,EAAE,aAAU,EACxB,CAAC,EAEI,IAAS,EAAM;AAOrB,WALI,EAAO,WAET,EAAM,WAAW,EAGZ;YACA,GAAO;AAEd,UADA,QAAQ,MAAM,iCAAiC,EAAM,EAC/C;;;EA2ER,eAnEoB,OACpB,GACA,MACiC;AAEjC,OAAI,MAAkB,oBACpB,OAAU,MAAM,wDAAsD;AAGxE,OAAI;IACF,IAAM,EAAE,YAAS,MAAM,EAAsB,EAC3C,WAAW;KAAE;KAAU;KAAe,EACvC,CAAC,EAEI,IAAS,EAAM;AAOrB,WALI,EAAO,WAET,EAAM,WAAW,EAGZ;YACA,GAAO;AAEd,UADA,QAAQ,MAAM,6BAA6B,EAAM,EAC3C;;;EA4CR,mBApCwB,OACxB,GACA,MACwB;AACxB,OAAI;AAEF,IADA,EAAM,WAAW,GAAK,EACtB,EAAM,SAAS,KAAK;IAEpB,IAAM,EAAE,YAAS,MAAM,EAA0B,EAC/C,WAAW;KAAE;KAAO;KAAU,EAC/B,CAAC,EAEI,IAAS,EAAM;AAUrB,WARI,EAAO,WAAW,EAAO,QAAQ,EAAO,SAC1C,EAAM,QAAQ,EAAO,KAAK,EAC1B,EAAM,cAAc,EAAO,OAAO,EAAO,gBAAgB,GAAG,EAC5D,EAAM,iBAAiB,GAAK,IACnB,EAAO,SAChB,EAAM,SAAS,EAAO,MAAM,EAGvB;YACA,GAAO;IACd,IAAM,IACJ,aAAiB,QAAQ,EAAM,UAAU;AAE3C,UADA,EAAM,SAAS,EAAQ,EACjB;aACE;AACR,MAAM,WAAW,GAAM;;;EAQzB,gBAAgB;EAChB,YAAY;EACZ,gBAAgB;EAChB,WAAW,KAAgB,KAAY;EACxC"}
@@ -0,0 +1,22 @@
1
+ import { GenerateAPIKeyInput, APIKeyResult, APIKeyRotateResult, AuthResult, ApiKey } from '../types';
2
+
3
+ interface MyApiKeysResponse {
4
+ myApiKeys: ApiKey[];
5
+ }
6
+ /**
7
+ * Hook for API key operations
8
+ */
9
+ export declare function useApiKeyOperations(): {
10
+ generateAPIKey: (input: GenerateAPIKeyInput) => Promise<APIKeyResult>;
11
+ revokeAPIKey: (keyId: string) => Promise<boolean>;
12
+ rotateAPIKey: (keyId: string) => Promise<APIKeyRotateResult>;
13
+ authenticateAPIKey: (apiKey: string, apiSecret: string) => Promise<AuthResult>;
14
+ refetchApiKeys: () => Promise<void> | import("@apollo/client").ObservableQuery.ResultPromise<import("@apollo/client").ApolloClient.QueryResult<MyApiKeysResponse>>;
15
+ createApiKey: (input: GenerateAPIKeyInput) => Promise<APIKeyResult>;
16
+ revokeApiKey: (keyId: string) => Promise<boolean>;
17
+ apiKeys: ApiKey[];
18
+ isLoading: boolean;
19
+ error: import('@apollo/client').ErrorLike | undefined;
20
+ };
21
+ export {};
22
+ //# sourceMappingURL=useApiKeyOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useApiKeyOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/useApiKeyOperations.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACV,MAAM,EACP,MAAM,UAAU,CAAC;AAGlB,UAAU,iBAAiB;IACzB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAoBD;;GAEG;AACH,wBAAgB,mBAAmB;4BAwDxB,mBAAmB,KACzB,OAAO,CAAC,YAAY,CAAC;0BAuBW,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;0BAgBzB,MAAM,KAAG,OAAO,CAAC,kBAAkB,CAAC;iCAqB7D,MAAM,aACH,MAAM,KAChB,OAAO,CAAC,UAAU,CAAC;;0BA/Db,mBAAmB,KACzB,OAAO,CAAC,YAAY,CAAC;0BAuBW,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;;;;EA0E7D"}
@@ -0,0 +1,4 @@
1
+ import "../store/authStore.js";
2
+ import "../../generated/global-operations.js";
3
+ import "react";
4
+ import "@apollo/client/react";
@@ -0,0 +1,26 @@
1
+ import { App, AppCreateResponse, CreateAppInput, UpdateAppInput, AppTokenResponse, AppAsUserTokenResponse } from '../types';
2
+
3
+ interface CurrentUserAppsResponse {
4
+ currentUserApps: App[];
5
+ }
6
+ /**
7
+ * Hook for app management operations
8
+ */
9
+ export declare function useAppOperations(): {
10
+ getApp: (id: string) => Promise<App | null>;
11
+ refetchApps: () => Promise<void> | import("@apollo/client").ObservableQuery.ResultPromise<import("@apollo/client").ApolloClient.QueryResult<CurrentUserAppsResponse>>;
12
+ createApp: (input: CreateAppInput) => Promise<AppCreateResponse>;
13
+ updateApp: (id: string, input: UpdateAppInput) => Promise<App>;
14
+ deactivateApp: (id: string) => Promise<boolean>;
15
+ rotateAppSecret: (id: string) => Promise<AppCreateResponse>;
16
+ authenticateApp: (clientId: string, clientSecret: string, scopes?: string[]) => Promise<AppTokenResponse>;
17
+ generateAppToken: (clientId: string, clientSecret: string, scopes?: string[]) => Promise<AppTokenResponse>;
18
+ generateAppAsUserToken: (targetUserId: string, scopes?: string[]) => Promise<AppAsUserTokenResponse>;
19
+ exchangeToken: (appId: string, userId: string, scopes?: string[]) => Promise<AppAsUserTokenResponse>;
20
+ apps: App[];
21
+ currentApp: App | null;
22
+ isLoading: boolean;
23
+ error: import('@apollo/client').ErrorLike | undefined;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=useAppOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAppOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/useAppOperations.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,GAAG,EACH,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,UAAU,CAAC;AAMlB,UAAU,uBAAuB;IAC/B,eAAe,EAAE,GAAG,EAAE,CAAC;CACxB;AAoCD;;GAEG;AACH,wBAAgB,gBAAgB;iBA2EJ,MAAM,KAAG,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC;;uBAU7C,cAAc,KACpB,OAAO,CAAC,iBAAiB,CAAC;oBA2BA,MAAM,SAAS,cAAc,KAAG,OAAO,CAAC,GAAG,CAAC;wBA2BxC,MAAM,KAAG,OAAO,CAAC,OAAO,CAAC;0BAuBvB,MAAM,KAAG,OAAO,CAAC,iBAAiB,CAAC;gCAwB1D,MAAM,gBACF,MAAM,WACX,MAAM,EAAE,KAChB,OAAO,CAAC,gBAAgB,CAAC;iCAwBhB,MAAM,gBACF,MAAM,WACX,MAAM,EAAE,KAChB,OAAO,CAAC,gBAAgB,CAAC;2CAwBZ,MAAM,WACX,MAAM,EAAE,KAChB,OAAO,CAAC,sBAAsB,CAAC;2BAwBzB,MAAM,UACL,MAAM,WACL,MAAM,EAAE,KAChB,OAAO,CAAC,sBAAsB,CAAC;;;;;EAuCnC"}
@@ -0,0 +1,4 @@
1
+ import "../store/authStore.js";
2
+ import "../../generated/global-operations.js";
3
+ import "react";
4
+ import "@apollo/client/react";
@@ -0,0 +1,57 @@
1
+ import { SignInInput, SignUpInput, User, AuthPayload, AuthResult } from '../types';
2
+
3
+ interface CurrentUserResponse {
4
+ currentUser: User | null;
5
+ }
6
+ interface UseAuthOperationsOptions {
7
+ disableCurrentUserQuery?: boolean;
8
+ }
9
+ /**
10
+ * Hook for authentication operations
11
+ * Uses Zustand v5 pattern: selectors for state, getState() for actions
12
+ */
13
+ export declare function useAuthOperations(options?: UseAuthOperationsOptions): {
14
+ signIn: (input: SignInInput) => Promise<AuthResult>;
15
+ signUp: (input: SignUpInput) => Promise<AuthPayload | {
16
+ requiresEmailVerification: boolean;
17
+ user: User | null;
18
+ accessToken: string | null;
19
+ refreshToken: string | null;
20
+ expiresIn: number | null;
21
+ requiresMFA?: boolean;
22
+ mfaChallengeId?: string;
23
+ mfaMethod?: import('..').MFAMethod;
24
+ }>;
25
+ signOut: () => Promise<void>;
26
+ refreshToken: () => Promise<AuthPayload>;
27
+ verifyEmail: (token: string) => Promise<{
28
+ success: boolean;
29
+ message: string;
30
+ email?: string;
31
+ }>;
32
+ resendVerification: (email: string) => Promise<{
33
+ success: boolean;
34
+ message: string;
35
+ }>;
36
+ refetchCurrentUser: (variables?: Partial<import('@apollo/client').OperationVariables> | undefined) => Promise<import("@apollo/client").ApolloClient.QueryResult<CurrentUserResponse>>;
37
+ login: (input: SignInInput) => Promise<AuthResult>;
38
+ register: (input: SignUpInput) => Promise<AuthPayload | {
39
+ requiresEmailVerification: boolean;
40
+ user: User | null;
41
+ accessToken: string | null;
42
+ refreshToken: string | null;
43
+ expiresIn: number | null;
44
+ requiresMFA?: boolean;
45
+ mfaChallengeId?: string;
46
+ mfaMethod?: import('..').MFAMethod;
47
+ }>;
48
+ logout: () => Promise<void>;
49
+ isLoading: boolean;
50
+ error: string | null;
51
+ errorCode: string | null;
52
+ isAuthenticated: boolean;
53
+ user: User | null;
54
+ accessToken: string | null;
55
+ };
56
+ export {};
57
+ //# sourceMappingURL=useAuthOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthOperations.d.ts","sourceRoot":"","sources":["../../../src/auth/hooks/useAuthOperations.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,IAAI,EACJ,WAAW,EACX,UAAU,EACX,MAAM,UAAU,CAAC;AA6IlB,UAAU,mBAAmB;IAC3B,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;CAC1B;AAED,UAAU,wBAAwB;IAChC,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AA4BD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,wBAA6B;oBAyCzC,WAAW,KAAG,OAAO,CAAC,UAAU,CAAC;oBAkJjC,WAAW;;;;;;;;;;;;yBAqO/B,MAAM,KACZ,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;gCAyBxB,MAAM;iBA3cpC,OAAO;iBACP,MAAM;;;mBAyDY,WAAW,KAAG,OAAO,CAAC,UAAU,CAAC;sBAkJjC,WAAW;;;;;;;;;;;;;;;;;EAqSzC"}
@@ -0,0 +1,236 @@
1
+ import { useAuth as e } from "../providers/AuthProvider.js";
2
+ import { useAuthStore as t } from "../store/authStore.js";
3
+ import { CurrentUserDocument as n, RefreshTokenDocument as r, ResendVerificationEmailDocument as i, SignInDocument as a, SignOutDocument as o, SignUpDocument as s, VerifyEmailDocument as c } from "../../generated/global-operations.js";
4
+ import { useEffect as l, useRef as u } from "react";
5
+ import { loginProfile as d } from "@burdenoff/fe-libs/shared/providers/shell/ProfileStorageManager";
6
+ import { useApolloClient as f, useMutation as p, useQuery as m } from "@apollo/client/react";
7
+ import { useEventBus as h } from "@burdenoff/fe-libs/shared/events";
8
+ //#region src/auth/hooks/useAuthOperations.ts
9
+ function g(e, t) {
10
+ return e.includes("email or username already exists") || t === "BAD_USER_INPUT" ? "An account with this email or username already exists. Please sign in or use a different email." : t === "TENANT_CREATION_FAILED" ? "We couldn't finish setting up your account. Please try again in a few moments. If this persists, contact support." : e.includes("Failed to fetch") || e.includes("NetworkError") || e.includes("Load failed") ? "Unable to reach the server. Please check your internet connection and try again." : e.includes("CORS") || e.includes("cross-origin") ? "Unable to reach the server. Please try again or contact support." : t === "INTERNAL_SERVER_ERROR" ? "Something went wrong on our end. Please try again in a few moments." : e && e !== "Sign up failed" ? e : "Sign up failed. Please try again.";
11
+ }
12
+ function _(e) {
13
+ try {
14
+ let t = window.location.hostname.endsWith(".local.burdenoff.com") ? ".local.burdenoff.com" : void 0, n = t ? `; domain=${t}` : "", r = window.location.protocol === "https:" ? "; secure" : "", i = JSON.stringify({
15
+ id: e,
16
+ origin: window.location.origin
17
+ });
18
+ document.cookie = `bf-sso=${encodeURIComponent(i)}${n}; path=/; samesite=lax${r}; max-age=86400`, document.cookie = `bf-sso-profile=${encodeURIComponent(i)}${n}; path=/; samesite=lax${r}; max-age=86400`;
19
+ } catch {}
20
+ }
21
+ function v(e) {
22
+ return { ...e };
23
+ }
24
+ function y(e) {
25
+ return typeof e == "object" && !!e;
26
+ }
27
+ function b(e) {
28
+ return Array.isArray(e) ? e.filter((e) => y(e)) : [];
29
+ }
30
+ function x(e) {
31
+ if (!y(e)) return [];
32
+ let t = b(e.errors);
33
+ return t.length > 0 ? t : b(e.graphQLErrors);
34
+ }
35
+ function S(e) {
36
+ if (e instanceof Error || y(e) && typeof e.message == "string") return e.message;
37
+ }
38
+ function C(e) {
39
+ let t = e?.extensions?.code;
40
+ return typeof t == "string" ? t : null;
41
+ }
42
+ function w(y = {}) {
43
+ let b = t((e) => e.isLoading), w = t((e) => e.error), T = t((e) => e.errorCode), E = t((e) => e.isAuthenticated), D = t((e) => e.user), O = t((e) => e.accessToken), k = y.disableCurrentUserQuery ?? !1, A = u(!1), j = e(), M = h(), N = f(), [P] = p(a), [F] = p(s), [I] = p(o), [L] = p(r), [R] = p(c), [z] = p(i), B = async (e) => {
44
+ let n = t.getState();
45
+ try {
46
+ n.setLoading(!0), n.setError(null);
47
+ let t = await P({
48
+ variables: { input: e },
49
+ errorPolicy: "none"
50
+ });
51
+ if (!t.data || !t.data.signIn) {
52
+ let e = "Sign in failed. Please check your credentials and try again.";
53
+ return n.setError(e), {
54
+ success: !1,
55
+ error: e
56
+ };
57
+ }
58
+ let r = t.data.signIn;
59
+ if (r.requiresMFA && r.mfaChallengeId) return n.setMfaRequired(!0, r.mfaChallengeId), {
60
+ success: !0,
61
+ requiresMFA: !0,
62
+ mfaChallengeId: r.mfaChallengeId,
63
+ metadata: { mfaMethod: r.mfaMethod }
64
+ };
65
+ if (r.user && r.accessToken && r.refreshToken) {
66
+ A.current = !0, n.setUser(r.user), n.setAuthTokens(r.accessToken, r.refreshToken), n.setAuthenticated(!0), n.setMfaRequired(!1);
67
+ let e = r.expiresIn ? Date.now() + r.expiresIn * 1e3 : void 0;
68
+ return d(v(r.user), {
69
+ accessToken: r.accessToken,
70
+ refreshToken: r.refreshToken,
71
+ expiresAt: e
72
+ }), _(r.user.id), M.emit("auth.signed_in", {
73
+ userId: r.user.id,
74
+ tenantId: r.user.tenantId,
75
+ workspaceId: r.user.defaultWorkspaceId,
76
+ mfaEnabled: r.user.mfaEnabled,
77
+ emailVerified: r.user.emailVerified
78
+ }, { component: "useAuthOperations" }), j.onAuthSuccess?.(r.user, r.accessToken, r.refreshToken), {
79
+ success: !0,
80
+ user: r.user,
81
+ token: r.accessToken,
82
+ refreshToken: r.refreshToken,
83
+ expiresIn: r.expiresIn,
84
+ requiresMFA: !1
85
+ };
86
+ } else {
87
+ let e = "Login failed: Invalid response from server";
88
+ return n.setError(e), {
89
+ success: !1,
90
+ error: e
91
+ };
92
+ }
93
+ } catch (e) {
94
+ let t = "Sign in failed", r = null, i = x(e);
95
+ if (i.length > 0) {
96
+ let e = i[0];
97
+ t = e.message || t, r = C(e);
98
+ } else t = S(e) ?? t;
99
+ return console.error("[SignIn] Error:", t, r ? `(${r})` : ""), n.setError(t, r), {
100
+ success: !1,
101
+ error: t
102
+ };
103
+ } finally {
104
+ n.setLoading(!1);
105
+ }
106
+ }, V = async (e) => {
107
+ let n = t.getState();
108
+ try {
109
+ n.setLoading(!0), n.setError(null);
110
+ let t = await F({ variables: { input: e } }), r = x(t);
111
+ if (r.length > 0) {
112
+ let e = r[0].message ?? "Sign up failed";
113
+ throw console.error("[SignUp] GraphQL error:", e), n.setError(e), Error(e);
114
+ }
115
+ if (!t.data || !t.data.signUp) {
116
+ let e = "Sign up failed: No response from server";
117
+ throw console.error("[SignUp] No data:", e), n.setError(e), Error(e);
118
+ }
119
+ let i = t.data.signUp;
120
+ if (!i.user) throw Error("Sign up failed: No user data returned");
121
+ return !i.accessToken || !i.refreshToken || i.accessToken === "" || i.refreshToken === "" ? (n.setUser(i.user), n.setAuthenticated(!1), {
122
+ ...i,
123
+ requiresEmailVerification: !0
124
+ }) : (n.setUser(i.user), n.setAuthTokens(i.accessToken, i.refreshToken), n.setAuthenticated(!0), M.emit("auth.signed_up", {
125
+ userId: i.user.id,
126
+ tenantId: i.user.tenantId,
127
+ workspaceId: i.user.defaultWorkspaceId,
128
+ mfaEnabled: i.user.mfaEnabled,
129
+ emailVerified: i.user.emailVerified
130
+ }, { component: "useAuthOperations" }), j.onAuthSuccess?.(i.user, i.accessToken, i.refreshToken), i);
131
+ } catch (e) {
132
+ let t = "Sign up failed. Please try again.", r, i = x(e);
133
+ if (i.length > 0) {
134
+ let e = i[0];
135
+ r = C(e) ?? void 0, t = g(e.message ?? "", r);
136
+ } else {
137
+ let n = S(e);
138
+ n && (t = g(n));
139
+ }
140
+ throw n.setError(t, r ?? null), Error(t);
141
+ } finally {
142
+ n.setLoading(!1);
143
+ }
144
+ }, H = async () => {
145
+ let e = t.getState(), n = e.user;
146
+ try {
147
+ await I();
148
+ } catch (e) {
149
+ console.error("Sign out failed:", e);
150
+ } finally {
151
+ await N.clearStore(), e.clearAuth(), M.emit("auth.signed_out", {
152
+ userId: n?.id,
153
+ tenantId: n?.tenantId,
154
+ workspaceId: n?.defaultWorkspaceId
155
+ }, { component: "useAuthOperations" }), j.onLogout?.();
156
+ }
157
+ }, U = async () => {
158
+ let e = t.getState();
159
+ try {
160
+ let t = e.refreshToken;
161
+ if (!t) throw Error("No refresh token available");
162
+ let { data: n } = await L({ variables: { token: t } }), r = n.refreshToken;
163
+ if (!r.accessToken || !r.refreshToken || !r.user) throw Error("Token refresh failed: Invalid response from server");
164
+ return e.setAuthTokens(r.accessToken, r.refreshToken), e.setUser(r.user), M.emit("auth.token_refreshed", {
165
+ userId: r.user.id,
166
+ tenantId: r.user.tenantId,
167
+ workspaceId: r.user.defaultWorkspaceId,
168
+ mfaEnabled: r.user.mfaEnabled,
169
+ emailVerified: r.user.emailVerified
170
+ }, { component: "useAuthOperations" }), r;
171
+ } catch (t) {
172
+ throw M.emit("auth.token_refresh_failed", {
173
+ userId: e.user?.id,
174
+ tenantId: e.user?.tenantId,
175
+ workspaceId: e.user?.defaultWorkspaceId,
176
+ reason: t instanceof Error ? t.message : "Token refresh failed"
177
+ }, { component: "useAuthOperations" }), e.clearAuth(), t;
178
+ }
179
+ }, { data: W, refetch: G } = m(n, {
180
+ skip: k || !E || A.current,
181
+ fetchPolicy: "network-only"
182
+ });
183
+ return l(() => {
184
+ W?.currentUser && t.getState().setUser(W.currentUser);
185
+ }, [W]), l(() => {
186
+ if (A.current && E) {
187
+ let e = setTimeout(() => {
188
+ A.current = !1;
189
+ }, 2e3);
190
+ return () => clearTimeout(e);
191
+ }
192
+ }, [E]), {
193
+ signIn: B,
194
+ signUp: V,
195
+ signOut: H,
196
+ refreshToken: U,
197
+ verifyEmail: async (e) => {
198
+ let n = t.getState();
199
+ try {
200
+ n.setLoading(!0);
201
+ let { data: t } = await R({ variables: { token: e } });
202
+ return t.verifyEmail.success && n.user && n.setUser({
203
+ ...n.user,
204
+ emailVerified: !0
205
+ }), t.verifyEmail;
206
+ } catch (e) {
207
+ let t = e instanceof Error ? e.message : "Email verification failed";
208
+ throw n.setError(t), e;
209
+ } finally {
210
+ n.setLoading(!1);
211
+ }
212
+ },
213
+ resendVerification: async (e) => {
214
+ try {
215
+ let { data: t } = await z({ variables: { email: e } });
216
+ return t.resendVerificationEmail;
217
+ } catch (e) {
218
+ throw console.error("Failed to resend verification email:", e), e;
219
+ }
220
+ },
221
+ refetchCurrentUser: G,
222
+ login: B,
223
+ register: V,
224
+ logout: H,
225
+ isLoading: b,
226
+ error: w,
227
+ errorCode: T,
228
+ isAuthenticated: E,
229
+ user: D,
230
+ accessToken: O
231
+ };
232
+ }
233
+ //#endregion
234
+ export { w as useAuthOperations };
235
+
236
+ //# sourceMappingURL=useAuthOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuthOperations.js","names":[],"sources":["../../../src/auth/hooks/useAuthOperations.ts"],"sourcesContent":["import { useEffect, useRef } from \"react\";\nimport { useMutation, useQuery, useApolloClient } from \"@apollo/client/react\";\nimport { useEventBus } from \"@burdenoff/fe-libs/shared/events\";\nimport {\n loginProfile,\n type ProfileUser,\n} from \"@burdenoff/fe-libs/shared/providers/shell/ProfileStorageManager\";\nimport { useAuthStore } from \"../store/authStore\";\nimport { useAuth } from \"../providers/AuthProvider\";\nimport {\n SignInDocument,\n SignUpDocument,\n SignOutDocument,\n RefreshTokenDocument,\n CurrentUserDocument,\n VerifyEmailDocument,\n ResendVerificationEmailDocument,\n} from \"../../generated/global-operations\";\nimport type {\n SignInInput,\n SignUpInput,\n User,\n AuthPayload,\n AuthResult,\n} from \"../types\";\n\n// =============================================================================\n// ERROR MAPPING HELPERS\n// =============================================================================\n\n/**\n * Map raw backend error messages to user-friendly descriptions.\n * Keeps a single source of truth for all sign-up error copy.\n */\nfunction mapSignUpError(rawMessage: string, errorCode?: string): string {\n // Exact matches from the backend\n if (\n rawMessage.includes(\"email or username already exists\") ||\n errorCode === \"BAD_USER_INPUT\"\n ) {\n return \"An account with this email or username already exists. Please sign in or use a different email.\";\n }\n\n if (errorCode === \"TENANT_CREATION_FAILED\") {\n return \"We couldn't finish setting up your account. Please try again in a few moments. If this persists, contact support.\";\n }\n\n // Network / fetch failures (Apollo wraps these)\n if (\n rawMessage.includes(\"Failed to fetch\") ||\n rawMessage.includes(\"NetworkError\") ||\n rawMessage.includes(\"Load failed\")\n ) {\n return \"Unable to reach the server. Please check your internet connection and try again.\";\n }\n\n // CORS or cross-origin issues\n if (rawMessage.includes(\"CORS\") || rawMessage.includes(\"cross-origin\")) {\n return \"Unable to reach the server. Please try again or contact support.\";\n }\n\n // Generic server errors\n if (errorCode === \"INTERNAL_SERVER_ERROR\") {\n return \"Something went wrong on our end. Please try again in a few moments.\";\n }\n\n // Pass through any already-descriptive message, or fall back\n if (rawMessage && rawMessage !== \"Sign up failed\") {\n return rawMessage;\n }\n\n return \"Sign up failed. Please try again.\";\n}\n\nfunction setShellSsoCookie(userId: string): void {\n try {\n const hostname = window.location.hostname;\n const domain = hostname.endsWith(\".local.burdenoff.com\")\n ? \".local.burdenoff.com\"\n : undefined;\n const domainPart = domain ? `; domain=${domain}` : \"\";\n const securePart = window.location.protocol === \"https:\" ? \"; secure\" : \"\";\n const ssoValue = JSON.stringify({\n id: userId,\n origin: window.location.origin,\n });\n document.cookie = `bf-sso=${encodeURIComponent(ssoValue)}${domainPart}; path=/; samesite=lax${securePart}; max-age=86400`;\n document.cookie = `bf-sso-profile=${encodeURIComponent(ssoValue)}${domainPart}; path=/; samesite=lax${securePart}; max-age=86400`;\n } catch {\n // Best effort only.\n }\n}\n\nfunction toProfileUser(user: User): ProfileUser {\n return { ...user };\n}\n\ninterface GraphQLErrorLike {\n message?: string;\n extensions?: Record<string, unknown>;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction asGraphQLErrorArray(value: unknown): GraphQLErrorLike[] {\n if (!Array.isArray(value)) return [];\n return value.filter((item): item is GraphQLErrorLike => isRecord(item));\n}\n\nfunction getGraphQLErrors(error: unknown): GraphQLErrorLike[] {\n if (!isRecord(error)) return [];\n const directErrors = asGraphQLErrorArray(error.errors);\n if (directErrors.length > 0) return directErrors;\n return asGraphQLErrorArray(error.graphQLErrors);\n}\n\nfunction getUnknownErrorMessage(error: unknown): string | undefined {\n if (error instanceof Error) return error.message;\n if (isRecord(error) && typeof error.message === \"string\") {\n return error.message;\n }\n return undefined;\n}\n\nfunction getGraphQLErrorCode(\n error: GraphQLErrorLike | undefined,\n): string | null {\n const code = error?.extensions?.code;\n return typeof code === \"string\" ? code : null;\n}\n\n// =============================================================================\n// GRAPHQL RESPONSE INTERFACES (Apollo Client 4.x)\n// =============================================================================\n\ninterface SignInResponse {\n signIn: AuthPayload;\n}\n\ninterface SignInVariables {\n input: SignInInput;\n}\n\ninterface SignUpResponse {\n signUp: AuthPayload;\n}\n\ninterface SignUpVariables {\n input: SignUpInput;\n}\n\ninterface SignOutResponse {\n signOut: boolean;\n}\n\ninterface RefreshTokenResponse {\n refreshToken: AuthPayload;\n}\n\ninterface RefreshTokenVariables {\n token: string;\n}\n\ninterface CurrentUserResponse {\n currentUser: User | null;\n}\n\ninterface UseAuthOperationsOptions {\n disableCurrentUserQuery?: boolean;\n}\n\ninterface VerifyEmailResponse {\n verifyEmail: {\n success: boolean;\n message: string;\n };\n}\n\ninterface VerifyEmailVariables {\n token: string;\n}\n\ninterface ResendVerificationEmailResponse {\n resendVerificationEmail: {\n success: boolean;\n message: string;\n };\n}\n\ninterface ResendVerificationEmailVariables {\n email: string;\n}\n\n// GraphQL Operations\n\n// SignIn mutation with MFA support\n\n/**\n * Hook for authentication operations\n * Uses Zustand v5 pattern: selectors for state, getState() for actions\n */\nexport function useAuthOperations(options: UseAuthOperationsOptions = {}) {\n // Use selectors for reactive state values\n const isLoading = useAuthStore((state) => state.isLoading);\n const error = useAuthStore((state) => state.error);\n const errorCode = useAuthStore((state) => state.errorCode);\n const isAuthenticated = useAuthStore((state) => state.isAuthenticated);\n const user = useAuthStore((state) => state.user);\n const accessToken = useAuthStore((state) => state.accessToken);\n const disableCurrentUserQuery = options.disableCurrentUserQuery ?? false;\n\n // Track whether signIn just completed — skip the CurrentUser refetch\n // because signIn already returns the full user object.\n const loginJustCompletedRef = useRef(false);\n\n const context = useAuth();\n const eventBus = useEventBus();\n const apolloClient = useApolloClient();\n const [signInMutation] = useMutation<SignInResponse, SignInVariables>(\n SignInDocument,\n );\n const [signUpMutation] = useMutation<SignUpResponse, SignUpVariables>(\n SignUpDocument,\n );\n const [signOutMutation] = useMutation<SignOutResponse>(SignOutDocument);\n const [refreshTokenMutation] = useMutation<\n RefreshTokenResponse,\n RefreshTokenVariables\n >(RefreshTokenDocument);\n const [verifyEmailMutation] = useMutation<\n VerifyEmailResponse,\n VerifyEmailVariables\n >(VerifyEmailDocument);\n const [resendVerificationMutation] = useMutation<\n ResendVerificationEmailResponse,\n ResendVerificationEmailVariables\n >(ResendVerificationEmailDocument);\n\n /**\n * Sign in with email/username and password\n * Uses signIn mutation which returns correct token format (with 'sub' field)\n */\n const signIn = async (input: SignInInput): Promise<AuthResult> => {\n const store = useAuthStore.getState();\n\n try {\n store.setLoading(true);\n store.setError(null);\n\n // rememberMe is sent to the backend so the server can issue\n // longer-lived refresh tokens (30 days instead of 7 days)\n\n // Use signIn mutation (returns correct token format with 'sub' field)\n const result = await signInMutation({\n variables: { input },\n // Override client-level errorPolicy to ensure errors are thrown\n // and caught by our catch block for proper error message extraction\n errorPolicy: \"none\",\n });\n\n // If we reach here, the mutation succeeded (no errors thrown)\n // Check if data.signIn is present\n if (!result.data || !result.data.signIn) {\n const errorMessage =\n \"Sign in failed. Please check your credentials and try again.\";\n store.setError(errorMessage);\n return {\n success: false,\n error: errorMessage,\n } as AuthResult;\n }\n\n const data = result.data;\n\n const authResult = data.signIn;\n\n // Check if MFA is required\n if (authResult.requiresMFA && authResult.mfaChallengeId) {\n store.setMfaRequired(true, authResult.mfaChallengeId);\n\n // Return success but with requiresMFA flag\n return {\n success: true,\n requiresMFA: true,\n mfaChallengeId: authResult.mfaChallengeId,\n metadata: {\n mfaMethod: authResult.mfaMethod,\n },\n } as AuthResult;\n }\n\n // Normal login without MFA - store the authentication result\n if (\n authResult.user &&\n authResult.accessToken &&\n authResult.refreshToken\n ) {\n // Signal that user data is fresh from signIn — skip CurrentUser refetch.\n loginJustCompletedRef.current = true;\n store.setUser(authResult.user);\n store.setAuthTokens(authResult.accessToken, authResult.refreshToken);\n store.setAuthenticated(true);\n store.setMfaRequired(false);\n\n const expiresAt = authResult.expiresIn\n ? Date.now() + authResult.expiresIn * 1000\n : undefined;\n loginProfile(toProfileUser(authResult.user), {\n accessToken: authResult.accessToken,\n refreshToken: authResult.refreshToken,\n expiresAt,\n });\n setShellSsoCookie(authResult.user.id);\n\n eventBus.emit(\n \"auth.signed_in\",\n {\n userId: authResult.user.id,\n tenantId: authResult.user.tenantId,\n workspaceId: authResult.user.defaultWorkspaceId,\n mfaEnabled: authResult.user.mfaEnabled,\n emailVerified: authResult.user.emailVerified,\n },\n { component: \"useAuthOperations\" },\n );\n\n context.onAuthSuccess?.(\n authResult.user,\n authResult.accessToken,\n authResult.refreshToken,\n );\n\n // Convert AuthPayload to AuthResult for consistent return type\n return {\n success: true,\n user: authResult.user,\n token: authResult.accessToken,\n refreshToken: authResult.refreshToken,\n expiresIn: authResult.expiresIn,\n requiresMFA: false,\n } as AuthResult;\n } else {\n const errorMsg = \"Login failed: Invalid response from server\";\n store.setError(errorMsg);\n return {\n success: false,\n error: errorMsg,\n } as AuthResult;\n }\n } catch (err: unknown) {\n // Extract error message and code from GraphQL error responses.\n // The backend sends user-friendly messages in gqlError.message and\n // structured error codes in gqlError.extensions.code (e.g., ACCOUNT_DELETED,\n // ACCOUNT_SUSPENDED, ACCOUNT_INACTIVE, OAUTH_ONLY_ACCOUNT, EMAIL_NOT_VERIFIED,\n // UNAUTHENTICATED, INTERNAL_SERVER_ERROR).\n // IMPORTANT: Never use gqlError.extensions.originalError — it may contain\n // internal details that should not be shown to users.\n let message = \"Sign in failed\";\n let errorCode: string | null = null;\n const graphQLErrors = getGraphQLErrors(err);\n if (graphQLErrors.length > 0) {\n // Apollo v4 CombinedGraphQLErrors\n // Apollo v3 ApolloError — use message only, never originalError\n const gqlError = graphQLErrors[0];\n message = gqlError.message || message;\n errorCode = getGraphQLErrorCode(gqlError);\n } else {\n message = getUnknownErrorMessage(err) ?? message;\n }\n\n console.error(\n \"[SignIn] Error:\",\n message,\n errorCode ? `(${errorCode})` : \"\",\n );\n store.setError(message, errorCode);\n return {\n success: false,\n error: message,\n } as AuthResult;\n } finally {\n store.setLoading(false);\n }\n };\n\n /**\n * Sign up new user\n */\n const signUp = async (input: SignUpInput) => {\n const store = useAuthStore.getState();\n\n try {\n store.setLoading(true);\n store.setError(null);\n\n const mutationResult = await signUpMutation({\n variables: { input },\n });\n\n // With errorPolicy: 'all', errors are returned in result, not thrown\n // Check for GraphQL errors first\n const graphQLErrors = getGraphQLErrors(mutationResult);\n if (graphQLErrors.length > 0) {\n const errorMessage = graphQLErrors[0].message ?? \"Sign up failed\";\n console.error(\"[SignUp] GraphQL error:\", errorMessage);\n store.setError(errorMessage);\n throw new Error(errorMessage);\n }\n\n // Check if data.signUp is null (indicates GraphQL error without explicit error)\n if (!mutationResult.data || !mutationResult.data.signUp) {\n const errorMessage = \"Sign up failed: No response from server\";\n console.error(\"[SignUp] No data:\", errorMessage);\n store.setError(errorMessage);\n throw new Error(errorMessage);\n }\n\n const result = mutationResult.data.signUp;\n\n // Check if user was created\n if (!result.user) {\n throw new Error(\"Sign up failed: No user data returned\");\n }\n\n // Check if email verification is required (empty tokens)\n if (\n !result.accessToken ||\n !result.refreshToken ||\n result.accessToken === \"\" ||\n result.refreshToken === \"\"\n ) {\n // User created successfully but needs to verify email\n // Don't set authenticated state, but store the user for display\n store.setUser(result.user);\n store.setAuthenticated(false);\n\n // Return special result indicating email verification needed\n return {\n ...result,\n requiresEmailVerification: true,\n };\n }\n\n // Normal sign up with immediate access (tokens provided)\n store.setUser(result.user);\n store.setAuthTokens(result.accessToken, result.refreshToken);\n store.setAuthenticated(true);\n\n eventBus.emit(\n \"auth.signed_up\",\n {\n userId: result.user.id,\n tenantId: result.user.tenantId,\n workspaceId: result.user.defaultWorkspaceId,\n mfaEnabled: result.user.mfaEnabled,\n emailVerified: result.user.emailVerified,\n },\n { component: \"useAuthOperations\" },\n );\n\n context.onAuthSuccess?.(\n result.user,\n result.accessToken,\n result.refreshToken,\n );\n\n return result;\n } catch (err: unknown) {\n // Extract error message from Apollo error or regular error\n let message = \"Sign up failed. Please try again.\";\n let errorCode: string | undefined;\n\n const graphQLErrors = getGraphQLErrors(err);\n if (graphQLErrors.length > 0) {\n const gqlError = graphQLErrors[0];\n errorCode = getGraphQLErrorCode(gqlError) ?? undefined;\n const rawMessage = gqlError.message ?? \"\";\n\n // Map backend error codes to user-friendly messages\n message = mapSignUpError(rawMessage, errorCode);\n } else {\n const rawMessage = getUnknownErrorMessage(err);\n if (rawMessage) {\n message = mapSignUpError(rawMessage);\n }\n }\n\n store.setError(message, errorCode ?? null);\n throw new Error(message);\n } finally {\n store.setLoading(false);\n }\n };\n\n /**\n * Sign out current session\n */\n const signOut = async () => {\n const store = useAuthStore.getState();\n const signedOutUser = store.user;\n\n try {\n await signOutMutation();\n } catch (err) {\n console.error(\"Sign out failed:\", err);\n } finally {\n // Always clear Apollo cache so stale user data doesn't survive re-login\n await apolloClient.clearStore();\n store.clearAuth();\n eventBus.emit(\n \"auth.signed_out\",\n {\n userId: signedOutUser?.id,\n tenantId: signedOutUser?.tenantId,\n workspaceId: signedOutUser?.defaultWorkspaceId,\n },\n { component: \"useAuthOperations\" },\n );\n context.onLogout?.();\n }\n };\n\n /**\n * Refresh access token\n */\n const refreshToken = async () => {\n const store = useAuthStore.getState();\n\n try {\n const token = store.refreshToken;\n if (!token) throw new Error(\"No refresh token available\");\n\n const { data } = await refreshTokenMutation({\n variables: { token },\n });\n\n const result = data!.refreshToken;\n\n // Refresh token should always return valid tokens and user\n if (!result.accessToken || !result.refreshToken || !result.user) {\n throw new Error(\"Token refresh failed: Invalid response from server\");\n }\n\n store.setAuthTokens(result.accessToken, result.refreshToken);\n store.setUser(result.user);\n\n eventBus.emit(\n \"auth.token_refreshed\",\n {\n userId: result.user.id,\n tenantId: result.user.tenantId,\n workspaceId: result.user.defaultWorkspaceId,\n mfaEnabled: result.user.mfaEnabled,\n emailVerified: result.user.emailVerified,\n },\n { component: \"useAuthOperations\" },\n );\n\n return result;\n } catch (err) {\n // Refresh failed, logout user\n eventBus.emit(\n \"auth.token_refresh_failed\",\n {\n userId: store.user?.id,\n tenantId: store.user?.tenantId,\n workspaceId: store.user?.defaultWorkspaceId,\n reason: err instanceof Error ? err.message : \"Token refresh failed\",\n },\n { component: \"useAuthOperations\" },\n );\n store.clearAuth();\n throw err;\n }\n };\n\n /**\n * Get current user.\n * Skip when:\n * - Not authenticated\n * - Login just completed (user data is already fresh from signIn response)\n *\n * The loginJustCompletedRef is cleared after the first successful fetch\n * or on the next render cycle after navigation.\n */\n const { data: currentUserData, refetch: refetchCurrentUser } =\n useQuery<CurrentUserResponse>(CurrentUserDocument, {\n skip:\n disableCurrentUserQuery ||\n !isAuthenticated ||\n loginJustCompletedRef.current,\n fetchPolicy: \"network-only\",\n });\n\n // Handle currentUser data updates (replaces onCompleted callback)\n useEffect(() => {\n if (currentUserData?.currentUser) {\n useAuthStore.getState().setUser(currentUserData.currentUser);\n }\n }, [currentUserData]);\n\n // Clear loginJustCompletedRef after navigation away from login page\n // so subsequent CurrentUser queries work normally (e.g., profile page).\n useEffect(() => {\n if (loginJustCompletedRef.current && isAuthenticated) {\n const timer = setTimeout(() => {\n loginJustCompletedRef.current = false;\n }, 2000);\n return () => clearTimeout(timer);\n }\n }, [isAuthenticated]);\n\n /**\n * Verify email with token\n * Returns { success, message, email } on success\n */\n const verifyEmail = async (\n token: string,\n ): Promise<{ success: boolean; message: string; email?: string }> => {\n const store = useAuthStore.getState();\n\n try {\n store.setLoading(true);\n const { data } = await verifyEmailMutation({ variables: { token } });\n\n if (data!.verifyEmail.success && store.user) {\n store.setUser({ ...store.user, emailVerified: true });\n }\n\n return data!.verifyEmail;\n } catch (err) {\n const message =\n err instanceof Error ? err.message : \"Email verification failed\";\n store.setError(message);\n throw err;\n } finally {\n store.setLoading(false);\n }\n };\n\n /**\n * Resend verification email\n */\n const resendVerification = async (email: string) => {\n try {\n const { data } = await resendVerificationMutation({\n variables: { email },\n });\n return data!.resendVerificationEmail;\n } catch (err) {\n console.error(\"Failed to resend verification email:\", err);\n throw err;\n }\n };\n\n // Legacy aliases for backwards compatibility\n const login = signIn;\n const register = signUp;\n const logout = signOut;\n\n return {\n // New API\n signIn,\n signUp,\n signOut,\n refreshToken,\n verifyEmail,\n resendVerification,\n refetchCurrentUser,\n // Legacy aliases\n login,\n register,\n logout,\n // State (reactive via selectors)\n isLoading,\n error,\n errorCode,\n isAuthenticated,\n user,\n accessToken,\n };\n}\n"],"mappings":"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"}