@dragonmastery/dragoncore-vue 0.0.31 → 0.0.32

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 (198) hide show
  1. package/dist/{ChangePasswordPage-Dy8lFUcI.js → ChangePasswordPage-CR91NZP4.js} +2 -2
  2. package/dist/{ChangePasswordPage-Dy8lFUcI.js.map → ChangePasswordPage-CR91NZP4.js.map} +1 -1
  3. package/dist/ChangePasswordPage-qLd6YZVO.js +7 -0
  4. package/dist/{ConsentRequired-Bhkxu0rv.js → ConsentRequired-DtUwfpk0.js} +36 -27
  5. package/dist/ConsentRequired-DtUwfpk0.js.map +1 -0
  6. package/dist/CreateTeamForm-BK8PJeXz.js +12 -0
  7. package/dist/{CreateTeamForm-bpLbK18g.js → CreateTeamForm-BQewI0Gn.js} +3 -3
  8. package/dist/{CreateTeamForm-bpLbK18g.js.map → CreateTeamForm-BQewI0Gn.js.map} +1 -1
  9. package/dist/{CreateTeamMemberForm-DeUyXnVa.js → CreateTeamMemberForm-B3jxlAsC.js} +4 -4
  10. package/dist/{CreateTeamMemberForm-DeUyXnVa.js.map → CreateTeamMemberForm-B3jxlAsC.js.map} +1 -1
  11. package/dist/CreateTeamMemberForm-BYsZNxTq.js +12 -0
  12. package/dist/{CreateUserPage-CqKcY7_X.js → CreateUserPage-BcCIat_l.js} +2 -2
  13. package/dist/{CreateUserPage-CqKcY7_X.js.map → CreateUserPage-BcCIat_l.js.map} +1 -1
  14. package/dist/CreateUserPage-D0oMJnGd.js +7 -0
  15. package/dist/CreditBalanceDashboard-C2QnVfjU.js +13 -0
  16. package/dist/{CreditBalanceDashboard-BEsOr0Rw.js → CreditBalanceDashboard-CRHrhlSZ.js} +2 -2
  17. package/dist/{CreditBalanceDashboard-BEsOr0Rw.js.map → CreditBalanceDashboard-CRHrhlSZ.js.map} +1 -1
  18. package/dist/{CreditManagement-DiVSMbWZ.js → CreditManagement-7xiygPYj.js} +3 -3
  19. package/dist/{CreditManagement-DiVSMbWZ.js.map → CreditManagement-7xiygPYj.js.map} +1 -1
  20. package/dist/CreditManagement-CAaf_rVj.js +13 -0
  21. package/dist/{CreditTransactionHistory-mcacl2xG.js → CreditTransactionHistory-CP7ufh7Z.js} +5 -5
  22. package/dist/{CreditTransactionHistory-mcacl2xG.js.map → CreditTransactionHistory-CP7ufh7Z.js.map} +1 -1
  23. package/dist/CustomerCreateSupportTicketForm-C3DSzhJR.js +14 -0
  24. package/dist/{CustomerCreateSupportTicketForm-IefplMnK.js → CustomerCreateSupportTicketForm-Cd3ijzWy.js} +4 -4
  25. package/dist/{CustomerCreateSupportTicketForm-IefplMnK.js.map → CustomerCreateSupportTicketForm-Cd3ijzWy.js.map} +1 -1
  26. package/dist/{CustomerSupportTicketDetailPage-Dengb4Zx.js → CustomerSupportTicketDetailPage-DwpkxpYV.js} +8 -8
  27. package/dist/{CustomerSupportTicketDetailPage-Dengb4Zx.js.map → CustomerSupportTicketDetailPage-DwpkxpYV.js.map} +1 -1
  28. package/dist/CustomerSupportTicketList-BrTX8SUV.js +64 -0
  29. package/dist/CustomerSupportTicketParent-C0uMeN09.js +8 -0
  30. package/dist/{CustomerSupportTicketParent-rl4Ym8oa.js → CustomerSupportTicketParent-D9FuZjPz.js} +2 -2
  31. package/dist/{CustomerSupportTicketParent-rl4Ym8oa.js.map → CustomerSupportTicketParent-D9FuZjPz.js.map} +1 -1
  32. package/dist/CustomerSupportTicketSuccess-BLSMAjQN.js +12 -0
  33. package/dist/{CustomerSupportTicketSuccess-RQskseXP.js → CustomerSupportTicketSuccess-k3DX9NhV.js} +2 -2
  34. package/dist/{CustomerSupportTicketSuccess-RQskseXP.js.map → CustomerSupportTicketSuccess-k3DX9NhV.js.map} +1 -1
  35. package/dist/{DefaultReferralTeamPage-Be7-RI3s.js → DefaultReferralTeamPage-fS1SlVow.js} +6 -6
  36. package/dist/{DefaultReferralTeamPage-Be7-RI3s.js.map → DefaultReferralTeamPage-fS1SlVow.js.map} +1 -1
  37. package/dist/{EditTeamForm-RBO99ocN.js → EditTeamForm-CETmPEZ7.js} +3 -3
  38. package/dist/{EditTeamForm-RBO99ocN.js.map → EditTeamForm-CETmPEZ7.js.map} +1 -1
  39. package/dist/EditTeamForm-DiZXp6vh.js +12 -0
  40. package/dist/EditTeamMemberForm-BKbWq88S.js +9 -0
  41. package/dist/{EditTeamMemberForm-D9cofrUM.js → EditTeamMemberForm-D6vf9hp-.js} +2 -2
  42. package/dist/{EditTeamMemberForm-D9cofrUM.js.map → EditTeamMemberForm-D6vf9hp-.js.map} +1 -1
  43. package/dist/EditUserPage-DCdj6EYd.js +8 -0
  44. package/dist/{EditUserPage-DGuV8pzp.js → EditUserPage-Dy61CCle.js} +3 -3
  45. package/dist/{EditUserPage-DGuV8pzp.js.map → EditUserPage-Dy61CCle.js.map} +1 -1
  46. package/dist/{EnhancedRefreshTokenHandler-C6tZCcfX.js → EnhancedRefreshTokenHandler-s8wUXtB5.js} +2 -2
  47. package/dist/{EnhancedRefreshTokenHandler-C6tZCcfX.js.map → EnhancedRefreshTokenHandler-s8wUXtB5.js.map} +1 -1
  48. package/dist/{ForgotPassword-DZ-d8rWX.js → ForgotPassword-BykH9B9R.js} +2 -2
  49. package/dist/{ForgotPassword-DZ-d8rWX.js.map → ForgotPassword-BykH9B9R.js.map} +1 -1
  50. package/dist/ForgotPassword-Xb1yVZ6C.js +8 -0
  51. package/dist/{InlineAttachments-DAn_QknY.js → InlineAttachments-Ywf9r3jd.js} +4 -4
  52. package/dist/{InlineAttachments-DAn_QknY.js.map → InlineAttachments-Ywf9r3jd.js.map} +1 -1
  53. package/dist/LoginForm-B5wYdKhY.js +8 -0
  54. package/dist/{LoginForm-DEgTB9RF.js → LoginForm-CjF4NSgM.js} +3 -3
  55. package/dist/{LoginForm-DEgTB9RF.js.map → LoginForm-CjF4NSgM.js.map} +1 -1
  56. package/dist/{Logout-Bb2xe5BM.js → Logout-DmpC8Rwh.js} +3 -3
  57. package/dist/{Logout-Bb2xe5BM.js.map → Logout-DmpC8Rwh.js.map} +1 -1
  58. package/dist/Logout-qyH2t-1a.js +8 -0
  59. package/dist/{MfaSetup-m080C6iX.js → MfaSetup-DCLKIMaS.js} +2 -2
  60. package/dist/{MfaSetup-m080C6iX.js.map → MfaSetup-DCLKIMaS.js.map} +1 -1
  61. package/dist/MfaSetup-DMLXL9fk.js +9 -0
  62. package/dist/MfaVerify-C4xGQZlQ.js +9 -0
  63. package/dist/{MfaVerify-D8Ch-8hN.js → MfaVerify-Dm2Yc0Da.js} +3 -3
  64. package/dist/{MfaVerify-D8Ch-8hN.js.map → MfaVerify-Dm2Yc0Da.js.map} +1 -1
  65. package/dist/{ResetPassword-DflPd8Qg.js → ResetPassword-iVcY7eBY.js} +2 -2
  66. package/dist/{ResetPassword-DflPd8Qg.js.map → ResetPassword-iVcY7eBY.js.map} +1 -1
  67. package/dist/ResetPassword-ulR2HviU.js +8 -0
  68. package/dist/{SavedFiltersPage-ey8wOr0T.js → SavedFiltersPage-CTLpYU2c.js} +50 -50
  69. package/dist/{SavedFiltersPage-ey8wOr0T.js.map → SavedFiltersPage-CTLpYU2c.js.map} +1 -1
  70. package/dist/Signup-D4xILUym.js +10 -0
  71. package/dist/{Signup-KuiKHB4h.js → Signup-D6vnyS4w.js} +28 -28
  72. package/dist/Signup-D6vnyS4w.js.map +1 -0
  73. package/dist/{SignupRequirementsPage-CwnsnQKb.js → SignupRequirementsPage-BnOkXd7w.js} +6 -6
  74. package/dist/{SignupRequirementsPage-CwnsnQKb.js.map → SignupRequirementsPage-BnOkXd7w.js.map} +1 -1
  75. package/dist/StaffCreateSupportTicketForm-BnpxlQaG.js +14 -0
  76. package/dist/{StaffCreateSupportTicketForm-75Bo0jdz.js → StaffCreateSupportTicketForm-gPZizMKW.js} +6 -6
  77. package/dist/{StaffCreateSupportTicketForm-75Bo0jdz.js.map → StaffCreateSupportTicketForm-gPZizMKW.js.map} +1 -1
  78. package/dist/{StaffSupportTicketDetailPage-6VyPNdw7.js → StaffSupportTicketDetailPage-DUqLTHVT.js} +8 -8
  79. package/dist/{StaffSupportTicketDetailPage-6VyPNdw7.js.map → StaffSupportTicketDetailPage-DUqLTHVT.js.map} +1 -1
  80. package/dist/StaffSupportTicketList-Qp0vQw8X.js +64 -0
  81. package/dist/{StaffSupportTicketParent-DPvdLUii.js → StaffSupportTicketParent-CZllER18.js} +2 -2
  82. package/dist/{StaffSupportTicketParent-DPvdLUii.js.map → StaffSupportTicketParent-CZllER18.js.map} +1 -1
  83. package/dist/StaffSupportTicketParent-D4FKQAmp.js +8 -0
  84. package/dist/StaffSupportTicketSuccess-BvwrpoAb.js +12 -0
  85. package/dist/{StaffSupportTicketSuccess-BYoBXx1i.js → StaffSupportTicketSuccess-C9vqsC51.js} +2 -2
  86. package/dist/{StaffSupportTicketSuccess-BYoBXx1i.js.map → StaffSupportTicketSuccess-C9vqsC51.js.map} +1 -1
  87. package/dist/{SupportStaffPage-CLxWU628.js → SupportStaffPage--vinFIlV.js} +6 -6
  88. package/dist/{SupportStaffPage-CLxWU628.js.map → SupportStaffPage--vinFIlV.js.map} +1 -1
  89. package/dist/{SupportTicketMaintenancePage-B07avInx.js → SupportTicketMaintenancePage-C-BWD49g.js} +5 -5
  90. package/dist/{SupportTicketMaintenancePage-B07avInx.js.map → SupportTicketMaintenancePage-C-BWD49g.js.map} +1 -1
  91. package/dist/TeamAttachmentsTab-CnAvlIbn.js +64 -0
  92. package/dist/{TeamHistoryTab-CxzA4u_G.js → TeamHistoryTab-5kNQ_XAq.js} +3 -3
  93. package/dist/{TeamHistoryTab-CxzA4u_G.js.map → TeamHistoryTab-5kNQ_XAq.js.map} +1 -1
  94. package/dist/TeamHistoryTab-CBWeRKXM.js +6 -0
  95. package/dist/{TeamList-DXQj_Omo.js → TeamList-C0Mbkbja.js} +4 -4
  96. package/dist/{TeamList-DXQj_Omo.js.map → TeamList-C0Mbkbja.js.map} +1 -1
  97. package/dist/TeamList-Fb6EfybL.js +8 -0
  98. package/dist/{TeamMemberList-BYUANoBg.js → TeamMemberList-DyfXcR6F.js} +4 -4
  99. package/dist/{TeamMemberList-BYUANoBg.js.map → TeamMemberList-DyfXcR6F.js.map} +1 -1
  100. package/dist/TeamMemberList-X2hzYZFT.js +7 -0
  101. package/dist/{TeamMemberParent-DmYcHU3n.js → TeamMemberParent-2zISixbT.js} +3 -3
  102. package/dist/{TeamMemberParent-DmYcHU3n.js.map → TeamMemberParent-2zISixbT.js.map} +1 -1
  103. package/dist/TeamMemberParent-DKxE1ziP.js +10 -0
  104. package/dist/{TeamNotesTab-Cego-QT3.js → TeamNotesTab-BREl3Vr0.js} +5 -5
  105. package/dist/{TeamNotesTab-Cego-QT3.js.map → TeamNotesTab-BREl3Vr0.js.map} +1 -1
  106. package/dist/TeamNotesTab-DxMN3WZo.js +8 -0
  107. package/dist/{TeamParent-6JhqsYaO.js → TeamParent-COSOJ-ZZ.js} +3 -3
  108. package/dist/{TeamParent-6JhqsYaO.js.map → TeamParent-COSOJ-ZZ.js.map} +1 -1
  109. package/dist/TeamParent-XgBD3twV.js +11 -0
  110. package/dist/{TimelineNoteInput-P3ycD18j.js → TimelineNoteInput-CrivEMUP.js} +2 -2
  111. package/dist/{TimelineNoteInput-P3ycD18j.js.map → TimelineNoteInput-CrivEMUP.js.map} +1 -1
  112. package/dist/{UserListPage-DelzxCID.js → UserListPage-CCl0K7Gk.js} +3 -3
  113. package/dist/{UserListPage-DelzxCID.js.map → UserListPage-CCl0K7Gk.js.map} +1 -1
  114. package/dist/UserListPage-CYkvaHwL.js +5 -0
  115. package/dist/UserProfilePage-BMmz7SGl.js +8 -0
  116. package/dist/{UserProfilePage-BYitd7QV.js → UserProfilePage-D7FNmca1.js} +4 -4
  117. package/dist/{UserProfilePage-BYitd7QV.js.map → UserProfilePage-D7FNmca1.js.map} +1 -1
  118. package/dist/{VerifyEmail-Cy2s4yP0.js → VerifyEmail-KCti4rzf.js} +5 -5
  119. package/dist/{VerifyEmail-Cy2s4yP0.js.map → VerifyEmail-KCti4rzf.js.map} +1 -1
  120. package/dist/VerifyEmail-Xd31Com7.js +10 -0
  121. package/dist/ViewTeam-BXSq4M0V.js +8 -0
  122. package/dist/{ViewTeam-ByZdYEJG.js → ViewTeam-DGaNNd8N.js} +2 -2
  123. package/dist/{ViewTeam-ByZdYEJG.js.map → ViewTeam-DGaNNd8N.js.map} +1 -1
  124. package/dist/{ViewTeamMember-DqWZ3F_h.js → ViewTeamMember-Dsl2GKI1.js} +2 -2
  125. package/dist/{ViewTeamMember-DqWZ3F_h.js.map → ViewTeamMember-Dsl2GKI1.js.map} +1 -1
  126. package/dist/ViewTeamMember-bmry5QZ0.js +7 -0
  127. package/dist/{customerSupportTicketRoutes-DvfXGaSC.js → customerSupportTicketRoutes-BjqjQc9A.js} +8 -8
  128. package/dist/{customerSupportTicketRoutes-DvfXGaSC.js.map → customerSupportTicketRoutes-BjqjQc9A.js.map} +1 -1
  129. package/dist/index.d.ts +1015 -980
  130. package/dist/index.js +50 -50
  131. package/dist/{saved_filter-erjEgsdK.js → saved_filter-DXWnU4Zb.js} +5 -5
  132. package/dist/{saved_filter-erjEgsdK.js.map → saved_filter-DXWnU4Zb.js.map} +1 -1
  133. package/dist/{src-DSF_hIBe.js → src-B7oHTH_y.js} +215 -163
  134. package/dist/src-B7oHTH_y.js.map +1 -0
  135. package/dist/{staffSupportTicketRoutes-73ceKhL-.js → staffSupportTicketRoutes-CeuduGmG.js} +8 -8
  136. package/dist/{staffSupportTicketRoutes-73ceKhL-.js.map → staffSupportTicketRoutes-CeuduGmG.js.map} +1 -1
  137. package/dist/{teamRoutes-CSBq1DNq.js → teamRoutes-A7plQKi0.js} +11 -11
  138. package/dist/{teamRoutes-CSBq1DNq.js.map → teamRoutes-A7plQKi0.js.map} +1 -1
  139. package/dist/{team_memberRoutes-BgjY9Kwq.js → team_memberRoutes-mO1f-Y4o.js} +7 -7
  140. package/dist/{team_memberRoutes-BgjY9Kwq.js.map → team_memberRoutes-mO1f-Y4o.js.map} +1 -1
  141. package/dist/useAuthFlowNextStep-zlvxflBZ.js +64 -0
  142. package/dist/useAuthFlowNextStep-zlvxflBZ.js.map +1 -0
  143. package/dist/{useEmailVerificationChannel-C76Gnyi1.js → useEmailVerificationChannel-DYiMSAES.js} +2 -2
  144. package/dist/{useEmailVerificationChannel-C76Gnyi1.js.map → useEmailVerificationChannel-DYiMSAES.js.map} +1 -1
  145. package/dist/{useMutation-BLNuJoYl.js → useMutation-BXSu7_-s.js} +6 -4
  146. package/dist/useMutation-BXSu7_-s.js.map +1 -0
  147. package/dist/{useQuery-BzUGEOj0.js → useQuery-DownvLRA.js} +4 -4
  148. package/dist/{useQuery-BzUGEOj0.js.map → useQuery-DownvLRA.js.map} +1 -1
  149. package/dist/{useQueryCache-alzaRWEb.js → useQueryCache-CUTrwJWX.js} +2 -2
  150. package/dist/{useQueryCache-alzaRWEb.js.map → useQueryCache-CUTrwJWX.js.map} +1 -1
  151. package/dist/{useRpcAuth-CJtq1dqM.js → useRpcAuth-BFdprNWb.js} +5 -7
  152. package/dist/useRpcAuth-BFdprNWb.js.map +1 -0
  153. package/dist/{userAuthorized-3RiCDXxr.js → userAuthorized-qmzUYDa-.js} +2 -2
  154. package/dist/{userAuthorized-3RiCDXxr.js.map → userAuthorized-qmzUYDa-.js.map} +1 -1
  155. package/package.json +2 -2
  156. package/dist/ChangePasswordPage-D1LGJ02W.js +0 -7
  157. package/dist/ConsentRequired-Bhkxu0rv.js.map +0 -1
  158. package/dist/CreateTeamForm-BHgTTHAk.js +0 -12
  159. package/dist/CreateTeamMemberForm-CayF2tIJ.js +0 -12
  160. package/dist/CreateUserPage-C9uOeYDJ.js +0 -7
  161. package/dist/CreditBalanceDashboard-DZQqekKa.js +0 -13
  162. package/dist/CreditManagement-ByFH6IHV.js +0 -13
  163. package/dist/CustomerCreateSupportTicketForm-CroUyX15.js +0 -14
  164. package/dist/CustomerSupportTicketList-CpOaBgNr.js +0 -64
  165. package/dist/CustomerSupportTicketParent-D3Gj4Hel.js +0 -8
  166. package/dist/CustomerSupportTicketSuccess-BPUwEn4h.js +0 -12
  167. package/dist/EditTeamForm-KX2cNn24.js +0 -12
  168. package/dist/EditTeamMemberForm-Bh6zVNyJ.js +0 -9
  169. package/dist/EditUserPage-AcRFhChk.js +0 -8
  170. package/dist/ExternalLinkIcon-BKVV5Gjm.js +0 -34
  171. package/dist/ExternalLinkIcon-BKVV5Gjm.js.map +0 -1
  172. package/dist/ForgotPassword-LnjRUIY7.js +0 -8
  173. package/dist/LoginForm-D-gfB2hS.js +0 -8
  174. package/dist/Logout-Ctq-a1GS.js +0 -8
  175. package/dist/MfaSetup-6E6apXWC.js +0 -9
  176. package/dist/MfaVerify-C95WB9v2.js +0 -9
  177. package/dist/ResetPassword-9DFz-Qt3.js +0 -8
  178. package/dist/Signup-C052ykf5.js +0 -9
  179. package/dist/Signup-KuiKHB4h.js.map +0 -1
  180. package/dist/StaffCreateSupportTicketForm-DYEddYii.js +0 -14
  181. package/dist/StaffSupportTicketList-CxV6u2gF.js +0 -64
  182. package/dist/StaffSupportTicketParent-Dyybqx74.js +0 -8
  183. package/dist/StaffSupportTicketSuccess-FfnJXc_k.js +0 -12
  184. package/dist/TeamAttachmentsTab-D0DOmdnr.js +0 -64
  185. package/dist/TeamHistoryTab-wRpRizDE.js +0 -6
  186. package/dist/TeamList-hmP44hfw.js +0 -8
  187. package/dist/TeamMemberList-B16SuLwM.js +0 -7
  188. package/dist/TeamMemberParent-BJl8nBmP.js +0 -10
  189. package/dist/TeamNotesTab-BQN9niw-.js +0 -8
  190. package/dist/TeamParent-BI9ItLoY.js +0 -11
  191. package/dist/UserListPage-9jhUu3TH.js +0 -5
  192. package/dist/UserProfilePage-Dmxp7oqP.js +0 -8
  193. package/dist/VerifyEmail-DBKMZJMx.js +0 -10
  194. package/dist/ViewTeam-DEOe7wqT.js +0 -8
  195. package/dist/ViewTeamMember-B5U8kZBw.js +0 -7
  196. package/dist/src-DSF_hIBe.js.map +0 -1
  197. package/dist/useMutation-BLNuJoYl.js.map +0 -1
  198. package/dist/useRpcAuth-CJtq1dqM.js.map +0 -1
@@ -507,9 +507,10 @@ async function attemptRefresh(userStore, refreshTokenHandler) {
507
507
  function createAppBatch(options) {
508
508
  const userStore = useUserSessionStore();
509
509
  const env = useEnv();
510
- const headers = {};
510
+ const headers = new Headers();
511
511
  const token = options?.authTokenOverride ?? userStore.accessToken;
512
- if (token) headers["Authorization"] = `Bearer ${token}`;
512
+ if (token) headers.set("Authorization", `Bearer ${token}`);
513
+ if (options?.extraHeaders) new Headers(options.extraHeaders).forEach((value, key) => headers.set(key, value));
513
514
  const request = new Request(env.restApiClient.apiUrl + "/rpc", {
514
515
  method: "POST",
515
516
  headers,
@@ -529,10 +530,7 @@ function createAppBatch(options) {
529
530
  */
530
531
  async function executeWithAuth(fn, options) {
531
532
  const userStore = useUserSessionStore();
532
- if (options?.skipAuthCheck) return await fn(createAppBatch({
533
- ...options,
534
- authTokenOverride: options.authTokenOverride
535
- }));
533
+ if (options?.skipAuthCheck) return await fn(createAppBatch(options));
536
534
  if (needsRefresh(userStore)) {
537
535
  if (!await attemptRefresh(userStore, options.refreshTokenHandler)) {
538
536
  if (!userStore.accessToken) {
@@ -612,4 +610,4 @@ function createTrackedSession(request, trackedSegment) {
612
610
 
613
611
  //#endregion
614
612
  export { createAppBatch$1 as a, Logger as c, useEnv as d, setRouter as i, logIfEnabled as l, createAppBatch as n, useUserSessionStore as o, executeWithAuth as r, LOG_LEVEL as s, BATCH_MODE as t, logger as u };
615
- //# sourceMappingURL=useRpcAuth-CJtq1dqM.js.map
613
+ //# sourceMappingURL=useRpcAuth-BFdprNWb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRpcAuth-BFdprNWb.js","names":["createAppBatch","refreshError: any","createAppBatch","headers: HeadersInit","globalRouter: Router | null","error: any","method: any"],"sources":["../src/composables/useEnv.ts","../src/utils/logger.ts","../src/composables/useUserSessionStore.ts","../src/composables/useRpc.ts","../src/composables/useRpcAuth.ts"],"sourcesContent":["import { readonly } from 'vue';\n\nexport function useEnv() {\n const env = {\n restApiClient: {\n apiUrl: import.meta.env.VITE_API_CLIENT_URL as string,\n authOptions: {\n userDetails: import.meta.env.VITE_CF_APP_USER_DETAILS as string,\n accessToken: import.meta.env.VITE_CF_APP_ACCESS_TOKEN as string,\n decodedToken: import.meta.env.VITE_CF_APP_DECODED_TOKEN as string,\n },\n },\n allowUserSignup: import.meta.env.VITE_ALLOW_USER_SIGNUP === 'true',\n /** 'disabled' | 'soft' | 'strict' - undefined treated as 'disabled' */\n emailVerificationMode: (import.meta.env.VITE_EMAIL_VERIFICATION_MODE as\n | 'disabled'\n | 'soft'\n | 'strict'\n | undefined) ?? 'disabled',\n maxAttachmentFileSize: import.meta.env.VITE_MAX_ATTACHMENT_FILE_SIZE_MB\n ? parseInt(import.meta.env.VITE_MAX_ATTACHMENT_FILE_SIZE_MB, 10) * 1024 * 1024\n : 50 * 1024 * 1024, // Default: 50MB (convert MB to bytes)\n };\n\n return readonly(env);\n}\n","/**\n * Log levels as string literals\n */\nexport const LOG_LEVEL = {\n NONE: 'NONE',\n ERROR: 'ERROR',\n WARN: 'WARN',\n INFO: 'INFO',\n DEBUG: 'DEBUG',\n TRACE: 'TRACE',\n} as const;\n\nexport type LogLevel = (typeof LOG_LEVEL)[keyof typeof LOG_LEVEL];\n\n/**\n * Logger utility that conditionally logs based on configured log level\n */\nexport class Logger {\n private static instance: Logger;\n private logLevel: LogLevel = LOG_LEVEL.INFO; // Default log level\n\n private constructor() {\n this.setLogLevelFromEnv();\n }\n\n /**\n * Get the singleton logger instance\n */\n public static getInstance(): Logger {\n if (!Logger.instance) {\n Logger.instance = new Logger();\n }\n return Logger.instance;\n }\n\n /**\n * Set the log level from environment variables\n */\n private setLogLevelFromEnv(): void {\n // Check for explicit log level setting\n const logLevelStr = (import.meta.env.VITE_LOG_LEVEL as string) || '';\n\n if (logLevelStr) {\n switch (logLevelStr.toUpperCase()) {\n case 'NONE':\n this.logLevel = LOG_LEVEL.NONE;\n break;\n case 'ERROR':\n this.logLevel = LOG_LEVEL.ERROR;\n break;\n case 'WARN':\n this.logLevel = LOG_LEVEL.WARN;\n break;\n case 'INFO':\n this.logLevel = LOG_LEVEL.INFO;\n break;\n case 'DEBUG':\n this.logLevel = LOG_LEVEL.DEBUG;\n break;\n case 'TRACE':\n this.logLevel = LOG_LEVEL.TRACE;\n break;\n }\n } else {\n // If no explicit log level, set based on environment\n const isDev =\n import.meta.env.DEV === true ||\n import.meta.env.MODE === 'development' ||\n import.meta.env.VITE_APP_ENV === 'local' ||\n import.meta.env.VITE_APP_ENV === 'dev';\n\n this.logLevel = isDev ? LOG_LEVEL.DEBUG : LOG_LEVEL.INFO;\n }\n\n console.log(`[Logger] Log level set to: ${this.logLevel.toUpperCase()}`);\n }\n\n /**\n * Set the log level programmatically\n */\n public setLogLevel(level: LogLevel): void {\n this.logLevel = level;\n console.log(`[Logger] Log level changed to: ${this.logLevel.toUpperCase()}`);\n }\n\n /**\n * Get the current log level\n */\n public getLogLevel(): LogLevel {\n return this.logLevel;\n }\n\n /**\n * Determine if a message at the given level should be logged\n * based on the current log level setting\n */\n private shouldLog(level: LogLevel): boolean {\n // Define log level hierarchy (higher number = more verbose)\n const levelPriority = {\n [LOG_LEVEL.NONE]: 0,\n [LOG_LEVEL.ERROR]: 1,\n [LOG_LEVEL.WARN]: 2,\n [LOG_LEVEL.INFO]: 3,\n [LOG_LEVEL.DEBUG]: 4,\n [LOG_LEVEL.TRACE]: 5,\n };\n\n // Compare current log level with requested level\n // Only log if the current level is equal to or higher than the requested level\n return levelPriority[this.logLevel] >= levelPriority[level];\n }\n\n /**\n * Log a trace message (most verbose)\n */\n public trace(message: string, ...args: any[]): void {\n if (this.shouldLog(LOG_LEVEL.TRACE)) {\n console.log(`[TRACE] ${message}`, ...args);\n }\n }\n\n /**\n * Log a debug message\n */\n public debug(message: string, ...args: any[]): void {\n if (this.shouldLog(LOG_LEVEL.DEBUG)) {\n console.debug(`[DEBUG] ${message}`, ...args);\n }\n }\n\n /**\n * Log an info message\n */\n public info(message: string, ...args: any[]): void {\n if (this.shouldLog(LOG_LEVEL.INFO)) {\n console.log(`[INFO] ${message}`, ...args);\n }\n }\n\n /**\n * Log a warning message\n */\n public warn(message: string, ...args: any[]): void {\n if (this.shouldLog(LOG_LEVEL.WARN)) {\n console.warn(`[WARN] ${message}`, ...args);\n }\n }\n\n /**\n * Log an error message\n */\n public error(message: string, ...args: any[]): void {\n if (this.shouldLog(LOG_LEVEL.ERROR)) {\n console.error(`[ERROR] ${message}`, ...args);\n }\n }\n}\n\n// Export a singleton instance for easy use throughout the app\nexport const logger = Logger.getInstance();\n\n/**\n * Conditionally log based on per-instance debug flag and global log level\n * - If debug === false: never log (explicitly disabled)\n * - If debug === true: always log (bypasses global log level)\n * - If debug === undefined: use global log level (default behavior)\n */\nexport function logIfEnabled(\n level: 'debug' | 'error' | 'warn' | 'info',\n message: string,\n debug: boolean | undefined,\n ...args: any[]\n): void {\n if (debug === false) return; // Explicitly disabled\n if (debug === true) {\n // Explicitly enabled - log directly bypassing global log level\n const prefix = `[${level.toUpperCase()}]`;\n if (level === 'error') console.error(prefix, message, ...args);\n else if (level === 'warn') console.warn(prefix, message, ...args);\n else console.log(prefix, message, ...args);\n return;\n }\n // Otherwise use logger which respects global log level\n if (level === 'debug') logger.debug(message, ...args);\n else if (level === 'error') logger.error(message, ...args);\n else if (level === 'warn') logger.warn(message, ...args);\n else logger.info(message, ...args);\n}\n","import { jwtDecode } from 'jwt-decode';\nimport { defineStore } from 'pinia';\nimport { computed, ref, watchEffect } from 'vue';\nimport type { UserAppSession, UserDetailsTokenPayload } from '../lib/models/userSession';\nimport { logIfEnabled, logger } from '../utils/logger';\nimport { useEnv } from './useEnv';\nimport { createAppBatch } from './useRpc';\n\n/**\n * Generic user session store for Dragoncore applications.\n *\n * Responsibilities:\n * - Store and manage user session state (accessToken, userSession)\n * - Sync with localStorage\n * - Provide token refresh capability\n * - Provide token expiration checking\n *\n * Note: This store is intentionally NOT generic on TApi.\n * The refresh method uses createAppBatch which can be typed on a per-call basis.\n */\nexport const useUserSessionStore = defineStore('userSession', () => {\n const env = useEnv().restApiClient;\n const userSession = ref<UserAppSession | null>(null);\n const accessToken = ref<string | null>(null);\n const decodedToken = ref<any | null>(null);\n const isRefreshing = ref(false);\n const debug = ref<boolean>(false);\n\n // Watch localStorage for external changes and update our reactive refs\n watchEffect(() => {\n // Check if localStorage keys are properly defined\n if (!env.authOptions.accessToken || !env.authOptions.userDetails) {\n logIfEnabled(\n 'error',\n '[UserSessionStore] localStorage keys are undefined - check environment variables',\n debug.value,\n );\n return;\n }\n\n const storedAccessToken = localStorage.getItem(env.authOptions.accessToken);\n if (storedAccessToken !== accessToken.value) {\n accessToken.value = storedAccessToken;\n try {\n decodedToken.value = storedAccessToken ? jwtDecode(storedAccessToken) : null;\n } catch (error) {\n logIfEnabled(\n 'error',\n '[UserSessionStore] Failed to decode access token:',\n debug.value,\n error,\n );\n decodedToken.value = null;\n }\n }\n\n const storedUserSession = localStorage.getItem(env.authOptions.userDetails);\n if (storedUserSession) {\n try {\n const decoded = jwtDecode<UserDetailsTokenPayload>(storedUserSession);\n // Extract the actual session data from the nested 'details' field\n const sessionData = decoded.details;\n if (JSON.stringify(sessionData) !== JSON.stringify(userSession.value)) {\n userSession.value = sessionData;\n }\n } catch (error) {\n logIfEnabled(\n 'error',\n '[UserSessionStore] Failed to decode user session:',\n debug.value,\n error,\n );\n if (userSession.value !== null) {\n userSession.value = null;\n }\n }\n } else if (userSession.value !== null) {\n userSession.value = null;\n }\n });\n\n const currentSession = computed(() => {\n if (!userSession.value) {\n return null;\n }\n return userSession.value;\n });\n\n const clientHeaders = computed(() => ({\n 'Content-Type': 'application/json',\n ...(accessToken.value ? { Authorization: `Bearer ${accessToken.value}` } : {}),\n }));\n\n /**\n * Refresh the access token using the refresh token (from HTTP-only cookie).\n * This method uses createAppBatch directly to avoid circular dependencies.\n *\n * @returns true if refresh was successful, false otherwise\n */\n async function refreshToken<\n TApi extends {\n userSessions: {\n refreshToken(): Promise<{ access_token: string; user_details_token: string }>;\n };\n },\n >(): Promise<boolean> {\n try {\n if (isRefreshing.value) {\n logIfEnabled('debug', '[RefreshToken] Token refresh already in progress', debug.value);\n return false;\n }\n\n isRefreshing.value = true;\n logIfEnabled('debug', '[RefreshToken] Starting token refresh', debug.value);\n\n // Check if refresh token is expired (if we have session data)\n if (userSession.value) {\n const tokenStatus = isTokenExpired();\n if (tokenStatus.refreshTokenExpired) {\n logIfEnabled(\n 'warn',\n '[RefreshToken] Refresh token is already expired, cannot refresh',\n debug.value,\n );\n return false;\n }\n }\n\n // Use createAppBatch directly - refresh endpoint is public and doesn't need auth wrapper\n // credentials: 'include' allows the HTTP-only refresh token cookie to be sent\n const batch = createAppBatch<TApi>({\n credentials: 'include',\n trackedSegment: 'userSessions.refreshToken',\n });\n const tokens = await batch.userSessions.refreshToken();\n\n if (!tokens || !tokens.access_token || !tokens.user_details_token) {\n logIfEnabled(\n 'error',\n '[RefreshToken] Invalid response from refresh endpoint',\n debug.value,\n );\n return false;\n }\n\n // Set both tokens using existing validation logic\n setSession(tokens.user_details_token);\n setAccessToken(tokens.access_token);\n\n // Verify that both components of the session were properly updated\n const sessionUpdated = !!userSession.value && !!accessToken.value;\n if (!sessionUpdated) {\n logIfEnabled(\n 'error',\n '[RefreshToken] Failed to update all session components',\n debug.value,\n );\n return false;\n }\n\n // Verify the new tokens are not expired\n const newTokenStatus = isTokenExpired();\n if (newTokenStatus.accessTokenExpired) {\n logIfEnabled(\n 'error',\n '[RefreshToken] New access token is already expired!',\n debug.value,\n );\n return false;\n }\n\n logIfEnabled('debug', '[RefreshToken] Token refresh successful', debug.value);\n return true;\n } catch (refreshError: any) {\n logIfEnabled('error', '[RefreshToken] Token refresh failed:', debug.value, refreshError);\n return false;\n } finally {\n isRefreshing.value = false;\n }\n }\n\n /**\n * Check if tokens are expired\n */\n function isTokenExpired(): { accessTokenExpired: boolean; refreshTokenExpired: boolean } {\n const now = Date.now() / 1000;\n\n // Access token expiration check\n const accessTokenExpired = decodedToken.value?.exp ? decodedToken.value.exp < now : true;\n\n // Refresh token expiration check\n const refreshTokenExpired = userSession.value?.expires_at\n ? new Date(userSession.value.expires_at).getTime() / 1000 < now\n : true;\n\n return { accessTokenExpired, refreshTokenExpired };\n }\n\n /**\n * Set the user session (stored in localStorage as JWT)\n */\n function setSession(token: string | null) {\n if (token) {\n try {\n const decoded = jwtDecode<UserDetailsTokenPayload>(token);\n // Extract the actual session data from the nested 'details' field\n userSession.value = decoded.details;\n localStorage.setItem(env.authOptions.userDetails, token);\n logIfEnabled('debug', '[SetSession] User session set successfully', debug.value);\n } catch (error) {\n logger.error('[SetSession] Failed to decode user session token:', error);\n userSession.value = null;\n localStorage.removeItem(env.authOptions.userDetails);\n }\n } else {\n userSession.value = null;\n localStorage.removeItem(env.authOptions.userDetails);\n logIfEnabled('debug', '[SetSession] User session cleared', debug.value);\n }\n }\n\n /**\n * Set the access token (stored in localStorage as JWT string)\n */\n function setAccessToken(token: string | null) {\n if (token) {\n try {\n const decoded = jwtDecode(token);\n accessToken.value = token;\n decodedToken.value = decoded;\n localStorage.setItem(env.authOptions.accessToken, token);\n logIfEnabled('debug', '[SetAccessToken] Access token set successfully', debug.value);\n } catch (error) {\n logger.error('[SetAccessToken] Failed to decode access token:', error);\n accessToken.value = null;\n decodedToken.value = null;\n localStorage.removeItem(env.authOptions.accessToken);\n // Also clear user session if we're clearing the access token\n if (userSession.value) {\n userSession.value = null;\n localStorage.removeItem(env.authOptions.userDetails);\n }\n }\n } else {\n accessToken.value = null;\n decodedToken.value = null;\n localStorage.removeItem(env.authOptions.accessToken);\n logIfEnabled('debug', '[SetAccessToken] Access token cleared', debug.value);\n }\n }\n\n /**\n * Clear all session data\n */\n function clearSession() {\n setSession(null);\n setAccessToken(null);\n }\n\n /**\n * Re-read session from localStorage and update in-memory state.\n * Use when another tab may have updated localStorage (e.g. after email verification).\n */\n function syncFromStorage() {\n if (!env.authOptions.accessToken || !env.authOptions.userDetails) return;\n\n const storedAccessToken = localStorage.getItem(env.authOptions.accessToken);\n if (storedAccessToken !== accessToken.value) {\n accessToken.value = storedAccessToken;\n try {\n decodedToken.value = storedAccessToken ? jwtDecode(storedAccessToken) : null;\n } catch (error) {\n logIfEnabled(\n 'error',\n '[UserSessionStore] Failed to decode access token:',\n debug.value,\n error,\n );\n decodedToken.value = null;\n }\n }\n\n const storedUserSession = localStorage.getItem(env.authOptions.userDetails);\n if (storedUserSession) {\n try {\n const decoded = jwtDecode<UserDetailsTokenPayload>(storedUserSession);\n const sessionData = decoded.details;\n if (JSON.stringify(sessionData) !== JSON.stringify(userSession.value)) {\n userSession.value = sessionData;\n }\n } catch (error) {\n logIfEnabled(\n 'error',\n '[UserSessionStore] Failed to decode user session:',\n debug.value,\n error,\n );\n if (userSession.value !== null) {\n userSession.value = null;\n }\n }\n } else if (userSession.value !== null) {\n userSession.value = null;\n }\n }\n\n return {\n // State\n userSession,\n currentSession,\n accessToken,\n clientHeaders,\n debug,\n // Methods\n setSession,\n setAccessToken,\n clearSession,\n refreshToken,\n syncFromStorage,\n isTokenExpired,\n };\n});\n","import { newHttpBatchRpcSession, type RpcStub } from 'capnweb';\nimport type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport { useEnv } from './useEnv';\nimport { useUserSessionStore } from './useUserSessionStore';\n\n/**\n * Creates a fresh RPC batch session with authentication headers.\n * Each call creates a new session, which is the correct pattern for Cap'n Web RPC.\n *\n * This is the simple version - just creates a batch with auth headers.\n * For advanced features (token refresh, retry, tracked sessions), use executeWithAuth from useRpcAuth.\n *\n * @param options - Optional configuration for the RPC batch\n * @param options.credentials - Credentials mode for the request. Use 'include' for login/logout/refreshToken to allow cookies.\n * @param options.trackedSegment - Path segment to append to /rpc for metrics/tracking (e.g. 'userSessions.refreshToken').\n */\nexport function createAppBatch<TApi extends Record<string, any> = DragoncoreApi>(options?: {\n credentials?: RequestCredentials;\n trackedSegment?: string;\n}): RpcStub<TApi> {\n const userStore = useUserSessionStore();\n const env = useEnv();\n\n const headers: HeadersInit = {};\n // Pinia stores auto-unwrap refs, so accessToken is already string | null\n const accessToken = userStore.accessToken;\n if (accessToken) {\n headers['Authorization'] = `Bearer ${accessToken}`;\n }\n\n const baseUrl = env.restApiClient.apiUrl + '/rpc';\n const url = options?.trackedSegment ? `${baseUrl}/${options.trackedSegment}` : baseUrl;\n\n // Create a Request object with headers (capnweb accepts Request objects)\n const request = new Request(url, {\n method: 'POST', // Will be overridden by capnweb, but required for Request constructor\n headers,\n credentials: options?.credentials ?? 'omit', // Use 'include' for login/logout/refreshToken\n });\n\n return newHttpBatchRpcSession<TApi>(request);\n}\n","import type { DragoncoreApi } from '@dragonmastery/dragoncore-shared';\nimport { newHttpBatchRpcSession, type RpcStub } from 'capnweb';\nimport type { Router } from 'vue-router';\nimport { useEnv } from './useEnv';\nimport { useUserSessionStore } from './useUserSessionStore';\n\n/**\n * Auth error codes that should trigger token refresh\n */\nconst AUTH_ERROR_CODES = [\n 'ACCESS_TOKEN_EXPIRED',\n 'ACCESS_TOKEN_REVOKED',\n 'NO_ACCESS_TOKEN',\n 'NO_REFRESH_TOKEN',\n];\n\n/** Business error codes for frontend handling (e.g. redirects) */\nconst BusinessErrorCode = {\n EMAIL_VERIFICATION_REQUIRED: 'EMAIL_VERIFICATION_REQUIRED',\n CONSENT_REQUIRED: 'CONSENT_REQUIRED',\n} as const;\n\nexport const BATCH_MODE = {\n batch: 'batch',\n tracked: 'tracked',\n} as const;\n\nexport type BatchMode = (typeof BATCH_MODE)[keyof typeof BATCH_MODE];\n\n/**\n * Check if an error is an auth error that should trigger refresh\n */\nfunction isAuthError(error: any): boolean {\n if (!error) return false;\n\n // Unwrap InternalServerError to get original error\n let actualError = error;\n if (error.name === 'InternalServerError' && error.originalError) {\n actualError = error.originalError;\n }\n\n // Check for AuthenticationError class name\n if (actualError.name === 'AuthenticationError' || error.name === 'AuthenticationError') {\n return true;\n }\n\n // Check for error code property\n if (actualError.code && AUTH_ERROR_CODES.includes(actualError.code)) return true;\n if (error.code && AUTH_ERROR_CODES.includes(error.code)) return true;\n\n // Check error message for auth error patterns\n const errorMessage = actualError.message || error.message || String(error);\n if (AUTH_ERROR_CODES.some((code) => errorMessage.includes(code))) return true;\n\n // Check for common auth error strings\n if (\n errorMessage.includes('Unauthorized') ||\n errorMessage.includes('authentication') ||\n errorMessage.includes('token')\n ) {\n // Only treat as auth error if it's clearly an auth issue\n return (\n errorMessage.toLowerCase().includes('expired') ||\n errorMessage.toLowerCase().includes('revoked') ||\n errorMessage.toLowerCase().includes('invalid token') ||\n errorMessage.toLowerCase().includes('no refresh token')\n );\n }\n\n return false;\n}\n\n/**\n * Global router instance.\n * Set this once in your app's initialization.\n */\nlet globalRouter: Router | null = null;\n\n/**\n * Set the global router instance for your application.\n * Call this once during app initialization.\n */\nexport function setRouter(router: Router): void {\n globalRouter = router;\n}\n\n/**\n * Get the global router instance.\n * This is used internally by executeWithAuth for navigation.\n *\n * @throws Error if router is not set\n */\nfunction getRouter(): Router {\n if (!globalRouter) {\n throw new Error('Router not initialized. Call setRouter() in your app initialization.');\n }\n return globalRouter;\n}\n\n/**\n * Push to logout with returnUrl so user can return to their intended destination after re-login.\n * Validates path: must start with / and not /auth/ to avoid loops.\n */\nfunction pushToLogout() {\n const router = getRouter();\n const currentPath = router.currentRoute.value.fullPath;\n const returnUrl =\n currentPath.startsWith('/') && !currentPath.startsWith('/auth/') ? currentPath : undefined;\n const query = returnUrl ? { returnUrl } : {};\n return router.push({ path: '/auth/logout', query });\n}\n\n/**\n * Check if token needs refresh before making a request\n */\nfunction needsRefresh(userStore: ReturnType<typeof useUserSessionStore>): boolean {\n if (!userStore.accessToken) {\n return true;\n }\n const { accessTokenExpired, refreshTokenExpired } = userStore.isTokenExpired();\n return accessTokenExpired || refreshTokenExpired;\n}\n\n/**\n * Attempt to refresh the token using the provided handler\n */\nasync function attemptRefresh(\n userStore: ReturnType<typeof useUserSessionStore>,\n refreshTokenHandler: {\n shouldAttemptRefresh(): boolean;\n performRefreshWithStrategies(): Promise<{\n access_token: string;\n user_details_token: string;\n }>;\n },\n): Promise<boolean> {\n try {\n if (!userStore.currentSession && !userStore.accessToken) {\n return false;\n }\n\n if (userStore.currentSession) {\n const { refreshTokenExpired } = userStore.isTokenExpired();\n if (refreshTokenExpired) {\n await pushToLogout();\n return false;\n }\n }\n\n if (!refreshTokenHandler.shouldAttemptRefresh()) {\n return false;\n }\n\n const tokens = await refreshTokenHandler.performRefreshWithStrategies();\n userStore.setSession(tokens.user_details_token);\n userStore.setAccessToken(tokens.access_token);\n return true;\n } catch (error: any) {\n console.error('[RPC Auth] Refresh attempt failed:', {\n error,\n name: error?.name,\n message: error?.message,\n code: error?.code,\n originalError: error?.originalError,\n });\n\n // Unwrap InternalServerError to check original error\n const actualError = error?.originalError || error;\n const errorMessage = (actualError?.message || error?.message || '').toUpperCase();\n const originalErrorMessage = (error?.originalError?.message || '').toUpperCase();\n const combinedMessage = `${errorMessage} ${originalErrorMessage}`;\n\n const criticalError =\n combinedMessage.includes('NO_REFRESH_TOKEN') ||\n combinedMessage.includes('REFRESH_TOKEN_EXPIRED') ||\n combinedMessage.includes('REFRESH_TOKEN_REVOKED') ||\n combinedMessage.includes('INVALID REFRESH TOKEN') ||\n combinedMessage.includes('NO REFRESH TOKEN FOUND');\n\n if (criticalError) {\n await pushToLogout();\n }\n return false;\n }\n}\n\n/**\n * Create a base RPC batch with current auth token\n */\nexport function createAppBatch<TApi extends Record<string, any> = DragoncoreApi>(options?: {\n credentials?: RequestCredentials;\n mode?: BatchMode;\n trackedSegment?: string;\n /** Override auth token (e.g. signup_consent token). When set, used instead of access token. */\n authTokenOverride?: string;\n /** Extra headers to merge into the request (e.g. X-Referral-Tag) */\n extraHeaders?: HeadersInit;\n}): RpcStub<TApi> {\n const userStore = useUserSessionStore();\n const env = useEnv();\n\n const headers = new Headers();\n const token = options?.authTokenOverride ?? userStore.accessToken;\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n if (options?.extraHeaders) {\n new Headers(options.extraHeaders).forEach((value, key) => headers.set(key, value));\n }\n\n const request = new Request(env.restApiClient.apiUrl + '/rpc', {\n method: 'POST',\n headers,\n credentials: options?.credentials ?? 'omit',\n });\n\n // If mode is batch and no tracked segment is provided then we can just return the batch\n if (options?.mode === BATCH_MODE.batch && !options?.trackedSegment) {\n return newHttpBatchRpcSession<TApi>(request);\n }\n\n // Use tracked session for metrics (creates separate HTTP request per method)\n return createTrackedSession<TApi>(request, options?.trackedSegment);\n}\n\n/**\n * Execute an RPC call with automatic auth handling\n * - Checks token expiration before call\n * - Handles auth errors and retries after refresh\n *\n * @param fn - Function that receives an RPC batch and returns a promise\n * @param options - Configuration options\n * @param options.refreshTokenHandler - Instance of refresh token handler for your API type\n */\nexport async function executeWithAuth<\n TApi extends Record<string, any> = DragoncoreApi,\n T = any,\n>(\n fn: (batch: RpcStub<TApi>) => Promise<T>,\n options: {\n credentials?: RequestCredentials;\n skipAuthCheck?: boolean;\n mode?: BatchMode;\n trackedSegment?: string;\n /** Override auth token for this request (e.g. signup_consent token) */\n authTokenOverride?: string;\n /** Extra headers to send with the request */\n extraHeaders?: HeadersInit;\n refreshTokenHandler: {\n shouldAttemptRefresh(): boolean;\n performRefreshWithStrategies(): Promise<{\n access_token: string;\n user_details_token: string;\n }>;\n };\n },\n): Promise<T> {\n const userStore = useUserSessionStore();\n\n // Skip auth for login/logout/refreshToken/signupInitiate (with optional extra headers) operations\n if (options?.skipAuthCheck) {\n const batch = createAppBatch<TApi>(options);\n return await fn(batch);\n }\n\n // Check if token needs refresh before making the request\n if (needsRefresh(userStore)) {\n const refreshed = await attemptRefresh(userStore, options.refreshTokenHandler);\n if (!refreshed) {\n // If refresh failed and we have no token, don't proceed\n if (!userStore.accessToken) {\n await pushToLogout();\n throw new Error('Authentication required');\n }\n // If we have a token but refresh failed, continue anyway (might be temporary)\n } else {\n // Verify the token is actually set\n if (!userStore.accessToken) {\n await pushToLogout();\n throw new Error('Token refresh failed to set access token');\n }\n }\n }\n\n // Execute the operation\n try {\n // Double-check we have a token before creating the batch\n if (!userStore.accessToken) {\n await pushToLogout();\n throw new Error('Authentication required');\n }\n const batch = createAppBatch<TApi>(options);\n return await fn(batch);\n } catch (error: any) {\n // If BusinessError with EMAIL_VERIFICATION_REQUIRED, redirect to verify-email\n const errorCode = error?.code ?? error?.originalError?.code;\n if (errorCode === BusinessErrorCode.EMAIL_VERIFICATION_REQUIRED) {\n const router = getRouter();\n const currentPath = router.currentRoute.value.fullPath;\n const returnUrl =\n currentPath.startsWith('/') && !currentPath.startsWith('/auth/') ? currentPath : undefined;\n await router.push({\n path: '/auth/verify-email',\n query: returnUrl ? { returnUrl } : {},\n });\n throw error;\n }\n\n // If BusinessError with CONSENT_REQUIRED, redirect to consent-required\n if (errorCode === BusinessErrorCode.CONSENT_REQUIRED) {\n const router = getRouter();\n const currentPath = router.currentRoute.value.fullPath;\n const returnUrl =\n currentPath.startsWith('/') && !currentPath.startsWith('/auth/') ? currentPath : undefined;\n await router.push({\n path: '/auth/consent-required',\n query: returnUrl ? { returnUrl } : {},\n });\n throw error;\n }\n\n // If auth error, refresh and retry once\n if (isAuthError(error)) {\n const refreshed = await attemptRefresh(userStore, options.refreshTokenHandler);\n if (refreshed) {\n const retryBatch = createAppBatch<TApi>(options);\n return await fn(retryBatch);\n }\n await pushToLogout();\n throw error;\n }\n throw error;\n }\n}\n\n/**\n * Create a tracked RPC session that appends method names to URL\n */\nfunction createTrackedSession<T extends Record<string, any> = DragoncoreApi>(\n request: Request,\n trackedSegment?: string,\n): RpcStub<T> {\n const baseUrl = request.url;\n // If trackedSegment is provided then we dont need to do any ofteh complex proxy stuff, append the segment to the url and return the batch\n if (trackedSegment) {\n return newHttpBatchRpcSession<T>(\n new Request(`${baseUrl}/${trackedSegment}`, {\n method: request.method,\n headers: request.headers,\n credentials: request.credentials,\n }),\n );\n }\n\n function createProxy(path: string[] = []): any {\n return new Proxy(() => {}, {\n get(_target, prop) {\n if (typeof prop === 'string') {\n return createProxy([...path, prop]);\n }\n return undefined;\n },\n\n apply(_target, _thisArg, args) {\n // Build the full method path (e.g., \"teams.getUserTeams\")\n const fullPath = path.join('.');\n\n // Clone the request with updated URL\n const trackedRequest = new Request(`${baseUrl}/${fullPath}`, {\n method: request.method,\n headers: request.headers,\n credentials: request.credentials,\n });\n\n // Create batch with the tracked URL\n const batch = newHttpBatchRpcSession<T>(trackedRequest);\n\n // Navigate to the right method on the batch\n let method: any = batch;\n for (const segment of path) {\n method = method[segment];\n }\n\n // Call with original arguments\n return method(...args);\n },\n });\n }\n\n return createProxy() as RpcStub<T>;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { d as useEnv, n as createAppBatch, o as useUserSessionStore, u as logger } from "./useRpcAuth-CJtq1dqM.js";
1
+ import { d as useEnv, n as createAppBatch, o as useUserSessionStore, u as logger } from "./useRpcAuth-BFdprNWb.js";
2
2
 
3
3
  //#region src/middleware/userAuthorized.ts
4
4
  /**
@@ -186,4 +186,4 @@ const leadOrStaffOnly = createLeadOrStaffOnlyGuard();
186
186
 
187
187
  //#endregion
188
188
  export { createUserAuthorizedGuard as a, userAuthenticated as c, createSuperAdminOnlyGuard as i, userIsSuperAdmin as l, createLeadOrStaffOnlyGuard as n, leadOrStaffOnly as o, createStaffOnlyGuard as r, staffOnly as s, createAuthenticatedGuard as t };
189
- //# sourceMappingURL=userAuthorized-3RiCDXxr.js.map
189
+ //# sourceMappingURL=userAuthorized-qmzUYDa-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"userAuthorized-3RiCDXxr.js","names":[],"sources":["../src/middleware/userAuthorized.ts"],"sourcesContent":["import type { UserTypeValues } from '@dragonmastery/dragoncore-shared';\nimport type { NavigationGuard, RouteLocationRaw } from 'vue-router';\nimport { createAppBatch } from '../composables/useRpcAuth';\nimport { useEnv } from '../composables/useEnv';\nimport { useUserSessionStore } from '../composables/useUserSessionStore';\nimport { logger } from '../utils/logger';\n\nexport interface UserAuthorizedOptions {\n /**\n * List of user types allowed to access this route\n * Same pattern as `visible_to` in route meta\n */\n allowedUserTypes: UserTypeValues[];\n\n /**\n * Where to redirect if user is not authorized\n * Can be a route name, path, or route object\n */\n redirectTo?: RouteLocationRaw;\n\n /**\n * Login path for redirecting unauthenticated users\n * Only used if requireAuth is true\n */\n loginPath?: string;\n\n /**\n * Whether to also check authentication (token refresh, etc.)\n * Default: true\n */\n requireAuth?: boolean;\n}\n\n/**\n * Creates a navigation guard that checks both authentication and authorization\n * based on allowed user types.\n *\n * @example\n * // Only staff and super_admin can access\n * const staffOnly = createUserAuthorizedGuard({\n * allowedUserTypes: ['staff', 'super_admin'],\n * redirectTo: { name: 'Home' }\n * });\n *\n * @example\n * // All authenticated users can access\n * const authenticated = createUserAuthorizedGuard({\n * allowedUserTypes: ['consumer', 'lead', 'staff', 'super_admin'],\n * redirectTo: { name: 'Home' }\n * });\n */\nexport function createUserAuthorizedGuard(options: UserAuthorizedOptions): NavigationGuard {\n const {\n allowedUserTypes,\n redirectTo = { name: 'Home' },\n loginPath = '/auth/login',\n requireAuth = true,\n } = options;\n\n return async (to, _from, next) => {\n // Legal and other public routes must never require auth (used during signup, iframe embed)\n if (to.meta?.public) {\n next();\n return;\n }\n\n const userSession = useUserSessionStore();\n const env = useEnv();\n\n // Step 1: Check authentication if required\n if (requireAuth) {\n const hasAccessToken = !!userSession.accessToken;\n\n if (hasAccessToken) {\n const { accessTokenExpired, refreshTokenExpired } = userSession.isTokenExpired();\n\n if (!accessTokenExpired) {\n // Token is valid, proceed to authorization check\n } else if (refreshTokenExpired) {\n // Refresh token expired, redirect to login\n logger.warn('[UserAuthorized] Refresh token expired, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n } else {\n // Access token expired, try refresh\n logger.debug('[UserAuthorized] Access token expired, attempting refresh');\n const refreshSuccessful = await userSession.refreshToken();\n\n if (!refreshSuccessful) {\n logger.error('[UserAuthorized] Token refresh failed, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n }\n }\n } else {\n // No access token, try refresh token flow\n logger.debug('[UserAuthorized] No access token, attempting refresh token flow');\n const refreshSuccessful = await userSession.refreshToken();\n\n if (!refreshSuccessful) {\n logger.debug('[UserAuthorized] No valid session found, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n }\n }\n }\n\n // Step 2: Check consent status\n // Call getPendingConsents for fresh data - backend returns [] when CONSENT_FEATURE_ENABLED is false\n if (to.path !== '/auth/consent-required') {\n try {\n const batch = createAppBatch();\n const pending = await batch.users.getPendingConsents();\n if (pending && pending.length > 0) {\n logger.debug('[UserAuthorized] Pending consents found, redirecting to consent-required');\n next({\n path: '/auth/consent-required',\n query: { returnUrl: to.fullPath, ...to.query },\n });\n return;\n }\n } catch (err) {\n logger.warn('[UserAuthorized] Failed to check pending consents, continuing', { err });\n // On auth/network error, let user proceed; they may hit CONSENT_REQUIRED on next API call\n }\n }\n\n // Step 2.5: In strict mode, block unverified users from app entirely\n if (\n !to.path.startsWith('/auth/') &&\n env.emailVerificationMode === 'strict'\n ) {\n const emailVerified = userSession.currentSession?.user?.email_verified ?? true;\n if (!emailVerified) {\n logger.debug('[UserAuthorized] Strict mode: unverified user, redirecting to verify-email');\n next({ path: '/auth/verify-email', query: { returnUrl: to.fullPath } });\n return;\n }\n }\n\n // Step 3: Check authorization (user type)\n const userType = userSession.currentSession?.user.user_type;\n\n if (!userType) {\n logger.warn('[UserAuthorized] No user type found, redirecting');\n next(redirectTo);\n return;\n }\n\n if (allowedUserTypes.includes(userType)) {\n logger.debug(`[UserAuthorized] User type '${userType}' is authorized`);\n next();\n } else {\n logger.warn(\n `[UserAuthorized] User type '${userType}' is not authorized. Allowed: ${allowedUserTypes.join(', ')}`,\n );\n next(redirectTo);\n }\n };\n}\n\n/**\n * Pre-built guard: Staff and super admin only\n * Redirects non-staff users to the provided redirect path\n */\nexport function createStaffOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: Super admin only\n * Redirects non-super-admin users to the provided redirect path\n */\nexport function createSuperAdminOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['super_admin'],\n redirectTo: options?.redirectTo ?? '/notfound',\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: All authenticated users\n * Any logged-in user can access (consumer, lead, staff, or super_admin)\n */\nexport function createAuthenticatedGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['consumer', 'lead', 'staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: Lead, staff, and super admin\n * Consumers are not allowed\n */\nexport function createLeadOrStaffOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['lead', 'staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-configured guards with sensible defaults\n * Apps can use these directly or override with create*Guard functions\n */\n\n/**\n * Pre-configured: All authenticated users\n * Default redirect: Home, Default login: /auth/login\n */\nexport const userAuthenticated = createAuthenticatedGuard();\n\n/**\n * Pre-configured: Staff and super admin only\n * Default redirect: Home, Default login: /auth/login\n */\nexport const staffOnly = createStaffOnlyGuard();\n\n/**\n * Pre-configured: Super admin only\n * Default redirect: /notfound, Default login: /auth/login\n */\nexport const userIsSuperAdmin = createSuperAdminOnlyGuard();\n\n/**\n * Pre-configured: Lead, staff, and super admin\n * Default redirect: Home, Default login: /auth/login\n */\nexport const leadOrStaffOnly = createLeadOrStaffOnlyGuard();\n"],"mappings":"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"}
1
+ {"version":3,"file":"userAuthorized-qmzUYDa-.js","names":[],"sources":["../src/middleware/userAuthorized.ts"],"sourcesContent":["import type { UserTypeValues } from '@dragonmastery/dragoncore-shared';\nimport type { NavigationGuard, RouteLocationRaw } from 'vue-router';\nimport { createAppBatch } from '../composables/useRpcAuth';\nimport { useEnv } from '../composables/useEnv';\nimport { useUserSessionStore } from '../composables/useUserSessionStore';\nimport { logger } from '../utils/logger';\n\nexport interface UserAuthorizedOptions {\n /**\n * List of user types allowed to access this route\n * Same pattern as `visible_to` in route meta\n */\n allowedUserTypes: UserTypeValues[];\n\n /**\n * Where to redirect if user is not authorized\n * Can be a route name, path, or route object\n */\n redirectTo?: RouteLocationRaw;\n\n /**\n * Login path for redirecting unauthenticated users\n * Only used if requireAuth is true\n */\n loginPath?: string;\n\n /**\n * Whether to also check authentication (token refresh, etc.)\n * Default: true\n */\n requireAuth?: boolean;\n}\n\n/**\n * Creates a navigation guard that checks both authentication and authorization\n * based on allowed user types.\n *\n * @example\n * // Only staff and super_admin can access\n * const staffOnly = createUserAuthorizedGuard({\n * allowedUserTypes: ['staff', 'super_admin'],\n * redirectTo: { name: 'Home' }\n * });\n *\n * @example\n * // All authenticated users can access\n * const authenticated = createUserAuthorizedGuard({\n * allowedUserTypes: ['consumer', 'lead', 'staff', 'super_admin'],\n * redirectTo: { name: 'Home' }\n * });\n */\nexport function createUserAuthorizedGuard(options: UserAuthorizedOptions): NavigationGuard {\n const {\n allowedUserTypes,\n redirectTo = { name: 'Home' },\n loginPath = '/auth/login',\n requireAuth = true,\n } = options;\n\n return async (to, _from, next) => {\n // Legal and other public routes must never require auth (used during signup, iframe embed)\n if (to.meta?.public) {\n next();\n return;\n }\n\n const userSession = useUserSessionStore();\n const env = useEnv();\n\n // Step 1: Check authentication if required\n if (requireAuth) {\n const hasAccessToken = !!userSession.accessToken;\n\n if (hasAccessToken) {\n const { accessTokenExpired, refreshTokenExpired } = userSession.isTokenExpired();\n\n if (!accessTokenExpired) {\n // Token is valid, proceed to authorization check\n } else if (refreshTokenExpired) {\n // Refresh token expired, redirect to login\n logger.warn('[UserAuthorized] Refresh token expired, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n } else {\n // Access token expired, try refresh\n logger.debug('[UserAuthorized] Access token expired, attempting refresh');\n const refreshSuccessful = await userSession.refreshToken();\n\n if (!refreshSuccessful) {\n logger.error('[UserAuthorized] Token refresh failed, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n }\n }\n } else {\n // No access token, try refresh token flow\n logger.debug('[UserAuthorized] No access token, attempting refresh token flow');\n const refreshSuccessful = await userSession.refreshToken();\n\n if (!refreshSuccessful) {\n logger.debug('[UserAuthorized] No valid session found, redirecting to login');\n userSession.clearSession();\n const returnUrl = to.fullPath;\n next({\n path: loginPath,\n query: { returnUrl },\n });\n return;\n }\n }\n }\n\n // Step 2: Check consent status\n // Call getPendingConsents for fresh data - backend returns [] when CONSENT_FEATURE_ENABLED is false\n if (to.path !== '/auth/consent-required') {\n try {\n const batch = createAppBatch();\n const pending = await batch.users.getPendingConsents();\n if (pending && pending.length > 0) {\n logger.debug('[UserAuthorized] Pending consents found, redirecting to consent-required');\n next({\n path: '/auth/consent-required',\n query: { returnUrl: to.fullPath, ...to.query },\n });\n return;\n }\n } catch (err) {\n logger.warn('[UserAuthorized] Failed to check pending consents, continuing', { err });\n // On auth/network error, let user proceed; they may hit CONSENT_REQUIRED on next API call\n }\n }\n\n // Step 2.5: In strict mode, block unverified users from app entirely\n if (\n !to.path.startsWith('/auth/') &&\n env.emailVerificationMode === 'strict'\n ) {\n const emailVerified = userSession.currentSession?.user?.email_verified ?? true;\n if (!emailVerified) {\n logger.debug('[UserAuthorized] Strict mode: unverified user, redirecting to verify-email');\n next({ path: '/auth/verify-email', query: { returnUrl: to.fullPath } });\n return;\n }\n }\n\n // Step 3: Check authorization (user type)\n const userType = userSession.currentSession?.user.user_type;\n\n if (!userType) {\n logger.warn('[UserAuthorized] No user type found, redirecting');\n next(redirectTo);\n return;\n }\n\n if (allowedUserTypes.includes(userType)) {\n logger.debug(`[UserAuthorized] User type '${userType}' is authorized`);\n next();\n } else {\n logger.warn(\n `[UserAuthorized] User type '${userType}' is not authorized. Allowed: ${allowedUserTypes.join(', ')}`,\n );\n next(redirectTo);\n }\n };\n}\n\n/**\n * Pre-built guard: Staff and super admin only\n * Redirects non-staff users to the provided redirect path\n */\nexport function createStaffOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: Super admin only\n * Redirects non-super-admin users to the provided redirect path\n */\nexport function createSuperAdminOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['super_admin'],\n redirectTo: options?.redirectTo ?? '/notfound',\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: All authenticated users\n * Any logged-in user can access (consumer, lead, staff, or super_admin)\n */\nexport function createAuthenticatedGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['consumer', 'lead', 'staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-built guard: Lead, staff, and super admin\n * Consumers are not allowed\n */\nexport function createLeadOrStaffOnlyGuard(options?: {\n redirectTo?: RouteLocationRaw;\n loginPath?: string;\n}): NavigationGuard {\n return createUserAuthorizedGuard({\n allowedUserTypes: ['lead', 'staff', 'super_admin'],\n redirectTo: options?.redirectTo ?? { name: 'Home' },\n loginPath: options?.loginPath,\n });\n}\n\n/**\n * Pre-configured guards with sensible defaults\n * Apps can use these directly or override with create*Guard functions\n */\n\n/**\n * Pre-configured: All authenticated users\n * Default redirect: Home, Default login: /auth/login\n */\nexport const userAuthenticated = createAuthenticatedGuard();\n\n/**\n * Pre-configured: Staff and super admin only\n * Default redirect: Home, Default login: /auth/login\n */\nexport const staffOnly = createStaffOnlyGuard();\n\n/**\n * Pre-configured: Super admin only\n * Default redirect: /notfound, Default login: /auth/login\n */\nexport const userIsSuperAdmin = createSuperAdminOnlyGuard();\n\n/**\n * Pre-configured: Lead, staff, and super admin\n * Default redirect: Home, Default login: /auth/login\n */\nexport const leadOrStaffOnly = createLeadOrStaffOnlyGuard();\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dragonmastery/dragoncore-vue",
3
- "version": "0.0.31",
3
+ "version": "0.0.32",
4
4
  "description": "Vue 3 components and composables for dragoncore",
5
5
  "author": "DragonMastery",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -41,7 +41,7 @@
41
41
  "vue3-toastify": "0.2.8"
42
42
  },
43
43
  "peerDependencies": {
44
- "@dragonmastery/dragoncore-shared": "^0.0.31",
44
+ "@dragonmastery/dragoncore-shared": "^0.0.32",
45
45
  "@dragonmastery/zinia-forms-core": ">=0.5.11",
46
46
  "@vueuse/core": ">=14.0.0",
47
47
  "pinia": ">=3.0.0",
@@ -1,7 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import { t as ChangePasswordPage_default } from "./ChangePasswordPage-Dy8lFUcI.js";
6
-
7
- export { ChangePasswordPage_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"ConsentRequired-Bhkxu0rv.js","names":["$emit","acceptancesSoFar: Record<string, boolean>"],"sources":["../src/slices/auth/features/shared/ConsentFlowStep.vue","../src/slices/auth/features/consent_required/ConsentRequired.vue"],"sourcesContent":["<template>\n <div class=\"space-y-6\">\n <div class=\"text-center space-y-1\">\n <h1 class=\"text-2xl font-bold\">{{ config.label }}</h1>\n <p class=\"text-base-content/80\">Step {{ currentStep }} of {{ totalSteps }}</p>\n <p class=\"text-base-content/70 text-sm\">Review and accept</p>\n </div>\n\n <div\n v-if=\"submitError\"\n class=\"alert alert-error flex flex-col gap-2\"\n >\n <slot\n name=\"error-recovery\"\n :retry=\"retry\"\n :submitting=\"submitting\"\n >\n <span>{{ submitError }}</span>\n <p class=\"text-sm opacity-90\">You can try again using the buttons below.</p>\n </slot>\n </div>\n\n <p\n v-if=\"displayContent\"\n class=\"text-sm text-base-content/70 mb-2\"\n >\n {{ introText }}\n </p>\n\n <!-- Scrollable terms box when admin provides inline content -->\n <div\n v-if=\"displayContent\"\n :key=\"config.type\"\n :ref=\"(el) => setScrollRef(el)\"\n class=\"border border-base-300 rounded-lg px-3 py-4 sm:p-4 bg-base-100 overflow-y-auto overflow-x-hidden min-h-80 max-h-[min(32rem,70vh)] w-full min-w-0\"\n :data-consent-type=\"config.type\"\n @scroll=\"onScroll\"\n >\n <div\n class=\"prose prose-sm prose-max-w-none max-w-full min-w-0 text-sm prose-headings:font-semibold prose-p:my-2\"\n v-html=\"renderMarkdown(displayContent)\"\n />\n </div>\n\n <!-- Link-only when admin does not provide content -->\n <div v-else-if=\"config.url\">\n <a\n :href=\"config.url\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"link link-accent inline-flex items-center gap-1.5\"\n >\n View {{ config.label }}\n <ExternalLinkIcon />\n </a>\n </div>\n\n <div class=\"flex flex-col gap-5\">\n <button\n type=\"button\"\n class=\"btn btn-primary\"\n :disabled=\"(needsScroll ? !hasScrolledToBottom : false) || submitting\"\n @click=\"$emit('accept')\"\n >\n {{ submitting ? submitAcceptLabel : acceptLabel }}\n </button>\n <button\n type=\"button\"\n class=\"btn btn-outline btn-sm btn-error\"\n :disabled=\"declining || submitting\"\n @click=\"$emit('decline')\"\n >\n {{ declining ? declineSubmittingLabel : declineLabel }}\n </button>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { SignupConsentConfigDto } from '@dragonmastery/dragoncore-shared';\nimport ExternalLinkIcon from '../../../../components/ui/ExternalLinkIcon.vue';\nimport DOMPurify from 'dompurify';\nimport { marked } from 'marked';\nimport { computed, nextTick, ref, watch } from 'vue';\n\nconst props = withDefaults(\n defineProps<{\n config: SignupConsentConfigDto;\n currentStep: number;\n totalSteps: number;\n submitting?: boolean;\n submitError?: string | null;\n declining?: boolean;\n /** e.g. \"Accept and continue\" */\n acceptLabel?: string;\n /** e.g. \"Submitting...\" or \"Saving...\" */\n submitAcceptLabel?: string;\n /** e.g. \"Decline\" or \"Decline and log out\" */\n declineLabel?: string;\n /** e.g. \"Returning...\" or \"Logging out...\" */\n declineSubmittingLabel?: string;\n /** Intro text when content is shown, e.g. \"Please read the full document before accepting...\" */\n introText?: string;\n }>(),\n {\n submitting: false,\n submitError: null,\n declining: false,\n acceptLabel: 'Accept and continue',\n submitAcceptLabel: 'Submitting...',\n declineLabel: 'Decline',\n declineSubmittingLabel: 'Returning...',\n introText:\n \"Please read the full document before accepting. Scroll to the bottom when you've finished reading.\",\n },\n);\n\nconst emit = defineEmits<{\n accept: [];\n decline: [];\n}>();\n\nfunction retry() {\n emit('accept');\n}\n\nconst displayContent = computed(() => props.config.content ?? null);\n\nconst needsScroll = computed(() => Boolean(displayContent.value));\n\nconst hasScrolledToBottom = ref(!needsScroll.value);\nconst scrollEl = ref<HTMLElement | null>(null);\n\nfunction setScrollRef(el: unknown) {\n scrollEl.value = el instanceof HTMLElement ? el : null;\n}\n\nwatch(\n () => props.config,\n (config) => {\n hasScrolledToBottom.value = !(config?.content ?? null);\n nextTick(() => {\n scrollEl.value?.scrollTo(0, 0);\n });\n },\n { immediate: true },\n);\n\nwatch(displayContent, (content) => {\n hasScrolledToBottom.value = !content;\n nextTick(() => {\n scrollEl.value?.scrollTo(0, 0);\n });\n});\n\nfunction renderMarkdown(content: string): string {\n const html = marked.parse(content) as string;\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: [\n 'p',\n 'br',\n 'strong',\n 'em',\n 'u',\n 'a',\n 'ul',\n 'ol',\n 'li',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'blockquote',\n 'code',\n 'pre',\n 'hr',\n ],\n ALLOWED_ATTR: ['href', 'target', 'rel'],\n });\n}\n\nfunction checkScrolledToBottom() {\n const el = scrollEl.value;\n if (!el) return;\n const { scrollTop, scrollHeight, clientHeight } = el;\n const atBottom = scrollHeight - scrollTop - clientHeight < 10;\n if (atBottom) {\n hasScrolledToBottom.value = true;\n }\n}\n\nfunction onScroll() {\n checkScrolledToBottom();\n}\n</script>\n","<template>\n <div class=\"w-full max-w-md mx-auto mb-8 sm:mb-10 bg-base-200 px-3 py-4 sm:px-6 sm:py-6 rounded-xl shadow-md container min-w-0\">\n <div v-if=\"loading\" class=\"text-center\">\n <p class=\"text-base-content/80\">Loading...</p>\n </div>\n\n <div v-else-if=\"currentConfig\" class=\"space-y-6\">\n <ConsentFlowStep\n :config=\"currentConfig\"\n :current-step=\"currentStep\"\n :total-steps=\"totalSteps\"\n :submitting=\"submitting\"\n :submit-error=\"submitError\"\n :declining=\"declining\"\n accept-label=\"Accept and continue\"\n submit-accept-label=\"Saving...\"\n decline-label=\"Decline and log out\"\n decline-submitting-label=\"Logging out...\"\n intro-text=\"Please read the full document before accepting. Scroll to the bottom when you've finished reading. You can decline at any time; if you decline, you will not have access to the application and will be logged out.\"\n @accept=\"handleAccept\"\n @decline=\"handleDecline\"\n />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { RecordConsentsInputDto } from '@dragonmastery/dragoncore-shared';\nimport { computed, nextTick, ref, watch } from 'vue';\nimport { useRoute, useRouter } from 'vue-router';\nimport { toast } from 'vue3-toastify';\nimport ConsentFlowStep from '../shared/ConsentFlowStep.vue';\nimport { useMutation } from '../../../../composables/useMutation';\nimport { useQuery } from '../../../../composables/useQuery';\nimport { useUserSessionStore } from '../../../../composables/useUserSessionStore';\nimport { getValidReturnUrl } from '../../../../utils/useReturnUrl';\n\nconst sessionStore = useUserSessionStore();\nconst router = useRouter();\nconst route = useRoute();\n\nconst { data: pendingConsents, loading } = useQuery(\n (api) => api.users.getPendingConsents(),\n { skipAuthCheck: false },\n);\n\nconst currentStep = ref(1);\nconst totalSteps = computed(() => (pendingConsents.value ?? []).length);\nconst currentConfig = computed(\n () => (pendingConsents.value ?? [])[currentStep.value - 1] ?? null,\n);\n\nconst declining = ref(false);\nconst submitting = ref(false);\nconst submitError = ref<string | null>(null);\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error && error.message) return error.message;\n if (error && typeof error === 'object' && 'message' in error && typeof (error as { message: unknown }).message === 'string') {\n return (error as { message: string }).message;\n }\n return 'Failed to record consents. Please try again.';\n}\n\nconst { mutate: recordConsentsMutate } = useMutation(\n (api, input: RecordConsentsInputDto) => api.users.recordConsents(input),\n { skipAuthCheck: false },\n);\n\nasync function handleAccept() {\n const config = currentConfig.value;\n const consents = pendingConsents.value ?? [];\n if (!config || consents.length === 0) return;\n\n submitError.value = null;\n\n const acceptancesSoFar: Record<string, boolean> = {};\n for (let i = 0; i < currentStep.value; i++) {\n const c = consents[i];\n if (c) acceptancesSoFar[c.type] = true;\n }\n\n if (currentStep.value >= totalSteps.value) {\n submitting.value = true;\n try {\n await recordConsentsMutate({ acceptances: acceptancesSoFar });\n await sessionStore.refreshToken();\n window.scrollTo(0, 0);\n const targetUrl = getValidReturnUrl(route, '/');\n await router.push(targetUrl);\n toast.success('Consents recorded. You can now continue.');\n } catch (err) {\n submitError.value = getErrorMessage(err);\n } finally {\n submitting.value = false;\n }\n return;\n }\n\n currentStep.value++;\n nextTick();\n}\n\nasync function handleDecline() {\n declining.value = true;\n try {\n sessionStore.clearSession();\n await router.push('/auth/login');\n toast.info('You have declined. You have been logged out.');\n } finally {\n declining.value = false;\n }\n}\n\n// If no pending consents (e.g. already completed or consent disabled), redirect\nwatch(\n [pendingConsents, loading],\n ([consents, isLoading]) => {\n if (!isLoading && Array.isArray(consents) && consents.length === 0) {\n router.push(getValidReturnUrl(route, '/'));\n }\n },\n { immediate: true },\n);\n</script>\n"],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./FieldsetSection-Br_sygWW.js";
6
- import "./userAuthorized-3RiCDXxr.js";
7
- import "./teamMetadata-NTjPt89L.js";
8
- import "./team_memberRoutes-BgjY9Kwq.js";
9
- import "./teamRoutes-CSBq1DNq.js";
10
- import { t as CreateTeamForm_default } from "./CreateTeamForm-bpLbK18g.js";
11
-
12
- export { CreateTeamForm_default as default };
@@ -1,12 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import "./FieldsetSection-Br_sygWW.js";
7
- import "./userAuthorized-3RiCDXxr.js";
8
- import "./team_memberRoutes-BgjY9Kwq.js";
9
- import "./teamMemberMetadata-C4urCwBU.js";
10
- import { t as CreateTeamMemberForm_default } from "./CreateTeamMemberForm-DeUyXnVa.js";
11
-
12
- export { CreateTeamMemberForm_default as default };
@@ -1,7 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import { t as CreateUserPage_default } from "./CreateUserPage-CqKcY7_X.js";
6
-
7
- export { CreateUserPage_default as default };
@@ -1,13 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-erjEgsdK.js";
7
- import "./ConfirmDialog-DjthOYU6.js";
8
- import "./userAuthorized-3RiCDXxr.js";
9
- import "./customerSupportTicketRoutes-DvfXGaSC.js";
10
- import "./CreditTransactionHistory-mcacl2xG.js";
11
- import { t as CreditBalanceDashboard_default } from "./CreditBalanceDashboard-BEsOr0Rw.js";
12
-
13
- export { CreditBalanceDashboard_default as default };
@@ -1,13 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-erjEgsdK.js";
7
- import "./ConfirmDialog-DjthOYU6.js";
8
- import "./userAuthorized-3RiCDXxr.js";
9
- import "./customerSupportTicketRoutes-DvfXGaSC.js";
10
- import "./CreditTransactionHistory-mcacl2xG.js";
11
- import { t as CreditManagement_default } from "./CreditManagement-DiVSMbWZ.js";
12
-
13
- export { CreditManagement_default as default };
@@ -1,14 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-erjEgsdK.js";
7
- import "./ConfirmDialog-DjthOYU6.js";
8
- import "./InlineAttachments-DAn_QknY.js";
9
- import "./FieldsetSection-Br_sygWW.js";
10
- import "./userAuthorized-3RiCDXxr.js";
11
- import "./customerSupportTicketRoutes-DvfXGaSC.js";
12
- import { t as CustomerCreateSupportTicketForm_default } from "./CustomerCreateSupportTicketForm-IefplMnK.js";
13
-
14
- export { CustomerCreateSupportTicketForm_default as default };
@@ -1,64 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import { S as CustomerSupportTicketList_default } from "./src-DSF_hIBe.js";
7
- import "./AppLink-FcNGKgvG.js";
8
- import "./saved_filter-erjEgsdK.js";
9
- import "./ConfirmDialog-DjthOYU6.js";
10
- import "./InlineAttachments-DAn_QknY.js";
11
- import "./TeamMembersTab-BigqpBDH.js";
12
- import "./Appearance-shr0Aql0.js";
13
- import "./Signup-KuiKHB4h.js";
14
- import "./useBreadcrumbs-CPWXm0hm.js";
15
- import "./ExternalLinkIcon-BKVV5Gjm.js";
16
- import "./FieldsetSection-Br_sygWW.js";
17
- import "./RecordVersionViewer-DKIdX_BX.js";
18
- import "./ZiniaContainer-BPIfQOc7.js";
19
- import "./userAuthorized-3RiCDXxr.js";
20
- import "./UserProfilePage-BYitd7QV.js";
21
- import "./ChangePasswordPage-Dy8lFUcI.js";
22
- import "./teamMetadata-NTjPt89L.js";
23
- import "./team_memberRoutes-BgjY9Kwq.js";
24
- import "./teamRoutes-CSBq1DNq.js";
25
- import "./CreateTeamForm-bpLbK18g.js";
26
- import "./EditTeamForm-RBO99ocN.js";
27
- import "./TeamHistoryTab-CxzA4u_G.js";
28
- import "./TeamList-DXQj_Omo.js";
29
- import "./TeamNotesTab-Cego-QT3.js";
30
- import "./TeamParent-6JhqsYaO.js";
31
- import "./ViewTeam-ByZdYEJG.js";
32
- import "./teamMemberMetadata-C4urCwBU.js";
33
- import "./CreateTeamMemberForm-DeUyXnVa.js";
34
- import "./EditTeamMemberForm-D9cofrUM.js";
35
- import "./TeamMemberList-BYUANoBg.js";
36
- import "./TeamMemberParent-DmYcHU3n.js";
37
- import "./ViewTeamMember-DqWZ3F_h.js";
38
- import "./customerSupportTicketRoutes-DvfXGaSC.js";
39
- import "./staffSupportTicketRoutes-73ceKhL-.js";
40
- import "./TimelineSystemEvent-D5fkhkZT.js";
41
- import "./CustomerCreateSupportTicketForm-IefplMnK.js";
42
- import "./CustomerSupportTicketParent-rl4Ym8oa.js";
43
- import "./CustomerSupportTicketSuccess-RQskseXP.js";
44
- import "./StaffCreateSupportTicketForm-75Bo0jdz.js";
45
- import "./SupportTicketDevLifecycleBadge-D8-Cv1Np.js";
46
- import "./StaffSupportTicketParent-DPvdLUii.js";
47
- import "./StaffSupportTicketSuccess-BYoBXx1i.js";
48
- import "./LoginForm-DEgTB9RF.js";
49
- import "./useEmailVerificationChannel-C76Gnyi1.js";
50
- import "./ForgotPassword-DZ-d8rWX.js";
51
- import "./ResetPassword-DflPd8Qg.js";
52
- import "./Logout-Bb2xe5BM.js";
53
- import "./mfaSchema-Ukqzdyck.js";
54
- import "./MfaSetup-m080C6iX.js";
55
- import "./MfaVerify-D8Ch-8hN.js";
56
- import "./VerifyEmail-Cy2s4yP0.js";
57
- import "./UserListPage-DelzxCID.js";
58
- import "./CreateUserPage-CqKcY7_X.js";
59
- import "./EditUserPage-DGuV8pzp.js";
60
- import "./CreditTransactionHistory-mcacl2xG.js";
61
- import "./CreditBalanceDashboard-BEsOr0Rw.js";
62
- import "./CreditManagement-DiVSMbWZ.js";
63
-
64
- export { CustomerSupportTicketList_default as default };
@@ -1,8 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useQuery-BzUGEOj0.js";
5
- import "./useBreadcrumbs-CPWXm0hm.js";
6
- import { t as CustomerSupportTicketParent_default } from "./CustomerSupportTicketParent-rl4Ym8oa.js";
7
-
8
- export { CustomerSupportTicketParent_default as default };
@@ -1,12 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import "./saved_filter-erjEgsdK.js";
7
- import "./ConfirmDialog-DjthOYU6.js";
8
- import "./userAuthorized-3RiCDXxr.js";
9
- import "./customerSupportTicketRoutes-DvfXGaSC.js";
10
- import { t as CustomerSupportTicketSuccess_default } from "./CustomerSupportTicketSuccess-RQskseXP.js";
11
-
12
- export { CustomerSupportTicketSuccess_default as default };
@@ -1,12 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./FieldsetSection-Br_sygWW.js";
6
- import "./userAuthorized-3RiCDXxr.js";
7
- import "./teamMetadata-NTjPt89L.js";
8
- import "./team_memberRoutes-BgjY9Kwq.js";
9
- import "./teamRoutes-CSBq1DNq.js";
10
- import { t as EditTeamForm_default } from "./EditTeamForm-RBO99ocN.js";
11
-
12
- export { EditTeamForm_default as default };
@@ -1,9 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./FieldsetSection-Br_sygWW.js";
6
- import "./teamMemberMetadata-C4urCwBU.js";
7
- import { t as EditTeamMemberForm_default } from "./EditTeamMemberForm-D9cofrUM.js";
8
-
9
- export { EditTeamMemberForm_default as default };
@@ -1,8 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./useQuery-BzUGEOj0.js";
6
- import { t as EditUserPage_default } from "./EditUserPage-DGuV8pzp.js";
7
-
8
- export { EditUserPage_default as default };
@@ -1,34 +0,0 @@
1
- import { createElementBlock, createElementVNode, defineComponent, normalizeClass, openBlock, unref } from "vue";
2
-
3
- //#region src/components/ui/ExternalLinkIcon.vue
4
- const _sfc_main = /* @__PURE__ */ defineComponent({
5
- __name: "ExternalLinkIcon",
6
- props: { size: { default: "default" } },
7
- setup(__props) {
8
- const sizeClass = {
9
- sm: "w-3 h-3",
10
- default: "w-4 h-4",
11
- lg: "w-5 h-5"
12
- }[__props.size];
13
- return (_ctx, _cache) => {
14
- return openBlock(), createElementBlock("svg", {
15
- xmlns: "http://www.w3.org/2000/svg",
16
- fill: "none",
17
- viewBox: "0 0 24 24",
18
- "stroke-width": "1.5",
19
- stroke: "currentColor",
20
- class: normalizeClass(["shrink-0", unref(sizeClass)]),
21
- "aria-hidden": "true"
22
- }, [..._cache[0] || (_cache[0] = [createElementVNode("path", {
23
- "stroke-linecap": "round",
24
- "stroke-linejoin": "round",
25
- d: "M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"
26
- }, null, -1)])], 2);
27
- };
28
- }
29
- });
30
- var ExternalLinkIcon_default = _sfc_main;
31
-
32
- //#endregion
33
- export { ExternalLinkIcon_default as t };
34
- //# sourceMappingURL=ExternalLinkIcon-BKVV5Gjm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ExternalLinkIcon-BKVV5Gjm.js","names":[],"sources":["../src/components/ui/ExternalLinkIcon.vue"],"sourcesContent":["<template>\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke-width=\"1.5\"\n stroke=\"currentColor\"\n :class=\"['shrink-0', sizeClass]\"\n aria-hidden=\"true\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n d=\"M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25\"\n />\n </svg>\n</template>\n\n<script setup lang=\"ts\">\nconst props = withDefaults(\n defineProps<{\n /** Icon size: sm (3), default (4), lg (5) */\n size?: 'sm' | 'default' | 'lg';\n }>(),\n { size: 'default' },\n);\n\nconst sizeClass = {\n sm: 'w-3 h-3',\n default: 'w-4 h-4',\n lg: 'w-5 h-5',\n}[props.size];\n</script>\n"],"mappings":";;;;;;;EA2BA,MAAM,YAAY;GAChB,IAAI;GACJ,SAAS;GACT,IAAI;GACL,CAZa,QAYN;;uBA9BN,mBAcM,OAAA;IAbJ,OAAM;IACN,MAAK;IACL,SAAQ;IACR,gBAAa;IACb,QAAO;IACN,OAAK,eAAA,CAAA,YAAe,MAAA,UAAS,CAAA,CAAA;IAC9B,eAAY;qCAEZ,mBAIE,QAAA;IAHA,kBAAe;IACf,mBAAgB;IAChB,GAAE"}
@@ -1,8 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import { t as ForgotPassword_default } from "./ForgotPassword-DZ-d8rWX.js";
7
-
8
- export { ForgotPassword_default as default };
@@ -1,8 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import { t as LoginForm_default } from "./LoginForm-DEgTB9RF.js";
7
-
8
- export { LoginForm_default as default };
@@ -1,8 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import { t as Logout_default } from "./Logout-Bb2xe5BM.js";
7
-
8
- export { Logout_default as default };
@@ -1,9 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import "./mfaSchema-Ukqzdyck.js";
7
- import { t as MfaSetup_default } from "./MfaSetup-m080C6iX.js";
8
-
9
- export { MfaSetup_default as default };
@@ -1,9 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import "./mfaSchema-Ukqzdyck.js";
7
- import { t as MfaVerify_default } from "./MfaVerify-D8Ch-8hN.js";
8
-
9
- export { MfaVerify_default as default };
@@ -1,8 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import { t as ResetPassword_default } from "./ResetPassword-DflPd8Qg.js";
7
-
8
- export { ResetPassword_default as default };
@@ -1,9 +0,0 @@
1
- import "./useRpcAuth-CJtq1dqM.js";
2
- import "./EnhancedRefreshTokenHandler-C6tZCcfX.js";
3
- import "./useQueryCache-alzaRWEb.js";
4
- import "./useMutation-BLNuJoYl.js";
5
- import "./AppLink-FcNGKgvG.js";
6
- import { t as Signup_default } from "./Signup-KuiKHB4h.js";
7
- import "./useEmailVerificationChannel-C76Gnyi1.js";
8
-
9
- export { Signup_default as default };